summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rwxr-xr-xCOPYING366
-rw-r--r--ChangeLog655
-rw-r--r--INSTALL248
-rw-r--r--INSTALL.in248
-rw-r--r--INSTALL.osx162
-rw-r--r--INSTALL.usb43
-rw-r--r--Makefile1084
-rw-r--r--PPD/Generic-OAKT_Printer.ppd422
-rw-r--r--PPD/Generic-ZjStream_Printer.ppd472
-rw-r--r--PPD/HP-Color_LaserJet_1500.ppd422
-rw-r--r--PPD/HP-Color_LaserJet_1600.ppd462
-rw-r--r--PPD/HP-Color_LaserJet_2600n.ppd462
-rw-r--r--PPD/HP-LaserJet_1000.ppd389
-rw-r--r--PPD/HP-LaserJet_1005.ppd389
-rw-r--r--PPD/HP-LaserJet_1018.ppd396
-rw-r--r--PPD/HP-LaserJet_1020.ppd396
-rw-r--r--PPD/HP-LaserJet_1022.ppd412
-rw-r--r--PPD/HP-LaserJet_M1005_MFP.ppd422
-rw-r--r--PPD/KonicaMinolta-magicolor_2490_MF.ppd427
-rw-r--r--PPD/KonicaMinolta-magicolor_2530_DL.ppd427
-rw-r--r--PPD/Minolta-Color_PageWorks_Pro_L.ppd464
-rw-r--r--PPD/Minolta-magicolor_2200_DL.ppd463
-rw-r--r--PPD/Minolta-magicolor_2300_DL.ppd467
-rw-r--r--PPD/Minolta-magicolor_2430_DL.ppd467
-rw-r--r--README140
-rw-r--r--README.in140
-rw-r--r--align.ps227
-rw-r--r--arm2hpdl.c251
-rw-r--r--c5200mono.prnbin0 -> 40361 bytes
-rw-r--r--crd/2300w-1200@150-l250-kx,ucr100,0-per.crd4684
-rw-r--r--crd/2300w-1200@150-l250-kx,ucr100,50-per.crd4684
-rw-r--r--crd/2300w-1200@150-l250-kx,ucr100,75-per.crd4684
-rw-r--r--crd/2300w-1200@150-l250-kx,ucr125,75-per.crd4684
-rw-r--r--crd/kh.crd4682
-rw-r--r--crd/kx.crd4682
-rw-r--r--crd/prolog.ps78
-rw-r--r--crd/screen1200.ps218
-rw-r--r--crd/screen2400.ps357
-rw-r--r--cups.h226
-rw-r--r--foo2hp.1in368
-rw-r--r--foo2hp.c1732
-rw-r--r--foo2hp2600-wrapper.1in400
-rwxr-xr-xfoo2hp2600-wrapper.in689
-rw-r--r--foo2lava-wrapper.1in388
-rwxr-xr-xfoo2lava-wrapper.in591
-rw-r--r--foo2lava.1in349
-rw-r--r--foo2lava.c1496
-rw-r--r--foo2oak-wrapper.1in355
-rw-r--r--foo2oak-wrapper.in595
-rw-r--r--foo2oak.1in324
-rw-r--r--foo2xqx-wrapper.1in325
-rwxr-xr-xfoo2xqx-wrapper.in575
-rw-r--r--foo2xqx.1in324
-rw-r--r--foo2xqx.c1483
-rw-r--r--foo2zjs-wrapper.1in398
-rwxr-xr-xfoo2zjs-wrapper.in638
-rw-r--r--foo2zjs.1in359
-rw-r--r--foo2zjs.c1544
-rw-r--r--foomatic-db/driver/foo2hp.xml23
-rw-r--r--foomatic-db/driver/foo2lava.xml20
-rw-r--r--foomatic-db/driver/foo2oak.xml25
-rw-r--r--foomatic-db/driver/foo2xqx.xml19
-rw-r--r--foomatic-db/driver/foo2zjs.xml33
-rw-r--r--foomatic-db/opt/foo2hp-BitsPerPlane.xml36
-rw-r--r--foomatic-db/opt/foo2hp-ColorMode.xml38
-rw-r--r--foomatic-db/opt/foo2hp-Duplex.xml37
-rw-r--r--foomatic-db/opt/foo2hp-ICM.xml101
-rw-r--r--foomatic-db/opt/foo2hp-InputSlot.xml42
-rw-r--r--foomatic-db/opt/foo2hp-MediaType.xml117
-rw-r--r--foomatic-db/opt/foo2hp-Quality.xml32
-rw-r--r--foomatic-db/opt/foo2lava-ColorMode.xml38
-rw-r--r--foomatic-db/opt/foo2lava-Duplex.xml37
-rw-r--r--foomatic-db/opt/foo2lava-InputSlot.xml37
-rw-r--r--foomatic-db/opt/foo2lava-MediaType.xml67
-rw-r--r--foomatic-db/opt/foo2lava-PageSize.xml92
-rw-r--r--foomatic-db/opt/foo2lava-Quality.xml32
-rw-r--r--foomatic-db/opt/foo2lava-Resolution.xml43
-rw-r--r--foomatic-db/opt/foo2oak-BitsPerPlane.xml36
-rw-r--r--foomatic-db/opt/foo2oak-ColorMode.xml38
-rw-r--r--foomatic-db/opt/foo2oak-ICM.xml69
-rw-r--r--foomatic-db/opt/foo2oak-InputSlot.xml37
-rw-r--r--foomatic-db/opt/foo2oak-MediaType.xml97
-rw-r--r--foomatic-db/opt/foo2xqx-Duplex.xml37
-rw-r--r--foomatic-db/opt/foo2xqx-InputSlot.xml37
-rw-r--r--foomatic-db/opt/foo2xqx-MediaType.xml122
-rw-r--r--foomatic-db/opt/foo2xqx-Quality.xml32
-rw-r--r--foomatic-db/opt/foo2xqx-Resolution.xml36
-rw-r--r--foomatic-db/opt/foo2zjs-ColorMode.xml186
-rw-r--r--foomatic-db/opt/foo2zjs-Copies.xml38
-rw-r--r--foomatic-db/opt/foo2zjs-Duplex.xml59
-rw-r--r--foomatic-db/opt/foo2zjs-ICM.xml304
-rw-r--r--foomatic-db/opt/foo2zjs-InputSlot.xml195
-rw-r--r--foomatic-db/opt/foo2zjs-Intent.xml57
-rw-r--r--foomatic-db/opt/foo2zjs-MediaType.xml57
-rw-r--r--foomatic-db/opt/foo2zjs-Nup.xml100
-rw-r--r--foomatic-db/opt/foo2zjs-NupOrient.xml59
-rw-r--r--foomatic-db/opt/foo2zjs-PageSize.xml89
-rw-r--r--foomatic-db/opt/foo2zjs-PrinterType.xml148
-rw-r--r--foomatic-db/opt/foo2zjs-Quality.xml32
-rw-r--r--foomatic-db/opt/foo2zjs-Resolution.xml91
-rw-r--r--foomatic-db/printer/Generic-OAKT_Printer.xml55
-rw-r--r--foomatic-db/printer/Generic-ZjStream_Printer.xml46
-rw-r--r--foomatic-db/printer/HP-Color_LaserJet_1500.xml63
-rw-r--r--foomatic-db/printer/HP-Color_LaserJet_1600.xml58
-rw-r--r--foomatic-db/printer/HP-Color_LaserJet_2600n.xml58
-rw-r--r--foomatic-db/printer/HP-LaserJet_1000.xml60
-rw-r--r--foomatic-db/printer/HP-LaserJet_1005.xml58
-rw-r--r--foomatic-db/printer/HP-LaserJet_1018.xml61
-rw-r--r--foomatic-db/printer/HP-LaserJet_1020.xml61
-rw-r--r--foomatic-db/printer/HP-LaserJet_1022.xml55
-rw-r--r--foomatic-db/printer/HP-LaserJet_M1005_MFP.xml50
-rw-r--r--foomatic-db/printer/KonicaMinolta-magicolor_2490_MF.xml61
-rw-r--r--foomatic-db/printer/KonicaMinolta-magicolor_2530_DL.xml63
-rw-r--r--foomatic-db/printer/Minolta-Color_PageWorks_Pro_L.xml40
-rw-r--r--foomatic-db/printer/Minolta-magicolor_2200_DL.xml66
-rw-r--r--foomatic-db/printer/Minolta-magicolor_2300_DL.xml65
-rw-r--r--foomatic-db/printer/Minolta-magicolor_2430_DL.xml63
-rwxr-xr-xfoomatic-test42
-rw-r--r--gamma-lookup.ps117
-rw-r--r--gamma.ps15
-rwxr-xr-xgetweb.in247
-rwxr-xr-xhplj1000184
-rw-r--r--hplj10xx.rules8
-rw-r--r--icc2ps/AUTHORS4
-rw-r--r--icc2ps/COPYING8
-rw-r--r--icc2ps/Makefile20
-rw-r--r--icc2ps/README94
-rw-r--r--icc2ps/README.foo2zjs7
-rw-r--r--icc2ps/cmscam02.c484
-rw-r--r--icc2ps/cmscam97.c721
-rw-r--r--icc2ps/cmscgats.c2348
-rw-r--r--icc2ps/cmscnvrt.c637
-rw-r--r--icc2ps/cmserr.c110
-rw-r--r--icc2ps/cmsgamma.c949
-rw-r--r--icc2ps/cmsgmt.c1280
-rw-r--r--icc2ps/cmsintrp.c1099
-rw-r--r--icc2ps/cmsio0.c707
-rwxr-xr-xicc2ps/cmsio1.c3599
-rw-r--r--icc2ps/cmslut.c819
-rw-r--r--icc2ps/cmsmatsh.c375
-rw-r--r--icc2ps/cmsmtrx.c814
-rw-r--r--icc2ps/cmsnamed.c171
-rw-r--r--icc2ps/cmspack.c2048
-rw-r--r--icc2ps/cmspcs.c597
-rw-r--r--icc2ps/cmsps2.c1667
-rw-r--r--icc2ps/cmssamp.c618
-rw-r--r--icc2ps/cmsvirt.c843
-rw-r--r--icc2ps/cmswtpnt.c709
-rw-r--r--icc2ps/cmsxform.c1920
-rw-r--r--icc2ps/icc2ps.c226
-rw-r--r--icc2ps/icc34.h1037
-rw-r--r--icc2ps/lcms.h1989
-rwxr-xr-xicc2ps/xgetopt.c75
-rw-r--r--jbig.c3194
-rw-r--r--jbig.h273
-rw-r--r--jbig_tab.c429
-rw-r--r--lavadecode.1in263
-rw-r--r--lavadecode.c453
-rwxr-xr-xmsexpand183
-rw-r--r--oakdecode.1in267
-rw-r--r--oki.h58
-rw-r--r--okidecode.c384
-rw-r--r--testpage.ps416
-rw-r--r--usb_printerid.c74
-rw-r--r--xqx.h224
-rw-r--r--xqxdecode.1in280
-rw-r--r--xqxdecode.c424
-rw-r--r--zjs.h304
-rw-r--r--zjsdecode.1in271
-rw-r--r--zjsdecode.c661
170 files changed, 91389 insertions, 0 deletions
diff --git a/COPYING b/COPYING
new file mode 100755
index 0000000..0520614
--- /dev/null
+++ b/COPYING
@@ -0,0 +1,366 @@
+Copyright HP...
+ sihp1000.img (2001)
+ sihp1005.img (2002)
+ sihp1018.img (2005)
+ sihp1020.img (2005)
+ hpclj2600n-0.icm (2003) 3700
+
+Copyright Konica Minolta...
+ CPWL12W.icm (1998)
+ CPWL24W.icm (1998)
+ CPWL6W.icm (1998)
+ DL2200RGB.icm (1999)
+ DL2312.icm (2001)
+ DL2324.icm (2001)
+ km2430_0.icm (2003)
+ km2430_1.icm (2003)
+ km2430_2.icm (2003)
+ km2530_0.icm (2003)
+ km2530_1.icm (2003)
+ km2530_2.icm (2003)
+
+Copyright Rick Richardson. All Rights Reserved.
+ hpclj2600n-1.icm (2006)
+
+Everything else is...
+-----------------------------------------------------------------------------
+ GNU GENERAL PUBLIC LICENSE
+ Version 2, June 1991
+
+ Copyright (C) 1989, 1991 Free Software Foundation, Inc.
+ 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
+ Everyone is permitted to copy and distribute verbatim copies
+ of this license document, but changing it is not allowed.
+
+ 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.
+
+ <one line to give the program's name and a brief idea of what it does.>
+ Copyright (C) <year> <name of author>
+
+ 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., 59 Temple Place, Suite 330, Boston, MA 02111-1307 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) year 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.
+
+ <signature of Ty Coon>, 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/ChangeLog b/ChangeLog
new file mode 100644
index 0000000..66304cf
--- /dev/null
+++ b/ChangeLog
@@ -0,0 +1,655 @@
+2006-12-24 Rick Richardson <rick.richardson@comcast.net>
+ * foo2lava: Add black/non-black pixel counts. Ditto for color.
+
+2006-12-23 Rick Richardson <rick.richardson@comcast.net>
+ * foo2lava-wrapper: Adjust paper sizes.
+
+2006-12-22 Rick Richardson <rick.richardson@comcast.net>
+ * foo2lava: JBIG data (cont) is at the end.
+
+2006-12-20 Rick Richardson <rick.richardson@comcast.net>
+ * lavadecode: Put in [letter], etc.
+
+2006-12-18 Rick Richardson <rick.richardson@comcast.net>
+ * foo2lava: Add Konica Minolta magicolor 2490 MF all-in-one.
+ PRINTER ONLY!
+
+2006-12-17 Rick Richardson <rick.richardson@comcast.net>
+ * Implement -3,-6,-8,-9,-10,-12,-14,-15,-16,-18 N-up.
+
+2006-12-12 Rick Richardson <rick.richardson@comcast.net>
+ * lavadecode: put comments in.
+ * lavadecode.1: put example in.
+
+2006-12-07 Rick Richardson <rick.richardson@comcast.net>
+ * all: update email address, copyright.
+
+2006-12-06 Rick Richardson <rick.richardson@comcast.net>
+ * foo2hp: update for new 'RaS3' CUPS header (bpp=2).
+
+2006-12-04 Rick Richardson <rick.richardson@comcast.net>
+ * Fix bug in lavadecode.
+ * foo2hp: update for new 'RaS3' CUPS header (bpp=2).
+
+2006-11-30 Rick Richardson <rick.richardson@comcast.net>
+ * Add: foo2lava entries for foomatic (part).
+ * Add: foo2lava entries for foomatic (rest).
+
+2006-11-29 Rick Richardson <rick.richardson@comcast.net>
+ * Add: foo2lava, foo2lava-wrapper for KM magicolor 2530 DL.
+
+2006-11-26 Rick Richardson <rickr@mn.rr.com>
+ * Add: lavadecode for decoding KM magicolor 2530 DL.
+
+2006-11-26 Rick Richardson <rickr@mn.rr.com>
+ * foo2xqx cleanup.
+
+2006-11-25 Rick Richardson <rickr@mn.rr.com>
+ * Implement Duplex for foo2xqx.
+
+2006-11-24 Rick Richardson <rickr@mn.rr.com>
+ * Fix: foo2xqx-wrapper and foo2xqx for A4.
+ * Fix: foo2xqx-wrapper and foo2xqx for letter/legal.
+
+2006-11-23 Rick Richardson <rickr@mn.rr.com>
+ * Add: foo2xqx
+ * Resolution
+ * Economode
+ * Bug: DMMEDIA_STANDARD -> DMMEDIA_PLAIN
+
+2006-11-21 Rick Richardson <rickr@mn.rr.com>
+ * Add: foo2xqx et al for HP LaserJet M1005 MFP
+ Beta quality.
+ * MediaTypes added
+ * Input Slot added
+
+2006-10-10 Rick Richardson <rickr@mn.rr.com>
+ * Modify foo2zjs.c: Allow manual duplex on HP 1022.
+
+2006-10-04 Rick Richardson <rickr@mn.rr.com>
+ * Put tray3 in foo2hp.
+
+2006-09-29 Rick Richardson <rickr@mn.rr.com>
+ * Change Makefile to delete Ubuntu ppd's.
+
+2006-09-19 Rick Richardson <rickr@mn.rr.com>
+ * Makefile: "make cups" now works with Slackware.
+
+2006-09-11 Rick Richardson <rickr@mn.rr.com>
+ * Removed foo2oak and oakdecode
+
+2006-08-04 Rick Richardson <rickr@mn.rr.com>
+ * Porting base changed to FC5.
+
+2006-06-25 Rick Richardson <rickr@mn.rr.com>
+ * Modify: foo2hp2600-wrapper to avoid bugs in gs 8.14 and 8.15 (Ubuntu).
+ gs 8.14/8.15 has bugs in it, so no WTS and no great colors
+ for Ubuntu unless you upgrade to gs 8.54 OR downgrade to gs 7.07.
+
+2006-06-20 Rick Richardson <rickr@mn.rr.com>
+ * Modify: Makefile, added install-hotplug-test
+
+2006-06-19 Rick Richardson <rickr@mn.rr.com>
+ * Modify: icc2ps/lcms.h for *BSD.
+
+2006-06-07 Rick Richardson <rickr@mn.rr.com>
+ * Modify: hplj10xx.rules to change BUS= to BUS==, SYSFS{}= to SYSFS{}==
+ (undocumented change per "man udev")
+
+2006-06-02 Rick Richardson <rickr@mn.rr.com>
+ * Update: hpclj2600n-1.icm to 060513_827411_1.icm (ICCFactory 1)
+
+ Read "COPYING" first!! Only those tarballs from
+ http://foo2hp.rkkda.com can use the ICM file. No
+ 3rd-party packages can.
+
+ To update your version:
+ ./getweb 2600n
+ su
+ make install
+ Really good colors with this one!
+
+2006-05-23 Rick Richardson <rickr@mn.rr.com>
+ * Modify: icc2ps to "Little CMS" (lcms), v1.15.
+ Also modify cmsio1.c to remove warnings.
+ * Modify: hplj10xx.rules to change KERNEL= to KERNEL==
+ (undocumented change per "man udev")
+
+2006-05-15 Rick Richardson <rickr@mn.rr.com>
+ * Modify: Makefile to put in test for gcc.
+
+2006-05-12 Rick Richardson <rickr@mn.rr.com>
+ * Add: Well Tempered Screening (WTS) to foo2hp2600-wrapper
+ # CUPS also does grief by adding its own PS code to the input file.
+ # We take care of that with the sed command. Thus, Well Tempered
+ # Screening (WTS) now works!
+ * Make default ICM file for HP 1600/2600n to hpclj2600n-1.icm,
+ a.k.a ICCFactory 1, 060413_131593_1.icm
+
+2006-05-11 Rick Richardson <rickr@mn.rr.com>
+ * Modify: "./getweb 1020" to get HP LaserJet 1020 files from the web.
+ * Modify: "./getweb 1018" to get HP LaserJet 1018 files from the web.
+ * Modify: "./getweb 1005" to get HP LaserJet 1005 files from the web.
+ * Modify: "./getweb 1000" to get HP LaserJet 1000 files from the web.
+
+2006-05-10 Rick Richardson <rickr@mn.rr.com>
+ * New printer added: HP LaserJet 1022
+ * Change: foomatic-db/printer/HP-Color_LaserJet_*.xml
+ <autodetect> strings from 2600 to 2600n and Color LaserJet.
+ * USB support for 2600n now works.
+
+2006-05-09 Rick Richardson <rickr@mn.rr.com>
+ * Modify: "./getweb 2600n" to get HP 2600n ICM files from the web.
+ * Modify: "./getweb 1600" to get HP 1600 ICM files from the web.
+ * Modify: "./getweb 2430" to get Minolta 2430 ICM files from the web.
+
+2006-05-04 Rick Richardson <rickr@mn.rr.com>
+ * Modify: hplj10xx.rules to change product name from
+ "hp LaserJet 1005" to "hp LaserJet 1005 series"
+
+2006-05-01 Rick Richardson <rickr@mn.rr.com>
+ * New printer added: HP LaserJet 1018
+
+2006-04-30 Rick Richardson <rickr@mn.rr.com>
+ * Modify: zjs.h, zjsdecode.c for Zenographics ZX 1.1 format.
+
+2006-04-28 Rick Richardson <rickr@mn.rr.com>
+ * Add: N-up orientation to foo2*wrapper (-o orient) and
+ foomatic files.
+ * Modify: do -t (SaveToner) in the HP1020 printer.
+ * Modify: foo2zjs.c to implement 1200x600 for HP LaserJet 1020
+ * Adjust: foomatic and PPD entries for above.
+ Redhat: printconf-gui, Edit a queue, change nothing, then Apply.
+ Others: delete and recreate HP 1020 queues.
+
+2006-04-25 Rick Richardson <rickr@mn.rr.com>
+ * Modify: Makefile to do install-test for foomatic-rip
+
+2006-04-16 Rick Richardson <rickr@mn.rr.com>
+ * Modify: PPD/* to update *Manufacturer strings.
+ * Modify: foo2*-wrapper.1 to document -I intent.
+ * Modify: revert firmware file HP 1020 to 20041118.
+
+2006-04-14 Rick Richardson <rickr@mn.rr.com>
+ * Modify: firmware file for HP 1020 printer to 2005/03/18.
+
+2006-04-12 Rick Richardson <rickr@mn.rr.com>
+ * Modify: foo2zjs-wrapper to implement -C10 -Gnone, for
+ testing ICM files.
+
+2006-03-27 Rick Richardson <rickr@mn.rr.com>
+ * Add: Manual Duplex to foo2hp/foo2hp2600-wrapper.
+ Long edge (ManualDuplexNoTumble, -d4) and
+ short edge (ManualDuplexTumble, -d5).
+
+ First the odd pages are printed. Then the printer pauses
+ for you to load tray 2. Remove the odd pages and put them in
+ tray 2. Hit "v/" (continue). Then the even pages are printed.
+
+2006-03-24 Rick Richardson <rickr@mn.rr.com>
+ *Modify: foo2hp et al to put in envelope pagesizes.
+
+2006-02-28 Rick Richardson <rickr@mn.rr.com>
+ * Modify: hplj10xx - use ed instead of ex (gentoo "fix")
+ * Modify: Makefile target "cups" for Gentoo.
+
+2006-02-27 Rick Richardson <rickr@mn.rr.com>
+ * Modify: foomatic-db/opt/*Nup* to make shortname = 1up.
+ re-gen PPD's.
+
+2006-02-23 Rick Richardson <rickr@mn.rr.com>
+ * Modify: zjsdecode.c, set planeNum to 1.
+
+2006-02-16 Rick Richardson <rickr@mn.rr.com>
+ * Modify: Makefile install-foo to be RedHat FC4 compatible by
+ removing /var/cache/foomatic/printconf.pickle and letting
+ printconf-gui recreate it.
+
+2006-02-08 Rick Richardson <rickr@mn.rr.com>
+ * Modify: /etc/hotplug/usb/hp10xx to add a chmod 0666 for SUSE 10.0
+
+2006-01-24 Rick Richardson <rickr@mn.rr.com>
+ * Modify: SUSE 10.0 hotplug changes to
+ /etc/udev/rules.d/11-hplj10xx.rules
+
+2006-01-16 Rick Richardson <rickr@mn.rr.com>
+ * Modify: More changes to Makefile to get it to build on FreeBSD.
+
+2006-01-15 Rick Richardson <rickr@mn.rr.com>
+ * Modify: Makefile to get it to build on FreeBSD.
+
+2006-01-13 Rick Richardson <rickr@mn.rr.com>
+ * Modify: foomatic DB entries and PPD files for HP LJ 1000/1005/1020.
+ Add paper margins.
+
+2006-01-12 Rick Richardson <rickr@mn.rr.com>
+ * Modify: foo2hp2600-wrapper to change default ICM file
+ when -b1 and gs is 32-bit (gs segfaults on 64-bit).
+ Much better color when -b1 and 32-bit gs.
+
+2006-01-07 Rick Richardson <rickr@mn.rr.com>
+ * Add: hp2600n default ICM profile (color correction) to bpp=1.
+ There is no default for bpp=2 right now, pending pksmraw
+ support.
+
+2006-01-04 Rick Richardson <rickr@mn.rr.com>
+ * Modify: foo2hp bpp=2 mirror array.
+
+2006-01-03 Rick Richardson <rickr@mn.rr.com>
+ * Modify: hplj10?? to work with FC4 and udev.
+ There is a timeout problem with udev and FC4, so spin off the
+ firmware download.
+
+2005-12-30 Rick Richardson <rickr@mn.rr.com>
+ * Modify: foo2hp, foo2hp2600-wrapper to implement -t (Draft Mode).
+
+2005-12-28 Rick Richardson <rickr@mn.rr.com>
+ * Add make target "make uninstall".
+
+2005-12-27 Rick Richardson <rickr@mn.rr.com>
+ * Modify: 2430 PPD file, hplj10xx file
+
+2005-12-23 Rick Richardson <rickr@mn.rr.com>
+ * Modify: foo2zjs, foo2zjs-wrapper to implement -t (Draft Mode).
+ Only for 1 bpp monochrome.
+
+2005-12-21 Rick Richardson <rickr@mn.rr.com>
+ * Modify: foo2hp, foo2hp2600-wrapper to implement bpp=2 for mono&color.
+
+2005-12-20 Rick Richardson <rickr@mn.rr.com>
+ * Modify: foo2hp, foo2hp2600-wrapper to implement bpp=2 for color only.
+
+2005-12-14 Rick Richardson <rickr@mn.rr.com>
+ * Modify: foo2zjs, foo2zjs-wrapper to implement Draft Mode (-t).
+
+2005-12-04 Rick Richardson <rickr@mn.rr.com>
+ * Modify: hplj10XX to not call us twice on FC4.
+
+2005-12-01 Rick Richardson <rickr@mn.rr.com>
+ * Modify: foo2zjs, foo2zjs-wrapper so it prints on HP LJ 1020.
+ Tested thru Fedora Core 3.
+
+2005-11-24 Rick Richardson <rickr@mn.rr.com>
+ * Added: hpclj2600n.icm for color calibration
+
+2005-11-20 Rick Richardson <rickr@mn.rr.com>
+ * Modify: foo2hp & wrapper
+ 1-bpp color printing
+ gs 8.xx is best.
+
+2005-11-13 Rick Richardson <rickr@mn.rr.com>
+ * Added: PPD/HP-Color_LaserJet_2600n.ppd
+ foomatic DB entries for 2600
+ * Modify: getweb.in for foo2hp.
+
+2005-11-12 Rick Richardson <rickr@mn.rr.com>
+ * Modify: foo2hp.c, bpl16 = (bpl + 15) & ~15;
+
+2005-11-10 Rick Richardson <rickr@mn.rr.com>
+ * Added: foo2hp
+ foo2hp2600-wrapper
+ * Right now, just for test purposes. Use it like this:
+ $ foo2hp2600-wrapper testpage.ps >xxx
+ $ zjsdecode -dxxx <xxx
+ $ xv xxx-01-3.pbm
+ $ lpr -Praw xxx
+ Must have a "raw" printer!!!
+
+2005-11-07 Rick Richardson <rickr@mn.rr.com>
+ * Partial implementation of HP LJ 2600n.
+ zjsdecode -dxxx < 2600n.prn
+
+2005-11-06 Rick Richardson <rickr@mn.rr.com>
+ * Add -h (hex output) to zjsdecode.
+
+2005-11-01 Rick Richardson <rickr@mn.rr.com>
+ * Add hplj10xx.rules for make install-hotplug using udev.
+
+2005-02-13 Rick Richardson <rickr@mn.rr.com>
+ * Add Minolta 2430.
+
+2004-10-23 Rick Richardson <rickr@mn.rr.com>
+ * Make code 64-bit clean for x86_64 (but not well tested).
+
+2004-09-11 Rick Richardson <rickr@mn.rr.com>
+ * foo2zjs-wrapper
+ Abandon all use of "which", because you need a "which which"
+ Legwork by Alex Schnar
+
+2004-09-07 Rick Richardson <rickr@mn.rr.com>
+ * foo2zjs-wrapper:
+ Fix problem on distros and MacOS where ash is /bin/sh
+
+2004-07-01 Rick Richardson <rickr@mn.rr.com>
+ * foo2zjs: update to current m2300w {prolog,screen1200}.ps
+
+2004-06-22 Rick Richardson <rickr@mn.rr.com>
+ * foo2zjs-wrapper:
+ switch to kh/kx CRD's, which will print pure text pages using
+ just the K plane, even on a color queue. Make colormode 2
+ (graphics+text) the default if no mode is specified.
+
+2004-06-15 Rick Richardson <rickr@mn.rr.com>
+ * foo2zjs-wrapper: fix bug introduced in last change if gs8 isn't available
+
+2004-06-13 Rick Richardson <rickr@mn.rr.com>
+ * Adjust foo2zjs-wrapper to try to use a local copy of GS 8.14,
+ rather than the distro supplied gs 8. Try to pick the best
+ default color mode based on what is installed on the users
+ computer.
+
+2004-06-11 Rick Richardson <rickr@mn.rr.com>
+ * Upgrade to JBIGKIT 1.6
+
+2004-06-06 Rick Richardson <rickr@mn.rr.com>
+ * foo2zjs: Add capability to use the 2300w color correction procedure
+ using tuned CRD's by Gerhard Fuernkranz and Leif Birkenfeld.
+ Not yet documented nor made the default pending further modifications.
+ In particular, printing a monochrome document on a color queue
+ will not yet be optimized to a monochrome print.
+ * Fix error in "getweb update"
+ * foo2zjs: Add ability to take input from GS in pksmraw format.
+
+2004-04-13 Rick Richardson <rickr@mn.rr.com>
+ * Add the ./getweb 2300dl_fw command to download firmware update for
+ the 2300DL printer. Improve INSTALL documentation.
+
+2004-04-10 Rick Richardson <rickr@mn.rr.com>
+ * Improve hplj100x USB firmware download script to autodetect printers.
+ * getweb 1005: Update URL for getting HP 1005 firmware.
+ * foo2oak: Add foomatic options to allow configuring an ICM profile.
+
+2004-04-09 Rick Richardson <rickr@mn.rr.com>
+ * foo2oak: Fix argument on END_PAGE command for color printing.
+ Stefan Huber says this should enable color.
+ Also fix page length and clipping for A4 paper.
+
+2004-04-07 Rick Richardson <rickr@mn.rr.com>
+ * Add Makefile target "make install-hotplug" to automatically
+ download HP LJ1000 firmware files.
+
+2004-03-27 Rick Richardson <rickr@mn.rr.com>
+ * foo2zjs: minor code change in handling file args to make it the
+ the same as with foo2oak.
+
+2004-03-19 Rick Richardson <rickr@mn.rr.com>
+ * foo2oak: only build this on ia32 arch
+ * Ignore error from groff, OS X has lousy man macros
+
+2004-02-10 Rick Richardson <rickr@mn.rr.com>
+ * foo2zjs: use the correct bit mirroring array in color duplex mode.
+
+2004-02-01 Rick Richardson <rickr@mn.rr.com>
+ * foo2zjs: fix clipping bug when length of clipped region is not
+ a multiple of four. Affected color output.
+ * foo2oak: fix clipping bug when length of clipped region is not
+ a multiple of four. Affected 1-bit color output.
+ * foo2oak: fix output order of color planes (think its YMCK, not CMYK)
+
+2004-01-20 Rick Richardson <rickr@mn.rr.com>
+ * Remove Glossy from legal media types for 2300DL
+
+2003-12-29 Clint Morgan <clint@morgantechnologies.com>
+ * Updated INSTALL.osx
+
+2003-12-07 Rick Richardson <rickr@mn.rr.com>
+ * Add Clint Morgan's installation instructions for Mac OS X
+ (file INSTALL-osx.txt). Thanks Clint.
+
+2003-12-03 Rick Richardson <rickr@mn.rr.com>
+ * foo2zjs: Remove space in 2 shortnames for pageworks/pro printer.
+
+2003-11-25 Rick Richardson <rickr@mn.rr.com>
+ * foo2oak: Update LJ1500 with IEEE-1284 strings.
+ * all: Overhaul for new website location.
+
+2003-11-12 Rick Richardson <rickr@mn.rr.com>
+ * foo2oak: add 1284 ID strings to foomatic database entry.
+ * all: Install PPD files in /usr/share/cups/model (if it exists)
+
+2003-11-11 Rick Richardson <rickr@mn.rr.com>
+ * GET THIS VERSION!
+ Roadrunner's FTP server was on old backup tapes for over 2 days.
+ Its entirely possible that you got a shite copy of this driver
+ in that time period.
+
+2003-11-09 Rick Richardson <rickr@mn.rr.com>
+ * Update PPD files and add PPD files for OAKT printers.
+
+2003-11-08 Rick Richardson <rickr@mn.rr.com>
+ * foo2oak: Implement code structure for 2-bit color output using
+ the ghostscript CUPS device.
+ This output (4 level color) has not been tuned.
+
+2003-11-07 Rick Richardson <rickr@mn.rr.com>
+ * foo2oak: Implement the code structure for 2-bit monochrome output,
+ and add -b2 option to foo2oak-wrapper to select it.
+ This output (4 level grayscale) has not been tuned.
+
+2003-11-05 Rick Richardson <rickr@mn.rr.com>
+ * CRITICAL fix for embarrasing memory leak.
+
+ * Add wrappers and binaries for 1-bit OAKT support (HP LaserJet 1500).
+ Absolutely untested with a real printer. This driver is offered
+ in binary only.
+
+2003-10-17 Rick Richardson <rickr@mn.rr.com>
+ * Update README and INSTALL documentation
+ * Add PPD files from linuxprinting.org
+
+2003-10-09 Rick Richardson <rickr@mn.rr.com>
+ * Fix long edge duplex mode. I was unaware that foo2zjs
+ needs to rotate the even page images 180 degrees because
+ the printer can't even do that by itself :-).
+ * Upgrade to JBIGKIT 1.5
+ * Modified zjsdecode (actually, jbig.c) to decode JBIG the data
+ produced by other printer drivers when MY > 0.
+
+2003-08-07 Rick Richardson <rickr@mn.rr.com>
+ * Change icc2ps/lcms.h to set USE_BIG_ENDIAN on OS X
+
+2003-07-23 Rick Richardson <rickr@mn.rr.com>
+ * Fool with the Ghostscript to foo2zjs plumbing to avoid getting
+ messages on Postscript's stdout intermingled with the
+ pbm/bitcmyk output.
+
+2003-06-29 Rick Richardson <rickr@mn.rr.com>
+ * Add XML files for Minolta Color PageWorks/Pro L
+
+2003-06-19 Rick Richardson <rickr@mn.rr.com>
+ * If color has been selected, but there isn't any color on the page,
+ then produce a monochrome ZjStream.
+
+2003-05-31 Rick Richardson <rickr@mn.rr.com>
+ * Use /usr/bin/logger to log the command line passed to the wrapper,
+ in case I need it for bug reports.
+
+2003-05-30 Rick Richardson <rickr@mn.rr.com>
+ * Build usb_printerid only on Linux.
+ * Other minor changes to get it to compile on the SourceForge
+ compile farm OS X machine.
+
+2003-05-27 Rick Richardson <rickr@mn.rr.com>
+ * Add margins (printable area) to 2300 DL foomatic printer description
+ * Add margins (printable area) to 2200 DL foomatic printer description
+ * Fixed Duplex foomatic option - it was overriding the
+ InputSlot option and preventing tray selection.
+
+2003-05-26 Rick Richardson <rickr@mn.rr.com>
+ * Fixed -d option to zjsdecode
+
+2003-05-08 Rick Richardson <rickr@mn.rr.com>
+ * Sheesh, added missing foo2zjs-wrapper.in
+ * Added HP 1005 .xml file from Till.
+
+2003-05-06 Rick Richardson <rickr@mn.rr.com>
+ * Add missing usb_printerid file. Not needed yet, but
+ will be used for firmware autodownload.
+
+2003-05-01 Rick Richardson <rickr@mn.rr.com>
+ * Put correct checksum calculation into arm2hpdl
+ It should now work properly.
+
+2003-04-30 Rick Richardson <rickr@mn.rr.com>
+ * Fix warning from grops when creating manual page
+
+2003-04-30 Rick Richardson <rickr@mn.rr.com>
+ * Add skeletal arm2hpdl program to convert ARM executables
+ in ELF format to the HP download format. For converting the
+ sihp1005.img file to the format that the HP LJ1005 printer wants.
+ Unfortunately, this program is incomplete. The calculation
+ of the checksum/crc/whatever trailer is incorrect. But I
+ throw the program out there in case somebody figures out
+ the algorithm before me.
+
+2003-04-26 Rick Richardson <rickr@mn.rr.com>
+ * Properly constrain the InputSlot (Media Source) options
+ for the 2200/2300 DL printers to those values that these
+ printers actually support.
+
+2003-04-16 Rick Richardson <rickr@mn.rr.com>
+ * Add hack to fix clipping region for A4 paper on HP1000
+
+2003-04-07 Rick Richardson <rickr@mn.rr.com>
+ * Include unistd.h, not getopt.h.
+
+2003-03-30 Rick Richardson <rickr@mn.rr.com>
+ * Default GSOPTS=-dCOLORSCREEN.
+
+ * Allow more than one -g option to be passed to wrapper.
+
+2003-03-29 Rick Richardson <rickr@mn.rr.com>
+ * Add foomatic option to select ICM color profile file.
+ Add foomatic option to select ICM color profile intent.
+ Remove temporary ICM testing hack.
+
+ * Remove "unset OPTIND", fix for broken 'dash' shell.
+
+ * Rename the "geticc" convenience script to "getweb" and make it
+ a general tool for retrieving "extra" files needed with some
+ printer models. Teach it how to download HP firmware files
+ and to update the foo2zjs software itself. E.G.
+ ./getweb 2300 # Get Minolta 2300 DL .ICM files
+ ./getweb 2200 # Get Minolta 2200 DL .ICM files
+ ./getweb 1000 # Get HP LJ1000 firmware file
+ ./getweb update # Get latest version of this software.
+
+ * Adjust clipping region based on printer resolution. This may
+ fix issues with the HP LJ1000, which prints at 600x600.
+
+ * Add regression tests
+
+2003-03-28 Rick Richardson <rickr@mn.rr.com>
+ * Add foo2zjs-Duplex.xml foomatic option
+ * Add 'geticc' convenience script, to retrieve ICM profiles
+ from Minolta website. ./geticc 2200 or ./geticc 2300
+
+2003-03-27 Rick Richardson <rickr@mn.rr.com>
+ * Add developmental skeleton of .ICM file handling using icc2ps
+ to the wrapper. This is used for color correction.
+ WORK IN PROGRESS TO BE USED ONLY BY EXPERT TESTERS.
+ For the time being, you must use the foo2zjs-wrapper from
+ the command line and add a -G option which points to the
+ .ICM file you want to fool around with. You have to get
+ the .ICM files from your printer manufacturer's website or
+ by raping the Windows driver for them.
+
+ For now only, if you put a file into /usr/share/foo2zjs/icm/
+ called "testing.icm", the wrapper script will use that as
+ the .ICM file, even if you don't specify a -G option.
+ In a real implementation, we will need to select the file
+ based on the printer model, resolution, quality, media, and
+ individual user bias. Sigh.
+
+ * Add -F option for prepending job with a firmware download.
+ Somebody tell me if this is useful.
+
+2003-03-25 Rick Richardson <rickr@mn.rr.com>
+ * Added foo2zjs-PrinterType.xml option as per Till, which sets
+ the foo2zjs -P option flag for HP LaserJet 1000 printers.
+
+ * Set clipping region for A4 paper on 2200 DL
+
+2003-03-24 Rick Richardson <rickr@mn.rr.com>
+ * Update foomatic entries for Till's editorial changes.
+
+2003-03-23 Rick Richardson <rickr@mn.rr.com>
+ * Add -X option to add extra zero padding to end of BID. Default
+ the value to 16 bytes. This seems to fix all issues with the
+ Minolta/QMS 2200DL according to Adam Erickson. In particular,
+ the 2200 DL will no longer print some pages blank nor hang with
+ the "Processing" message on the last page of the job.
+
+ * Minor improvements to zjsdecode
+
+2003-03-22 Rick Richardson <rickr@mn.rr.com>
+ * Install color correct template files to /usr/share/foo2zjs/
+ This is in case anybody gets a wild hair and wants to try tuning
+ the color correction. At this point, they are just placeholders
+ until I get edjamacated on the process for tuning.
+
+ * Add -G option to foo2zjs-wrapper, to specify a gamma file for
+ color correction.
+
+ * Add -P option to foo2zjs and wrapper. This turns off the output
+ of START_PLANE codes, and may be needed by some non-color printers.
+ The default is now to send start plane codes, even for black and
+ white print jobs.
+
+ * Add manual pages.
+
+2003-03-21 Rick Richardson <rickr@mn.rr.com>
+ * Turn on JBG_DELAY_AT option in JBIG encoder. This seems to
+ fix the problem where some pages would not print properly,
+ especially color pages where you would get yellow splotches.
+
+ * Add ability to change -l and -u thru the wrapper script.
+
+ * Add ability to specify whether logical clipping values should
+ be sent to printer with -L <mask>.
+
+2003-03-20 Rick Richardson <rickr@mn.rr.com>
+ * Add options -u WxH and -l WxH to specify upper left and
+ lower right clipping of the printers unprintable area.
+ This seems to be required by the 2200 DL, otherwise you
+ get pixel skew. The 2300 DL seems immune to this problem,
+ but clipping and then using a logical page offset in the Zjs
+ stream will work for it as well.
+
+ * Add the ability to output a single color plane using black ink.
+ This is to help track down an issue where the yellow plane
+ sometimes goes nuts and prints yellow for the bottom portion
+ of some pages. Its cheaper to waste black toner than color
+ toner. Especially yellow toner, which is usually the first
+ color to empty.
+
+ * Improve "make install" target.
+
+2003-03-17 Rick Richardson <rickr@mn.rr.com>
+ * Add page number to zjsdecode filenames.
+ * Fix endianess issues.
+
+2003-03-12 Rick Richardson <rickr@mn.rr.com>
+ * Fix typo in wrapper script that would prevent anything from
+ printing when using foomatic.
+
+2003-03-10 Rick Richardson <rickr@mn.rr.com>
+ * Forgot to include jbg2pbm.c in tarball
+
+2003-03-08 Rick Richardson <rickr@mn.rr.com>
+ * Add -r option to xjsdecode, for saving raw JBG planes
+ to a file for examination.
+
+2003-03-07 Rick Richardson <rickr@mn.rr.com>
+ * When printing B&W, do not output START_PLANE. This may
+ or may not work around issues with the LJ-1000.
+ * Incorporate XML changes from Till.
+
+2003-03-05 Rick Richardson <rickr@mn.rr.com>
+ * Change default color algorithm to convert C=1,M=1,Y=1 to
+ pure black. Likewise, if B=1 then turn off CMY
+ * Add 2-up and 4-up options (requires psutils package)
+ * Add Source option
+
+2003-03-04 Rick Richardson <rickr@mn.rr.com>
+ * First public release
diff --git a/INSTALL b/INSTALL
new file mode 100644
index 0000000..85896ef
--- /dev/null
+++ b/INSTALL
@@ -0,0 +1,248 @@
+INSTALLATION
+------------
+Unpack:
+ $ wget -O foo2zjs.tar.gz http://foo2zjs.rkkda.com/foo2zjs.tar.gz
+ $ tar zxf foo2zjs.tar.gz
+ $ cd foo2zjs
+
+(Optional) Uninstall:
+ $ su OR $ sudo make uninstall
+ # make uninstall
+
+Compile:
+ $ make
+
+Get extra files from the web, such as .ICM profiles (for color correction)
+and firmware. Select the model number for your printer:
+ $ ./getweb 2600n # Get HP Color LaserJet 2600n .ICM files
+ $ ./getweb 2430 # Get Minolta 2430 DL .ICM files
+ $ ./getweb 2300 # Get Minolta 2300 DL .ICM files
+ $ ./getweb 2200 # Get Minolta 2200 DL .ICM files
+ $ ./getweb cpwl # Get Minolta Color PageWorks/Pro L .ICM files
+
+ $ ./getweb 1020 # Get HP LaserJet 1020 firmware file
+ $ ./getweb 1018 # Get HP LaserJet 1018 firmware file
+ $ ./getweb 1005 # Get HP LaserJet 1005 firmware file
+ $ ./getweb 1000 # Get HP LaserJet 1000 firmware file
+
+Install driver, foomatic XML files, PPD files, and extra files:
+ $ su OR $ sudo make install
+ # make install
+
+(Optional) Install hotplug (for HP LJ 1000/1005/1018/1020):
+ $ su OR $ sudo make install-hotplug
+ # make install-hotplug
+
+If you use CUPS to manage your printers, you must restart cupsd:
+ # make cups OR $ sudo make cups
+
+Test operation of programs. Skip this if you don't have the exact same
+version of Ghostscript that I have (ghostscript-7.05-24.7), because it
+will not pass since different versions of Ghostscript generate different
+raster images:
+ # make test
+
+Create printers (Redhat 7.2/7.3/8.0/9.0, Fedora Core 1-5):
+ # printconf-gui
+ Create at least one queue for monochrome, and another queue
+ for color printing. Create the queues, then edit them and
+ set the "device options" as desired.
+
+ For a networked Minolta/QMS 2300 DL, I used a "Queue Type"
+ of "Unix Printer (LPD)", and set the "Server" to the IP address
+ of the printer, and the "Queue" to "lp".
+
+ For a networked HP Color Laserjet 2600n, I used a "Queue Type"
+ of "Networked JetDirect", and set the "Printer" to the IP address
+ of the printer, and the "Port" to "9100".
+
+For Fedora Core 6 users:
+ # system-config-printer
+
+Create printers (Mandrake/Manrivia)
+ # printerdrake
+
+Create printers (Suse 10.0)
+ # yast2 printer
+
+Create printers (Ubuntu)
+ $ sudo gnome-cups-manager
+
+ NOTE: to edit a queue hit "Properties" (click right mouse button).
+
+Create printers (Debian)
+ On Debian, I'm told that you should install CUPS from dselect,
+ then install the foo2zjs driver. Then, connect to:
+ http://localhost:631
+ And configure printer (HP example shown) to:
+ HP LaserJet 1000, Foomatic + foo2zjs (en)
+ Then edit "Manage Printers->Configure Printer" to suit you,
+ such as "Page Size" or "Color Mode".
+
+UBUNTU NOTES
+------------
+ Install build-essential FIRST:
+ $ sudo apt-get install build-essential
+ $ wget -O foo2zjs.tar.gz http://foo2zjs.rkkda.com/foo2zjs.tar.gz
+ $ tar zxf foo2zjs.tar.gz
+ $ cd foo2zjs
+ $ sudo make uninstall
+ $ make
+ $ ./getweb 1020
+ OR other printer
+ $ sudo make install install-hotplug cups
+
+MINOLTA-QMS 2200/2300 DL NOTES
+------------------------------
+ Use the network interface if you can. These printers understand Unix
+ LPD printer server protocol. So when setting up the printer queue,
+ you can select "UNIX Printer (lpd queue)", set the lpd queue name to
+ "lp" (arbitrary), and set the "Server" to the IP address of the
+ printer.
+
+ These printers also understand several other printer server protocols,
+ such as JetDirect and IPP, but I have not tried them. In any case,
+ I'm not aware of any advantages of using them over LPD.
+
+ The USB interface on this printer will work if your printer is at
+ firmware revision 2.55 or later. Mine was not, but I was able to
+ get this firmware from the Konica Minolta Europe web site. The USA
+ site doesn't have it. Upgrading the firmware on your printer can
+ be dangerous and might turn your printer into a paperweight, so I do
+ not recommend it unless you need USB and are a computer expert. To
+ get the v2.55 firmware upgrade, try:
+ ./getweb 2300dl_fw
+
+HP LASERJET 1000/1005/1018/1020 NOTES
+-------------------------------------
+ These printers need their firmware downloaded to them every time they
+ are powered up.
+
+ On Linux with USB connected printer:
+ If you are running Linux and the printer is connected via USB, you
+ can arrange for the firmware to be automatically downloaded to the
+ printer by performing one more installation step:
+
+ # make install-hotplug
+
+ On another OS or with a parallel port connected printer:
+
+ You must send a firmware file to the printer each time you power it
+ up. If you downloaded the extra files for the HP above, a typical
+ command line to load the firmware would be:
+
+ cat /usr/share/foo2zjs/firmware/sihp1000.dl > /dev/usb/lp0
+ or:
+ cat /usr/share/foo2zjs/firmware/sihp1005.dl > /dev/usb/lp0
+ or:
+ cat /usr/share/foo2zjs/firmware/sihp1018.dl > /dev/usb/lp0
+ or:
+ cat /usr/share/foo2zjs/firmware/sihp1020.dl > /dev/usb/lp0
+
+ NOTE: The original HP files are named '*.img'. Sometimes HP supplies
+ these files ready-to-download to the printer, sometimes they are raw
+ ARM executables and need to have a special header added to them before
+ they can be downloaded. The "make install" step will use the supplied
+ "arm2hpdl" program to automatically detect which kind of file they are
+ and convert them (if needed) to the downloadable '*.dl' format.
+
+HP LASERJET 1500 NOTES
+---------------------------
+ I have not tested the foo2oak driver on a real LaserJet 1500 printer.
+ I do not have this printer and HP outright rejected my request for a
+ donation of this printer. So this driver represents my best guess as
+ to what the printer will accept.
+
+ If you think this is an unacceptable situation, then I urge you to
+ let HP know your feelings and/or choose another manufacturer. The
+ linux-on-desktop tide is unstoppable at this point, and HP will
+ eventually have to recognize this.
+
+ User reports are that the driver works with letter and A4 paper and
+ in 1-bit monochrome and 1-bit color modes. No color correction is
+ applied, since there is no .ICM file available for this printer that
+ I know of.
+
+MAC OS X NOTES
+---------------
+ Please read the detailed installation instructions by Clint Morgan
+ in the file INSTALL.osx.
+
+FREEBSD NOTES
+-------------
+ You need the following packages before you start the "make install":
+ # pkg_add -r ghostscript-gnu
+ # pkg_add -r cups
+ # pkg_add -r foomatic-db
+ # pkg_add -r foomatic-filters
+
+ Use "gmake" instead of "make".
+
+64-bit GHOSTSCRIPT
+------------------
+Ghostscript has a problem with ICM files and 64-bit gcc. It causes a
+segfault with km2430_2.icm. So don't select that one.
+
+PSUTILS AND 2/4-UP CAPABILITY
+-----------------------------
+ If you would like to use the 2-up/4-up capability, then you need to
+ get and install Angus Duggan's excellent psutils package. You can
+ find the source code for psutils here:
+
+ http://knackered.knackered.org/angus/psutils/index.html
+
+ Or an RPM here:
+
+ http://rpmfind.net/linux/rpm2html/search.php?query=psutils
+
+UPDATE
+------
+ Here are handy lines you can click on to get the latest version:
+
+ http://foo2zjs.rkkda.com/
+ http://foo2oak.rkkda.com/
+ wget http://foo2zjs.rkkda.com/foo2zjs.tar.gz
+
+ My advice: update early and often!!!!
+
+UNINSTALLING
+------------
+ This will uninstall everything from your system.
+
+ $ su
+ # make uninstall
+
+SET DEFAULT MEDIA WITH CUPS
+---------------------------
+ $ sudo
+ # lpoptions -o media=A4
+ -OR-
+ # lpoptions -o media=Letter
+
+BUG REPORTS
+-----------
+ Use the forums at:
+ http://s3.phpbbforfree.com/forums/foo2zjs.html
+
+ I do not read or reply to HTML email or messages sent under an alias.
+ I failed out of french class, so don't even think about sending
+ me email in anything but English.
+
+ Rick Richardson
+
+DEVELOPER AND DEBUGGING TIPS
+----------------------------
+ If you want to work on this program, I recommend creating a "raw"
+ printer queue directed at the printer, with no protocol conversions.
+
+ Then, you can use the "foo2zjs-wrapper" program to convert Postscript
+ test programs to ZjS format, and inspect them with "zjsdecode" before
+ deciding whether to print them or not. For example:
+
+ foo2zjs-wrapper testpage.ps > testpage.zm
+ foo2zjs-wrapper -c testpage.ps > testpage.zc
+
+ zjsdecode < testpage.zm
+ zjsdecode < testpage.zc
+
+ lpr -Praw testpage.zm
diff --git a/INSTALL.in b/INSTALL.in
new file mode 100644
index 0000000..f99aec0
--- /dev/null
+++ b/INSTALL.in
@@ -0,0 +1,248 @@
+INSTALLATION
+------------
+Unpack:
+ $ wget -O foo2zjs.tar.gz http://foo2zjs.rkkda.com/foo2zjs.tar.gz
+ $ tar zxf foo2zjs.tar.gz
+ $ cd foo2zjs
+
+(Optional) Uninstall:
+ $ su OR $ sudo make uninstall
+ # make uninstall
+
+Compile:
+ $ make
+
+Get extra files from the web, such as .ICM profiles (for color correction)
+and firmware. Select the model number for your printer:
+ $ ./getweb 2600n # Get HP Color LaserJet 2600n .ICM files
+ $ ./getweb 2430 # Get Minolta 2430 DL .ICM files
+ $ ./getweb 2300 # Get Minolta 2300 DL .ICM files
+ $ ./getweb 2200 # Get Minolta 2200 DL .ICM files
+ $ ./getweb cpwl # Get Minolta Color PageWorks/Pro L .ICM files
+
+ $ ./getweb 1020 # Get HP LaserJet 1020 firmware file
+ $ ./getweb 1018 # Get HP LaserJet 1018 firmware file
+ $ ./getweb 1005 # Get HP LaserJet 1005 firmware file
+ $ ./getweb 1000 # Get HP LaserJet 1000 firmware file
+
+Install driver, foomatic XML files, PPD files, and extra files:
+ $ su OR $ sudo make install
+ # make install
+
+(Optional) Install hotplug (for HP LJ 1000/1005/1018/1020):
+ $ su OR $ sudo make install-hotplug
+ # make install-hotplug
+
+If you use CUPS to manage your printers, you must restart cupsd:
+ # make cups OR $ sudo make cups
+
+Test operation of programs. Skip this if you don't have the exact same
+version of Ghostscript that I have (ghostscript-7.05-24.7), because it
+will not pass since different versions of Ghostscript generate different
+raster images:
+ # make test
+
+Create printers (Redhat 7.2/7.3/8.0/9.0, Fedora Core 1-5):
+ # printconf-gui
+ Create at least one queue for monochrome, and another queue
+ for color printing. Create the queues, then edit them and
+ set the "device options" as desired.
+
+ For a networked Minolta/QMS 2300 DL, I used a "Queue Type"
+ of "Unix Printer (LPD)", and set the "Server" to the IP address
+ of the printer, and the "Queue" to "lp".
+
+ For a networked HP Color Laserjet 2600n, I used a "Queue Type"
+ of "Networked JetDirect", and set the "Printer" to the IP address
+ of the printer, and the "Port" to "9100".
+
+For Fedora Core 6 users:
+ # system-config-printer
+
+Create printers (Mandrake/Manrivia)
+ # printerdrake
+
+Create printers (Suse 10.0)
+ # yast2 printer
+
+Create printers (Ubuntu)
+ $ sudo gnome-cups-manager
+
+ NOTE: to edit a queue hit "Properties" (click right mouse button).
+
+Create printers (Debian)
+ On Debian, I'm told that you should install CUPS from dselect,
+ then install the foo2zjs driver. Then, connect to:
+ http://localhost:631
+ And configure printer (HP example shown) to:
+ HP LaserJet 1000, Foomatic + foo2zjs (en)
+ Then edit "Manage Printers->Configure Printer" to suit you,
+ such as "Page Size" or "Color Mode".
+
+UBUNTU NOTES
+------------
+ Install build-essential FIRST:
+ $ sudo apt-get install build-essential
+ $ wget -O foo2zjs.tar.gz http://foo2zjs.rkkda.com/foo2zjs.tar.gz
+ $ tar zxf foo2zjs.tar.gz
+ $ cd foo2zjs
+ $ sudo make uninstall
+ $ make
+ $ ./getweb 1020
+ OR other printer
+ $ sudo make install install-hotplug cups
+
+MINOLTA-QMS 2200/2300 DL NOTES
+------------------------------
+ Use the network interface if you can. These printers understand Unix
+ LPD printer server protocol. So when setting up the printer queue,
+ you can select "UNIX Printer (lpd queue)", set the lpd queue name to
+ "lp" (arbitrary), and set the "Server" to the IP address of the
+ printer.
+
+ These printers also understand several other printer server protocols,
+ such as JetDirect and IPP, but I have not tried them. In any case,
+ I'm not aware of any advantages of using them over LPD.
+
+ The USB interface on this printer will work if your printer is at
+ firmware revision 2.55 or later. Mine was not, but I was able to
+ get this firmware from the Konica Minolta Europe web site. The USA
+ site doesn't have it. Upgrading the firmware on your printer can
+ be dangerous and might turn your printer into a paperweight, so I do
+ not recommend it unless you need USB and are a computer expert. To
+ get the v2.55 firmware upgrade, try:
+ ./getweb 2300dl_fw
+
+HP LASERJET 1000/1005/1018/1020 NOTES
+-------------------------------------
+ These printers need their firmware downloaded to them every time they
+ are powered up.
+
+ On Linux with USB connected printer:
+ If you are running Linux and the printer is connected via USB, you
+ can arrange for the firmware to be automatically downloaded to the
+ printer by performing one more installation step:
+
+ # make install-hotplug
+
+ On another OS or with a parallel port connected printer:
+
+ You must send a firmware file to the printer each time you power it
+ up. If you downloaded the extra files for the HP above, a typical
+ command line to load the firmware would be:
+
+ cat /usr/share/foo2zjs/firmware/sihp1000.dl > /dev/usb/lp0
+ or:
+ cat /usr/share/foo2zjs/firmware/sihp1005.dl > /dev/usb/lp0
+ or:
+ cat /usr/share/foo2zjs/firmware/sihp1018.dl > /dev/usb/lp0
+ or:
+ cat /usr/share/foo2zjs/firmware/sihp1020.dl > /dev/usb/lp0
+
+ NOTE: The original HP files are named '*.img'. Sometimes HP supplies
+ these files ready-to-download to the printer, sometimes they are raw
+ ARM executables and need to have a special header added to them before
+ they can be downloaded. The "make install" step will use the supplied
+ "arm2hpdl" program to automatically detect which kind of file they are
+ and convert them (if needed) to the downloadable '*.dl' format.
+
+HP LASERJET 1500 NOTES
+---------------------------
+ I have not tested the foo2oak driver on a real LaserJet 1500 printer.
+ I do not have this printer and HP outright rejected my request for a
+ donation of this printer. So this driver represents my best guess as
+ to what the printer will accept.
+
+ If you think this is an unacceptable situation, then I urge you to
+ let HP know your feelings and/or choose another manufacturer. The
+ linux-on-desktop tide is unstoppable at this point, and HP will
+ eventually have to recognize this.
+
+ User reports are that the driver works with letter and A4 paper and
+ in 1-bit monochrome and 1-bit color modes. No color correction is
+ applied, since there is no .ICM file available for this printer that
+ I know of.
+
+MAC OS X NOTES
+---------------
+ Please read the detailed installation instructions by Clint Morgan
+ in the file INSTALL.osx.
+
+FREEBSD NOTES
+-------------
+ You need the following packages before you start the "make install":
+ # pkg_add -r ghostscript-gnu
+ # pkg_add -r cups
+ # pkg_add -r foomatic-db
+ # pkg_add -r foomatic-filters
+
+ Use "gmake" instead of "make".
+
+64-bit GHOSTSCRIPT
+------------------
+Ghostscript has a problem with ICM files and 64-bit gcc. It causes a
+segfault with km2430_2.icm. So don't select that one.
+
+PSUTILS AND 2/4-UP CAPABILITY
+-----------------------------
+ If you would like to use the 2-up/4-up capability, then you need to
+ get and install Angus Duggan's excellent psutils package. You can
+ find the source code for psutils here:
+
+ http://knackered.knackered.org/angus/psutils/index.html
+
+ Or an RPM here:
+
+ http://rpmfind.net/linux/rpm2html/search.php?query=psutils
+
+UPDATE
+------
+ Here are handy lines you can click on to get the latest version:
+
+ ${URLZJS}/
+ ${URLOAK}/
+ wget ${URLZJS}/foo2zjs.tar.gz
+
+ My advice: update early and often!!!!
+
+UNINSTALLING
+------------
+ This will uninstall everything from your system.
+
+ $ su
+ # make uninstall
+
+SET DEFAULT MEDIA WITH CUPS
+---------------------------
+ $ sudo
+ # lpoptions -o media=A4
+ -OR-
+ # lpoptions -o media=Letter
+
+BUG REPORTS
+-----------
+ Use the forums at:
+ http://s3.phpbbforfree.com/forums/foo2zjs.html
+
+ I do not read or reply to HTML email or messages sent under an alias.
+ I failed out of french class, so don't even think about sending
+ me email in anything but English.
+
+ Rick Richardson
+
+DEVELOPER AND DEBUGGING TIPS
+----------------------------
+ If you want to work on this program, I recommend creating a "raw"
+ printer queue directed at the printer, with no protocol conversions.
+
+ Then, you can use the "foo2zjs-wrapper" program to convert Postscript
+ test programs to ZjS format, and inspect them with "zjsdecode" before
+ deciding whether to print them or not. For example:
+
+ foo2zjs-wrapper testpage.ps > testpage.zm
+ foo2zjs-wrapper -c testpage.ps > testpage.zc
+
+ zjsdecode < testpage.zm
+ zjsdecode < testpage.zc
+
+ lpr -Praw testpage.zm
diff --git a/INSTALL.osx b/INSTALL.osx
new file mode 100644
index 0000000..bd14dd1
--- /dev/null
+++ b/INSTALL.osx
@@ -0,0 +1,162 @@
+INSTALLATION NOTES -- foo2zjs + magicolor 2200DL + OSX
+===============================================================================
+by Clint Morgan <clint@morgantechnologies.com> - 12/29/2003
+
+
+FOREWORD
+--------
+These notes are intended to provide specific instructions for the installation
+of foo2zjs on a Mac running OS X, specifically 10.3 (Panther), so you can print
+to a magicolor 2200DL. However, the same instructions should apply to other
+foo2zjs compatible printers and OS X 10.2 (Jaguar) or newer.
+
+Further more, these notes assume your printer is hooked up on a network. I
+assume you could use a DB25-to-USB conversion cable to hook your printer
+directly to your Mac. In that case, these instructions will still benefit
+you, but you will need to adjust item 3e of these instructions accordingly.
+
+These instructions are as-is. I can't guarantee they will work for everyone,
+that I'll be able to answer any questions, nor that any URLs mentioned in these
+instructions will be valid at the time you read this. Be sure to read the
+instructions that come with the various source packages mentioned below, as
+they will probably help you build the specific package in question. Just
+knowing that this can be done and the software required to do it will probably
+be enough to get you over any hurdles.
+
+
+
+REQUIREMENTS
+------------
+These requirements are listed in order of their dependencies where dependencies
+exist. I have also included the version numbers I used at the time I wrote
+this. The versions I choose were simply the most current that existed at the
+time, in most cases anyway. The only exception is GhostScript because various
+information I found said the newer version wasn't as good (something about
+color if I recall correctly)
+
+1) Apple Developer Tools (Jaguar) or Xcode (Panther)
+ Go to http://www.apple.com for more information.
+
+2) gettext-0.13.0 (required by glib)
+ Go to http://www.gnu.org/software/gettext/gettext.html for more info.
+
+3) glib-2.2.3 (required by ghostscript)
+ Go to http://www.gtk.org for more info. NOTE: You do NOT need the entire
+ GTK+ toolkit.
+
+4) ghostscript-7.07 (required by foo2zjs)
+ Go to http://www.ghostscript.com for more info. You can also check out
+ sourceforge.net. NOTE: You do NOT need EPS Ghostscript in order to use
+ foo2zjs. You have 2 licenses of GhostScript to choose from: the AFPL
+ license or the GPL license. I have no idea if there is any difference in
+ the code, but I choose the GPL version. Also, you may find that there is
+ a source distribution specifically for the Mac. I couldn't get it to
+ build, but you're more than welcome to try.
+
+5) ghostscript-font-6.0 (required by you if you want ghostscript to do anything)
+ Go to http://www.ghostscript.com for more info. You can also check out
+ sourceforge.net. NOTE: The fonts are distributed as a separate package
+ and are NOT included with ghostscript itself.)
+
+6) wget-1.9 (required by foo2zjs build process)
+ Go to http://www.gnu.org/directory/wget.html for more info. This utility
+ is required by the foo2zjs build process at the time of this writing. It
+ is also used by another foo2zjs utility (getweb) to download ICM color
+ profiles.
+
+7) foomatic-filters-3.0.0 (required by foo2zjs)
+ Go to http://www.linuxprinting.org/foomatic.html for more info. All you
+ need is the foomatic-filters package.
+
+8) foo2zjs (required by you)
+ Go to http://foo2zjs.rkkda.com for more info.
+
+
+NOTE: By default, most of these packages will be installed under the /usr/local
+directories. I've noticed that this is not generally the trend under OS X. You
+may choose to add --prefix=/usr when running configure.
+
+ IE : sudo ./configure --prefix=/usr
+
+
+
+INSTALLATION
+------------
+
+1) Download, build and install the packages mentioned above. See the install
+ instructions for each package.
+
+ NOTE #1: Installing software on OS X generally requires superuser privileges.
+ If in doubt, always prefix commands mentioned in each software
+ package's instructions with "sudo".
+
+ eg: sudo ./configure --prefix=/usr
+ sudo make
+ sudo make install
+
+ NOTE #2: When installing foomatic-filters, use the following command:
+
+ sudo make install CUPS=/usr/libexec/cups \
+ CUPS_FILTERS=/usr/libexec/cups/filter
+
+ All on one line, of course. This will install the foomatic-rip
+ filter in correct place in Panther (10.3.x) and presumably in
+ Jaguar (10.2.x) so that CUPS can find it.
+
+
+2) Make sure CUPS is enabled by viewing "/etc/hostconfig" and looking for
+ "CUPS=-YES-". If you see "CUPS=-NO-", change it and restart your Mac.
+
+ If CUPS is already enabled, type "sudo killall -HUP cupsd" in a terminal
+ window to reinitialize CUPS and make the newly installed drivers available.
+
+3) Now let's setup the printer. However, you CANNOT use the "Printer Setup
+ Utility" within OSX. Unfortunately that utility does not allow you to
+ specify the TCP port used to communicate with the printer. Instead we
+ have to use the CUPS web administration utility by going to:
+
+ http://localhost:631
+
+ This is apparently the default way to access the CUPS administrator 'cause
+ I didn't have to do anything to gain access to it. If you are attempting
+ to use the DB25-to-USB converter cable mentioned in the FOREWORD to hook the
+ printer directly to your Mac, you may be able to use the "Printer Setup
+ Utility" app; however, you can still use the CUPS web administration page
+ also.
+
+ a) Go to http://localhost:631
+ b) Click on "Manage Printers"
+ c) Click on "Add Printer"
+ d) Fill in a Name, Location and/or Description with whatever you want.
+ e) Select "AppSocket/HP JetDirect" from the list of devices.
+ f) Enter "socket://<printerhostname>:35" as the Device URI, where
+ <printerhostname> is the hostname or IP address of your printer and
+ 35 is the TCP port the 2200DL receives print jobs on.
+
+ eg: socket://192.168.1.254:35
+
+ Note: There are some references between the 2200DL and port 9100 on the
+ Internet. This is a valid port for other Minolta printers, but
+ NOT the 2200DL.
+
+ g) Select the make of your printer. This is "Minolta" for the 2200DL.
+ h) Select the model of your printer.
+
+
+YOU'RE DONE
+-----------
+Now you should be able to use your printer. Even though you can't use the
+"Printer Setup Utility" to setup the printer, the printer will show up within
+it. You will still have to use the CUPS admin page to make any changes to your
+printer configuration.
+
+BTW, Apple, Mac, Jaguar, Panther, Xcode are probably trademarks of Apple
+Computer, Inc. or their respective owners. Minolta, Desklaser, magicolor, etc.
+may be trademarks of Konika Minolta Printing Solutions U.S.A., Inc. or their
+respective owners. And other marks may be the intellectual property of their
+respective owners.
+
+Send any questions, suggestions and/or corrections to the email address above.
+Remember, though, I may be slow to respond to some requests or may not be able
+to respond to all. However, I hope this document gives you enough information
+to give you a jump-start.
diff --git a/INSTALL.usb b/INSTALL.usb
new file mode 100644
index 0000000..78ac783
--- /dev/null
+++ b/INSTALL.usb
@@ -0,0 +1,43 @@
+DEBUGGING USB SUBSYSTEM
+-----------------------
+
+0. Have HP LaserJet 1020
+
+1. Install the latest http://foo2zjs.rkkda.com/foo2zjs.tar.gz
+
+2. Prepare the kernel
+
+ Taken from: /usr/src/linux/Documentation/usb/usbmon.txt
+
+ # mount -t debugfs none_debugs /sys/kernel/debug
+ # modprobe usbmon (if kernel loads a module)
+
+ # ls /sys/kernel/debug/usbmon
+ 1s 1t 2s 2t 3s 3t 4s 4t
+
+ # grep -B4 /proc/bus/usb/devices Laser
+ T: Bus=01 Lev=01 Prnt=01 Port=04 Cnt=01 Dev#= 3 Spd=480 MxCh= 0
+ D: Ver= 2.00 Cls=00(>ifc ) Sub=00 Prot=00 MxPS=64 #Cfgs= 1
+ P: Vendor=03f0 ProdID=2b17 Rev= 1.00
+ S: Manufacturer=Hewlett-Packard
+ S: Product=HP LaserJet 1020
+
+ Bus=01 is what you fill it here,
+
+3. Start 'cat'
+
+ # BUS=1t
+ # cat /sys/kernel/debug/usbmon/$BUS > /tmp/1.mon.out
+
+4. Wait for problem.....
+
+5. Interrupt 'cat' with Control-C
+
+6. File bug report at:
+
+ RedHat: https://bugzilla.redhat.com/bugzilla/index.cgi
+ Mandriva: http://qa.mandriva.com/
+ SUSE: http://en.opensuse.org/Submitting_Bug_Reports
+ Ubuntu: https://launchpad.net/distros/ubuntu/+bugs
+
+ Do not file bug report with me. It is a kernel problem.
diff --git a/Makefile b/Makefile
new file mode 100644
index 0000000..2ca4b45
--- /dev/null
+++ b/Makefile
@@ -0,0 +1,1084 @@
+UNAME := $(shell uname)
+MACH := $(shell uname -m | sed 's/i.86/x86_32/')
+EUID := $(shell id -u)
+
+# No version number yet...
+VERSION=0.0
+
+# Installation prefix...
+PREFIX=/usr/local
+PREFIX=/usr
+
+# Pathnames for this package...
+BIN=$(PREFIX)/bin
+SHAREZJS=$(PREFIX)/share/foo2zjs
+SHAREOAK=$(PREFIX)/share/foo2oak
+SHAREHP=$(PREFIX)/share/foo2hp
+SHAREXQX=$(PREFIX)/share/foo2xqx
+SHARELAVA=$(PREFIX)/share/foo2lava
+MANDIR=$(PREFIX)/share/man
+DOCDIR=$(PREFIX)/share/doc/foo2zjs/
+
+# Pathnames for referenced packages...
+FOODB=/usr/share/foomatic/db/source
+
+# User ID's
+LPuid=-olp
+LPgid=-glp
+ifeq ($(UNAME),Darwin)
+ LPuid=-oroot
+ LPgid=-gwheel
+endif
+ifeq ($(UNAME),FreeBSD)
+ LPuid=-oroot
+ LPgid=-gwheel
+endif
+# If we aren't root, don't try to set ownership
+ifneq ($(EUID),0)
+ LPuid=
+ LPgid=
+endif
+
+# Definition of modtime()
+MODTIME= date -d "1/1/1970 utc + `stat -t $$1 | cut -f14 -d' '` seconds" "+%a %b %d %T %Y"
+ifeq ($(UNAME),FreeBSD)
+ MODTIME= stat -f "%Sm" -t "%a %b %d %T %Y" $$1
+endif
+
+#
+# Files for tarball
+#
+NULL=
+WEBFILES= \
+ foo2zjs.html.in \
+ style.css \
+ archzjs.fig \
+ 2300.png \
+ 2430.png \
+ 1020.png \
+ foo2oak.html.in \
+ archoak.fig \
+ 1500.gif \
+ foo2hp.html.in \
+ archhp.fig \
+ 2600.gif \
+ foo2xqx.html.in \
+ archxqx.fig \
+ m1005.gif \
+ foo2lava.html.in \
+ archlava.fig \
+ 2530.gif \
+ $(NULL)
+
+FILES = \
+ README \
+ README.in \
+ INSTALL \
+ INSTALL.in \
+ INSTALL.osx \
+ INSTALL.usb \
+ COPYING \
+ ChangeLog \
+ Makefile \
+ foo2zjs.c \
+ foo2zjs.1in \
+ jbig.c \
+ jbig.h \
+ jbig_tab.c \
+ zjsdecode.c \
+ zjsdecode.1in \
+ zjs.h \
+ foo2hp.c \
+ foo2hp.1in \
+ foo2xqx.c \
+ foo2xqx.1in \
+ cups.h \
+ xqx.h \
+ xqxdecode.c \
+ xqxdecode.1in \
+ foo2lava.c \
+ foo2lava.1in \
+ lavadecode.c \
+ lavadecode.1in \
+ foo2zjs-wrapper.in \
+ foo2zjs-wrapper.1in \
+ foo2hp2600-wrapper.in \
+ foo2hp2600-wrapper.1in \
+ foo2xqx-wrapper.in \
+ foo2xqx-wrapper.1in \
+ foo2lava-wrapper.in \
+ foo2lava-wrapper.1in \
+ gamma.ps \
+ gamma-lookup.ps \
+ align.ps \
+ testpage.ps \
+ foomatic-db/*/*.xml \
+ foomatic-test \
+ getweb.in \
+ icc2ps/*.[ch] \
+ icc2ps/Makefile \
+ icc2ps/AUTHORS \
+ icc2ps/COPYING \
+ icc2ps/README \
+ icc2ps/README.foo2zjs \
+ PPD/*.ppd \
+ crd/2300w-1200@150-l250-kx,ucr100,0-per.crd \
+ crd/2300w-1200@150-l250-kx,ucr100,50-per.crd \
+ crd/2300w-1200@150-l250-kx,ucr100,75-per.crd \
+ crd/2300w-1200@150-l250-kx,ucr125,75-per.crd \
+ crd/kh.crd \
+ crd/kx.crd \
+ crd/prolog.ps \
+ crd/screen1200.ps \
+ crd/screen2400.ps \
+ arm2hpdl.c \
+ usb_printerid.c \
+ hplj1000 \
+ hplj10xx.rules \
+ msexpand \
+ foo2oak.1in \
+ foo2oak-wrapper.in \
+ foo2oak-wrapper.1in \
+ oakdecode.1in \
+ okidecode.c \
+ oki.h \
+ c5200mono.prn \
+ $(NULL)
+
+FILESOAK= \
+ foo2oak_x86_32.o \
+ foo2oak_x86_64.o \
+ oakdecode_x86_32.o \
+ oakdecode_x86_64.o \
+ $(NULL)
+
+# hpclj2600n-0.icm km2430_0.icm km2430_1.icm km2430_2.icm
+# sihp1000.img sihp1005.img sihp1020.img sihp1018.img
+
+# Programs and libraries
+PROGS= foo2zjs zjsdecode arm2hpdl foo2hp foo2xqx xqxdecode
+PROGS+= foo2lava lavadecode
+PROGSOAK= okidecode
+SHELLS= foo2zjs-wrapper foo2oak-wrapper foo2hp2600-wrapper \
+ foo2xqx-wrapper foo2lava-wrapper
+MANPAGES= foo2zjs-wrapper.1 foo2zjs.1 zjsdecode.1
+MANPAGES+= foo2oak-wrapper.1 foo2oak.1 oakdecode.1
+MANPAGES+= foo2hp2600-wrapper.1 foo2hp.1
+MANPAGES+= foo2xqx-wrapper.1 foo2xqx.1 xqxdecode.1
+MANPAGES+= foo2lava-wrapper.1 foo2lava.1 lavadecode.1
+LIBJBG = jbig.o jbig_tab.o
+BINPROGS=
+
+ifeq ($(UNAME),Linux)
+ BINPROGS += usb_printerid
+# ifeq ($(MACH),x86_32)
+# PROGS += foo2oak oakdecode
+# endif
+# ifeq ($(MACH),x86_64)
+# PROGS += foo2oak oakdecode
+# endif
+endif
+
+# Compiler flags
+CFLAGS += -O2 -Wall
+
+#
+# Rules to create test documents
+#
+GX=10200
+GY=6600
+GXR=1200
+GYR=600
+GSOPTS= -q -dBATCH -dSAFER -dQUIET -dNOPAUSE -sPAPERSIZE=letter -r$(GXR)x$(GYR)
+JBGOPTS=-m 16 -d 0 -p 92 # Equivalent options for pbmtojbg
+
+.SUFFIXES: .ps .pbm .pgm .pgm2 .ppm .ppm2 .zjs .cmyk .pksm .zc .zm .jbg \
+ .cups .cupm .1 .1in .fig .gif .xqx .lava
+
+.fig.gif:
+ # fig2dev -L gif $*.fig | giftrans -t "#ffffff" -o $*.gif
+ fig2dev -L ppm $*.fig | pnmquant -fs 256 \
+ | ppmtogif -transparent rgb:ff/ff/ff >$*.gif
+
+.ps.cups:
+ gs $(GSOPTS) -r600x600 \
+ -dcupsColorSpace=6 -dcupsBitsPerColor=2 -dcupsColorOrder=2 \
+ -sDEVICE=cups -sOutputFile=$*.cups $*.ps
+
+.ps.cupm:
+ gs $(GSOPTS) -r600x600 \
+ -dcupsColorSpace=3 -dcupsBitsPerColor=2 -dcupsColorOrder=2 \
+ -sDEVICE=cups -sOutputFile=$*.cupm $*.ps
+
+.ps.pbm:
+ gs $(GSOPTS) -sDEVICE=pbmraw -sOutputFile=$*.pbm $*.ps
+
+.ps.ppm:
+ gs $(GSOPTS) -sDEVICE=ppmraw -sOutputFile=$*.ppm $*.ps
+
+.ps.pgm:
+ gs $(GSOPTS) -sDEVICE=pgmraw -sOutputFile=- $*.ps \
+ | pnmdepth 3 > $*.pgm
+
+.ps.pgm2:
+ gs.rick $(GSOPTS) -sDEVICE=pgmraw2 -sOutputFile=$*.pgm2 $*.ps
+
+.ps.cmyk:
+ gs $(GSOPTS) -sDEVICE=bitcmyk -sOutputFile=$*.cmyk $*.ps
+
+.ps.pksm:
+ gs $(GSOPTS) -sDEVICE=pksmraw -sOutputFile=$*.pksm $*.ps
+
+.ps.zc:
+ gs $(GSOPTS) -sDEVICE=bitcmyk -sOutputFile=- - < $*.ps \
+ | ./foo2zjs -r1200x600 -g10200x6600 -p1 >$*.zc
+
+.ps.zm:
+ gs $(GSOPTS) -sDEVICE=pbmraw -sOutputFile=- - < $*.ps \
+ | ./foo2zjs -r1200x600 -g10200x6600 -p1 >$*.zm
+
+.pbm.zjs:
+ ./foo2zjs < $*.pbm > $*.zjs
+
+.cmyk.zjs:
+ ./foo2zjs < $*.cmyk > $*.zjs
+
+.pksm.zjs:
+ ./foo2zjs < $*.pksm > $*.zjs
+
+.pbm.xqx:
+ ./foo2xqx < $*.pbm > $*.xqx
+
+#
+# The usual build rules
+#
+all: all-test $(PROGS) $(BINPROGS) $(SHELLS) getweb all-icc2ps man doc
+
+all-test:
+ #
+ # Dependencies...
+ #
+ @if ! type $(CC) >/dev/null 2>&1; then \
+ echo " ***"; \
+ echo " *** Error: $(CC) is not installed!"; \
+ echo " ***"; \
+ echo " *** Install Software Development (gcc) package"; \
+ echo " ***"; \
+ exit 1; \
+ fi
+ # ... OK!
+ #
+
+foo2zjs: foo2zjs.o $(LIBJBG)
+ $(CC) $(CFLAGS) -o $@ foo2zjs.o $(LIBJBG)
+
+foo2hp: foo2hp.o $(LIBJBG)
+ # $(CC) $(CFLAGS) -o $@ foo2hp.o $(LIBJBG) /usr/local/lib/libdmalloc.a
+ $(CC) $(CFLAGS) -o $@ foo2hp.o $(LIBJBG)
+
+foo2xqx: foo2xqx.o $(LIBJBG)
+ $(CC) $(CFLAGS) -o $@ foo2xqx.o $(LIBJBG)
+
+foo2lava: foo2lava.o $(LIBJBG)
+ $(CC) $(CFLAGS) -o $@ foo2lava.o $(LIBJBG)
+
+zjsdecode: zjsdecode.o $(LIBJBG)
+ $(CC) $(CFLAGS) zjsdecode.o $(LIBJBG) -o $@
+
+foo2zjs-wrapper: foo2zjs-wrapper.in Makefile
+ [ ! -f $@ ] || chmod +w $@
+ sed < $@.in > $@ \
+ -e 's@^PREFIX=.*@PREFIX=$(PREFIX)@' || (rm -f $@ && exit 1)
+ chmod 555 $@
+
+foo2hp2600-wrapper: foo2hp2600-wrapper.in Makefile
+ [ ! -f $@ ] || chmod +w $@
+ sed < $@.in > $@ \
+ -e 's@^PREFIX=.*@PREFIX=$(PREFIX)@' || (rm -f $@ && exit 1)
+ chmod 555 $@
+
+foo2xqx-wrapper: foo2xqx-wrapper.in Makefile
+ [ ! -f $@ ] || chmod +w $@
+ sed < $@.in > $@ \
+ -e 's@^PREFIX=.*@PREFIX=$(PREFIX)@' || (rm -f $@ && exit 1)
+ chmod 555 $@
+
+foo2lava-wrapper: foo2lava-wrapper.in Makefile
+ [ ! -f $@ ] || chmod +w $@
+ sed < $@.in > $@ \
+ -e 's@^PREFIX=.*@PREFIX=$(PREFIX)@' || (rm -f $@ && exit 1)
+ chmod 555 $@
+
+getweb: getweb.in Makefile
+ [ ! -f $@ ] || chmod +w $@
+ sed < $@.in > $@ \
+ -e "s@\$${URLZJS}@$(URLZJS)@" \
+ -e 's@^PREFIX=.*@PREFIX=$(PREFIX)@' || (rm -f $@ && exit 1)
+ chmod 555 $@
+
+all-icc2ps:
+ cd icc2ps; $(MAKE) all
+
+okidecode: okidecode.o $(LIBJBG)
+ $(CC) $(CFLAGS) okidecode.o $(LIBJBG) -o $@
+
+ok: ok.o $(LIBJBG)
+ $(CC) $(CFLAGS) ok.o $(LIBJBG) -o $@
+
+splcdecode: splcdecode.o $(LIBJBG)
+ $(CC) $(CFLAGS) splcdecode.o $(LIBJBG) -lz -o $@
+
+xqxdecode: xqxdecode.o $(LIBJBG)
+ $(CC) $(CFLAGS) xqxdecode.o $(LIBJBG) -o $@
+
+lavadecode: lavadecode.o $(LIBJBG)
+ $(CC) $(CFLAGS) lavadecode.o $(LIBJBG) -o $@
+
+#
+# Installation rules
+#
+install: all install-test install-prog install-icc2ps install-extra \
+ install-crd install-foo install-ppd install-man install-doc
+ #
+ # If you use CUPS, then restart the spooler:
+ # make cups
+ #
+ # Now use your printer configuration GUI to create a new printer.
+ #
+ # On Redhat 7.2/7.3/8.0/9.0 and Fedora Core 1-5, run "printconf-gui".
+ # On Fedora Core 6, run "system-config-printer".
+ # On Mandrake, run "printerdrake"
+ # On Suse 9.0, run "yast"
+ # On Ubuntu 5.10/6.06/6.10, run "gnome-cups-manager"
+
+install-test:
+ #
+ # Installation Dependencies...
+ #
+ @if ! type foomatic-rip >/dev/null 2>&1; then \
+ echo " ***"; \
+ echo " *** Error: foomatic-rip is not installed!"; \
+ echo " ***"; \
+ echo " *** Install foomatic package(s) for your OS"; \
+ echo " ***"; \
+ exit 1; \
+ fi
+ # ... OK!
+ #
+
+
+install-prog:
+ #
+ # Install driver, wrapper, and development tools
+ #
+ install -c $(PROGS) $(SHELLS) $(BIN)/
+ if [ "$(BINPROGS)" != "" ]; then \
+ install -c $(BINPROGS) /bin/; \
+ fi
+ #
+ # Install gamma correction files. These are just templates,
+ # and don't actually do anything right now. If anybody wants
+ # to tune them or point me at a process for doing that, please...
+ #
+ install -d $(SHAREZJS)/
+ install -c -m 644 gamma.ps $(SHAREZJS)/
+ install -c -m 644 gamma-lookup.ps $(SHAREZJS)/
+ install -d $(SHAREOAK)/
+ install -d $(SHAREHP)/
+ install -d $(SHAREXQX)/
+ install -d $(SHARELAVA)/
+
+install-foo:
+ #
+ # Remove obsolete foomatic database files from previous versions
+ #
+ rm -f $(FOODB)/opt/foo2zjs-Media.xml
+ rm -f $(FOODB)/opt/foo2zjs-PaperSize.xml
+ rm -f $(FOODB)/opt/foo2zjs-Source.xml
+ rm -f $(FOODB)/opt/foo2zjs-DitherPPI.xml
+ #
+ # Install current database files
+ #
+ @if [ -d $(FOODB) ]; then \
+ for dir in driver printer opt; do \
+ echo install -m 644 foomatic-db/$$dir/*.xml $(FOODB)/$$dir/; \
+ install -c -m 644 foomatic-db/$$dir/*.xml $(FOODB)/$$dir/; \
+ done \
+ else \
+ echo "***"; \
+ echo "*** WARNING! You don't have directory $(FOODB)/"; \
+ echo "*** If you want support for foomatic printer configuration,";\
+ echo "*** then you will have to manually install these files..."; \
+ echo "***"; \
+ ls foomatic-db/*/*.xml | sed 's/^/ /'; \
+ echo "***"; \
+ echo "*** ... wherever foomatic is stashed on your machine."; \
+ echo "***"; \
+ fi
+ #
+ # Clear foomatic cache and rebuild database if needed
+ #
+ rm -rf /var/cache/foomatic/*/*
+ rm -f /var/cache/foomatic/printconf.pickle
+ if [ -d /var/cache/foomatic/compiled ]; then \
+ cd /var/cache/foomatic/compiled; \
+ foomatic-combo-xml -O >overview.xml; \
+ fi
+
+install-icc2ps:
+ #
+ # Install ICM to Postscript file conversion utility
+ #
+ cd icc2ps; $(MAKE) PREFIX=$(PREFIX) install
+
+install-crd:
+ #
+ # Install prebuilt CRD files (from m2300w project)
+ #
+ install -d $(SHAREZJS)/
+ install $(LPuid) $(LPgid) -m 775 -d $(SHAREZJS)/crd/
+ for i in crd/*.*; do \
+ install -c -m 644 $$i $(SHAREZJS)/crd/; \
+ done
+
+install-psfiles:
+ #
+ # Install prebuilt psfiles files (from m2300w project)
+ #
+ install -d $(SHAREHP)/
+ install $(LPuid) $(LPgid) -m 775 -d $(SHAREHP)/psfiles/
+ for i in psfiles/*.*; do \
+ install -c -m 644 $$i $(SHAREHP)/psfiles/; \
+ done
+
+install-extra:
+ #
+ # Install extra files (ICM and firmware), if any exist here.
+ #
+ # Get files from the printer manufacturer, i.e. www.minolta-qms.com,
+ # or use the "./getweb" convenience script.
+ #
+ install -d $(SHAREZJS)/
+ # foo2zjs ICM files (if any)
+ install $(LPuid) $(LPgid) -m 775 -d $(SHAREZJS)/icm/
+ for i in DL*.icm CP*.icm km2430*.icm; do \
+ if [ -f $$i ]; then \
+ install -c -m 644 $$i $(SHAREZJS)/icm/; \
+ fi; \
+ done
+ # foo2zjs Firmware files (if any)
+ install $(LPuid) $(LPgid) -m 775 -d $(SHAREZJS)/firmware/
+ for i in sihp*.img; do \
+ if [ -f $$i ]; then \
+ base=`basename $$i .img`; \
+ ./arm2hpdl $$i >$$base.dl; \
+ install -c -m 644 $$base.dl $(SHAREZJS)/firmware/; \
+ fi; \
+ done
+ # foo2oak ICM files (if any)
+ install $(LPuid) $(LPgid) -m 775 -d $(SHAREOAK)/icm/
+ # foo2hp ICM files (if any)
+ install $(LPuid) $(LPgid) -m 775 -d $(SHAREHP)/icm/
+ for i in hpclj26*.icm km2430*.icm; do \
+ if [ -f $$i ]; then \
+ install -c -m 644 $$i $(SHAREHP)/icm/; \
+ fi; \
+ done
+ # foo2lava ICM files (if any)
+ install $(LPuid) $(LPgid) -m 775 -d $(SHARELAVA)/icm/
+ for i in km2530*.icm; do \
+ if [ -f $$i ]; then \
+ install -c -m 644 $$i $(SHARELAVA)/icm/; \
+ fi; \
+ done
+
+MODEL=/usr/share/cups/model
+LOCALMODEL=/usr/local/share/cups/model
+install-ppd:
+ #
+ # Install PPD files for CUPS
+ #
+ if [ -d /usr/share/ppd/ ]; then \
+ find /usr/share/ppd/ -name '*foo2zjs*' | xargs rm -f; \
+ find /usr/share/ppd/ -name '*foo2hp*' | xargs rm -f; \
+ find /usr/share/ppd/ -name '*foo2xqx*' | xargs rm -f; \
+ find /usr/share/ppd/ -name '*foo2lava*' | xargs rm -f; \
+ fi
+ if [ -d $(MODEL) ]; then \
+ cd PPD; \
+ for ppd in *.ppd; do \
+ gzip < $$ppd > $(MODEL)/$$ppd.gz; \
+ done; \
+ elif [ -d $(LOCALMODEL) ]; then \
+ cd PPD; \
+ for ppd in *.ppd; do \
+ gzip < $$ppd > $(LOCALMODEL)/$$ppd.gz; \
+ done; \
+ fi
+
+USBDIR=/etc/hotplug/usb
+UDEVDIR=/etc/udev/rules.d
+RULES=hplj10xx.rules
+install-hotplug: install-hotplug-test install-hotplug-prog
+
+install-hotplug-test:
+ #
+ # Hotplug Installation Dependencies...
+ #
+ @if ! type ex >/dev/null 2>&1; then \
+ echo " ***"; \
+ echo " *** Error: "ex" is not installed!"; \
+ echo " ***"; \
+ echo " *** Install "vim" package(s) for your OS"; \
+ echo " ***"; \
+ exit 1; \
+ fi
+ # ... OK!
+ #
+
+install-hotplug-prog:
+ [ -d $(USBDIR) ] || install -d -m 755 $(USBDIR)/
+ install -c -m 755 hplj1000 $(USBDIR)/
+ ln -sf $(USBDIR)/hplj1000 $(USBDIR)/hplj1005
+ ln -sf $(USBDIR)/hplj1000 $(USBDIR)/hplj1018
+ ln -sf $(USBDIR)/hplj1000 $(USBDIR)/hplj1020
+ $(USBDIR)/hplj1000 install-usermap
+ $(USBDIR)/hplj1005 install-usermap
+ $(USBDIR)/hplj1018 install-usermap
+ $(USBDIR)/hplj1020 install-usermap
+ if [ -d $(UDEVDIR) ]; then \
+ install -c -m 644 $(RULES) $(UDEVDIR)/11-$(RULES); \
+ fi
+
+cups: FRC
+ if [ -x /etc/init.d/cups ]; then \
+ /etc/init.d/cups restart; \
+ elif [ -x /etc/rc.d/rc.cups ]; then \
+ /etc/rc.d/rc.cups restart; \
+ elif [ -x /etc/init.d/cupsys ]; then \
+ /etc/init.d/cupsys restart; \
+ elif [ -x /etc/init.d/cupsd ]; then \
+ /etc/init.d/cupsd restart; \
+ elif [ -x /usr/local/etc/rc.d/cups.sh ]; then \
+ /usr/local/etc/rc.d/cups.sh restart; \
+ elif [ -x /usr/local/etc/rc.d/cups.sh.sample ]; then \
+ cp /usr/local/etc/rc.d/cups.sh.sample /usr/local/etc/rc.d/cups.sh; \
+ /usr/local/etc/rc.d/cups.sh restart; \
+ fi
+
+#
+# Uninstall
+#
+uninstall:
+ -rm -f /etc/hotplug/usb/hplj1000
+ -rm -f /etc/hotplug/usb/hplj1005
+ -rm -f /etc/hotplug/usb/hplj1018
+ -rm -f /etc/hotplug/usb/hplj1020
+ -rm -f /etc/hotplug/usb/foo2zjs.usermap
+ -(echo "g/^hplj10[02][05]/d"; echo "w") | ex /etc/hotplug/usb.usermap
+ -rm -f /etc/udev/rules.d/11-hplj10xx.rules
+ -rm -f /usr/bin/usb_printerid /bin/usb_printerid /sbin/usb_printerid
+ -rm -f /etc/hotplug/usb/hplj.usermap #
+ -rm -f /etc/udev/rules.d/58-foo2zjs.rules #
+ -rm -f /sbin/foo2zjs-loadfw #
+ -rm -rf /usr/share/doc/foo2zjs/
+ -rm -rf /usr/share/foo2zjs/
+ -rm -rf /usr/share/foo2hp/
+ -rm -rf /usr/share/foo2oak/
+ -rm -rf /usr/share/foo2xqx/
+ -rm -rf /usr/share/foo2lava/
+ -rm -f /usr/bin/foo2zjs /usr/bin/zjsdecode /usr/bin/arm2hpdl
+ -rm -f /usr/bin/foo2hp /usr/bin/foo2oak /usr/bin/foo2xqx
+ -rm -f /usr/bin/oakdecode /usr/bin/xqxdecode /usr/bin/lavadecode
+ -rm -f /usr/bin/foo2zjs-wrapper /usr/bin/foo2oak-wrapper
+ -rm -f /usr/bin/foo2hp2600-wrapper /usr/bin/foo2xqx-wrapper
+ -rm -f /usr/bin/foo2lava-wrapper /usr/bin/foo2lava
+ -rm -f /usr/bin/foo2zjs-icc2ps
+ -cd foomatic-db; for i in `find driver opt printer -name "*.xml"`; do \
+ rm -f $(FOODB)/$$i; \
+ done
+ cd PPD; for ppd in *.ppd; do \
+ rm -f $(MODEL)/$$ppd.gz; \
+ done;
+ -rm -f /var/cache/foomatic/printconf.pickle
+
+#
+# Clean
+#
+clean:
+ -rm -f $(PROGS) $(BINPROGS) $(SHELLS)
+ -rm -f *.zc *.zm
+ -rm -f xxx.* xxxomatic
+ -rm -f foo2zjs.o jbig.o jbig_tab.o zjsdecode.o foo2hp.o
+ -rm -f foo2xqx.o xqxdecode.o
+ -rm -f foo2lava.o lavadecode.o
+ -rm -f foo2oak.html foo2zjs.html foo2hp.html foo2xqx.html foo2lava.html
+ -rm -f index.html
+ -rm -f arch*.gif
+ -rm -f sihp*.dl
+ -rm -f *.tar.gz
+ -rm -f getweb
+ -rm -f patch.db
+ -rm -f $(MANPAGES) manual.pdf
+ -rm -f *.zjs *.zm *.zc *.zc? *.zc?? *.oak *.pbm *.pksm *.cmyk
+ -rm -f pksm2bitcmyk
+ -rm -f *.icm.*.ps
+ -rm -f okidecode.o
+ cd icc2ps; $(MAKE) $@
+
+#
+# Header dependencies
+#
+zjsdecode.o: zjs.h jbig.h
+foo2zjs.o: zjs.h jbig.h
+jbig.o: jbig.h
+foo2hp.o: zjs.h jbig.h cups.h
+xqxdecode.o: xqx.h jbig.h
+foo2xqx.o: xqx.h jbig.h
+lavadecode.o: jbig.h
+foo2lava.o: jbig.h
+
+#
+# foo2* Regression tests
+#
+test: testzjs testhp
+ #
+ # All regression tests passed.
+ #
+ # Send the appropriate test page .zm/.zc ZjStream file(s) to
+ # your printer using a *RAW* printer queue.
+
+#
+# foo2zjs Regression tests
+#
+testzjs: testpage.zm \
+ testpage.zc10 testpage.zc1 testpage.zc2 testpage.zc3 \
+ lj1000.zm lj1020.zm
+
+testpage.zm: testpage.ps foo2zjs-wrapper foo2zjs Makefile FRC
+ #
+ # Tests will pass only if you are using ghostscript-7.05-24.7
+ # or ghostscript-8.15.2-1.1
+ #
+ # Monochrome test page for Minolta 2200/2300 DL
+ PATH=.:$$PATH time -p foo2zjs-wrapper -b gs testpage.ps > $@
+ @want1="c4cf1940d6fb854cc3efdd6283388ea4 $@"; \
+ want2="5939be2536016b370b2038f6e77e08bb $@"; \
+ got=`md5sum $@`; [ "$$want1" = "$$got" -o "$$want2" = "$$got" ] || \
+ { echo "*** Test failure, got $$got"; exit 1; }
+
+testpage.zc10: testpage.ps foo2zjs-wrapper foo2zjs Makefile FRC
+ #
+ # Color test page for Minolta 2200/2300 DL
+ PATH=.:$$PATH time -p foo2zjs-wrapper -b gs -c -C10 testpage.ps > $@
+ @want1="3d3b6fc08d9a1c9f80a99fec867596df $@"; \
+ want2="d9e3f18873f7ff6255faabd925436d8b $@"; \
+ got=`md5sum $@`; [ "$$want1" = "$$got" -o "$$want2" = "$$got" ] || \
+ { echo "*** Test failure, got $$got"; exit 1; }
+
+testpage.zc1: testpage.ps foo2zjs-wrapper foo2zjs Makefile FRC
+ PATH=.:$$PATH time -p foo2zjs-wrapper -c -C1 testpage.ps > $@
+ @want="3d3b6fc08d9a1c9f80a99fec867596df $@"; got=`md5sum $@`; \
+ #[ "$$want" = "$$got" ] || \
+ # { echo "*** Test failure, got $$got"; exit 1; }
+
+testpage.zc2: testpage.ps foo2zjs-wrapper foo2zjs Makefile FRC
+ PATH=.:$$PATH time -p foo2zjs-wrapper -c -C2 testpage.ps > $@
+ @want="3d3b6fc08d9a1c9f80a99fec867596df $@"; got=`md5sum $@`; \
+ #[ "$$want" = "$$got" ] || \
+ # { echo "*** Test failure, got $$got"; exit 1; }
+
+testpage.zc3: testpage.ps foo2zjs-wrapper foo2zjs Makefile FRC
+ PATH=.:$$PATH time -p foo2zjs-wrapper -c -C3 testpage.ps > $@
+ @want="3d3b6fc08d9a1c9f80a99fec867596df $@"; got=`md5sum $@`; \
+ #[ "$$want" = "$$got" ] || \
+
+lj1000.zm: testpage.ps foo2zjs-wrapper foo2zjs Makefile FRC
+ #
+ # Monochrome test page for HP LJ1000
+ PATH=.:$$PATH time -p foo2zjs-wrapper -b gs -r600x600 -P testpage.ps >$@
+ @want1="e458bacac57331ec5206cacd0181fe8a $@"; \
+ want2="c0ed4d2a82b95422239e878a1f4ac537 $@"; \
+ got=`md5sum $@`; [ "$$want1" = "$$got" -o "$$want2" = "$$got" ] || \
+ { echo "*** Test failure, got $$got"; exit 1; }
+
+lj1020.zm: testpage.ps foo2zjs-wrapper foo2zjs Makefile FRC
+ #
+ # Monochrome test page for HP LJ1020
+ PATH=.:$$PATH time -p foo2zjs-wrapper -b gs -r600x600 -P -z1 \
+ testpage.ps >$@
+ @want1="391f91cd50781f733cfa7df44272da09 $@"; \
+ want2="1a33dfc460a5725bb7dbc34a7342b092 $@"; \
+ got=`md5sum $@`; [ "$$want1" = "$$got" -o "$$want2" = "$$got" ] || \
+ { echo "*** Test failure, got $$got"; exit 1; }
+
+#
+# foo2hp Regression tests
+#
+testhp: lj2600.zm1 lj2600.zc1
+
+lj2600.zm1: testpage.ps foo2hp2600-wrapper foo2hp Makefile FRC
+ #
+ # Monochrome test page for HP 2600n (1-bit)
+ PATH=.:$$PATH time -p foo2hp2600-wrapper testpage.ps > $@
+ @want1="11888137a72c4fd0ab1f791d1600fba0 $@"; \
+ want2="a768fc2854434276dd8a274896af5d4f $@"; \
+ got=`md5sum $@`; [ "$$want1" = "$$got" -o "$$want2" = "$$got" ] || \
+ { echo "*** Test failure, got $$got"; exit 1; }
+
+lj2600.zc1: testpage.ps foo2hp2600-wrapper foo2hp Makefile FRC
+ #
+ # Color test page for HP 2600n (1-bit)
+ PATH=.:$$PATH time -p foo2hp2600-wrapper -c testpage.ps > $@
+ @want1="a20f0d33017200d64ce9aec9fc0111af $@"; \
+ want2="88e77799c6e10b15586e9584afa50c09 $@"; \
+ got=`md5sum $@`; [ "$$want1" = "$$got" -o "$$want2" = "$$got" ] || \
+ { echo "*** Test failure, got $$got"; exit 1; }
+
+#
+# foo2oak Regression tests
+#
+testoak: pprtest-0.oak pprtest-1.oak pprtest-2.oak pprtest-3.oak
+
+pprtest-0.oak: FRC
+ #
+ # 1-bit Monochrome test page for OAKT
+ PATH=.:$$PATH foo2oak-wrapper -b1 -D12345678 pprtest.ps > $@
+ @want="fbd4c1a560985a6ad47ff23b018c7ce8 $@"; got=`md5sum $@`; \
+ [ "$$want" = "$$got" ] || \
+ { echo "*** Test failure, got $$got"; exit 1; }
+
+pprtest-1.oak: FRC
+ #
+ # 2-bit Monochrome test page for OAKT
+ PATH=.:$$PATH foo2oak-wrapper -b2 -D12345678 pprtest.ps > $@
+ @want="bec9a24ee1ce0d388b773f83609a4d01 $@"; got=`md5sum $@`; \
+ [ "$$want" = "$$got" ] || \
+ { echo "*** Test failure, got $$got"; exit 1; }
+
+pprtest-2.oak: FRC
+ #
+ # 1-bit color test page for OAKT
+ PATH=.:$$PATH foo2oak-wrapper -c -b1 -D12345678 pprtest.ps > $@
+ @want="c714bcd69fe5f3b2b257d7435eb938d1 $@"; got=`md5sum $@`; \
+ [ "$$want" = "$$got" ] || \
+ { echo "*** Test failure, got $$got"; exit 1; }
+
+pprtest-3.oak: FRC
+ #
+ # 2-bit color test page for OAKT
+ PATH=.:$$PATH foo2oak-wrapper -c -b2 -D12345678 pprtest.ps > $@
+ @want="ed89abcd873979bc9337e02263511964 $@"; got=`md5sum $@`; \
+ [ "$$want" = "$$got" ] || \
+ { echo "*** Test failure, got $$got"; exit 1; }
+
+#
+# icc2ps regression tests
+#
+ICC2PS=./icc2ps/foo2zjs-icc2ps
+icctest:
+ for g in *.icm; do \
+ for i in 0 1 2 3; do \
+ $(ICC2PS) -o $$g -t$$i \
+ | sed '/Created:/d' > $$g.$$i.ps; \
+ done; \
+ done
+
+
+#
+# Make phony print devices for testing full spooler interface without printing
+#
+tmpdev:
+ DEV=/tmp/OAK; > $$DEV; chmod 666 $$DEV
+ DEV=/tmp/OAKCM; > $$DEV; chmod 666 $$DEV
+ DEV=/tmp/testfile; > $$DEV; chmod 666 $$DEV
+
+#
+# Test files for debugging
+#
+testpage.pbm: testpage.ps Makefile
+xxx.zc: FRC
+xxx.zm: FRC
+
+#
+# PPD files
+#
+ppd:
+ # Did you do a "make install"????
+ ./getweb ppd
+
+#
+# Manpage generation. No, I am not interested in "info" files or
+# HTML documentation.
+#
+man: $(MANPAGES)
+
+.1in.1:
+ -rm -f $*.1
+ modtime() { $(MODTIME); }; \
+ MODpage=`modtime $*.1in`; \
+ MODver=$(VERSION); \
+ sed < $*.1in > $*.1 \
+ -e "s@\$${URLOAK}@$(URLOAK)@" \
+ -e "s@\$${URLZJS}@$(URLZJS)@" \
+ -e "s@\$${URLHP}@$(URLHP)@" \
+ -e "s@\$${URLXQX}@$(URLXQX)@" \
+ -e "s/\$${MODpage}/$$MODpage/" \
+ -e "s/\$${MODver}/$$MODver/"
+ chmod -w $*.1
+
+install-man: man
+ #
+ # Install manual pages
+ #
+ install -d -m 755 $(MANDIR)
+ install -d -m 755 $(MANDIR)/man1/
+ install -c -m 644 foo2zjs.1 $(MANDIR)/man1/
+ install -c -m 644 foo2zjs-wrapper.1 $(MANDIR)/man1/
+ install -c -m 644 zjsdecode.1 $(MANDIR)/man1/
+ install -c -m 644 foo2oak.1 $(MANDIR)/man1/
+ install -c -m 644 foo2oak-wrapper.1 $(MANDIR)/man1/
+ install -c -m 644 oakdecode.1 $(MANDIR)/man1/
+ install -c -m 644 foo2hp.1 $(MANDIR)/man1/
+ install -c -m 644 foo2hp2600-wrapper.1 $(MANDIR)/man1/
+ install -c -m 644 xqxdecode.1 $(MANDIR)/man1/
+ install -c -m 644 foo2xqx.1 $(MANDIR)/man1/
+ install -c -m 644 foo2xqx-wrapper.1 $(MANDIR)/man1/
+ install -c -m 644 lavadecode.1 $(MANDIR)/man1/
+ install -c -m 644 foo2lava.1 $(MANDIR)/man1/
+ install -c -m 644 foo2lava-wrapper.1 $(MANDIR)/man1/
+
+doc: README INSTALL manual.pdf
+
+install-doc: doc
+ #
+ # Install documentation
+ #
+ install -d -m 755 $(DOCDIR)
+ install -c -m 644 manual.pdf $(DOCDIR)
+ install -c -m 644 COPYING $(DOCDIR)
+ install -c -m 644 INSTALL $(DOCDIR)
+ install -c -m 644 INSTALL.osx $(DOCDIR)
+ install -c -m 644 README $(DOCDIR)
+ install -c -m 644 ChangeLog $(DOCDIR)
+
+GROFF=/usr/local/test/bin/groff
+GROFF=groff
+manual.pdf: $(MANPAGES)
+ -$(GROFF) -t -man $(MANPAGES) | ps2pdf - $@
+
+README: README.in
+ rm -f $@
+ sed < $@.in > $@ \
+ -e "s@\$${URLOAK}@$(URLOAK)@" \
+ -e "s@\$${URLZJS}@$(URLZJS)@"
+ chmod -w $@
+
+INSTALL: INSTALL.in
+ rm -f $@
+ sed < $@.in > $@ \
+ -e "s@\$${URLOAK}@$(URLOAK)@" \
+ -e "s@\$${URLZJS}@$(URLZJS)@"
+ chmod -w $@
+
+#
+# Check db files against current foomatic to see if any changes
+# need to be made or reported.
+#
+MYFOODB=../foomatic/foomatic-db/db/source
+checkdb:
+ @for dir in driver printer opt; do \
+ for file in foomatic-db/$$dir/*.xml ; do \
+ ofile=$(MYFOODB)/$$dir/`basename $$file`; \
+ : echo diff -N -u $$ofile $$file; \
+ if [ ! -f $$ofile ]; then \
+ ofile=/dev/null; \
+ fi; \
+ diff -N -u $$ofile $$file; \
+ done \
+ done
+
+#
+# Mail my latest foomatic-db entries to Till.
+#
+WHO=rick.richardson@comcast.net
+WHO=till.kamppeter@gmx.net
+maildb:
+ $(MAKE) -s checkdb > patch.db
+ echo "Here is a patch for the foomatic-db foo2zjs/foo2oak entries." | \
+ mutt -a patch.db \
+ -s "foo2zjs/foo2oak - patch for foomatic database" $(WHO)
+
+#
+# Create tarball
+#
+tar:
+ HERE=`basename $$PWD`; \
+ /bin/ls $(FILES) | \
+ sed -e "s?^?$$HERE/?" | \
+ (cd ..; tar -c -z -f $$HERE/$$HERE.tar.gz -T-)
+
+#
+# Populate the web site
+# make web
+# make webworld
+# make webextra
+#
+URLOAK=http://foo2oak.rkkda.com
+URLZJS=http://foo2zjs.rkkda.com
+URLHP=http://foo2hp.rkkda.com
+URLXQX=http://foo2xqx.rkkda.com
+URLLAVA=http://foo2lava.rkkda.com
+FTPSITE=~/.ncftp-website
+
+foo2zjs.html foo2oak.html foo2hp.html foo2xqx.html foo2lava.html: FRC
+ rm -f $@
+ HERE=`basename $$PWD`; \
+ TZ=`date | cut -c 21-24`; \
+ modtime() { $(MODTIME); }; \
+ MODindex=`modtime $@.in`; \
+ MODtarball=`modtime $$HERE.tar.gz`; \
+ sed < $@.in > $@ \
+ -e "s@\$${URLOAK}@$(URLOAK)@g" \
+ -e "s@\$${URLZJS}@$(URLZJS)@g" \
+ -e "s@\$${URLHP}@$(URLHP)@g" \
+ -e "s@\$${URLXQX}@$(URLXQX)@g" \
+ -e "s@\$${URLLAVA}@$(URLLAVA)@g" \
+ -e "s/\$${MODindex}/$$MODindex $$TZ/" \
+ -e "s/\$${MODtarball}/$$MODtarball $$TZ/"
+ chmod -w $@
+
+web: test tar manual.pdf webindex
+ ncftpput -m -f $(FTPSITE) foo2zjs \
+ ChangeLog INSTALL manual.pdf *.tar.gz;
+
+webt: tar manual.pdf webindex
+ ncftpput -m -f $(FTPSITE) foo2zjs \
+ ChangeLog INSTALL manual.pdf *.tar.gz;
+
+webworld: web webpics
+
+webindex: INSTALL zjsindex oakindex hpindex xqxindex lavaindex
+
+webpics: redhat suse ubuntu mandriva
+
+zjsindex: foo2zjs.html archzjs.gif
+ ln -sf foo2zjs.html index.html
+ ncftpput -m -f $(FTPSITE) foo2zjs \
+ index.html style.css archzjs.gif INSTALL zjsfavicon.png;
+
+oakindex: foo2oak.html archoak.gif
+ ln -sf foo2oak.html index.html
+ ncftpput -m -f $(FTPSITE) foo2oak \
+ index.html style.css archoak.gif INSTALL;
+
+hpindex: foo2hp.html archhp.gif
+ ln -sf foo2hp.html index.html
+ ncftpput -m -f $(FTPSITE) foo2hp \
+ index.html style.css archhp.gif INSTALL hpfavicon.png;
+
+xqxindex: foo2xqx.html archxqx.gif
+ ln -sf foo2xqx.html index.html
+ ncftpput -m -f $(FTPSITE) foo2xqx \
+ index.html style.css archxqx.gif INSTALL xqxfavicon.png;
+
+lavaindex: foo2lava.html archlava.gif
+ ln -sf foo2lava.html index.html
+ ncftpput -m -f $(FTPSITE) foo2lava \
+ index.html style.css archlava.gif INSTALL lavafavicon.png;
+
+redhat: FRC
+ cd redhat; $(MAKE) web FTPSITE=$(FTPSITE)
+
+# Fedora Core 6+
+fedora: FRC
+ cd fedora; $(MAKE) web FTPSITE=$(FTPSITE)
+
+suse: FRC
+ cd suse; $(MAKE) web FTPSITE=$(FTPSITE)
+
+ubuntu: FRC
+ cd ubuntu; $(MAKE) web FTPSITE=$(FTPSITE)
+
+mandriva: FRC
+ cd mandriva; $(MAKE) web FTPSITE=$(FTPSITE)
+
+#
+# Extra files from web
+#
+webextra: webicm webfw
+
+webicm: icm/km2430.tar.gz icm/hpclj2600n.tar.gz icm/km2530.tar.gz
+ ncftpput -m -f $(FTPSITE) foo2zjs icm/km2430.tar.gz;
+ ncftpput -m -f $(FTPSITE) foo2hp icm/hpclj2600n.tar.gz;
+ ncftpput -m -f $(FTPSITE) foo2lava icm/km2530.tar.gz;
+
+icm/km2430.tar.gz: FRC
+ cd icm; tar -c -z -f ../$@ km2430*.icm
+icm/hpclj2600n.tar.gz: FRC
+ cd icm; tar -c -z -f ../$@ hpclj2600*.icm
+icm/km2530.tar.gz: FRC
+ cd icm; tar -c -z -f ../$@ km2530*.icm
+
+webfw: firmware/sihp1000.tar.gz \
+ firmware/sihp1005.tar.gz \
+ firmware/sihp1018.tar.gz \
+ firmware/sihp1020.tar.gz \
+ $(NULL)
+ ncftpput -m -f $(FTPSITE) foo2zjs firmware/*.tar.gz;
+
+firmware/sihp1000.tar.gz: FRC
+ cd firmware; tar -c -z -f ../$@ sihp1000.img
+firmware/sihp1005.tar.gz: FRC
+ cd firmware; tar -c -z -f ../$@ sihp1005.img
+firmware/sihp1018.tar.gz: FRC
+ cd firmware; tar -c -z -f ../$@ sihp1018.img
+firmware/sihp1020.tar.gz: FRC
+ cd firmware; tar -c -z -f ../$@ sihp1020.img
+
+FRC:
+
+#
+# Target for building Oak Technologies encoder/decoder (for HP1500)
+#
+# This source code will not be made available unless someone sponsors
+# me to finish the work on it.
+#
+LIBJBGOAK = jbig.o jbig_tab.o
+o: oakdecode foo2oak foo2oak-wrapper
+ root install oakdecode foo2oak foo2oak-wrapper $(BIN)/
+oakdecode: oakdecode_$(MACH).o $(LIBJBGOAK)
+ $(CC) $(CFLAGS) oakdecode_$(MACH).o $(LIBJBGOAK) -o $@
+foo2oak: foo2oak_$(MACH).o $(LIBJBGOAK)
+ $(CC) $(CFLAGS) -o $@ foo2oak_$(MACH).o $(LIBJBGOAK)
+foo2oak-wrapper: foo2oak-wrapper.in Makefile
+ [ ! -f $@ ] || chmod +w $@
+ sed < $@.in > $@ \
+ -e 's@^PREFIX=.*@PREFIX=$(PREFIX)@' || (rm -f $@ && exit 1)
+ chmod 555 $@
+
+SYSNAME := $(shell uname -n)
+ifeq ($(SYSNAME),ipcroe.rkkda.com)
+foo2oak_$(MACH).o: oak.h jbig.h foo2oak.c
+ cp -a foo2oak.c foo2oak_$(MACH).c
+ $(CC) $(CFLAGS) -c foo2oak_$(MACH).c
+oakdecode_$(MACH).o: oak.h oakdecode.c
+ cp -a oakdecode.c oakdecode_$(MACH).c
+ $(CC) $(CFLAGS) -c oakdecode_$(MACH).c
+endif
+ifeq ($(SYSNAME),amd.rkkda.org)
+foo2oak_$(MACH).o: oak.h jbig.h foo2oak.c
+ cp -a foo2oak.c foo2oak_$(MACH).c
+ $(CC) $(CFLAGS) -c foo2oak_$(MACH).c
+oakdecode_$(MACH).o: oak.h oakdecode.c
+ cp -a oakdecode.c oakdecode_$(MACH).c
+ $(CC) $(CFLAGS) -c oakdecode_$(MACH).c
+endif
+
+#
+# Misc
+#
+misc: pksm2bitcmyk
+
+pksm2bitcmyk: pksm2bitcmyk.c
+ $(CC) $(CFLAGS) pksm2bitcmyk.c -lpbm -o $@
diff --git a/PPD/Generic-OAKT_Printer.ppd b/PPD/Generic-OAKT_Printer.ppd
new file mode 100644
index 0000000..54eee8d
--- /dev/null
+++ b/PPD/Generic-OAKT_Printer.ppd
@@ -0,0 +1,422 @@
+*PPD-Adobe: "4.3"
+*%
+*% For information on using this, and to obtain the required backend
+*% script, consult http://www.linuxprinting.org/
+*%
+*% This file is published under the GNU General Public License
+*%
+*% PPD-O-MATIC (3.0.0 or newer) generated this PPD file. It is for use with
+*% all programs and environments which use PPD files for dealing with
+*% printer capability information. The printer must be configured with the
+*% "foomatic-rip" backend filter script of Foomatic 3.0.0 or newer. This
+*% file and "foomatic-rip" work together to support PPD-controlled printer
+*% driver option access with arbitrary free software printer drivers and
+*% printing spoolers.
+*%
+*% To save this file on your disk, wait until the download has completed
+*% (the animation of the browser logo must stop) and then use the
+*% "Save as..." command in the "File" menu of your browser or in the
+*% pop-up manu when you click on this document with the right mouse button.
+*% DO NOT cut and paste this file into an editor with your mouse. This can
+*% introduce additional line breaks which lead to unexpected results.
+*%
+*% You may save this file as 'Generic-OAKT_Printer-foo2oak.ppd'
+*%
+*%
+*FormatVersion: "4.3"
+*FileVersion: "1.1"
+*LanguageVersion: English
+*LanguageEncoding: ISOLatin1
+*PCFileName: "FOO2OAK.PPD"
+*Manufacturer: "Generic"
+*Product: "(OAKT Printer)"
+*cupsVersion: 1.0
+*cupsManualCopies: True
+*cupsModelNumber: 2
+*cupsFilter: "application/vnd.cups-postscript 0 foomatic-rip"
+*%pprRIP: foomatic-rip other
+*ModelName: "Generic OAKT Printer"
+*ShortNickName: "Generic OAKT Printer foo2oak"
+*NickName: "Generic OAKT Printer Foomatic/foo2oak (recommended)"
+*PSVersion: "(3010.000) 550"
+*PSVersion: "(3010.000) 651"
+*PSVersion: "(3010.000) 652"
+*PSVersion: "(3010.000) 653"
+*PSVersion: "(3010.000) 704"
+*PSVersion: "(3010.000) 705"
+*PSVersion: "(3010.000) 800"
+*LanguageLevel: "3"
+*ColorDevice: True
+*DefaultColorSpace: RGB
+*FileSystem: False
+*Throughput: "1"
+*LandscapeOrientation: Plus90
+*TTRasterizer: Type42
+
+
+
+
+*VariablePaperSize: False
+
+*FoomaticIDs: Generic-OAKT_Printer foo2oak
+*FoomaticRIPCommandLine: "foo2oak-wrapper %A"
+
+*OpenGroup: General/General
+
+*OpenUI *PageSize/Page Size: PickOne
+*FoomaticRIPOption PageSize: enum CmdLine A
+*OrderDependency: 135 AnySetup *PageSize
+*DefaultPageSize: Letter
+*PageSize Letter/Letter: "%% FoomaticRIPOptionSetting: PageSize=Letter"
+*FoomaticRIPOptionSetting PageSize=Letter: "-p1 "
+*PageSize A4/A4: "%% FoomaticRIPOptionSetting: PageSize=A4"
+*FoomaticRIPOptionSetting PageSize=A4: "-p9 "
+*PageSize A5/A5: "%% FoomaticRIPOptionSetting: PageSize=A5"
+*FoomaticRIPOptionSetting PageSize=A5: "-p11 "
+*PageSize B5/B5: "%% FoomaticRIPOptionSetting: PageSize=B5"
+*FoomaticRIPOptionSetting PageSize=B5: "-p13 "
+*PageSize Env10/Env #10: "%% FoomaticRIPOptionSetting: PageSize=Env10"
+*FoomaticRIPOptionSetting PageSize=Env10: "-p20 "
+*PageSize EnvB5/Env B5: "%% FoomaticRIPOptionSetting: PageSize=EnvB5"
+*FoomaticRIPOptionSetting PageSize=EnvB5: "-p34 "
+*PageSize EnvC5/Env C5: "%% FoomaticRIPOptionSetting: PageSize=EnvC5"
+*FoomaticRIPOptionSetting PageSize=EnvC5: "-p28 "
+*PageSize EnvDL/Env DL: "%% FoomaticRIPOptionSetting: PageSize=EnvDL"
+*FoomaticRIPOptionSetting PageSize=EnvDL: "-p27 "
+*PageSize EnvMonarch/Env Monarch: "%% FoomaticRIPOptionSetting: PageSize=EnvMonarch"
+*FoomaticRIPOptionSetting PageSize=EnvMonarch: "-p37 "
+*PageSize Executive/Executive: "%% FoomaticRIPOptionSetting: PageSize=Executive"
+*FoomaticRIPOptionSetting PageSize=Executive: "-p7 "
+*PageSize Legal/Legal: "%% FoomaticRIPOptionSetting: PageSize=Legal"
+*FoomaticRIPOptionSetting PageSize=Legal: "-p5 "
+*CloseUI: *PageSize
+
+*OpenUI *PageRegion: PickOne
+*OrderDependency: 135 AnySetup *PageRegion
+*DefaultPageRegion: Letter
+*PageRegion Letter/Letter: "%% FoomaticRIPOptionSetting: PageSize=Letter"
+*PageRegion A4/A4: "%% FoomaticRIPOptionSetting: PageSize=A4"
+*PageRegion A5/A5: "%% FoomaticRIPOptionSetting: PageSize=A5"
+*PageRegion B5/B5: "%% FoomaticRIPOptionSetting: PageSize=B5"
+*PageRegion Env10/Env #10: "%% FoomaticRIPOptionSetting: PageSize=Env10"
+*PageRegion EnvB5/Env B5: "%% FoomaticRIPOptionSetting: PageSize=EnvB5"
+*PageRegion EnvC5/Env C5: "%% FoomaticRIPOptionSetting: PageSize=EnvC5"
+*PageRegion EnvDL/Env DL: "%% FoomaticRIPOptionSetting: PageSize=EnvDL"
+*PageRegion EnvMonarch/Env Monarch: "%% FoomaticRIPOptionSetting: PageSize=EnvMonarch"
+*PageRegion Executive/Executive: "%% FoomaticRIPOptionSetting: PageSize=Executive"
+*PageRegion Legal/Legal: "%% FoomaticRIPOptionSetting: PageSize=Legal"
+*CloseUI: *PageRegion
+
+*DefaultImageableArea: Letter
+*ImageableArea Letter/Letter: "0 0 612 792"
+*ImageableArea A4/A4: "0 0 595 842"
+*ImageableArea A5/A5: "0 0 420 595"
+*ImageableArea B5/B5: "0 0 498 708"
+*ImageableArea Env10/Env #10: "0 0 297 684"
+*ImageableArea EnvB5/Env B5: "0 0 498 708"
+*ImageableArea EnvC5/Env C5: "0 0 459 649"
+*ImageableArea EnvDL/Env DL: "0 0 311 623"
+*ImageableArea EnvMonarch/Env Monarch: "0 0 279 540"
+*ImageableArea Executive/Executive: "0 0 522 756"
+*ImageableArea Legal/Legal: "0 0 612 1008"
+
+*DefaultPaperDimension: Letter
+*PaperDimension Letter/Letter: "612 792"
+*PaperDimension A4/A4: "595 842"
+*PaperDimension A5/A5: "420 595"
+*PaperDimension B5/B5: "498 708"
+*PaperDimension Env10/Env #10: "297 684"
+*PaperDimension EnvB5/Env B5: "498 708"
+*PaperDimension EnvC5/Env C5: "459 649"
+*PaperDimension EnvDL/Env DL: "311 623"
+*PaperDimension EnvMonarch/Env Monarch: "279 540"
+*PaperDimension Executive/Executive: "522 756"
+*PaperDimension Legal/Legal: "612 1008"
+
+*OpenUI *InputSlot/Media Source: PickOne
+*FoomaticRIPOption InputSlot: enum CmdLine A
+*OrderDependency: 150 AnySetup *InputSlot
+*DefaultInputSlot: Auto
+*InputSlot Tray1/Tray 1: "%% FoomaticRIPOptionSetting: InputSlot=Tray1"
+*FoomaticRIPOptionSetting InputSlot=Tray1: "-s1 "
+*InputSlot Auto/Auto Select: "%% FoomaticRIPOptionSetting: InputSlot=Auto"
+*FoomaticRIPOptionSetting InputSlot=Auto: "-s7 "
+*InputSlot Manual/Manual Feed: "%% FoomaticRIPOptionSetting: InputSlot=Manual"
+*FoomaticRIPOptionSetting InputSlot=Manual: "-s4 "
+*CloseUI: *InputSlot
+
+*OpenUI *MediaType/Media Type: PickOne
+*FoomaticRIPOption MediaType: enum CmdLine A
+*OrderDependency: 150 AnySetup *MediaType
+*DefaultMediaType: Auto
+*MediaType Plain/Plain: "%% FoomaticRIPOptionSetting: MediaType=Plain"
+*FoomaticRIPOptionSetting MediaType=Plain: "-m1 "
+*MediaType Auto/Auto Select: "%% FoomaticRIPOptionSetting: MediaType=Auto"
+*FoomaticRIPOptionSetting MediaType=Auto: "-m0 "
+*MediaType Bond/Bond: "%% FoomaticRIPOptionSetting: MediaType=Bond"
+*FoomaticRIPOptionSetting MediaType=Bond: "-m7 "
+*MediaType Cardstock/Cardstock: "%% FoomaticRIPOptionSetting: MediaType=Cardstock"
+*FoomaticRIPOptionSetting MediaType=Cardstock: "-m10 "
+*MediaType Color/Color: "%% FoomaticRIPOptionSetting: MediaType=Color"
+*FoomaticRIPOptionSetting MediaType=Color: "-m9 "
+*MediaType Envelope/Envelope: "%% FoomaticRIPOptionSetting: MediaType=Envelope"
+*FoomaticRIPOptionSetting MediaType=Envelope: "-m12 "
+*MediaType Graytrans/Grayscale Transparency: "%% FoomaticRIPOptionSetting: MediaType=Graytrans"
+*FoomaticRIPOptionSetting MediaType=Graytrans: "-m4 "
+*MediaType Heavy/Heavy: "%% FoomaticRIPOptionSetting: MediaType=Heavy"
+*FoomaticRIPOptionSetting MediaType=Heavy: "-m11 "
+*MediaType Labels/Labels: "%% FoomaticRIPOptionSetting: MediaType=Labels"
+*FoomaticRIPOptionSetting MediaType=Labels: "-m6 "
+*MediaType Letterhead/Letterhead: "%% FoomaticRIPOptionSetting: MediaType=Letterhead"
+*FoomaticRIPOptionSetting MediaType=Letterhead: "-m3 "
+*MediaType Light/Light: "%% FoomaticRIPOptionSetting: MediaType=Light"
+*FoomaticRIPOptionSetting MediaType=Light: "-m13 "
+*MediaType Preprinted/Preprinted: "%% FoomaticRIPOptionSetting: MediaType=Preprinted"
+*FoomaticRIPOptionSetting MediaType=Preprinted: "-m2 "
+*MediaType Prepunched/Prepunched: "%% FoomaticRIPOptionSetting: MediaType=Prepunched"
+*FoomaticRIPOptionSetting MediaType=Prepunched: "-m5 "
+*MediaType Recycled/Recycled: "%% FoomaticRIPOptionSetting: MediaType=Recycled"
+*FoomaticRIPOptionSetting MediaType=Recycled: "-m8 "
+*MediaType Tough/Tough: "%% FoomaticRIPOptionSetting: MediaType=Tough"
+*FoomaticRIPOptionSetting MediaType=Tough: "-m14 "
+*CloseUI: *MediaType
+
+*OpenUI *ColorMode/Color Mode: PickOne
+*FoomaticRIPOption ColorMode: enum CmdLine A
+*OrderDependency: 120 AnySetup *ColorMode
+*DefaultColorMode: Monochrome
+*ColorMode Color/Color: "%% FoomaticRIPOptionSetting: ColorMode=Color"
+*FoomaticRIPOptionSetting ColorMode=Color: "-c "
+*ColorMode Monochrome/Monochrome: "%% FoomaticRIPOptionSetting: ColorMode=Monochrome"
+*FoomaticRIPOptionSetting ColorMode=Monochrome: " "
+*CloseUI: *ColorMode
+
+*OpenUI *BitsPerPlane/Bits Per Plane: PickOne
+*FoomaticRIPOption BitsPerPlane: enum CmdLine A
+*OrderDependency: 120 AnySetup *BitsPerPlane
+*DefaultBitsPerPlane: 1-BPP
+*BitsPerPlane 1-BPP/1 Bit Per Plane: "%% FoomaticRIPOptionSetting: BitsPerPlane=1-BPP"
+*FoomaticRIPOptionSetting BitsPerPlane=1-BPP: "-b1 "
+*BitsPerPlane 2-BPP/2 Bits Per Plane: "%% FoomaticRIPOptionSetting: BitsPerPlane=2-BPP"
+*FoomaticRIPOptionSetting BitsPerPlane=2-BPP: "-b2 "
+*CloseUI: *BitsPerPlane
+
+*OpenUI *Copies/Copies: PickOne
+*FoomaticRIPOption Copies: int CmdLine A
+*FoomaticRIPOptionPrototype Copies: "-n%s "
+*FoomaticRIPOptionRange Copies: 1 100
+*OrderDependency: 220 AnySetup *Copies
+*DefaultCopies: 1
+*FoomaticRIPDefaultCopies: 1
+*Copies 1/1: "%% FoomaticRIPOptionSetting: Copies=1"
+*Copies 2/2: "%% FoomaticRIPOptionSetting: Copies=2"
+*Copies 3/3: "%% FoomaticRIPOptionSetting: Copies=3"
+*Copies 4/4: "%% FoomaticRIPOptionSetting: Copies=4"
+*Copies 5/5: "%% FoomaticRIPOptionSetting: Copies=5"
+*Copies 6/6: "%% FoomaticRIPOptionSetting: Copies=6"
+*Copies 7/7: "%% FoomaticRIPOptionSetting: Copies=7"
+*Copies 8/8: "%% FoomaticRIPOptionSetting: Copies=8"
+*Copies 9/9: "%% FoomaticRIPOptionSetting: Copies=9"
+*Copies 10/10: "%% FoomaticRIPOptionSetting: Copies=10"
+*Copies 11/11: "%% FoomaticRIPOptionSetting: Copies=11"
+*Copies 12/12: "%% FoomaticRIPOptionSetting: Copies=12"
+*Copies 13/13: "%% FoomaticRIPOptionSetting: Copies=13"
+*Copies 14/14: "%% FoomaticRIPOptionSetting: Copies=14"
+*Copies 15/15: "%% FoomaticRIPOptionSetting: Copies=15"
+*Copies 16/16: "%% FoomaticRIPOptionSetting: Copies=16"
+*Copies 17/17: "%% FoomaticRIPOptionSetting: Copies=17"
+*Copies 18/18: "%% FoomaticRIPOptionSetting: Copies=18"
+*Copies 19/19: "%% FoomaticRIPOptionSetting: Copies=19"
+*Copies 20/20: "%% FoomaticRIPOptionSetting: Copies=20"
+*Copies 21/21: "%% FoomaticRIPOptionSetting: Copies=21"
+*Copies 22/22: "%% FoomaticRIPOptionSetting: Copies=22"
+*Copies 23/23: "%% FoomaticRIPOptionSetting: Copies=23"
+*Copies 24/24: "%% FoomaticRIPOptionSetting: Copies=24"
+*Copies 25/25: "%% FoomaticRIPOptionSetting: Copies=25"
+*Copies 26/26: "%% FoomaticRIPOptionSetting: Copies=26"
+*Copies 27/27: "%% FoomaticRIPOptionSetting: Copies=27"
+*Copies 28/28: "%% FoomaticRIPOptionSetting: Copies=28"
+*Copies 29/29: "%% FoomaticRIPOptionSetting: Copies=29"
+*Copies 30/30: "%% FoomaticRIPOptionSetting: Copies=30"
+*Copies 31/31: "%% FoomaticRIPOptionSetting: Copies=31"
+*Copies 32/32: "%% FoomaticRIPOptionSetting: Copies=32"
+*Copies 33/33: "%% FoomaticRIPOptionSetting: Copies=33"
+*Copies 34/34: "%% FoomaticRIPOptionSetting: Copies=34"
+*Copies 35/35: "%% FoomaticRIPOptionSetting: Copies=35"
+*Copies 36/36: "%% FoomaticRIPOptionSetting: Copies=36"
+*Copies 37/37: "%% FoomaticRIPOptionSetting: Copies=37"
+*Copies 38/38: "%% FoomaticRIPOptionSetting: Copies=38"
+*Copies 39/39: "%% FoomaticRIPOptionSetting: Copies=39"
+*Copies 40/40: "%% FoomaticRIPOptionSetting: Copies=40"
+*Copies 41/41: "%% FoomaticRIPOptionSetting: Copies=41"
+*Copies 42/42: "%% FoomaticRIPOptionSetting: Copies=42"
+*Copies 43/43: "%% FoomaticRIPOptionSetting: Copies=43"
+*Copies 44/44: "%% FoomaticRIPOptionSetting: Copies=44"
+*Copies 45/45: "%% FoomaticRIPOptionSetting: Copies=45"
+*Copies 46/46: "%% FoomaticRIPOptionSetting: Copies=46"
+*Copies 47/47: "%% FoomaticRIPOptionSetting: Copies=47"
+*Copies 48/48: "%% FoomaticRIPOptionSetting: Copies=48"
+*Copies 49/49: "%% FoomaticRIPOptionSetting: Copies=49"
+*Copies 50/50: "%% FoomaticRIPOptionSetting: Copies=50"
+*Copies 51/51: "%% FoomaticRIPOptionSetting: Copies=51"
+*Copies 52/52: "%% FoomaticRIPOptionSetting: Copies=52"
+*Copies 53/53: "%% FoomaticRIPOptionSetting: Copies=53"
+*Copies 54/54: "%% FoomaticRIPOptionSetting: Copies=54"
+*Copies 55/55: "%% FoomaticRIPOptionSetting: Copies=55"
+*Copies 56/56: "%% FoomaticRIPOptionSetting: Copies=56"
+*Copies 57/57: "%% FoomaticRIPOptionSetting: Copies=57"
+*Copies 58/58: "%% FoomaticRIPOptionSetting: Copies=58"
+*Copies 59/59: "%% FoomaticRIPOptionSetting: Copies=59"
+*Copies 60/60: "%% FoomaticRIPOptionSetting: Copies=60"
+*Copies 61/61: "%% FoomaticRIPOptionSetting: Copies=61"
+*Copies 62/62: "%% FoomaticRIPOptionSetting: Copies=62"
+*Copies 63/63: "%% FoomaticRIPOptionSetting: Copies=63"
+*Copies 64/64: "%% FoomaticRIPOptionSetting: Copies=64"
+*Copies 65/65: "%% FoomaticRIPOptionSetting: Copies=65"
+*Copies 66/66: "%% FoomaticRIPOptionSetting: Copies=66"
+*Copies 67/67: "%% FoomaticRIPOptionSetting: Copies=67"
+*Copies 68/68: "%% FoomaticRIPOptionSetting: Copies=68"
+*Copies 69/69: "%% FoomaticRIPOptionSetting: Copies=69"
+*Copies 70/70: "%% FoomaticRIPOptionSetting: Copies=70"
+*Copies 71/71: "%% FoomaticRIPOptionSetting: Copies=71"
+*Copies 72/72: "%% FoomaticRIPOptionSetting: Copies=72"
+*Copies 73/73: "%% FoomaticRIPOptionSetting: Copies=73"
+*Copies 74/74: "%% FoomaticRIPOptionSetting: Copies=74"
+*Copies 75/75: "%% FoomaticRIPOptionSetting: Copies=75"
+*Copies 76/76: "%% FoomaticRIPOptionSetting: Copies=76"
+*Copies 77/77: "%% FoomaticRIPOptionSetting: Copies=77"
+*Copies 78/78: "%% FoomaticRIPOptionSetting: Copies=78"
+*Copies 79/79: "%% FoomaticRIPOptionSetting: Copies=79"
+*Copies 80/80: "%% FoomaticRIPOptionSetting: Copies=80"
+*Copies 81/81: "%% FoomaticRIPOptionSetting: Copies=81"
+*Copies 82/82: "%% FoomaticRIPOptionSetting: Copies=82"
+*Copies 83/83: "%% FoomaticRIPOptionSetting: Copies=83"
+*Copies 84/84: "%% FoomaticRIPOptionSetting: Copies=84"
+*Copies 85/85: "%% FoomaticRIPOptionSetting: Copies=85"
+*Copies 86/86: "%% FoomaticRIPOptionSetting: Copies=86"
+*Copies 87/87: "%% FoomaticRIPOptionSetting: Copies=87"
+*Copies 88/88: "%% FoomaticRIPOptionSetting: Copies=88"
+*Copies 89/89: "%% FoomaticRIPOptionSetting: Copies=89"
+*Copies 90/90: "%% FoomaticRIPOptionSetting: Copies=90"
+*Copies 91/91: "%% FoomaticRIPOptionSetting: Copies=91"
+*Copies 92/92: "%% FoomaticRIPOptionSetting: Copies=92"
+*Copies 93/93: "%% FoomaticRIPOptionSetting: Copies=93"
+*Copies 94/94: "%% FoomaticRIPOptionSetting: Copies=94"
+*Copies 95/95: "%% FoomaticRIPOptionSetting: Copies=95"
+*Copies 96/96: "%% FoomaticRIPOptionSetting: Copies=96"
+*Copies 97/97: "%% FoomaticRIPOptionSetting: Copies=97"
+*Copies 98/98: "%% FoomaticRIPOptionSetting: Copies=98"
+*Copies 99/99: "%% FoomaticRIPOptionSetting: Copies=99"
+*Copies 100/100: "%% FoomaticRIPOptionSetting: Copies=100"
+*CloseUI: *Copies
+
+*CloseGroup: General
+
+*OpenGroup: Adjustment/Adjustment
+
+*OpenUI *ICM/ICM Color Profile: PickOne
+*FoomaticRIPOption ICM: enum CmdLine A
+*OrderDependency: 300 AnySetup *ICM
+*DefaultICM: none
+*ICM none/No ICM color correction: "%% FoomaticRIPOptionSetting: ICM=none"
+*FoomaticRIPOptionSetting ICM=none: " "
+*ICM testing/File testing.icm: "%% FoomaticRIPOptionSetting: ICM=testing"
+*FoomaticRIPOptionSetting ICM=testing: "-Gtesting.icm "
+*ICM user1/File user1.icm: "%% FoomaticRIPOptionSetting: ICM=user1"
+*FoomaticRIPOptionSetting ICM=user1: "-Guser1.icm "
+*ICM user2/File user2.icm: "%% FoomaticRIPOptionSetting: ICM=user2"
+*FoomaticRIPOptionSetting ICM=user2: "-Guser2.icm "
+*ICM user3/File user3.icm: "%% FoomaticRIPOptionSetting: ICM=user3"
+*FoomaticRIPOptionSetting ICM=user3: "-Guser3.icm "
+*ICM user4/File user4.icm: "%% FoomaticRIPOptionSetting: ICM=user4"
+*FoomaticRIPOptionSetting ICM=user4: "-Guser4.icm "
+*CloseUI: *ICM
+
+*CloseGroup: Adjustment
+
+*OpenGroup: Miscellaneous/Miscellaneous
+
+*OpenUI *Nup/N-up Printing: PickOne
+*FoomaticRIPOption Nup: enum CmdLine A
+*OrderDependency: 200 AnySetup *Nup
+*DefaultNup: 1up
+*Nup 1up/1-up: "%% FoomaticRIPOptionSetting: Nup=1up"
+*FoomaticRIPOptionSetting Nup=1up: " "
+*Nup 2up/2-up: "%% FoomaticRIPOptionSetting: Nup=2up"
+*FoomaticRIPOptionSetting Nup=2up: "-2 "
+*Nup 3up/3-up: "%% FoomaticRIPOptionSetting: Nup=3up"
+*FoomaticRIPOptionSetting Nup=3up: "-3 "
+*Nup 4up/4-up: "%% FoomaticRIPOptionSetting: Nup=4up"
+*FoomaticRIPOptionSetting Nup=4up: "-4 "
+*Nup 6up/6-up: "%% FoomaticRIPOptionSetting: Nup=6up"
+*FoomaticRIPOptionSetting Nup=6up: "-6 "
+*Nup 8up/8-up: "%% FoomaticRIPOptionSetting: Nup=8up"
+*FoomaticRIPOptionSetting Nup=8up: "-8 "
+*Nup 10up/10-up: "%% FoomaticRIPOptionSetting: Nup=10up"
+*FoomaticRIPOptionSetting Nup=10up: "-10 "
+*Nup 12up/12-up: "%% FoomaticRIPOptionSetting: Nup=12up"
+*FoomaticRIPOptionSetting Nup=12up: "-12 "
+*Nup 14up/14-up: "%% FoomaticRIPOptionSetting: Nup=14up"
+*FoomaticRIPOptionSetting Nup=14up: "-14 "
+*Nup 15up/15-up: "%% FoomaticRIPOptionSetting: Nup=15up"
+*FoomaticRIPOptionSetting Nup=15up: "-15 "
+*Nup 16up/16-up: "%% FoomaticRIPOptionSetting: Nup=16up"
+*FoomaticRIPOptionSetting Nup=16up: "-16 "
+*Nup 18up/18-up: "%% FoomaticRIPOptionSetting: Nup=18up"
+*FoomaticRIPOptionSetting Nup=18up: "-18 "
+*CloseUI: *Nup
+
+*OpenUI *NupOrient/N-up Orientation: PickOne
+*FoomaticRIPOption NupOrient: enum CmdLine A
+*OrderDependency: 200 AnySetup *NupOrient
+*DefaultNupOrient: port
+*NupOrient land/Landscape: "%% FoomaticRIPOptionSetting: NupOrient=land"
+*FoomaticRIPOptionSetting NupOrient=land: "-ol "
+*NupOrient port/Portrait: "%% FoomaticRIPOptionSetting: NupOrient=port"
+*FoomaticRIPOptionSetting NupOrient=port: " "
+*NupOrient sea/Seascape: "%% FoomaticRIPOptionSetting: NupOrient=sea"
+*FoomaticRIPOptionSetting NupOrient=sea: "-os "
+*CloseUI: *NupOrient
+
+*CloseGroup: Miscellaneous
+
+
+*% Generic boilerplate PPD stuff as standard PostScript fonts and so on
+
+*DefaultFont: Courier
+*Font AvantGarde-Book: Standard "(001.006S)" Standard ROM
+*Font AvantGarde-BookOblique: Standard "(001.006S)" Standard ROM
+*Font AvantGarde-Demi: Standard "(001.007S)" Standard ROM
+*Font AvantGarde-DemiOblique: Standard "(001.007S)" Standard ROM
+*Font Bookman-Demi: Standard "(001.004S)" Standard ROM
+*Font Bookman-DemiItalic: Standard "(001.004S)" Standard ROM
+*Font Bookman-Light: Standard "(001.004S)" Standard ROM
+*Font Bookman-LightItalic: Standard "(001.004S)" Standard ROM
+*Font Courier: Standard "(002.004S)" Standard ROM
+*Font Courier-Bold: Standard "(002.004S)" Standard ROM
+*Font Courier-BoldOblique: Standard "(002.004S)" Standard ROM
+*Font Courier-Oblique: Standard "(002.004S)" Standard ROM
+*Font Helvetica: Standard "(001.006S)" Standard ROM
+*Font Helvetica-Bold: Standard "(001.007S)" Standard ROM
+*Font Helvetica-BoldOblique: Standard "(001.007S)" Standard ROM
+*Font Helvetica-Narrow: Standard "(001.006S)" Standard ROM
+*Font Helvetica-Narrow-Bold: Standard "(001.007S)" Standard ROM
+*Font Helvetica-Narrow-BoldOblique: Standard "(001.007S)" Standard ROM
+*Font Helvetica-Narrow-Oblique: Standard "(001.006S)" Standard ROM
+*Font Helvetica-Oblique: Standard "(001.006S)" Standard ROM
+*Font NewCenturySchlbk-Bold: Standard "(001.009S)" Standard ROM
+*Font NewCenturySchlbk-BoldItalic: Standard "(001.007S)" Standard ROM
+*Font NewCenturySchlbk-Italic: Standard "(001.006S)" Standard ROM
+*Font NewCenturySchlbk-Roman: Standard "(001.007S)" Standard ROM
+*Font Palatino-Bold: Standard "(001.005S)" Standard ROM
+*Font Palatino-BoldItalic: Standard "(001.005S)" Standard ROM
+*Font Palatino-Italic: Standard "(001.005S)" Standard ROM
+*Font Palatino-Roman: Standard "(001.005S)" Standard ROM
+*Font Symbol: Special "(001.007S)" Special ROM
+*Font Times-Bold: Standard "(001.007S)" Standard ROM
+*Font Times-BoldItalic: Standard "(001.009S)" Standard ROM
+*Font Times-Italic: Standard "(001.007S)" Standard ROM
+*Font Times-Roman: Standard "(001.007S)" Standard ROM
+*Font ZapfChancery-MediumItalic: Standard "(001.007S)" Standard ROM
+*Font ZapfDingbats: Special "(001.004S)" Standard ROM
+
diff --git a/PPD/Generic-ZjStream_Printer.ppd b/PPD/Generic-ZjStream_Printer.ppd
new file mode 100644
index 0000000..0760b50
--- /dev/null
+++ b/PPD/Generic-ZjStream_Printer.ppd
@@ -0,0 +1,472 @@
+*PPD-Adobe: "4.3"
+*%
+*% For information on using this, and to obtain the required backend
+*% script, consult http://www.linuxprinting.org/
+*%
+*% This file is published under the GNU General Public License
+*%
+*% PPD-O-MATIC (3.0.0 or newer) generated this PPD file. It is for use with
+*% all programs and environments which use PPD files for dealing with
+*% printer capability information. The printer must be configured with the
+*% "foomatic-rip" backend filter script of Foomatic 3.0.0 or newer. This
+*% file and "foomatic-rip" work together to support PPD-controlled printer
+*% driver option access with arbitrary free software printer drivers and
+*% printing spoolers.
+*%
+*% To save this file on your disk, wait until the download has completed
+*% (the animation of the browser logo must stop) and then use the
+*% "Save as..." command in the "File" menu of your browser or in the
+*% pop-up manu when you click on this document with the right mouse button.
+*% DO NOT cut and paste this file into an editor with your mouse. This can
+*% introduce additional line breaks which lead to unexpected results.
+*%
+*% You may save this file as 'Generic-ZjStream_Printer-foo2zjs.ppd'
+*%
+*%
+*FormatVersion: "4.3"
+*FileVersion: "1.1"
+*LanguageVersion: English
+*LanguageEncoding: ISOLatin1
+*PCFileName: "FOO2ZJS.PPD"
+*Manufacturer: "Generic"
+*Product: "(ZjStream Printer)"
+*cupsVersion: 1.0
+*cupsManualCopies: True
+*cupsModelNumber: 2
+*cupsFilter: "application/vnd.cups-postscript 0 foomatic-rip"
+*%pprRIP: foomatic-rip other
+*ModelName: "Generic ZjStream Printer"
+*ShortNickName: "Generic ZjStre. Printer foo2zjs"
+*NickName: "Generic ZjStream Printer Foomatic/foo2zjs (recommended)"
+*PSVersion: "(3010.000) 550"
+*PSVersion: "(3010.000) 651"
+*PSVersion: "(3010.000) 652"
+*PSVersion: "(3010.000) 653"
+*PSVersion: "(3010.000) 704"
+*PSVersion: "(3010.000) 705"
+*PSVersion: "(3010.000) 800"
+*LanguageLevel: "3"
+*ColorDevice: True
+*DefaultColorSpace: RGB
+*FileSystem: False
+*Throughput: "1"
+*LandscapeOrientation: Plus90
+*TTRasterizer: Type42
+
+
+
+
+*VariablePaperSize: False
+
+*FoomaticIDs: Generic-ZjStream_Printer foo2zjs
+*FoomaticRIPCommandLine: "foo2zjs-wrapper %A"
+
+*OpenGroup: General/General
+
+*OpenUI *PageSize/Page Size: PickOne
+*FoomaticRIPOption PageSize: enum CmdLine A
+*OrderDependency: 135 AnySetup *PageSize
+*DefaultPageSize: Letter
+*PageSize Letter/Letter: "%% FoomaticRIPOptionSetting: PageSize=Letter"
+*FoomaticRIPOptionSetting PageSize=Letter: "-p1 "
+*PageSize A4/A4: "%% FoomaticRIPOptionSetting: PageSize=A4"
+*FoomaticRIPOptionSetting PageSize=A4: "-p9 "
+*PageSize A5/A5: "%% FoomaticRIPOptionSetting: PageSize=A5"
+*FoomaticRIPOptionSetting PageSize=A5: "-p11 "
+*PageSize B5/B5: "%% FoomaticRIPOptionSetting: PageSize=B5"
+*FoomaticRIPOptionSetting PageSize=B5: "-p13 "
+*PageSize Env10/Env #10: "%% FoomaticRIPOptionSetting: PageSize=Env10"
+*FoomaticRIPOptionSetting PageSize=Env10: "-p20 "
+*PageSize EnvB5/Env B5: "%% FoomaticRIPOptionSetting: PageSize=EnvB5"
+*FoomaticRIPOptionSetting PageSize=EnvB5: "-p34 "
+*PageSize EnvC5/Env C5: "%% FoomaticRIPOptionSetting: PageSize=EnvC5"
+*FoomaticRIPOptionSetting PageSize=EnvC5: "-p28 "
+*PageSize EnvDL/Env DL: "%% FoomaticRIPOptionSetting: PageSize=EnvDL"
+*FoomaticRIPOptionSetting PageSize=EnvDL: "-p27 "
+*PageSize EnvMonarch/Env Monarch: "%% FoomaticRIPOptionSetting: PageSize=EnvMonarch"
+*FoomaticRIPOptionSetting PageSize=EnvMonarch: "-p37 "
+*PageSize Executive/Executive: "%% FoomaticRIPOptionSetting: PageSize=Executive"
+*FoomaticRIPOptionSetting PageSize=Executive: "-p7 "
+*PageSize Legal/Legal: "%% FoomaticRIPOptionSetting: PageSize=Legal"
+*FoomaticRIPOptionSetting PageSize=Legal: "-p5 "
+*CloseUI: *PageSize
+
+*OpenUI *PageRegion: PickOne
+*OrderDependency: 135 AnySetup *PageRegion
+*DefaultPageRegion: Letter
+*PageRegion Letter/Letter: "%% FoomaticRIPOptionSetting: PageSize=Letter"
+*PageRegion A4/A4: "%% FoomaticRIPOptionSetting: PageSize=A4"
+*PageRegion A5/A5: "%% FoomaticRIPOptionSetting: PageSize=A5"
+*PageRegion B5/B5: "%% FoomaticRIPOptionSetting: PageSize=B5"
+*PageRegion Env10/Env #10: "%% FoomaticRIPOptionSetting: PageSize=Env10"
+*PageRegion EnvB5/Env B5: "%% FoomaticRIPOptionSetting: PageSize=EnvB5"
+*PageRegion EnvC5/Env C5: "%% FoomaticRIPOptionSetting: PageSize=EnvC5"
+*PageRegion EnvDL/Env DL: "%% FoomaticRIPOptionSetting: PageSize=EnvDL"
+*PageRegion EnvMonarch/Env Monarch: "%% FoomaticRIPOptionSetting: PageSize=EnvMonarch"
+*PageRegion Executive/Executive: "%% FoomaticRIPOptionSetting: PageSize=Executive"
+*PageRegion Legal/Legal: "%% FoomaticRIPOptionSetting: PageSize=Legal"
+*CloseUI: *PageRegion
+
+*DefaultImageableArea: Letter
+*ImageableArea Letter/Letter: "0 0 612 792"
+*ImageableArea A4/A4: "0 0 595 842"
+*ImageableArea A5/A5: "0 0 420 595"
+*ImageableArea B5/B5: "0 0 498 708"
+*ImageableArea Env10/Env #10: "0 0 297 684"
+*ImageableArea EnvB5/Env B5: "0 0 498 708"
+*ImageableArea EnvC5/Env C5: "0 0 459 649"
+*ImageableArea EnvDL/Env DL: "0 0 311 623"
+*ImageableArea EnvMonarch/Env Monarch: "0 0 279 540"
+*ImageableArea Executive/Executive: "0 0 522 756"
+*ImageableArea Legal/Legal: "0 0 612 1008"
+
+*DefaultPaperDimension: Letter
+*PaperDimension Letter/Letter: "612 792"
+*PaperDimension A4/A4: "595 842"
+*PaperDimension A5/A5: "420 595"
+*PaperDimension B5/B5: "498 708"
+*PaperDimension Env10/Env #10: "297 684"
+*PaperDimension EnvB5/Env B5: "498 708"
+*PaperDimension EnvC5/Env C5: "459 649"
+*PaperDimension EnvDL/Env DL: "311 623"
+*PaperDimension EnvMonarch/Env Monarch: "279 540"
+*PaperDimension Executive/Executive: "522 756"
+*PaperDimension Legal/Legal: "612 1008"
+
+*OpenUI *InputSlot/Media Source: PickOne
+*FoomaticRIPOption InputSlot: enum CmdLine A
+*OrderDependency: 150 AnySetup *InputSlot
+*DefaultInputSlot: Auto
+*InputSlot Upper/Upper or Only One InputSlot: "%% FoomaticRIPOptionSetting: InputSlot=Upper"
+*FoomaticRIPOptionSetting InputSlot=Upper: "-s1 "
+*InputSlot Middle/Middle Tray: "%% FoomaticRIPOptionSetting: InputSlot=Middle"
+*FoomaticRIPOptionSetting InputSlot=Middle: "-s3 "
+*InputSlot Lower/Lower Tray: "%% FoomaticRIPOptionSetting: InputSlot=Lower"
+*FoomaticRIPOptionSetting InputSlot=Lower: "-s2 "
+*InputSlot Auto/Auto Source: "%% FoomaticRIPOptionSetting: InputSlot=Auto"
+*FoomaticRIPOptionSetting InputSlot=Auto: "-s7 "
+*InputSlot Envelope/Envelope: "%% FoomaticRIPOptionSetting: InputSlot=Envelope"
+*FoomaticRIPOptionSetting InputSlot=Envelope: "-s5 "
+*InputSlot Manual/Manual Feed: "%% FoomaticRIPOptionSetting: InputSlot=Manual"
+*FoomaticRIPOptionSetting InputSlot=Manual: "-s4 "
+*CloseUI: *InputSlot
+
+*OpenUI *MediaType/Media Type: PickOne
+*FoomaticRIPOption MediaType: enum CmdLine A
+*OrderDependency: 150 AnySetup *MediaType
+*DefaultMediaType: Standard
+*MediaType Envelope/Envelope: "%% FoomaticRIPOptionSetting: MediaType=Envelope"
+*FoomaticRIPOptionSetting MediaType=Envelope: "-m257 "
+*MediaType Labels/Labels: "%% FoomaticRIPOptionSetting: MediaType=Labels"
+*FoomaticRIPOptionSetting MediaType=Labels: "-m263 "
+*MediaType Letterhead/Letterhead: "%% FoomaticRIPOptionSetting: MediaType=Letterhead"
+*FoomaticRIPOptionSetting MediaType=Letterhead: "-m259 "
+*MediaType Postcard/Postcard: "%% FoomaticRIPOptionSetting: MediaType=Postcard"
+*FoomaticRIPOptionSetting MediaType=Postcard: "-m262 "
+*MediaType Standard/Standard Paper: "%% FoomaticRIPOptionSetting: MediaType=Standard"
+*FoomaticRIPOptionSetting MediaType=Standard: "-m1 "
+*MediaType ThickStock/Thick Stock: "%% FoomaticRIPOptionSetting: MediaType=ThickStock"
+*FoomaticRIPOptionSetting MediaType=ThickStock: "-m261 "
+*MediaType Transparency/Transparency: "%% FoomaticRIPOptionSetting: MediaType=Transparency"
+*FoomaticRIPOptionSetting MediaType=Transparency: "-m2 "
+*CloseUI: *MediaType
+
+*OpenUI *Duplex/Duplex Printing: PickOne
+*FoomaticRIPOption Duplex: enum CmdLine A
+*OrderDependency: 210 AnySetup *Duplex
+*DefaultDuplex: None
+*Duplex DuplexNoTumble/Long Edge (Standard): "%% FoomaticRIPOptionSetting: Duplex=DuplexNoTumble"
+*FoomaticRIPOptionSetting Duplex=DuplexNoTumble: "-d2 "
+*Duplex DuplexTumble/Short Edge (Flip): "%% FoomaticRIPOptionSetting: Duplex=DuplexTumble"
+*FoomaticRIPOptionSetting Duplex=DuplexTumble: "-d3 "
+*Duplex ManualDuplexNoTumble/Manual Long Edge (Standard): "%% FoomaticRIPOptionSetting: Duplex=ManualDuplexNoTumble"
+*FoomaticRIPOptionSetting Duplex=ManualDuplexNoTumble: "-d4 "
+*Duplex ManualDuplexTumble/Manual Short Edge (Flip): "%% FoomaticRIPOptionSetting: Duplex=ManualDuplexTumble"
+*FoomaticRIPOptionSetting Duplex=ManualDuplexTumble: "-d5 "
+*Duplex None/Off: "%% FoomaticRIPOptionSetting: Duplex=None"
+*FoomaticRIPOptionSetting Duplex=None: "-d1 "
+*CloseUI: *Duplex
+
+*OpenUI *Resolution/Resolution: PickOne
+*FoomaticRIPOption Resolution: enum CmdLine A
+*OrderDependency: 130 AnySetup *Resolution
+*DefaultResolution: 1200x600dpi
+*Resolution 600x600dpi/600x600 dpi: "%% FoomaticRIPOptionSetting: Resolution=600x600dpi"
+*FoomaticRIPOptionSetting Resolution=600x600dpi: "-r600x600 "
+*Resolution 1200x600dpi/1200x600 dpi: "%% FoomaticRIPOptionSetting: Resolution=1200x600dpi"
+*FoomaticRIPOptionSetting Resolution=1200x600dpi: "-r1200x600 "
+*Resolution 2400x600dpi/2400x600 dpi: "%% FoomaticRIPOptionSetting: Resolution=2400x600dpi"
+*FoomaticRIPOptionSetting Resolution=2400x600dpi: "-r2400x600 "
+*CloseUI: *Resolution
+
+*OpenUI *Quality/Printing Quality: PickOne
+*FoomaticRIPOption Quality: enum CmdLine A
+*OrderDependency: 110 AnySetup *Quality
+*DefaultQuality: normal
+*Quality draft/Draft: "%% FoomaticRIPOptionSetting: Quality=draft"
+*FoomaticRIPOptionSetting Quality=draft: " -t "
+*Quality normal/Normal: "%% FoomaticRIPOptionSetting: Quality=normal"
+*FoomaticRIPOptionSetting Quality=normal: " "
+*CloseUI: *Quality
+
+*OpenUI *ColorMode/Color Mode: PickOne
+*FoomaticRIPOption ColorMode: enum CmdLine A
+*OrderDependency: 120 AnySetup *ColorMode
+*DefaultColorMode: Monochrome
+*ColorMode PhotoOnly/Color - Photo Only: "%% FoomaticRIPOptionSetting: ColorMode=PhotoOnly"
+*FoomaticRIPOptionSetting ColorMode=PhotoOnly: "-c -C1 "
+*ColorMode PhotosAndText/Color - Photos and Text: "%% FoomaticRIPOptionSetting: ColorMode=PhotosAndText"
+*FoomaticRIPOptionSetting ColorMode=PhotosAndText: "-c -C2 "
+*ColorMode Color/Color: "%% FoomaticRIPOptionSetting: ColorMode=Color"
+*FoomaticRIPOptionSetting ColorMode=Color: "-c "
+*ColorMode GraphicsAndText/Color - Graphics and Text: "%% FoomaticRIPOptionSetting: ColorMode=GraphicsAndText"
+*FoomaticRIPOptionSetting ColorMode=GraphicsAndText: "-c -C3 "
+*ColorMode ICM/Color - use ICM color profile: "%% FoomaticRIPOptionSetting: ColorMode=ICM"
+*FoomaticRIPOptionSetting ColorMode=ICM: "-c -C10 "
+*ColorMode Monochrome/Monochrome: "%% FoomaticRIPOptionSetting: ColorMode=Monochrome"
+*FoomaticRIPOptionSetting ColorMode=Monochrome: " "
+*CloseUI: *ColorMode
+
+*OpenUI *Copies/Copies: PickOne
+*FoomaticRIPOption Copies: int CmdLine A
+*FoomaticRIPOptionPrototype Copies: "-n%s "
+*FoomaticRIPOptionRange Copies: 1 100
+*OrderDependency: 220 AnySetup *Copies
+*DefaultCopies: 1
+*FoomaticRIPDefaultCopies: 1
+*Copies 1/1: "%% FoomaticRIPOptionSetting: Copies=1"
+*Copies 2/2: "%% FoomaticRIPOptionSetting: Copies=2"
+*Copies 3/3: "%% FoomaticRIPOptionSetting: Copies=3"
+*Copies 4/4: "%% FoomaticRIPOptionSetting: Copies=4"
+*Copies 5/5: "%% FoomaticRIPOptionSetting: Copies=5"
+*Copies 6/6: "%% FoomaticRIPOptionSetting: Copies=6"
+*Copies 7/7: "%% FoomaticRIPOptionSetting: Copies=7"
+*Copies 8/8: "%% FoomaticRIPOptionSetting: Copies=8"
+*Copies 9/9: "%% FoomaticRIPOptionSetting: Copies=9"
+*Copies 10/10: "%% FoomaticRIPOptionSetting: Copies=10"
+*Copies 11/11: "%% FoomaticRIPOptionSetting: Copies=11"
+*Copies 12/12: "%% FoomaticRIPOptionSetting: Copies=12"
+*Copies 13/13: "%% FoomaticRIPOptionSetting: Copies=13"
+*Copies 14/14: "%% FoomaticRIPOptionSetting: Copies=14"
+*Copies 15/15: "%% FoomaticRIPOptionSetting: Copies=15"
+*Copies 16/16: "%% FoomaticRIPOptionSetting: Copies=16"
+*Copies 17/17: "%% FoomaticRIPOptionSetting: Copies=17"
+*Copies 18/18: "%% FoomaticRIPOptionSetting: Copies=18"
+*Copies 19/19: "%% FoomaticRIPOptionSetting: Copies=19"
+*Copies 20/20: "%% FoomaticRIPOptionSetting: Copies=20"
+*Copies 21/21: "%% FoomaticRIPOptionSetting: Copies=21"
+*Copies 22/22: "%% FoomaticRIPOptionSetting: Copies=22"
+*Copies 23/23: "%% FoomaticRIPOptionSetting: Copies=23"
+*Copies 24/24: "%% FoomaticRIPOptionSetting: Copies=24"
+*Copies 25/25: "%% FoomaticRIPOptionSetting: Copies=25"
+*Copies 26/26: "%% FoomaticRIPOptionSetting: Copies=26"
+*Copies 27/27: "%% FoomaticRIPOptionSetting: Copies=27"
+*Copies 28/28: "%% FoomaticRIPOptionSetting: Copies=28"
+*Copies 29/29: "%% FoomaticRIPOptionSetting: Copies=29"
+*Copies 30/30: "%% FoomaticRIPOptionSetting: Copies=30"
+*Copies 31/31: "%% FoomaticRIPOptionSetting: Copies=31"
+*Copies 32/32: "%% FoomaticRIPOptionSetting: Copies=32"
+*Copies 33/33: "%% FoomaticRIPOptionSetting: Copies=33"
+*Copies 34/34: "%% FoomaticRIPOptionSetting: Copies=34"
+*Copies 35/35: "%% FoomaticRIPOptionSetting: Copies=35"
+*Copies 36/36: "%% FoomaticRIPOptionSetting: Copies=36"
+*Copies 37/37: "%% FoomaticRIPOptionSetting: Copies=37"
+*Copies 38/38: "%% FoomaticRIPOptionSetting: Copies=38"
+*Copies 39/39: "%% FoomaticRIPOptionSetting: Copies=39"
+*Copies 40/40: "%% FoomaticRIPOptionSetting: Copies=40"
+*Copies 41/41: "%% FoomaticRIPOptionSetting: Copies=41"
+*Copies 42/42: "%% FoomaticRIPOptionSetting: Copies=42"
+*Copies 43/43: "%% FoomaticRIPOptionSetting: Copies=43"
+*Copies 44/44: "%% FoomaticRIPOptionSetting: Copies=44"
+*Copies 45/45: "%% FoomaticRIPOptionSetting: Copies=45"
+*Copies 46/46: "%% FoomaticRIPOptionSetting: Copies=46"
+*Copies 47/47: "%% FoomaticRIPOptionSetting: Copies=47"
+*Copies 48/48: "%% FoomaticRIPOptionSetting: Copies=48"
+*Copies 49/49: "%% FoomaticRIPOptionSetting: Copies=49"
+*Copies 50/50: "%% FoomaticRIPOptionSetting: Copies=50"
+*Copies 51/51: "%% FoomaticRIPOptionSetting: Copies=51"
+*Copies 52/52: "%% FoomaticRIPOptionSetting: Copies=52"
+*Copies 53/53: "%% FoomaticRIPOptionSetting: Copies=53"
+*Copies 54/54: "%% FoomaticRIPOptionSetting: Copies=54"
+*Copies 55/55: "%% FoomaticRIPOptionSetting: Copies=55"
+*Copies 56/56: "%% FoomaticRIPOptionSetting: Copies=56"
+*Copies 57/57: "%% FoomaticRIPOptionSetting: Copies=57"
+*Copies 58/58: "%% FoomaticRIPOptionSetting: Copies=58"
+*Copies 59/59: "%% FoomaticRIPOptionSetting: Copies=59"
+*Copies 60/60: "%% FoomaticRIPOptionSetting: Copies=60"
+*Copies 61/61: "%% FoomaticRIPOptionSetting: Copies=61"
+*Copies 62/62: "%% FoomaticRIPOptionSetting: Copies=62"
+*Copies 63/63: "%% FoomaticRIPOptionSetting: Copies=63"
+*Copies 64/64: "%% FoomaticRIPOptionSetting: Copies=64"
+*Copies 65/65: "%% FoomaticRIPOptionSetting: Copies=65"
+*Copies 66/66: "%% FoomaticRIPOptionSetting: Copies=66"
+*Copies 67/67: "%% FoomaticRIPOptionSetting: Copies=67"
+*Copies 68/68: "%% FoomaticRIPOptionSetting: Copies=68"
+*Copies 69/69: "%% FoomaticRIPOptionSetting: Copies=69"
+*Copies 70/70: "%% FoomaticRIPOptionSetting: Copies=70"
+*Copies 71/71: "%% FoomaticRIPOptionSetting: Copies=71"
+*Copies 72/72: "%% FoomaticRIPOptionSetting: Copies=72"
+*Copies 73/73: "%% FoomaticRIPOptionSetting: Copies=73"
+*Copies 74/74: "%% FoomaticRIPOptionSetting: Copies=74"
+*Copies 75/75: "%% FoomaticRIPOptionSetting: Copies=75"
+*Copies 76/76: "%% FoomaticRIPOptionSetting: Copies=76"
+*Copies 77/77: "%% FoomaticRIPOptionSetting: Copies=77"
+*Copies 78/78: "%% FoomaticRIPOptionSetting: Copies=78"
+*Copies 79/79: "%% FoomaticRIPOptionSetting: Copies=79"
+*Copies 80/80: "%% FoomaticRIPOptionSetting: Copies=80"
+*Copies 81/81: "%% FoomaticRIPOptionSetting: Copies=81"
+*Copies 82/82: "%% FoomaticRIPOptionSetting: Copies=82"
+*Copies 83/83: "%% FoomaticRIPOptionSetting: Copies=83"
+*Copies 84/84: "%% FoomaticRIPOptionSetting: Copies=84"
+*Copies 85/85: "%% FoomaticRIPOptionSetting: Copies=85"
+*Copies 86/86: "%% FoomaticRIPOptionSetting: Copies=86"
+*Copies 87/87: "%% FoomaticRIPOptionSetting: Copies=87"
+*Copies 88/88: "%% FoomaticRIPOptionSetting: Copies=88"
+*Copies 89/89: "%% FoomaticRIPOptionSetting: Copies=89"
+*Copies 90/90: "%% FoomaticRIPOptionSetting: Copies=90"
+*Copies 91/91: "%% FoomaticRIPOptionSetting: Copies=91"
+*Copies 92/92: "%% FoomaticRIPOptionSetting: Copies=92"
+*Copies 93/93: "%% FoomaticRIPOptionSetting: Copies=93"
+*Copies 94/94: "%% FoomaticRIPOptionSetting: Copies=94"
+*Copies 95/95: "%% FoomaticRIPOptionSetting: Copies=95"
+*Copies 96/96: "%% FoomaticRIPOptionSetting: Copies=96"
+*Copies 97/97: "%% FoomaticRIPOptionSetting: Copies=97"
+*Copies 98/98: "%% FoomaticRIPOptionSetting: Copies=98"
+*Copies 99/99: "%% FoomaticRIPOptionSetting: Copies=99"
+*Copies 100/100: "%% FoomaticRIPOptionSetting: Copies=100"
+*CloseUI: *Copies
+
+*OpenUI *PrinterType/Printer Type: PickOne
+*FoomaticRIPOption PrinterType: enum CmdLine A
+*OrderDependency: 110 AnySetup *PrinterType
+*DefaultPrinterType: Color
+*PrinterType BW/Black-and-white printer: "%% FoomaticRIPOptionSetting: PrinterType=BW"
+*FoomaticRIPOptionSetting PrinterType=BW: "-P "
+*PrinterType Color/Color printer: "%% FoomaticRIPOptionSetting: PrinterType=Color"
+*FoomaticRIPOptionSetting PrinterType=Color: " "
+*CloseUI: *PrinterType
+
+*CloseGroup: General
+
+*OpenGroup: Adjustment/Adjustment
+
+*OpenUI *ICM/ICM Color Profile: PickOne
+*FoomaticRIPOption ICM: enum CmdLine A
+*OrderDependency: 300 AnySetup *ICM
+*DefaultICM: none
+*ICM none/No ICM color correction: "%% FoomaticRIPOptionSetting: ICM=none"
+*FoomaticRIPOptionSetting ICM=none: " "
+*ICM testing/File testing.icm: "%% FoomaticRIPOptionSetting: ICM=testing"
+*FoomaticRIPOptionSetting ICM=testing: "-Gtesting.icm "
+*ICM user1/File user1.icm: "%% FoomaticRIPOptionSetting: ICM=user1"
+*FoomaticRIPOptionSetting ICM=user1: "-Guser1.icm "
+*ICM user2/File user2.icm: "%% FoomaticRIPOptionSetting: ICM=user2"
+*FoomaticRIPOptionSetting ICM=user2: "-Guser2.icm "
+*ICM user3/File user3.icm: "%% FoomaticRIPOptionSetting: ICM=user3"
+*FoomaticRIPOptionSetting ICM=user3: "-Guser3.icm "
+*ICM user4/File user4.icm: "%% FoomaticRIPOptionSetting: ICM=user4"
+*FoomaticRIPOptionSetting ICM=user4: "-Guser4.icm "
+*CloseUI: *ICM
+
+*OpenUI *Intent/ICM Color Profile Intent: PickOne
+*FoomaticRIPOption Intent: enum CmdLine A
+*OrderDependency: 310 AnySetup *Intent
+*DefaultIntent: Perceptual
+*Intent Absolute/Absolute Intent: "%% FoomaticRIPOptionSetting: Intent=Absolute"
+*FoomaticRIPOptionSetting Intent=Absolute: "-I3 "
+*Intent Colorimetric/Colorimetric Intent: "%% FoomaticRIPOptionSetting: Intent=Colorimetric"
+*FoomaticRIPOptionSetting Intent=Colorimetric: "-I1 "
+*Intent Perceptual/Perceptual Intent: "%% FoomaticRIPOptionSetting: Intent=Perceptual"
+*FoomaticRIPOptionSetting Intent=Perceptual: "-I0 "
+*Intent Saturation/Saturation Intent: "%% FoomaticRIPOptionSetting: Intent=Saturation"
+*FoomaticRIPOptionSetting Intent=Saturation: "-I2 "
+*CloseUI: *Intent
+
+*CloseGroup: Adjustment
+
+*OpenGroup: Miscellaneous/Miscellaneous
+
+*OpenUI *Nup/N-up Printing: PickOne
+*FoomaticRIPOption Nup: enum CmdLine A
+*OrderDependency: 200 AnySetup *Nup
+*DefaultNup: 1up
+*Nup 1up/1-up: "%% FoomaticRIPOptionSetting: Nup=1up"
+*FoomaticRIPOptionSetting Nup=1up: " "
+*Nup 2up/2-up: "%% FoomaticRIPOptionSetting: Nup=2up"
+*FoomaticRIPOptionSetting Nup=2up: "-2 "
+*Nup 3up/3-up: "%% FoomaticRIPOptionSetting: Nup=3up"
+*FoomaticRIPOptionSetting Nup=3up: "-3 "
+*Nup 4up/4-up: "%% FoomaticRIPOptionSetting: Nup=4up"
+*FoomaticRIPOptionSetting Nup=4up: "-4 "
+*Nup 6up/6-up: "%% FoomaticRIPOptionSetting: Nup=6up"
+*FoomaticRIPOptionSetting Nup=6up: "-6 "
+*Nup 8up/8-up: "%% FoomaticRIPOptionSetting: Nup=8up"
+*FoomaticRIPOptionSetting Nup=8up: "-8 "
+*Nup 10up/10-up: "%% FoomaticRIPOptionSetting: Nup=10up"
+*FoomaticRIPOptionSetting Nup=10up: "-10 "
+*Nup 12up/12-up: "%% FoomaticRIPOptionSetting: Nup=12up"
+*FoomaticRIPOptionSetting Nup=12up: "-12 "
+*Nup 14up/14-up: "%% FoomaticRIPOptionSetting: Nup=14up"
+*FoomaticRIPOptionSetting Nup=14up: "-14 "
+*Nup 15up/15-up: "%% FoomaticRIPOptionSetting: Nup=15up"
+*FoomaticRIPOptionSetting Nup=15up: "-15 "
+*Nup 16up/16-up: "%% FoomaticRIPOptionSetting: Nup=16up"
+*FoomaticRIPOptionSetting Nup=16up: "-16 "
+*Nup 18up/18-up: "%% FoomaticRIPOptionSetting: Nup=18up"
+*FoomaticRIPOptionSetting Nup=18up: "-18 "
+*CloseUI: *Nup
+
+*OpenUI *NupOrient/N-up Orientation: PickOne
+*FoomaticRIPOption NupOrient: enum CmdLine A
+*OrderDependency: 200 AnySetup *NupOrient
+*DefaultNupOrient: port
+*NupOrient land/Landscape: "%% FoomaticRIPOptionSetting: NupOrient=land"
+*FoomaticRIPOptionSetting NupOrient=land: "-ol "
+*NupOrient port/Portrait: "%% FoomaticRIPOptionSetting: NupOrient=port"
+*FoomaticRIPOptionSetting NupOrient=port: " "
+*NupOrient sea/Seascape: "%% FoomaticRIPOptionSetting: NupOrient=sea"
+*FoomaticRIPOptionSetting NupOrient=sea: "-os "
+*CloseUI: *NupOrient
+
+*CloseGroup: Miscellaneous
+
+
+*% Generic boilerplate PPD stuff as standard PostScript fonts and so on
+
+*DefaultFont: Courier
+*Font AvantGarde-Book: Standard "(001.006S)" Standard ROM
+*Font AvantGarde-BookOblique: Standard "(001.006S)" Standard ROM
+*Font AvantGarde-Demi: Standard "(001.007S)" Standard ROM
+*Font AvantGarde-DemiOblique: Standard "(001.007S)" Standard ROM
+*Font Bookman-Demi: Standard "(001.004S)" Standard ROM
+*Font Bookman-DemiItalic: Standard "(001.004S)" Standard ROM
+*Font Bookman-Light: Standard "(001.004S)" Standard ROM
+*Font Bookman-LightItalic: Standard "(001.004S)" Standard ROM
+*Font Courier: Standard "(002.004S)" Standard ROM
+*Font Courier-Bold: Standard "(002.004S)" Standard ROM
+*Font Courier-BoldOblique: Standard "(002.004S)" Standard ROM
+*Font Courier-Oblique: Standard "(002.004S)" Standard ROM
+*Font Helvetica: Standard "(001.006S)" Standard ROM
+*Font Helvetica-Bold: Standard "(001.007S)" Standard ROM
+*Font Helvetica-BoldOblique: Standard "(001.007S)" Standard ROM
+*Font Helvetica-Narrow: Standard "(001.006S)" Standard ROM
+*Font Helvetica-Narrow-Bold: Standard "(001.007S)" Standard ROM
+*Font Helvetica-Narrow-BoldOblique: Standard "(001.007S)" Standard ROM
+*Font Helvetica-Narrow-Oblique: Standard "(001.006S)" Standard ROM
+*Font Helvetica-Oblique: Standard "(001.006S)" Standard ROM
+*Font NewCenturySchlbk-Bold: Standard "(001.009S)" Standard ROM
+*Font NewCenturySchlbk-BoldItalic: Standard "(001.007S)" Standard ROM
+*Font NewCenturySchlbk-Italic: Standard "(001.006S)" Standard ROM
+*Font NewCenturySchlbk-Roman: Standard "(001.007S)" Standard ROM
+*Font Palatino-Bold: Standard "(001.005S)" Standard ROM
+*Font Palatino-BoldItalic: Standard "(001.005S)" Standard ROM
+*Font Palatino-Italic: Standard "(001.005S)" Standard ROM
+*Font Palatino-Roman: Standard "(001.005S)" Standard ROM
+*Font Symbol: Special "(001.007S)" Special ROM
+*Font Times-Bold: Standard "(001.007S)" Standard ROM
+*Font Times-BoldItalic: Standard "(001.009S)" Standard ROM
+*Font Times-Italic: Standard "(001.007S)" Standard ROM
+*Font Times-Roman: Standard "(001.007S)" Standard ROM
+*Font ZapfChancery-MediumItalic: Standard "(001.007S)" Standard ROM
+*Font ZapfDingbats: Special "(001.004S)" Standard ROM
+
diff --git a/PPD/HP-Color_LaserJet_1500.ppd b/PPD/HP-Color_LaserJet_1500.ppd
new file mode 100644
index 0000000..3c6c9a1
--- /dev/null
+++ b/PPD/HP-Color_LaserJet_1500.ppd
@@ -0,0 +1,422 @@
+*PPD-Adobe: "4.3"
+*%
+*% For information on using this, and to obtain the required backend
+*% script, consult http://www.linuxprinting.org/
+*%
+*% This file is published under the GNU General Public License
+*%
+*% PPD-O-MATIC (3.0.0 or newer) generated this PPD file. It is for use with
+*% all programs and environments which use PPD files for dealing with
+*% printer capability information. The printer must be configured with the
+*% "foomatic-rip" backend filter script of Foomatic 3.0.0 or newer. This
+*% file and "foomatic-rip" work together to support PPD-controlled printer
+*% driver option access with arbitrary free software printer drivers and
+*% printing spoolers.
+*%
+*% To save this file on your disk, wait until the download has completed
+*% (the animation of the browser logo must stop) and then use the
+*% "Save as..." command in the "File" menu of your browser or in the
+*% pop-up manu when you click on this document with the right mouse button.
+*% DO NOT cut and paste this file into an editor with your mouse. This can
+*% introduce additional line breaks which lead to unexpected results.
+*%
+*% You may save this file as 'HP-Color_LaserJet_1500-foo2oak.ppd'
+*%
+*%
+*FormatVersion: "4.3"
+*FileVersion: "1.1"
+*LanguageVersion: English
+*LanguageEncoding: ISOLatin1
+*PCFileName: "FOO2OAK.PPD"
+*Manufacturer: "HP"
+*Product: "(hp color LaserJet 1500)"
+*cupsVersion: 1.0
+*cupsManualCopies: True
+*cupsModelNumber: 2
+*cupsFilter: "application/vnd.cups-postscript 0 foomatic-rip"
+*%pprRIP: foomatic-rip other
+*ModelName: "HP Color LaserJet 1500"
+*ShortNickName: "HP Color LaserJet 1500 foo2oak"
+*NickName: "HP Color LaserJet 1500 Foomatic/foo2oak (recommended)"
+*PSVersion: "(3010.000) 550"
+*PSVersion: "(3010.000) 651"
+*PSVersion: "(3010.000) 652"
+*PSVersion: "(3010.000) 653"
+*PSVersion: "(3010.000) 704"
+*PSVersion: "(3010.000) 705"
+*PSVersion: "(3010.000) 800"
+*LanguageLevel: "3"
+*ColorDevice: True
+*DefaultColorSpace: RGB
+*FileSystem: False
+*Throughput: "1"
+*LandscapeOrientation: Plus90
+*TTRasterizer: Type42
+*1284DeviceID: "MFG:Hewlett-Packard;MDL:hp color LaserJet 1500;CMD:OAKRAS;"
+
+
+
+*VariablePaperSize: False
+
+*FoomaticIDs: HP-Color_LaserJet_1500 foo2oak
+*FoomaticRIPCommandLine: "foo2oak-wrapper %A"
+
+*OpenGroup: General/General
+
+*OpenUI *PageSize/Page Size: PickOne
+*FoomaticRIPOption PageSize: enum CmdLine A
+*OrderDependency: 135 AnySetup *PageSize
+*DefaultPageSize: Letter
+*PageSize Letter/Letter: "%% FoomaticRIPOptionSetting: PageSize=Letter"
+*FoomaticRIPOptionSetting PageSize=Letter: "-p1 "
+*PageSize A4/A4: "%% FoomaticRIPOptionSetting: PageSize=A4"
+*FoomaticRIPOptionSetting PageSize=A4: "-p9 "
+*PageSize A5/A5: "%% FoomaticRIPOptionSetting: PageSize=A5"
+*FoomaticRIPOptionSetting PageSize=A5: "-p11 "
+*PageSize B5/B5: "%% FoomaticRIPOptionSetting: PageSize=B5"
+*FoomaticRIPOptionSetting PageSize=B5: "-p13 "
+*PageSize Env10/Env #10: "%% FoomaticRIPOptionSetting: PageSize=Env10"
+*FoomaticRIPOptionSetting PageSize=Env10: "-p20 "
+*PageSize EnvB5/Env B5: "%% FoomaticRIPOptionSetting: PageSize=EnvB5"
+*FoomaticRIPOptionSetting PageSize=EnvB5: "-p34 "
+*PageSize EnvC5/Env C5: "%% FoomaticRIPOptionSetting: PageSize=EnvC5"
+*FoomaticRIPOptionSetting PageSize=EnvC5: "-p28 "
+*PageSize EnvDL/Env DL: "%% FoomaticRIPOptionSetting: PageSize=EnvDL"
+*FoomaticRIPOptionSetting PageSize=EnvDL: "-p27 "
+*PageSize EnvMonarch/Env Monarch: "%% FoomaticRIPOptionSetting: PageSize=EnvMonarch"
+*FoomaticRIPOptionSetting PageSize=EnvMonarch: "-p37 "
+*PageSize Executive/Executive: "%% FoomaticRIPOptionSetting: PageSize=Executive"
+*FoomaticRIPOptionSetting PageSize=Executive: "-p7 "
+*PageSize Legal/Legal: "%% FoomaticRIPOptionSetting: PageSize=Legal"
+*FoomaticRIPOptionSetting PageSize=Legal: "-p5 "
+*CloseUI: *PageSize
+
+*OpenUI *PageRegion: PickOne
+*OrderDependency: 135 AnySetup *PageRegion
+*DefaultPageRegion: Letter
+*PageRegion Letter/Letter: "%% FoomaticRIPOptionSetting: PageSize=Letter"
+*PageRegion A4/A4: "%% FoomaticRIPOptionSetting: PageSize=A4"
+*PageRegion A5/A5: "%% FoomaticRIPOptionSetting: PageSize=A5"
+*PageRegion B5/B5: "%% FoomaticRIPOptionSetting: PageSize=B5"
+*PageRegion Env10/Env #10: "%% FoomaticRIPOptionSetting: PageSize=Env10"
+*PageRegion EnvB5/Env B5: "%% FoomaticRIPOptionSetting: PageSize=EnvB5"
+*PageRegion EnvC5/Env C5: "%% FoomaticRIPOptionSetting: PageSize=EnvC5"
+*PageRegion EnvDL/Env DL: "%% FoomaticRIPOptionSetting: PageSize=EnvDL"
+*PageRegion EnvMonarch/Env Monarch: "%% FoomaticRIPOptionSetting: PageSize=EnvMonarch"
+*PageRegion Executive/Executive: "%% FoomaticRIPOptionSetting: PageSize=Executive"
+*PageRegion Legal/Legal: "%% FoomaticRIPOptionSetting: PageSize=Legal"
+*CloseUI: *PageRegion
+
+*DefaultImageableArea: Letter
+*ImageableArea Letter/Letter: "12.00 12.00 600.00 780.00"
+*ImageableArea A4/A4: "12.00 12.00 583.00 830.00"
+*ImageableArea A5/A5: "12.00 12.00 408.00 583.00"
+*ImageableArea B5/B5: "12.00 12.00 486.00 696.00"
+*ImageableArea Env10/Env #10: "12.00 12.00 285.00 672.00"
+*ImageableArea EnvB5/Env B5: "12.00 12.00 486.00 696.00"
+*ImageableArea EnvC5/Env C5: "12.00 12.00 447.00 637.00"
+*ImageableArea EnvDL/Env DL: "12.00 12.00 299.00 611.00"
+*ImageableArea EnvMonarch/Env Monarch: "12.00 12.00 267.00 528.00"
+*ImageableArea Executive/Executive: "12.00 12.00 510.00 744.00"
+*ImageableArea Legal/Legal: "12.00 12.00 600.00 996.00"
+
+*DefaultPaperDimension: Letter
+*PaperDimension Letter/Letter: "612 792"
+*PaperDimension A4/A4: "595 842"
+*PaperDimension A5/A5: "420 595"
+*PaperDimension B5/B5: "498 708"
+*PaperDimension Env10/Env #10: "297 684"
+*PaperDimension EnvB5/Env B5: "498 708"
+*PaperDimension EnvC5/Env C5: "459 649"
+*PaperDimension EnvDL/Env DL: "311 623"
+*PaperDimension EnvMonarch/Env Monarch: "279 540"
+*PaperDimension Executive/Executive: "522 756"
+*PaperDimension Legal/Legal: "612 1008"
+
+*OpenUI *InputSlot/Media Source: PickOne
+*FoomaticRIPOption InputSlot: enum CmdLine A
+*OrderDependency: 150 AnySetup *InputSlot
+*DefaultInputSlot: Auto
+*InputSlot Tray1/Tray 1: "%% FoomaticRIPOptionSetting: InputSlot=Tray1"
+*FoomaticRIPOptionSetting InputSlot=Tray1: "-s1 "
+*InputSlot Auto/Auto Select: "%% FoomaticRIPOptionSetting: InputSlot=Auto"
+*FoomaticRIPOptionSetting InputSlot=Auto: "-s7 "
+*InputSlot Manual/Manual Feed: "%% FoomaticRIPOptionSetting: InputSlot=Manual"
+*FoomaticRIPOptionSetting InputSlot=Manual: "-s4 "
+*CloseUI: *InputSlot
+
+*OpenUI *MediaType/Media Type: PickOne
+*FoomaticRIPOption MediaType: enum CmdLine A
+*OrderDependency: 150 AnySetup *MediaType
+*DefaultMediaType: Auto
+*MediaType Plain/Plain: "%% FoomaticRIPOptionSetting: MediaType=Plain"
+*FoomaticRIPOptionSetting MediaType=Plain: "-m1 "
+*MediaType Auto/Auto Select: "%% FoomaticRIPOptionSetting: MediaType=Auto"
+*FoomaticRIPOptionSetting MediaType=Auto: "-m0 "
+*MediaType Bond/Bond: "%% FoomaticRIPOptionSetting: MediaType=Bond"
+*FoomaticRIPOptionSetting MediaType=Bond: "-m7 "
+*MediaType Cardstock/Cardstock: "%% FoomaticRIPOptionSetting: MediaType=Cardstock"
+*FoomaticRIPOptionSetting MediaType=Cardstock: "-m10 "
+*MediaType Color/Color: "%% FoomaticRIPOptionSetting: MediaType=Color"
+*FoomaticRIPOptionSetting MediaType=Color: "-m9 "
+*MediaType Envelope/Envelope: "%% FoomaticRIPOptionSetting: MediaType=Envelope"
+*FoomaticRIPOptionSetting MediaType=Envelope: "-m12 "
+*MediaType Graytrans/Grayscale Transparency: "%% FoomaticRIPOptionSetting: MediaType=Graytrans"
+*FoomaticRIPOptionSetting MediaType=Graytrans: "-m4 "
+*MediaType Heavy/Heavy: "%% FoomaticRIPOptionSetting: MediaType=Heavy"
+*FoomaticRIPOptionSetting MediaType=Heavy: "-m11 "
+*MediaType Labels/Labels: "%% FoomaticRIPOptionSetting: MediaType=Labels"
+*FoomaticRIPOptionSetting MediaType=Labels: "-m6 "
+*MediaType Letterhead/Letterhead: "%% FoomaticRIPOptionSetting: MediaType=Letterhead"
+*FoomaticRIPOptionSetting MediaType=Letterhead: "-m3 "
+*MediaType Light/Light: "%% FoomaticRIPOptionSetting: MediaType=Light"
+*FoomaticRIPOptionSetting MediaType=Light: "-m13 "
+*MediaType Preprinted/Preprinted: "%% FoomaticRIPOptionSetting: MediaType=Preprinted"
+*FoomaticRIPOptionSetting MediaType=Preprinted: "-m2 "
+*MediaType Prepunched/Prepunched: "%% FoomaticRIPOptionSetting: MediaType=Prepunched"
+*FoomaticRIPOptionSetting MediaType=Prepunched: "-m5 "
+*MediaType Recycled/Recycled: "%% FoomaticRIPOptionSetting: MediaType=Recycled"
+*FoomaticRIPOptionSetting MediaType=Recycled: "-m8 "
+*MediaType Tough/Tough: "%% FoomaticRIPOptionSetting: MediaType=Tough"
+*FoomaticRIPOptionSetting MediaType=Tough: "-m14 "
+*CloseUI: *MediaType
+
+*OpenUI *ColorMode/Color Mode: PickOne
+*FoomaticRIPOption ColorMode: enum CmdLine A
+*OrderDependency: 120 AnySetup *ColorMode
+*DefaultColorMode: Monochrome
+*ColorMode Color/Color: "%% FoomaticRIPOptionSetting: ColorMode=Color"
+*FoomaticRIPOptionSetting ColorMode=Color: "-c "
+*ColorMode Monochrome/Monochrome: "%% FoomaticRIPOptionSetting: ColorMode=Monochrome"
+*FoomaticRIPOptionSetting ColorMode=Monochrome: " "
+*CloseUI: *ColorMode
+
+*OpenUI *BitsPerPlane/Bits Per Plane: PickOne
+*FoomaticRIPOption BitsPerPlane: enum CmdLine A
+*OrderDependency: 120 AnySetup *BitsPerPlane
+*DefaultBitsPerPlane: 1-BPP
+*BitsPerPlane 1-BPP/1 Bit Per Plane: "%% FoomaticRIPOptionSetting: BitsPerPlane=1-BPP"
+*FoomaticRIPOptionSetting BitsPerPlane=1-BPP: "-b1 "
+*BitsPerPlane 2-BPP/2 Bits Per Plane: "%% FoomaticRIPOptionSetting: BitsPerPlane=2-BPP"
+*FoomaticRIPOptionSetting BitsPerPlane=2-BPP: "-b2 "
+*CloseUI: *BitsPerPlane
+
+*OpenUI *Copies/Copies: PickOne
+*FoomaticRIPOption Copies: int CmdLine A
+*FoomaticRIPOptionPrototype Copies: "-n%s "
+*FoomaticRIPOptionRange Copies: 1 100
+*OrderDependency: 220 AnySetup *Copies
+*DefaultCopies: 1
+*FoomaticRIPDefaultCopies: 1
+*Copies 1/1: "%% FoomaticRIPOptionSetting: Copies=1"
+*Copies 2/2: "%% FoomaticRIPOptionSetting: Copies=2"
+*Copies 3/3: "%% FoomaticRIPOptionSetting: Copies=3"
+*Copies 4/4: "%% FoomaticRIPOptionSetting: Copies=4"
+*Copies 5/5: "%% FoomaticRIPOptionSetting: Copies=5"
+*Copies 6/6: "%% FoomaticRIPOptionSetting: Copies=6"
+*Copies 7/7: "%% FoomaticRIPOptionSetting: Copies=7"
+*Copies 8/8: "%% FoomaticRIPOptionSetting: Copies=8"
+*Copies 9/9: "%% FoomaticRIPOptionSetting: Copies=9"
+*Copies 10/10: "%% FoomaticRIPOptionSetting: Copies=10"
+*Copies 11/11: "%% FoomaticRIPOptionSetting: Copies=11"
+*Copies 12/12: "%% FoomaticRIPOptionSetting: Copies=12"
+*Copies 13/13: "%% FoomaticRIPOptionSetting: Copies=13"
+*Copies 14/14: "%% FoomaticRIPOptionSetting: Copies=14"
+*Copies 15/15: "%% FoomaticRIPOptionSetting: Copies=15"
+*Copies 16/16: "%% FoomaticRIPOptionSetting: Copies=16"
+*Copies 17/17: "%% FoomaticRIPOptionSetting: Copies=17"
+*Copies 18/18: "%% FoomaticRIPOptionSetting: Copies=18"
+*Copies 19/19: "%% FoomaticRIPOptionSetting: Copies=19"
+*Copies 20/20: "%% FoomaticRIPOptionSetting: Copies=20"
+*Copies 21/21: "%% FoomaticRIPOptionSetting: Copies=21"
+*Copies 22/22: "%% FoomaticRIPOptionSetting: Copies=22"
+*Copies 23/23: "%% FoomaticRIPOptionSetting: Copies=23"
+*Copies 24/24: "%% FoomaticRIPOptionSetting: Copies=24"
+*Copies 25/25: "%% FoomaticRIPOptionSetting: Copies=25"
+*Copies 26/26: "%% FoomaticRIPOptionSetting: Copies=26"
+*Copies 27/27: "%% FoomaticRIPOptionSetting: Copies=27"
+*Copies 28/28: "%% FoomaticRIPOptionSetting: Copies=28"
+*Copies 29/29: "%% FoomaticRIPOptionSetting: Copies=29"
+*Copies 30/30: "%% FoomaticRIPOptionSetting: Copies=30"
+*Copies 31/31: "%% FoomaticRIPOptionSetting: Copies=31"
+*Copies 32/32: "%% FoomaticRIPOptionSetting: Copies=32"
+*Copies 33/33: "%% FoomaticRIPOptionSetting: Copies=33"
+*Copies 34/34: "%% FoomaticRIPOptionSetting: Copies=34"
+*Copies 35/35: "%% FoomaticRIPOptionSetting: Copies=35"
+*Copies 36/36: "%% FoomaticRIPOptionSetting: Copies=36"
+*Copies 37/37: "%% FoomaticRIPOptionSetting: Copies=37"
+*Copies 38/38: "%% FoomaticRIPOptionSetting: Copies=38"
+*Copies 39/39: "%% FoomaticRIPOptionSetting: Copies=39"
+*Copies 40/40: "%% FoomaticRIPOptionSetting: Copies=40"
+*Copies 41/41: "%% FoomaticRIPOptionSetting: Copies=41"
+*Copies 42/42: "%% FoomaticRIPOptionSetting: Copies=42"
+*Copies 43/43: "%% FoomaticRIPOptionSetting: Copies=43"
+*Copies 44/44: "%% FoomaticRIPOptionSetting: Copies=44"
+*Copies 45/45: "%% FoomaticRIPOptionSetting: Copies=45"
+*Copies 46/46: "%% FoomaticRIPOptionSetting: Copies=46"
+*Copies 47/47: "%% FoomaticRIPOptionSetting: Copies=47"
+*Copies 48/48: "%% FoomaticRIPOptionSetting: Copies=48"
+*Copies 49/49: "%% FoomaticRIPOptionSetting: Copies=49"
+*Copies 50/50: "%% FoomaticRIPOptionSetting: Copies=50"
+*Copies 51/51: "%% FoomaticRIPOptionSetting: Copies=51"
+*Copies 52/52: "%% FoomaticRIPOptionSetting: Copies=52"
+*Copies 53/53: "%% FoomaticRIPOptionSetting: Copies=53"
+*Copies 54/54: "%% FoomaticRIPOptionSetting: Copies=54"
+*Copies 55/55: "%% FoomaticRIPOptionSetting: Copies=55"
+*Copies 56/56: "%% FoomaticRIPOptionSetting: Copies=56"
+*Copies 57/57: "%% FoomaticRIPOptionSetting: Copies=57"
+*Copies 58/58: "%% FoomaticRIPOptionSetting: Copies=58"
+*Copies 59/59: "%% FoomaticRIPOptionSetting: Copies=59"
+*Copies 60/60: "%% FoomaticRIPOptionSetting: Copies=60"
+*Copies 61/61: "%% FoomaticRIPOptionSetting: Copies=61"
+*Copies 62/62: "%% FoomaticRIPOptionSetting: Copies=62"
+*Copies 63/63: "%% FoomaticRIPOptionSetting: Copies=63"
+*Copies 64/64: "%% FoomaticRIPOptionSetting: Copies=64"
+*Copies 65/65: "%% FoomaticRIPOptionSetting: Copies=65"
+*Copies 66/66: "%% FoomaticRIPOptionSetting: Copies=66"
+*Copies 67/67: "%% FoomaticRIPOptionSetting: Copies=67"
+*Copies 68/68: "%% FoomaticRIPOptionSetting: Copies=68"
+*Copies 69/69: "%% FoomaticRIPOptionSetting: Copies=69"
+*Copies 70/70: "%% FoomaticRIPOptionSetting: Copies=70"
+*Copies 71/71: "%% FoomaticRIPOptionSetting: Copies=71"
+*Copies 72/72: "%% FoomaticRIPOptionSetting: Copies=72"
+*Copies 73/73: "%% FoomaticRIPOptionSetting: Copies=73"
+*Copies 74/74: "%% FoomaticRIPOptionSetting: Copies=74"
+*Copies 75/75: "%% FoomaticRIPOptionSetting: Copies=75"
+*Copies 76/76: "%% FoomaticRIPOptionSetting: Copies=76"
+*Copies 77/77: "%% FoomaticRIPOptionSetting: Copies=77"
+*Copies 78/78: "%% FoomaticRIPOptionSetting: Copies=78"
+*Copies 79/79: "%% FoomaticRIPOptionSetting: Copies=79"
+*Copies 80/80: "%% FoomaticRIPOptionSetting: Copies=80"
+*Copies 81/81: "%% FoomaticRIPOptionSetting: Copies=81"
+*Copies 82/82: "%% FoomaticRIPOptionSetting: Copies=82"
+*Copies 83/83: "%% FoomaticRIPOptionSetting: Copies=83"
+*Copies 84/84: "%% FoomaticRIPOptionSetting: Copies=84"
+*Copies 85/85: "%% FoomaticRIPOptionSetting: Copies=85"
+*Copies 86/86: "%% FoomaticRIPOptionSetting: Copies=86"
+*Copies 87/87: "%% FoomaticRIPOptionSetting: Copies=87"
+*Copies 88/88: "%% FoomaticRIPOptionSetting: Copies=88"
+*Copies 89/89: "%% FoomaticRIPOptionSetting: Copies=89"
+*Copies 90/90: "%% FoomaticRIPOptionSetting: Copies=90"
+*Copies 91/91: "%% FoomaticRIPOptionSetting: Copies=91"
+*Copies 92/92: "%% FoomaticRIPOptionSetting: Copies=92"
+*Copies 93/93: "%% FoomaticRIPOptionSetting: Copies=93"
+*Copies 94/94: "%% FoomaticRIPOptionSetting: Copies=94"
+*Copies 95/95: "%% FoomaticRIPOptionSetting: Copies=95"
+*Copies 96/96: "%% FoomaticRIPOptionSetting: Copies=96"
+*Copies 97/97: "%% FoomaticRIPOptionSetting: Copies=97"
+*Copies 98/98: "%% FoomaticRIPOptionSetting: Copies=98"
+*Copies 99/99: "%% FoomaticRIPOptionSetting: Copies=99"
+*Copies 100/100: "%% FoomaticRIPOptionSetting: Copies=100"
+*CloseUI: *Copies
+
+*CloseGroup: General
+
+*OpenGroup: Adjustment/Adjustment
+
+*OpenUI *ICM/ICM Color Profile: PickOne
+*FoomaticRIPOption ICM: enum CmdLine A
+*OrderDependency: 300 AnySetup *ICM
+*DefaultICM: none
+*ICM none/No ICM color correction: "%% FoomaticRIPOptionSetting: ICM=none"
+*FoomaticRIPOptionSetting ICM=none: " "
+*ICM testing/File testing.icm: "%% FoomaticRIPOptionSetting: ICM=testing"
+*FoomaticRIPOptionSetting ICM=testing: "-Gtesting.icm "
+*ICM user1/File user1.icm: "%% FoomaticRIPOptionSetting: ICM=user1"
+*FoomaticRIPOptionSetting ICM=user1: "-Guser1.icm "
+*ICM user2/File user2.icm: "%% FoomaticRIPOptionSetting: ICM=user2"
+*FoomaticRIPOptionSetting ICM=user2: "-Guser2.icm "
+*ICM user3/File user3.icm: "%% FoomaticRIPOptionSetting: ICM=user3"
+*FoomaticRIPOptionSetting ICM=user3: "-Guser3.icm "
+*ICM user4/File user4.icm: "%% FoomaticRIPOptionSetting: ICM=user4"
+*FoomaticRIPOptionSetting ICM=user4: "-Guser4.icm "
+*CloseUI: *ICM
+
+*CloseGroup: Adjustment
+
+*OpenGroup: Miscellaneous/Miscellaneous
+
+*OpenUI *Nup/N-up Printing: PickOne
+*FoomaticRIPOption Nup: enum CmdLine A
+*OrderDependency: 200 AnySetup *Nup
+*DefaultNup: 1up
+*Nup 1up/1-up: "%% FoomaticRIPOptionSetting: Nup=1up"
+*FoomaticRIPOptionSetting Nup=1up: " "
+*Nup 2up/2-up: "%% FoomaticRIPOptionSetting: Nup=2up"
+*FoomaticRIPOptionSetting Nup=2up: "-2 "
+*Nup 3up/3-up: "%% FoomaticRIPOptionSetting: Nup=3up"
+*FoomaticRIPOptionSetting Nup=3up: "-3 "
+*Nup 4up/4-up: "%% FoomaticRIPOptionSetting: Nup=4up"
+*FoomaticRIPOptionSetting Nup=4up: "-4 "
+*Nup 6up/6-up: "%% FoomaticRIPOptionSetting: Nup=6up"
+*FoomaticRIPOptionSetting Nup=6up: "-6 "
+*Nup 8up/8-up: "%% FoomaticRIPOptionSetting: Nup=8up"
+*FoomaticRIPOptionSetting Nup=8up: "-8 "
+*Nup 10up/10-up: "%% FoomaticRIPOptionSetting: Nup=10up"
+*FoomaticRIPOptionSetting Nup=10up: "-10 "
+*Nup 12up/12-up: "%% FoomaticRIPOptionSetting: Nup=12up"
+*FoomaticRIPOptionSetting Nup=12up: "-12 "
+*Nup 14up/14-up: "%% FoomaticRIPOptionSetting: Nup=14up"
+*FoomaticRIPOptionSetting Nup=14up: "-14 "
+*Nup 15up/15-up: "%% FoomaticRIPOptionSetting: Nup=15up"
+*FoomaticRIPOptionSetting Nup=15up: "-15 "
+*Nup 16up/16-up: "%% FoomaticRIPOptionSetting: Nup=16up"
+*FoomaticRIPOptionSetting Nup=16up: "-16 "
+*Nup 18up/18-up: "%% FoomaticRIPOptionSetting: Nup=18up"
+*FoomaticRIPOptionSetting Nup=18up: "-18 "
+*CloseUI: *Nup
+
+*OpenUI *NupOrient/N-up Orientation: PickOne
+*FoomaticRIPOption NupOrient: enum CmdLine A
+*OrderDependency: 200 AnySetup *NupOrient
+*DefaultNupOrient: port
+*NupOrient land/Landscape: "%% FoomaticRIPOptionSetting: NupOrient=land"
+*FoomaticRIPOptionSetting NupOrient=land: "-ol "
+*NupOrient port/Portrait: "%% FoomaticRIPOptionSetting: NupOrient=port"
+*FoomaticRIPOptionSetting NupOrient=port: " "
+*NupOrient sea/Seascape: "%% FoomaticRIPOptionSetting: NupOrient=sea"
+*FoomaticRIPOptionSetting NupOrient=sea: "-os "
+*CloseUI: *NupOrient
+
+*CloseGroup: Miscellaneous
+
+
+*% Generic boilerplate PPD stuff as standard PostScript fonts and so on
+
+*DefaultFont: Courier
+*Font AvantGarde-Book: Standard "(001.006S)" Standard ROM
+*Font AvantGarde-BookOblique: Standard "(001.006S)" Standard ROM
+*Font AvantGarde-Demi: Standard "(001.007S)" Standard ROM
+*Font AvantGarde-DemiOblique: Standard "(001.007S)" Standard ROM
+*Font Bookman-Demi: Standard "(001.004S)" Standard ROM
+*Font Bookman-DemiItalic: Standard "(001.004S)" Standard ROM
+*Font Bookman-Light: Standard "(001.004S)" Standard ROM
+*Font Bookman-LightItalic: Standard "(001.004S)" Standard ROM
+*Font Courier: Standard "(002.004S)" Standard ROM
+*Font Courier-Bold: Standard "(002.004S)" Standard ROM
+*Font Courier-BoldOblique: Standard "(002.004S)" Standard ROM
+*Font Courier-Oblique: Standard "(002.004S)" Standard ROM
+*Font Helvetica: Standard "(001.006S)" Standard ROM
+*Font Helvetica-Bold: Standard "(001.007S)" Standard ROM
+*Font Helvetica-BoldOblique: Standard "(001.007S)" Standard ROM
+*Font Helvetica-Narrow: Standard "(001.006S)" Standard ROM
+*Font Helvetica-Narrow-Bold: Standard "(001.007S)" Standard ROM
+*Font Helvetica-Narrow-BoldOblique: Standard "(001.007S)" Standard ROM
+*Font Helvetica-Narrow-Oblique: Standard "(001.006S)" Standard ROM
+*Font Helvetica-Oblique: Standard "(001.006S)" Standard ROM
+*Font NewCenturySchlbk-Bold: Standard "(001.009S)" Standard ROM
+*Font NewCenturySchlbk-BoldItalic: Standard "(001.007S)" Standard ROM
+*Font NewCenturySchlbk-Italic: Standard "(001.006S)" Standard ROM
+*Font NewCenturySchlbk-Roman: Standard "(001.007S)" Standard ROM
+*Font Palatino-Bold: Standard "(001.005S)" Standard ROM
+*Font Palatino-BoldItalic: Standard "(001.005S)" Standard ROM
+*Font Palatino-Italic: Standard "(001.005S)" Standard ROM
+*Font Palatino-Roman: Standard "(001.005S)" Standard ROM
+*Font Symbol: Special "(001.007S)" Special ROM
+*Font Times-Bold: Standard "(001.007S)" Standard ROM
+*Font Times-BoldItalic: Standard "(001.009S)" Standard ROM
+*Font Times-Italic: Standard "(001.007S)" Standard ROM
+*Font Times-Roman: Standard "(001.007S)" Standard ROM
+*Font ZapfChancery-MediumItalic: Standard "(001.007S)" Standard ROM
+*Font ZapfDingbats: Special "(001.004S)" Standard ROM
+
diff --git a/PPD/HP-Color_LaserJet_1600.ppd b/PPD/HP-Color_LaserJet_1600.ppd
new file mode 100644
index 0000000..f700235
--- /dev/null
+++ b/PPD/HP-Color_LaserJet_1600.ppd
@@ -0,0 +1,462 @@
+*PPD-Adobe: "4.3"
+*%
+*% For information on using this, and to obtain the required backend
+*% script, consult http://www.linuxprinting.org/
+*%
+*% This file is published under the GNU General Public License
+*%
+*% PPD-O-MATIC (3.0.0 or newer) generated this PPD file. It is for use with
+*% all programs and environments which use PPD files for dealing with
+*% printer capability information. The printer must be configured with the
+*% "foomatic-rip" backend filter script of Foomatic 3.0.0 or newer. This
+*% file and "foomatic-rip" work together to support PPD-controlled printer
+*% driver option access with arbitrary free software printer drivers and
+*% printing spoolers.
+*%
+*% To save this file on your disk, wait until the download has completed
+*% (the animation of the browser logo must stop) and then use the
+*% "Save as..." command in the "File" menu of your browser or in the
+*% pop-up manu when you click on this document with the right mouse button.
+*% DO NOT cut and paste this file into an editor with your mouse. This can
+*% introduce additional line breaks which lead to unexpected results.
+*%
+*% You may save this file as 'HP-Color_LaserJet_1600-foo2hp.ppd'
+*%
+*%
+*FormatVersion: "4.3"
+*FileVersion: "1.1"
+*LanguageVersion: English
+*LanguageEncoding: ISOLatin1
+*PCFileName: "FOO2HP.PPD"
+*Manufacturer: "HP"
+*Product: "(HP Color LaserJet 1600)"
+*cupsVersion: 1.0
+*cupsManualCopies: True
+*cupsModelNumber: 2
+*cupsFilter: "application/vnd.cups-postscript 0 foomatic-rip"
+*%pprRIP: foomatic-rip other
+*ModelName: "HP Color LaserJet 1600"
+*ShortNickName: "HP Color LaserJet 1600 foo2hp"
+*NickName: "HP Color LaserJet 1600 Foomatic/foo2hp (recommended)"
+*PSVersion: "(3010.000) 550"
+*PSVersion: "(3010.000) 651"
+*PSVersion: "(3010.000) 652"
+*PSVersion: "(3010.000) 653"
+*PSVersion: "(3010.000) 704"
+*PSVersion: "(3010.000) 705"
+*PSVersion: "(3010.000) 800"
+*LanguageLevel: "3"
+*ColorDevice: True
+*DefaultColorSpace: RGB
+*FileSystem: False
+*Throughput: "1"
+*LandscapeOrientation: Plus90
+*TTRasterizer: Type42
+*1284DeviceID: "MFG:Hewlett-Packard;MDL:HP Color LaserJet 1600;CMD:ACL;DES:HP Color LaserJet 1600;"
+
+
+
+*VariablePaperSize: False
+
+*FoomaticIDs: HP-Color_LaserJet_1600 foo2hp
+*FoomaticRIPCommandLine: "foo2hp2600-wrapper %A"
+
+*OpenGroup: General/General
+
+*OpenUI *PageSize/Page Size: PickOne
+*FoomaticRIPOption PageSize: enum CmdLine A
+*OrderDependency: 135 AnySetup *PageSize
+*DefaultPageSize: Letter
+*PageSize Letter/Letter: "%% FoomaticRIPOptionSetting: PageSize=Letter"
+*FoomaticRIPOptionSetting PageSize=Letter: "-p1 "
+*PageSize A4/A4: "%% FoomaticRIPOptionSetting: PageSize=A4"
+*FoomaticRIPOptionSetting PageSize=A4: "-p9 "
+*PageSize A5/A5: "%% FoomaticRIPOptionSetting: PageSize=A5"
+*FoomaticRIPOptionSetting PageSize=A5: "-p11 "
+*PageSize B5/B5: "%% FoomaticRIPOptionSetting: PageSize=B5"
+*FoomaticRIPOptionSetting PageSize=B5: "-p13 "
+*PageSize Env10/Env #10: "%% FoomaticRIPOptionSetting: PageSize=Env10"
+*FoomaticRIPOptionSetting PageSize=Env10: "-p20 "
+*PageSize EnvB5/Env B5: "%% FoomaticRIPOptionSetting: PageSize=EnvB5"
+*FoomaticRIPOptionSetting PageSize=EnvB5: "-p34 "
+*PageSize EnvC5/Env C5: "%% FoomaticRIPOptionSetting: PageSize=EnvC5"
+*FoomaticRIPOptionSetting PageSize=EnvC5: "-p28 "
+*PageSize EnvDL/Env DL: "%% FoomaticRIPOptionSetting: PageSize=EnvDL"
+*FoomaticRIPOptionSetting PageSize=EnvDL: "-p27 "
+*PageSize EnvMonarch/Env Monarch: "%% FoomaticRIPOptionSetting: PageSize=EnvMonarch"
+*FoomaticRIPOptionSetting PageSize=EnvMonarch: "-p37 "
+*PageSize Executive/Executive: "%% FoomaticRIPOptionSetting: PageSize=Executive"
+*FoomaticRIPOptionSetting PageSize=Executive: "-p7 "
+*PageSize Legal/Legal: "%% FoomaticRIPOptionSetting: PageSize=Legal"
+*FoomaticRIPOptionSetting PageSize=Legal: "-p5 "
+*CloseUI: *PageSize
+
+*OpenUI *PageRegion: PickOne
+*OrderDependency: 135 AnySetup *PageRegion
+*DefaultPageRegion: Letter
+*PageRegion Letter/Letter: "%% FoomaticRIPOptionSetting: PageSize=Letter"
+*PageRegion A4/A4: "%% FoomaticRIPOptionSetting: PageSize=A4"
+*PageRegion A5/A5: "%% FoomaticRIPOptionSetting: PageSize=A5"
+*PageRegion B5/B5: "%% FoomaticRIPOptionSetting: PageSize=B5"
+*PageRegion Env10/Env #10: "%% FoomaticRIPOptionSetting: PageSize=Env10"
+*PageRegion EnvB5/Env B5: "%% FoomaticRIPOptionSetting: PageSize=EnvB5"
+*PageRegion EnvC5/Env C5: "%% FoomaticRIPOptionSetting: PageSize=EnvC5"
+*PageRegion EnvDL/Env DL: "%% FoomaticRIPOptionSetting: PageSize=EnvDL"
+*PageRegion EnvMonarch/Env Monarch: "%% FoomaticRIPOptionSetting: PageSize=EnvMonarch"
+*PageRegion Executive/Executive: "%% FoomaticRIPOptionSetting: PageSize=Executive"
+*PageRegion Legal/Legal: "%% FoomaticRIPOptionSetting: PageSize=Legal"
+*CloseUI: *PageRegion
+
+*DefaultImageableArea: Letter
+*ImageableArea Letter/Letter: "12.00 12.00 600.00 780.00"
+*ImageableArea A4/A4: "12.00 12.00 583.00 830.00"
+*ImageableArea A5/A5: "12.00 12.00 408.00 583.00"
+*ImageableArea B5/B5: "12.00 12.00 486.00 696.00"
+*ImageableArea Env10/Env #10: "12.00 12.00 285.00 672.00"
+*ImageableArea EnvB5/Env B5: "12.00 12.00 486.00 696.00"
+*ImageableArea EnvC5/Env C5: "12.00 12.00 447.00 637.00"
+*ImageableArea EnvDL/Env DL: "12.00 12.00 299.00 611.00"
+*ImageableArea EnvMonarch/Env Monarch: "12.00 12.00 267.00 528.00"
+*ImageableArea Executive/Executive: "12.00 12.00 510.00 744.00"
+*ImageableArea Legal/Legal: "12.00 12.00 600.00 996.00"
+
+*DefaultPaperDimension: Letter
+*PaperDimension Letter/Letter: "612 792"
+*PaperDimension A4/A4: "595 842"
+*PaperDimension A5/A5: "420 595"
+*PaperDimension B5/B5: "498 708"
+*PaperDimension Env10/Env #10: "297 684"
+*PaperDimension EnvB5/Env B5: "498 708"
+*PaperDimension EnvC5/Env C5: "459 649"
+*PaperDimension EnvDL/Env DL: "311 623"
+*PaperDimension EnvMonarch/Env Monarch: "279 540"
+*PaperDimension Executive/Executive: "522 756"
+*PaperDimension Legal/Legal: "612 1008"
+
+*OpenUI *InputSlot/Media Source: PickOne
+*FoomaticRIPOption InputSlot: enum CmdLine A
+*OrderDependency: 150 AnySetup *InputSlot
+*DefaultInputSlot: Auto
+*InputSlot Tray1/Tray 1: "%% FoomaticRIPOptionSetting: InputSlot=Tray1"
+*FoomaticRIPOptionSetting InputSlot=Tray1: "-s4 "
+*InputSlot Tray2/Tray 2: "%% FoomaticRIPOptionSetting: InputSlot=Tray2"
+*FoomaticRIPOptionSetting InputSlot=Tray2: "-s1 "
+*InputSlot Tray3/Tray 3: "%% FoomaticRIPOptionSetting: InputSlot=Tray3"
+*FoomaticRIPOptionSetting InputSlot=Tray3: "-s2 "
+*InputSlot Auto/Auto Select: "%% FoomaticRIPOptionSetting: InputSlot=Auto"
+*FoomaticRIPOptionSetting InputSlot=Auto: "-s7 "
+*CloseUI: *InputSlot
+
+*OpenUI *MediaType/Media Type: PickOne
+*FoomaticRIPOption MediaType: enum CmdLine A
+*OrderDependency: 150 AnySetup *MediaType
+*DefaultMediaType: Plain
+*MediaType Plain/Plain: "%% FoomaticRIPOptionSetting: MediaType=Plain"
+*FoomaticRIPOptionSetting MediaType=Plain: "-m1 "
+*MediaType photo/HP Color Laser Photo Paper: "%% FoomaticRIPOptionSetting: MediaType=photo"
+*FoomaticRIPOptionSetting MediaType=photo: "-m278 "
+*MediaType Bond/Bond: "%% FoomaticRIPOptionSetting: MediaType=Bond"
+*FoomaticRIPOptionSetting MediaType=Bond: "-m260 "
+*MediaType Cardstock/Cardstock: "%% FoomaticRIPOptionSetting: MediaType=Cardstock"
+*FoomaticRIPOptionSetting MediaType=Cardstock: "-m261 "
+*MediaType Color/Color: "%% FoomaticRIPOptionSetting: MediaType=Color"
+*FoomaticRIPOptionSetting MediaType=Color: "-m512 "
+*MediaType Cover/HP Premium Cover: "%% FoomaticRIPOptionSetting: MediaType=Cover"
+*FoomaticRIPOptionSetting MediaType=Cover: "-m277 "
+*MediaType Envelope/Envelope: "%% FoomaticRIPOptionSetting: MediaType=Envelope"
+*FoomaticRIPOptionSetting MediaType=Envelope: "-m267 "
+*MediaType Glossy/Glossy: "%% FoomaticRIPOptionSetting: MediaType=Glossy"
+*FoomaticRIPOptionSetting MediaType=Glossy: "-m269 "
+*MediaType Heavy/Heavy: "%% FoomaticRIPOptionSetting: MediaType=Heavy"
+*FoomaticRIPOptionSetting MediaType=Heavy: "-m262 "
+*MediaType HeavyGlossy/Heavy Glossy: "%% FoomaticRIPOptionSetting: MediaType=HeavyGlossy"
+*FoomaticRIPOptionSetting MediaType=HeavyGlossy: "-m270 "
+*MediaType Labels/Labels: "%% FoomaticRIPOptionSetting: MediaType=Labels"
+*FoomaticRIPOptionSetting MediaType=Labels: "-m265 "
+*MediaType Letterhead/Letterhead: "%% FoomaticRIPOptionSetting: MediaType=Letterhead"
+*FoomaticRIPOptionSetting MediaType=Letterhead: "-m513 "
+*MediaType Light/Light: "%% FoomaticRIPOptionSetting: MediaType=Light"
+*FoomaticRIPOptionSetting MediaType=Light: "-m258 "
+*MediaType LightGlossy/Light Glossy: "%% FoomaticRIPOptionSetting: MediaType=LightGlossy"
+*FoomaticRIPOptionSetting MediaType=LightGlossy: "-m268 "
+*MediaType Preprinted/Preprinted: "%% FoomaticRIPOptionSetting: MediaType=Preprinted"
+*FoomaticRIPOptionSetting MediaType=Preprinted: "-m514 "
+*MediaType Prepunched/Prepunched: "%% FoomaticRIPOptionSetting: MediaType=Prepunched"
+*FoomaticRIPOptionSetting MediaType=Prepunched: "-m515 "
+*MediaType Recycled/Recycled: "%% FoomaticRIPOptionSetting: MediaType=Recycled"
+*FoomaticRIPOptionSetting MediaType=Recycled: "-m516 "
+*MediaType Tough/Tough: "%% FoomaticRIPOptionSetting: MediaType=Tough"
+*FoomaticRIPOptionSetting MediaType=Tough: "-m276 "
+*MediaType Transparency/Transparency: "%% FoomaticRIPOptionSetting: MediaType=Transparency"
+*FoomaticRIPOptionSetting MediaType=Transparency: "-m2 "
+*CloseUI: *MediaType
+
+*OpenUI *Duplex/Duplex Printing: PickOne
+*FoomaticRIPOption Duplex: enum CmdLine A
+*OrderDependency: 210 AnySetup *Duplex
+*DefaultDuplex: None
+*Duplex DuplexNoTumble/Long Edge (Standard): "%% FoomaticRIPOptionSetting: Duplex=DuplexNoTumble"
+*FoomaticRIPOptionSetting Duplex=DuplexNoTumble: "-d2 "
+*Duplex DuplexTumble/Short Edge (Flip): "%% FoomaticRIPOptionSetting: Duplex=DuplexTumble"
+*FoomaticRIPOptionSetting Duplex=DuplexTumble: "-d3 "
+*Duplex None/Off: "%% FoomaticRIPOptionSetting: Duplex=None"
+*FoomaticRIPOptionSetting Duplex=None: "-d1 "
+*CloseUI: *Duplex
+
+*OpenUI *Quality/Printing Quality: PickOne
+*FoomaticRIPOption Quality: enum CmdLine A
+*OrderDependency: 110 AnySetup *Quality
+*DefaultQuality: normal
+*Quality draft/Draft Mode: "%% FoomaticRIPOptionSetting: Quality=draft"
+*FoomaticRIPOptionSetting Quality=draft: " -t "
+*Quality normal/Normal Mode: "%% FoomaticRIPOptionSetting: Quality=normal"
+*FoomaticRIPOptionSetting Quality=normal: " "
+*CloseUI: *Quality
+
+*OpenUI *ColorMode/Color Mode: PickOne
+*FoomaticRIPOption ColorMode: enum CmdLine A
+*OrderDependency: 120 AnySetup *ColorMode
+*DefaultColorMode: Monochrome
+*ColorMode Color/Color: "%% FoomaticRIPOptionSetting: ColorMode=Color"
+*FoomaticRIPOptionSetting ColorMode=Color: "-c "
+*ColorMode Monochrome/Monochrome: "%% FoomaticRIPOptionSetting: ColorMode=Monochrome"
+*FoomaticRIPOptionSetting ColorMode=Monochrome: " "
+*CloseUI: *ColorMode
+
+*OpenUI *BitsPerPlane/Bits Per Plane: PickOne
+*FoomaticRIPOption BitsPerPlane: enum CmdLine A
+*OrderDependency: 120 AnySetup *BitsPerPlane
+*DefaultBitsPerPlane: 1-BPP
+*BitsPerPlane 1-BPP/1 Bit Per Plane: "%% FoomaticRIPOptionSetting: BitsPerPlane=1-BPP"
+*FoomaticRIPOptionSetting BitsPerPlane=1-BPP: "-b1 "
+*BitsPerPlane 2-BPP/2 Bits Per Plane: "%% FoomaticRIPOptionSetting: BitsPerPlane=2-BPP"
+*FoomaticRIPOptionSetting BitsPerPlane=2-BPP: "-b2 "
+*CloseUI: *BitsPerPlane
+
+*OpenUI *Copies/Copies: PickOne
+*FoomaticRIPOption Copies: int CmdLine A
+*FoomaticRIPOptionPrototype Copies: "-n%s "
+*FoomaticRIPOptionRange Copies: 1 100
+*OrderDependency: 220 AnySetup *Copies
+*DefaultCopies: 1
+*FoomaticRIPDefaultCopies: 1
+*Copies 1/1: "%% FoomaticRIPOptionSetting: Copies=1"
+*Copies 2/2: "%% FoomaticRIPOptionSetting: Copies=2"
+*Copies 3/3: "%% FoomaticRIPOptionSetting: Copies=3"
+*Copies 4/4: "%% FoomaticRIPOptionSetting: Copies=4"
+*Copies 5/5: "%% FoomaticRIPOptionSetting: Copies=5"
+*Copies 6/6: "%% FoomaticRIPOptionSetting: Copies=6"
+*Copies 7/7: "%% FoomaticRIPOptionSetting: Copies=7"
+*Copies 8/8: "%% FoomaticRIPOptionSetting: Copies=8"
+*Copies 9/9: "%% FoomaticRIPOptionSetting: Copies=9"
+*Copies 10/10: "%% FoomaticRIPOptionSetting: Copies=10"
+*Copies 11/11: "%% FoomaticRIPOptionSetting: Copies=11"
+*Copies 12/12: "%% FoomaticRIPOptionSetting: Copies=12"
+*Copies 13/13: "%% FoomaticRIPOptionSetting: Copies=13"
+*Copies 14/14: "%% FoomaticRIPOptionSetting: Copies=14"
+*Copies 15/15: "%% FoomaticRIPOptionSetting: Copies=15"
+*Copies 16/16: "%% FoomaticRIPOptionSetting: Copies=16"
+*Copies 17/17: "%% FoomaticRIPOptionSetting: Copies=17"
+*Copies 18/18: "%% FoomaticRIPOptionSetting: Copies=18"
+*Copies 19/19: "%% FoomaticRIPOptionSetting: Copies=19"
+*Copies 20/20: "%% FoomaticRIPOptionSetting: Copies=20"
+*Copies 21/21: "%% FoomaticRIPOptionSetting: Copies=21"
+*Copies 22/22: "%% FoomaticRIPOptionSetting: Copies=22"
+*Copies 23/23: "%% FoomaticRIPOptionSetting: Copies=23"
+*Copies 24/24: "%% FoomaticRIPOptionSetting: Copies=24"
+*Copies 25/25: "%% FoomaticRIPOptionSetting: Copies=25"
+*Copies 26/26: "%% FoomaticRIPOptionSetting: Copies=26"
+*Copies 27/27: "%% FoomaticRIPOptionSetting: Copies=27"
+*Copies 28/28: "%% FoomaticRIPOptionSetting: Copies=28"
+*Copies 29/29: "%% FoomaticRIPOptionSetting: Copies=29"
+*Copies 30/30: "%% FoomaticRIPOptionSetting: Copies=30"
+*Copies 31/31: "%% FoomaticRIPOptionSetting: Copies=31"
+*Copies 32/32: "%% FoomaticRIPOptionSetting: Copies=32"
+*Copies 33/33: "%% FoomaticRIPOptionSetting: Copies=33"
+*Copies 34/34: "%% FoomaticRIPOptionSetting: Copies=34"
+*Copies 35/35: "%% FoomaticRIPOptionSetting: Copies=35"
+*Copies 36/36: "%% FoomaticRIPOptionSetting: Copies=36"
+*Copies 37/37: "%% FoomaticRIPOptionSetting: Copies=37"
+*Copies 38/38: "%% FoomaticRIPOptionSetting: Copies=38"
+*Copies 39/39: "%% FoomaticRIPOptionSetting: Copies=39"
+*Copies 40/40: "%% FoomaticRIPOptionSetting: Copies=40"
+*Copies 41/41: "%% FoomaticRIPOptionSetting: Copies=41"
+*Copies 42/42: "%% FoomaticRIPOptionSetting: Copies=42"
+*Copies 43/43: "%% FoomaticRIPOptionSetting: Copies=43"
+*Copies 44/44: "%% FoomaticRIPOptionSetting: Copies=44"
+*Copies 45/45: "%% FoomaticRIPOptionSetting: Copies=45"
+*Copies 46/46: "%% FoomaticRIPOptionSetting: Copies=46"
+*Copies 47/47: "%% FoomaticRIPOptionSetting: Copies=47"
+*Copies 48/48: "%% FoomaticRIPOptionSetting: Copies=48"
+*Copies 49/49: "%% FoomaticRIPOptionSetting: Copies=49"
+*Copies 50/50: "%% FoomaticRIPOptionSetting: Copies=50"
+*Copies 51/51: "%% FoomaticRIPOptionSetting: Copies=51"
+*Copies 52/52: "%% FoomaticRIPOptionSetting: Copies=52"
+*Copies 53/53: "%% FoomaticRIPOptionSetting: Copies=53"
+*Copies 54/54: "%% FoomaticRIPOptionSetting: Copies=54"
+*Copies 55/55: "%% FoomaticRIPOptionSetting: Copies=55"
+*Copies 56/56: "%% FoomaticRIPOptionSetting: Copies=56"
+*Copies 57/57: "%% FoomaticRIPOptionSetting: Copies=57"
+*Copies 58/58: "%% FoomaticRIPOptionSetting: Copies=58"
+*Copies 59/59: "%% FoomaticRIPOptionSetting: Copies=59"
+*Copies 60/60: "%% FoomaticRIPOptionSetting: Copies=60"
+*Copies 61/61: "%% FoomaticRIPOptionSetting: Copies=61"
+*Copies 62/62: "%% FoomaticRIPOptionSetting: Copies=62"
+*Copies 63/63: "%% FoomaticRIPOptionSetting: Copies=63"
+*Copies 64/64: "%% FoomaticRIPOptionSetting: Copies=64"
+*Copies 65/65: "%% FoomaticRIPOptionSetting: Copies=65"
+*Copies 66/66: "%% FoomaticRIPOptionSetting: Copies=66"
+*Copies 67/67: "%% FoomaticRIPOptionSetting: Copies=67"
+*Copies 68/68: "%% FoomaticRIPOptionSetting: Copies=68"
+*Copies 69/69: "%% FoomaticRIPOptionSetting: Copies=69"
+*Copies 70/70: "%% FoomaticRIPOptionSetting: Copies=70"
+*Copies 71/71: "%% FoomaticRIPOptionSetting: Copies=71"
+*Copies 72/72: "%% FoomaticRIPOptionSetting: Copies=72"
+*Copies 73/73: "%% FoomaticRIPOptionSetting: Copies=73"
+*Copies 74/74: "%% FoomaticRIPOptionSetting: Copies=74"
+*Copies 75/75: "%% FoomaticRIPOptionSetting: Copies=75"
+*Copies 76/76: "%% FoomaticRIPOptionSetting: Copies=76"
+*Copies 77/77: "%% FoomaticRIPOptionSetting: Copies=77"
+*Copies 78/78: "%% FoomaticRIPOptionSetting: Copies=78"
+*Copies 79/79: "%% FoomaticRIPOptionSetting: Copies=79"
+*Copies 80/80: "%% FoomaticRIPOptionSetting: Copies=80"
+*Copies 81/81: "%% FoomaticRIPOptionSetting: Copies=81"
+*Copies 82/82: "%% FoomaticRIPOptionSetting: Copies=82"
+*Copies 83/83: "%% FoomaticRIPOptionSetting: Copies=83"
+*Copies 84/84: "%% FoomaticRIPOptionSetting: Copies=84"
+*Copies 85/85: "%% FoomaticRIPOptionSetting: Copies=85"
+*Copies 86/86: "%% FoomaticRIPOptionSetting: Copies=86"
+*Copies 87/87: "%% FoomaticRIPOptionSetting: Copies=87"
+*Copies 88/88: "%% FoomaticRIPOptionSetting: Copies=88"
+*Copies 89/89: "%% FoomaticRIPOptionSetting: Copies=89"
+*Copies 90/90: "%% FoomaticRIPOptionSetting: Copies=90"
+*Copies 91/91: "%% FoomaticRIPOptionSetting: Copies=91"
+*Copies 92/92: "%% FoomaticRIPOptionSetting: Copies=92"
+*Copies 93/93: "%% FoomaticRIPOptionSetting: Copies=93"
+*Copies 94/94: "%% FoomaticRIPOptionSetting: Copies=94"
+*Copies 95/95: "%% FoomaticRIPOptionSetting: Copies=95"
+*Copies 96/96: "%% FoomaticRIPOptionSetting: Copies=96"
+*Copies 97/97: "%% FoomaticRIPOptionSetting: Copies=97"
+*Copies 98/98: "%% FoomaticRIPOptionSetting: Copies=98"
+*Copies 99/99: "%% FoomaticRIPOptionSetting: Copies=99"
+*Copies 100/100: "%% FoomaticRIPOptionSetting: Copies=100"
+*CloseUI: *Copies
+
+*CloseGroup: General
+
+*OpenGroup: Adjustment/Adjustment
+
+*OpenUI *ICM/ICM Color Profile: PickOne
+*FoomaticRIPOption ICM: enum CmdLine A
+*OrderDependency: 300 AnySetup *ICM
+*DefaultICM: default
+*ICM default/Default ICM color correction: "%% FoomaticRIPOptionSetting: ICM=default"
+*FoomaticRIPOptionSetting ICM=default: "-Gdefault "
+*ICM hpclj2600n-0/File hpclj2600n-0.icm: "%% FoomaticRIPOptionSetting: ICM=hpclj2600n-0"
+*FoomaticRIPOptionSetting ICM=hpclj2600n-0: "-Ghpclj2600n-0.icm "
+*ICM hpclj2600n-1/File ICCFactory 1: "%% FoomaticRIPOptionSetting: ICM=hpclj2600n-1"
+*FoomaticRIPOptionSetting ICM=hpclj2600n-1: "-Ghpclj2600n-1.icm "
+*ICM km2430_2/File km2430_2.icm: "%% FoomaticRIPOptionSetting: ICM=km2430_2"
+*FoomaticRIPOptionSetting ICM=km2430_2: "-Gkm2430_2.icm "
+*ICM none/No ICM color correction: "%% FoomaticRIPOptionSetting: ICM=none"
+*FoomaticRIPOptionSetting ICM=none: "-Gnone "
+*ICM testing/File testing.icm: "%% FoomaticRIPOptionSetting: ICM=testing"
+*FoomaticRIPOptionSetting ICM=testing: "-Gtesting.icm "
+*ICM user1/File user1.icm: "%% FoomaticRIPOptionSetting: ICM=user1"
+*FoomaticRIPOptionSetting ICM=user1: "-Guser1.icm "
+*ICM user2/File user2.icm: "%% FoomaticRIPOptionSetting: ICM=user2"
+*FoomaticRIPOptionSetting ICM=user2: "-Guser2.icm "
+*ICM user3/File user3.icm: "%% FoomaticRIPOptionSetting: ICM=user3"
+*FoomaticRIPOptionSetting ICM=user3: "-Guser3.icm "
+*ICM user4/File user4.icm: "%% FoomaticRIPOptionSetting: ICM=user4"
+*FoomaticRIPOptionSetting ICM=user4: "-Guser4.icm "
+*CloseUI: *ICM
+
+*CloseGroup: Adjustment
+
+*OpenGroup: Miscellaneous/Miscellaneous
+
+*OpenUI *Nup/N-up Printing: PickOne
+*FoomaticRIPOption Nup: enum CmdLine A
+*OrderDependency: 200 AnySetup *Nup
+*DefaultNup: 1up
+*Nup 1up/1-up: "%% FoomaticRIPOptionSetting: Nup=1up"
+*FoomaticRIPOptionSetting Nup=1up: " "
+*Nup 2up/2-up: "%% FoomaticRIPOptionSetting: Nup=2up"
+*FoomaticRIPOptionSetting Nup=2up: "-2 "
+*Nup 3up/3-up: "%% FoomaticRIPOptionSetting: Nup=3up"
+*FoomaticRIPOptionSetting Nup=3up: "-3 "
+*Nup 4up/4-up: "%% FoomaticRIPOptionSetting: Nup=4up"
+*FoomaticRIPOptionSetting Nup=4up: "-4 "
+*Nup 6up/6-up: "%% FoomaticRIPOptionSetting: Nup=6up"
+*FoomaticRIPOptionSetting Nup=6up: "-6 "
+*Nup 8up/8-up: "%% FoomaticRIPOptionSetting: Nup=8up"
+*FoomaticRIPOptionSetting Nup=8up: "-8 "
+*Nup 10up/10-up: "%% FoomaticRIPOptionSetting: Nup=10up"
+*FoomaticRIPOptionSetting Nup=10up: "-10 "
+*Nup 12up/12-up: "%% FoomaticRIPOptionSetting: Nup=12up"
+*FoomaticRIPOptionSetting Nup=12up: "-12 "
+*Nup 14up/14-up: "%% FoomaticRIPOptionSetting: Nup=14up"
+*FoomaticRIPOptionSetting Nup=14up: "-14 "
+*Nup 15up/15-up: "%% FoomaticRIPOptionSetting: Nup=15up"
+*FoomaticRIPOptionSetting Nup=15up: "-15 "
+*Nup 16up/16-up: "%% FoomaticRIPOptionSetting: Nup=16up"
+*FoomaticRIPOptionSetting Nup=16up: "-16 "
+*Nup 18up/18-up: "%% FoomaticRIPOptionSetting: Nup=18up"
+*FoomaticRIPOptionSetting Nup=18up: "-18 "
+*CloseUI: *Nup
+
+*OpenUI *NupOrient/N-up Orientation: PickOne
+*FoomaticRIPOption NupOrient: enum CmdLine A
+*OrderDependency: 200 AnySetup *NupOrient
+*DefaultNupOrient: port
+*NupOrient land/Landscape: "%% FoomaticRIPOptionSetting: NupOrient=land"
+*FoomaticRIPOptionSetting NupOrient=land: "-ol "
+*NupOrient port/Portrait: "%% FoomaticRIPOptionSetting: NupOrient=port"
+*FoomaticRIPOptionSetting NupOrient=port: " "
+*NupOrient sea/Seascape: "%% FoomaticRIPOptionSetting: NupOrient=sea"
+*FoomaticRIPOptionSetting NupOrient=sea: "-os "
+*CloseUI: *NupOrient
+
+*CloseGroup: Miscellaneous
+
+
+*% Generic boilerplate PPD stuff as standard PostScript fonts and so on
+
+*DefaultFont: Courier
+*Font AvantGarde-Book: Standard "(001.006S)" Standard ROM
+*Font AvantGarde-BookOblique: Standard "(001.006S)" Standard ROM
+*Font AvantGarde-Demi: Standard "(001.007S)" Standard ROM
+*Font AvantGarde-DemiOblique: Standard "(001.007S)" Standard ROM
+*Font Bookman-Demi: Standard "(001.004S)" Standard ROM
+*Font Bookman-DemiItalic: Standard "(001.004S)" Standard ROM
+*Font Bookman-Light: Standard "(001.004S)" Standard ROM
+*Font Bookman-LightItalic: Standard "(001.004S)" Standard ROM
+*Font Courier: Standard "(002.004S)" Standard ROM
+*Font Courier-Bold: Standard "(002.004S)" Standard ROM
+*Font Courier-BoldOblique: Standard "(002.004S)" Standard ROM
+*Font Courier-Oblique: Standard "(002.004S)" Standard ROM
+*Font Helvetica: Standard "(001.006S)" Standard ROM
+*Font Helvetica-Bold: Standard "(001.007S)" Standard ROM
+*Font Helvetica-BoldOblique: Standard "(001.007S)" Standard ROM
+*Font Helvetica-Narrow: Standard "(001.006S)" Standard ROM
+*Font Helvetica-Narrow-Bold: Standard "(001.007S)" Standard ROM
+*Font Helvetica-Narrow-BoldOblique: Standard "(001.007S)" Standard ROM
+*Font Helvetica-Narrow-Oblique: Standard "(001.006S)" Standard ROM
+*Font Helvetica-Oblique: Standard "(001.006S)" Standard ROM
+*Font NewCenturySchlbk-Bold: Standard "(001.009S)" Standard ROM
+*Font NewCenturySchlbk-BoldItalic: Standard "(001.007S)" Standard ROM
+*Font NewCenturySchlbk-Italic: Standard "(001.006S)" Standard ROM
+*Font NewCenturySchlbk-Roman: Standard "(001.007S)" Standard ROM
+*Font Palatino-Bold: Standard "(001.005S)" Standard ROM
+*Font Palatino-BoldItalic: Standard "(001.005S)" Standard ROM
+*Font Palatino-Italic: Standard "(001.005S)" Standard ROM
+*Font Palatino-Roman: Standard "(001.005S)" Standard ROM
+*Font Symbol: Special "(001.007S)" Special ROM
+*Font Times-Bold: Standard "(001.007S)" Standard ROM
+*Font Times-BoldItalic: Standard "(001.009S)" Standard ROM
+*Font Times-Italic: Standard "(001.007S)" Standard ROM
+*Font Times-Roman: Standard "(001.007S)" Standard ROM
+*Font ZapfChancery-MediumItalic: Standard "(001.007S)" Standard ROM
+*Font ZapfDingbats: Special "(001.004S)" Standard ROM
+
diff --git a/PPD/HP-Color_LaserJet_2600n.ppd b/PPD/HP-Color_LaserJet_2600n.ppd
new file mode 100644
index 0000000..c990ed0
--- /dev/null
+++ b/PPD/HP-Color_LaserJet_2600n.ppd
@@ -0,0 +1,462 @@
+*PPD-Adobe: "4.3"
+*%
+*% For information on using this, and to obtain the required backend
+*% script, consult http://www.linuxprinting.org/
+*%
+*% This file is published under the GNU General Public License
+*%
+*% PPD-O-MATIC (3.0.0 or newer) generated this PPD file. It is for use with
+*% all programs and environments which use PPD files for dealing with
+*% printer capability information. The printer must be configured with the
+*% "foomatic-rip" backend filter script of Foomatic 3.0.0 or newer. This
+*% file and "foomatic-rip" work together to support PPD-controlled printer
+*% driver option access with arbitrary free software printer drivers and
+*% printing spoolers.
+*%
+*% To save this file on your disk, wait until the download has completed
+*% (the animation of the browser logo must stop) and then use the
+*% "Save as..." command in the "File" menu of your browser or in the
+*% pop-up manu when you click on this document with the right mouse button.
+*% DO NOT cut and paste this file into an editor with your mouse. This can
+*% introduce additional line breaks which lead to unexpected results.
+*%
+*% You may save this file as 'HP-Color_LaserJet_2600n-foo2hp.ppd'
+*%
+*%
+*FormatVersion: "4.3"
+*FileVersion: "1.1"
+*LanguageVersion: English
+*LanguageEncoding: ISOLatin1
+*PCFileName: "FOO2HP.PPD"
+*Manufacturer: "HP"
+*Product: "(HP Color LaserJet 2600n)"
+*cupsVersion: 1.0
+*cupsManualCopies: True
+*cupsModelNumber: 2
+*cupsFilter: "application/vnd.cups-postscript 0 foomatic-rip"
+*%pprRIP: foomatic-rip other
+*ModelName: "HP Color LaserJet 2600n"
+*ShortNickName: "HP Color LaserJet 2600n foo2hp"
+*NickName: "HP Color LaserJet 2600n Foomatic/foo2hp (recommended)"
+*PSVersion: "(3010.000) 550"
+*PSVersion: "(3010.000) 651"
+*PSVersion: "(3010.000) 652"
+*PSVersion: "(3010.000) 653"
+*PSVersion: "(3010.000) 704"
+*PSVersion: "(3010.000) 705"
+*PSVersion: "(3010.000) 800"
+*LanguageLevel: "3"
+*ColorDevice: True
+*DefaultColorSpace: RGB
+*FileSystem: False
+*Throughput: "1"
+*LandscapeOrientation: Plus90
+*TTRasterizer: Type42
+*1284DeviceID: "MFG:Hewlett-Packard;MDL:HP Color LaserJet 2600n;CMD:ACL;DES:HP Color LaserJet 2600n;"
+
+
+
+*VariablePaperSize: False
+
+*FoomaticIDs: HP-Color_LaserJet_2600n foo2hp
+*FoomaticRIPCommandLine: "foo2hp2600-wrapper %A"
+
+*OpenGroup: General/General
+
+*OpenUI *PageSize/Page Size: PickOne
+*FoomaticRIPOption PageSize: enum CmdLine A
+*OrderDependency: 135 AnySetup *PageSize
+*DefaultPageSize: Letter
+*PageSize Letter/Letter: "%% FoomaticRIPOptionSetting: PageSize=Letter"
+*FoomaticRIPOptionSetting PageSize=Letter: "-p1 "
+*PageSize A4/A4: "%% FoomaticRIPOptionSetting: PageSize=A4"
+*FoomaticRIPOptionSetting PageSize=A4: "-p9 "
+*PageSize A5/A5: "%% FoomaticRIPOptionSetting: PageSize=A5"
+*FoomaticRIPOptionSetting PageSize=A5: "-p11 "
+*PageSize B5/B5: "%% FoomaticRIPOptionSetting: PageSize=B5"
+*FoomaticRIPOptionSetting PageSize=B5: "-p13 "
+*PageSize Env10/Env #10: "%% FoomaticRIPOptionSetting: PageSize=Env10"
+*FoomaticRIPOptionSetting PageSize=Env10: "-p20 "
+*PageSize EnvB5/Env B5: "%% FoomaticRIPOptionSetting: PageSize=EnvB5"
+*FoomaticRIPOptionSetting PageSize=EnvB5: "-p34 "
+*PageSize EnvC5/Env C5: "%% FoomaticRIPOptionSetting: PageSize=EnvC5"
+*FoomaticRIPOptionSetting PageSize=EnvC5: "-p28 "
+*PageSize EnvDL/Env DL: "%% FoomaticRIPOptionSetting: PageSize=EnvDL"
+*FoomaticRIPOptionSetting PageSize=EnvDL: "-p27 "
+*PageSize EnvMonarch/Env Monarch: "%% FoomaticRIPOptionSetting: PageSize=EnvMonarch"
+*FoomaticRIPOptionSetting PageSize=EnvMonarch: "-p37 "
+*PageSize Executive/Executive: "%% FoomaticRIPOptionSetting: PageSize=Executive"
+*FoomaticRIPOptionSetting PageSize=Executive: "-p7 "
+*PageSize Legal/Legal: "%% FoomaticRIPOptionSetting: PageSize=Legal"
+*FoomaticRIPOptionSetting PageSize=Legal: "-p5 "
+*CloseUI: *PageSize
+
+*OpenUI *PageRegion: PickOne
+*OrderDependency: 135 AnySetup *PageRegion
+*DefaultPageRegion: Letter
+*PageRegion Letter/Letter: "%% FoomaticRIPOptionSetting: PageSize=Letter"
+*PageRegion A4/A4: "%% FoomaticRIPOptionSetting: PageSize=A4"
+*PageRegion A5/A5: "%% FoomaticRIPOptionSetting: PageSize=A5"
+*PageRegion B5/B5: "%% FoomaticRIPOptionSetting: PageSize=B5"
+*PageRegion Env10/Env #10: "%% FoomaticRIPOptionSetting: PageSize=Env10"
+*PageRegion EnvB5/Env B5: "%% FoomaticRIPOptionSetting: PageSize=EnvB5"
+*PageRegion EnvC5/Env C5: "%% FoomaticRIPOptionSetting: PageSize=EnvC5"
+*PageRegion EnvDL/Env DL: "%% FoomaticRIPOptionSetting: PageSize=EnvDL"
+*PageRegion EnvMonarch/Env Monarch: "%% FoomaticRIPOptionSetting: PageSize=EnvMonarch"
+*PageRegion Executive/Executive: "%% FoomaticRIPOptionSetting: PageSize=Executive"
+*PageRegion Legal/Legal: "%% FoomaticRIPOptionSetting: PageSize=Legal"
+*CloseUI: *PageRegion
+
+*DefaultImageableArea: Letter
+*ImageableArea Letter/Letter: "12.00 12.00 600.00 780.00"
+*ImageableArea A4/A4: "12.00 12.00 583.00 830.00"
+*ImageableArea A5/A5: "12.00 12.00 408.00 583.00"
+*ImageableArea B5/B5: "12.00 12.00 486.00 696.00"
+*ImageableArea Env10/Env #10: "12.00 12.00 285.00 672.00"
+*ImageableArea EnvB5/Env B5: "12.00 12.00 486.00 696.00"
+*ImageableArea EnvC5/Env C5: "12.00 12.00 447.00 637.00"
+*ImageableArea EnvDL/Env DL: "12.00 12.00 299.00 611.00"
+*ImageableArea EnvMonarch/Env Monarch: "12.00 12.00 267.00 528.00"
+*ImageableArea Executive/Executive: "12.00 12.00 510.00 744.00"
+*ImageableArea Legal/Legal: "12.00 12.00 600.00 996.00"
+
+*DefaultPaperDimension: Letter
+*PaperDimension Letter/Letter: "612 792"
+*PaperDimension A4/A4: "595 842"
+*PaperDimension A5/A5: "420 595"
+*PaperDimension B5/B5: "498 708"
+*PaperDimension Env10/Env #10: "297 684"
+*PaperDimension EnvB5/Env B5: "498 708"
+*PaperDimension EnvC5/Env C5: "459 649"
+*PaperDimension EnvDL/Env DL: "311 623"
+*PaperDimension EnvMonarch/Env Monarch: "279 540"
+*PaperDimension Executive/Executive: "522 756"
+*PaperDimension Legal/Legal: "612 1008"
+
+*OpenUI *InputSlot/Media Source: PickOne
+*FoomaticRIPOption InputSlot: enum CmdLine A
+*OrderDependency: 150 AnySetup *InputSlot
+*DefaultInputSlot: Auto
+*InputSlot Tray1/Tray 1: "%% FoomaticRIPOptionSetting: InputSlot=Tray1"
+*FoomaticRIPOptionSetting InputSlot=Tray1: "-s4 "
+*InputSlot Tray2/Tray 2: "%% FoomaticRIPOptionSetting: InputSlot=Tray2"
+*FoomaticRIPOptionSetting InputSlot=Tray2: "-s1 "
+*InputSlot Tray3/Tray 3: "%% FoomaticRIPOptionSetting: InputSlot=Tray3"
+*FoomaticRIPOptionSetting InputSlot=Tray3: "-s2 "
+*InputSlot Auto/Auto Select: "%% FoomaticRIPOptionSetting: InputSlot=Auto"
+*FoomaticRIPOptionSetting InputSlot=Auto: "-s7 "
+*CloseUI: *InputSlot
+
+*OpenUI *MediaType/Media Type: PickOne
+*FoomaticRIPOption MediaType: enum CmdLine A
+*OrderDependency: 150 AnySetup *MediaType
+*DefaultMediaType: Plain
+*MediaType Plain/Plain: "%% FoomaticRIPOptionSetting: MediaType=Plain"
+*FoomaticRIPOptionSetting MediaType=Plain: "-m1 "
+*MediaType photo/HP Color Laser Photo Paper: "%% FoomaticRIPOptionSetting: MediaType=photo"
+*FoomaticRIPOptionSetting MediaType=photo: "-m278 "
+*MediaType Bond/Bond: "%% FoomaticRIPOptionSetting: MediaType=Bond"
+*FoomaticRIPOptionSetting MediaType=Bond: "-m260 "
+*MediaType Cardstock/Cardstock: "%% FoomaticRIPOptionSetting: MediaType=Cardstock"
+*FoomaticRIPOptionSetting MediaType=Cardstock: "-m261 "
+*MediaType Color/Color: "%% FoomaticRIPOptionSetting: MediaType=Color"
+*FoomaticRIPOptionSetting MediaType=Color: "-m512 "
+*MediaType Cover/HP Premium Cover: "%% FoomaticRIPOptionSetting: MediaType=Cover"
+*FoomaticRIPOptionSetting MediaType=Cover: "-m277 "
+*MediaType Envelope/Envelope: "%% FoomaticRIPOptionSetting: MediaType=Envelope"
+*FoomaticRIPOptionSetting MediaType=Envelope: "-m267 "
+*MediaType Glossy/Glossy: "%% FoomaticRIPOptionSetting: MediaType=Glossy"
+*FoomaticRIPOptionSetting MediaType=Glossy: "-m269 "
+*MediaType Heavy/Heavy: "%% FoomaticRIPOptionSetting: MediaType=Heavy"
+*FoomaticRIPOptionSetting MediaType=Heavy: "-m262 "
+*MediaType HeavyGlossy/Heavy Glossy: "%% FoomaticRIPOptionSetting: MediaType=HeavyGlossy"
+*FoomaticRIPOptionSetting MediaType=HeavyGlossy: "-m270 "
+*MediaType Labels/Labels: "%% FoomaticRIPOptionSetting: MediaType=Labels"
+*FoomaticRIPOptionSetting MediaType=Labels: "-m265 "
+*MediaType Letterhead/Letterhead: "%% FoomaticRIPOptionSetting: MediaType=Letterhead"
+*FoomaticRIPOptionSetting MediaType=Letterhead: "-m513 "
+*MediaType Light/Light: "%% FoomaticRIPOptionSetting: MediaType=Light"
+*FoomaticRIPOptionSetting MediaType=Light: "-m258 "
+*MediaType LightGlossy/Light Glossy: "%% FoomaticRIPOptionSetting: MediaType=LightGlossy"
+*FoomaticRIPOptionSetting MediaType=LightGlossy: "-m268 "
+*MediaType Preprinted/Preprinted: "%% FoomaticRIPOptionSetting: MediaType=Preprinted"
+*FoomaticRIPOptionSetting MediaType=Preprinted: "-m514 "
+*MediaType Prepunched/Prepunched: "%% FoomaticRIPOptionSetting: MediaType=Prepunched"
+*FoomaticRIPOptionSetting MediaType=Prepunched: "-m515 "
+*MediaType Recycled/Recycled: "%% FoomaticRIPOptionSetting: MediaType=Recycled"
+*FoomaticRIPOptionSetting MediaType=Recycled: "-m516 "
+*MediaType Tough/Tough: "%% FoomaticRIPOptionSetting: MediaType=Tough"
+*FoomaticRIPOptionSetting MediaType=Tough: "-m276 "
+*MediaType Transparency/Transparency: "%% FoomaticRIPOptionSetting: MediaType=Transparency"
+*FoomaticRIPOptionSetting MediaType=Transparency: "-m2 "
+*CloseUI: *MediaType
+
+*OpenUI *Duplex/Duplex Printing: PickOne
+*FoomaticRIPOption Duplex: enum CmdLine A
+*OrderDependency: 210 AnySetup *Duplex
+*DefaultDuplex: None
+*Duplex DuplexNoTumble/Long Edge (Standard): "%% FoomaticRIPOptionSetting: Duplex=DuplexNoTumble"
+*FoomaticRIPOptionSetting Duplex=DuplexNoTumble: "-d2 "
+*Duplex DuplexTumble/Short Edge (Flip): "%% FoomaticRIPOptionSetting: Duplex=DuplexTumble"
+*FoomaticRIPOptionSetting Duplex=DuplexTumble: "-d3 "
+*Duplex None/Off: "%% FoomaticRIPOptionSetting: Duplex=None"
+*FoomaticRIPOptionSetting Duplex=None: "-d1 "
+*CloseUI: *Duplex
+
+*OpenUI *Quality/Printing Quality: PickOne
+*FoomaticRIPOption Quality: enum CmdLine A
+*OrderDependency: 110 AnySetup *Quality
+*DefaultQuality: normal
+*Quality draft/Draft Mode: "%% FoomaticRIPOptionSetting: Quality=draft"
+*FoomaticRIPOptionSetting Quality=draft: " -t "
+*Quality normal/Normal Mode: "%% FoomaticRIPOptionSetting: Quality=normal"
+*FoomaticRIPOptionSetting Quality=normal: " "
+*CloseUI: *Quality
+
+*OpenUI *ColorMode/Color Mode: PickOne
+*FoomaticRIPOption ColorMode: enum CmdLine A
+*OrderDependency: 120 AnySetup *ColorMode
+*DefaultColorMode: Monochrome
+*ColorMode Color/Color: "%% FoomaticRIPOptionSetting: ColorMode=Color"
+*FoomaticRIPOptionSetting ColorMode=Color: "-c "
+*ColorMode Monochrome/Monochrome: "%% FoomaticRIPOptionSetting: ColorMode=Monochrome"
+*FoomaticRIPOptionSetting ColorMode=Monochrome: " "
+*CloseUI: *ColorMode
+
+*OpenUI *BitsPerPlane/Bits Per Plane: PickOne
+*FoomaticRIPOption BitsPerPlane: enum CmdLine A
+*OrderDependency: 120 AnySetup *BitsPerPlane
+*DefaultBitsPerPlane: 1-BPP
+*BitsPerPlane 1-BPP/1 Bit Per Plane: "%% FoomaticRIPOptionSetting: BitsPerPlane=1-BPP"
+*FoomaticRIPOptionSetting BitsPerPlane=1-BPP: "-b1 "
+*BitsPerPlane 2-BPP/2 Bits Per Plane: "%% FoomaticRIPOptionSetting: BitsPerPlane=2-BPP"
+*FoomaticRIPOptionSetting BitsPerPlane=2-BPP: "-b2 "
+*CloseUI: *BitsPerPlane
+
+*OpenUI *Copies/Copies: PickOne
+*FoomaticRIPOption Copies: int CmdLine A
+*FoomaticRIPOptionPrototype Copies: "-n%s "
+*FoomaticRIPOptionRange Copies: 1 100
+*OrderDependency: 220 AnySetup *Copies
+*DefaultCopies: 1
+*FoomaticRIPDefaultCopies: 1
+*Copies 1/1: "%% FoomaticRIPOptionSetting: Copies=1"
+*Copies 2/2: "%% FoomaticRIPOptionSetting: Copies=2"
+*Copies 3/3: "%% FoomaticRIPOptionSetting: Copies=3"
+*Copies 4/4: "%% FoomaticRIPOptionSetting: Copies=4"
+*Copies 5/5: "%% FoomaticRIPOptionSetting: Copies=5"
+*Copies 6/6: "%% FoomaticRIPOptionSetting: Copies=6"
+*Copies 7/7: "%% FoomaticRIPOptionSetting: Copies=7"
+*Copies 8/8: "%% FoomaticRIPOptionSetting: Copies=8"
+*Copies 9/9: "%% FoomaticRIPOptionSetting: Copies=9"
+*Copies 10/10: "%% FoomaticRIPOptionSetting: Copies=10"
+*Copies 11/11: "%% FoomaticRIPOptionSetting: Copies=11"
+*Copies 12/12: "%% FoomaticRIPOptionSetting: Copies=12"
+*Copies 13/13: "%% FoomaticRIPOptionSetting: Copies=13"
+*Copies 14/14: "%% FoomaticRIPOptionSetting: Copies=14"
+*Copies 15/15: "%% FoomaticRIPOptionSetting: Copies=15"
+*Copies 16/16: "%% FoomaticRIPOptionSetting: Copies=16"
+*Copies 17/17: "%% FoomaticRIPOptionSetting: Copies=17"
+*Copies 18/18: "%% FoomaticRIPOptionSetting: Copies=18"
+*Copies 19/19: "%% FoomaticRIPOptionSetting: Copies=19"
+*Copies 20/20: "%% FoomaticRIPOptionSetting: Copies=20"
+*Copies 21/21: "%% FoomaticRIPOptionSetting: Copies=21"
+*Copies 22/22: "%% FoomaticRIPOptionSetting: Copies=22"
+*Copies 23/23: "%% FoomaticRIPOptionSetting: Copies=23"
+*Copies 24/24: "%% FoomaticRIPOptionSetting: Copies=24"
+*Copies 25/25: "%% FoomaticRIPOptionSetting: Copies=25"
+*Copies 26/26: "%% FoomaticRIPOptionSetting: Copies=26"
+*Copies 27/27: "%% FoomaticRIPOptionSetting: Copies=27"
+*Copies 28/28: "%% FoomaticRIPOptionSetting: Copies=28"
+*Copies 29/29: "%% FoomaticRIPOptionSetting: Copies=29"
+*Copies 30/30: "%% FoomaticRIPOptionSetting: Copies=30"
+*Copies 31/31: "%% FoomaticRIPOptionSetting: Copies=31"
+*Copies 32/32: "%% FoomaticRIPOptionSetting: Copies=32"
+*Copies 33/33: "%% FoomaticRIPOptionSetting: Copies=33"
+*Copies 34/34: "%% FoomaticRIPOptionSetting: Copies=34"
+*Copies 35/35: "%% FoomaticRIPOptionSetting: Copies=35"
+*Copies 36/36: "%% FoomaticRIPOptionSetting: Copies=36"
+*Copies 37/37: "%% FoomaticRIPOptionSetting: Copies=37"
+*Copies 38/38: "%% FoomaticRIPOptionSetting: Copies=38"
+*Copies 39/39: "%% FoomaticRIPOptionSetting: Copies=39"
+*Copies 40/40: "%% FoomaticRIPOptionSetting: Copies=40"
+*Copies 41/41: "%% FoomaticRIPOptionSetting: Copies=41"
+*Copies 42/42: "%% FoomaticRIPOptionSetting: Copies=42"
+*Copies 43/43: "%% FoomaticRIPOptionSetting: Copies=43"
+*Copies 44/44: "%% FoomaticRIPOptionSetting: Copies=44"
+*Copies 45/45: "%% FoomaticRIPOptionSetting: Copies=45"
+*Copies 46/46: "%% FoomaticRIPOptionSetting: Copies=46"
+*Copies 47/47: "%% FoomaticRIPOptionSetting: Copies=47"
+*Copies 48/48: "%% FoomaticRIPOptionSetting: Copies=48"
+*Copies 49/49: "%% FoomaticRIPOptionSetting: Copies=49"
+*Copies 50/50: "%% FoomaticRIPOptionSetting: Copies=50"
+*Copies 51/51: "%% FoomaticRIPOptionSetting: Copies=51"
+*Copies 52/52: "%% FoomaticRIPOptionSetting: Copies=52"
+*Copies 53/53: "%% FoomaticRIPOptionSetting: Copies=53"
+*Copies 54/54: "%% FoomaticRIPOptionSetting: Copies=54"
+*Copies 55/55: "%% FoomaticRIPOptionSetting: Copies=55"
+*Copies 56/56: "%% FoomaticRIPOptionSetting: Copies=56"
+*Copies 57/57: "%% FoomaticRIPOptionSetting: Copies=57"
+*Copies 58/58: "%% FoomaticRIPOptionSetting: Copies=58"
+*Copies 59/59: "%% FoomaticRIPOptionSetting: Copies=59"
+*Copies 60/60: "%% FoomaticRIPOptionSetting: Copies=60"
+*Copies 61/61: "%% FoomaticRIPOptionSetting: Copies=61"
+*Copies 62/62: "%% FoomaticRIPOptionSetting: Copies=62"
+*Copies 63/63: "%% FoomaticRIPOptionSetting: Copies=63"
+*Copies 64/64: "%% FoomaticRIPOptionSetting: Copies=64"
+*Copies 65/65: "%% FoomaticRIPOptionSetting: Copies=65"
+*Copies 66/66: "%% FoomaticRIPOptionSetting: Copies=66"
+*Copies 67/67: "%% FoomaticRIPOptionSetting: Copies=67"
+*Copies 68/68: "%% FoomaticRIPOptionSetting: Copies=68"
+*Copies 69/69: "%% FoomaticRIPOptionSetting: Copies=69"
+*Copies 70/70: "%% FoomaticRIPOptionSetting: Copies=70"
+*Copies 71/71: "%% FoomaticRIPOptionSetting: Copies=71"
+*Copies 72/72: "%% FoomaticRIPOptionSetting: Copies=72"
+*Copies 73/73: "%% FoomaticRIPOptionSetting: Copies=73"
+*Copies 74/74: "%% FoomaticRIPOptionSetting: Copies=74"
+*Copies 75/75: "%% FoomaticRIPOptionSetting: Copies=75"
+*Copies 76/76: "%% FoomaticRIPOptionSetting: Copies=76"
+*Copies 77/77: "%% FoomaticRIPOptionSetting: Copies=77"
+*Copies 78/78: "%% FoomaticRIPOptionSetting: Copies=78"
+*Copies 79/79: "%% FoomaticRIPOptionSetting: Copies=79"
+*Copies 80/80: "%% FoomaticRIPOptionSetting: Copies=80"
+*Copies 81/81: "%% FoomaticRIPOptionSetting: Copies=81"
+*Copies 82/82: "%% FoomaticRIPOptionSetting: Copies=82"
+*Copies 83/83: "%% FoomaticRIPOptionSetting: Copies=83"
+*Copies 84/84: "%% FoomaticRIPOptionSetting: Copies=84"
+*Copies 85/85: "%% FoomaticRIPOptionSetting: Copies=85"
+*Copies 86/86: "%% FoomaticRIPOptionSetting: Copies=86"
+*Copies 87/87: "%% FoomaticRIPOptionSetting: Copies=87"
+*Copies 88/88: "%% FoomaticRIPOptionSetting: Copies=88"
+*Copies 89/89: "%% FoomaticRIPOptionSetting: Copies=89"
+*Copies 90/90: "%% FoomaticRIPOptionSetting: Copies=90"
+*Copies 91/91: "%% FoomaticRIPOptionSetting: Copies=91"
+*Copies 92/92: "%% FoomaticRIPOptionSetting: Copies=92"
+*Copies 93/93: "%% FoomaticRIPOptionSetting: Copies=93"
+*Copies 94/94: "%% FoomaticRIPOptionSetting: Copies=94"
+*Copies 95/95: "%% FoomaticRIPOptionSetting: Copies=95"
+*Copies 96/96: "%% FoomaticRIPOptionSetting: Copies=96"
+*Copies 97/97: "%% FoomaticRIPOptionSetting: Copies=97"
+*Copies 98/98: "%% FoomaticRIPOptionSetting: Copies=98"
+*Copies 99/99: "%% FoomaticRIPOptionSetting: Copies=99"
+*Copies 100/100: "%% FoomaticRIPOptionSetting: Copies=100"
+*CloseUI: *Copies
+
+*CloseGroup: General
+
+*OpenGroup: Adjustment/Adjustment
+
+*OpenUI *ICM/ICM Color Profile: PickOne
+*FoomaticRIPOption ICM: enum CmdLine A
+*OrderDependency: 300 AnySetup *ICM
+*DefaultICM: default
+*ICM default/Default ICM color correction: "%% FoomaticRIPOptionSetting: ICM=default"
+*FoomaticRIPOptionSetting ICM=default: "-Gdefault "
+*ICM hpclj2600n-0/File hpclj2600n-0.icm: "%% FoomaticRIPOptionSetting: ICM=hpclj2600n-0"
+*FoomaticRIPOptionSetting ICM=hpclj2600n-0: "-Ghpclj2600n-0.icm "
+*ICM hpclj2600n-1/File ICCFactory 1: "%% FoomaticRIPOptionSetting: ICM=hpclj2600n-1"
+*FoomaticRIPOptionSetting ICM=hpclj2600n-1: "-Ghpclj2600n-1.icm "
+*ICM km2430_2/File km2430_2.icm: "%% FoomaticRIPOptionSetting: ICM=km2430_2"
+*FoomaticRIPOptionSetting ICM=km2430_2: "-Gkm2430_2.icm "
+*ICM none/No ICM color correction: "%% FoomaticRIPOptionSetting: ICM=none"
+*FoomaticRIPOptionSetting ICM=none: "-Gnone "
+*ICM testing/File testing.icm: "%% FoomaticRIPOptionSetting: ICM=testing"
+*FoomaticRIPOptionSetting ICM=testing: "-Gtesting.icm "
+*ICM user1/File user1.icm: "%% FoomaticRIPOptionSetting: ICM=user1"
+*FoomaticRIPOptionSetting ICM=user1: "-Guser1.icm "
+*ICM user2/File user2.icm: "%% FoomaticRIPOptionSetting: ICM=user2"
+*FoomaticRIPOptionSetting ICM=user2: "-Guser2.icm "
+*ICM user3/File user3.icm: "%% FoomaticRIPOptionSetting: ICM=user3"
+*FoomaticRIPOptionSetting ICM=user3: "-Guser3.icm "
+*ICM user4/File user4.icm: "%% FoomaticRIPOptionSetting: ICM=user4"
+*FoomaticRIPOptionSetting ICM=user4: "-Guser4.icm "
+*CloseUI: *ICM
+
+*CloseGroup: Adjustment
+
+*OpenGroup: Miscellaneous/Miscellaneous
+
+*OpenUI *Nup/N-up Printing: PickOne
+*FoomaticRIPOption Nup: enum CmdLine A
+*OrderDependency: 200 AnySetup *Nup
+*DefaultNup: 1up
+*Nup 1up/1-up: "%% FoomaticRIPOptionSetting: Nup=1up"
+*FoomaticRIPOptionSetting Nup=1up: " "
+*Nup 2up/2-up: "%% FoomaticRIPOptionSetting: Nup=2up"
+*FoomaticRIPOptionSetting Nup=2up: "-2 "
+*Nup 3up/3-up: "%% FoomaticRIPOptionSetting: Nup=3up"
+*FoomaticRIPOptionSetting Nup=3up: "-3 "
+*Nup 4up/4-up: "%% FoomaticRIPOptionSetting: Nup=4up"
+*FoomaticRIPOptionSetting Nup=4up: "-4 "
+*Nup 6up/6-up: "%% FoomaticRIPOptionSetting: Nup=6up"
+*FoomaticRIPOptionSetting Nup=6up: "-6 "
+*Nup 8up/8-up: "%% FoomaticRIPOptionSetting: Nup=8up"
+*FoomaticRIPOptionSetting Nup=8up: "-8 "
+*Nup 10up/10-up: "%% FoomaticRIPOptionSetting: Nup=10up"
+*FoomaticRIPOptionSetting Nup=10up: "-10 "
+*Nup 12up/12-up: "%% FoomaticRIPOptionSetting: Nup=12up"
+*FoomaticRIPOptionSetting Nup=12up: "-12 "
+*Nup 14up/14-up: "%% FoomaticRIPOptionSetting: Nup=14up"
+*FoomaticRIPOptionSetting Nup=14up: "-14 "
+*Nup 15up/15-up: "%% FoomaticRIPOptionSetting: Nup=15up"
+*FoomaticRIPOptionSetting Nup=15up: "-15 "
+*Nup 16up/16-up: "%% FoomaticRIPOptionSetting: Nup=16up"
+*FoomaticRIPOptionSetting Nup=16up: "-16 "
+*Nup 18up/18-up: "%% FoomaticRIPOptionSetting: Nup=18up"
+*FoomaticRIPOptionSetting Nup=18up: "-18 "
+*CloseUI: *Nup
+
+*OpenUI *NupOrient/N-up Orientation: PickOne
+*FoomaticRIPOption NupOrient: enum CmdLine A
+*OrderDependency: 200 AnySetup *NupOrient
+*DefaultNupOrient: port
+*NupOrient land/Landscape: "%% FoomaticRIPOptionSetting: NupOrient=land"
+*FoomaticRIPOptionSetting NupOrient=land: "-ol "
+*NupOrient port/Portrait: "%% FoomaticRIPOptionSetting: NupOrient=port"
+*FoomaticRIPOptionSetting NupOrient=port: " "
+*NupOrient sea/Seascape: "%% FoomaticRIPOptionSetting: NupOrient=sea"
+*FoomaticRIPOptionSetting NupOrient=sea: "-os "
+*CloseUI: *NupOrient
+
+*CloseGroup: Miscellaneous
+
+
+*% Generic boilerplate PPD stuff as standard PostScript fonts and so on
+
+*DefaultFont: Courier
+*Font AvantGarde-Book: Standard "(001.006S)" Standard ROM
+*Font AvantGarde-BookOblique: Standard "(001.006S)" Standard ROM
+*Font AvantGarde-Demi: Standard "(001.007S)" Standard ROM
+*Font AvantGarde-DemiOblique: Standard "(001.007S)" Standard ROM
+*Font Bookman-Demi: Standard "(001.004S)" Standard ROM
+*Font Bookman-DemiItalic: Standard "(001.004S)" Standard ROM
+*Font Bookman-Light: Standard "(001.004S)" Standard ROM
+*Font Bookman-LightItalic: Standard "(001.004S)" Standard ROM
+*Font Courier: Standard "(002.004S)" Standard ROM
+*Font Courier-Bold: Standard "(002.004S)" Standard ROM
+*Font Courier-BoldOblique: Standard "(002.004S)" Standard ROM
+*Font Courier-Oblique: Standard "(002.004S)" Standard ROM
+*Font Helvetica: Standard "(001.006S)" Standard ROM
+*Font Helvetica-Bold: Standard "(001.007S)" Standard ROM
+*Font Helvetica-BoldOblique: Standard "(001.007S)" Standard ROM
+*Font Helvetica-Narrow: Standard "(001.006S)" Standard ROM
+*Font Helvetica-Narrow-Bold: Standard "(001.007S)" Standard ROM
+*Font Helvetica-Narrow-BoldOblique: Standard "(001.007S)" Standard ROM
+*Font Helvetica-Narrow-Oblique: Standard "(001.006S)" Standard ROM
+*Font Helvetica-Oblique: Standard "(001.006S)" Standard ROM
+*Font NewCenturySchlbk-Bold: Standard "(001.009S)" Standard ROM
+*Font NewCenturySchlbk-BoldItalic: Standard "(001.007S)" Standard ROM
+*Font NewCenturySchlbk-Italic: Standard "(001.006S)" Standard ROM
+*Font NewCenturySchlbk-Roman: Standard "(001.007S)" Standard ROM
+*Font Palatino-Bold: Standard "(001.005S)" Standard ROM
+*Font Palatino-BoldItalic: Standard "(001.005S)" Standard ROM
+*Font Palatino-Italic: Standard "(001.005S)" Standard ROM
+*Font Palatino-Roman: Standard "(001.005S)" Standard ROM
+*Font Symbol: Special "(001.007S)" Special ROM
+*Font Times-Bold: Standard "(001.007S)" Standard ROM
+*Font Times-BoldItalic: Standard "(001.009S)" Standard ROM
+*Font Times-Italic: Standard "(001.007S)" Standard ROM
+*Font Times-Roman: Standard "(001.007S)" Standard ROM
+*Font ZapfChancery-MediumItalic: Standard "(001.007S)" Standard ROM
+*Font ZapfDingbats: Special "(001.004S)" Standard ROM
+
diff --git a/PPD/HP-LaserJet_1000.ppd b/PPD/HP-LaserJet_1000.ppd
new file mode 100644
index 0000000..41d55fe
--- /dev/null
+++ b/PPD/HP-LaserJet_1000.ppd
@@ -0,0 +1,389 @@
+*PPD-Adobe: "4.3"
+*%
+*% For information on using this, and to obtain the required backend
+*% script, consult http://www.linuxprinting.org/
+*%
+*% This file is published under the GNU General Public License
+*%
+*% PPD-O-MATIC (3.0.0 or newer) generated this PPD file. It is for use with
+*% all programs and environments which use PPD files for dealing with
+*% printer capability information. The printer must be configured with the
+*% "foomatic-rip" backend filter script of Foomatic 3.0.0 or newer. This
+*% file and "foomatic-rip" work together to support PPD-controlled printer
+*% driver option access with arbitrary free software printer drivers and
+*% printing spoolers.
+*%
+*% To save this file on your disk, wait until the download has completed
+*% (the animation of the browser logo must stop) and then use the
+*% "Save as..." command in the "File" menu of your browser or in the
+*% pop-up manu when you click on this document with the right mouse button.
+*% DO NOT cut and paste this file into an editor with your mouse. This can
+*% introduce additional line breaks which lead to unexpected results.
+*%
+*% You may save this file as 'HP-LaserJet_1000-foo2zjs.ppd'
+*%
+*%
+*FormatVersion: "4.3"
+*FileVersion: "1.1"
+*LanguageVersion: English
+*LanguageEncoding: ISOLatin1
+*PCFileName: "FOO2ZJS.PPD"
+*Manufacturer: "HP"
+*Product: "(hp LaserJet 1000)"
+*cupsVersion: 1.0
+*cupsManualCopies: True
+*cupsModelNumber: 2
+*cupsFilter: "application/vnd.cups-postscript 0 foomatic-rip"
+*%pprRIP: foomatic-rip other
+*ModelName: "HP LaserJet 1000"
+*ShortNickName: "HP LaserJet 1000 foo2zjs"
+*NickName: "HP LaserJet 1000 Foomatic/foo2zjs (recommended)"
+*PSVersion: "(3010.000) 550"
+*PSVersion: "(3010.000) 651"
+*PSVersion: "(3010.000) 652"
+*PSVersion: "(3010.000) 653"
+*PSVersion: "(3010.000) 704"
+*PSVersion: "(3010.000) 705"
+*PSVersion: "(3010.000) 800"
+*LanguageLevel: "3"
+*ColorDevice: False
+*DefaultColorSpace: Gray
+*FileSystem: False
+*Throughput: "1"
+*LandscapeOrientation: Plus90
+*TTRasterizer: Type42
+*1284DeviceID: "MFG:Hewlett-Packard;MDL:hp LaserJet 1000;CMD:ZJS;DES:hp LaserJet 1000;"
+
+
+
+*VariablePaperSize: False
+
+*FoomaticIDs: HP-LaserJet_1000 foo2zjs
+*FoomaticRIPCommandLine: "foo2zjs-wrapper %A"
+
+*OpenGroup: General/General
+
+*OpenUI *PageSize/Page Size: PickOne
+*FoomaticRIPOption PageSize: enum CmdLine A
+*OrderDependency: 135 AnySetup *PageSize
+*DefaultPageSize: Letter
+*PageSize Letter/Letter: "%% FoomaticRIPOptionSetting: PageSize=Letter"
+*FoomaticRIPOptionSetting PageSize=Letter: "-p1 "
+*PageSize A4/A4: "%% FoomaticRIPOptionSetting: PageSize=A4"
+*FoomaticRIPOptionSetting PageSize=A4: "-p9 "
+*PageSize A5/A5: "%% FoomaticRIPOptionSetting: PageSize=A5"
+*FoomaticRIPOptionSetting PageSize=A5: "-p11 "
+*PageSize B5/B5: "%% FoomaticRIPOptionSetting: PageSize=B5"
+*FoomaticRIPOptionSetting PageSize=B5: "-p13 "
+*PageSize Env10/Env #10: "%% FoomaticRIPOptionSetting: PageSize=Env10"
+*FoomaticRIPOptionSetting PageSize=Env10: "-p20 "
+*PageSize EnvB5/Env B5: "%% FoomaticRIPOptionSetting: PageSize=EnvB5"
+*FoomaticRIPOptionSetting PageSize=EnvB5: "-p34 "
+*PageSize EnvC5/Env C5: "%% FoomaticRIPOptionSetting: PageSize=EnvC5"
+*FoomaticRIPOptionSetting PageSize=EnvC5: "-p28 "
+*PageSize EnvDL/Env DL: "%% FoomaticRIPOptionSetting: PageSize=EnvDL"
+*FoomaticRIPOptionSetting PageSize=EnvDL: "-p27 "
+*PageSize EnvMonarch/Env Monarch: "%% FoomaticRIPOptionSetting: PageSize=EnvMonarch"
+*FoomaticRIPOptionSetting PageSize=EnvMonarch: "-p37 "
+*PageSize Executive/Executive: "%% FoomaticRIPOptionSetting: PageSize=Executive"
+*FoomaticRIPOptionSetting PageSize=Executive: "-p7 "
+*PageSize Legal/Legal: "%% FoomaticRIPOptionSetting: PageSize=Legal"
+*FoomaticRIPOptionSetting PageSize=Legal: "-p5 "
+*CloseUI: *PageSize
+
+*OpenUI *PageRegion: PickOne
+*OrderDependency: 135 AnySetup *PageRegion
+*DefaultPageRegion: Letter
+*PageRegion Letter/Letter: "%% FoomaticRIPOptionSetting: PageSize=Letter"
+*PageRegion A4/A4: "%% FoomaticRIPOptionSetting: PageSize=A4"
+*PageRegion A5/A5: "%% FoomaticRIPOptionSetting: PageSize=A5"
+*PageRegion B5/B5: "%% FoomaticRIPOptionSetting: PageSize=B5"
+*PageRegion Env10/Env #10: "%% FoomaticRIPOptionSetting: PageSize=Env10"
+*PageRegion EnvB5/Env B5: "%% FoomaticRIPOptionSetting: PageSize=EnvB5"
+*PageRegion EnvC5/Env C5: "%% FoomaticRIPOptionSetting: PageSize=EnvC5"
+*PageRegion EnvDL/Env DL: "%% FoomaticRIPOptionSetting: PageSize=EnvDL"
+*PageRegion EnvMonarch/Env Monarch: "%% FoomaticRIPOptionSetting: PageSize=EnvMonarch"
+*PageRegion Executive/Executive: "%% FoomaticRIPOptionSetting: PageSize=Executive"
+*PageRegion Legal/Legal: "%% FoomaticRIPOptionSetting: PageSize=Legal"
+*CloseUI: *PageRegion
+
+*DefaultImageableArea: Letter
+*ImageableArea Letter/Letter: "11.34 11.34 600.66 780.66"
+*ImageableArea A4/A4: "11.34 11.34 583.66 830.66"
+*ImageableArea A5/A5: "11.34 11.34 408.66 583.66"
+*ImageableArea B5/B5: "11.34 11.34 486.66 696.66"
+*ImageableArea Env10/Env #10: "11.34 11.34 285.66 672.66"
+*ImageableArea EnvB5/Env B5: "11.34 11.34 486.66 696.66"
+*ImageableArea EnvC5/Env C5: "11.34 11.34 447.66 637.66"
+*ImageableArea EnvDL/Env DL: "11.34 11.34 299.66 611.66"
+*ImageableArea EnvMonarch/Env Monarch: "11.34 11.34 267.66 528.66"
+*ImageableArea Executive/Executive: "11.34 11.34 510.66 744.66"
+*ImageableArea Legal/Legal: "11.34 11.34 600.66 996.66"
+
+*DefaultPaperDimension: Letter
+*PaperDimension Letter/Letter: "612 792"
+*PaperDimension A4/A4: "595 842"
+*PaperDimension A5/A5: "420 595"
+*PaperDimension B5/B5: "498 708"
+*PaperDimension Env10/Env #10: "297 684"
+*PaperDimension EnvB5/Env B5: "498 708"
+*PaperDimension EnvC5/Env C5: "459 649"
+*PaperDimension EnvDL/Env DL: "311 623"
+*PaperDimension EnvMonarch/Env Monarch: "279 540"
+*PaperDimension Executive/Executive: "522 756"
+*PaperDimension Legal/Legal: "612 1008"
+
+*OpenUI *InputSlot/Media Source: PickOne
+*FoomaticRIPOption InputSlot: enum CmdLine A
+*OrderDependency: 150 AnySetup *InputSlot
+*DefaultInputSlot: Auto
+*InputSlot Upper/Upper or Only One InputSlot: "%% FoomaticRIPOptionSetting: InputSlot=Upper"
+*FoomaticRIPOptionSetting InputSlot=Upper: "-s1 "
+*InputSlot Middle/Middle Tray: "%% FoomaticRIPOptionSetting: InputSlot=Middle"
+*FoomaticRIPOptionSetting InputSlot=Middle: "-s3 "
+*InputSlot Lower/Lower Tray: "%% FoomaticRIPOptionSetting: InputSlot=Lower"
+*FoomaticRIPOptionSetting InputSlot=Lower: "-s2 "
+*InputSlot Auto/Auto Source: "%% FoomaticRIPOptionSetting: InputSlot=Auto"
+*FoomaticRIPOptionSetting InputSlot=Auto: "-s7 "
+*InputSlot Envelope/Envelope: "%% FoomaticRIPOptionSetting: InputSlot=Envelope"
+*FoomaticRIPOptionSetting InputSlot=Envelope: "-s5 "
+*InputSlot Manual/Manual Feed: "%% FoomaticRIPOptionSetting: InputSlot=Manual"
+*FoomaticRIPOptionSetting InputSlot=Manual: "-s4 "
+*CloseUI: *InputSlot
+
+*OpenUI *MediaType/Media Type: PickOne
+*FoomaticRIPOption MediaType: enum CmdLine A
+*OrderDependency: 150 AnySetup *MediaType
+*DefaultMediaType: Standard
+*MediaType Envelope/Envelope: "%% FoomaticRIPOptionSetting: MediaType=Envelope"
+*FoomaticRIPOptionSetting MediaType=Envelope: "-m257 "
+*MediaType Labels/Labels: "%% FoomaticRIPOptionSetting: MediaType=Labels"
+*FoomaticRIPOptionSetting MediaType=Labels: "-m263 "
+*MediaType Letterhead/Letterhead: "%% FoomaticRIPOptionSetting: MediaType=Letterhead"
+*FoomaticRIPOptionSetting MediaType=Letterhead: "-m259 "
+*MediaType Postcard/Postcard: "%% FoomaticRIPOptionSetting: MediaType=Postcard"
+*FoomaticRIPOptionSetting MediaType=Postcard: "-m262 "
+*MediaType Standard/Standard Paper: "%% FoomaticRIPOptionSetting: MediaType=Standard"
+*FoomaticRIPOptionSetting MediaType=Standard: "-m1 "
+*MediaType ThickStock/Thick Stock: "%% FoomaticRIPOptionSetting: MediaType=ThickStock"
+*FoomaticRIPOptionSetting MediaType=ThickStock: "-m261 "
+*MediaType Transparency/Transparency: "%% FoomaticRIPOptionSetting: MediaType=Transparency"
+*FoomaticRIPOptionSetting MediaType=Transparency: "-m2 "
+*CloseUI: *MediaType
+
+*FoomaticRIPOption Resolution: enum CmdLine A 130
+*FoomaticRIPOptionSetting Resolution=600x600dpi: "-r600x600 "
+
+*OpenUI *Quality/Printing Quality: PickOne
+*FoomaticRIPOption Quality: enum CmdLine A
+*OrderDependency: 110 AnySetup *Quality
+*DefaultQuality: normal
+*Quality draft/Draft: "%% FoomaticRIPOptionSetting: Quality=draft"
+*FoomaticRIPOptionSetting Quality=draft: " -t "
+*Quality normal/Normal: "%% FoomaticRIPOptionSetting: Quality=normal"
+*FoomaticRIPOptionSetting Quality=normal: " "
+*CloseUI: *Quality
+
+*FoomaticRIPOption ColorMode: enum CmdLine A 120
+*FoomaticRIPOptionSetting ColorMode=Monochrome: " "
+
+*OpenUI *Copies/Copies: PickOne
+*FoomaticRIPOption Copies: int CmdLine A
+*FoomaticRIPOptionPrototype Copies: "-n%s "
+*FoomaticRIPOptionRange Copies: 1 100
+*OrderDependency: 220 AnySetup *Copies
+*DefaultCopies: 1
+*FoomaticRIPDefaultCopies: 1
+*Copies 1/1: "%% FoomaticRIPOptionSetting: Copies=1"
+*Copies 2/2: "%% FoomaticRIPOptionSetting: Copies=2"
+*Copies 3/3: "%% FoomaticRIPOptionSetting: Copies=3"
+*Copies 4/4: "%% FoomaticRIPOptionSetting: Copies=4"
+*Copies 5/5: "%% FoomaticRIPOptionSetting: Copies=5"
+*Copies 6/6: "%% FoomaticRIPOptionSetting: Copies=6"
+*Copies 7/7: "%% FoomaticRIPOptionSetting: Copies=7"
+*Copies 8/8: "%% FoomaticRIPOptionSetting: Copies=8"
+*Copies 9/9: "%% FoomaticRIPOptionSetting: Copies=9"
+*Copies 10/10: "%% FoomaticRIPOptionSetting: Copies=10"
+*Copies 11/11: "%% FoomaticRIPOptionSetting: Copies=11"
+*Copies 12/12: "%% FoomaticRIPOptionSetting: Copies=12"
+*Copies 13/13: "%% FoomaticRIPOptionSetting: Copies=13"
+*Copies 14/14: "%% FoomaticRIPOptionSetting: Copies=14"
+*Copies 15/15: "%% FoomaticRIPOptionSetting: Copies=15"
+*Copies 16/16: "%% FoomaticRIPOptionSetting: Copies=16"
+*Copies 17/17: "%% FoomaticRIPOptionSetting: Copies=17"
+*Copies 18/18: "%% FoomaticRIPOptionSetting: Copies=18"
+*Copies 19/19: "%% FoomaticRIPOptionSetting: Copies=19"
+*Copies 20/20: "%% FoomaticRIPOptionSetting: Copies=20"
+*Copies 21/21: "%% FoomaticRIPOptionSetting: Copies=21"
+*Copies 22/22: "%% FoomaticRIPOptionSetting: Copies=22"
+*Copies 23/23: "%% FoomaticRIPOptionSetting: Copies=23"
+*Copies 24/24: "%% FoomaticRIPOptionSetting: Copies=24"
+*Copies 25/25: "%% FoomaticRIPOptionSetting: Copies=25"
+*Copies 26/26: "%% FoomaticRIPOptionSetting: Copies=26"
+*Copies 27/27: "%% FoomaticRIPOptionSetting: Copies=27"
+*Copies 28/28: "%% FoomaticRIPOptionSetting: Copies=28"
+*Copies 29/29: "%% FoomaticRIPOptionSetting: Copies=29"
+*Copies 30/30: "%% FoomaticRIPOptionSetting: Copies=30"
+*Copies 31/31: "%% FoomaticRIPOptionSetting: Copies=31"
+*Copies 32/32: "%% FoomaticRIPOptionSetting: Copies=32"
+*Copies 33/33: "%% FoomaticRIPOptionSetting: Copies=33"
+*Copies 34/34: "%% FoomaticRIPOptionSetting: Copies=34"
+*Copies 35/35: "%% FoomaticRIPOptionSetting: Copies=35"
+*Copies 36/36: "%% FoomaticRIPOptionSetting: Copies=36"
+*Copies 37/37: "%% FoomaticRIPOptionSetting: Copies=37"
+*Copies 38/38: "%% FoomaticRIPOptionSetting: Copies=38"
+*Copies 39/39: "%% FoomaticRIPOptionSetting: Copies=39"
+*Copies 40/40: "%% FoomaticRIPOptionSetting: Copies=40"
+*Copies 41/41: "%% FoomaticRIPOptionSetting: Copies=41"
+*Copies 42/42: "%% FoomaticRIPOptionSetting: Copies=42"
+*Copies 43/43: "%% FoomaticRIPOptionSetting: Copies=43"
+*Copies 44/44: "%% FoomaticRIPOptionSetting: Copies=44"
+*Copies 45/45: "%% FoomaticRIPOptionSetting: Copies=45"
+*Copies 46/46: "%% FoomaticRIPOptionSetting: Copies=46"
+*Copies 47/47: "%% FoomaticRIPOptionSetting: Copies=47"
+*Copies 48/48: "%% FoomaticRIPOptionSetting: Copies=48"
+*Copies 49/49: "%% FoomaticRIPOptionSetting: Copies=49"
+*Copies 50/50: "%% FoomaticRIPOptionSetting: Copies=50"
+*Copies 51/51: "%% FoomaticRIPOptionSetting: Copies=51"
+*Copies 52/52: "%% FoomaticRIPOptionSetting: Copies=52"
+*Copies 53/53: "%% FoomaticRIPOptionSetting: Copies=53"
+*Copies 54/54: "%% FoomaticRIPOptionSetting: Copies=54"
+*Copies 55/55: "%% FoomaticRIPOptionSetting: Copies=55"
+*Copies 56/56: "%% FoomaticRIPOptionSetting: Copies=56"
+*Copies 57/57: "%% FoomaticRIPOptionSetting: Copies=57"
+*Copies 58/58: "%% FoomaticRIPOptionSetting: Copies=58"
+*Copies 59/59: "%% FoomaticRIPOptionSetting: Copies=59"
+*Copies 60/60: "%% FoomaticRIPOptionSetting: Copies=60"
+*Copies 61/61: "%% FoomaticRIPOptionSetting: Copies=61"
+*Copies 62/62: "%% FoomaticRIPOptionSetting: Copies=62"
+*Copies 63/63: "%% FoomaticRIPOptionSetting: Copies=63"
+*Copies 64/64: "%% FoomaticRIPOptionSetting: Copies=64"
+*Copies 65/65: "%% FoomaticRIPOptionSetting: Copies=65"
+*Copies 66/66: "%% FoomaticRIPOptionSetting: Copies=66"
+*Copies 67/67: "%% FoomaticRIPOptionSetting: Copies=67"
+*Copies 68/68: "%% FoomaticRIPOptionSetting: Copies=68"
+*Copies 69/69: "%% FoomaticRIPOptionSetting: Copies=69"
+*Copies 70/70: "%% FoomaticRIPOptionSetting: Copies=70"
+*Copies 71/71: "%% FoomaticRIPOptionSetting: Copies=71"
+*Copies 72/72: "%% FoomaticRIPOptionSetting: Copies=72"
+*Copies 73/73: "%% FoomaticRIPOptionSetting: Copies=73"
+*Copies 74/74: "%% FoomaticRIPOptionSetting: Copies=74"
+*Copies 75/75: "%% FoomaticRIPOptionSetting: Copies=75"
+*Copies 76/76: "%% FoomaticRIPOptionSetting: Copies=76"
+*Copies 77/77: "%% FoomaticRIPOptionSetting: Copies=77"
+*Copies 78/78: "%% FoomaticRIPOptionSetting: Copies=78"
+*Copies 79/79: "%% FoomaticRIPOptionSetting: Copies=79"
+*Copies 80/80: "%% FoomaticRIPOptionSetting: Copies=80"
+*Copies 81/81: "%% FoomaticRIPOptionSetting: Copies=81"
+*Copies 82/82: "%% FoomaticRIPOptionSetting: Copies=82"
+*Copies 83/83: "%% FoomaticRIPOptionSetting: Copies=83"
+*Copies 84/84: "%% FoomaticRIPOptionSetting: Copies=84"
+*Copies 85/85: "%% FoomaticRIPOptionSetting: Copies=85"
+*Copies 86/86: "%% FoomaticRIPOptionSetting: Copies=86"
+*Copies 87/87: "%% FoomaticRIPOptionSetting: Copies=87"
+*Copies 88/88: "%% FoomaticRIPOptionSetting: Copies=88"
+*Copies 89/89: "%% FoomaticRIPOptionSetting: Copies=89"
+*Copies 90/90: "%% FoomaticRIPOptionSetting: Copies=90"
+*Copies 91/91: "%% FoomaticRIPOptionSetting: Copies=91"
+*Copies 92/92: "%% FoomaticRIPOptionSetting: Copies=92"
+*Copies 93/93: "%% FoomaticRIPOptionSetting: Copies=93"
+*Copies 94/94: "%% FoomaticRIPOptionSetting: Copies=94"
+*Copies 95/95: "%% FoomaticRIPOptionSetting: Copies=95"
+*Copies 96/96: "%% FoomaticRIPOptionSetting: Copies=96"
+*Copies 97/97: "%% FoomaticRIPOptionSetting: Copies=97"
+*Copies 98/98: "%% FoomaticRIPOptionSetting: Copies=98"
+*Copies 99/99: "%% FoomaticRIPOptionSetting: Copies=99"
+*Copies 100/100: "%% FoomaticRIPOptionSetting: Copies=100"
+*CloseUI: *Copies
+
+*FoomaticRIPOption PrinterType: enum CmdLine A 110
+*FoomaticRIPOptionSetting PrinterType=BW: "-P "
+
+*CloseGroup: General
+
+*OpenGroup: Miscellaneous/Miscellaneous
+
+*OpenUI *Nup/N-up Printing: PickOne
+*FoomaticRIPOption Nup: enum CmdLine A
+*OrderDependency: 200 AnySetup *Nup
+*DefaultNup: 1up
+*Nup 1up/1-up: "%% FoomaticRIPOptionSetting: Nup=1up"
+*FoomaticRIPOptionSetting Nup=1up: " "
+*Nup 2up/2-up: "%% FoomaticRIPOptionSetting: Nup=2up"
+*FoomaticRIPOptionSetting Nup=2up: "-2 "
+*Nup 3up/3-up: "%% FoomaticRIPOptionSetting: Nup=3up"
+*FoomaticRIPOptionSetting Nup=3up: "-3 "
+*Nup 4up/4-up: "%% FoomaticRIPOptionSetting: Nup=4up"
+*FoomaticRIPOptionSetting Nup=4up: "-4 "
+*Nup 6up/6-up: "%% FoomaticRIPOptionSetting: Nup=6up"
+*FoomaticRIPOptionSetting Nup=6up: "-6 "
+*Nup 8up/8-up: "%% FoomaticRIPOptionSetting: Nup=8up"
+*FoomaticRIPOptionSetting Nup=8up: "-8 "
+*Nup 10up/10-up: "%% FoomaticRIPOptionSetting: Nup=10up"
+*FoomaticRIPOptionSetting Nup=10up: "-10 "
+*Nup 12up/12-up: "%% FoomaticRIPOptionSetting: Nup=12up"
+*FoomaticRIPOptionSetting Nup=12up: "-12 "
+*Nup 14up/14-up: "%% FoomaticRIPOptionSetting: Nup=14up"
+*FoomaticRIPOptionSetting Nup=14up: "-14 "
+*Nup 15up/15-up: "%% FoomaticRIPOptionSetting: Nup=15up"
+*FoomaticRIPOptionSetting Nup=15up: "-15 "
+*Nup 16up/16-up: "%% FoomaticRIPOptionSetting: Nup=16up"
+*FoomaticRIPOptionSetting Nup=16up: "-16 "
+*Nup 18up/18-up: "%% FoomaticRIPOptionSetting: Nup=18up"
+*FoomaticRIPOptionSetting Nup=18up: "-18 "
+*CloseUI: *Nup
+
+*OpenUI *NupOrient/N-up Orientation: PickOne
+*FoomaticRIPOption NupOrient: enum CmdLine A
+*OrderDependency: 200 AnySetup *NupOrient
+*DefaultNupOrient: port
+*NupOrient land/Landscape: "%% FoomaticRIPOptionSetting: NupOrient=land"
+*FoomaticRIPOptionSetting NupOrient=land: "-ol "
+*NupOrient port/Portrait: "%% FoomaticRIPOptionSetting: NupOrient=port"
+*FoomaticRIPOptionSetting NupOrient=port: " "
+*NupOrient sea/Seascape: "%% FoomaticRIPOptionSetting: NupOrient=sea"
+*FoomaticRIPOptionSetting NupOrient=sea: "-os "
+*CloseUI: *NupOrient
+
+*CloseGroup: Miscellaneous
+
+
+*% Generic boilerplate PPD stuff as standard PostScript fonts and so on
+
+*DefaultFont: Courier
+*Font AvantGarde-Book: Standard "(001.006S)" Standard ROM
+*Font AvantGarde-BookOblique: Standard "(001.006S)" Standard ROM
+*Font AvantGarde-Demi: Standard "(001.007S)" Standard ROM
+*Font AvantGarde-DemiOblique: Standard "(001.007S)" Standard ROM
+*Font Bookman-Demi: Standard "(001.004S)" Standard ROM
+*Font Bookman-DemiItalic: Standard "(001.004S)" Standard ROM
+*Font Bookman-Light: Standard "(001.004S)" Standard ROM
+*Font Bookman-LightItalic: Standard "(001.004S)" Standard ROM
+*Font Courier: Standard "(002.004S)" Standard ROM
+*Font Courier-Bold: Standard "(002.004S)" Standard ROM
+*Font Courier-BoldOblique: Standard "(002.004S)" Standard ROM
+*Font Courier-Oblique: Standard "(002.004S)" Standard ROM
+*Font Helvetica: Standard "(001.006S)" Standard ROM
+*Font Helvetica-Bold: Standard "(001.007S)" Standard ROM
+*Font Helvetica-BoldOblique: Standard "(001.007S)" Standard ROM
+*Font Helvetica-Narrow: Standard "(001.006S)" Standard ROM
+*Font Helvetica-Narrow-Bold: Standard "(001.007S)" Standard ROM
+*Font Helvetica-Narrow-BoldOblique: Standard "(001.007S)" Standard ROM
+*Font Helvetica-Narrow-Oblique: Standard "(001.006S)" Standard ROM
+*Font Helvetica-Oblique: Standard "(001.006S)" Standard ROM
+*Font NewCenturySchlbk-Bold: Standard "(001.009S)" Standard ROM
+*Font NewCenturySchlbk-BoldItalic: Standard "(001.007S)" Standard ROM
+*Font NewCenturySchlbk-Italic: Standard "(001.006S)" Standard ROM
+*Font NewCenturySchlbk-Roman: Standard "(001.007S)" Standard ROM
+*Font Palatino-Bold: Standard "(001.005S)" Standard ROM
+*Font Palatino-BoldItalic: Standard "(001.005S)" Standard ROM
+*Font Palatino-Italic: Standard "(001.005S)" Standard ROM
+*Font Palatino-Roman: Standard "(001.005S)" Standard ROM
+*Font Symbol: Special "(001.007S)" Special ROM
+*Font Times-Bold: Standard "(001.007S)" Standard ROM
+*Font Times-BoldItalic: Standard "(001.009S)" Standard ROM
+*Font Times-Italic: Standard "(001.007S)" Standard ROM
+*Font Times-Roman: Standard "(001.007S)" Standard ROM
+*Font ZapfChancery-MediumItalic: Standard "(001.007S)" Standard ROM
+*Font ZapfDingbats: Special "(001.004S)" Standard ROM
+
diff --git a/PPD/HP-LaserJet_1005.ppd b/PPD/HP-LaserJet_1005.ppd
new file mode 100644
index 0000000..7f84b25
--- /dev/null
+++ b/PPD/HP-LaserJet_1005.ppd
@@ -0,0 +1,389 @@
+*PPD-Adobe: "4.3"
+*%
+*% For information on using this, and to obtain the required backend
+*% script, consult http://www.linuxprinting.org/
+*%
+*% This file is published under the GNU General Public License
+*%
+*% PPD-O-MATIC (3.0.0 or newer) generated this PPD file. It is for use with
+*% all programs and environments which use PPD files for dealing with
+*% printer capability information. The printer must be configured with the
+*% "foomatic-rip" backend filter script of Foomatic 3.0.0 or newer. This
+*% file and "foomatic-rip" work together to support PPD-controlled printer
+*% driver option access with arbitrary free software printer drivers and
+*% printing spoolers.
+*%
+*% To save this file on your disk, wait until the download has completed
+*% (the animation of the browser logo must stop) and then use the
+*% "Save as..." command in the "File" menu of your browser or in the
+*% pop-up manu when you click on this document with the right mouse button.
+*% DO NOT cut and paste this file into an editor with your mouse. This can
+*% introduce additional line breaks which lead to unexpected results.
+*%
+*% You may save this file as 'HP-LaserJet_1005-foo2zjs.ppd'
+*%
+*%
+*FormatVersion: "4.3"
+*FileVersion: "1.1"
+*LanguageVersion: English
+*LanguageEncoding: ISOLatin1
+*PCFileName: "FOO2ZJS.PPD"
+*Manufacturer: "HP"
+*Product: "(hp LaserJet 1005 series)"
+*cupsVersion: 1.0
+*cupsManualCopies: True
+*cupsModelNumber: 2
+*cupsFilter: "application/vnd.cups-postscript 0 foomatic-rip"
+*%pprRIP: foomatic-rip other
+*ModelName: "HP LaserJet 1005"
+*ShortNickName: "HP LaserJet 1005 foo2zjs"
+*NickName: "HP LaserJet 1005 Foomatic/foo2zjs (recommended)"
+*PSVersion: "(3010.000) 550"
+*PSVersion: "(3010.000) 651"
+*PSVersion: "(3010.000) 652"
+*PSVersion: "(3010.000) 653"
+*PSVersion: "(3010.000) 704"
+*PSVersion: "(3010.000) 705"
+*PSVersion: "(3010.000) 800"
+*LanguageLevel: "3"
+*ColorDevice: False
+*DefaultColorSpace: Gray
+*FileSystem: False
+*Throughput: "1"
+*LandscapeOrientation: Plus90
+*TTRasterizer: Type42
+*1284DeviceID: "MFG:Hewlett-Packard;MDL:hp LaserJet 1005 series;CMD:ZJS;DES:hp LaserJet 1005 series;"
+
+
+
+*VariablePaperSize: False
+
+*FoomaticIDs: HP-LaserJet_1005 foo2zjs
+*FoomaticRIPCommandLine: "foo2zjs-wrapper %A"
+
+*OpenGroup: General/General
+
+*OpenUI *PageSize/Page Size: PickOne
+*FoomaticRIPOption PageSize: enum CmdLine A
+*OrderDependency: 135 AnySetup *PageSize
+*DefaultPageSize: Letter
+*PageSize Letter/Letter: "%% FoomaticRIPOptionSetting: PageSize=Letter"
+*FoomaticRIPOptionSetting PageSize=Letter: "-p1 "
+*PageSize A4/A4: "%% FoomaticRIPOptionSetting: PageSize=A4"
+*FoomaticRIPOptionSetting PageSize=A4: "-p9 "
+*PageSize A5/A5: "%% FoomaticRIPOptionSetting: PageSize=A5"
+*FoomaticRIPOptionSetting PageSize=A5: "-p11 "
+*PageSize B5/B5: "%% FoomaticRIPOptionSetting: PageSize=B5"
+*FoomaticRIPOptionSetting PageSize=B5: "-p13 "
+*PageSize Env10/Env #10: "%% FoomaticRIPOptionSetting: PageSize=Env10"
+*FoomaticRIPOptionSetting PageSize=Env10: "-p20 "
+*PageSize EnvB5/Env B5: "%% FoomaticRIPOptionSetting: PageSize=EnvB5"
+*FoomaticRIPOptionSetting PageSize=EnvB5: "-p34 "
+*PageSize EnvC5/Env C5: "%% FoomaticRIPOptionSetting: PageSize=EnvC5"
+*FoomaticRIPOptionSetting PageSize=EnvC5: "-p28 "
+*PageSize EnvDL/Env DL: "%% FoomaticRIPOptionSetting: PageSize=EnvDL"
+*FoomaticRIPOptionSetting PageSize=EnvDL: "-p27 "
+*PageSize EnvMonarch/Env Monarch: "%% FoomaticRIPOptionSetting: PageSize=EnvMonarch"
+*FoomaticRIPOptionSetting PageSize=EnvMonarch: "-p37 "
+*PageSize Executive/Executive: "%% FoomaticRIPOptionSetting: PageSize=Executive"
+*FoomaticRIPOptionSetting PageSize=Executive: "-p7 "
+*PageSize Legal/Legal: "%% FoomaticRIPOptionSetting: PageSize=Legal"
+*FoomaticRIPOptionSetting PageSize=Legal: "-p5 "
+*CloseUI: *PageSize
+
+*OpenUI *PageRegion: PickOne
+*OrderDependency: 135 AnySetup *PageRegion
+*DefaultPageRegion: Letter
+*PageRegion Letter/Letter: "%% FoomaticRIPOptionSetting: PageSize=Letter"
+*PageRegion A4/A4: "%% FoomaticRIPOptionSetting: PageSize=A4"
+*PageRegion A5/A5: "%% FoomaticRIPOptionSetting: PageSize=A5"
+*PageRegion B5/B5: "%% FoomaticRIPOptionSetting: PageSize=B5"
+*PageRegion Env10/Env #10: "%% FoomaticRIPOptionSetting: PageSize=Env10"
+*PageRegion EnvB5/Env B5: "%% FoomaticRIPOptionSetting: PageSize=EnvB5"
+*PageRegion EnvC5/Env C5: "%% FoomaticRIPOptionSetting: PageSize=EnvC5"
+*PageRegion EnvDL/Env DL: "%% FoomaticRIPOptionSetting: PageSize=EnvDL"
+*PageRegion EnvMonarch/Env Monarch: "%% FoomaticRIPOptionSetting: PageSize=EnvMonarch"
+*PageRegion Executive/Executive: "%% FoomaticRIPOptionSetting: PageSize=Executive"
+*PageRegion Legal/Legal: "%% FoomaticRIPOptionSetting: PageSize=Legal"
+*CloseUI: *PageRegion
+
+*DefaultImageableArea: Letter
+*ImageableArea Letter/Letter: "11.34 11.34 600.66 780.66"
+*ImageableArea A4/A4: "11.34 11.34 583.66 830.66"
+*ImageableArea A5/A5: "11.34 11.34 408.66 583.66"
+*ImageableArea B5/B5: "11.34 11.34 486.66 696.66"
+*ImageableArea Env10/Env #10: "11.34 11.34 285.66 672.66"
+*ImageableArea EnvB5/Env B5: "11.34 11.34 486.66 696.66"
+*ImageableArea EnvC5/Env C5: "11.34 11.34 447.66 637.66"
+*ImageableArea EnvDL/Env DL: "11.34 11.34 299.66 611.66"
+*ImageableArea EnvMonarch/Env Monarch: "11.34 11.34 267.66 528.66"
+*ImageableArea Executive/Executive: "11.34 11.34 510.66 744.66"
+*ImageableArea Legal/Legal: "11.34 11.34 600.66 996.66"
+
+*DefaultPaperDimension: Letter
+*PaperDimension Letter/Letter: "612 792"
+*PaperDimension A4/A4: "595 842"
+*PaperDimension A5/A5: "420 595"
+*PaperDimension B5/B5: "498 708"
+*PaperDimension Env10/Env #10: "297 684"
+*PaperDimension EnvB5/Env B5: "498 708"
+*PaperDimension EnvC5/Env C5: "459 649"
+*PaperDimension EnvDL/Env DL: "311 623"
+*PaperDimension EnvMonarch/Env Monarch: "279 540"
+*PaperDimension Executive/Executive: "522 756"
+*PaperDimension Legal/Legal: "612 1008"
+
+*OpenUI *InputSlot/Media Source: PickOne
+*FoomaticRIPOption InputSlot: enum CmdLine A
+*OrderDependency: 150 AnySetup *InputSlot
+*DefaultInputSlot: Auto
+*InputSlot Upper/Upper or Only One InputSlot: "%% FoomaticRIPOptionSetting: InputSlot=Upper"
+*FoomaticRIPOptionSetting InputSlot=Upper: "-s1 "
+*InputSlot Middle/Middle Tray: "%% FoomaticRIPOptionSetting: InputSlot=Middle"
+*FoomaticRIPOptionSetting InputSlot=Middle: "-s3 "
+*InputSlot Lower/Lower Tray: "%% FoomaticRIPOptionSetting: InputSlot=Lower"
+*FoomaticRIPOptionSetting InputSlot=Lower: "-s2 "
+*InputSlot Auto/Auto Source: "%% FoomaticRIPOptionSetting: InputSlot=Auto"
+*FoomaticRIPOptionSetting InputSlot=Auto: "-s7 "
+*InputSlot Envelope/Envelope: "%% FoomaticRIPOptionSetting: InputSlot=Envelope"
+*FoomaticRIPOptionSetting InputSlot=Envelope: "-s5 "
+*InputSlot Manual/Manual Feed: "%% FoomaticRIPOptionSetting: InputSlot=Manual"
+*FoomaticRIPOptionSetting InputSlot=Manual: "-s4 "
+*CloseUI: *InputSlot
+
+*OpenUI *MediaType/Media Type: PickOne
+*FoomaticRIPOption MediaType: enum CmdLine A
+*OrderDependency: 150 AnySetup *MediaType
+*DefaultMediaType: Standard
+*MediaType Envelope/Envelope: "%% FoomaticRIPOptionSetting: MediaType=Envelope"
+*FoomaticRIPOptionSetting MediaType=Envelope: "-m257 "
+*MediaType Labels/Labels: "%% FoomaticRIPOptionSetting: MediaType=Labels"
+*FoomaticRIPOptionSetting MediaType=Labels: "-m263 "
+*MediaType Letterhead/Letterhead: "%% FoomaticRIPOptionSetting: MediaType=Letterhead"
+*FoomaticRIPOptionSetting MediaType=Letterhead: "-m259 "
+*MediaType Postcard/Postcard: "%% FoomaticRIPOptionSetting: MediaType=Postcard"
+*FoomaticRIPOptionSetting MediaType=Postcard: "-m262 "
+*MediaType Standard/Standard Paper: "%% FoomaticRIPOptionSetting: MediaType=Standard"
+*FoomaticRIPOptionSetting MediaType=Standard: "-m1 "
+*MediaType ThickStock/Thick Stock: "%% FoomaticRIPOptionSetting: MediaType=ThickStock"
+*FoomaticRIPOptionSetting MediaType=ThickStock: "-m261 "
+*MediaType Transparency/Transparency: "%% FoomaticRIPOptionSetting: MediaType=Transparency"
+*FoomaticRIPOptionSetting MediaType=Transparency: "-m2 "
+*CloseUI: *MediaType
+
+*FoomaticRIPOption Resolution: enum CmdLine A 130
+*FoomaticRIPOptionSetting Resolution=600x600dpi: "-r600x600 "
+
+*OpenUI *Quality/Printing Quality: PickOne
+*FoomaticRIPOption Quality: enum CmdLine A
+*OrderDependency: 110 AnySetup *Quality
+*DefaultQuality: normal
+*Quality draft/Draft: "%% FoomaticRIPOptionSetting: Quality=draft"
+*FoomaticRIPOptionSetting Quality=draft: " -t "
+*Quality normal/Normal: "%% FoomaticRIPOptionSetting: Quality=normal"
+*FoomaticRIPOptionSetting Quality=normal: " "
+*CloseUI: *Quality
+
+*FoomaticRIPOption ColorMode: enum CmdLine A 120
+*FoomaticRIPOptionSetting ColorMode=Monochrome: " "
+
+*OpenUI *Copies/Copies: PickOne
+*FoomaticRIPOption Copies: int CmdLine A
+*FoomaticRIPOptionPrototype Copies: "-n%s "
+*FoomaticRIPOptionRange Copies: 1 100
+*OrderDependency: 220 AnySetup *Copies
+*DefaultCopies: 1
+*FoomaticRIPDefaultCopies: 1
+*Copies 1/1: "%% FoomaticRIPOptionSetting: Copies=1"
+*Copies 2/2: "%% FoomaticRIPOptionSetting: Copies=2"
+*Copies 3/3: "%% FoomaticRIPOptionSetting: Copies=3"
+*Copies 4/4: "%% FoomaticRIPOptionSetting: Copies=4"
+*Copies 5/5: "%% FoomaticRIPOptionSetting: Copies=5"
+*Copies 6/6: "%% FoomaticRIPOptionSetting: Copies=6"
+*Copies 7/7: "%% FoomaticRIPOptionSetting: Copies=7"
+*Copies 8/8: "%% FoomaticRIPOptionSetting: Copies=8"
+*Copies 9/9: "%% FoomaticRIPOptionSetting: Copies=9"
+*Copies 10/10: "%% FoomaticRIPOptionSetting: Copies=10"
+*Copies 11/11: "%% FoomaticRIPOptionSetting: Copies=11"
+*Copies 12/12: "%% FoomaticRIPOptionSetting: Copies=12"
+*Copies 13/13: "%% FoomaticRIPOptionSetting: Copies=13"
+*Copies 14/14: "%% FoomaticRIPOptionSetting: Copies=14"
+*Copies 15/15: "%% FoomaticRIPOptionSetting: Copies=15"
+*Copies 16/16: "%% FoomaticRIPOptionSetting: Copies=16"
+*Copies 17/17: "%% FoomaticRIPOptionSetting: Copies=17"
+*Copies 18/18: "%% FoomaticRIPOptionSetting: Copies=18"
+*Copies 19/19: "%% FoomaticRIPOptionSetting: Copies=19"
+*Copies 20/20: "%% FoomaticRIPOptionSetting: Copies=20"
+*Copies 21/21: "%% FoomaticRIPOptionSetting: Copies=21"
+*Copies 22/22: "%% FoomaticRIPOptionSetting: Copies=22"
+*Copies 23/23: "%% FoomaticRIPOptionSetting: Copies=23"
+*Copies 24/24: "%% FoomaticRIPOptionSetting: Copies=24"
+*Copies 25/25: "%% FoomaticRIPOptionSetting: Copies=25"
+*Copies 26/26: "%% FoomaticRIPOptionSetting: Copies=26"
+*Copies 27/27: "%% FoomaticRIPOptionSetting: Copies=27"
+*Copies 28/28: "%% FoomaticRIPOptionSetting: Copies=28"
+*Copies 29/29: "%% FoomaticRIPOptionSetting: Copies=29"
+*Copies 30/30: "%% FoomaticRIPOptionSetting: Copies=30"
+*Copies 31/31: "%% FoomaticRIPOptionSetting: Copies=31"
+*Copies 32/32: "%% FoomaticRIPOptionSetting: Copies=32"
+*Copies 33/33: "%% FoomaticRIPOptionSetting: Copies=33"
+*Copies 34/34: "%% FoomaticRIPOptionSetting: Copies=34"
+*Copies 35/35: "%% FoomaticRIPOptionSetting: Copies=35"
+*Copies 36/36: "%% FoomaticRIPOptionSetting: Copies=36"
+*Copies 37/37: "%% FoomaticRIPOptionSetting: Copies=37"
+*Copies 38/38: "%% FoomaticRIPOptionSetting: Copies=38"
+*Copies 39/39: "%% FoomaticRIPOptionSetting: Copies=39"
+*Copies 40/40: "%% FoomaticRIPOptionSetting: Copies=40"
+*Copies 41/41: "%% FoomaticRIPOptionSetting: Copies=41"
+*Copies 42/42: "%% FoomaticRIPOptionSetting: Copies=42"
+*Copies 43/43: "%% FoomaticRIPOptionSetting: Copies=43"
+*Copies 44/44: "%% FoomaticRIPOptionSetting: Copies=44"
+*Copies 45/45: "%% FoomaticRIPOptionSetting: Copies=45"
+*Copies 46/46: "%% FoomaticRIPOptionSetting: Copies=46"
+*Copies 47/47: "%% FoomaticRIPOptionSetting: Copies=47"
+*Copies 48/48: "%% FoomaticRIPOptionSetting: Copies=48"
+*Copies 49/49: "%% FoomaticRIPOptionSetting: Copies=49"
+*Copies 50/50: "%% FoomaticRIPOptionSetting: Copies=50"
+*Copies 51/51: "%% FoomaticRIPOptionSetting: Copies=51"
+*Copies 52/52: "%% FoomaticRIPOptionSetting: Copies=52"
+*Copies 53/53: "%% FoomaticRIPOptionSetting: Copies=53"
+*Copies 54/54: "%% FoomaticRIPOptionSetting: Copies=54"
+*Copies 55/55: "%% FoomaticRIPOptionSetting: Copies=55"
+*Copies 56/56: "%% FoomaticRIPOptionSetting: Copies=56"
+*Copies 57/57: "%% FoomaticRIPOptionSetting: Copies=57"
+*Copies 58/58: "%% FoomaticRIPOptionSetting: Copies=58"
+*Copies 59/59: "%% FoomaticRIPOptionSetting: Copies=59"
+*Copies 60/60: "%% FoomaticRIPOptionSetting: Copies=60"
+*Copies 61/61: "%% FoomaticRIPOptionSetting: Copies=61"
+*Copies 62/62: "%% FoomaticRIPOptionSetting: Copies=62"
+*Copies 63/63: "%% FoomaticRIPOptionSetting: Copies=63"
+*Copies 64/64: "%% FoomaticRIPOptionSetting: Copies=64"
+*Copies 65/65: "%% FoomaticRIPOptionSetting: Copies=65"
+*Copies 66/66: "%% FoomaticRIPOptionSetting: Copies=66"
+*Copies 67/67: "%% FoomaticRIPOptionSetting: Copies=67"
+*Copies 68/68: "%% FoomaticRIPOptionSetting: Copies=68"
+*Copies 69/69: "%% FoomaticRIPOptionSetting: Copies=69"
+*Copies 70/70: "%% FoomaticRIPOptionSetting: Copies=70"
+*Copies 71/71: "%% FoomaticRIPOptionSetting: Copies=71"
+*Copies 72/72: "%% FoomaticRIPOptionSetting: Copies=72"
+*Copies 73/73: "%% FoomaticRIPOptionSetting: Copies=73"
+*Copies 74/74: "%% FoomaticRIPOptionSetting: Copies=74"
+*Copies 75/75: "%% FoomaticRIPOptionSetting: Copies=75"
+*Copies 76/76: "%% FoomaticRIPOptionSetting: Copies=76"
+*Copies 77/77: "%% FoomaticRIPOptionSetting: Copies=77"
+*Copies 78/78: "%% FoomaticRIPOptionSetting: Copies=78"
+*Copies 79/79: "%% FoomaticRIPOptionSetting: Copies=79"
+*Copies 80/80: "%% FoomaticRIPOptionSetting: Copies=80"
+*Copies 81/81: "%% FoomaticRIPOptionSetting: Copies=81"
+*Copies 82/82: "%% FoomaticRIPOptionSetting: Copies=82"
+*Copies 83/83: "%% FoomaticRIPOptionSetting: Copies=83"
+*Copies 84/84: "%% FoomaticRIPOptionSetting: Copies=84"
+*Copies 85/85: "%% FoomaticRIPOptionSetting: Copies=85"
+*Copies 86/86: "%% FoomaticRIPOptionSetting: Copies=86"
+*Copies 87/87: "%% FoomaticRIPOptionSetting: Copies=87"
+*Copies 88/88: "%% FoomaticRIPOptionSetting: Copies=88"
+*Copies 89/89: "%% FoomaticRIPOptionSetting: Copies=89"
+*Copies 90/90: "%% FoomaticRIPOptionSetting: Copies=90"
+*Copies 91/91: "%% FoomaticRIPOptionSetting: Copies=91"
+*Copies 92/92: "%% FoomaticRIPOptionSetting: Copies=92"
+*Copies 93/93: "%% FoomaticRIPOptionSetting: Copies=93"
+*Copies 94/94: "%% FoomaticRIPOptionSetting: Copies=94"
+*Copies 95/95: "%% FoomaticRIPOptionSetting: Copies=95"
+*Copies 96/96: "%% FoomaticRIPOptionSetting: Copies=96"
+*Copies 97/97: "%% FoomaticRIPOptionSetting: Copies=97"
+*Copies 98/98: "%% FoomaticRIPOptionSetting: Copies=98"
+*Copies 99/99: "%% FoomaticRIPOptionSetting: Copies=99"
+*Copies 100/100: "%% FoomaticRIPOptionSetting: Copies=100"
+*CloseUI: *Copies
+
+*FoomaticRIPOption PrinterType: enum CmdLine A 110
+*FoomaticRIPOptionSetting PrinterType=BW: "-P "
+
+*CloseGroup: General
+
+*OpenGroup: Miscellaneous/Miscellaneous
+
+*OpenUI *Nup/N-up Printing: PickOne
+*FoomaticRIPOption Nup: enum CmdLine A
+*OrderDependency: 200 AnySetup *Nup
+*DefaultNup: 1up
+*Nup 1up/1-up: "%% FoomaticRIPOptionSetting: Nup=1up"
+*FoomaticRIPOptionSetting Nup=1up: " "
+*Nup 2up/2-up: "%% FoomaticRIPOptionSetting: Nup=2up"
+*FoomaticRIPOptionSetting Nup=2up: "-2 "
+*Nup 3up/3-up: "%% FoomaticRIPOptionSetting: Nup=3up"
+*FoomaticRIPOptionSetting Nup=3up: "-3 "
+*Nup 4up/4-up: "%% FoomaticRIPOptionSetting: Nup=4up"
+*FoomaticRIPOptionSetting Nup=4up: "-4 "
+*Nup 6up/6-up: "%% FoomaticRIPOptionSetting: Nup=6up"
+*FoomaticRIPOptionSetting Nup=6up: "-6 "
+*Nup 8up/8-up: "%% FoomaticRIPOptionSetting: Nup=8up"
+*FoomaticRIPOptionSetting Nup=8up: "-8 "
+*Nup 10up/10-up: "%% FoomaticRIPOptionSetting: Nup=10up"
+*FoomaticRIPOptionSetting Nup=10up: "-10 "
+*Nup 12up/12-up: "%% FoomaticRIPOptionSetting: Nup=12up"
+*FoomaticRIPOptionSetting Nup=12up: "-12 "
+*Nup 14up/14-up: "%% FoomaticRIPOptionSetting: Nup=14up"
+*FoomaticRIPOptionSetting Nup=14up: "-14 "
+*Nup 15up/15-up: "%% FoomaticRIPOptionSetting: Nup=15up"
+*FoomaticRIPOptionSetting Nup=15up: "-15 "
+*Nup 16up/16-up: "%% FoomaticRIPOptionSetting: Nup=16up"
+*FoomaticRIPOptionSetting Nup=16up: "-16 "
+*Nup 18up/18-up: "%% FoomaticRIPOptionSetting: Nup=18up"
+*FoomaticRIPOptionSetting Nup=18up: "-18 "
+*CloseUI: *Nup
+
+*OpenUI *NupOrient/N-up Orientation: PickOne
+*FoomaticRIPOption NupOrient: enum CmdLine A
+*OrderDependency: 200 AnySetup *NupOrient
+*DefaultNupOrient: port
+*NupOrient land/Landscape: "%% FoomaticRIPOptionSetting: NupOrient=land"
+*FoomaticRIPOptionSetting NupOrient=land: "-ol "
+*NupOrient port/Portrait: "%% FoomaticRIPOptionSetting: NupOrient=port"
+*FoomaticRIPOptionSetting NupOrient=port: " "
+*NupOrient sea/Seascape: "%% FoomaticRIPOptionSetting: NupOrient=sea"
+*FoomaticRIPOptionSetting NupOrient=sea: "-os "
+*CloseUI: *NupOrient
+
+*CloseGroup: Miscellaneous
+
+
+*% Generic boilerplate PPD stuff as standard PostScript fonts and so on
+
+*DefaultFont: Courier
+*Font AvantGarde-Book: Standard "(001.006S)" Standard ROM
+*Font AvantGarde-BookOblique: Standard "(001.006S)" Standard ROM
+*Font AvantGarde-Demi: Standard "(001.007S)" Standard ROM
+*Font AvantGarde-DemiOblique: Standard "(001.007S)" Standard ROM
+*Font Bookman-Demi: Standard "(001.004S)" Standard ROM
+*Font Bookman-DemiItalic: Standard "(001.004S)" Standard ROM
+*Font Bookman-Light: Standard "(001.004S)" Standard ROM
+*Font Bookman-LightItalic: Standard "(001.004S)" Standard ROM
+*Font Courier: Standard "(002.004S)" Standard ROM
+*Font Courier-Bold: Standard "(002.004S)" Standard ROM
+*Font Courier-BoldOblique: Standard "(002.004S)" Standard ROM
+*Font Courier-Oblique: Standard "(002.004S)" Standard ROM
+*Font Helvetica: Standard "(001.006S)" Standard ROM
+*Font Helvetica-Bold: Standard "(001.007S)" Standard ROM
+*Font Helvetica-BoldOblique: Standard "(001.007S)" Standard ROM
+*Font Helvetica-Narrow: Standard "(001.006S)" Standard ROM
+*Font Helvetica-Narrow-Bold: Standard "(001.007S)" Standard ROM
+*Font Helvetica-Narrow-BoldOblique: Standard "(001.007S)" Standard ROM
+*Font Helvetica-Narrow-Oblique: Standard "(001.006S)" Standard ROM
+*Font Helvetica-Oblique: Standard "(001.006S)" Standard ROM
+*Font NewCenturySchlbk-Bold: Standard "(001.009S)" Standard ROM
+*Font NewCenturySchlbk-BoldItalic: Standard "(001.007S)" Standard ROM
+*Font NewCenturySchlbk-Italic: Standard "(001.006S)" Standard ROM
+*Font NewCenturySchlbk-Roman: Standard "(001.007S)" Standard ROM
+*Font Palatino-Bold: Standard "(001.005S)" Standard ROM
+*Font Palatino-BoldItalic: Standard "(001.005S)" Standard ROM
+*Font Palatino-Italic: Standard "(001.005S)" Standard ROM
+*Font Palatino-Roman: Standard "(001.005S)" Standard ROM
+*Font Symbol: Special "(001.007S)" Special ROM
+*Font Times-Bold: Standard "(001.007S)" Standard ROM
+*Font Times-BoldItalic: Standard "(001.009S)" Standard ROM
+*Font Times-Italic: Standard "(001.007S)" Standard ROM
+*Font Times-Roman: Standard "(001.007S)" Standard ROM
+*Font ZapfChancery-MediumItalic: Standard "(001.007S)" Standard ROM
+*Font ZapfDingbats: Special "(001.004S)" Standard ROM
+
diff --git a/PPD/HP-LaserJet_1018.ppd b/PPD/HP-LaserJet_1018.ppd
new file mode 100644
index 0000000..36e8332
--- /dev/null
+++ b/PPD/HP-LaserJet_1018.ppd
@@ -0,0 +1,396 @@
+*PPD-Adobe: "4.3"
+*%
+*% For information on using this, and to obtain the required backend
+*% script, consult http://www.linuxprinting.org/
+*%
+*% This file is published under the GNU General Public License
+*%
+*% PPD-O-MATIC (3.0.0 or newer) generated this PPD file. It is for use with
+*% all programs and environments which use PPD files for dealing with
+*% printer capability information. The printer must be configured with the
+*% "foomatic-rip" backend filter script of Foomatic 3.0.0 or newer. This
+*% file and "foomatic-rip" work together to support PPD-controlled printer
+*% driver option access with arbitrary free software printer drivers and
+*% printing spoolers.
+*%
+*% To save this file on your disk, wait until the download has completed
+*% (the animation of the browser logo must stop) and then use the
+*% "Save as..." command in the "File" menu of your browser or in the
+*% pop-up manu when you click on this document with the right mouse button.
+*% DO NOT cut and paste this file into an editor with your mouse. This can
+*% introduce additional line breaks which lead to unexpected results.
+*%
+*% You may save this file as 'HP-LaserJet_1018-foo2zjs.ppd'
+*%
+*%
+*FormatVersion: "4.3"
+*FileVersion: "1.1"
+*LanguageVersion: English
+*LanguageEncoding: ISOLatin1
+*PCFileName: "FOO2ZJS.PPD"
+*Manufacturer: "HP"
+*Product: "(HP LaserJet 1018)"
+*cupsVersion: 1.0
+*cupsManualCopies: True
+*cupsModelNumber: 2
+*cupsFilter: "application/vnd.cups-postscript 0 foomatic-rip"
+*%pprRIP: foomatic-rip other
+*ModelName: "HP LaserJet 1018"
+*ShortNickName: "HP LaserJet 1018 foo2zjs"
+*NickName: "HP LaserJet 1018 Foomatic/foo2zjs (recommended)"
+*PSVersion: "(3010.000) 550"
+*PSVersion: "(3010.000) 651"
+*PSVersion: "(3010.000) 652"
+*PSVersion: "(3010.000) 653"
+*PSVersion: "(3010.000) 704"
+*PSVersion: "(3010.000) 705"
+*PSVersion: "(3010.000) 800"
+*LanguageLevel: "3"
+*ColorDevice: False
+*DefaultColorSpace: Gray
+*FileSystem: False
+*Throughput: "1"
+*LandscapeOrientation: Plus90
+*TTRasterizer: Type42
+*1284DeviceID: "MFG:Hewlett-Packard;MDL:HP LaserJet 1018;CMD:ACL;DES:HP LaserJet 1018;"
+
+
+
+*VariablePaperSize: False
+
+*FoomaticIDs: HP-LaserJet_1018 foo2zjs
+*FoomaticRIPCommandLine: "foo2zjs-wrapper %A"
+
+*OpenGroup: General/General
+
+*OpenUI *PageSize/Page Size: PickOne
+*FoomaticRIPOption PageSize: enum CmdLine A
+*OrderDependency: 135 AnySetup *PageSize
+*DefaultPageSize: Letter
+*PageSize Letter/Letter: "%% FoomaticRIPOptionSetting: PageSize=Letter"
+*FoomaticRIPOptionSetting PageSize=Letter: "-p1 "
+*PageSize A4/A4: "%% FoomaticRIPOptionSetting: PageSize=A4"
+*FoomaticRIPOptionSetting PageSize=A4: "-p9 "
+*PageSize A5/A5: "%% FoomaticRIPOptionSetting: PageSize=A5"
+*FoomaticRIPOptionSetting PageSize=A5: "-p11 "
+*PageSize B5/B5: "%% FoomaticRIPOptionSetting: PageSize=B5"
+*FoomaticRIPOptionSetting PageSize=B5: "-p13 "
+*PageSize Env10/Env #10: "%% FoomaticRIPOptionSetting: PageSize=Env10"
+*FoomaticRIPOptionSetting PageSize=Env10: "-p20 "
+*PageSize EnvB5/Env B5: "%% FoomaticRIPOptionSetting: PageSize=EnvB5"
+*FoomaticRIPOptionSetting PageSize=EnvB5: "-p34 "
+*PageSize EnvC5/Env C5: "%% FoomaticRIPOptionSetting: PageSize=EnvC5"
+*FoomaticRIPOptionSetting PageSize=EnvC5: "-p28 "
+*PageSize EnvDL/Env DL: "%% FoomaticRIPOptionSetting: PageSize=EnvDL"
+*FoomaticRIPOptionSetting PageSize=EnvDL: "-p27 "
+*PageSize EnvMonarch/Env Monarch: "%% FoomaticRIPOptionSetting: PageSize=EnvMonarch"
+*FoomaticRIPOptionSetting PageSize=EnvMonarch: "-p37 "
+*PageSize Executive/Executive: "%% FoomaticRIPOptionSetting: PageSize=Executive"
+*FoomaticRIPOptionSetting PageSize=Executive: "-p7 "
+*PageSize Legal/Legal: "%% FoomaticRIPOptionSetting: PageSize=Legal"
+*FoomaticRIPOptionSetting PageSize=Legal: "-p5 "
+*CloseUI: *PageSize
+
+*OpenUI *PageRegion: PickOne
+*OrderDependency: 135 AnySetup *PageRegion
+*DefaultPageRegion: Letter
+*PageRegion Letter/Letter: "%% FoomaticRIPOptionSetting: PageSize=Letter"
+*PageRegion A4/A4: "%% FoomaticRIPOptionSetting: PageSize=A4"
+*PageRegion A5/A5: "%% FoomaticRIPOptionSetting: PageSize=A5"
+*PageRegion B5/B5: "%% FoomaticRIPOptionSetting: PageSize=B5"
+*PageRegion Env10/Env #10: "%% FoomaticRIPOptionSetting: PageSize=Env10"
+*PageRegion EnvB5/Env B5: "%% FoomaticRIPOptionSetting: PageSize=EnvB5"
+*PageRegion EnvC5/Env C5: "%% FoomaticRIPOptionSetting: PageSize=EnvC5"
+*PageRegion EnvDL/Env DL: "%% FoomaticRIPOptionSetting: PageSize=EnvDL"
+*PageRegion EnvMonarch/Env Monarch: "%% FoomaticRIPOptionSetting: PageSize=EnvMonarch"
+*PageRegion Executive/Executive: "%% FoomaticRIPOptionSetting: PageSize=Executive"
+*PageRegion Legal/Legal: "%% FoomaticRIPOptionSetting: PageSize=Legal"
+*CloseUI: *PageRegion
+
+*DefaultImageableArea: Letter
+*ImageableArea Letter/Letter: "11.34 11.34 600.66 780.66"
+*ImageableArea A4/A4: "11.34 11.34 583.66 830.66"
+*ImageableArea A5/A5: "11.34 11.34 408.66 583.66"
+*ImageableArea B5/B5: "11.34 11.34 486.66 696.66"
+*ImageableArea Env10/Env #10: "11.34 11.34 285.66 672.66"
+*ImageableArea EnvB5/Env B5: "11.34 11.34 486.66 696.66"
+*ImageableArea EnvC5/Env C5: "11.34 11.34 447.66 637.66"
+*ImageableArea EnvDL/Env DL: "11.34 11.34 299.66 611.66"
+*ImageableArea EnvMonarch/Env Monarch: "11.34 11.34 267.66 528.66"
+*ImageableArea Executive/Executive: "11.34 11.34 510.66 744.66"
+*ImageableArea Legal/Legal: "11.34 11.34 600.66 996.66"
+
+*DefaultPaperDimension: Letter
+*PaperDimension Letter/Letter: "612 792"
+*PaperDimension A4/A4: "595 842"
+*PaperDimension A5/A5: "420 595"
+*PaperDimension B5/B5: "498 708"
+*PaperDimension Env10/Env #10: "297 684"
+*PaperDimension EnvB5/Env B5: "498 708"
+*PaperDimension EnvC5/Env C5: "459 649"
+*PaperDimension EnvDL/Env DL: "311 623"
+*PaperDimension EnvMonarch/Env Monarch: "279 540"
+*PaperDimension Executive/Executive: "522 756"
+*PaperDimension Legal/Legal: "612 1008"
+
+*OpenUI *InputSlot/Media Source: PickOne
+*FoomaticRIPOption InputSlot: enum CmdLine A
+*OrderDependency: 150 AnySetup *InputSlot
+*DefaultInputSlot: Auto
+*InputSlot Upper/Upper or Only One InputSlot: "%% FoomaticRIPOptionSetting: InputSlot=Upper"
+*FoomaticRIPOptionSetting InputSlot=Upper: "-s1 "
+*InputSlot Middle/Middle Tray: "%% FoomaticRIPOptionSetting: InputSlot=Middle"
+*FoomaticRIPOptionSetting InputSlot=Middle: "-s3 "
+*InputSlot Lower/Lower Tray: "%% FoomaticRIPOptionSetting: InputSlot=Lower"
+*FoomaticRIPOptionSetting InputSlot=Lower: "-s2 "
+*InputSlot Auto/Auto Source: "%% FoomaticRIPOptionSetting: InputSlot=Auto"
+*FoomaticRIPOptionSetting InputSlot=Auto: "-s7 "
+*InputSlot Envelope/Envelope: "%% FoomaticRIPOptionSetting: InputSlot=Envelope"
+*FoomaticRIPOptionSetting InputSlot=Envelope: "-s5 "
+*InputSlot Manual/Manual Feed: "%% FoomaticRIPOptionSetting: InputSlot=Manual"
+*FoomaticRIPOptionSetting InputSlot=Manual: "-s4 "
+*CloseUI: *InputSlot
+
+*OpenUI *MediaType/Media Type: PickOne
+*FoomaticRIPOption MediaType: enum CmdLine A
+*OrderDependency: 150 AnySetup *MediaType
+*DefaultMediaType: Standard
+*MediaType Envelope/Envelope: "%% FoomaticRIPOptionSetting: MediaType=Envelope"
+*FoomaticRIPOptionSetting MediaType=Envelope: "-m257 "
+*MediaType Labels/Labels: "%% FoomaticRIPOptionSetting: MediaType=Labels"
+*FoomaticRIPOptionSetting MediaType=Labels: "-m263 "
+*MediaType Letterhead/Letterhead: "%% FoomaticRIPOptionSetting: MediaType=Letterhead"
+*FoomaticRIPOptionSetting MediaType=Letterhead: "-m259 "
+*MediaType Postcard/Postcard: "%% FoomaticRIPOptionSetting: MediaType=Postcard"
+*FoomaticRIPOptionSetting MediaType=Postcard: "-m262 "
+*MediaType Standard/Standard Paper: "%% FoomaticRIPOptionSetting: MediaType=Standard"
+*FoomaticRIPOptionSetting MediaType=Standard: "-m1 "
+*MediaType ThickStock/Thick Stock: "%% FoomaticRIPOptionSetting: MediaType=ThickStock"
+*FoomaticRIPOptionSetting MediaType=ThickStock: "-m261 "
+*MediaType Transparency/Transparency: "%% FoomaticRIPOptionSetting: MediaType=Transparency"
+*FoomaticRIPOptionSetting MediaType=Transparency: "-m2 "
+*CloseUI: *MediaType
+
+*OpenUI *Resolution/Resolution: PickOne
+*FoomaticRIPOption Resolution: enum CmdLine A
+*OrderDependency: 130 AnySetup *Resolution
+*DefaultResolution: 1200x600dpi
+*Resolution 600x600dpi/600x600 dpi: "%% FoomaticRIPOptionSetting: Resolution=600x600dpi"
+*FoomaticRIPOptionSetting Resolution=600x600dpi: "-r600x600 "
+*Resolution 1200x600dpi/1200x600 dpi: "%% FoomaticRIPOptionSetting: Resolution=1200x600dpi"
+*FoomaticRIPOptionSetting Resolution=1200x600dpi: "-r1200x600 "
+*CloseUI: *Resolution
+
+*OpenUI *Quality/Printing Quality: PickOne
+*FoomaticRIPOption Quality: enum CmdLine A
+*OrderDependency: 110 AnySetup *Quality
+*DefaultQuality: normal
+*Quality draft/Draft: "%% FoomaticRIPOptionSetting: Quality=draft"
+*FoomaticRIPOptionSetting Quality=draft: " -t "
+*Quality normal/Normal: "%% FoomaticRIPOptionSetting: Quality=normal"
+*FoomaticRIPOptionSetting Quality=normal: " "
+*CloseUI: *Quality
+
+*FoomaticRIPOption ColorMode: enum CmdLine A 120
+*FoomaticRIPOptionSetting ColorMode=Monochrome: " "
+
+*OpenUI *Copies/Copies: PickOne
+*FoomaticRIPOption Copies: int CmdLine A
+*FoomaticRIPOptionPrototype Copies: "-n%s "
+*FoomaticRIPOptionRange Copies: 1 100
+*OrderDependency: 220 AnySetup *Copies
+*DefaultCopies: 1
+*FoomaticRIPDefaultCopies: 1
+*Copies 1/1: "%% FoomaticRIPOptionSetting: Copies=1"
+*Copies 2/2: "%% FoomaticRIPOptionSetting: Copies=2"
+*Copies 3/3: "%% FoomaticRIPOptionSetting: Copies=3"
+*Copies 4/4: "%% FoomaticRIPOptionSetting: Copies=4"
+*Copies 5/5: "%% FoomaticRIPOptionSetting: Copies=5"
+*Copies 6/6: "%% FoomaticRIPOptionSetting: Copies=6"
+*Copies 7/7: "%% FoomaticRIPOptionSetting: Copies=7"
+*Copies 8/8: "%% FoomaticRIPOptionSetting: Copies=8"
+*Copies 9/9: "%% FoomaticRIPOptionSetting: Copies=9"
+*Copies 10/10: "%% FoomaticRIPOptionSetting: Copies=10"
+*Copies 11/11: "%% FoomaticRIPOptionSetting: Copies=11"
+*Copies 12/12: "%% FoomaticRIPOptionSetting: Copies=12"
+*Copies 13/13: "%% FoomaticRIPOptionSetting: Copies=13"
+*Copies 14/14: "%% FoomaticRIPOptionSetting: Copies=14"
+*Copies 15/15: "%% FoomaticRIPOptionSetting: Copies=15"
+*Copies 16/16: "%% FoomaticRIPOptionSetting: Copies=16"
+*Copies 17/17: "%% FoomaticRIPOptionSetting: Copies=17"
+*Copies 18/18: "%% FoomaticRIPOptionSetting: Copies=18"
+*Copies 19/19: "%% FoomaticRIPOptionSetting: Copies=19"
+*Copies 20/20: "%% FoomaticRIPOptionSetting: Copies=20"
+*Copies 21/21: "%% FoomaticRIPOptionSetting: Copies=21"
+*Copies 22/22: "%% FoomaticRIPOptionSetting: Copies=22"
+*Copies 23/23: "%% FoomaticRIPOptionSetting: Copies=23"
+*Copies 24/24: "%% FoomaticRIPOptionSetting: Copies=24"
+*Copies 25/25: "%% FoomaticRIPOptionSetting: Copies=25"
+*Copies 26/26: "%% FoomaticRIPOptionSetting: Copies=26"
+*Copies 27/27: "%% FoomaticRIPOptionSetting: Copies=27"
+*Copies 28/28: "%% FoomaticRIPOptionSetting: Copies=28"
+*Copies 29/29: "%% FoomaticRIPOptionSetting: Copies=29"
+*Copies 30/30: "%% FoomaticRIPOptionSetting: Copies=30"
+*Copies 31/31: "%% FoomaticRIPOptionSetting: Copies=31"
+*Copies 32/32: "%% FoomaticRIPOptionSetting: Copies=32"
+*Copies 33/33: "%% FoomaticRIPOptionSetting: Copies=33"
+*Copies 34/34: "%% FoomaticRIPOptionSetting: Copies=34"
+*Copies 35/35: "%% FoomaticRIPOptionSetting: Copies=35"
+*Copies 36/36: "%% FoomaticRIPOptionSetting: Copies=36"
+*Copies 37/37: "%% FoomaticRIPOptionSetting: Copies=37"
+*Copies 38/38: "%% FoomaticRIPOptionSetting: Copies=38"
+*Copies 39/39: "%% FoomaticRIPOptionSetting: Copies=39"
+*Copies 40/40: "%% FoomaticRIPOptionSetting: Copies=40"
+*Copies 41/41: "%% FoomaticRIPOptionSetting: Copies=41"
+*Copies 42/42: "%% FoomaticRIPOptionSetting: Copies=42"
+*Copies 43/43: "%% FoomaticRIPOptionSetting: Copies=43"
+*Copies 44/44: "%% FoomaticRIPOptionSetting: Copies=44"
+*Copies 45/45: "%% FoomaticRIPOptionSetting: Copies=45"
+*Copies 46/46: "%% FoomaticRIPOptionSetting: Copies=46"
+*Copies 47/47: "%% FoomaticRIPOptionSetting: Copies=47"
+*Copies 48/48: "%% FoomaticRIPOptionSetting: Copies=48"
+*Copies 49/49: "%% FoomaticRIPOptionSetting: Copies=49"
+*Copies 50/50: "%% FoomaticRIPOptionSetting: Copies=50"
+*Copies 51/51: "%% FoomaticRIPOptionSetting: Copies=51"
+*Copies 52/52: "%% FoomaticRIPOptionSetting: Copies=52"
+*Copies 53/53: "%% FoomaticRIPOptionSetting: Copies=53"
+*Copies 54/54: "%% FoomaticRIPOptionSetting: Copies=54"
+*Copies 55/55: "%% FoomaticRIPOptionSetting: Copies=55"
+*Copies 56/56: "%% FoomaticRIPOptionSetting: Copies=56"
+*Copies 57/57: "%% FoomaticRIPOptionSetting: Copies=57"
+*Copies 58/58: "%% FoomaticRIPOptionSetting: Copies=58"
+*Copies 59/59: "%% FoomaticRIPOptionSetting: Copies=59"
+*Copies 60/60: "%% FoomaticRIPOptionSetting: Copies=60"
+*Copies 61/61: "%% FoomaticRIPOptionSetting: Copies=61"
+*Copies 62/62: "%% FoomaticRIPOptionSetting: Copies=62"
+*Copies 63/63: "%% FoomaticRIPOptionSetting: Copies=63"
+*Copies 64/64: "%% FoomaticRIPOptionSetting: Copies=64"
+*Copies 65/65: "%% FoomaticRIPOptionSetting: Copies=65"
+*Copies 66/66: "%% FoomaticRIPOptionSetting: Copies=66"
+*Copies 67/67: "%% FoomaticRIPOptionSetting: Copies=67"
+*Copies 68/68: "%% FoomaticRIPOptionSetting: Copies=68"
+*Copies 69/69: "%% FoomaticRIPOptionSetting: Copies=69"
+*Copies 70/70: "%% FoomaticRIPOptionSetting: Copies=70"
+*Copies 71/71: "%% FoomaticRIPOptionSetting: Copies=71"
+*Copies 72/72: "%% FoomaticRIPOptionSetting: Copies=72"
+*Copies 73/73: "%% FoomaticRIPOptionSetting: Copies=73"
+*Copies 74/74: "%% FoomaticRIPOptionSetting: Copies=74"
+*Copies 75/75: "%% FoomaticRIPOptionSetting: Copies=75"
+*Copies 76/76: "%% FoomaticRIPOptionSetting: Copies=76"
+*Copies 77/77: "%% FoomaticRIPOptionSetting: Copies=77"
+*Copies 78/78: "%% FoomaticRIPOptionSetting: Copies=78"
+*Copies 79/79: "%% FoomaticRIPOptionSetting: Copies=79"
+*Copies 80/80: "%% FoomaticRIPOptionSetting: Copies=80"
+*Copies 81/81: "%% FoomaticRIPOptionSetting: Copies=81"
+*Copies 82/82: "%% FoomaticRIPOptionSetting: Copies=82"
+*Copies 83/83: "%% FoomaticRIPOptionSetting: Copies=83"
+*Copies 84/84: "%% FoomaticRIPOptionSetting: Copies=84"
+*Copies 85/85: "%% FoomaticRIPOptionSetting: Copies=85"
+*Copies 86/86: "%% FoomaticRIPOptionSetting: Copies=86"
+*Copies 87/87: "%% FoomaticRIPOptionSetting: Copies=87"
+*Copies 88/88: "%% FoomaticRIPOptionSetting: Copies=88"
+*Copies 89/89: "%% FoomaticRIPOptionSetting: Copies=89"
+*Copies 90/90: "%% FoomaticRIPOptionSetting: Copies=90"
+*Copies 91/91: "%% FoomaticRIPOptionSetting: Copies=91"
+*Copies 92/92: "%% FoomaticRIPOptionSetting: Copies=92"
+*Copies 93/93: "%% FoomaticRIPOptionSetting: Copies=93"
+*Copies 94/94: "%% FoomaticRIPOptionSetting: Copies=94"
+*Copies 95/95: "%% FoomaticRIPOptionSetting: Copies=95"
+*Copies 96/96: "%% FoomaticRIPOptionSetting: Copies=96"
+*Copies 97/97: "%% FoomaticRIPOptionSetting: Copies=97"
+*Copies 98/98: "%% FoomaticRIPOptionSetting: Copies=98"
+*Copies 99/99: "%% FoomaticRIPOptionSetting: Copies=99"
+*Copies 100/100: "%% FoomaticRIPOptionSetting: Copies=100"
+*CloseUI: *Copies
+
+*FoomaticRIPOption PrinterType: enum CmdLine A 110
+*FoomaticRIPOptionSetting PrinterType=BWz1: "-P -z1 -L0 "
+
+*CloseGroup: General
+
+*OpenGroup: Miscellaneous/Miscellaneous
+
+*OpenUI *Nup/N-up Printing: PickOne
+*FoomaticRIPOption Nup: enum CmdLine A
+*OrderDependency: 200 AnySetup *Nup
+*DefaultNup: 1up
+*Nup 1up/1-up: "%% FoomaticRIPOptionSetting: Nup=1up"
+*FoomaticRIPOptionSetting Nup=1up: " "
+*Nup 2up/2-up: "%% FoomaticRIPOptionSetting: Nup=2up"
+*FoomaticRIPOptionSetting Nup=2up: "-2 "
+*Nup 3up/3-up: "%% FoomaticRIPOptionSetting: Nup=3up"
+*FoomaticRIPOptionSetting Nup=3up: "-3 "
+*Nup 4up/4-up: "%% FoomaticRIPOptionSetting: Nup=4up"
+*FoomaticRIPOptionSetting Nup=4up: "-4 "
+*Nup 6up/6-up: "%% FoomaticRIPOptionSetting: Nup=6up"
+*FoomaticRIPOptionSetting Nup=6up: "-6 "
+*Nup 8up/8-up: "%% FoomaticRIPOptionSetting: Nup=8up"
+*FoomaticRIPOptionSetting Nup=8up: "-8 "
+*Nup 10up/10-up: "%% FoomaticRIPOptionSetting: Nup=10up"
+*FoomaticRIPOptionSetting Nup=10up: "-10 "
+*Nup 12up/12-up: "%% FoomaticRIPOptionSetting: Nup=12up"
+*FoomaticRIPOptionSetting Nup=12up: "-12 "
+*Nup 14up/14-up: "%% FoomaticRIPOptionSetting: Nup=14up"
+*FoomaticRIPOptionSetting Nup=14up: "-14 "
+*Nup 15up/15-up: "%% FoomaticRIPOptionSetting: Nup=15up"
+*FoomaticRIPOptionSetting Nup=15up: "-15 "
+*Nup 16up/16-up: "%% FoomaticRIPOptionSetting: Nup=16up"
+*FoomaticRIPOptionSetting Nup=16up: "-16 "
+*Nup 18up/18-up: "%% FoomaticRIPOptionSetting: Nup=18up"
+*FoomaticRIPOptionSetting Nup=18up: "-18 "
+*CloseUI: *Nup
+
+*OpenUI *NupOrient/N-up Orientation: PickOne
+*FoomaticRIPOption NupOrient: enum CmdLine A
+*OrderDependency: 200 AnySetup *NupOrient
+*DefaultNupOrient: port
+*NupOrient land/Landscape: "%% FoomaticRIPOptionSetting: NupOrient=land"
+*FoomaticRIPOptionSetting NupOrient=land: "-ol "
+*NupOrient port/Portrait: "%% FoomaticRIPOptionSetting: NupOrient=port"
+*FoomaticRIPOptionSetting NupOrient=port: " "
+*NupOrient sea/Seascape: "%% FoomaticRIPOptionSetting: NupOrient=sea"
+*FoomaticRIPOptionSetting NupOrient=sea: "-os "
+*CloseUI: *NupOrient
+
+*CloseGroup: Miscellaneous
+
+
+*% Generic boilerplate PPD stuff as standard PostScript fonts and so on
+
+*DefaultFont: Courier
+*Font AvantGarde-Book: Standard "(001.006S)" Standard ROM
+*Font AvantGarde-BookOblique: Standard "(001.006S)" Standard ROM
+*Font AvantGarde-Demi: Standard "(001.007S)" Standard ROM
+*Font AvantGarde-DemiOblique: Standard "(001.007S)" Standard ROM
+*Font Bookman-Demi: Standard "(001.004S)" Standard ROM
+*Font Bookman-DemiItalic: Standard "(001.004S)" Standard ROM
+*Font Bookman-Light: Standard "(001.004S)" Standard ROM
+*Font Bookman-LightItalic: Standard "(001.004S)" Standard ROM
+*Font Courier: Standard "(002.004S)" Standard ROM
+*Font Courier-Bold: Standard "(002.004S)" Standard ROM
+*Font Courier-BoldOblique: Standard "(002.004S)" Standard ROM
+*Font Courier-Oblique: Standard "(002.004S)" Standard ROM
+*Font Helvetica: Standard "(001.006S)" Standard ROM
+*Font Helvetica-Bold: Standard "(001.007S)" Standard ROM
+*Font Helvetica-BoldOblique: Standard "(001.007S)" Standard ROM
+*Font Helvetica-Narrow: Standard "(001.006S)" Standard ROM
+*Font Helvetica-Narrow-Bold: Standard "(001.007S)" Standard ROM
+*Font Helvetica-Narrow-BoldOblique: Standard "(001.007S)" Standard ROM
+*Font Helvetica-Narrow-Oblique: Standard "(001.006S)" Standard ROM
+*Font Helvetica-Oblique: Standard "(001.006S)" Standard ROM
+*Font NewCenturySchlbk-Bold: Standard "(001.009S)" Standard ROM
+*Font NewCenturySchlbk-BoldItalic: Standard "(001.007S)" Standard ROM
+*Font NewCenturySchlbk-Italic: Standard "(001.006S)" Standard ROM
+*Font NewCenturySchlbk-Roman: Standard "(001.007S)" Standard ROM
+*Font Palatino-Bold: Standard "(001.005S)" Standard ROM
+*Font Palatino-BoldItalic: Standard "(001.005S)" Standard ROM
+*Font Palatino-Italic: Standard "(001.005S)" Standard ROM
+*Font Palatino-Roman: Standard "(001.005S)" Standard ROM
+*Font Symbol: Special "(001.007S)" Special ROM
+*Font Times-Bold: Standard "(001.007S)" Standard ROM
+*Font Times-BoldItalic: Standard "(001.009S)" Standard ROM
+*Font Times-Italic: Standard "(001.007S)" Standard ROM
+*Font Times-Roman: Standard "(001.007S)" Standard ROM
+*Font ZapfChancery-MediumItalic: Standard "(001.007S)" Standard ROM
+*Font ZapfDingbats: Special "(001.004S)" Standard ROM
+
diff --git a/PPD/HP-LaserJet_1020.ppd b/PPD/HP-LaserJet_1020.ppd
new file mode 100644
index 0000000..b0da0e7
--- /dev/null
+++ b/PPD/HP-LaserJet_1020.ppd
@@ -0,0 +1,396 @@
+*PPD-Adobe: "4.3"
+*%
+*% For information on using this, and to obtain the required backend
+*% script, consult http://www.linuxprinting.org/
+*%
+*% This file is published under the GNU General Public License
+*%
+*% PPD-O-MATIC (3.0.0 or newer) generated this PPD file. It is for use with
+*% all programs and environments which use PPD files for dealing with
+*% printer capability information. The printer must be configured with the
+*% "foomatic-rip" backend filter script of Foomatic 3.0.0 or newer. This
+*% file and "foomatic-rip" work together to support PPD-controlled printer
+*% driver option access with arbitrary free software printer drivers and
+*% printing spoolers.
+*%
+*% To save this file on your disk, wait until the download has completed
+*% (the animation of the browser logo must stop) and then use the
+*% "Save as..." command in the "File" menu of your browser or in the
+*% pop-up manu when you click on this document with the right mouse button.
+*% DO NOT cut and paste this file into an editor with your mouse. This can
+*% introduce additional line breaks which lead to unexpected results.
+*%
+*% You may save this file as 'HP-LaserJet_1020-foo2zjs.ppd'
+*%
+*%
+*FormatVersion: "4.3"
+*FileVersion: "1.1"
+*LanguageVersion: English
+*LanguageEncoding: ISOLatin1
+*PCFileName: "FOO2ZJS.PPD"
+*Manufacturer: "HP"
+*Product: "(HP LaserJet 1020)"
+*cupsVersion: 1.0
+*cupsManualCopies: True
+*cupsModelNumber: 2
+*cupsFilter: "application/vnd.cups-postscript 0 foomatic-rip"
+*%pprRIP: foomatic-rip other
+*ModelName: "HP LaserJet 1020"
+*ShortNickName: "HP LaserJet 1020 foo2zjs"
+*NickName: "HP LaserJet 1020 Foomatic/foo2zjs (recommended)"
+*PSVersion: "(3010.000) 550"
+*PSVersion: "(3010.000) 651"
+*PSVersion: "(3010.000) 652"
+*PSVersion: "(3010.000) 653"
+*PSVersion: "(3010.000) 704"
+*PSVersion: "(3010.000) 705"
+*PSVersion: "(3010.000) 800"
+*LanguageLevel: "3"
+*ColorDevice: False
+*DefaultColorSpace: Gray
+*FileSystem: False
+*Throughput: "1"
+*LandscapeOrientation: Plus90
+*TTRasterizer: Type42
+*1284DeviceID: "MFG:Hewlett-Packard;MDL:HP LaserJet 1020;CMD:ACL;DES:HP LaserJet 1020;"
+
+
+
+*VariablePaperSize: False
+
+*FoomaticIDs: HP-LaserJet_1020 foo2zjs
+*FoomaticRIPCommandLine: "foo2zjs-wrapper %A"
+
+*OpenGroup: General/General
+
+*OpenUI *PageSize/Page Size: PickOne
+*FoomaticRIPOption PageSize: enum CmdLine A
+*OrderDependency: 135 AnySetup *PageSize
+*DefaultPageSize: Letter
+*PageSize Letter/Letter: "%% FoomaticRIPOptionSetting: PageSize=Letter"
+*FoomaticRIPOptionSetting PageSize=Letter: "-p1 "
+*PageSize A4/A4: "%% FoomaticRIPOptionSetting: PageSize=A4"
+*FoomaticRIPOptionSetting PageSize=A4: "-p9 "
+*PageSize A5/A5: "%% FoomaticRIPOptionSetting: PageSize=A5"
+*FoomaticRIPOptionSetting PageSize=A5: "-p11 "
+*PageSize B5/B5: "%% FoomaticRIPOptionSetting: PageSize=B5"
+*FoomaticRIPOptionSetting PageSize=B5: "-p13 "
+*PageSize Env10/Env #10: "%% FoomaticRIPOptionSetting: PageSize=Env10"
+*FoomaticRIPOptionSetting PageSize=Env10: "-p20 "
+*PageSize EnvB5/Env B5: "%% FoomaticRIPOptionSetting: PageSize=EnvB5"
+*FoomaticRIPOptionSetting PageSize=EnvB5: "-p34 "
+*PageSize EnvC5/Env C5: "%% FoomaticRIPOptionSetting: PageSize=EnvC5"
+*FoomaticRIPOptionSetting PageSize=EnvC5: "-p28 "
+*PageSize EnvDL/Env DL: "%% FoomaticRIPOptionSetting: PageSize=EnvDL"
+*FoomaticRIPOptionSetting PageSize=EnvDL: "-p27 "
+*PageSize EnvMonarch/Env Monarch: "%% FoomaticRIPOptionSetting: PageSize=EnvMonarch"
+*FoomaticRIPOptionSetting PageSize=EnvMonarch: "-p37 "
+*PageSize Executive/Executive: "%% FoomaticRIPOptionSetting: PageSize=Executive"
+*FoomaticRIPOptionSetting PageSize=Executive: "-p7 "
+*PageSize Legal/Legal: "%% FoomaticRIPOptionSetting: PageSize=Legal"
+*FoomaticRIPOptionSetting PageSize=Legal: "-p5 "
+*CloseUI: *PageSize
+
+*OpenUI *PageRegion: PickOne
+*OrderDependency: 135 AnySetup *PageRegion
+*DefaultPageRegion: Letter
+*PageRegion Letter/Letter: "%% FoomaticRIPOptionSetting: PageSize=Letter"
+*PageRegion A4/A4: "%% FoomaticRIPOptionSetting: PageSize=A4"
+*PageRegion A5/A5: "%% FoomaticRIPOptionSetting: PageSize=A5"
+*PageRegion B5/B5: "%% FoomaticRIPOptionSetting: PageSize=B5"
+*PageRegion Env10/Env #10: "%% FoomaticRIPOptionSetting: PageSize=Env10"
+*PageRegion EnvB5/Env B5: "%% FoomaticRIPOptionSetting: PageSize=EnvB5"
+*PageRegion EnvC5/Env C5: "%% FoomaticRIPOptionSetting: PageSize=EnvC5"
+*PageRegion EnvDL/Env DL: "%% FoomaticRIPOptionSetting: PageSize=EnvDL"
+*PageRegion EnvMonarch/Env Monarch: "%% FoomaticRIPOptionSetting: PageSize=EnvMonarch"
+*PageRegion Executive/Executive: "%% FoomaticRIPOptionSetting: PageSize=Executive"
+*PageRegion Legal/Legal: "%% FoomaticRIPOptionSetting: PageSize=Legal"
+*CloseUI: *PageRegion
+
+*DefaultImageableArea: Letter
+*ImageableArea Letter/Letter: "11.34 11.34 600.66 780.66"
+*ImageableArea A4/A4: "11.34 11.34 583.66 830.66"
+*ImageableArea A5/A5: "11.34 11.34 408.66 583.66"
+*ImageableArea B5/B5: "11.34 11.34 486.66 696.66"
+*ImageableArea Env10/Env #10: "11.34 11.34 285.66 672.66"
+*ImageableArea EnvB5/Env B5: "11.34 11.34 486.66 696.66"
+*ImageableArea EnvC5/Env C5: "11.34 11.34 447.66 637.66"
+*ImageableArea EnvDL/Env DL: "11.34 11.34 299.66 611.66"
+*ImageableArea EnvMonarch/Env Monarch: "11.34 11.34 267.66 528.66"
+*ImageableArea Executive/Executive: "11.34 11.34 510.66 744.66"
+*ImageableArea Legal/Legal: "11.34 11.34 600.66 996.66"
+
+*DefaultPaperDimension: Letter
+*PaperDimension Letter/Letter: "612 792"
+*PaperDimension A4/A4: "595 842"
+*PaperDimension A5/A5: "420 595"
+*PaperDimension B5/B5: "498 708"
+*PaperDimension Env10/Env #10: "297 684"
+*PaperDimension EnvB5/Env B5: "498 708"
+*PaperDimension EnvC5/Env C5: "459 649"
+*PaperDimension EnvDL/Env DL: "311 623"
+*PaperDimension EnvMonarch/Env Monarch: "279 540"
+*PaperDimension Executive/Executive: "522 756"
+*PaperDimension Legal/Legal: "612 1008"
+
+*OpenUI *InputSlot/Media Source: PickOne
+*FoomaticRIPOption InputSlot: enum CmdLine A
+*OrderDependency: 150 AnySetup *InputSlot
+*DefaultInputSlot: Auto
+*InputSlot Upper/Upper or Only One InputSlot: "%% FoomaticRIPOptionSetting: InputSlot=Upper"
+*FoomaticRIPOptionSetting InputSlot=Upper: "-s1 "
+*InputSlot Middle/Middle Tray: "%% FoomaticRIPOptionSetting: InputSlot=Middle"
+*FoomaticRIPOptionSetting InputSlot=Middle: "-s3 "
+*InputSlot Lower/Lower Tray: "%% FoomaticRIPOptionSetting: InputSlot=Lower"
+*FoomaticRIPOptionSetting InputSlot=Lower: "-s2 "
+*InputSlot Auto/Auto Source: "%% FoomaticRIPOptionSetting: InputSlot=Auto"
+*FoomaticRIPOptionSetting InputSlot=Auto: "-s7 "
+*InputSlot Envelope/Envelope: "%% FoomaticRIPOptionSetting: InputSlot=Envelope"
+*FoomaticRIPOptionSetting InputSlot=Envelope: "-s5 "
+*InputSlot Manual/Manual Feed: "%% FoomaticRIPOptionSetting: InputSlot=Manual"
+*FoomaticRIPOptionSetting InputSlot=Manual: "-s4 "
+*CloseUI: *InputSlot
+
+*OpenUI *MediaType/Media Type: PickOne
+*FoomaticRIPOption MediaType: enum CmdLine A
+*OrderDependency: 150 AnySetup *MediaType
+*DefaultMediaType: Standard
+*MediaType Envelope/Envelope: "%% FoomaticRIPOptionSetting: MediaType=Envelope"
+*FoomaticRIPOptionSetting MediaType=Envelope: "-m257 "
+*MediaType Labels/Labels: "%% FoomaticRIPOptionSetting: MediaType=Labels"
+*FoomaticRIPOptionSetting MediaType=Labels: "-m263 "
+*MediaType Letterhead/Letterhead: "%% FoomaticRIPOptionSetting: MediaType=Letterhead"
+*FoomaticRIPOptionSetting MediaType=Letterhead: "-m259 "
+*MediaType Postcard/Postcard: "%% FoomaticRIPOptionSetting: MediaType=Postcard"
+*FoomaticRIPOptionSetting MediaType=Postcard: "-m262 "
+*MediaType Standard/Standard Paper: "%% FoomaticRIPOptionSetting: MediaType=Standard"
+*FoomaticRIPOptionSetting MediaType=Standard: "-m1 "
+*MediaType ThickStock/Thick Stock: "%% FoomaticRIPOptionSetting: MediaType=ThickStock"
+*FoomaticRIPOptionSetting MediaType=ThickStock: "-m261 "
+*MediaType Transparency/Transparency: "%% FoomaticRIPOptionSetting: MediaType=Transparency"
+*FoomaticRIPOptionSetting MediaType=Transparency: "-m2 "
+*CloseUI: *MediaType
+
+*OpenUI *Resolution/Resolution: PickOne
+*FoomaticRIPOption Resolution: enum CmdLine A
+*OrderDependency: 130 AnySetup *Resolution
+*DefaultResolution: 1200x600dpi
+*Resolution 600x600dpi/600x600 dpi: "%% FoomaticRIPOptionSetting: Resolution=600x600dpi"
+*FoomaticRIPOptionSetting Resolution=600x600dpi: "-r600x600 "
+*Resolution 1200x600dpi/1200x600 dpi: "%% FoomaticRIPOptionSetting: Resolution=1200x600dpi"
+*FoomaticRIPOptionSetting Resolution=1200x600dpi: "-r1200x600 "
+*CloseUI: *Resolution
+
+*OpenUI *Quality/Printing Quality: PickOne
+*FoomaticRIPOption Quality: enum CmdLine A
+*OrderDependency: 110 AnySetup *Quality
+*DefaultQuality: normal
+*Quality draft/Draft: "%% FoomaticRIPOptionSetting: Quality=draft"
+*FoomaticRIPOptionSetting Quality=draft: " -t "
+*Quality normal/Normal: "%% FoomaticRIPOptionSetting: Quality=normal"
+*FoomaticRIPOptionSetting Quality=normal: " "
+*CloseUI: *Quality
+
+*FoomaticRIPOption ColorMode: enum CmdLine A 120
+*FoomaticRIPOptionSetting ColorMode=Monochrome: " "
+
+*OpenUI *Copies/Copies: PickOne
+*FoomaticRIPOption Copies: int CmdLine A
+*FoomaticRIPOptionPrototype Copies: "-n%s "
+*FoomaticRIPOptionRange Copies: 1 100
+*OrderDependency: 220 AnySetup *Copies
+*DefaultCopies: 1
+*FoomaticRIPDefaultCopies: 1
+*Copies 1/1: "%% FoomaticRIPOptionSetting: Copies=1"
+*Copies 2/2: "%% FoomaticRIPOptionSetting: Copies=2"
+*Copies 3/3: "%% FoomaticRIPOptionSetting: Copies=3"
+*Copies 4/4: "%% FoomaticRIPOptionSetting: Copies=4"
+*Copies 5/5: "%% FoomaticRIPOptionSetting: Copies=5"
+*Copies 6/6: "%% FoomaticRIPOptionSetting: Copies=6"
+*Copies 7/7: "%% FoomaticRIPOptionSetting: Copies=7"
+*Copies 8/8: "%% FoomaticRIPOptionSetting: Copies=8"
+*Copies 9/9: "%% FoomaticRIPOptionSetting: Copies=9"
+*Copies 10/10: "%% FoomaticRIPOptionSetting: Copies=10"
+*Copies 11/11: "%% FoomaticRIPOptionSetting: Copies=11"
+*Copies 12/12: "%% FoomaticRIPOptionSetting: Copies=12"
+*Copies 13/13: "%% FoomaticRIPOptionSetting: Copies=13"
+*Copies 14/14: "%% FoomaticRIPOptionSetting: Copies=14"
+*Copies 15/15: "%% FoomaticRIPOptionSetting: Copies=15"
+*Copies 16/16: "%% FoomaticRIPOptionSetting: Copies=16"
+*Copies 17/17: "%% FoomaticRIPOptionSetting: Copies=17"
+*Copies 18/18: "%% FoomaticRIPOptionSetting: Copies=18"
+*Copies 19/19: "%% FoomaticRIPOptionSetting: Copies=19"
+*Copies 20/20: "%% FoomaticRIPOptionSetting: Copies=20"
+*Copies 21/21: "%% FoomaticRIPOptionSetting: Copies=21"
+*Copies 22/22: "%% FoomaticRIPOptionSetting: Copies=22"
+*Copies 23/23: "%% FoomaticRIPOptionSetting: Copies=23"
+*Copies 24/24: "%% FoomaticRIPOptionSetting: Copies=24"
+*Copies 25/25: "%% FoomaticRIPOptionSetting: Copies=25"
+*Copies 26/26: "%% FoomaticRIPOptionSetting: Copies=26"
+*Copies 27/27: "%% FoomaticRIPOptionSetting: Copies=27"
+*Copies 28/28: "%% FoomaticRIPOptionSetting: Copies=28"
+*Copies 29/29: "%% FoomaticRIPOptionSetting: Copies=29"
+*Copies 30/30: "%% FoomaticRIPOptionSetting: Copies=30"
+*Copies 31/31: "%% FoomaticRIPOptionSetting: Copies=31"
+*Copies 32/32: "%% FoomaticRIPOptionSetting: Copies=32"
+*Copies 33/33: "%% FoomaticRIPOptionSetting: Copies=33"
+*Copies 34/34: "%% FoomaticRIPOptionSetting: Copies=34"
+*Copies 35/35: "%% FoomaticRIPOptionSetting: Copies=35"
+*Copies 36/36: "%% FoomaticRIPOptionSetting: Copies=36"
+*Copies 37/37: "%% FoomaticRIPOptionSetting: Copies=37"
+*Copies 38/38: "%% FoomaticRIPOptionSetting: Copies=38"
+*Copies 39/39: "%% FoomaticRIPOptionSetting: Copies=39"
+*Copies 40/40: "%% FoomaticRIPOptionSetting: Copies=40"
+*Copies 41/41: "%% FoomaticRIPOptionSetting: Copies=41"
+*Copies 42/42: "%% FoomaticRIPOptionSetting: Copies=42"
+*Copies 43/43: "%% FoomaticRIPOptionSetting: Copies=43"
+*Copies 44/44: "%% FoomaticRIPOptionSetting: Copies=44"
+*Copies 45/45: "%% FoomaticRIPOptionSetting: Copies=45"
+*Copies 46/46: "%% FoomaticRIPOptionSetting: Copies=46"
+*Copies 47/47: "%% FoomaticRIPOptionSetting: Copies=47"
+*Copies 48/48: "%% FoomaticRIPOptionSetting: Copies=48"
+*Copies 49/49: "%% FoomaticRIPOptionSetting: Copies=49"
+*Copies 50/50: "%% FoomaticRIPOptionSetting: Copies=50"
+*Copies 51/51: "%% FoomaticRIPOptionSetting: Copies=51"
+*Copies 52/52: "%% FoomaticRIPOptionSetting: Copies=52"
+*Copies 53/53: "%% FoomaticRIPOptionSetting: Copies=53"
+*Copies 54/54: "%% FoomaticRIPOptionSetting: Copies=54"
+*Copies 55/55: "%% FoomaticRIPOptionSetting: Copies=55"
+*Copies 56/56: "%% FoomaticRIPOptionSetting: Copies=56"
+*Copies 57/57: "%% FoomaticRIPOptionSetting: Copies=57"
+*Copies 58/58: "%% FoomaticRIPOptionSetting: Copies=58"
+*Copies 59/59: "%% FoomaticRIPOptionSetting: Copies=59"
+*Copies 60/60: "%% FoomaticRIPOptionSetting: Copies=60"
+*Copies 61/61: "%% FoomaticRIPOptionSetting: Copies=61"
+*Copies 62/62: "%% FoomaticRIPOptionSetting: Copies=62"
+*Copies 63/63: "%% FoomaticRIPOptionSetting: Copies=63"
+*Copies 64/64: "%% FoomaticRIPOptionSetting: Copies=64"
+*Copies 65/65: "%% FoomaticRIPOptionSetting: Copies=65"
+*Copies 66/66: "%% FoomaticRIPOptionSetting: Copies=66"
+*Copies 67/67: "%% FoomaticRIPOptionSetting: Copies=67"
+*Copies 68/68: "%% FoomaticRIPOptionSetting: Copies=68"
+*Copies 69/69: "%% FoomaticRIPOptionSetting: Copies=69"
+*Copies 70/70: "%% FoomaticRIPOptionSetting: Copies=70"
+*Copies 71/71: "%% FoomaticRIPOptionSetting: Copies=71"
+*Copies 72/72: "%% FoomaticRIPOptionSetting: Copies=72"
+*Copies 73/73: "%% FoomaticRIPOptionSetting: Copies=73"
+*Copies 74/74: "%% FoomaticRIPOptionSetting: Copies=74"
+*Copies 75/75: "%% FoomaticRIPOptionSetting: Copies=75"
+*Copies 76/76: "%% FoomaticRIPOptionSetting: Copies=76"
+*Copies 77/77: "%% FoomaticRIPOptionSetting: Copies=77"
+*Copies 78/78: "%% FoomaticRIPOptionSetting: Copies=78"
+*Copies 79/79: "%% FoomaticRIPOptionSetting: Copies=79"
+*Copies 80/80: "%% FoomaticRIPOptionSetting: Copies=80"
+*Copies 81/81: "%% FoomaticRIPOptionSetting: Copies=81"
+*Copies 82/82: "%% FoomaticRIPOptionSetting: Copies=82"
+*Copies 83/83: "%% FoomaticRIPOptionSetting: Copies=83"
+*Copies 84/84: "%% FoomaticRIPOptionSetting: Copies=84"
+*Copies 85/85: "%% FoomaticRIPOptionSetting: Copies=85"
+*Copies 86/86: "%% FoomaticRIPOptionSetting: Copies=86"
+*Copies 87/87: "%% FoomaticRIPOptionSetting: Copies=87"
+*Copies 88/88: "%% FoomaticRIPOptionSetting: Copies=88"
+*Copies 89/89: "%% FoomaticRIPOptionSetting: Copies=89"
+*Copies 90/90: "%% FoomaticRIPOptionSetting: Copies=90"
+*Copies 91/91: "%% FoomaticRIPOptionSetting: Copies=91"
+*Copies 92/92: "%% FoomaticRIPOptionSetting: Copies=92"
+*Copies 93/93: "%% FoomaticRIPOptionSetting: Copies=93"
+*Copies 94/94: "%% FoomaticRIPOptionSetting: Copies=94"
+*Copies 95/95: "%% FoomaticRIPOptionSetting: Copies=95"
+*Copies 96/96: "%% FoomaticRIPOptionSetting: Copies=96"
+*Copies 97/97: "%% FoomaticRIPOptionSetting: Copies=97"
+*Copies 98/98: "%% FoomaticRIPOptionSetting: Copies=98"
+*Copies 99/99: "%% FoomaticRIPOptionSetting: Copies=99"
+*Copies 100/100: "%% FoomaticRIPOptionSetting: Copies=100"
+*CloseUI: *Copies
+
+*FoomaticRIPOption PrinterType: enum CmdLine A 110
+*FoomaticRIPOptionSetting PrinterType=BWz1: "-P -z1 -L0 "
+
+*CloseGroup: General
+
+*OpenGroup: Miscellaneous/Miscellaneous
+
+*OpenUI *Nup/N-up Printing: PickOne
+*FoomaticRIPOption Nup: enum CmdLine A
+*OrderDependency: 200 AnySetup *Nup
+*DefaultNup: 1up
+*Nup 1up/1-up: "%% FoomaticRIPOptionSetting: Nup=1up"
+*FoomaticRIPOptionSetting Nup=1up: " "
+*Nup 2up/2-up: "%% FoomaticRIPOptionSetting: Nup=2up"
+*FoomaticRIPOptionSetting Nup=2up: "-2 "
+*Nup 3up/3-up: "%% FoomaticRIPOptionSetting: Nup=3up"
+*FoomaticRIPOptionSetting Nup=3up: "-3 "
+*Nup 4up/4-up: "%% FoomaticRIPOptionSetting: Nup=4up"
+*FoomaticRIPOptionSetting Nup=4up: "-4 "
+*Nup 6up/6-up: "%% FoomaticRIPOptionSetting: Nup=6up"
+*FoomaticRIPOptionSetting Nup=6up: "-6 "
+*Nup 8up/8-up: "%% FoomaticRIPOptionSetting: Nup=8up"
+*FoomaticRIPOptionSetting Nup=8up: "-8 "
+*Nup 10up/10-up: "%% FoomaticRIPOptionSetting: Nup=10up"
+*FoomaticRIPOptionSetting Nup=10up: "-10 "
+*Nup 12up/12-up: "%% FoomaticRIPOptionSetting: Nup=12up"
+*FoomaticRIPOptionSetting Nup=12up: "-12 "
+*Nup 14up/14-up: "%% FoomaticRIPOptionSetting: Nup=14up"
+*FoomaticRIPOptionSetting Nup=14up: "-14 "
+*Nup 15up/15-up: "%% FoomaticRIPOptionSetting: Nup=15up"
+*FoomaticRIPOptionSetting Nup=15up: "-15 "
+*Nup 16up/16-up: "%% FoomaticRIPOptionSetting: Nup=16up"
+*FoomaticRIPOptionSetting Nup=16up: "-16 "
+*Nup 18up/18-up: "%% FoomaticRIPOptionSetting: Nup=18up"
+*FoomaticRIPOptionSetting Nup=18up: "-18 "
+*CloseUI: *Nup
+
+*OpenUI *NupOrient/N-up Orientation: PickOne
+*FoomaticRIPOption NupOrient: enum CmdLine A
+*OrderDependency: 200 AnySetup *NupOrient
+*DefaultNupOrient: port
+*NupOrient land/Landscape: "%% FoomaticRIPOptionSetting: NupOrient=land"
+*FoomaticRIPOptionSetting NupOrient=land: "-ol "
+*NupOrient port/Portrait: "%% FoomaticRIPOptionSetting: NupOrient=port"
+*FoomaticRIPOptionSetting NupOrient=port: " "
+*NupOrient sea/Seascape: "%% FoomaticRIPOptionSetting: NupOrient=sea"
+*FoomaticRIPOptionSetting NupOrient=sea: "-os "
+*CloseUI: *NupOrient
+
+*CloseGroup: Miscellaneous
+
+
+*% Generic boilerplate PPD stuff as standard PostScript fonts and so on
+
+*DefaultFont: Courier
+*Font AvantGarde-Book: Standard "(001.006S)" Standard ROM
+*Font AvantGarde-BookOblique: Standard "(001.006S)" Standard ROM
+*Font AvantGarde-Demi: Standard "(001.007S)" Standard ROM
+*Font AvantGarde-DemiOblique: Standard "(001.007S)" Standard ROM
+*Font Bookman-Demi: Standard "(001.004S)" Standard ROM
+*Font Bookman-DemiItalic: Standard "(001.004S)" Standard ROM
+*Font Bookman-Light: Standard "(001.004S)" Standard ROM
+*Font Bookman-LightItalic: Standard "(001.004S)" Standard ROM
+*Font Courier: Standard "(002.004S)" Standard ROM
+*Font Courier-Bold: Standard "(002.004S)" Standard ROM
+*Font Courier-BoldOblique: Standard "(002.004S)" Standard ROM
+*Font Courier-Oblique: Standard "(002.004S)" Standard ROM
+*Font Helvetica: Standard "(001.006S)" Standard ROM
+*Font Helvetica-Bold: Standard "(001.007S)" Standard ROM
+*Font Helvetica-BoldOblique: Standard "(001.007S)" Standard ROM
+*Font Helvetica-Narrow: Standard "(001.006S)" Standard ROM
+*Font Helvetica-Narrow-Bold: Standard "(001.007S)" Standard ROM
+*Font Helvetica-Narrow-BoldOblique: Standard "(001.007S)" Standard ROM
+*Font Helvetica-Narrow-Oblique: Standard "(001.006S)" Standard ROM
+*Font Helvetica-Oblique: Standard "(001.006S)" Standard ROM
+*Font NewCenturySchlbk-Bold: Standard "(001.009S)" Standard ROM
+*Font NewCenturySchlbk-BoldItalic: Standard "(001.007S)" Standard ROM
+*Font NewCenturySchlbk-Italic: Standard "(001.006S)" Standard ROM
+*Font NewCenturySchlbk-Roman: Standard "(001.007S)" Standard ROM
+*Font Palatino-Bold: Standard "(001.005S)" Standard ROM
+*Font Palatino-BoldItalic: Standard "(001.005S)" Standard ROM
+*Font Palatino-Italic: Standard "(001.005S)" Standard ROM
+*Font Palatino-Roman: Standard "(001.005S)" Standard ROM
+*Font Symbol: Special "(001.007S)" Special ROM
+*Font Times-Bold: Standard "(001.007S)" Standard ROM
+*Font Times-BoldItalic: Standard "(001.009S)" Standard ROM
+*Font Times-Italic: Standard "(001.007S)" Standard ROM
+*Font Times-Roman: Standard "(001.007S)" Standard ROM
+*Font ZapfChancery-MediumItalic: Standard "(001.007S)" Standard ROM
+*Font ZapfDingbats: Special "(001.004S)" Standard ROM
+
diff --git a/PPD/HP-LaserJet_1022.ppd b/PPD/HP-LaserJet_1022.ppd
new file mode 100644
index 0000000..4a695a4
--- /dev/null
+++ b/PPD/HP-LaserJet_1022.ppd
@@ -0,0 +1,412 @@
+*PPD-Adobe: "4.3"
+*%
+*% For information on using this, and to obtain the required backend
+*% script, consult http://www.linuxprinting.org/
+*%
+*% This file is published under the GNU General Public License
+*%
+*% PPD-O-MATIC (3.0.0 or newer) generated this PPD file. It is for use with
+*% all programs and environments which use PPD files for dealing with
+*% printer capability information. The printer must be configured with the
+*% "foomatic-rip" backend filter script of Foomatic 3.0.0 or newer. This
+*% file and "foomatic-rip" work together to support PPD-controlled printer
+*% driver option access with arbitrary free software printer drivers and
+*% printing spoolers.
+*%
+*% To save this file on your disk, wait until the download has completed
+*% (the animation of the browser logo must stop) and then use the
+*% "Save as..." command in the "File" menu of your browser or in the
+*% pop-up manu when you click on this document with the right mouse button.
+*% DO NOT cut and paste this file into an editor with your mouse. This can
+*% introduce additional line breaks which lead to unexpected results.
+*%
+*% You may save this file as 'HP-LaserJet_1022-foo2zjs.ppd'
+*%
+*%
+*FormatVersion: "4.3"
+*FileVersion: "1.1"
+*LanguageVersion: English
+*LanguageEncoding: ISOLatin1
+*PCFileName: "FOO2ZJS.PPD"
+*Manufacturer: "HP"
+*Product: "(HP LaserJet 1022)"
+*cupsVersion: 1.0
+*cupsManualCopies: True
+*cupsModelNumber: 2
+*cupsFilter: "application/vnd.cups-postscript 0 foomatic-rip"
+*%pprRIP: foomatic-rip other
+*ModelName: "HP LaserJet 1022"
+*ShortNickName: "HP LaserJet 1022 foo2zjs"
+*NickName: "HP LaserJet 1022 Foomatic/foo2zjs (recommended)"
+*PSVersion: "(3010.000) 550"
+*PSVersion: "(3010.000) 651"
+*PSVersion: "(3010.000) 652"
+*PSVersion: "(3010.000) 653"
+*PSVersion: "(3010.000) 704"
+*PSVersion: "(3010.000) 705"
+*PSVersion: "(3010.000) 800"
+*LanguageLevel: "3"
+*ColorDevice: False
+*DefaultColorSpace: Gray
+*FileSystem: False
+*Throughput: "1"
+*LandscapeOrientation: Plus90
+*TTRasterizer: Type42
+*1284DeviceID: "MFG:Hewlett-Packard;MDL:HP LaserJet 1022;CMD:ACL;DES:HP LaserJet 1022;"
+
+
+
+*VariablePaperSize: False
+
+*FoomaticIDs: HP-LaserJet_1022 foo2zjs
+*FoomaticRIPCommandLine: "foo2zjs-wrapper %A"
+
+*OpenGroup: General/General
+
+*OpenUI *PageSize/Page Size: PickOne
+*FoomaticRIPOption PageSize: enum CmdLine A
+*OrderDependency: 135 AnySetup *PageSize
+*DefaultPageSize: Letter
+*PageSize Letter/Letter: "%% FoomaticRIPOptionSetting: PageSize=Letter"
+*FoomaticRIPOptionSetting PageSize=Letter: "-p1 "
+*PageSize A4/A4: "%% FoomaticRIPOptionSetting: PageSize=A4"
+*FoomaticRIPOptionSetting PageSize=A4: "-p9 "
+*PageSize A5/A5: "%% FoomaticRIPOptionSetting: PageSize=A5"
+*FoomaticRIPOptionSetting PageSize=A5: "-p11 "
+*PageSize B5/B5: "%% FoomaticRIPOptionSetting: PageSize=B5"
+*FoomaticRIPOptionSetting PageSize=B5: "-p13 "
+*PageSize Env10/Env #10: "%% FoomaticRIPOptionSetting: PageSize=Env10"
+*FoomaticRIPOptionSetting PageSize=Env10: "-p20 "
+*PageSize EnvB5/Env B5: "%% FoomaticRIPOptionSetting: PageSize=EnvB5"
+*FoomaticRIPOptionSetting PageSize=EnvB5: "-p34 "
+*PageSize EnvC5/Env C5: "%% FoomaticRIPOptionSetting: PageSize=EnvC5"
+*FoomaticRIPOptionSetting PageSize=EnvC5: "-p28 "
+*PageSize EnvDL/Env DL: "%% FoomaticRIPOptionSetting: PageSize=EnvDL"
+*FoomaticRIPOptionSetting PageSize=EnvDL: "-p27 "
+*PageSize EnvMonarch/Env Monarch: "%% FoomaticRIPOptionSetting: PageSize=EnvMonarch"
+*FoomaticRIPOptionSetting PageSize=EnvMonarch: "-p37 "
+*PageSize Executive/Executive: "%% FoomaticRIPOptionSetting: PageSize=Executive"
+*FoomaticRIPOptionSetting PageSize=Executive: "-p7 "
+*PageSize Legal/Legal: "%% FoomaticRIPOptionSetting: PageSize=Legal"
+*FoomaticRIPOptionSetting PageSize=Legal: "-p5 "
+*CloseUI: *PageSize
+
+*OpenUI *PageRegion: PickOne
+*OrderDependency: 135 AnySetup *PageRegion
+*DefaultPageRegion: Letter
+*PageRegion Letter/Letter: "%% FoomaticRIPOptionSetting: PageSize=Letter"
+*PageRegion A4/A4: "%% FoomaticRIPOptionSetting: PageSize=A4"
+*PageRegion A5/A5: "%% FoomaticRIPOptionSetting: PageSize=A5"
+*PageRegion B5/B5: "%% FoomaticRIPOptionSetting: PageSize=B5"
+*PageRegion Env10/Env #10: "%% FoomaticRIPOptionSetting: PageSize=Env10"
+*PageRegion EnvB5/Env B5: "%% FoomaticRIPOptionSetting: PageSize=EnvB5"
+*PageRegion EnvC5/Env C5: "%% FoomaticRIPOptionSetting: PageSize=EnvC5"
+*PageRegion EnvDL/Env DL: "%% FoomaticRIPOptionSetting: PageSize=EnvDL"
+*PageRegion EnvMonarch/Env Monarch: "%% FoomaticRIPOptionSetting: PageSize=EnvMonarch"
+*PageRegion Executive/Executive: "%% FoomaticRIPOptionSetting: PageSize=Executive"
+*PageRegion Legal/Legal: "%% FoomaticRIPOptionSetting: PageSize=Legal"
+*CloseUI: *PageRegion
+
+*DefaultImageableArea: Letter
+*ImageableArea Letter/Letter: "11.34 11.34 600.66 780.66"
+*ImageableArea A4/A4: "11.34 11.34 583.66 830.66"
+*ImageableArea A5/A5: "11.34 11.34 408.66 583.66"
+*ImageableArea B5/B5: "11.34 11.34 486.66 696.66"
+*ImageableArea Env10/Env #10: "11.34 11.34 285.66 672.66"
+*ImageableArea EnvB5/Env B5: "11.34 11.34 486.66 696.66"
+*ImageableArea EnvC5/Env C5: "11.34 11.34 447.66 637.66"
+*ImageableArea EnvDL/Env DL: "11.34 11.34 299.66 611.66"
+*ImageableArea EnvMonarch/Env Monarch: "11.34 11.34 267.66 528.66"
+*ImageableArea Executive/Executive: "11.34 11.34 510.66 744.66"
+*ImageableArea Legal/Legal: "11.34 11.34 600.66 996.66"
+
+*DefaultPaperDimension: Letter
+*PaperDimension Letter/Letter: "612 792"
+*PaperDimension A4/A4: "595 842"
+*PaperDimension A5/A5: "420 595"
+*PaperDimension B5/B5: "498 708"
+*PaperDimension Env10/Env #10: "297 684"
+*PaperDimension EnvB5/Env B5: "498 708"
+*PaperDimension EnvC5/Env C5: "459 649"
+*PaperDimension EnvDL/Env DL: "311 623"
+*PaperDimension EnvMonarch/Env Monarch: "279 540"
+*PaperDimension Executive/Executive: "522 756"
+*PaperDimension Legal/Legal: "612 1008"
+
+*OpenUI *InputSlot/Media Source: PickOne
+*FoomaticRIPOption InputSlot: enum CmdLine A
+*OrderDependency: 150 AnySetup *InputSlot
+*DefaultInputSlot: Auto
+*InputSlot Upper/Upper or Only One InputSlot: "%% FoomaticRIPOptionSetting: InputSlot=Upper"
+*FoomaticRIPOptionSetting InputSlot=Upper: "-s1 "
+*InputSlot Middle/Middle Tray: "%% FoomaticRIPOptionSetting: InputSlot=Middle"
+*FoomaticRIPOptionSetting InputSlot=Middle: "-s3 "
+*InputSlot Lower/Lower Tray: "%% FoomaticRIPOptionSetting: InputSlot=Lower"
+*FoomaticRIPOptionSetting InputSlot=Lower: "-s2 "
+*InputSlot Auto/Auto Source: "%% FoomaticRIPOptionSetting: InputSlot=Auto"
+*FoomaticRIPOptionSetting InputSlot=Auto: "-s7 "
+*InputSlot Envelope/Envelope: "%% FoomaticRIPOptionSetting: InputSlot=Envelope"
+*FoomaticRIPOptionSetting InputSlot=Envelope: "-s5 "
+*InputSlot Manual/Manual Feed: "%% FoomaticRIPOptionSetting: InputSlot=Manual"
+*FoomaticRIPOptionSetting InputSlot=Manual: "-s4 "
+*CloseUI: *InputSlot
+
+*OpenUI *MediaType/Media Type: PickOne
+*FoomaticRIPOption MediaType: enum CmdLine A
+*OrderDependency: 150 AnySetup *MediaType
+*DefaultMediaType: Standard
+*MediaType Envelope/Envelope: "%% FoomaticRIPOptionSetting: MediaType=Envelope"
+*FoomaticRIPOptionSetting MediaType=Envelope: "-m257 "
+*MediaType Labels/Labels: "%% FoomaticRIPOptionSetting: MediaType=Labels"
+*FoomaticRIPOptionSetting MediaType=Labels: "-m263 "
+*MediaType Letterhead/Letterhead: "%% FoomaticRIPOptionSetting: MediaType=Letterhead"
+*FoomaticRIPOptionSetting MediaType=Letterhead: "-m259 "
+*MediaType Postcard/Postcard: "%% FoomaticRIPOptionSetting: MediaType=Postcard"
+*FoomaticRIPOptionSetting MediaType=Postcard: "-m262 "
+*MediaType Standard/Standard Paper: "%% FoomaticRIPOptionSetting: MediaType=Standard"
+*FoomaticRIPOptionSetting MediaType=Standard: "-m1 "
+*MediaType ThickStock/Thick Stock: "%% FoomaticRIPOptionSetting: MediaType=ThickStock"
+*FoomaticRIPOptionSetting MediaType=ThickStock: "-m261 "
+*MediaType Transparency/Transparency: "%% FoomaticRIPOptionSetting: MediaType=Transparency"
+*FoomaticRIPOptionSetting MediaType=Transparency: "-m2 "
+*CloseUI: *MediaType
+
+*OpenUI *Duplex/Duplex Printing: PickOne
+*FoomaticRIPOption Duplex: enum CmdLine A
+*OrderDependency: 210 AnySetup *Duplex
+*DefaultDuplex: None
+*Duplex DuplexNoTumble/Long Edge (Standard): "%% FoomaticRIPOptionSetting: Duplex=DuplexNoTumble"
+*FoomaticRIPOptionSetting Duplex=DuplexNoTumble: "-d2 "
+*Duplex DuplexTumble/Short Edge (Flip): "%% FoomaticRIPOptionSetting: Duplex=DuplexTumble"
+*FoomaticRIPOptionSetting Duplex=DuplexTumble: "-d3 "
+*Duplex ManualDuplexNoTumble/Manual Long Edge (Standard): "%% FoomaticRIPOptionSetting: Duplex=ManualDuplexNoTumble"
+*FoomaticRIPOptionSetting Duplex=ManualDuplexNoTumble: "-d4 "
+*Duplex ManualDuplexTumble/Manual Short Edge (Flip): "%% FoomaticRIPOptionSetting: Duplex=ManualDuplexTumble"
+*FoomaticRIPOptionSetting Duplex=ManualDuplexTumble: "-d5 "
+*Duplex None/Off: "%% FoomaticRIPOptionSetting: Duplex=None"
+*FoomaticRIPOptionSetting Duplex=None: "-d1 "
+*CloseUI: *Duplex
+
+*OpenUI *Resolution/Resolution: PickOne
+*FoomaticRIPOption Resolution: enum CmdLine A
+*OrderDependency: 130 AnySetup *Resolution
+*DefaultResolution: 1200x600dpi
+*Resolution 600x600dpi/600x600 dpi: "%% FoomaticRIPOptionSetting: Resolution=600x600dpi"
+*FoomaticRIPOptionSetting Resolution=600x600dpi: "-r600x600 "
+*Resolution 1200x600dpi/1200x600 dpi: "%% FoomaticRIPOptionSetting: Resolution=1200x600dpi"
+*FoomaticRIPOptionSetting Resolution=1200x600dpi: "-r1200x600 "
+*CloseUI: *Resolution
+
+*OpenUI *Quality/Printing Quality: PickOne
+*FoomaticRIPOption Quality: enum CmdLine A
+*OrderDependency: 110 AnySetup *Quality
+*DefaultQuality: normal
+*Quality draft/Draft: "%% FoomaticRIPOptionSetting: Quality=draft"
+*FoomaticRIPOptionSetting Quality=draft: " -t "
+*Quality normal/Normal: "%% FoomaticRIPOptionSetting: Quality=normal"
+*FoomaticRIPOptionSetting Quality=normal: " "
+*CloseUI: *Quality
+
+*FoomaticRIPOption ColorMode: enum CmdLine A 120
+*FoomaticRIPOptionSetting ColorMode=Monochrome: " "
+
+*OpenUI *Copies/Copies: PickOne
+*FoomaticRIPOption Copies: int CmdLine A
+*FoomaticRIPOptionPrototype Copies: "-n%s "
+*FoomaticRIPOptionRange Copies: 1 100
+*OrderDependency: 220 AnySetup *Copies
+*DefaultCopies: 1
+*FoomaticRIPDefaultCopies: 1
+*Copies 1/1: "%% FoomaticRIPOptionSetting: Copies=1"
+*Copies 2/2: "%% FoomaticRIPOptionSetting: Copies=2"
+*Copies 3/3: "%% FoomaticRIPOptionSetting: Copies=3"
+*Copies 4/4: "%% FoomaticRIPOptionSetting: Copies=4"
+*Copies 5/5: "%% FoomaticRIPOptionSetting: Copies=5"
+*Copies 6/6: "%% FoomaticRIPOptionSetting: Copies=6"
+*Copies 7/7: "%% FoomaticRIPOptionSetting: Copies=7"
+*Copies 8/8: "%% FoomaticRIPOptionSetting: Copies=8"
+*Copies 9/9: "%% FoomaticRIPOptionSetting: Copies=9"
+*Copies 10/10: "%% FoomaticRIPOptionSetting: Copies=10"
+*Copies 11/11: "%% FoomaticRIPOptionSetting: Copies=11"
+*Copies 12/12: "%% FoomaticRIPOptionSetting: Copies=12"
+*Copies 13/13: "%% FoomaticRIPOptionSetting: Copies=13"
+*Copies 14/14: "%% FoomaticRIPOptionSetting: Copies=14"
+*Copies 15/15: "%% FoomaticRIPOptionSetting: Copies=15"
+*Copies 16/16: "%% FoomaticRIPOptionSetting: Copies=16"
+*Copies 17/17: "%% FoomaticRIPOptionSetting: Copies=17"
+*Copies 18/18: "%% FoomaticRIPOptionSetting: Copies=18"
+*Copies 19/19: "%% FoomaticRIPOptionSetting: Copies=19"
+*Copies 20/20: "%% FoomaticRIPOptionSetting: Copies=20"
+*Copies 21/21: "%% FoomaticRIPOptionSetting: Copies=21"
+*Copies 22/22: "%% FoomaticRIPOptionSetting: Copies=22"
+*Copies 23/23: "%% FoomaticRIPOptionSetting: Copies=23"
+*Copies 24/24: "%% FoomaticRIPOptionSetting: Copies=24"
+*Copies 25/25: "%% FoomaticRIPOptionSetting: Copies=25"
+*Copies 26/26: "%% FoomaticRIPOptionSetting: Copies=26"
+*Copies 27/27: "%% FoomaticRIPOptionSetting: Copies=27"
+*Copies 28/28: "%% FoomaticRIPOptionSetting: Copies=28"
+*Copies 29/29: "%% FoomaticRIPOptionSetting: Copies=29"
+*Copies 30/30: "%% FoomaticRIPOptionSetting: Copies=30"
+*Copies 31/31: "%% FoomaticRIPOptionSetting: Copies=31"
+*Copies 32/32: "%% FoomaticRIPOptionSetting: Copies=32"
+*Copies 33/33: "%% FoomaticRIPOptionSetting: Copies=33"
+*Copies 34/34: "%% FoomaticRIPOptionSetting: Copies=34"
+*Copies 35/35: "%% FoomaticRIPOptionSetting: Copies=35"
+*Copies 36/36: "%% FoomaticRIPOptionSetting: Copies=36"
+*Copies 37/37: "%% FoomaticRIPOptionSetting: Copies=37"
+*Copies 38/38: "%% FoomaticRIPOptionSetting: Copies=38"
+*Copies 39/39: "%% FoomaticRIPOptionSetting: Copies=39"
+*Copies 40/40: "%% FoomaticRIPOptionSetting: Copies=40"
+*Copies 41/41: "%% FoomaticRIPOptionSetting: Copies=41"
+*Copies 42/42: "%% FoomaticRIPOptionSetting: Copies=42"
+*Copies 43/43: "%% FoomaticRIPOptionSetting: Copies=43"
+*Copies 44/44: "%% FoomaticRIPOptionSetting: Copies=44"
+*Copies 45/45: "%% FoomaticRIPOptionSetting: Copies=45"
+*Copies 46/46: "%% FoomaticRIPOptionSetting: Copies=46"
+*Copies 47/47: "%% FoomaticRIPOptionSetting: Copies=47"
+*Copies 48/48: "%% FoomaticRIPOptionSetting: Copies=48"
+*Copies 49/49: "%% FoomaticRIPOptionSetting: Copies=49"
+*Copies 50/50: "%% FoomaticRIPOptionSetting: Copies=50"
+*Copies 51/51: "%% FoomaticRIPOptionSetting: Copies=51"
+*Copies 52/52: "%% FoomaticRIPOptionSetting: Copies=52"
+*Copies 53/53: "%% FoomaticRIPOptionSetting: Copies=53"
+*Copies 54/54: "%% FoomaticRIPOptionSetting: Copies=54"
+*Copies 55/55: "%% FoomaticRIPOptionSetting: Copies=55"
+*Copies 56/56: "%% FoomaticRIPOptionSetting: Copies=56"
+*Copies 57/57: "%% FoomaticRIPOptionSetting: Copies=57"
+*Copies 58/58: "%% FoomaticRIPOptionSetting: Copies=58"
+*Copies 59/59: "%% FoomaticRIPOptionSetting: Copies=59"
+*Copies 60/60: "%% FoomaticRIPOptionSetting: Copies=60"
+*Copies 61/61: "%% FoomaticRIPOptionSetting: Copies=61"
+*Copies 62/62: "%% FoomaticRIPOptionSetting: Copies=62"
+*Copies 63/63: "%% FoomaticRIPOptionSetting: Copies=63"
+*Copies 64/64: "%% FoomaticRIPOptionSetting: Copies=64"
+*Copies 65/65: "%% FoomaticRIPOptionSetting: Copies=65"
+*Copies 66/66: "%% FoomaticRIPOptionSetting: Copies=66"
+*Copies 67/67: "%% FoomaticRIPOptionSetting: Copies=67"
+*Copies 68/68: "%% FoomaticRIPOptionSetting: Copies=68"
+*Copies 69/69: "%% FoomaticRIPOptionSetting: Copies=69"
+*Copies 70/70: "%% FoomaticRIPOptionSetting: Copies=70"
+*Copies 71/71: "%% FoomaticRIPOptionSetting: Copies=71"
+*Copies 72/72: "%% FoomaticRIPOptionSetting: Copies=72"
+*Copies 73/73: "%% FoomaticRIPOptionSetting: Copies=73"
+*Copies 74/74: "%% FoomaticRIPOptionSetting: Copies=74"
+*Copies 75/75: "%% FoomaticRIPOptionSetting: Copies=75"
+*Copies 76/76: "%% FoomaticRIPOptionSetting: Copies=76"
+*Copies 77/77: "%% FoomaticRIPOptionSetting: Copies=77"
+*Copies 78/78: "%% FoomaticRIPOptionSetting: Copies=78"
+*Copies 79/79: "%% FoomaticRIPOptionSetting: Copies=79"
+*Copies 80/80: "%% FoomaticRIPOptionSetting: Copies=80"
+*Copies 81/81: "%% FoomaticRIPOptionSetting: Copies=81"
+*Copies 82/82: "%% FoomaticRIPOptionSetting: Copies=82"
+*Copies 83/83: "%% FoomaticRIPOptionSetting: Copies=83"
+*Copies 84/84: "%% FoomaticRIPOptionSetting: Copies=84"
+*Copies 85/85: "%% FoomaticRIPOptionSetting: Copies=85"
+*Copies 86/86: "%% FoomaticRIPOptionSetting: Copies=86"
+*Copies 87/87: "%% FoomaticRIPOptionSetting: Copies=87"
+*Copies 88/88: "%% FoomaticRIPOptionSetting: Copies=88"
+*Copies 89/89: "%% FoomaticRIPOptionSetting: Copies=89"
+*Copies 90/90: "%% FoomaticRIPOptionSetting: Copies=90"
+*Copies 91/91: "%% FoomaticRIPOptionSetting: Copies=91"
+*Copies 92/92: "%% FoomaticRIPOptionSetting: Copies=92"
+*Copies 93/93: "%% FoomaticRIPOptionSetting: Copies=93"
+*Copies 94/94: "%% FoomaticRIPOptionSetting: Copies=94"
+*Copies 95/95: "%% FoomaticRIPOptionSetting: Copies=95"
+*Copies 96/96: "%% FoomaticRIPOptionSetting: Copies=96"
+*Copies 97/97: "%% FoomaticRIPOptionSetting: Copies=97"
+*Copies 98/98: "%% FoomaticRIPOptionSetting: Copies=98"
+*Copies 99/99: "%% FoomaticRIPOptionSetting: Copies=99"
+*Copies 100/100: "%% FoomaticRIPOptionSetting: Copies=100"
+*CloseUI: *Copies
+
+*FoomaticRIPOption PrinterType: enum CmdLine A 110
+*FoomaticRIPOptionSetting PrinterType=BWz1: "-P -z1 -L0 "
+
+*CloseGroup: General
+
+*OpenGroup: Miscellaneous/Miscellaneous
+
+*OpenUI *Nup/N-up Printing: PickOne
+*FoomaticRIPOption Nup: enum CmdLine A
+*OrderDependency: 200 AnySetup *Nup
+*DefaultNup: 1up
+*Nup 1up/1-up: "%% FoomaticRIPOptionSetting: Nup=1up"
+*FoomaticRIPOptionSetting Nup=1up: " "
+*Nup 2up/2-up: "%% FoomaticRIPOptionSetting: Nup=2up"
+*FoomaticRIPOptionSetting Nup=2up: "-2 "
+*Nup 3up/3-up: "%% FoomaticRIPOptionSetting: Nup=3up"
+*FoomaticRIPOptionSetting Nup=3up: "-3 "
+*Nup 4up/4-up: "%% FoomaticRIPOptionSetting: Nup=4up"
+*FoomaticRIPOptionSetting Nup=4up: "-4 "
+*Nup 6up/6-up: "%% FoomaticRIPOptionSetting: Nup=6up"
+*FoomaticRIPOptionSetting Nup=6up: "-6 "
+*Nup 8up/8-up: "%% FoomaticRIPOptionSetting: Nup=8up"
+*FoomaticRIPOptionSetting Nup=8up: "-8 "
+*Nup 10up/10-up: "%% FoomaticRIPOptionSetting: Nup=10up"
+*FoomaticRIPOptionSetting Nup=10up: "-10 "
+*Nup 12up/12-up: "%% FoomaticRIPOptionSetting: Nup=12up"
+*FoomaticRIPOptionSetting Nup=12up: "-12 "
+*Nup 14up/14-up: "%% FoomaticRIPOptionSetting: Nup=14up"
+*FoomaticRIPOptionSetting Nup=14up: "-14 "
+*Nup 15up/15-up: "%% FoomaticRIPOptionSetting: Nup=15up"
+*FoomaticRIPOptionSetting Nup=15up: "-15 "
+*Nup 16up/16-up: "%% FoomaticRIPOptionSetting: Nup=16up"
+*FoomaticRIPOptionSetting Nup=16up: "-16 "
+*Nup 18up/18-up: "%% FoomaticRIPOptionSetting: Nup=18up"
+*FoomaticRIPOptionSetting Nup=18up: "-18 "
+*CloseUI: *Nup
+
+*OpenUI *NupOrient/N-up Orientation: PickOne
+*FoomaticRIPOption NupOrient: enum CmdLine A
+*OrderDependency: 200 AnySetup *NupOrient
+*DefaultNupOrient: port
+*NupOrient land/Landscape: "%% FoomaticRIPOptionSetting: NupOrient=land"
+*FoomaticRIPOptionSetting NupOrient=land: "-ol "
+*NupOrient port/Portrait: "%% FoomaticRIPOptionSetting: NupOrient=port"
+*FoomaticRIPOptionSetting NupOrient=port: " "
+*NupOrient sea/Seascape: "%% FoomaticRIPOptionSetting: NupOrient=sea"
+*FoomaticRIPOptionSetting NupOrient=sea: "-os "
+*CloseUI: *NupOrient
+
+*CloseGroup: Miscellaneous
+
+
+*% Generic boilerplate PPD stuff as standard PostScript fonts and so on
+
+*DefaultFont: Courier
+*Font AvantGarde-Book: Standard "(001.006S)" Standard ROM
+*Font AvantGarde-BookOblique: Standard "(001.006S)" Standard ROM
+*Font AvantGarde-Demi: Standard "(001.007S)" Standard ROM
+*Font AvantGarde-DemiOblique: Standard "(001.007S)" Standard ROM
+*Font Bookman-Demi: Standard "(001.004S)" Standard ROM
+*Font Bookman-DemiItalic: Standard "(001.004S)" Standard ROM
+*Font Bookman-Light: Standard "(001.004S)" Standard ROM
+*Font Bookman-LightItalic: Standard "(001.004S)" Standard ROM
+*Font Courier: Standard "(002.004S)" Standard ROM
+*Font Courier-Bold: Standard "(002.004S)" Standard ROM
+*Font Courier-BoldOblique: Standard "(002.004S)" Standard ROM
+*Font Courier-Oblique: Standard "(002.004S)" Standard ROM
+*Font Helvetica: Standard "(001.006S)" Standard ROM
+*Font Helvetica-Bold: Standard "(001.007S)" Standard ROM
+*Font Helvetica-BoldOblique: Standard "(001.007S)" Standard ROM
+*Font Helvetica-Narrow: Standard "(001.006S)" Standard ROM
+*Font Helvetica-Narrow-Bold: Standard "(001.007S)" Standard ROM
+*Font Helvetica-Narrow-BoldOblique: Standard "(001.007S)" Standard ROM
+*Font Helvetica-Narrow-Oblique: Standard "(001.006S)" Standard ROM
+*Font Helvetica-Oblique: Standard "(001.006S)" Standard ROM
+*Font NewCenturySchlbk-Bold: Standard "(001.009S)" Standard ROM
+*Font NewCenturySchlbk-BoldItalic: Standard "(001.007S)" Standard ROM
+*Font NewCenturySchlbk-Italic: Standard "(001.006S)" Standard ROM
+*Font NewCenturySchlbk-Roman: Standard "(001.007S)" Standard ROM
+*Font Palatino-Bold: Standard "(001.005S)" Standard ROM
+*Font Palatino-BoldItalic: Standard "(001.005S)" Standard ROM
+*Font Palatino-Italic: Standard "(001.005S)" Standard ROM
+*Font Palatino-Roman: Standard "(001.005S)" Standard ROM
+*Font Symbol: Special "(001.007S)" Special ROM
+*Font Times-Bold: Standard "(001.007S)" Standard ROM
+*Font Times-BoldItalic: Standard "(001.009S)" Standard ROM
+*Font Times-Italic: Standard "(001.007S)" Standard ROM
+*Font Times-Roman: Standard "(001.007S)" Standard ROM
+*Font ZapfChancery-MediumItalic: Standard "(001.007S)" Standard ROM
+*Font ZapfDingbats: Special "(001.004S)" Standard ROM
+
diff --git a/PPD/HP-LaserJet_M1005_MFP.ppd b/PPD/HP-LaserJet_M1005_MFP.ppd
new file mode 100644
index 0000000..5622bc8
--- /dev/null
+++ b/PPD/HP-LaserJet_M1005_MFP.ppd
@@ -0,0 +1,422 @@
+*PPD-Adobe: "4.3"
+*%
+*% For information on using this, and to obtain the required backend
+*% script, consult http://www.linuxprinting.org/
+*%
+*% This file is published under the GNU General Public License
+*%
+*% PPD-O-MATIC (3.0.0 or newer) generated this PPD file. It is for use with
+*% all programs and environments which use PPD files for dealing with
+*% printer capability information. The printer must be configured with the
+*% "foomatic-rip" backend filter script of Foomatic 3.0.0 or newer. This
+*% file and "foomatic-rip" work together to support PPD-controlled printer
+*% driver option access with arbitrary free software printer drivers and
+*% printing spoolers.
+*%
+*% To save this file on your disk, wait until the download has completed
+*% (the animation of the browser logo must stop) and then use the
+*% "Save as..." command in the "File" menu of your browser or in the
+*% pop-up manu when you click on this document with the right mouse button.
+*% DO NOT cut and paste this file into an editor with your mouse. This can
+*% introduce additional line breaks which lead to unexpected results.
+*%
+*% You may save this file as 'HP-LaserJet_M1005_MFP-foo2xqx.ppd'
+*%
+*%
+*FormatVersion: "4.3"
+*FileVersion: "1.1"
+*LanguageVersion: English
+*LanguageEncoding: ISOLatin1
+*PCFileName: "FOO2XQX.PPD"
+*Manufacturer: "HP"
+*Product: "(HP LaserJet M1005)"
+*cupsVersion: 1.0
+*cupsManualCopies: True
+*cupsModelNumber: 2
+*cupsFilter: "application/vnd.cups-postscript 0 foomatic-rip"
+*%pprRIP: foomatic-rip other
+*ModelName: "HP LaserJet M1005 MFP"
+*ShortNickName: "HP LaserJet M1005 MFP foo2xqx"
+*NickName: "HP LaserJet M1005 MFP Foomatic/foo2xqx (recommended)"
+*PSVersion: "(3010.000) 550"
+*PSVersion: "(3010.000) 651"
+*PSVersion: "(3010.000) 652"
+*PSVersion: "(3010.000) 653"
+*PSVersion: "(3010.000) 704"
+*PSVersion: "(3010.000) 705"
+*PSVersion: "(3010.000) 800"
+*LanguageLevel: "3"
+*ColorDevice: False
+*DefaultColorSpace: Gray
+*FileSystem: False
+*Throughput: "1"
+*LandscapeOrientation: Plus90
+*TTRasterizer: Type42
+*1284DeviceID: "MFG:Hewlett-Packard;MDL:HP LaserJet M1005;CMD:ACL;DES:HP LaserJet M1005;"
+
+
+
+*VariablePaperSize: False
+
+*FoomaticIDs: HP-LaserJet_M1005_MFP foo2xqx
+*FoomaticRIPCommandLine: "foo2xqx-wrapper %A"
+
+*OpenGroup: General/General
+
+*OpenUI *PageSize/Page Size: PickOne
+*FoomaticRIPOption PageSize: enum CmdLine A
+*OrderDependency: 135 AnySetup *PageSize
+*DefaultPageSize: Letter
+*PageSize Letter/Letter: "%% FoomaticRIPOptionSetting: PageSize=Letter"
+*FoomaticRIPOptionSetting PageSize=Letter: "-p1 "
+*PageSize A4/A4: "%% FoomaticRIPOptionSetting: PageSize=A4"
+*FoomaticRIPOptionSetting PageSize=A4: "-p9 "
+*PageSize A5/A5: "%% FoomaticRIPOptionSetting: PageSize=A5"
+*FoomaticRIPOptionSetting PageSize=A5: "-p11 "
+*PageSize B5/B5: "%% FoomaticRIPOptionSetting: PageSize=B5"
+*FoomaticRIPOptionSetting PageSize=B5: "-p13 "
+*PageSize Env10/Env #10: "%% FoomaticRIPOptionSetting: PageSize=Env10"
+*FoomaticRIPOptionSetting PageSize=Env10: "-p20 "
+*PageSize EnvB5/Env B5: "%% FoomaticRIPOptionSetting: PageSize=EnvB5"
+*FoomaticRIPOptionSetting PageSize=EnvB5: "-p34 "
+*PageSize EnvC5/Env C5: "%% FoomaticRIPOptionSetting: PageSize=EnvC5"
+*FoomaticRIPOptionSetting PageSize=EnvC5: "-p28 "
+*PageSize EnvDL/Env DL: "%% FoomaticRIPOptionSetting: PageSize=EnvDL"
+*FoomaticRIPOptionSetting PageSize=EnvDL: "-p27 "
+*PageSize EnvMonarch/Env Monarch: "%% FoomaticRIPOptionSetting: PageSize=EnvMonarch"
+*FoomaticRIPOptionSetting PageSize=EnvMonarch: "-p37 "
+*PageSize Executive/Executive: "%% FoomaticRIPOptionSetting: PageSize=Executive"
+*FoomaticRIPOptionSetting PageSize=Executive: "-p7 "
+*PageSize Legal/Legal: "%% FoomaticRIPOptionSetting: PageSize=Legal"
+*FoomaticRIPOptionSetting PageSize=Legal: "-p5 "
+*CloseUI: *PageSize
+
+*OpenUI *PageRegion: PickOne
+*OrderDependency: 135 AnySetup *PageRegion
+*DefaultPageRegion: Letter
+*PageRegion Letter/Letter: "%% FoomaticRIPOptionSetting: PageSize=Letter"
+*PageRegion A4/A4: "%% FoomaticRIPOptionSetting: PageSize=A4"
+*PageRegion A5/A5: "%% FoomaticRIPOptionSetting: PageSize=A5"
+*PageRegion B5/B5: "%% FoomaticRIPOptionSetting: PageSize=B5"
+*PageRegion Env10/Env #10: "%% FoomaticRIPOptionSetting: PageSize=Env10"
+*PageRegion EnvB5/Env B5: "%% FoomaticRIPOptionSetting: PageSize=EnvB5"
+*PageRegion EnvC5/Env C5: "%% FoomaticRIPOptionSetting: PageSize=EnvC5"
+*PageRegion EnvDL/Env DL: "%% FoomaticRIPOptionSetting: PageSize=EnvDL"
+*PageRegion EnvMonarch/Env Monarch: "%% FoomaticRIPOptionSetting: PageSize=EnvMonarch"
+*PageRegion Executive/Executive: "%% FoomaticRIPOptionSetting: PageSize=Executive"
+*PageRegion Legal/Legal: "%% FoomaticRIPOptionSetting: PageSize=Legal"
+*CloseUI: *PageRegion
+
+*DefaultImageableArea: Letter
+*ImageableArea Letter/Letter: "11.34 11.34 600.66 780.66"
+*ImageableArea A4/A4: "11.34 11.34 583.66 830.66"
+*ImageableArea A5/A5: "11.34 11.34 408.66 583.66"
+*ImageableArea B5/B5: "11.34 11.34 486.66 696.66"
+*ImageableArea Env10/Env #10: "11.34 11.34 285.66 672.66"
+*ImageableArea EnvB5/Env B5: "11.34 11.34 486.66 696.66"
+*ImageableArea EnvC5/Env C5: "11.34 11.34 447.66 637.66"
+*ImageableArea EnvDL/Env DL: "11.34 11.34 299.66 611.66"
+*ImageableArea EnvMonarch/Env Monarch: "11.34 11.34 267.66 528.66"
+*ImageableArea Executive/Executive: "11.34 11.34 510.66 744.66"
+*ImageableArea Legal/Legal: "11.34 11.34 600.66 996.66"
+
+*DefaultPaperDimension: Letter
+*PaperDimension Letter/Letter: "612 792"
+*PaperDimension A4/A4: "595 842"
+*PaperDimension A5/A5: "420 595"
+*PaperDimension B5/B5: "498 708"
+*PaperDimension Env10/Env #10: "297 684"
+*PaperDimension EnvB5/Env B5: "498 708"
+*PaperDimension EnvC5/Env C5: "459 649"
+*PaperDimension EnvDL/Env DL: "311 623"
+*PaperDimension EnvMonarch/Env Monarch: "279 540"
+*PaperDimension Executive/Executive: "522 756"
+*PaperDimension Legal/Legal: "612 1008"
+
+*OpenUI *InputSlot/Media Source: PickOne
+*FoomaticRIPOption InputSlot: enum CmdLine A
+*OrderDependency: 150 AnySetup *InputSlot
+*DefaultInputSlot: Auto
+*InputSlot Tray1/Tray 1: "%% FoomaticRIPOptionSetting: InputSlot=Tray1"
+*FoomaticRIPOptionSetting InputSlot=Tray1: "-s1 "
+*InputSlot Auto/Auto Select: "%% FoomaticRIPOptionSetting: InputSlot=Auto"
+*FoomaticRIPOptionSetting InputSlot=Auto: "-s7 "
+*InputSlot Manual/Manual Feed: "%% FoomaticRIPOptionSetting: InputSlot=Manual"
+*FoomaticRIPOptionSetting InputSlot=Manual: "-s4 "
+*CloseUI: *InputSlot
+
+*OpenUI *MediaType/Media Type: PickOne
+*FoomaticRIPOption MediaType: enum CmdLine A
+*OrderDependency: 150 AnySetup *MediaType
+*DefaultMediaType: Plain
+*MediaType Plain/Plain Paper: "%% FoomaticRIPOptionSetting: MediaType=Plain"
+*FoomaticRIPOptionSetting MediaType=Plain: "-m1 "
+*MediaType Multipurpose/HP Multipurpose Paper: "%% FoomaticRIPOptionSetting: MediaType=Multipurpose"
+*FoomaticRIPOptionSetting MediaType=Multipurpose: "-m301 "
+*MediaType All-in-one/HP All-in-one Printing Paper: "%% FoomaticRIPOptionSetting: MediaType=All-in-one"
+*FoomaticRIPOptionSetting MediaType=All-in-one: "-m303 "
+*MediaType Bond/Bond: "%% FoomaticRIPOptionSetting: MediaType=Bond"
+*FoomaticRIPOptionSetting MediaType=Bond: "-m260 "
+*MediaType Cardstock/Cardstock: "%% FoomaticRIPOptionSetting: MediaType=Cardstock"
+*FoomaticRIPOptionSetting MediaType=Cardstock: "-m261 "
+*MediaType Color/Color: "%% FoomaticRIPOptionSetting: MediaType=Color"
+*FoomaticRIPOptionSetting MediaType=Color: "-m512 "
+*MediaType Envelope/Envelope: "%% FoomaticRIPOptionSetting: MediaType=Envelope"
+*FoomaticRIPOptionSetting MediaType=Envelope: "-m267 "
+*MediaType Heavy/Heavy: "%% FoomaticRIPOptionSetting: MediaType=Heavy"
+*FoomaticRIPOptionSetting MediaType=Heavy: "-m262 "
+*MediaType Labels/Labels: "%% FoomaticRIPOptionSetting: MediaType=Labels"
+*FoomaticRIPOptionSetting MediaType=Labels: "-m265 "
+*MediaType LaserJet/HP LaserJet Paper: "%% FoomaticRIPOptionSetting: MediaType=LaserJet"
+*FoomaticRIPOptionSetting MediaType=LaserJet: "-m302 "
+*MediaType Letterhead/Letterhead: "%% FoomaticRIPOptionSetting: MediaType=Letterhead"
+*FoomaticRIPOptionSetting MediaType=Letterhead: "-m513 "
+*MediaType Light/Light: "%% FoomaticRIPOptionSetting: MediaType=Light"
+*FoomaticRIPOptionSetting MediaType=Light: "-m258 "
+*MediaType Office/HP Office Paper: "%% FoomaticRIPOptionSetting: MediaType=Office"
+*FoomaticRIPOptionSetting MediaType=Office: "-m300 "
+*MediaType PremiumLaserJet/HP Premium Choice LaserJet Paper: "%% FoomaticRIPOptionSetting: MediaType=PremiumLaserJet"
+*FoomaticRIPOptionSetting MediaType=PremiumLaserJet: "-m302 "
+*MediaType Preprinted/Preprinted Paper: "%% FoomaticRIPOptionSetting: MediaType=Preprinted"
+*FoomaticRIPOptionSetting MediaType=Preprinted: "-m514 "
+*MediaType Prepunched/Prepunched Paper: "%% FoomaticRIPOptionSetting: MediaType=Prepunched"
+*FoomaticRIPOptionSetting MediaType=Prepunched: "-m515 "
+*MediaType Recycled/Recycled Paper: "%% FoomaticRIPOptionSetting: MediaType=Recycled"
+*FoomaticRIPOptionSetting MediaType=Recycled: "-m516 "
+*MediaType Rough/Rough: "%% FoomaticRIPOptionSetting: MediaType=Rough"
+*FoomaticRIPOptionSetting MediaType=Rough: "-m263 "
+*MediaType Transparency/Transparency: "%% FoomaticRIPOptionSetting: MediaType=Transparency"
+*FoomaticRIPOptionSetting MediaType=Transparency: "-m2 "
+*MediaType Unspecified/Unspecified Paper: "%% FoomaticRIPOptionSetting: MediaType=Unspecified"
+*FoomaticRIPOptionSetting MediaType=Unspecified: "-m0 "
+*CloseUI: *MediaType
+
+*OpenUI *Duplex/Duplex Printing: PickOne
+*FoomaticRIPOption Duplex: enum CmdLine A
+*OrderDependency: 210 AnySetup *Duplex
+*DefaultDuplex: None
+*Duplex DuplexNoTumble/Long Edge (Standard): "%% FoomaticRIPOptionSetting: Duplex=DuplexNoTumble"
+*FoomaticRIPOptionSetting Duplex=DuplexNoTumble: "-d2 "
+*Duplex DuplexTumble/Short Edge (Flip): "%% FoomaticRIPOptionSetting: Duplex=DuplexTumble"
+*FoomaticRIPOptionSetting Duplex=DuplexTumble: "-d3 "
+*Duplex None/Off: "%% FoomaticRIPOptionSetting: Duplex=None"
+*FoomaticRIPOptionSetting Duplex=None: "-d1 "
+*CloseUI: *Duplex
+
+*OpenUI *Resolution/Resolution: PickOne
+*FoomaticRIPOption Resolution: enum CmdLine A
+*OrderDependency: 130 AnySetup *Resolution
+*DefaultResolution: 1200x600dpi
+*Resolution 600x600dpi/600x600 dpi: "%% FoomaticRIPOptionSetting: Resolution=600x600dpi"
+*FoomaticRIPOptionSetting Resolution=600x600dpi: "-r600x600 "
+*Resolution 1200x600dpi/1200x600 dpi: "%% FoomaticRIPOptionSetting: Resolution=1200x600dpi"
+*FoomaticRIPOptionSetting Resolution=1200x600dpi: "-r1200x600 "
+*CloseUI: *Resolution
+
+*OpenUI *Quality/Printing Quality: PickOne
+*FoomaticRIPOption Quality: enum CmdLine A
+*OrderDependency: 110 AnySetup *Quality
+*DefaultQuality: normal
+*Quality draft/Draft: "%% FoomaticRIPOptionSetting: Quality=draft"
+*FoomaticRIPOptionSetting Quality=draft: " -t "
+*Quality normal/Normal: "%% FoomaticRIPOptionSetting: Quality=normal"
+*FoomaticRIPOptionSetting Quality=normal: " "
+*CloseUI: *Quality
+
+*OpenUI *Copies/Copies: PickOne
+*FoomaticRIPOption Copies: int CmdLine A
+*FoomaticRIPOptionPrototype Copies: "-n%s "
+*FoomaticRIPOptionRange Copies: 1 100
+*OrderDependency: 220 AnySetup *Copies
+*DefaultCopies: 1
+*FoomaticRIPDefaultCopies: 1
+*Copies 1/1: "%% FoomaticRIPOptionSetting: Copies=1"
+*Copies 2/2: "%% FoomaticRIPOptionSetting: Copies=2"
+*Copies 3/3: "%% FoomaticRIPOptionSetting: Copies=3"
+*Copies 4/4: "%% FoomaticRIPOptionSetting: Copies=4"
+*Copies 5/5: "%% FoomaticRIPOptionSetting: Copies=5"
+*Copies 6/6: "%% FoomaticRIPOptionSetting: Copies=6"
+*Copies 7/7: "%% FoomaticRIPOptionSetting: Copies=7"
+*Copies 8/8: "%% FoomaticRIPOptionSetting: Copies=8"
+*Copies 9/9: "%% FoomaticRIPOptionSetting: Copies=9"
+*Copies 10/10: "%% FoomaticRIPOptionSetting: Copies=10"
+*Copies 11/11: "%% FoomaticRIPOptionSetting: Copies=11"
+*Copies 12/12: "%% FoomaticRIPOptionSetting: Copies=12"
+*Copies 13/13: "%% FoomaticRIPOptionSetting: Copies=13"
+*Copies 14/14: "%% FoomaticRIPOptionSetting: Copies=14"
+*Copies 15/15: "%% FoomaticRIPOptionSetting: Copies=15"
+*Copies 16/16: "%% FoomaticRIPOptionSetting: Copies=16"
+*Copies 17/17: "%% FoomaticRIPOptionSetting: Copies=17"
+*Copies 18/18: "%% FoomaticRIPOptionSetting: Copies=18"
+*Copies 19/19: "%% FoomaticRIPOptionSetting: Copies=19"
+*Copies 20/20: "%% FoomaticRIPOptionSetting: Copies=20"
+*Copies 21/21: "%% FoomaticRIPOptionSetting: Copies=21"
+*Copies 22/22: "%% FoomaticRIPOptionSetting: Copies=22"
+*Copies 23/23: "%% FoomaticRIPOptionSetting: Copies=23"
+*Copies 24/24: "%% FoomaticRIPOptionSetting: Copies=24"
+*Copies 25/25: "%% FoomaticRIPOptionSetting: Copies=25"
+*Copies 26/26: "%% FoomaticRIPOptionSetting: Copies=26"
+*Copies 27/27: "%% FoomaticRIPOptionSetting: Copies=27"
+*Copies 28/28: "%% FoomaticRIPOptionSetting: Copies=28"
+*Copies 29/29: "%% FoomaticRIPOptionSetting: Copies=29"
+*Copies 30/30: "%% FoomaticRIPOptionSetting: Copies=30"
+*Copies 31/31: "%% FoomaticRIPOptionSetting: Copies=31"
+*Copies 32/32: "%% FoomaticRIPOptionSetting: Copies=32"
+*Copies 33/33: "%% FoomaticRIPOptionSetting: Copies=33"
+*Copies 34/34: "%% FoomaticRIPOptionSetting: Copies=34"
+*Copies 35/35: "%% FoomaticRIPOptionSetting: Copies=35"
+*Copies 36/36: "%% FoomaticRIPOptionSetting: Copies=36"
+*Copies 37/37: "%% FoomaticRIPOptionSetting: Copies=37"
+*Copies 38/38: "%% FoomaticRIPOptionSetting: Copies=38"
+*Copies 39/39: "%% FoomaticRIPOptionSetting: Copies=39"
+*Copies 40/40: "%% FoomaticRIPOptionSetting: Copies=40"
+*Copies 41/41: "%% FoomaticRIPOptionSetting: Copies=41"
+*Copies 42/42: "%% FoomaticRIPOptionSetting: Copies=42"
+*Copies 43/43: "%% FoomaticRIPOptionSetting: Copies=43"
+*Copies 44/44: "%% FoomaticRIPOptionSetting: Copies=44"
+*Copies 45/45: "%% FoomaticRIPOptionSetting: Copies=45"
+*Copies 46/46: "%% FoomaticRIPOptionSetting: Copies=46"
+*Copies 47/47: "%% FoomaticRIPOptionSetting: Copies=47"
+*Copies 48/48: "%% FoomaticRIPOptionSetting: Copies=48"
+*Copies 49/49: "%% FoomaticRIPOptionSetting: Copies=49"
+*Copies 50/50: "%% FoomaticRIPOptionSetting: Copies=50"
+*Copies 51/51: "%% FoomaticRIPOptionSetting: Copies=51"
+*Copies 52/52: "%% FoomaticRIPOptionSetting: Copies=52"
+*Copies 53/53: "%% FoomaticRIPOptionSetting: Copies=53"
+*Copies 54/54: "%% FoomaticRIPOptionSetting: Copies=54"
+*Copies 55/55: "%% FoomaticRIPOptionSetting: Copies=55"
+*Copies 56/56: "%% FoomaticRIPOptionSetting: Copies=56"
+*Copies 57/57: "%% FoomaticRIPOptionSetting: Copies=57"
+*Copies 58/58: "%% FoomaticRIPOptionSetting: Copies=58"
+*Copies 59/59: "%% FoomaticRIPOptionSetting: Copies=59"
+*Copies 60/60: "%% FoomaticRIPOptionSetting: Copies=60"
+*Copies 61/61: "%% FoomaticRIPOptionSetting: Copies=61"
+*Copies 62/62: "%% FoomaticRIPOptionSetting: Copies=62"
+*Copies 63/63: "%% FoomaticRIPOptionSetting: Copies=63"
+*Copies 64/64: "%% FoomaticRIPOptionSetting: Copies=64"
+*Copies 65/65: "%% FoomaticRIPOptionSetting: Copies=65"
+*Copies 66/66: "%% FoomaticRIPOptionSetting: Copies=66"
+*Copies 67/67: "%% FoomaticRIPOptionSetting: Copies=67"
+*Copies 68/68: "%% FoomaticRIPOptionSetting: Copies=68"
+*Copies 69/69: "%% FoomaticRIPOptionSetting: Copies=69"
+*Copies 70/70: "%% FoomaticRIPOptionSetting: Copies=70"
+*Copies 71/71: "%% FoomaticRIPOptionSetting: Copies=71"
+*Copies 72/72: "%% FoomaticRIPOptionSetting: Copies=72"
+*Copies 73/73: "%% FoomaticRIPOptionSetting: Copies=73"
+*Copies 74/74: "%% FoomaticRIPOptionSetting: Copies=74"
+*Copies 75/75: "%% FoomaticRIPOptionSetting: Copies=75"
+*Copies 76/76: "%% FoomaticRIPOptionSetting: Copies=76"
+*Copies 77/77: "%% FoomaticRIPOptionSetting: Copies=77"
+*Copies 78/78: "%% FoomaticRIPOptionSetting: Copies=78"
+*Copies 79/79: "%% FoomaticRIPOptionSetting: Copies=79"
+*Copies 80/80: "%% FoomaticRIPOptionSetting: Copies=80"
+*Copies 81/81: "%% FoomaticRIPOptionSetting: Copies=81"
+*Copies 82/82: "%% FoomaticRIPOptionSetting: Copies=82"
+*Copies 83/83: "%% FoomaticRIPOptionSetting: Copies=83"
+*Copies 84/84: "%% FoomaticRIPOptionSetting: Copies=84"
+*Copies 85/85: "%% FoomaticRIPOptionSetting: Copies=85"
+*Copies 86/86: "%% FoomaticRIPOptionSetting: Copies=86"
+*Copies 87/87: "%% FoomaticRIPOptionSetting: Copies=87"
+*Copies 88/88: "%% FoomaticRIPOptionSetting: Copies=88"
+*Copies 89/89: "%% FoomaticRIPOptionSetting: Copies=89"
+*Copies 90/90: "%% FoomaticRIPOptionSetting: Copies=90"
+*Copies 91/91: "%% FoomaticRIPOptionSetting: Copies=91"
+*Copies 92/92: "%% FoomaticRIPOptionSetting: Copies=92"
+*Copies 93/93: "%% FoomaticRIPOptionSetting: Copies=93"
+*Copies 94/94: "%% FoomaticRIPOptionSetting: Copies=94"
+*Copies 95/95: "%% FoomaticRIPOptionSetting: Copies=95"
+*Copies 96/96: "%% FoomaticRIPOptionSetting: Copies=96"
+*Copies 97/97: "%% FoomaticRIPOptionSetting: Copies=97"
+*Copies 98/98: "%% FoomaticRIPOptionSetting: Copies=98"
+*Copies 99/99: "%% FoomaticRIPOptionSetting: Copies=99"
+*Copies 100/100: "%% FoomaticRIPOptionSetting: Copies=100"
+*CloseUI: *Copies
+
+*CloseGroup: General
+
+*OpenGroup: Miscellaneous/Miscellaneous
+
+*OpenUI *Nup/N-up Printing: PickOne
+*FoomaticRIPOption Nup: enum CmdLine A
+*OrderDependency: 200 AnySetup *Nup
+*DefaultNup: 1up
+*Nup 1up/1-up: "%% FoomaticRIPOptionSetting: Nup=1up"
+*FoomaticRIPOptionSetting Nup=1up: " "
+*Nup 2up/2-up: "%% FoomaticRIPOptionSetting: Nup=2up"
+*FoomaticRIPOptionSetting Nup=2up: "-2 "
+*Nup 3up/3-up: "%% FoomaticRIPOptionSetting: Nup=3up"
+*FoomaticRIPOptionSetting Nup=3up: "-3 "
+*Nup 4up/4-up: "%% FoomaticRIPOptionSetting: Nup=4up"
+*FoomaticRIPOptionSetting Nup=4up: "-4 "
+*Nup 6up/6-up: "%% FoomaticRIPOptionSetting: Nup=6up"
+*FoomaticRIPOptionSetting Nup=6up: "-6 "
+*Nup 8up/8-up: "%% FoomaticRIPOptionSetting: Nup=8up"
+*FoomaticRIPOptionSetting Nup=8up: "-8 "
+*Nup 10up/10-up: "%% FoomaticRIPOptionSetting: Nup=10up"
+*FoomaticRIPOptionSetting Nup=10up: "-10 "
+*Nup 12up/12-up: "%% FoomaticRIPOptionSetting: Nup=12up"
+*FoomaticRIPOptionSetting Nup=12up: "-12 "
+*Nup 14up/14-up: "%% FoomaticRIPOptionSetting: Nup=14up"
+*FoomaticRIPOptionSetting Nup=14up: "-14 "
+*Nup 15up/15-up: "%% FoomaticRIPOptionSetting: Nup=15up"
+*FoomaticRIPOptionSetting Nup=15up: "-15 "
+*Nup 16up/16-up: "%% FoomaticRIPOptionSetting: Nup=16up"
+*FoomaticRIPOptionSetting Nup=16up: "-16 "
+*Nup 18up/18-up: "%% FoomaticRIPOptionSetting: Nup=18up"
+*FoomaticRIPOptionSetting Nup=18up: "-18 "
+*CloseUI: *Nup
+
+*OpenUI *NupOrient/N-up Orientation: PickOne
+*FoomaticRIPOption NupOrient: enum CmdLine A
+*OrderDependency: 200 AnySetup *NupOrient
+*DefaultNupOrient: port
+*NupOrient land/Landscape: "%% FoomaticRIPOptionSetting: NupOrient=land"
+*FoomaticRIPOptionSetting NupOrient=land: "-ol "
+*NupOrient port/Portrait: "%% FoomaticRIPOptionSetting: NupOrient=port"
+*FoomaticRIPOptionSetting NupOrient=port: " "
+*NupOrient sea/Seascape: "%% FoomaticRIPOptionSetting: NupOrient=sea"
+*FoomaticRIPOptionSetting NupOrient=sea: "-os "
+*CloseUI: *NupOrient
+
+*CloseGroup: Miscellaneous
+
+
+*% Generic boilerplate PPD stuff as standard PostScript fonts and so on
+
+*DefaultFont: Courier
+*Font AvantGarde-Book: Standard "(001.006S)" Standard ROM
+*Font AvantGarde-BookOblique: Standard "(001.006S)" Standard ROM
+*Font AvantGarde-Demi: Standard "(001.007S)" Standard ROM
+*Font AvantGarde-DemiOblique: Standard "(001.007S)" Standard ROM
+*Font Bookman-Demi: Standard "(001.004S)" Standard ROM
+*Font Bookman-DemiItalic: Standard "(001.004S)" Standard ROM
+*Font Bookman-Light: Standard "(001.004S)" Standard ROM
+*Font Bookman-LightItalic: Standard "(001.004S)" Standard ROM
+*Font Courier: Standard "(002.004S)" Standard ROM
+*Font Courier-Bold: Standard "(002.004S)" Standard ROM
+*Font Courier-BoldOblique: Standard "(002.004S)" Standard ROM
+*Font Courier-Oblique: Standard "(002.004S)" Standard ROM
+*Font Helvetica: Standard "(001.006S)" Standard ROM
+*Font Helvetica-Bold: Standard "(001.007S)" Standard ROM
+*Font Helvetica-BoldOblique: Standard "(001.007S)" Standard ROM
+*Font Helvetica-Narrow: Standard "(001.006S)" Standard ROM
+*Font Helvetica-Narrow-Bold: Standard "(001.007S)" Standard ROM
+*Font Helvetica-Narrow-BoldOblique: Standard "(001.007S)" Standard ROM
+*Font Helvetica-Narrow-Oblique: Standard "(001.006S)" Standard ROM
+*Font Helvetica-Oblique: Standard "(001.006S)" Standard ROM
+*Font NewCenturySchlbk-Bold: Standard "(001.009S)" Standard ROM
+*Font NewCenturySchlbk-BoldItalic: Standard "(001.007S)" Standard ROM
+*Font NewCenturySchlbk-Italic: Standard "(001.006S)" Standard ROM
+*Font NewCenturySchlbk-Roman: Standard "(001.007S)" Standard ROM
+*Font Palatino-Bold: Standard "(001.005S)" Standard ROM
+*Font Palatino-BoldItalic: Standard "(001.005S)" Standard ROM
+*Font Palatino-Italic: Standard "(001.005S)" Standard ROM
+*Font Palatino-Roman: Standard "(001.005S)" Standard ROM
+*Font Symbol: Special "(001.007S)" Special ROM
+*Font Times-Bold: Standard "(001.007S)" Standard ROM
+*Font Times-BoldItalic: Standard "(001.009S)" Standard ROM
+*Font Times-Italic: Standard "(001.007S)" Standard ROM
+*Font Times-Roman: Standard "(001.007S)" Standard ROM
+*Font ZapfChancery-MediumItalic: Standard "(001.007S)" Standard ROM
+*Font ZapfDingbats: Special "(001.004S)" Standard ROM
+
diff --git a/PPD/KonicaMinolta-magicolor_2490_MF.ppd b/PPD/KonicaMinolta-magicolor_2490_MF.ppd
new file mode 100644
index 0000000..760f0a3
--- /dev/null
+++ b/PPD/KonicaMinolta-magicolor_2490_MF.ppd
@@ -0,0 +1,427 @@
+*PPD-Adobe: "4.3"
+*%
+*% For information on using this, and to obtain the required backend
+*% script, consult http://www.linuxprinting.org/
+*%
+*% This file is published under the GNU General Public License
+*%
+*% PPD-O-MATIC (3.0.0 or newer) generated this PPD file. It is for use with
+*% all programs and environments which use PPD files for dealing with
+*% printer capability information. The printer must be configured with the
+*% "foomatic-rip" backend filter script of Foomatic 3.0.0 or newer. This
+*% file and "foomatic-rip" work together to support PPD-controlled printer
+*% driver option access with arbitrary free software printer drivers and
+*% printing spoolers.
+*%
+*% To save this file on your disk, wait until the download has completed
+*% (the animation of the browser logo must stop) and then use the
+*% "Save as..." command in the "File" menu of your browser or in the
+*% pop-up manu when you click on this document with the right mouse button.
+*% DO NOT cut and paste this file into an editor with your mouse. This can
+*% introduce additional line breaks which lead to unexpected results.
+*%
+*% You may save this file as 'KonicaMinolta-magicolor_2490_MF-foo2lava.ppd'
+*%
+*%
+*FormatVersion: "4.3"
+*FileVersion: "1.1"
+*LanguageVersion: English
+*LanguageEncoding: ISOLatin1
+*PCFileName: "FOO2LAVA.PPD"
+*Manufacturer: "KonicaMinolta"
+*Product: "(magicolor 2490 MF)"
+*cupsVersion: 1.0
+*cupsManualCopies: True
+*cupsModelNumber: 2
+*cupsFilter: "application/vnd.cups-postscript 0 foomatic-rip"
+*%pprRIP: foomatic-rip other
+*ModelName: "KonicaMinolta magicolor 2490 MF"
+*ShortNickName: "Kon.Minolta m. 2490 MF foo2lava"
+*NickName: "KonicaMinolta magicolor 2490 MF Foomatic/foo2lava (recommended)"
+*PSVersion: "(3010.000) 550"
+*PSVersion: "(3010.000) 651"
+*PSVersion: "(3010.000) 652"
+*PSVersion: "(3010.000) 653"
+*PSVersion: "(3010.000) 704"
+*PSVersion: "(3010.000) 705"
+*PSVersion: "(3010.000) 800"
+*LanguageLevel: "3"
+*ColorDevice: True
+*DefaultColorSpace: RGB
+*FileSystem: False
+*Throughput: "1"
+*LandscapeOrientation: Plus90
+*TTRasterizer: Type42
+*1284DeviceID: "MANUFACTURER:KONICA MINOLTA;MODEL:magicolor 2490 MF;COMMAND SET:ZJS,PJL;"
+
+
+
+*VariablePaperSize: False
+
+*FoomaticIDs: KonicaMinolta-magicolor_2490_MF foo2lava
+*FoomaticRIPCommandLine: "foo2lava-wrapper %A"
+
+*OpenGroup: General/General
+
+*OpenUI *PageSize/Page Size: PickOne
+*FoomaticRIPOption PageSize: enum CmdLine A
+*OrderDependency: 135 AnySetup *PageSize
+*DefaultPageSize: Letter
+*PageSize Letter/Letter: "%% FoomaticRIPOptionSetting: PageSize=Letter"
+*FoomaticRIPOptionSetting PageSize=Letter: "-p2 "
+*PageSize A4/A4: "%% FoomaticRIPOptionSetting: PageSize=A4"
+*FoomaticRIPOptionSetting PageSize=A4: "-p26 "
+*PageSize Photo4x6/Photo Size 4x6 in: "%% FoomaticRIPOptionSetting: PageSize=Photo4x6"
+*FoomaticRIPOptionSetting PageSize=Photo4x6: "-p835 "
+*PageSize Photo10x15/Photo Size 10x15 cm: "%% FoomaticRIPOptionSetting: PageSize=Photo10x15"
+*FoomaticRIPOptionSetting PageSize=Photo10x15: "-p837 "
+*PageSize A5/A5: "%% FoomaticRIPOptionSetting: PageSize=A5"
+*FoomaticRIPOptionSetting PageSize=A5: "-p25 "
+*PageSize B5iso/B5 (ISO): "%% FoomaticRIPOptionSetting: PageSize=B5iso"
+*FoomaticRIPOptionSetting PageSize=B5iso: "-p65 "
+*PageSize B5jis/B5 (JIS): "%% FoomaticRIPOptionSetting: PageSize=B5jis"
+*FoomaticRIPOptionSetting PageSize=B5jis: "-p45 "
+*PageSize Env10/Env #10: "%% FoomaticRIPOptionSetting: PageSize=Env10"
+*FoomaticRIPOptionSetting PageSize=Env10: "-p81 "
+*PageSize EnvC5/Env C5: "%% FoomaticRIPOptionSetting: PageSize=EnvC5"
+*FoomaticRIPOptionSetting PageSize=EnvC5: "-p91 "
+*PageSize EnvC6/Env C6: "%% FoomaticRIPOptionSetting: PageSize=EnvC6"
+*FoomaticRIPOptionSetting PageSize=EnvC6: "-p92 "
+*PageSize EnvDL/Env DL: "%% FoomaticRIPOptionSetting: PageSize=EnvDL"
+*FoomaticRIPOptionSetting PageSize=EnvDL: "-p90 "
+*PageSize EnvMonarch/Env Monarch: "%% FoomaticRIPOptionSetting: PageSize=EnvMonarch"
+*FoomaticRIPOptionSetting PageSize=EnvMonarch: "-p80 "
+*PageSize Executive/Executive: "%% FoomaticRIPOptionSetting: PageSize=Executive"
+*FoomaticRIPOptionSetting PageSize=Executive: "-p1 "
+*PageSize Legal/Legal: "%% FoomaticRIPOptionSetting: PageSize=Legal"
+*FoomaticRIPOptionSetting PageSize=Legal: "-p3 "
+*CloseUI: *PageSize
+
+*OpenUI *PageRegion: PickOne
+*OrderDependency: 135 AnySetup *PageRegion
+*DefaultPageRegion: Letter
+*PageRegion Letter/Letter: "%% FoomaticRIPOptionSetting: PageSize=Letter"
+*PageRegion A4/A4: "%% FoomaticRIPOptionSetting: PageSize=A4"
+*PageRegion Photo4x6/Photo Size 4x6 in: "%% FoomaticRIPOptionSetting: PageSize=Photo4x6"
+*PageRegion Photo10x15/Photo Size 10x15 cm: "%% FoomaticRIPOptionSetting: PageSize=Photo10x15"
+*PageRegion A5/A5: "%% FoomaticRIPOptionSetting: PageSize=A5"
+*PageRegion B5iso/B5 (ISO): "%% FoomaticRIPOptionSetting: PageSize=B5iso"
+*PageRegion B5jis/B5 (JIS): "%% FoomaticRIPOptionSetting: PageSize=B5jis"
+*PageRegion Env10/Env #10: "%% FoomaticRIPOptionSetting: PageSize=Env10"
+*PageRegion EnvC5/Env C5: "%% FoomaticRIPOptionSetting: PageSize=EnvC5"
+*PageRegion EnvC6/Env C6: "%% FoomaticRIPOptionSetting: PageSize=EnvC6"
+*PageRegion EnvDL/Env DL: "%% FoomaticRIPOptionSetting: PageSize=EnvDL"
+*PageRegion EnvMonarch/Env Monarch: "%% FoomaticRIPOptionSetting: PageSize=EnvMonarch"
+*PageRegion Executive/Executive: "%% FoomaticRIPOptionSetting: PageSize=Executive"
+*PageRegion Legal/Legal: "%% FoomaticRIPOptionSetting: PageSize=Legal"
+*CloseUI: *PageRegion
+
+*DefaultImageableArea: Letter
+*ImageableArea Letter/Letter: "11.34 11.34 600.66 780.66"
+*ImageableArea A4/A4: "11.34 11.34 583.66 830.66"
+*ImageableArea Photo4x6/Photo Size 4x6 in: "11.34 11.34 276.66 420.66"
+*ImageableArea Photo10x15/Photo Size 10x15 cm: "11.34 11.34 276.66 420.66"
+*ImageableArea A5/A5: "11.34 11.34 408.66 583.66"
+*ImageableArea B5iso/B5 (ISO): "11.34 11.34 486.66 696.66"
+*ImageableArea B5jis/B5 (JIS): "11.34 11.34 506.66 715.66"
+*ImageableArea Env10/Env #10: "11.34 11.34 285.66 672.66"
+*ImageableArea EnvC5/Env C5: "11.34 11.34 447.66 637.66"
+*ImageableArea EnvC6/Env C6: "11.34 11.34 311.66 447.66"
+*ImageableArea EnvDL/Env DL: "11.34 11.34 299.66 611.66"
+*ImageableArea EnvMonarch/Env Monarch: "11.34 11.34 267.66 528.66"
+*ImageableArea Executive/Executive: "11.34 11.34 510.66 744.66"
+*ImageableArea Legal/Legal: "11.34 11.34 600.66 996.66"
+
+*DefaultPaperDimension: Letter
+*PaperDimension Letter/Letter: "612 792"
+*PaperDimension A4/A4: "595 842"
+*PaperDimension Photo4x6/Photo Size 4x6 in: "288 432"
+*PaperDimension Photo10x15/Photo Size 10x15 cm: "288 432"
+*PaperDimension A5/A5: "420 595"
+*PaperDimension B5iso/B5 (ISO): "498 708"
+*PaperDimension B5jis/B5 (JIS): "518 727"
+*PaperDimension Env10/Env #10: "297 684"
+*PaperDimension EnvC5/Env C5: "459 649"
+*PaperDimension EnvC6/Env C6: "323 459"
+*PaperDimension EnvDL/Env DL: "311 623"
+*PaperDimension EnvMonarch/Env Monarch: "279 540"
+*PaperDimension Executive/Executive: "522 756"
+*PaperDimension Legal/Legal: "612 1008"
+
+*OpenUI *InputSlot/Media Source: PickOne
+*FoomaticRIPOption InputSlot: enum CmdLine A
+*OrderDependency: 150 AnySetup *InputSlot
+*DefaultInputSlot: Auto
+*InputSlot Tray1/Tray 1 (Multipurpose): "%% FoomaticRIPOptionSetting: InputSlot=Tray1"
+*FoomaticRIPOptionSetting InputSlot=Tray1: "-s1 "
+*InputSlot Tray2/Tray 2: "%% FoomaticRIPOptionSetting: InputSlot=Tray2"
+*FoomaticRIPOptionSetting InputSlot=Tray2: "-s4 "
+*InputSlot Auto/Auto Select: "%% FoomaticRIPOptionSetting: InputSlot=Auto"
+*FoomaticRIPOptionSetting InputSlot=Auto: "-s255 "
+*CloseUI: *InputSlot
+
+*OpenUI *MediaType/Media Type: PickOne
+*FoomaticRIPOption MediaType: enum CmdLine A
+*OrderDependency: 150 AnySetup *MediaType
+*DefaultMediaType: plain
+*MediaType plain/Plain Paper: "%% FoomaticRIPOptionSetting: MediaType=plain"
+*FoomaticRIPOptionSetting MediaType=plain: "-m1 "
+*MediaType envelope/Envelope: "%% FoomaticRIPOptionSetting: MediaType=envelope"
+*FoomaticRIPOptionSetting MediaType=envelope: "-m22 "
+*MediaType glossy/Glossy: "%% FoomaticRIPOptionSetting: MediaType=glossy"
+*FoomaticRIPOptionSetting MediaType=glossy: "-m28 "
+*MediaType labels/Labels: "%% FoomaticRIPOptionSetting: MediaType=labels"
+*FoomaticRIPOptionSetting MediaType=labels: "-m26 "
+*MediaType letterhead/Letterhead: "%% FoomaticRIPOptionSetting: MediaType=letterhead"
+*FoomaticRIPOptionSetting MediaType=letterhead: "-m23 "
+*MediaType postcard/Postcard: "%% FoomaticRIPOptionSetting: MediaType=postcard"
+*FoomaticRIPOptionSetting MediaType=postcard: "-m25 "
+*MediaType recycled/Recycled Paper: "%% FoomaticRIPOptionSetting: MediaType=recycled"
+*FoomaticRIPOptionSetting MediaType=recycled: "-m27 "
+*MediaType thick/Thick Stock: "%% FoomaticRIPOptionSetting: MediaType=thick"
+*FoomaticRIPOptionSetting MediaType=thick: "-m20 "
+*MediaType transparency/Transparency: "%% FoomaticRIPOptionSetting: MediaType=transparency"
+*FoomaticRIPOptionSetting MediaType=transparency: "-m4 "
+*CloseUI: *MediaType
+
+*OpenUI *Duplex/Duplex Printing: PickOne
+*FoomaticRIPOption Duplex: enum CmdLine A
+*OrderDependency: 210 AnySetup *Duplex
+*DefaultDuplex: None
+*Duplex DuplexNoTumble/Long Edge (Standard): "%% FoomaticRIPOptionSetting: Duplex=DuplexNoTumble"
+*FoomaticRIPOptionSetting Duplex=DuplexNoTumble: "-d2 "
+*Duplex DuplexTumble/Short Edge (Flip): "%% FoomaticRIPOptionSetting: Duplex=DuplexTumble"
+*FoomaticRIPOptionSetting Duplex=DuplexTumble: "-d3 "
+*Duplex None/Off: "%% FoomaticRIPOptionSetting: Duplex=None"
+*FoomaticRIPOptionSetting Duplex=None: "-d1 "
+*CloseUI: *Duplex
+
+*OpenUI *Resolution/Resolution: PickOne
+*FoomaticRIPOption Resolution: enum CmdLine A
+*OrderDependency: 130 AnySetup *Resolution
+*DefaultResolution: 1200x600dpi
+*Resolution 600x600dpi/600x600 dpi: "%% FoomaticRIPOptionSetting: Resolution=600x600dpi"
+*FoomaticRIPOptionSetting Resolution=600x600dpi: "-r600x600 "
+*Resolution 1200x600dpi/1200x600 dpi: "%% FoomaticRIPOptionSetting: Resolution=1200x600dpi"
+*FoomaticRIPOptionSetting Resolution=1200x600dpi: "-r1200x600 "
+*Resolution 2400x600dpi/2400x600 dpi: "%% FoomaticRIPOptionSetting: Resolution=2400x600dpi"
+*FoomaticRIPOptionSetting Resolution=2400x600dpi: "-r2400x600 "
+*CloseUI: *Resolution
+
+*OpenUI *Quality/Printing Quality: PickOne
+*FoomaticRIPOption Quality: enum CmdLine A
+*OrderDependency: 110 AnySetup *Quality
+*DefaultQuality: normal
+*Quality draft/Draft: "%% FoomaticRIPOptionSetting: Quality=draft"
+*FoomaticRIPOptionSetting Quality=draft: " -t "
+*Quality normal/Normal: "%% FoomaticRIPOptionSetting: Quality=normal"
+*FoomaticRIPOptionSetting Quality=normal: " "
+*CloseUI: *Quality
+
+*OpenUI *ColorMode/Color Mode: PickOne
+*FoomaticRIPOption ColorMode: enum CmdLine A
+*OrderDependency: 120 AnySetup *ColorMode
+*DefaultColorMode: Monochrome
+*ColorMode Color/Color: "%% FoomaticRIPOptionSetting: ColorMode=Color"
+*FoomaticRIPOptionSetting ColorMode=Color: "-c "
+*ColorMode Monochrome/Monochrome: "%% FoomaticRIPOptionSetting: ColorMode=Monochrome"
+*FoomaticRIPOptionSetting ColorMode=Monochrome: " "
+*CloseUI: *ColorMode
+
+*OpenUI *Copies/Copies: PickOne
+*FoomaticRIPOption Copies: int CmdLine A
+*FoomaticRIPOptionPrototype Copies: "-n%s "
+*FoomaticRIPOptionRange Copies: 1 100
+*OrderDependency: 220 AnySetup *Copies
+*DefaultCopies: 1
+*FoomaticRIPDefaultCopies: 1
+*Copies 1/1: "%% FoomaticRIPOptionSetting: Copies=1"
+*Copies 2/2: "%% FoomaticRIPOptionSetting: Copies=2"
+*Copies 3/3: "%% FoomaticRIPOptionSetting: Copies=3"
+*Copies 4/4: "%% FoomaticRIPOptionSetting: Copies=4"
+*Copies 5/5: "%% FoomaticRIPOptionSetting: Copies=5"
+*Copies 6/6: "%% FoomaticRIPOptionSetting: Copies=6"
+*Copies 7/7: "%% FoomaticRIPOptionSetting: Copies=7"
+*Copies 8/8: "%% FoomaticRIPOptionSetting: Copies=8"
+*Copies 9/9: "%% FoomaticRIPOptionSetting: Copies=9"
+*Copies 10/10: "%% FoomaticRIPOptionSetting: Copies=10"
+*Copies 11/11: "%% FoomaticRIPOptionSetting: Copies=11"
+*Copies 12/12: "%% FoomaticRIPOptionSetting: Copies=12"
+*Copies 13/13: "%% FoomaticRIPOptionSetting: Copies=13"
+*Copies 14/14: "%% FoomaticRIPOptionSetting: Copies=14"
+*Copies 15/15: "%% FoomaticRIPOptionSetting: Copies=15"
+*Copies 16/16: "%% FoomaticRIPOptionSetting: Copies=16"
+*Copies 17/17: "%% FoomaticRIPOptionSetting: Copies=17"
+*Copies 18/18: "%% FoomaticRIPOptionSetting: Copies=18"
+*Copies 19/19: "%% FoomaticRIPOptionSetting: Copies=19"
+*Copies 20/20: "%% FoomaticRIPOptionSetting: Copies=20"
+*Copies 21/21: "%% FoomaticRIPOptionSetting: Copies=21"
+*Copies 22/22: "%% FoomaticRIPOptionSetting: Copies=22"
+*Copies 23/23: "%% FoomaticRIPOptionSetting: Copies=23"
+*Copies 24/24: "%% FoomaticRIPOptionSetting: Copies=24"
+*Copies 25/25: "%% FoomaticRIPOptionSetting: Copies=25"
+*Copies 26/26: "%% FoomaticRIPOptionSetting: Copies=26"
+*Copies 27/27: "%% FoomaticRIPOptionSetting: Copies=27"
+*Copies 28/28: "%% FoomaticRIPOptionSetting: Copies=28"
+*Copies 29/29: "%% FoomaticRIPOptionSetting: Copies=29"
+*Copies 30/30: "%% FoomaticRIPOptionSetting: Copies=30"
+*Copies 31/31: "%% FoomaticRIPOptionSetting: Copies=31"
+*Copies 32/32: "%% FoomaticRIPOptionSetting: Copies=32"
+*Copies 33/33: "%% FoomaticRIPOptionSetting: Copies=33"
+*Copies 34/34: "%% FoomaticRIPOptionSetting: Copies=34"
+*Copies 35/35: "%% FoomaticRIPOptionSetting: Copies=35"
+*Copies 36/36: "%% FoomaticRIPOptionSetting: Copies=36"
+*Copies 37/37: "%% FoomaticRIPOptionSetting: Copies=37"
+*Copies 38/38: "%% FoomaticRIPOptionSetting: Copies=38"
+*Copies 39/39: "%% FoomaticRIPOptionSetting: Copies=39"
+*Copies 40/40: "%% FoomaticRIPOptionSetting: Copies=40"
+*Copies 41/41: "%% FoomaticRIPOptionSetting: Copies=41"
+*Copies 42/42: "%% FoomaticRIPOptionSetting: Copies=42"
+*Copies 43/43: "%% FoomaticRIPOptionSetting: Copies=43"
+*Copies 44/44: "%% FoomaticRIPOptionSetting: Copies=44"
+*Copies 45/45: "%% FoomaticRIPOptionSetting: Copies=45"
+*Copies 46/46: "%% FoomaticRIPOptionSetting: Copies=46"
+*Copies 47/47: "%% FoomaticRIPOptionSetting: Copies=47"
+*Copies 48/48: "%% FoomaticRIPOptionSetting: Copies=48"
+*Copies 49/49: "%% FoomaticRIPOptionSetting: Copies=49"
+*Copies 50/50: "%% FoomaticRIPOptionSetting: Copies=50"
+*Copies 51/51: "%% FoomaticRIPOptionSetting: Copies=51"
+*Copies 52/52: "%% FoomaticRIPOptionSetting: Copies=52"
+*Copies 53/53: "%% FoomaticRIPOptionSetting: Copies=53"
+*Copies 54/54: "%% FoomaticRIPOptionSetting: Copies=54"
+*Copies 55/55: "%% FoomaticRIPOptionSetting: Copies=55"
+*Copies 56/56: "%% FoomaticRIPOptionSetting: Copies=56"
+*Copies 57/57: "%% FoomaticRIPOptionSetting: Copies=57"
+*Copies 58/58: "%% FoomaticRIPOptionSetting: Copies=58"
+*Copies 59/59: "%% FoomaticRIPOptionSetting: Copies=59"
+*Copies 60/60: "%% FoomaticRIPOptionSetting: Copies=60"
+*Copies 61/61: "%% FoomaticRIPOptionSetting: Copies=61"
+*Copies 62/62: "%% FoomaticRIPOptionSetting: Copies=62"
+*Copies 63/63: "%% FoomaticRIPOptionSetting: Copies=63"
+*Copies 64/64: "%% FoomaticRIPOptionSetting: Copies=64"
+*Copies 65/65: "%% FoomaticRIPOptionSetting: Copies=65"
+*Copies 66/66: "%% FoomaticRIPOptionSetting: Copies=66"
+*Copies 67/67: "%% FoomaticRIPOptionSetting: Copies=67"
+*Copies 68/68: "%% FoomaticRIPOptionSetting: Copies=68"
+*Copies 69/69: "%% FoomaticRIPOptionSetting: Copies=69"
+*Copies 70/70: "%% FoomaticRIPOptionSetting: Copies=70"
+*Copies 71/71: "%% FoomaticRIPOptionSetting: Copies=71"
+*Copies 72/72: "%% FoomaticRIPOptionSetting: Copies=72"
+*Copies 73/73: "%% FoomaticRIPOptionSetting: Copies=73"
+*Copies 74/74: "%% FoomaticRIPOptionSetting: Copies=74"
+*Copies 75/75: "%% FoomaticRIPOptionSetting: Copies=75"
+*Copies 76/76: "%% FoomaticRIPOptionSetting: Copies=76"
+*Copies 77/77: "%% FoomaticRIPOptionSetting: Copies=77"
+*Copies 78/78: "%% FoomaticRIPOptionSetting: Copies=78"
+*Copies 79/79: "%% FoomaticRIPOptionSetting: Copies=79"
+*Copies 80/80: "%% FoomaticRIPOptionSetting: Copies=80"
+*Copies 81/81: "%% FoomaticRIPOptionSetting: Copies=81"
+*Copies 82/82: "%% FoomaticRIPOptionSetting: Copies=82"
+*Copies 83/83: "%% FoomaticRIPOptionSetting: Copies=83"
+*Copies 84/84: "%% FoomaticRIPOptionSetting: Copies=84"
+*Copies 85/85: "%% FoomaticRIPOptionSetting: Copies=85"
+*Copies 86/86: "%% FoomaticRIPOptionSetting: Copies=86"
+*Copies 87/87: "%% FoomaticRIPOptionSetting: Copies=87"
+*Copies 88/88: "%% FoomaticRIPOptionSetting: Copies=88"
+*Copies 89/89: "%% FoomaticRIPOptionSetting: Copies=89"
+*Copies 90/90: "%% FoomaticRIPOptionSetting: Copies=90"
+*Copies 91/91: "%% FoomaticRIPOptionSetting: Copies=91"
+*Copies 92/92: "%% FoomaticRIPOptionSetting: Copies=92"
+*Copies 93/93: "%% FoomaticRIPOptionSetting: Copies=93"
+*Copies 94/94: "%% FoomaticRIPOptionSetting: Copies=94"
+*Copies 95/95: "%% FoomaticRIPOptionSetting: Copies=95"
+*Copies 96/96: "%% FoomaticRIPOptionSetting: Copies=96"
+*Copies 97/97: "%% FoomaticRIPOptionSetting: Copies=97"
+*Copies 98/98: "%% FoomaticRIPOptionSetting: Copies=98"
+*Copies 99/99: "%% FoomaticRIPOptionSetting: Copies=99"
+*Copies 100/100: "%% FoomaticRIPOptionSetting: Copies=100"
+*CloseUI: *Copies
+
+*CloseGroup: General
+
+*OpenGroup: Miscellaneous/Miscellaneous
+
+*OpenUI *Nup/N-up Printing: PickOne
+*FoomaticRIPOption Nup: enum CmdLine A
+*OrderDependency: 200 AnySetup *Nup
+*DefaultNup: 1up
+*Nup 1up/1-up: "%% FoomaticRIPOptionSetting: Nup=1up"
+*FoomaticRIPOptionSetting Nup=1up: " "
+*Nup 2up/2-up: "%% FoomaticRIPOptionSetting: Nup=2up"
+*FoomaticRIPOptionSetting Nup=2up: "-2 "
+*Nup 3up/3-up: "%% FoomaticRIPOptionSetting: Nup=3up"
+*FoomaticRIPOptionSetting Nup=3up: "-3 "
+*Nup 4up/4-up: "%% FoomaticRIPOptionSetting: Nup=4up"
+*FoomaticRIPOptionSetting Nup=4up: "-4 "
+*Nup 6up/6-up: "%% FoomaticRIPOptionSetting: Nup=6up"
+*FoomaticRIPOptionSetting Nup=6up: "-6 "
+*Nup 8up/8-up: "%% FoomaticRIPOptionSetting: Nup=8up"
+*FoomaticRIPOptionSetting Nup=8up: "-8 "
+*Nup 10up/10-up: "%% FoomaticRIPOptionSetting: Nup=10up"
+*FoomaticRIPOptionSetting Nup=10up: "-10 "
+*Nup 12up/12-up: "%% FoomaticRIPOptionSetting: Nup=12up"
+*FoomaticRIPOptionSetting Nup=12up: "-12 "
+*Nup 14up/14-up: "%% FoomaticRIPOptionSetting: Nup=14up"
+*FoomaticRIPOptionSetting Nup=14up: "-14 "
+*Nup 15up/15-up: "%% FoomaticRIPOptionSetting: Nup=15up"
+*FoomaticRIPOptionSetting Nup=15up: "-15 "
+*Nup 16up/16-up: "%% FoomaticRIPOptionSetting: Nup=16up"
+*FoomaticRIPOptionSetting Nup=16up: "-16 "
+*Nup 18up/18-up: "%% FoomaticRIPOptionSetting: Nup=18up"
+*FoomaticRIPOptionSetting Nup=18up: "-18 "
+*CloseUI: *Nup
+
+*OpenUI *NupOrient/N-up Orientation: PickOne
+*FoomaticRIPOption NupOrient: enum CmdLine A
+*OrderDependency: 200 AnySetup *NupOrient
+*DefaultNupOrient: port
+*NupOrient land/Landscape: "%% FoomaticRIPOptionSetting: NupOrient=land"
+*FoomaticRIPOptionSetting NupOrient=land: "-ol "
+*NupOrient port/Portrait: "%% FoomaticRIPOptionSetting: NupOrient=port"
+*FoomaticRIPOptionSetting NupOrient=port: " "
+*NupOrient sea/Seascape: "%% FoomaticRIPOptionSetting: NupOrient=sea"
+*FoomaticRIPOptionSetting NupOrient=sea: "-os "
+*CloseUI: *NupOrient
+
+*CloseGroup: Miscellaneous
+
+
+*% Generic boilerplate PPD stuff as standard PostScript fonts and so on
+
+*DefaultFont: Courier
+*Font AvantGarde-Book: Standard "(001.006S)" Standard ROM
+*Font AvantGarde-BookOblique: Standard "(001.006S)" Standard ROM
+*Font AvantGarde-Demi: Standard "(001.007S)" Standard ROM
+*Font AvantGarde-DemiOblique: Standard "(001.007S)" Standard ROM
+*Font Bookman-Demi: Standard "(001.004S)" Standard ROM
+*Font Bookman-DemiItalic: Standard "(001.004S)" Standard ROM
+*Font Bookman-Light: Standard "(001.004S)" Standard ROM
+*Font Bookman-LightItalic: Standard "(001.004S)" Standard ROM
+*Font Courier: Standard "(002.004S)" Standard ROM
+*Font Courier-Bold: Standard "(002.004S)" Standard ROM
+*Font Courier-BoldOblique: Standard "(002.004S)" Standard ROM
+*Font Courier-Oblique: Standard "(002.004S)" Standard ROM
+*Font Helvetica: Standard "(001.006S)" Standard ROM
+*Font Helvetica-Bold: Standard "(001.007S)" Standard ROM
+*Font Helvetica-BoldOblique: Standard "(001.007S)" Standard ROM
+*Font Helvetica-Narrow: Standard "(001.006S)" Standard ROM
+*Font Helvetica-Narrow-Bold: Standard "(001.007S)" Standard ROM
+*Font Helvetica-Narrow-BoldOblique: Standard "(001.007S)" Standard ROM
+*Font Helvetica-Narrow-Oblique: Standard "(001.006S)" Standard ROM
+*Font Helvetica-Oblique: Standard "(001.006S)" Standard ROM
+*Font NewCenturySchlbk-Bold: Standard "(001.009S)" Standard ROM
+*Font NewCenturySchlbk-BoldItalic: Standard "(001.007S)" Standard ROM
+*Font NewCenturySchlbk-Italic: Standard "(001.006S)" Standard ROM
+*Font NewCenturySchlbk-Roman: Standard "(001.007S)" Standard ROM
+*Font Palatino-Bold: Standard "(001.005S)" Standard ROM
+*Font Palatino-BoldItalic: Standard "(001.005S)" Standard ROM
+*Font Palatino-Italic: Standard "(001.005S)" Standard ROM
+*Font Palatino-Roman: Standard "(001.005S)" Standard ROM
+*Font Symbol: Special "(001.007S)" Special ROM
+*Font Times-Bold: Standard "(001.007S)" Standard ROM
+*Font Times-BoldItalic: Standard "(001.009S)" Standard ROM
+*Font Times-Italic: Standard "(001.007S)" Standard ROM
+*Font Times-Roman: Standard "(001.007S)" Standard ROM
+*Font ZapfChancery-MediumItalic: Standard "(001.007S)" Standard ROM
+*Font ZapfDingbats: Special "(001.004S)" Standard ROM
+
diff --git a/PPD/KonicaMinolta-magicolor_2530_DL.ppd b/PPD/KonicaMinolta-magicolor_2530_DL.ppd
new file mode 100644
index 0000000..548d65a
--- /dev/null
+++ b/PPD/KonicaMinolta-magicolor_2530_DL.ppd
@@ -0,0 +1,427 @@
+*PPD-Adobe: "4.3"
+*%
+*% For information on using this, and to obtain the required backend
+*% script, consult http://www.linuxprinting.org/
+*%
+*% This file is published under the GNU General Public License
+*%
+*% PPD-O-MATIC (3.0.0 or newer) generated this PPD file. It is for use with
+*% all programs and environments which use PPD files for dealing with
+*% printer capability information. The printer must be configured with the
+*% "foomatic-rip" backend filter script of Foomatic 3.0.0 or newer. This
+*% file and "foomatic-rip" work together to support PPD-controlled printer
+*% driver option access with arbitrary free software printer drivers and
+*% printing spoolers.
+*%
+*% To save this file on your disk, wait until the download has completed
+*% (the animation of the browser logo must stop) and then use the
+*% "Save as..." command in the "File" menu of your browser or in the
+*% pop-up manu when you click on this document with the right mouse button.
+*% DO NOT cut and paste this file into an editor with your mouse. This can
+*% introduce additional line breaks which lead to unexpected results.
+*%
+*% You may save this file as 'KonicaMinolta-magicolor_2530_DL-foo2lava.ppd'
+*%
+*%
+*FormatVersion: "4.3"
+*FileVersion: "1.1"
+*LanguageVersion: English
+*LanguageEncoding: ISOLatin1
+*PCFileName: "FOO2LAVA.PPD"
+*Manufacturer: "KonicaMinolta"
+*Product: "(magicolor 2530 DL)"
+*cupsVersion: 1.0
+*cupsManualCopies: True
+*cupsModelNumber: 2
+*cupsFilter: "application/vnd.cups-postscript 0 foomatic-rip"
+*%pprRIP: foomatic-rip other
+*ModelName: "KonicaMinolta magicolor 2530 DL"
+*ShortNickName: "Kon.Minolta m. 2530 DL foo2lava"
+*NickName: "KonicaMinolta magicolor 2530 DL Foomatic/foo2lava (recommended)"
+*PSVersion: "(3010.000) 550"
+*PSVersion: "(3010.000) 651"
+*PSVersion: "(3010.000) 652"
+*PSVersion: "(3010.000) 653"
+*PSVersion: "(3010.000) 704"
+*PSVersion: "(3010.000) 705"
+*PSVersion: "(3010.000) 800"
+*LanguageLevel: "3"
+*ColorDevice: True
+*DefaultColorSpace: RGB
+*FileSystem: False
+*Throughput: "1"
+*LandscapeOrientation: Plus90
+*TTRasterizer: Type42
+*1284DeviceID: "MANUFACTURER:KONICA MINOLTA;MODEL:magicolor 2530 DL;COMMAND SET:ZJS,PJL;"
+
+
+
+*VariablePaperSize: False
+
+*FoomaticIDs: KonicaMinolta-magicolor_2530_DL foo2lava
+*FoomaticRIPCommandLine: "foo2lava-wrapper %A"
+
+*OpenGroup: General/General
+
+*OpenUI *PageSize/Page Size: PickOne
+*FoomaticRIPOption PageSize: enum CmdLine A
+*OrderDependency: 135 AnySetup *PageSize
+*DefaultPageSize: Letter
+*PageSize Letter/Letter: "%% FoomaticRIPOptionSetting: PageSize=Letter"
+*FoomaticRIPOptionSetting PageSize=Letter: "-p2 "
+*PageSize A4/A4: "%% FoomaticRIPOptionSetting: PageSize=A4"
+*FoomaticRIPOptionSetting PageSize=A4: "-p26 "
+*PageSize Photo4x6/Photo Size 4x6 in: "%% FoomaticRIPOptionSetting: PageSize=Photo4x6"
+*FoomaticRIPOptionSetting PageSize=Photo4x6: "-p835 "
+*PageSize Photo10x15/Photo Size 10x15 cm: "%% FoomaticRIPOptionSetting: PageSize=Photo10x15"
+*FoomaticRIPOptionSetting PageSize=Photo10x15: "-p837 "
+*PageSize A5/A5: "%% FoomaticRIPOptionSetting: PageSize=A5"
+*FoomaticRIPOptionSetting PageSize=A5: "-p25 "
+*PageSize B5iso/B5 (ISO): "%% FoomaticRIPOptionSetting: PageSize=B5iso"
+*FoomaticRIPOptionSetting PageSize=B5iso: "-p65 "
+*PageSize B5jis/B5 (JIS): "%% FoomaticRIPOptionSetting: PageSize=B5jis"
+*FoomaticRIPOptionSetting PageSize=B5jis: "-p45 "
+*PageSize Env10/Env #10: "%% FoomaticRIPOptionSetting: PageSize=Env10"
+*FoomaticRIPOptionSetting PageSize=Env10: "-p81 "
+*PageSize EnvC5/Env C5: "%% FoomaticRIPOptionSetting: PageSize=EnvC5"
+*FoomaticRIPOptionSetting PageSize=EnvC5: "-p91 "
+*PageSize EnvC6/Env C6: "%% FoomaticRIPOptionSetting: PageSize=EnvC6"
+*FoomaticRIPOptionSetting PageSize=EnvC6: "-p92 "
+*PageSize EnvDL/Env DL: "%% FoomaticRIPOptionSetting: PageSize=EnvDL"
+*FoomaticRIPOptionSetting PageSize=EnvDL: "-p90 "
+*PageSize EnvMonarch/Env Monarch: "%% FoomaticRIPOptionSetting: PageSize=EnvMonarch"
+*FoomaticRIPOptionSetting PageSize=EnvMonarch: "-p80 "
+*PageSize Executive/Executive: "%% FoomaticRIPOptionSetting: PageSize=Executive"
+*FoomaticRIPOptionSetting PageSize=Executive: "-p1 "
+*PageSize Legal/Legal: "%% FoomaticRIPOptionSetting: PageSize=Legal"
+*FoomaticRIPOptionSetting PageSize=Legal: "-p3 "
+*CloseUI: *PageSize
+
+*OpenUI *PageRegion: PickOne
+*OrderDependency: 135 AnySetup *PageRegion
+*DefaultPageRegion: Letter
+*PageRegion Letter/Letter: "%% FoomaticRIPOptionSetting: PageSize=Letter"
+*PageRegion A4/A4: "%% FoomaticRIPOptionSetting: PageSize=A4"
+*PageRegion Photo4x6/Photo Size 4x6 in: "%% FoomaticRIPOptionSetting: PageSize=Photo4x6"
+*PageRegion Photo10x15/Photo Size 10x15 cm: "%% FoomaticRIPOptionSetting: PageSize=Photo10x15"
+*PageRegion A5/A5: "%% FoomaticRIPOptionSetting: PageSize=A5"
+*PageRegion B5iso/B5 (ISO): "%% FoomaticRIPOptionSetting: PageSize=B5iso"
+*PageRegion B5jis/B5 (JIS): "%% FoomaticRIPOptionSetting: PageSize=B5jis"
+*PageRegion Env10/Env #10: "%% FoomaticRIPOptionSetting: PageSize=Env10"
+*PageRegion EnvC5/Env C5: "%% FoomaticRIPOptionSetting: PageSize=EnvC5"
+*PageRegion EnvC6/Env C6: "%% FoomaticRIPOptionSetting: PageSize=EnvC6"
+*PageRegion EnvDL/Env DL: "%% FoomaticRIPOptionSetting: PageSize=EnvDL"
+*PageRegion EnvMonarch/Env Monarch: "%% FoomaticRIPOptionSetting: PageSize=EnvMonarch"
+*PageRegion Executive/Executive: "%% FoomaticRIPOptionSetting: PageSize=Executive"
+*PageRegion Legal/Legal: "%% FoomaticRIPOptionSetting: PageSize=Legal"
+*CloseUI: *PageRegion
+
+*DefaultImageableArea: Letter
+*ImageableArea Letter/Letter: "11.34 11.34 600.66 780.66"
+*ImageableArea A4/A4: "11.34 11.34 583.66 830.66"
+*ImageableArea Photo4x6/Photo Size 4x6 in: "11.34 11.34 276.66 420.66"
+*ImageableArea Photo10x15/Photo Size 10x15 cm: "11.34 11.34 276.66 420.66"
+*ImageableArea A5/A5: "11.34 11.34 408.66 583.66"
+*ImageableArea B5iso/B5 (ISO): "11.34 11.34 486.66 696.66"
+*ImageableArea B5jis/B5 (JIS): "11.34 11.34 506.66 715.66"
+*ImageableArea Env10/Env #10: "11.34 11.34 285.66 672.66"
+*ImageableArea EnvC5/Env C5: "11.34 11.34 447.66 637.66"
+*ImageableArea EnvC6/Env C6: "11.34 11.34 311.66 447.66"
+*ImageableArea EnvDL/Env DL: "11.34 11.34 299.66 611.66"
+*ImageableArea EnvMonarch/Env Monarch: "11.34 11.34 267.66 528.66"
+*ImageableArea Executive/Executive: "11.34 11.34 510.66 744.66"
+*ImageableArea Legal/Legal: "11.34 11.34 600.66 996.66"
+
+*DefaultPaperDimension: Letter
+*PaperDimension Letter/Letter: "612 792"
+*PaperDimension A4/A4: "595 842"
+*PaperDimension Photo4x6/Photo Size 4x6 in: "288 432"
+*PaperDimension Photo10x15/Photo Size 10x15 cm: "288 432"
+*PaperDimension A5/A5: "420 595"
+*PaperDimension B5iso/B5 (ISO): "498 708"
+*PaperDimension B5jis/B5 (JIS): "518 727"
+*PaperDimension Env10/Env #10: "297 684"
+*PaperDimension EnvC5/Env C5: "459 649"
+*PaperDimension EnvC6/Env C6: "323 459"
+*PaperDimension EnvDL/Env DL: "311 623"
+*PaperDimension EnvMonarch/Env Monarch: "279 540"
+*PaperDimension Executive/Executive: "522 756"
+*PaperDimension Legal/Legal: "612 1008"
+
+*OpenUI *InputSlot/Media Source: PickOne
+*FoomaticRIPOption InputSlot: enum CmdLine A
+*OrderDependency: 150 AnySetup *InputSlot
+*DefaultInputSlot: Auto
+*InputSlot Tray1/Tray 1 (Multipurpose): "%% FoomaticRIPOptionSetting: InputSlot=Tray1"
+*FoomaticRIPOptionSetting InputSlot=Tray1: "-s1 "
+*InputSlot Tray2/Tray 2: "%% FoomaticRIPOptionSetting: InputSlot=Tray2"
+*FoomaticRIPOptionSetting InputSlot=Tray2: "-s4 "
+*InputSlot Auto/Auto Select: "%% FoomaticRIPOptionSetting: InputSlot=Auto"
+*FoomaticRIPOptionSetting InputSlot=Auto: "-s255 "
+*CloseUI: *InputSlot
+
+*OpenUI *MediaType/Media Type: PickOne
+*FoomaticRIPOption MediaType: enum CmdLine A
+*OrderDependency: 150 AnySetup *MediaType
+*DefaultMediaType: plain
+*MediaType plain/Plain Paper: "%% FoomaticRIPOptionSetting: MediaType=plain"
+*FoomaticRIPOptionSetting MediaType=plain: "-m1 "
+*MediaType envelope/Envelope: "%% FoomaticRIPOptionSetting: MediaType=envelope"
+*FoomaticRIPOptionSetting MediaType=envelope: "-m22 "
+*MediaType glossy/Glossy: "%% FoomaticRIPOptionSetting: MediaType=glossy"
+*FoomaticRIPOptionSetting MediaType=glossy: "-m28 "
+*MediaType labels/Labels: "%% FoomaticRIPOptionSetting: MediaType=labels"
+*FoomaticRIPOptionSetting MediaType=labels: "-m26 "
+*MediaType letterhead/Letterhead: "%% FoomaticRIPOptionSetting: MediaType=letterhead"
+*FoomaticRIPOptionSetting MediaType=letterhead: "-m23 "
+*MediaType postcard/Postcard: "%% FoomaticRIPOptionSetting: MediaType=postcard"
+*FoomaticRIPOptionSetting MediaType=postcard: "-m25 "
+*MediaType recycled/Recycled Paper: "%% FoomaticRIPOptionSetting: MediaType=recycled"
+*FoomaticRIPOptionSetting MediaType=recycled: "-m27 "
+*MediaType thick/Thick Stock: "%% FoomaticRIPOptionSetting: MediaType=thick"
+*FoomaticRIPOptionSetting MediaType=thick: "-m20 "
+*MediaType transparency/Transparency: "%% FoomaticRIPOptionSetting: MediaType=transparency"
+*FoomaticRIPOptionSetting MediaType=transparency: "-m4 "
+*CloseUI: *MediaType
+
+*OpenUI *Duplex/Duplex Printing: PickOne
+*FoomaticRIPOption Duplex: enum CmdLine A
+*OrderDependency: 210 AnySetup *Duplex
+*DefaultDuplex: None
+*Duplex DuplexNoTumble/Long Edge (Standard): "%% FoomaticRIPOptionSetting: Duplex=DuplexNoTumble"
+*FoomaticRIPOptionSetting Duplex=DuplexNoTumble: "-d2 "
+*Duplex DuplexTumble/Short Edge (Flip): "%% FoomaticRIPOptionSetting: Duplex=DuplexTumble"
+*FoomaticRIPOptionSetting Duplex=DuplexTumble: "-d3 "
+*Duplex None/Off: "%% FoomaticRIPOptionSetting: Duplex=None"
+*FoomaticRIPOptionSetting Duplex=None: "-d1 "
+*CloseUI: *Duplex
+
+*OpenUI *Resolution/Resolution: PickOne
+*FoomaticRIPOption Resolution: enum CmdLine A
+*OrderDependency: 130 AnySetup *Resolution
+*DefaultResolution: 1200x600dpi
+*Resolution 600x600dpi/600x600 dpi: "%% FoomaticRIPOptionSetting: Resolution=600x600dpi"
+*FoomaticRIPOptionSetting Resolution=600x600dpi: "-r600x600 "
+*Resolution 1200x600dpi/1200x600 dpi: "%% FoomaticRIPOptionSetting: Resolution=1200x600dpi"
+*FoomaticRIPOptionSetting Resolution=1200x600dpi: "-r1200x600 "
+*Resolution 2400x600dpi/2400x600 dpi: "%% FoomaticRIPOptionSetting: Resolution=2400x600dpi"
+*FoomaticRIPOptionSetting Resolution=2400x600dpi: "-r2400x600 "
+*CloseUI: *Resolution
+
+*OpenUI *Quality/Printing Quality: PickOne
+*FoomaticRIPOption Quality: enum CmdLine A
+*OrderDependency: 110 AnySetup *Quality
+*DefaultQuality: normal
+*Quality draft/Draft: "%% FoomaticRIPOptionSetting: Quality=draft"
+*FoomaticRIPOptionSetting Quality=draft: " -t "
+*Quality normal/Normal: "%% FoomaticRIPOptionSetting: Quality=normal"
+*FoomaticRIPOptionSetting Quality=normal: " "
+*CloseUI: *Quality
+
+*OpenUI *ColorMode/Color Mode: PickOne
+*FoomaticRIPOption ColorMode: enum CmdLine A
+*OrderDependency: 120 AnySetup *ColorMode
+*DefaultColorMode: Monochrome
+*ColorMode Color/Color: "%% FoomaticRIPOptionSetting: ColorMode=Color"
+*FoomaticRIPOptionSetting ColorMode=Color: "-c "
+*ColorMode Monochrome/Monochrome: "%% FoomaticRIPOptionSetting: ColorMode=Monochrome"
+*FoomaticRIPOptionSetting ColorMode=Monochrome: " "
+*CloseUI: *ColorMode
+
+*OpenUI *Copies/Copies: PickOne
+*FoomaticRIPOption Copies: int CmdLine A
+*FoomaticRIPOptionPrototype Copies: "-n%s "
+*FoomaticRIPOptionRange Copies: 1 100
+*OrderDependency: 220 AnySetup *Copies
+*DefaultCopies: 1
+*FoomaticRIPDefaultCopies: 1
+*Copies 1/1: "%% FoomaticRIPOptionSetting: Copies=1"
+*Copies 2/2: "%% FoomaticRIPOptionSetting: Copies=2"
+*Copies 3/3: "%% FoomaticRIPOptionSetting: Copies=3"
+*Copies 4/4: "%% FoomaticRIPOptionSetting: Copies=4"
+*Copies 5/5: "%% FoomaticRIPOptionSetting: Copies=5"
+*Copies 6/6: "%% FoomaticRIPOptionSetting: Copies=6"
+*Copies 7/7: "%% FoomaticRIPOptionSetting: Copies=7"
+*Copies 8/8: "%% FoomaticRIPOptionSetting: Copies=8"
+*Copies 9/9: "%% FoomaticRIPOptionSetting: Copies=9"
+*Copies 10/10: "%% FoomaticRIPOptionSetting: Copies=10"
+*Copies 11/11: "%% FoomaticRIPOptionSetting: Copies=11"
+*Copies 12/12: "%% FoomaticRIPOptionSetting: Copies=12"
+*Copies 13/13: "%% FoomaticRIPOptionSetting: Copies=13"
+*Copies 14/14: "%% FoomaticRIPOptionSetting: Copies=14"
+*Copies 15/15: "%% FoomaticRIPOptionSetting: Copies=15"
+*Copies 16/16: "%% FoomaticRIPOptionSetting: Copies=16"
+*Copies 17/17: "%% FoomaticRIPOptionSetting: Copies=17"
+*Copies 18/18: "%% FoomaticRIPOptionSetting: Copies=18"
+*Copies 19/19: "%% FoomaticRIPOptionSetting: Copies=19"
+*Copies 20/20: "%% FoomaticRIPOptionSetting: Copies=20"
+*Copies 21/21: "%% FoomaticRIPOptionSetting: Copies=21"
+*Copies 22/22: "%% FoomaticRIPOptionSetting: Copies=22"
+*Copies 23/23: "%% FoomaticRIPOptionSetting: Copies=23"
+*Copies 24/24: "%% FoomaticRIPOptionSetting: Copies=24"
+*Copies 25/25: "%% FoomaticRIPOptionSetting: Copies=25"
+*Copies 26/26: "%% FoomaticRIPOptionSetting: Copies=26"
+*Copies 27/27: "%% FoomaticRIPOptionSetting: Copies=27"
+*Copies 28/28: "%% FoomaticRIPOptionSetting: Copies=28"
+*Copies 29/29: "%% FoomaticRIPOptionSetting: Copies=29"
+*Copies 30/30: "%% FoomaticRIPOptionSetting: Copies=30"
+*Copies 31/31: "%% FoomaticRIPOptionSetting: Copies=31"
+*Copies 32/32: "%% FoomaticRIPOptionSetting: Copies=32"
+*Copies 33/33: "%% FoomaticRIPOptionSetting: Copies=33"
+*Copies 34/34: "%% FoomaticRIPOptionSetting: Copies=34"
+*Copies 35/35: "%% FoomaticRIPOptionSetting: Copies=35"
+*Copies 36/36: "%% FoomaticRIPOptionSetting: Copies=36"
+*Copies 37/37: "%% FoomaticRIPOptionSetting: Copies=37"
+*Copies 38/38: "%% FoomaticRIPOptionSetting: Copies=38"
+*Copies 39/39: "%% FoomaticRIPOptionSetting: Copies=39"
+*Copies 40/40: "%% FoomaticRIPOptionSetting: Copies=40"
+*Copies 41/41: "%% FoomaticRIPOptionSetting: Copies=41"
+*Copies 42/42: "%% FoomaticRIPOptionSetting: Copies=42"
+*Copies 43/43: "%% FoomaticRIPOptionSetting: Copies=43"
+*Copies 44/44: "%% FoomaticRIPOptionSetting: Copies=44"
+*Copies 45/45: "%% FoomaticRIPOptionSetting: Copies=45"
+*Copies 46/46: "%% FoomaticRIPOptionSetting: Copies=46"
+*Copies 47/47: "%% FoomaticRIPOptionSetting: Copies=47"
+*Copies 48/48: "%% FoomaticRIPOptionSetting: Copies=48"
+*Copies 49/49: "%% FoomaticRIPOptionSetting: Copies=49"
+*Copies 50/50: "%% FoomaticRIPOptionSetting: Copies=50"
+*Copies 51/51: "%% FoomaticRIPOptionSetting: Copies=51"
+*Copies 52/52: "%% FoomaticRIPOptionSetting: Copies=52"
+*Copies 53/53: "%% FoomaticRIPOptionSetting: Copies=53"
+*Copies 54/54: "%% FoomaticRIPOptionSetting: Copies=54"
+*Copies 55/55: "%% FoomaticRIPOptionSetting: Copies=55"
+*Copies 56/56: "%% FoomaticRIPOptionSetting: Copies=56"
+*Copies 57/57: "%% FoomaticRIPOptionSetting: Copies=57"
+*Copies 58/58: "%% FoomaticRIPOptionSetting: Copies=58"
+*Copies 59/59: "%% FoomaticRIPOptionSetting: Copies=59"
+*Copies 60/60: "%% FoomaticRIPOptionSetting: Copies=60"
+*Copies 61/61: "%% FoomaticRIPOptionSetting: Copies=61"
+*Copies 62/62: "%% FoomaticRIPOptionSetting: Copies=62"
+*Copies 63/63: "%% FoomaticRIPOptionSetting: Copies=63"
+*Copies 64/64: "%% FoomaticRIPOptionSetting: Copies=64"
+*Copies 65/65: "%% FoomaticRIPOptionSetting: Copies=65"
+*Copies 66/66: "%% FoomaticRIPOptionSetting: Copies=66"
+*Copies 67/67: "%% FoomaticRIPOptionSetting: Copies=67"
+*Copies 68/68: "%% FoomaticRIPOptionSetting: Copies=68"
+*Copies 69/69: "%% FoomaticRIPOptionSetting: Copies=69"
+*Copies 70/70: "%% FoomaticRIPOptionSetting: Copies=70"
+*Copies 71/71: "%% FoomaticRIPOptionSetting: Copies=71"
+*Copies 72/72: "%% FoomaticRIPOptionSetting: Copies=72"
+*Copies 73/73: "%% FoomaticRIPOptionSetting: Copies=73"
+*Copies 74/74: "%% FoomaticRIPOptionSetting: Copies=74"
+*Copies 75/75: "%% FoomaticRIPOptionSetting: Copies=75"
+*Copies 76/76: "%% FoomaticRIPOptionSetting: Copies=76"
+*Copies 77/77: "%% FoomaticRIPOptionSetting: Copies=77"
+*Copies 78/78: "%% FoomaticRIPOptionSetting: Copies=78"
+*Copies 79/79: "%% FoomaticRIPOptionSetting: Copies=79"
+*Copies 80/80: "%% FoomaticRIPOptionSetting: Copies=80"
+*Copies 81/81: "%% FoomaticRIPOptionSetting: Copies=81"
+*Copies 82/82: "%% FoomaticRIPOptionSetting: Copies=82"
+*Copies 83/83: "%% FoomaticRIPOptionSetting: Copies=83"
+*Copies 84/84: "%% FoomaticRIPOptionSetting: Copies=84"
+*Copies 85/85: "%% FoomaticRIPOptionSetting: Copies=85"
+*Copies 86/86: "%% FoomaticRIPOptionSetting: Copies=86"
+*Copies 87/87: "%% FoomaticRIPOptionSetting: Copies=87"
+*Copies 88/88: "%% FoomaticRIPOptionSetting: Copies=88"
+*Copies 89/89: "%% FoomaticRIPOptionSetting: Copies=89"
+*Copies 90/90: "%% FoomaticRIPOptionSetting: Copies=90"
+*Copies 91/91: "%% FoomaticRIPOptionSetting: Copies=91"
+*Copies 92/92: "%% FoomaticRIPOptionSetting: Copies=92"
+*Copies 93/93: "%% FoomaticRIPOptionSetting: Copies=93"
+*Copies 94/94: "%% FoomaticRIPOptionSetting: Copies=94"
+*Copies 95/95: "%% FoomaticRIPOptionSetting: Copies=95"
+*Copies 96/96: "%% FoomaticRIPOptionSetting: Copies=96"
+*Copies 97/97: "%% FoomaticRIPOptionSetting: Copies=97"
+*Copies 98/98: "%% FoomaticRIPOptionSetting: Copies=98"
+*Copies 99/99: "%% FoomaticRIPOptionSetting: Copies=99"
+*Copies 100/100: "%% FoomaticRIPOptionSetting: Copies=100"
+*CloseUI: *Copies
+
+*CloseGroup: General
+
+*OpenGroup: Miscellaneous/Miscellaneous
+
+*OpenUI *Nup/N-up Printing: PickOne
+*FoomaticRIPOption Nup: enum CmdLine A
+*OrderDependency: 200 AnySetup *Nup
+*DefaultNup: 1up
+*Nup 1up/1-up: "%% FoomaticRIPOptionSetting: Nup=1up"
+*FoomaticRIPOptionSetting Nup=1up: " "
+*Nup 2up/2-up: "%% FoomaticRIPOptionSetting: Nup=2up"
+*FoomaticRIPOptionSetting Nup=2up: "-2 "
+*Nup 3up/3-up: "%% FoomaticRIPOptionSetting: Nup=3up"
+*FoomaticRIPOptionSetting Nup=3up: "-3 "
+*Nup 4up/4-up: "%% FoomaticRIPOptionSetting: Nup=4up"
+*FoomaticRIPOptionSetting Nup=4up: "-4 "
+*Nup 6up/6-up: "%% FoomaticRIPOptionSetting: Nup=6up"
+*FoomaticRIPOptionSetting Nup=6up: "-6 "
+*Nup 8up/8-up: "%% FoomaticRIPOptionSetting: Nup=8up"
+*FoomaticRIPOptionSetting Nup=8up: "-8 "
+*Nup 10up/10-up: "%% FoomaticRIPOptionSetting: Nup=10up"
+*FoomaticRIPOptionSetting Nup=10up: "-10 "
+*Nup 12up/12-up: "%% FoomaticRIPOptionSetting: Nup=12up"
+*FoomaticRIPOptionSetting Nup=12up: "-12 "
+*Nup 14up/14-up: "%% FoomaticRIPOptionSetting: Nup=14up"
+*FoomaticRIPOptionSetting Nup=14up: "-14 "
+*Nup 15up/15-up: "%% FoomaticRIPOptionSetting: Nup=15up"
+*FoomaticRIPOptionSetting Nup=15up: "-15 "
+*Nup 16up/16-up: "%% FoomaticRIPOptionSetting: Nup=16up"
+*FoomaticRIPOptionSetting Nup=16up: "-16 "
+*Nup 18up/18-up: "%% FoomaticRIPOptionSetting: Nup=18up"
+*FoomaticRIPOptionSetting Nup=18up: "-18 "
+*CloseUI: *Nup
+
+*OpenUI *NupOrient/N-up Orientation: PickOne
+*FoomaticRIPOption NupOrient: enum CmdLine A
+*OrderDependency: 200 AnySetup *NupOrient
+*DefaultNupOrient: port
+*NupOrient land/Landscape: "%% FoomaticRIPOptionSetting: NupOrient=land"
+*FoomaticRIPOptionSetting NupOrient=land: "-ol "
+*NupOrient port/Portrait: "%% FoomaticRIPOptionSetting: NupOrient=port"
+*FoomaticRIPOptionSetting NupOrient=port: " "
+*NupOrient sea/Seascape: "%% FoomaticRIPOptionSetting: NupOrient=sea"
+*FoomaticRIPOptionSetting NupOrient=sea: "-os "
+*CloseUI: *NupOrient
+
+*CloseGroup: Miscellaneous
+
+
+*% Generic boilerplate PPD stuff as standard PostScript fonts and so on
+
+*DefaultFont: Courier
+*Font AvantGarde-Book: Standard "(001.006S)" Standard ROM
+*Font AvantGarde-BookOblique: Standard "(001.006S)" Standard ROM
+*Font AvantGarde-Demi: Standard "(001.007S)" Standard ROM
+*Font AvantGarde-DemiOblique: Standard "(001.007S)" Standard ROM
+*Font Bookman-Demi: Standard "(001.004S)" Standard ROM
+*Font Bookman-DemiItalic: Standard "(001.004S)" Standard ROM
+*Font Bookman-Light: Standard "(001.004S)" Standard ROM
+*Font Bookman-LightItalic: Standard "(001.004S)" Standard ROM
+*Font Courier: Standard "(002.004S)" Standard ROM
+*Font Courier-Bold: Standard "(002.004S)" Standard ROM
+*Font Courier-BoldOblique: Standard "(002.004S)" Standard ROM
+*Font Courier-Oblique: Standard "(002.004S)" Standard ROM
+*Font Helvetica: Standard "(001.006S)" Standard ROM
+*Font Helvetica-Bold: Standard "(001.007S)" Standard ROM
+*Font Helvetica-BoldOblique: Standard "(001.007S)" Standard ROM
+*Font Helvetica-Narrow: Standard "(001.006S)" Standard ROM
+*Font Helvetica-Narrow-Bold: Standard "(001.007S)" Standard ROM
+*Font Helvetica-Narrow-BoldOblique: Standard "(001.007S)" Standard ROM
+*Font Helvetica-Narrow-Oblique: Standard "(001.006S)" Standard ROM
+*Font Helvetica-Oblique: Standard "(001.006S)" Standard ROM
+*Font NewCenturySchlbk-Bold: Standard "(001.009S)" Standard ROM
+*Font NewCenturySchlbk-BoldItalic: Standard "(001.007S)" Standard ROM
+*Font NewCenturySchlbk-Italic: Standard "(001.006S)" Standard ROM
+*Font NewCenturySchlbk-Roman: Standard "(001.007S)" Standard ROM
+*Font Palatino-Bold: Standard "(001.005S)" Standard ROM
+*Font Palatino-BoldItalic: Standard "(001.005S)" Standard ROM
+*Font Palatino-Italic: Standard "(001.005S)" Standard ROM
+*Font Palatino-Roman: Standard "(001.005S)" Standard ROM
+*Font Symbol: Special "(001.007S)" Special ROM
+*Font Times-Bold: Standard "(001.007S)" Standard ROM
+*Font Times-BoldItalic: Standard "(001.009S)" Standard ROM
+*Font Times-Italic: Standard "(001.007S)" Standard ROM
+*Font Times-Roman: Standard "(001.007S)" Standard ROM
+*Font ZapfChancery-MediumItalic: Standard "(001.007S)" Standard ROM
+*Font ZapfDingbats: Special "(001.004S)" Standard ROM
+
diff --git a/PPD/Minolta-Color_PageWorks_Pro_L.ppd b/PPD/Minolta-Color_PageWorks_Pro_L.ppd
new file mode 100644
index 0000000..af6cacb
--- /dev/null
+++ b/PPD/Minolta-Color_PageWorks_Pro_L.ppd
@@ -0,0 +1,464 @@
+*PPD-Adobe: "4.3"
+*%
+*% For information on using this, and to obtain the required backend
+*% script, consult http://www.linuxprinting.org/
+*%
+*% This file is published under the GNU General Public License
+*%
+*% PPD-O-MATIC (3.0.0 or newer) generated this PPD file. It is for use with
+*% all programs and environments which use PPD files for dealing with
+*% printer capability information. The printer must be configured with the
+*% "foomatic-rip" backend filter script of Foomatic 3.0.0 or newer. This
+*% file and "foomatic-rip" work together to support PPD-controlled printer
+*% driver option access with arbitrary free software printer drivers and
+*% printing spoolers.
+*%
+*% To save this file on your disk, wait until the download has completed
+*% (the animation of the browser logo must stop) and then use the
+*% "Save as..." command in the "File" menu of your browser or in the
+*% pop-up manu when you click on this document with the right mouse button.
+*% DO NOT cut and paste this file into an editor with your mouse. This can
+*% introduce additional line breaks which lead to unexpected results.
+*%
+*% You may save this file as 'Minolta-Color_PageWorks_Pro_L-foo2zjs.ppd'
+*%
+*%
+*FormatVersion: "4.3"
+*FileVersion: "1.1"
+*LanguageVersion: English
+*LanguageEncoding: ISOLatin1
+*PCFileName: "FOO2ZJS.PPD"
+*Manufacturer: "Minolta"
+*Product: "(Color PageWorks/Pro L)"
+*cupsVersion: 1.0
+*cupsManualCopies: True
+*cupsModelNumber: 2
+*cupsFilter: "application/vnd.cups-postscript 0 foomatic-rip"
+*%pprRIP: foomatic-rip other
+*ModelName: "Minolta Color PageWorks/Pro L"
+*ShortNickName: "Minolta C. P.Wor./Pro L foo2zjs"
+*NickName: "Minolta Color PageWorks/Pro L Foomatic/foo2zjs (recommended)"
+*PSVersion: "(3010.000) 550"
+*PSVersion: "(3010.000) 651"
+*PSVersion: "(3010.000) 652"
+*PSVersion: "(3010.000) 653"
+*PSVersion: "(3010.000) 704"
+*PSVersion: "(3010.000) 705"
+*PSVersion: "(3010.000) 800"
+*LanguageLevel: "3"
+*ColorDevice: True
+*DefaultColorSpace: RGB
+*FileSystem: False
+*Throughput: "1"
+*LandscapeOrientation: Plus90
+*TTRasterizer: Type42
+
+
+
+
+*VariablePaperSize: False
+
+*FoomaticIDs: Minolta-Color_PageWorks_Pro_L foo2zjs
+*FoomaticRIPCommandLine: "foo2zjs-wrapper %A"
+
+*OpenGroup: General/General
+
+*OpenUI *PageSize/Page Size: PickOne
+*FoomaticRIPOption PageSize: enum CmdLine A
+*OrderDependency: 135 AnySetup *PageSize
+*DefaultPageSize: Letter
+*PageSize Letter/Letter: "%% FoomaticRIPOptionSetting: PageSize=Letter"
+*FoomaticRIPOptionSetting PageSize=Letter: "-p1 "
+*PageSize A4/A4: "%% FoomaticRIPOptionSetting: PageSize=A4"
+*FoomaticRIPOptionSetting PageSize=A4: "-p9 "
+*PageSize A5/A5: "%% FoomaticRIPOptionSetting: PageSize=A5"
+*FoomaticRIPOptionSetting PageSize=A5: "-p11 "
+*PageSize B5/B5: "%% FoomaticRIPOptionSetting: PageSize=B5"
+*FoomaticRIPOptionSetting PageSize=B5: "-p13 "
+*PageSize Env10/Env #10: "%% FoomaticRIPOptionSetting: PageSize=Env10"
+*FoomaticRIPOptionSetting PageSize=Env10: "-p20 "
+*PageSize EnvB5/Env B5: "%% FoomaticRIPOptionSetting: PageSize=EnvB5"
+*FoomaticRIPOptionSetting PageSize=EnvB5: "-p34 "
+*PageSize EnvC5/Env C5: "%% FoomaticRIPOptionSetting: PageSize=EnvC5"
+*FoomaticRIPOptionSetting PageSize=EnvC5: "-p28 "
+*PageSize EnvDL/Env DL: "%% FoomaticRIPOptionSetting: PageSize=EnvDL"
+*FoomaticRIPOptionSetting PageSize=EnvDL: "-p27 "
+*PageSize EnvMonarch/Env Monarch: "%% FoomaticRIPOptionSetting: PageSize=EnvMonarch"
+*FoomaticRIPOptionSetting PageSize=EnvMonarch: "-p37 "
+*PageSize Executive/Executive: "%% FoomaticRIPOptionSetting: PageSize=Executive"
+*FoomaticRIPOptionSetting PageSize=Executive: "-p7 "
+*PageSize Legal/Legal: "%% FoomaticRIPOptionSetting: PageSize=Legal"
+*FoomaticRIPOptionSetting PageSize=Legal: "-p5 "
+*CloseUI: *PageSize
+
+*OpenUI *PageRegion: PickOne
+*OrderDependency: 135 AnySetup *PageRegion
+*DefaultPageRegion: Letter
+*PageRegion Letter/Letter: "%% FoomaticRIPOptionSetting: PageSize=Letter"
+*PageRegion A4/A4: "%% FoomaticRIPOptionSetting: PageSize=A4"
+*PageRegion A5/A5: "%% FoomaticRIPOptionSetting: PageSize=A5"
+*PageRegion B5/B5: "%% FoomaticRIPOptionSetting: PageSize=B5"
+*PageRegion Env10/Env #10: "%% FoomaticRIPOptionSetting: PageSize=Env10"
+*PageRegion EnvB5/Env B5: "%% FoomaticRIPOptionSetting: PageSize=EnvB5"
+*PageRegion EnvC5/Env C5: "%% FoomaticRIPOptionSetting: PageSize=EnvC5"
+*PageRegion EnvDL/Env DL: "%% FoomaticRIPOptionSetting: PageSize=EnvDL"
+*PageRegion EnvMonarch/Env Monarch: "%% FoomaticRIPOptionSetting: PageSize=EnvMonarch"
+*PageRegion Executive/Executive: "%% FoomaticRIPOptionSetting: PageSize=Executive"
+*PageRegion Legal/Legal: "%% FoomaticRIPOptionSetting: PageSize=Legal"
+*CloseUI: *PageRegion
+
+*DefaultImageableArea: Letter
+*ImageableArea Letter/Letter: "11.34 11.34 600.66 780.66"
+*ImageableArea A4/A4: "11.34 11.34 583.66 830.66"
+*ImageableArea A5/A5: "11.34 11.34 408.66 583.66"
+*ImageableArea B5/B5: "11.34 11.34 486.66 696.66"
+*ImageableArea Env10/Env #10: "11.34 11.34 285.66 672.66"
+*ImageableArea EnvB5/Env B5: "11.34 11.34 486.66 696.66"
+*ImageableArea EnvC5/Env C5: "11.34 11.34 447.66 637.66"
+*ImageableArea EnvDL/Env DL: "11.34 11.34 299.66 611.66"
+*ImageableArea EnvMonarch/Env Monarch: "11.34 11.34 267.66 528.66"
+*ImageableArea Executive/Executive: "11.34 11.34 510.66 744.66"
+*ImageableArea Legal/Legal: "11.34 11.34 600.66 996.66"
+
+*DefaultPaperDimension: Letter
+*PaperDimension Letter/Letter: "612 792"
+*PaperDimension A4/A4: "595 842"
+*PaperDimension A5/A5: "420 595"
+*PaperDimension B5/B5: "498 708"
+*PaperDimension Env10/Env #10: "297 684"
+*PaperDimension EnvB5/Env B5: "498 708"
+*PaperDimension EnvC5/Env C5: "459 649"
+*PaperDimension EnvDL/Env DL: "311 623"
+*PaperDimension EnvMonarch/Env Monarch: "279 540"
+*PaperDimension Executive/Executive: "522 756"
+*PaperDimension Legal/Legal: "612 1008"
+
+*OpenUI *InputSlot/Media Source: PickOne
+*FoomaticRIPOption InputSlot: enum CmdLine A
+*OrderDependency: 150 AnySetup *InputSlot
+*DefaultInputSlot: Auto
+*InputSlot Tray1/Tray 1: "%% FoomaticRIPOptionSetting: InputSlot=Tray1"
+*FoomaticRIPOptionSetting InputSlot=Tray1: "-s1 "
+*InputSlot Tray2/Tray 2: "%% FoomaticRIPOptionSetting: InputSlot=Tray2"
+*FoomaticRIPOptionSetting InputSlot=Tray2: "-s3 "
+*InputSlot Auto/Auto Source: "%% FoomaticRIPOptionSetting: InputSlot=Auto"
+*FoomaticRIPOptionSetting InputSlot=Auto: "-s7 "
+*InputSlot Manual/Manual Feed: "%% FoomaticRIPOptionSetting: InputSlot=Manual"
+*FoomaticRIPOptionSetting InputSlot=Manual: "-s4 "
+*CloseUI: *InputSlot
+
+*OpenUI *MediaType/Media Type: PickOne
+*FoomaticRIPOption MediaType: enum CmdLine A
+*OrderDependency: 150 AnySetup *MediaType
+*DefaultMediaType: Standard
+*MediaType Envelope/Envelope: "%% FoomaticRIPOptionSetting: MediaType=Envelope"
+*FoomaticRIPOptionSetting MediaType=Envelope: "-m257 "
+*MediaType Labels/Labels: "%% FoomaticRIPOptionSetting: MediaType=Labels"
+*FoomaticRIPOptionSetting MediaType=Labels: "-m263 "
+*MediaType Letterhead/Letterhead: "%% FoomaticRIPOptionSetting: MediaType=Letterhead"
+*FoomaticRIPOptionSetting MediaType=Letterhead: "-m259 "
+*MediaType Postcard/Postcard: "%% FoomaticRIPOptionSetting: MediaType=Postcard"
+*FoomaticRIPOptionSetting MediaType=Postcard: "-m262 "
+*MediaType Standard/Standard Paper: "%% FoomaticRIPOptionSetting: MediaType=Standard"
+*FoomaticRIPOptionSetting MediaType=Standard: "-m1 "
+*MediaType ThickStock/Thick Stock: "%% FoomaticRIPOptionSetting: MediaType=ThickStock"
+*FoomaticRIPOptionSetting MediaType=ThickStock: "-m261 "
+*MediaType Transparency/Transparency: "%% FoomaticRIPOptionSetting: MediaType=Transparency"
+*FoomaticRIPOptionSetting MediaType=Transparency: "-m2 "
+*CloseUI: *MediaType
+
+*OpenUI *Duplex/Duplex Printing: PickOne
+*FoomaticRIPOption Duplex: enum CmdLine A
+*OrderDependency: 210 AnySetup *Duplex
+*DefaultDuplex: None
+*Duplex DuplexNoTumble/Long Edge (Standard): "%% FoomaticRIPOptionSetting: Duplex=DuplexNoTumble"
+*FoomaticRIPOptionSetting Duplex=DuplexNoTumble: "-d2 "
+*Duplex DuplexTumble/Short Edge (Flip): "%% FoomaticRIPOptionSetting: Duplex=DuplexTumble"
+*FoomaticRIPOptionSetting Duplex=DuplexTumble: "-d3 "
+*Duplex ManualDuplexNoTumble/Manual Long Edge (Standard): "%% FoomaticRIPOptionSetting: Duplex=ManualDuplexNoTumble"
+*FoomaticRIPOptionSetting Duplex=ManualDuplexNoTumble: "-d4 "
+*Duplex ManualDuplexTumble/Manual Short Edge (Flip): "%% FoomaticRIPOptionSetting: Duplex=ManualDuplexTumble"
+*FoomaticRIPOptionSetting Duplex=ManualDuplexTumble: "-d5 "
+*Duplex None/Off: "%% FoomaticRIPOptionSetting: Duplex=None"
+*FoomaticRIPOptionSetting Duplex=None: "-d1 "
+*CloseUI: *Duplex
+
+*OpenUI *Resolution/Resolution: PickOne
+*FoomaticRIPOption Resolution: enum CmdLine A
+*OrderDependency: 130 AnySetup *Resolution
+*DefaultResolution: 1200x600dpi
+*Resolution 600x600dpi/600x600 dpi: "%% FoomaticRIPOptionSetting: Resolution=600x600dpi"
+*FoomaticRIPOptionSetting Resolution=600x600dpi: "-r600x600 "
+*Resolution 1200x600dpi/1200x600 dpi: "%% FoomaticRIPOptionSetting: Resolution=1200x600dpi"
+*FoomaticRIPOptionSetting Resolution=1200x600dpi: "-r1200x600 "
+*Resolution 2400x600dpi/2400x600 dpi: "%% FoomaticRIPOptionSetting: Resolution=2400x600dpi"
+*FoomaticRIPOptionSetting Resolution=2400x600dpi: "-r2400x600 "
+*CloseUI: *Resolution
+
+*OpenUI *Quality/Printing Quality: PickOne
+*FoomaticRIPOption Quality: enum CmdLine A
+*OrderDependency: 110 AnySetup *Quality
+*DefaultQuality: normal
+*Quality draft/Draft: "%% FoomaticRIPOptionSetting: Quality=draft"
+*FoomaticRIPOptionSetting Quality=draft: " -t "
+*Quality normal/Normal: "%% FoomaticRIPOptionSetting: Quality=normal"
+*FoomaticRIPOptionSetting Quality=normal: " "
+*CloseUI: *Quality
+
+*OpenUI *ColorMode/Color Mode: PickOne
+*FoomaticRIPOption ColorMode: enum CmdLine A
+*OrderDependency: 120 AnySetup *ColorMode
+*DefaultColorMode: Monochrome
+*ColorMode PhotoOnly/Color - Photo Only: "%% FoomaticRIPOptionSetting: ColorMode=PhotoOnly"
+*FoomaticRIPOptionSetting ColorMode=PhotoOnly: "-c -C1 "
+*ColorMode PhotosAndText/Color - Photos and Text: "%% FoomaticRIPOptionSetting: ColorMode=PhotosAndText"
+*FoomaticRIPOptionSetting ColorMode=PhotosAndText: "-c -C2 "
+*ColorMode Color/Color: "%% FoomaticRIPOptionSetting: ColorMode=Color"
+*FoomaticRIPOptionSetting ColorMode=Color: "-c "
+*ColorMode GraphicsAndText/Color - Graphics and Text: "%% FoomaticRIPOptionSetting: ColorMode=GraphicsAndText"
+*FoomaticRIPOptionSetting ColorMode=GraphicsAndText: "-c -C3 "
+*ColorMode ICM/Color - use ICM color profile: "%% FoomaticRIPOptionSetting: ColorMode=ICM"
+*FoomaticRIPOptionSetting ColorMode=ICM: "-c -C10 "
+*ColorMode Monochrome/Monochrome: "%% FoomaticRIPOptionSetting: ColorMode=Monochrome"
+*FoomaticRIPOptionSetting ColorMode=Monochrome: " "
+*CloseUI: *ColorMode
+
+*OpenUI *Copies/Copies: PickOne
+*FoomaticRIPOption Copies: int CmdLine A
+*FoomaticRIPOptionPrototype Copies: "-n%s "
+*FoomaticRIPOptionRange Copies: 1 100
+*OrderDependency: 220 AnySetup *Copies
+*DefaultCopies: 1
+*FoomaticRIPDefaultCopies: 1
+*Copies 1/1: "%% FoomaticRIPOptionSetting: Copies=1"
+*Copies 2/2: "%% FoomaticRIPOptionSetting: Copies=2"
+*Copies 3/3: "%% FoomaticRIPOptionSetting: Copies=3"
+*Copies 4/4: "%% FoomaticRIPOptionSetting: Copies=4"
+*Copies 5/5: "%% FoomaticRIPOptionSetting: Copies=5"
+*Copies 6/6: "%% FoomaticRIPOptionSetting: Copies=6"
+*Copies 7/7: "%% FoomaticRIPOptionSetting: Copies=7"
+*Copies 8/8: "%% FoomaticRIPOptionSetting: Copies=8"
+*Copies 9/9: "%% FoomaticRIPOptionSetting: Copies=9"
+*Copies 10/10: "%% FoomaticRIPOptionSetting: Copies=10"
+*Copies 11/11: "%% FoomaticRIPOptionSetting: Copies=11"
+*Copies 12/12: "%% FoomaticRIPOptionSetting: Copies=12"
+*Copies 13/13: "%% FoomaticRIPOptionSetting: Copies=13"
+*Copies 14/14: "%% FoomaticRIPOptionSetting: Copies=14"
+*Copies 15/15: "%% FoomaticRIPOptionSetting: Copies=15"
+*Copies 16/16: "%% FoomaticRIPOptionSetting: Copies=16"
+*Copies 17/17: "%% FoomaticRIPOptionSetting: Copies=17"
+*Copies 18/18: "%% FoomaticRIPOptionSetting: Copies=18"
+*Copies 19/19: "%% FoomaticRIPOptionSetting: Copies=19"
+*Copies 20/20: "%% FoomaticRIPOptionSetting: Copies=20"
+*Copies 21/21: "%% FoomaticRIPOptionSetting: Copies=21"
+*Copies 22/22: "%% FoomaticRIPOptionSetting: Copies=22"
+*Copies 23/23: "%% FoomaticRIPOptionSetting: Copies=23"
+*Copies 24/24: "%% FoomaticRIPOptionSetting: Copies=24"
+*Copies 25/25: "%% FoomaticRIPOptionSetting: Copies=25"
+*Copies 26/26: "%% FoomaticRIPOptionSetting: Copies=26"
+*Copies 27/27: "%% FoomaticRIPOptionSetting: Copies=27"
+*Copies 28/28: "%% FoomaticRIPOptionSetting: Copies=28"
+*Copies 29/29: "%% FoomaticRIPOptionSetting: Copies=29"
+*Copies 30/30: "%% FoomaticRIPOptionSetting: Copies=30"
+*Copies 31/31: "%% FoomaticRIPOptionSetting: Copies=31"
+*Copies 32/32: "%% FoomaticRIPOptionSetting: Copies=32"
+*Copies 33/33: "%% FoomaticRIPOptionSetting: Copies=33"
+*Copies 34/34: "%% FoomaticRIPOptionSetting: Copies=34"
+*Copies 35/35: "%% FoomaticRIPOptionSetting: Copies=35"
+*Copies 36/36: "%% FoomaticRIPOptionSetting: Copies=36"
+*Copies 37/37: "%% FoomaticRIPOptionSetting: Copies=37"
+*Copies 38/38: "%% FoomaticRIPOptionSetting: Copies=38"
+*Copies 39/39: "%% FoomaticRIPOptionSetting: Copies=39"
+*Copies 40/40: "%% FoomaticRIPOptionSetting: Copies=40"
+*Copies 41/41: "%% FoomaticRIPOptionSetting: Copies=41"
+*Copies 42/42: "%% FoomaticRIPOptionSetting: Copies=42"
+*Copies 43/43: "%% FoomaticRIPOptionSetting: Copies=43"
+*Copies 44/44: "%% FoomaticRIPOptionSetting: Copies=44"
+*Copies 45/45: "%% FoomaticRIPOptionSetting: Copies=45"
+*Copies 46/46: "%% FoomaticRIPOptionSetting: Copies=46"
+*Copies 47/47: "%% FoomaticRIPOptionSetting: Copies=47"
+*Copies 48/48: "%% FoomaticRIPOptionSetting: Copies=48"
+*Copies 49/49: "%% FoomaticRIPOptionSetting: Copies=49"
+*Copies 50/50: "%% FoomaticRIPOptionSetting: Copies=50"
+*Copies 51/51: "%% FoomaticRIPOptionSetting: Copies=51"
+*Copies 52/52: "%% FoomaticRIPOptionSetting: Copies=52"
+*Copies 53/53: "%% FoomaticRIPOptionSetting: Copies=53"
+*Copies 54/54: "%% FoomaticRIPOptionSetting: Copies=54"
+*Copies 55/55: "%% FoomaticRIPOptionSetting: Copies=55"
+*Copies 56/56: "%% FoomaticRIPOptionSetting: Copies=56"
+*Copies 57/57: "%% FoomaticRIPOptionSetting: Copies=57"
+*Copies 58/58: "%% FoomaticRIPOptionSetting: Copies=58"
+*Copies 59/59: "%% FoomaticRIPOptionSetting: Copies=59"
+*Copies 60/60: "%% FoomaticRIPOptionSetting: Copies=60"
+*Copies 61/61: "%% FoomaticRIPOptionSetting: Copies=61"
+*Copies 62/62: "%% FoomaticRIPOptionSetting: Copies=62"
+*Copies 63/63: "%% FoomaticRIPOptionSetting: Copies=63"
+*Copies 64/64: "%% FoomaticRIPOptionSetting: Copies=64"
+*Copies 65/65: "%% FoomaticRIPOptionSetting: Copies=65"
+*Copies 66/66: "%% FoomaticRIPOptionSetting: Copies=66"
+*Copies 67/67: "%% FoomaticRIPOptionSetting: Copies=67"
+*Copies 68/68: "%% FoomaticRIPOptionSetting: Copies=68"
+*Copies 69/69: "%% FoomaticRIPOptionSetting: Copies=69"
+*Copies 70/70: "%% FoomaticRIPOptionSetting: Copies=70"
+*Copies 71/71: "%% FoomaticRIPOptionSetting: Copies=71"
+*Copies 72/72: "%% FoomaticRIPOptionSetting: Copies=72"
+*Copies 73/73: "%% FoomaticRIPOptionSetting: Copies=73"
+*Copies 74/74: "%% FoomaticRIPOptionSetting: Copies=74"
+*Copies 75/75: "%% FoomaticRIPOptionSetting: Copies=75"
+*Copies 76/76: "%% FoomaticRIPOptionSetting: Copies=76"
+*Copies 77/77: "%% FoomaticRIPOptionSetting: Copies=77"
+*Copies 78/78: "%% FoomaticRIPOptionSetting: Copies=78"
+*Copies 79/79: "%% FoomaticRIPOptionSetting: Copies=79"
+*Copies 80/80: "%% FoomaticRIPOptionSetting: Copies=80"
+*Copies 81/81: "%% FoomaticRIPOptionSetting: Copies=81"
+*Copies 82/82: "%% FoomaticRIPOptionSetting: Copies=82"
+*Copies 83/83: "%% FoomaticRIPOptionSetting: Copies=83"
+*Copies 84/84: "%% FoomaticRIPOptionSetting: Copies=84"
+*Copies 85/85: "%% FoomaticRIPOptionSetting: Copies=85"
+*Copies 86/86: "%% FoomaticRIPOptionSetting: Copies=86"
+*Copies 87/87: "%% FoomaticRIPOptionSetting: Copies=87"
+*Copies 88/88: "%% FoomaticRIPOptionSetting: Copies=88"
+*Copies 89/89: "%% FoomaticRIPOptionSetting: Copies=89"
+*Copies 90/90: "%% FoomaticRIPOptionSetting: Copies=90"
+*Copies 91/91: "%% FoomaticRIPOptionSetting: Copies=91"
+*Copies 92/92: "%% FoomaticRIPOptionSetting: Copies=92"
+*Copies 93/93: "%% FoomaticRIPOptionSetting: Copies=93"
+*Copies 94/94: "%% FoomaticRIPOptionSetting: Copies=94"
+*Copies 95/95: "%% FoomaticRIPOptionSetting: Copies=95"
+*Copies 96/96: "%% FoomaticRIPOptionSetting: Copies=96"
+*Copies 97/97: "%% FoomaticRIPOptionSetting: Copies=97"
+*Copies 98/98: "%% FoomaticRIPOptionSetting: Copies=98"
+*Copies 99/99: "%% FoomaticRIPOptionSetting: Copies=99"
+*Copies 100/100: "%% FoomaticRIPOptionSetting: Copies=100"
+*CloseUI: *Copies
+
+*CloseGroup: General
+
+*OpenGroup: Adjustment/Adjustment
+
+*OpenUI *ICM/ICM Color Profile: PickOne
+*FoomaticRIPOption ICM: enum CmdLine A
+*OrderDependency: 300 AnySetup *ICM
+*DefaultICM: none
+*ICM CPWL6W/File CPWL6W.icm: "%% FoomaticRIPOptionSetting: ICM=CPWL6W"
+*FoomaticRIPOptionSetting ICM=CPWL6W: "-GCPWL6W.icm "
+*ICM CPWL12W/File CPWL12W.icm: "%% FoomaticRIPOptionSetting: ICM=CPWL12W"
+*FoomaticRIPOptionSetting ICM=CPWL12W: "-GCPWL12W.icm "
+*ICM CPWL24W/File CPWL24W.icm: "%% FoomaticRIPOptionSetting: ICM=CPWL24W"
+*FoomaticRIPOptionSetting ICM=CPWL24W: "-GCPWL24W.icm "
+*ICM none/No ICM color correction: "%% FoomaticRIPOptionSetting: ICM=none"
+*FoomaticRIPOptionSetting ICM=none: " "
+*ICM testing/File testing.icm: "%% FoomaticRIPOptionSetting: ICM=testing"
+*FoomaticRIPOptionSetting ICM=testing: "-Gtesting.icm "
+*ICM user1/File user1.icm: "%% FoomaticRIPOptionSetting: ICM=user1"
+*FoomaticRIPOptionSetting ICM=user1: "-Guser1.icm "
+*ICM user2/File user2.icm: "%% FoomaticRIPOptionSetting: ICM=user2"
+*FoomaticRIPOptionSetting ICM=user2: "-Guser2.icm "
+*ICM user3/File user3.icm: "%% FoomaticRIPOptionSetting: ICM=user3"
+*FoomaticRIPOptionSetting ICM=user3: "-Guser3.icm "
+*ICM user4/File user4.icm: "%% FoomaticRIPOptionSetting: ICM=user4"
+*FoomaticRIPOptionSetting ICM=user4: "-Guser4.icm "
+*CloseUI: *ICM
+
+*OpenUI *Intent/ICM Color Profile Intent: PickOne
+*FoomaticRIPOption Intent: enum CmdLine A
+*OrderDependency: 310 AnySetup *Intent
+*DefaultIntent: Perceptual
+*Intent Absolute/Absolute Intent: "%% FoomaticRIPOptionSetting: Intent=Absolute"
+*FoomaticRIPOptionSetting Intent=Absolute: "-I3 "
+*Intent Colorimetric/Colorimetric Intent: "%% FoomaticRIPOptionSetting: Intent=Colorimetric"
+*FoomaticRIPOptionSetting Intent=Colorimetric: "-I1 "
+*Intent Perceptual/Perceptual Intent: "%% FoomaticRIPOptionSetting: Intent=Perceptual"
+*FoomaticRIPOptionSetting Intent=Perceptual: "-I0 "
+*Intent Saturation/Saturation Intent: "%% FoomaticRIPOptionSetting: Intent=Saturation"
+*FoomaticRIPOptionSetting Intent=Saturation: "-I2 "
+*CloseUI: *Intent
+
+*CloseGroup: Adjustment
+
+*OpenGroup: Miscellaneous/Miscellaneous
+
+*OpenUI *Nup/N-up Printing: PickOne
+*FoomaticRIPOption Nup: enum CmdLine A
+*OrderDependency: 200 AnySetup *Nup
+*DefaultNup: 1up
+*Nup 1up/1-up: "%% FoomaticRIPOptionSetting: Nup=1up"
+*FoomaticRIPOptionSetting Nup=1up: " "
+*Nup 2up/2-up: "%% FoomaticRIPOptionSetting: Nup=2up"
+*FoomaticRIPOptionSetting Nup=2up: "-2 "
+*Nup 3up/3-up: "%% FoomaticRIPOptionSetting: Nup=3up"
+*FoomaticRIPOptionSetting Nup=3up: "-3 "
+*Nup 4up/4-up: "%% FoomaticRIPOptionSetting: Nup=4up"
+*FoomaticRIPOptionSetting Nup=4up: "-4 "
+*Nup 6up/6-up: "%% FoomaticRIPOptionSetting: Nup=6up"
+*FoomaticRIPOptionSetting Nup=6up: "-6 "
+*Nup 8up/8-up: "%% FoomaticRIPOptionSetting: Nup=8up"
+*FoomaticRIPOptionSetting Nup=8up: "-8 "
+*Nup 10up/10-up: "%% FoomaticRIPOptionSetting: Nup=10up"
+*FoomaticRIPOptionSetting Nup=10up: "-10 "
+*Nup 12up/12-up: "%% FoomaticRIPOptionSetting: Nup=12up"
+*FoomaticRIPOptionSetting Nup=12up: "-12 "
+*Nup 14up/14-up: "%% FoomaticRIPOptionSetting: Nup=14up"
+*FoomaticRIPOptionSetting Nup=14up: "-14 "
+*Nup 15up/15-up: "%% FoomaticRIPOptionSetting: Nup=15up"
+*FoomaticRIPOptionSetting Nup=15up: "-15 "
+*Nup 16up/16-up: "%% FoomaticRIPOptionSetting: Nup=16up"
+*FoomaticRIPOptionSetting Nup=16up: "-16 "
+*Nup 18up/18-up: "%% FoomaticRIPOptionSetting: Nup=18up"
+*FoomaticRIPOptionSetting Nup=18up: "-18 "
+*CloseUI: *Nup
+
+*OpenUI *NupOrient/N-up Orientation: PickOne
+*FoomaticRIPOption NupOrient: enum CmdLine A
+*OrderDependency: 200 AnySetup *NupOrient
+*DefaultNupOrient: port
+*NupOrient land/Landscape: "%% FoomaticRIPOptionSetting: NupOrient=land"
+*FoomaticRIPOptionSetting NupOrient=land: "-ol "
+*NupOrient port/Portrait: "%% FoomaticRIPOptionSetting: NupOrient=port"
+*FoomaticRIPOptionSetting NupOrient=port: " "
+*NupOrient sea/Seascape: "%% FoomaticRIPOptionSetting: NupOrient=sea"
+*FoomaticRIPOptionSetting NupOrient=sea: "-os "
+*CloseUI: *NupOrient
+
+*CloseGroup: Miscellaneous
+
+
+*% Generic boilerplate PPD stuff as standard PostScript fonts and so on
+
+*DefaultFont: Courier
+*Font AvantGarde-Book: Standard "(001.006S)" Standard ROM
+*Font AvantGarde-BookOblique: Standard "(001.006S)" Standard ROM
+*Font AvantGarde-Demi: Standard "(001.007S)" Standard ROM
+*Font AvantGarde-DemiOblique: Standard "(001.007S)" Standard ROM
+*Font Bookman-Demi: Standard "(001.004S)" Standard ROM
+*Font Bookman-DemiItalic: Standard "(001.004S)" Standard ROM
+*Font Bookman-Light: Standard "(001.004S)" Standard ROM
+*Font Bookman-LightItalic: Standard "(001.004S)" Standard ROM
+*Font Courier: Standard "(002.004S)" Standard ROM
+*Font Courier-Bold: Standard "(002.004S)" Standard ROM
+*Font Courier-BoldOblique: Standard "(002.004S)" Standard ROM
+*Font Courier-Oblique: Standard "(002.004S)" Standard ROM
+*Font Helvetica: Standard "(001.006S)" Standard ROM
+*Font Helvetica-Bold: Standard "(001.007S)" Standard ROM
+*Font Helvetica-BoldOblique: Standard "(001.007S)" Standard ROM
+*Font Helvetica-Narrow: Standard "(001.006S)" Standard ROM
+*Font Helvetica-Narrow-Bold: Standard "(001.007S)" Standard ROM
+*Font Helvetica-Narrow-BoldOblique: Standard "(001.007S)" Standard ROM
+*Font Helvetica-Narrow-Oblique: Standard "(001.006S)" Standard ROM
+*Font Helvetica-Oblique: Standard "(001.006S)" Standard ROM
+*Font NewCenturySchlbk-Bold: Standard "(001.009S)" Standard ROM
+*Font NewCenturySchlbk-BoldItalic: Standard "(001.007S)" Standard ROM
+*Font NewCenturySchlbk-Italic: Standard "(001.006S)" Standard ROM
+*Font NewCenturySchlbk-Roman: Standard "(001.007S)" Standard ROM
+*Font Palatino-Bold: Standard "(001.005S)" Standard ROM
+*Font Palatino-BoldItalic: Standard "(001.005S)" Standard ROM
+*Font Palatino-Italic: Standard "(001.005S)" Standard ROM
+*Font Palatino-Roman: Standard "(001.005S)" Standard ROM
+*Font Symbol: Special "(001.007S)" Special ROM
+*Font Times-Bold: Standard "(001.007S)" Standard ROM
+*Font Times-BoldItalic: Standard "(001.009S)" Standard ROM
+*Font Times-Italic: Standard "(001.007S)" Standard ROM
+*Font Times-Roman: Standard "(001.007S)" Standard ROM
+*Font ZapfChancery-MediumItalic: Standard "(001.007S)" Standard ROM
+*Font ZapfDingbats: Special "(001.004S)" Standard ROM
+
diff --git a/PPD/Minolta-magicolor_2200_DL.ppd b/PPD/Minolta-magicolor_2200_DL.ppd
new file mode 100644
index 0000000..6a5f2b4
--- /dev/null
+++ b/PPD/Minolta-magicolor_2200_DL.ppd
@@ -0,0 +1,463 @@
+*PPD-Adobe: "4.3"
+*%
+*% For information on using this, and to obtain the required backend
+*% script, consult http://www.linuxprinting.org/
+*%
+*% This file is published under the GNU General Public License
+*%
+*% PPD-O-MATIC (3.0.0 or newer) generated this PPD file. It is for use with
+*% all programs and environments which use PPD files for dealing with
+*% printer capability information. The printer must be configured with the
+*% "foomatic-rip" backend filter script of Foomatic 3.0.0 or newer. This
+*% file and "foomatic-rip" work together to support PPD-controlled printer
+*% driver option access with arbitrary free software printer drivers and
+*% printing spoolers.
+*%
+*% To save this file on your disk, wait until the download has completed
+*% (the animation of the browser logo must stop) and then use the
+*% "Save as..." command in the "File" menu of your browser or in the
+*% pop-up manu when you click on this document with the right mouse button.
+*% DO NOT cut and paste this file into an editor with your mouse. This can
+*% introduce additional line breaks which lead to unexpected results.
+*%
+*% You may save this file as 'Minolta-magicolor_2200_DL-foo2zjs.ppd'
+*%
+*%
+*FormatVersion: "4.3"
+*FileVersion: "1.1"
+*LanguageVersion: English
+*LanguageEncoding: ISOLatin1
+*PCFileName: "FOO2ZJS.PPD"
+*Manufacturer: "Minolta"
+*Product: "(magicolor 2200 DL)"
+*cupsVersion: 1.0
+*cupsManualCopies: True
+*cupsModelNumber: 2
+*cupsFilter: "application/vnd.cups-postscript 0 foomatic-rip"
+*%pprRIP: foomatic-rip other
+*ModelName: "Minolta magicolor 2200 DL"
+*ShortNickName: "Minolta magico. 2200 DL foo2zjs"
+*NickName: "Minolta magicolor 2200 DL Foomatic/foo2zjs (recommended)"
+*PSVersion: "(3010.000) 550"
+*PSVersion: "(3010.000) 651"
+*PSVersion: "(3010.000) 652"
+*PSVersion: "(3010.000) 653"
+*PSVersion: "(3010.000) 704"
+*PSVersion: "(3010.000) 705"
+*PSVersion: "(3010.000) 800"
+*LanguageLevel: "3"
+*ColorDevice: True
+*DefaultColorSpace: RGB
+*FileSystem: False
+*Throughput: "1"
+*LandscapeOrientation: Plus90
+*TTRasterizer: Type42
+
+
+
+
+*VariablePaperSize: False
+
+*FoomaticIDs: Minolta-magicolor_2200_DL foo2zjs
+*FoomaticRIPCommandLine: "foo2zjs-wrapper %A"
+
+*OpenGroup: General/General
+
+*OpenUI *PageSize/Page Size: PickOne
+*FoomaticRIPOption PageSize: enum CmdLine A
+*OrderDependency: 135 AnySetup *PageSize
+*DefaultPageSize: Letter
+*PageSize Letter/Letter: "%% FoomaticRIPOptionSetting: PageSize=Letter"
+*FoomaticRIPOptionSetting PageSize=Letter: "-p1 "
+*PageSize A4/A4: "%% FoomaticRIPOptionSetting: PageSize=A4"
+*FoomaticRIPOptionSetting PageSize=A4: "-p9 "
+*PageSize A5/A5: "%% FoomaticRIPOptionSetting: PageSize=A5"
+*FoomaticRIPOptionSetting PageSize=A5: "-p11 "
+*PageSize B5/B5: "%% FoomaticRIPOptionSetting: PageSize=B5"
+*FoomaticRIPOptionSetting PageSize=B5: "-p13 "
+*PageSize Env10/Env #10: "%% FoomaticRIPOptionSetting: PageSize=Env10"
+*FoomaticRIPOptionSetting PageSize=Env10: "-p20 "
+*PageSize EnvB5/Env B5: "%% FoomaticRIPOptionSetting: PageSize=EnvB5"
+*FoomaticRIPOptionSetting PageSize=EnvB5: "-p34 "
+*PageSize EnvC5/Env C5: "%% FoomaticRIPOptionSetting: PageSize=EnvC5"
+*FoomaticRIPOptionSetting PageSize=EnvC5: "-p28 "
+*PageSize EnvDL/Env DL: "%% FoomaticRIPOptionSetting: PageSize=EnvDL"
+*FoomaticRIPOptionSetting PageSize=EnvDL: "-p27 "
+*PageSize EnvMonarch/Env Monarch: "%% FoomaticRIPOptionSetting: PageSize=EnvMonarch"
+*FoomaticRIPOptionSetting PageSize=EnvMonarch: "-p37 "
+*PageSize Executive/Executive: "%% FoomaticRIPOptionSetting: PageSize=Executive"
+*FoomaticRIPOptionSetting PageSize=Executive: "-p7 "
+*PageSize Legal/Legal: "%% FoomaticRIPOptionSetting: PageSize=Legal"
+*FoomaticRIPOptionSetting PageSize=Legal: "-p5 "
+*CloseUI: *PageSize
+
+*OpenUI *PageRegion: PickOne
+*OrderDependency: 135 AnySetup *PageRegion
+*DefaultPageRegion: Letter
+*PageRegion Letter/Letter: "%% FoomaticRIPOptionSetting: PageSize=Letter"
+*PageRegion A4/A4: "%% FoomaticRIPOptionSetting: PageSize=A4"
+*PageRegion A5/A5: "%% FoomaticRIPOptionSetting: PageSize=A5"
+*PageRegion B5/B5: "%% FoomaticRIPOptionSetting: PageSize=B5"
+*PageRegion Env10/Env #10: "%% FoomaticRIPOptionSetting: PageSize=Env10"
+*PageRegion EnvB5/Env B5: "%% FoomaticRIPOptionSetting: PageSize=EnvB5"
+*PageRegion EnvC5/Env C5: "%% FoomaticRIPOptionSetting: PageSize=EnvC5"
+*PageRegion EnvDL/Env DL: "%% FoomaticRIPOptionSetting: PageSize=EnvDL"
+*PageRegion EnvMonarch/Env Monarch: "%% FoomaticRIPOptionSetting: PageSize=EnvMonarch"
+*PageRegion Executive/Executive: "%% FoomaticRIPOptionSetting: PageSize=Executive"
+*PageRegion Legal/Legal: "%% FoomaticRIPOptionSetting: PageSize=Legal"
+*CloseUI: *PageRegion
+
+*DefaultImageableArea: Letter
+*ImageableArea Letter/Letter: "11.34 11.34 600.66 780.66"
+*ImageableArea A4/A4: "11.34 11.34 583.66 830.66"
+*ImageableArea A5/A5: "11.34 11.34 408.66 583.66"
+*ImageableArea B5/B5: "11.34 11.34 486.66 696.66"
+*ImageableArea Env10/Env #10: "11.34 11.34 285.66 672.66"
+*ImageableArea EnvB5/Env B5: "11.34 11.34 486.66 696.66"
+*ImageableArea EnvC5/Env C5: "11.34 11.34 447.66 637.66"
+*ImageableArea EnvDL/Env DL: "11.34 11.34 299.66 611.66"
+*ImageableArea EnvMonarch/Env Monarch: "11.34 11.34 267.66 528.66"
+*ImageableArea Executive/Executive: "11.34 11.34 510.66 744.66"
+*ImageableArea Legal/Legal: "11.34 11.34 600.66 996.66"
+
+*DefaultPaperDimension: Letter
+*PaperDimension Letter/Letter: "612 792"
+*PaperDimension A4/A4: "595 842"
+*PaperDimension A5/A5: "420 595"
+*PaperDimension B5/B5: "498 708"
+*PaperDimension Env10/Env #10: "297 684"
+*PaperDimension EnvB5/Env B5: "498 708"
+*PaperDimension EnvC5/Env C5: "459 649"
+*PaperDimension EnvDL/Env DL: "311 623"
+*PaperDimension EnvMonarch/Env Monarch: "279 540"
+*PaperDimension Executive/Executive: "522 756"
+*PaperDimension Legal/Legal: "612 1008"
+
+*OpenUI *InputSlot/Media Source: PickOne
+*FoomaticRIPOption InputSlot: enum CmdLine A
+*OrderDependency: 150 AnySetup *InputSlot
+*DefaultInputSlot: Auto
+*InputSlot Upper/Upper Tray: "%% FoomaticRIPOptionSetting: InputSlot=Upper"
+*FoomaticRIPOptionSetting InputSlot=Upper: "-s2 "
+*InputSlot Lower/Optional Lower Tray: "%% FoomaticRIPOptionSetting: InputSlot=Lower"
+*FoomaticRIPOptionSetting InputSlot=Lower: "-s5 "
+*InputSlot Multipurpose/Multipurpose Tray: "%% FoomaticRIPOptionSetting: InputSlot=Multipurpose"
+*FoomaticRIPOptionSetting InputSlot=Multipurpose: "-s1 "
+*InputSlot Auto/Auto Source: "%% FoomaticRIPOptionSetting: InputSlot=Auto"
+*FoomaticRIPOptionSetting InputSlot=Auto: "-s7 "
+*InputSlot Manual/Manual Feed: "%% FoomaticRIPOptionSetting: InputSlot=Manual"
+*FoomaticRIPOptionSetting InputSlot=Manual: "-s4 "
+*CloseUI: *InputSlot
+
+*OpenUI *MediaType/Media Type: PickOne
+*FoomaticRIPOption MediaType: enum CmdLine A
+*OrderDependency: 150 AnySetup *MediaType
+*DefaultMediaType: Standard
+*MediaType Envelope/Envelope: "%% FoomaticRIPOptionSetting: MediaType=Envelope"
+*FoomaticRIPOptionSetting MediaType=Envelope: "-m257 "
+*MediaType Labels/Labels: "%% FoomaticRIPOptionSetting: MediaType=Labels"
+*FoomaticRIPOptionSetting MediaType=Labels: "-m263 "
+*MediaType Letterhead/Letterhead: "%% FoomaticRIPOptionSetting: MediaType=Letterhead"
+*FoomaticRIPOptionSetting MediaType=Letterhead: "-m259 "
+*MediaType Postcard/Postcard: "%% FoomaticRIPOptionSetting: MediaType=Postcard"
+*FoomaticRIPOptionSetting MediaType=Postcard: "-m262 "
+*MediaType Standard/Standard Paper: "%% FoomaticRIPOptionSetting: MediaType=Standard"
+*FoomaticRIPOptionSetting MediaType=Standard: "-m1 "
+*MediaType ThickStock/Thick Stock: "%% FoomaticRIPOptionSetting: MediaType=ThickStock"
+*FoomaticRIPOptionSetting MediaType=ThickStock: "-m261 "
+*MediaType Transparency/Transparency: "%% FoomaticRIPOptionSetting: MediaType=Transparency"
+*FoomaticRIPOptionSetting MediaType=Transparency: "-m2 "
+*CloseUI: *MediaType
+
+*OpenUI *Duplex/Duplex Printing: PickOne
+*FoomaticRIPOption Duplex: enum CmdLine A
+*OrderDependency: 210 AnySetup *Duplex
+*DefaultDuplex: None
+*Duplex DuplexNoTumble/Long Edge (Standard): "%% FoomaticRIPOptionSetting: Duplex=DuplexNoTumble"
+*FoomaticRIPOptionSetting Duplex=DuplexNoTumble: "-d2 "
+*Duplex DuplexTumble/Short Edge (Flip): "%% FoomaticRIPOptionSetting: Duplex=DuplexTumble"
+*FoomaticRIPOptionSetting Duplex=DuplexTumble: "-d3 "
+*Duplex ManualDuplexNoTumble/Manual Long Edge (Standard): "%% FoomaticRIPOptionSetting: Duplex=ManualDuplexNoTumble"
+*FoomaticRIPOptionSetting Duplex=ManualDuplexNoTumble: "-d4 "
+*Duplex ManualDuplexTumble/Manual Short Edge (Flip): "%% FoomaticRIPOptionSetting: Duplex=ManualDuplexTumble"
+*FoomaticRIPOptionSetting Duplex=ManualDuplexTumble: "-d5 "
+*Duplex None/Off: "%% FoomaticRIPOptionSetting: Duplex=None"
+*FoomaticRIPOptionSetting Duplex=None: "-d1 "
+*CloseUI: *Duplex
+
+*OpenUI *Resolution/Resolution: PickOne
+*FoomaticRIPOption Resolution: enum CmdLine A
+*OrderDependency: 130 AnySetup *Resolution
+*DefaultResolution: 1200x600dpi
+*Resolution 600x600dpi/600x600 dpi: "%% FoomaticRIPOptionSetting: Resolution=600x600dpi"
+*FoomaticRIPOptionSetting Resolution=600x600dpi: "-r600x600 "
+*Resolution 1200x600dpi/1200x600 dpi: "%% FoomaticRIPOptionSetting: Resolution=1200x600dpi"
+*FoomaticRIPOptionSetting Resolution=1200x600dpi: "-r1200x600 "
+*CloseUI: *Resolution
+
+*OpenUI *Quality/Printing Quality: PickOne
+*FoomaticRIPOption Quality: enum CmdLine A
+*OrderDependency: 110 AnySetup *Quality
+*DefaultQuality: normal
+*Quality draft/Draft: "%% FoomaticRIPOptionSetting: Quality=draft"
+*FoomaticRIPOptionSetting Quality=draft: " -t "
+*Quality normal/Normal: "%% FoomaticRIPOptionSetting: Quality=normal"
+*FoomaticRIPOptionSetting Quality=normal: " "
+*CloseUI: *Quality
+
+*OpenUI *ColorMode/Color Mode: PickOne
+*FoomaticRIPOption ColorMode: enum CmdLine A
+*OrderDependency: 120 AnySetup *ColorMode
+*DefaultColorMode: Monochrome
+*ColorMode PhotoOnly/Color - Photo Only: "%% FoomaticRIPOptionSetting: ColorMode=PhotoOnly"
+*FoomaticRIPOptionSetting ColorMode=PhotoOnly: "-c -C1 "
+*ColorMode PhotosAndText/Color - Photos and Text: "%% FoomaticRIPOptionSetting: ColorMode=PhotosAndText"
+*FoomaticRIPOptionSetting ColorMode=PhotosAndText: "-c -C2 "
+*ColorMode Color/Color: "%% FoomaticRIPOptionSetting: ColorMode=Color"
+*FoomaticRIPOptionSetting ColorMode=Color: "-c "
+*ColorMode GraphicsAndText/Color - Graphics and Text: "%% FoomaticRIPOptionSetting: ColorMode=GraphicsAndText"
+*FoomaticRIPOptionSetting ColorMode=GraphicsAndText: "-c -C3 "
+*ColorMode ICM/Color - use ICM color profile: "%% FoomaticRIPOptionSetting: ColorMode=ICM"
+*FoomaticRIPOptionSetting ColorMode=ICM: "-c -C10 "
+*ColorMode Monochrome/Monochrome: "%% FoomaticRIPOptionSetting: ColorMode=Monochrome"
+*FoomaticRIPOptionSetting ColorMode=Monochrome: " "
+*CloseUI: *ColorMode
+
+*OpenUI *Copies/Copies: PickOne
+*FoomaticRIPOption Copies: int CmdLine A
+*FoomaticRIPOptionPrototype Copies: "-n%s "
+*FoomaticRIPOptionRange Copies: 1 100
+*OrderDependency: 220 AnySetup *Copies
+*DefaultCopies: 1
+*FoomaticRIPDefaultCopies: 1
+*Copies 1/1: "%% FoomaticRIPOptionSetting: Copies=1"
+*Copies 2/2: "%% FoomaticRIPOptionSetting: Copies=2"
+*Copies 3/3: "%% FoomaticRIPOptionSetting: Copies=3"
+*Copies 4/4: "%% FoomaticRIPOptionSetting: Copies=4"
+*Copies 5/5: "%% FoomaticRIPOptionSetting: Copies=5"
+*Copies 6/6: "%% FoomaticRIPOptionSetting: Copies=6"
+*Copies 7/7: "%% FoomaticRIPOptionSetting: Copies=7"
+*Copies 8/8: "%% FoomaticRIPOptionSetting: Copies=8"
+*Copies 9/9: "%% FoomaticRIPOptionSetting: Copies=9"
+*Copies 10/10: "%% FoomaticRIPOptionSetting: Copies=10"
+*Copies 11/11: "%% FoomaticRIPOptionSetting: Copies=11"
+*Copies 12/12: "%% FoomaticRIPOptionSetting: Copies=12"
+*Copies 13/13: "%% FoomaticRIPOptionSetting: Copies=13"
+*Copies 14/14: "%% FoomaticRIPOptionSetting: Copies=14"
+*Copies 15/15: "%% FoomaticRIPOptionSetting: Copies=15"
+*Copies 16/16: "%% FoomaticRIPOptionSetting: Copies=16"
+*Copies 17/17: "%% FoomaticRIPOptionSetting: Copies=17"
+*Copies 18/18: "%% FoomaticRIPOptionSetting: Copies=18"
+*Copies 19/19: "%% FoomaticRIPOptionSetting: Copies=19"
+*Copies 20/20: "%% FoomaticRIPOptionSetting: Copies=20"
+*Copies 21/21: "%% FoomaticRIPOptionSetting: Copies=21"
+*Copies 22/22: "%% FoomaticRIPOptionSetting: Copies=22"
+*Copies 23/23: "%% FoomaticRIPOptionSetting: Copies=23"
+*Copies 24/24: "%% FoomaticRIPOptionSetting: Copies=24"
+*Copies 25/25: "%% FoomaticRIPOptionSetting: Copies=25"
+*Copies 26/26: "%% FoomaticRIPOptionSetting: Copies=26"
+*Copies 27/27: "%% FoomaticRIPOptionSetting: Copies=27"
+*Copies 28/28: "%% FoomaticRIPOptionSetting: Copies=28"
+*Copies 29/29: "%% FoomaticRIPOptionSetting: Copies=29"
+*Copies 30/30: "%% FoomaticRIPOptionSetting: Copies=30"
+*Copies 31/31: "%% FoomaticRIPOptionSetting: Copies=31"
+*Copies 32/32: "%% FoomaticRIPOptionSetting: Copies=32"
+*Copies 33/33: "%% FoomaticRIPOptionSetting: Copies=33"
+*Copies 34/34: "%% FoomaticRIPOptionSetting: Copies=34"
+*Copies 35/35: "%% FoomaticRIPOptionSetting: Copies=35"
+*Copies 36/36: "%% FoomaticRIPOptionSetting: Copies=36"
+*Copies 37/37: "%% FoomaticRIPOptionSetting: Copies=37"
+*Copies 38/38: "%% FoomaticRIPOptionSetting: Copies=38"
+*Copies 39/39: "%% FoomaticRIPOptionSetting: Copies=39"
+*Copies 40/40: "%% FoomaticRIPOptionSetting: Copies=40"
+*Copies 41/41: "%% FoomaticRIPOptionSetting: Copies=41"
+*Copies 42/42: "%% FoomaticRIPOptionSetting: Copies=42"
+*Copies 43/43: "%% FoomaticRIPOptionSetting: Copies=43"
+*Copies 44/44: "%% FoomaticRIPOptionSetting: Copies=44"
+*Copies 45/45: "%% FoomaticRIPOptionSetting: Copies=45"
+*Copies 46/46: "%% FoomaticRIPOptionSetting: Copies=46"
+*Copies 47/47: "%% FoomaticRIPOptionSetting: Copies=47"
+*Copies 48/48: "%% FoomaticRIPOptionSetting: Copies=48"
+*Copies 49/49: "%% FoomaticRIPOptionSetting: Copies=49"
+*Copies 50/50: "%% FoomaticRIPOptionSetting: Copies=50"
+*Copies 51/51: "%% FoomaticRIPOptionSetting: Copies=51"
+*Copies 52/52: "%% FoomaticRIPOptionSetting: Copies=52"
+*Copies 53/53: "%% FoomaticRIPOptionSetting: Copies=53"
+*Copies 54/54: "%% FoomaticRIPOptionSetting: Copies=54"
+*Copies 55/55: "%% FoomaticRIPOptionSetting: Copies=55"
+*Copies 56/56: "%% FoomaticRIPOptionSetting: Copies=56"
+*Copies 57/57: "%% FoomaticRIPOptionSetting: Copies=57"
+*Copies 58/58: "%% FoomaticRIPOptionSetting: Copies=58"
+*Copies 59/59: "%% FoomaticRIPOptionSetting: Copies=59"
+*Copies 60/60: "%% FoomaticRIPOptionSetting: Copies=60"
+*Copies 61/61: "%% FoomaticRIPOptionSetting: Copies=61"
+*Copies 62/62: "%% FoomaticRIPOptionSetting: Copies=62"
+*Copies 63/63: "%% FoomaticRIPOptionSetting: Copies=63"
+*Copies 64/64: "%% FoomaticRIPOptionSetting: Copies=64"
+*Copies 65/65: "%% FoomaticRIPOptionSetting: Copies=65"
+*Copies 66/66: "%% FoomaticRIPOptionSetting: Copies=66"
+*Copies 67/67: "%% FoomaticRIPOptionSetting: Copies=67"
+*Copies 68/68: "%% FoomaticRIPOptionSetting: Copies=68"
+*Copies 69/69: "%% FoomaticRIPOptionSetting: Copies=69"
+*Copies 70/70: "%% FoomaticRIPOptionSetting: Copies=70"
+*Copies 71/71: "%% FoomaticRIPOptionSetting: Copies=71"
+*Copies 72/72: "%% FoomaticRIPOptionSetting: Copies=72"
+*Copies 73/73: "%% FoomaticRIPOptionSetting: Copies=73"
+*Copies 74/74: "%% FoomaticRIPOptionSetting: Copies=74"
+*Copies 75/75: "%% FoomaticRIPOptionSetting: Copies=75"
+*Copies 76/76: "%% FoomaticRIPOptionSetting: Copies=76"
+*Copies 77/77: "%% FoomaticRIPOptionSetting: Copies=77"
+*Copies 78/78: "%% FoomaticRIPOptionSetting: Copies=78"
+*Copies 79/79: "%% FoomaticRIPOptionSetting: Copies=79"
+*Copies 80/80: "%% FoomaticRIPOptionSetting: Copies=80"
+*Copies 81/81: "%% FoomaticRIPOptionSetting: Copies=81"
+*Copies 82/82: "%% FoomaticRIPOptionSetting: Copies=82"
+*Copies 83/83: "%% FoomaticRIPOptionSetting: Copies=83"
+*Copies 84/84: "%% FoomaticRIPOptionSetting: Copies=84"
+*Copies 85/85: "%% FoomaticRIPOptionSetting: Copies=85"
+*Copies 86/86: "%% FoomaticRIPOptionSetting: Copies=86"
+*Copies 87/87: "%% FoomaticRIPOptionSetting: Copies=87"
+*Copies 88/88: "%% FoomaticRIPOptionSetting: Copies=88"
+*Copies 89/89: "%% FoomaticRIPOptionSetting: Copies=89"
+*Copies 90/90: "%% FoomaticRIPOptionSetting: Copies=90"
+*Copies 91/91: "%% FoomaticRIPOptionSetting: Copies=91"
+*Copies 92/92: "%% FoomaticRIPOptionSetting: Copies=92"
+*Copies 93/93: "%% FoomaticRIPOptionSetting: Copies=93"
+*Copies 94/94: "%% FoomaticRIPOptionSetting: Copies=94"
+*Copies 95/95: "%% FoomaticRIPOptionSetting: Copies=95"
+*Copies 96/96: "%% FoomaticRIPOptionSetting: Copies=96"
+*Copies 97/97: "%% FoomaticRIPOptionSetting: Copies=97"
+*Copies 98/98: "%% FoomaticRIPOptionSetting: Copies=98"
+*Copies 99/99: "%% FoomaticRIPOptionSetting: Copies=99"
+*Copies 100/100: "%% FoomaticRIPOptionSetting: Copies=100"
+*CloseUI: *Copies
+
+*FoomaticRIPOption PrinterType: enum CmdLine A 110
+*FoomaticRIPOptionSetting PrinterType=Color: " "
+
+*CloseGroup: General
+
+*OpenGroup: Adjustment/Adjustment
+
+*OpenUI *ICM/ICM Color Profile: PickOne
+*FoomaticRIPOption ICM: enum CmdLine A
+*OrderDependency: 300 AnySetup *ICM
+*DefaultICM: DL2200RGB
+*ICM DL2200RGB/File DL2200RGB.icm: "%% FoomaticRIPOptionSetting: ICM=DL2200RGB"
+*FoomaticRIPOptionSetting ICM=DL2200RGB: "-GDL2200RGB.icm "
+*ICM none/No ICM color correction: "%% FoomaticRIPOptionSetting: ICM=none"
+*FoomaticRIPOptionSetting ICM=none: " "
+*ICM testing/File testing.icm: "%% FoomaticRIPOptionSetting: ICM=testing"
+*FoomaticRIPOptionSetting ICM=testing: "-Gtesting.icm "
+*ICM user1/File user1.icm: "%% FoomaticRIPOptionSetting: ICM=user1"
+*FoomaticRIPOptionSetting ICM=user1: "-Guser1.icm "
+*ICM user2/File user2.icm: "%% FoomaticRIPOptionSetting: ICM=user2"
+*FoomaticRIPOptionSetting ICM=user2: "-Guser2.icm "
+*ICM user3/File user3.icm: "%% FoomaticRIPOptionSetting: ICM=user3"
+*FoomaticRIPOptionSetting ICM=user3: "-Guser3.icm "
+*ICM user4/File user4.icm: "%% FoomaticRIPOptionSetting: ICM=user4"
+*FoomaticRIPOptionSetting ICM=user4: "-Guser4.icm "
+*CloseUI: *ICM
+
+*OpenUI *Intent/ICM Color Profile Intent: PickOne
+*FoomaticRIPOption Intent: enum CmdLine A
+*OrderDependency: 310 AnySetup *Intent
+*DefaultIntent: Perceptual
+*Intent Absolute/Absolute Intent: "%% FoomaticRIPOptionSetting: Intent=Absolute"
+*FoomaticRIPOptionSetting Intent=Absolute: "-I3 "
+*Intent Colorimetric/Colorimetric Intent: "%% FoomaticRIPOptionSetting: Intent=Colorimetric"
+*FoomaticRIPOptionSetting Intent=Colorimetric: "-I1 "
+*Intent Perceptual/Perceptual Intent: "%% FoomaticRIPOptionSetting: Intent=Perceptual"
+*FoomaticRIPOptionSetting Intent=Perceptual: "-I0 "
+*Intent Saturation/Saturation Intent: "%% FoomaticRIPOptionSetting: Intent=Saturation"
+*FoomaticRIPOptionSetting Intent=Saturation: "-I2 "
+*CloseUI: *Intent
+
+*CloseGroup: Adjustment
+
+*OpenGroup: Miscellaneous/Miscellaneous
+
+*OpenUI *Nup/N-up Printing: PickOne
+*FoomaticRIPOption Nup: enum CmdLine A
+*OrderDependency: 200 AnySetup *Nup
+*DefaultNup: 1up
+*Nup 1up/1-up: "%% FoomaticRIPOptionSetting: Nup=1up"
+*FoomaticRIPOptionSetting Nup=1up: " "
+*Nup 2up/2-up: "%% FoomaticRIPOptionSetting: Nup=2up"
+*FoomaticRIPOptionSetting Nup=2up: "-2 "
+*Nup 3up/3-up: "%% FoomaticRIPOptionSetting: Nup=3up"
+*FoomaticRIPOptionSetting Nup=3up: "-3 "
+*Nup 4up/4-up: "%% FoomaticRIPOptionSetting: Nup=4up"
+*FoomaticRIPOptionSetting Nup=4up: "-4 "
+*Nup 6up/6-up: "%% FoomaticRIPOptionSetting: Nup=6up"
+*FoomaticRIPOptionSetting Nup=6up: "-6 "
+*Nup 8up/8-up: "%% FoomaticRIPOptionSetting: Nup=8up"
+*FoomaticRIPOptionSetting Nup=8up: "-8 "
+*Nup 10up/10-up: "%% FoomaticRIPOptionSetting: Nup=10up"
+*FoomaticRIPOptionSetting Nup=10up: "-10 "
+*Nup 12up/12-up: "%% FoomaticRIPOptionSetting: Nup=12up"
+*FoomaticRIPOptionSetting Nup=12up: "-12 "
+*Nup 14up/14-up: "%% FoomaticRIPOptionSetting: Nup=14up"
+*FoomaticRIPOptionSetting Nup=14up: "-14 "
+*Nup 15up/15-up: "%% FoomaticRIPOptionSetting: Nup=15up"
+*FoomaticRIPOptionSetting Nup=15up: "-15 "
+*Nup 16up/16-up: "%% FoomaticRIPOptionSetting: Nup=16up"
+*FoomaticRIPOptionSetting Nup=16up: "-16 "
+*Nup 18up/18-up: "%% FoomaticRIPOptionSetting: Nup=18up"
+*FoomaticRIPOptionSetting Nup=18up: "-18 "
+*CloseUI: *Nup
+
+*OpenUI *NupOrient/N-up Orientation: PickOne
+*FoomaticRIPOption NupOrient: enum CmdLine A
+*OrderDependency: 200 AnySetup *NupOrient
+*DefaultNupOrient: port
+*NupOrient land/Landscape: "%% FoomaticRIPOptionSetting: NupOrient=land"
+*FoomaticRIPOptionSetting NupOrient=land: "-ol "
+*NupOrient port/Portrait: "%% FoomaticRIPOptionSetting: NupOrient=port"
+*FoomaticRIPOptionSetting NupOrient=port: " "
+*NupOrient sea/Seascape: "%% FoomaticRIPOptionSetting: NupOrient=sea"
+*FoomaticRIPOptionSetting NupOrient=sea: "-os "
+*CloseUI: *NupOrient
+
+*CloseGroup: Miscellaneous
+
+
+*% Generic boilerplate PPD stuff as standard PostScript fonts and so on
+
+*DefaultFont: Courier
+*Font AvantGarde-Book: Standard "(001.006S)" Standard ROM
+*Font AvantGarde-BookOblique: Standard "(001.006S)" Standard ROM
+*Font AvantGarde-Demi: Standard "(001.007S)" Standard ROM
+*Font AvantGarde-DemiOblique: Standard "(001.007S)" Standard ROM
+*Font Bookman-Demi: Standard "(001.004S)" Standard ROM
+*Font Bookman-DemiItalic: Standard "(001.004S)" Standard ROM
+*Font Bookman-Light: Standard "(001.004S)" Standard ROM
+*Font Bookman-LightItalic: Standard "(001.004S)" Standard ROM
+*Font Courier: Standard "(002.004S)" Standard ROM
+*Font Courier-Bold: Standard "(002.004S)" Standard ROM
+*Font Courier-BoldOblique: Standard "(002.004S)" Standard ROM
+*Font Courier-Oblique: Standard "(002.004S)" Standard ROM
+*Font Helvetica: Standard "(001.006S)" Standard ROM
+*Font Helvetica-Bold: Standard "(001.007S)" Standard ROM
+*Font Helvetica-BoldOblique: Standard "(001.007S)" Standard ROM
+*Font Helvetica-Narrow: Standard "(001.006S)" Standard ROM
+*Font Helvetica-Narrow-Bold: Standard "(001.007S)" Standard ROM
+*Font Helvetica-Narrow-BoldOblique: Standard "(001.007S)" Standard ROM
+*Font Helvetica-Narrow-Oblique: Standard "(001.006S)" Standard ROM
+*Font Helvetica-Oblique: Standard "(001.006S)" Standard ROM
+*Font NewCenturySchlbk-Bold: Standard "(001.009S)" Standard ROM
+*Font NewCenturySchlbk-BoldItalic: Standard "(001.007S)" Standard ROM
+*Font NewCenturySchlbk-Italic: Standard "(001.006S)" Standard ROM
+*Font NewCenturySchlbk-Roman: Standard "(001.007S)" Standard ROM
+*Font Palatino-Bold: Standard "(001.005S)" Standard ROM
+*Font Palatino-BoldItalic: Standard "(001.005S)" Standard ROM
+*Font Palatino-Italic: Standard "(001.005S)" Standard ROM
+*Font Palatino-Roman: Standard "(001.005S)" Standard ROM
+*Font Symbol: Special "(001.007S)" Special ROM
+*Font Times-Bold: Standard "(001.007S)" Standard ROM
+*Font Times-BoldItalic: Standard "(001.009S)" Standard ROM
+*Font Times-Italic: Standard "(001.007S)" Standard ROM
+*Font Times-Roman: Standard "(001.007S)" Standard ROM
+*Font ZapfChancery-MediumItalic: Standard "(001.007S)" Standard ROM
+*Font ZapfDingbats: Special "(001.004S)" Standard ROM
+
diff --git a/PPD/Minolta-magicolor_2300_DL.ppd b/PPD/Minolta-magicolor_2300_DL.ppd
new file mode 100644
index 0000000..e09c987
--- /dev/null
+++ b/PPD/Minolta-magicolor_2300_DL.ppd
@@ -0,0 +1,467 @@
+*PPD-Adobe: "4.3"
+*%
+*% For information on using this, and to obtain the required backend
+*% script, consult http://www.linuxprinting.org/
+*%
+*% This file is published under the GNU General Public License
+*%
+*% PPD-O-MATIC (3.0.0 or newer) generated this PPD file. It is for use with
+*% all programs and environments which use PPD files for dealing with
+*% printer capability information. The printer must be configured with the
+*% "foomatic-rip" backend filter script of Foomatic 3.0.0 or newer. This
+*% file and "foomatic-rip" work together to support PPD-controlled printer
+*% driver option access with arbitrary free software printer drivers and
+*% printing spoolers.
+*%
+*% To save this file on your disk, wait until the download has completed
+*% (the animation of the browser logo must stop) and then use the
+*% "Save as..." command in the "File" menu of your browser or in the
+*% pop-up manu when you click on this document with the right mouse button.
+*% DO NOT cut and paste this file into an editor with your mouse. This can
+*% introduce additional line breaks which lead to unexpected results.
+*%
+*% You may save this file as 'Minolta-magicolor_2300_DL-foo2zjs.ppd'
+*%
+*%
+*FormatVersion: "4.3"
+*FileVersion: "1.1"
+*LanguageVersion: English
+*LanguageEncoding: ISOLatin1
+*PCFileName: "FOO2ZJS.PPD"
+*Manufacturer: "Minolta"
+*Product: "(magicolor 2300 DL)"
+*cupsVersion: 1.0
+*cupsManualCopies: True
+*cupsModelNumber: 2
+*cupsFilter: "application/vnd.cups-postscript 0 foomatic-rip"
+*%pprRIP: foomatic-rip other
+*ModelName: "Minolta magicolor 2300 DL"
+*ShortNickName: "Minolta magico. 2300 DL foo2zjs"
+*NickName: "Minolta magicolor 2300 DL Foomatic/foo2zjs (recommended)"
+*PSVersion: "(3010.000) 550"
+*PSVersion: "(3010.000) 651"
+*PSVersion: "(3010.000) 652"
+*PSVersion: "(3010.000) 653"
+*PSVersion: "(3010.000) 704"
+*PSVersion: "(3010.000) 705"
+*PSVersion: "(3010.000) 800"
+*LanguageLevel: "3"
+*ColorDevice: True
+*DefaultColorSpace: RGB
+*FileSystem: False
+*Throughput: "1"
+*LandscapeOrientation: Plus90
+*TTRasterizer: Type42
+*1284DeviceID: "MANUFACTURER:MINOLTA-QMS;MODEL:magicolor 2300 DL;COMMAND SET:ZJS,PJL;"
+
+
+
+*VariablePaperSize: False
+
+*FoomaticIDs: Minolta-magicolor_2300_DL foo2zjs
+*FoomaticRIPCommandLine: "foo2zjs-wrapper %A"
+
+*OpenGroup: General/General
+
+*OpenUI *PageSize/Page Size: PickOne
+*FoomaticRIPOption PageSize: enum CmdLine A
+*OrderDependency: 135 AnySetup *PageSize
+*DefaultPageSize: Letter
+*PageSize Letter/Letter: "%% FoomaticRIPOptionSetting: PageSize=Letter"
+*FoomaticRIPOptionSetting PageSize=Letter: "-p1 "
+*PageSize A4/A4: "%% FoomaticRIPOptionSetting: PageSize=A4"
+*FoomaticRIPOptionSetting PageSize=A4: "-p9 "
+*PageSize A5/A5: "%% FoomaticRIPOptionSetting: PageSize=A5"
+*FoomaticRIPOptionSetting PageSize=A5: "-p11 "
+*PageSize B5/B5: "%% FoomaticRIPOptionSetting: PageSize=B5"
+*FoomaticRIPOptionSetting PageSize=B5: "-p13 "
+*PageSize Env10/Env #10: "%% FoomaticRIPOptionSetting: PageSize=Env10"
+*FoomaticRIPOptionSetting PageSize=Env10: "-p20 "
+*PageSize EnvB5/Env B5: "%% FoomaticRIPOptionSetting: PageSize=EnvB5"
+*FoomaticRIPOptionSetting PageSize=EnvB5: "-p34 "
+*PageSize EnvC5/Env C5: "%% FoomaticRIPOptionSetting: PageSize=EnvC5"
+*FoomaticRIPOptionSetting PageSize=EnvC5: "-p28 "
+*PageSize EnvDL/Env DL: "%% FoomaticRIPOptionSetting: PageSize=EnvDL"
+*FoomaticRIPOptionSetting PageSize=EnvDL: "-p27 "
+*PageSize EnvMonarch/Env Monarch: "%% FoomaticRIPOptionSetting: PageSize=EnvMonarch"
+*FoomaticRIPOptionSetting PageSize=EnvMonarch: "-p37 "
+*PageSize Executive/Executive: "%% FoomaticRIPOptionSetting: PageSize=Executive"
+*FoomaticRIPOptionSetting PageSize=Executive: "-p7 "
+*PageSize Legal/Legal: "%% FoomaticRIPOptionSetting: PageSize=Legal"
+*FoomaticRIPOptionSetting PageSize=Legal: "-p5 "
+*CloseUI: *PageSize
+
+*OpenUI *PageRegion: PickOne
+*OrderDependency: 135 AnySetup *PageRegion
+*DefaultPageRegion: Letter
+*PageRegion Letter/Letter: "%% FoomaticRIPOptionSetting: PageSize=Letter"
+*PageRegion A4/A4: "%% FoomaticRIPOptionSetting: PageSize=A4"
+*PageRegion A5/A5: "%% FoomaticRIPOptionSetting: PageSize=A5"
+*PageRegion B5/B5: "%% FoomaticRIPOptionSetting: PageSize=B5"
+*PageRegion Env10/Env #10: "%% FoomaticRIPOptionSetting: PageSize=Env10"
+*PageRegion EnvB5/Env B5: "%% FoomaticRIPOptionSetting: PageSize=EnvB5"
+*PageRegion EnvC5/Env C5: "%% FoomaticRIPOptionSetting: PageSize=EnvC5"
+*PageRegion EnvDL/Env DL: "%% FoomaticRIPOptionSetting: PageSize=EnvDL"
+*PageRegion EnvMonarch/Env Monarch: "%% FoomaticRIPOptionSetting: PageSize=EnvMonarch"
+*PageRegion Executive/Executive: "%% FoomaticRIPOptionSetting: PageSize=Executive"
+*PageRegion Legal/Legal: "%% FoomaticRIPOptionSetting: PageSize=Legal"
+*CloseUI: *PageRegion
+
+*DefaultImageableArea: Letter
+*ImageableArea Letter/Letter: "11.34 11.34 600.66 780.66"
+*ImageableArea A4/A4: "11.34 11.34 583.66 830.66"
+*ImageableArea A5/A5: "11.34 11.34 408.66 583.66"
+*ImageableArea B5/B5: "11.34 11.34 486.66 696.66"
+*ImageableArea Env10/Env #10: "11.34 11.34 285.66 672.66"
+*ImageableArea EnvB5/Env B5: "11.34 11.34 486.66 696.66"
+*ImageableArea EnvC5/Env C5: "11.34 11.34 447.66 637.66"
+*ImageableArea EnvDL/Env DL: "11.34 11.34 299.66 611.66"
+*ImageableArea EnvMonarch/Env Monarch: "11.34 11.34 267.66 528.66"
+*ImageableArea Executive/Executive: "11.34 11.34 510.66 744.66"
+*ImageableArea Legal/Legal: "11.34 11.34 600.66 996.66"
+
+*DefaultPaperDimension: Letter
+*PaperDimension Letter/Letter: "612 792"
+*PaperDimension A4/A4: "595 842"
+*PaperDimension A5/A5: "420 595"
+*PaperDimension B5/B5: "498 708"
+*PaperDimension Env10/Env #10: "297 684"
+*PaperDimension EnvB5/Env B5: "498 708"
+*PaperDimension EnvC5/Env C5: "459 649"
+*PaperDimension EnvDL/Env DL: "311 623"
+*PaperDimension EnvMonarch/Env Monarch: "279 540"
+*PaperDimension Executive/Executive: "522 756"
+*PaperDimension Legal/Legal: "612 1008"
+
+*OpenUI *InputSlot/Media Source: PickOne
+*FoomaticRIPOption InputSlot: enum CmdLine A
+*OrderDependency: 150 AnySetup *InputSlot
+*DefaultInputSlot: Auto
+*InputSlot Lower/Optional Lower Tray: "%% FoomaticRIPOptionSetting: InputSlot=Lower"
+*FoomaticRIPOptionSetting InputSlot=Lower: "-s3 "
+*InputSlot Multipurpose/Multipurpose Tray: "%% FoomaticRIPOptionSetting: InputSlot=Multipurpose"
+*FoomaticRIPOptionSetting InputSlot=Multipurpose: "-s1 "
+*InputSlot Auto/Auto Source: "%% FoomaticRIPOptionSetting: InputSlot=Auto"
+*FoomaticRIPOptionSetting InputSlot=Auto: "-s7 "
+*InputSlot Manual/Manual Feed: "%% FoomaticRIPOptionSetting: InputSlot=Manual"
+*FoomaticRIPOptionSetting InputSlot=Manual: "-s4 "
+*CloseUI: *InputSlot
+
+*OpenUI *MediaType/Media Type: PickOne
+*FoomaticRIPOption MediaType: enum CmdLine A
+*OrderDependency: 150 AnySetup *MediaType
+*DefaultMediaType: Standard
+*MediaType Envelope/Envelope: "%% FoomaticRIPOptionSetting: MediaType=Envelope"
+*FoomaticRIPOptionSetting MediaType=Envelope: "-m257 "
+*MediaType Labels/Labels: "%% FoomaticRIPOptionSetting: MediaType=Labels"
+*FoomaticRIPOptionSetting MediaType=Labels: "-m263 "
+*MediaType Letterhead/Letterhead: "%% FoomaticRIPOptionSetting: MediaType=Letterhead"
+*FoomaticRIPOptionSetting MediaType=Letterhead: "-m259 "
+*MediaType Postcard/Postcard: "%% FoomaticRIPOptionSetting: MediaType=Postcard"
+*FoomaticRIPOptionSetting MediaType=Postcard: "-m262 "
+*MediaType Standard/Standard Paper: "%% FoomaticRIPOptionSetting: MediaType=Standard"
+*FoomaticRIPOptionSetting MediaType=Standard: "-m1 "
+*MediaType ThickStock/Thick Stock: "%% FoomaticRIPOptionSetting: MediaType=ThickStock"
+*FoomaticRIPOptionSetting MediaType=ThickStock: "-m261 "
+*MediaType Transparency/Transparency: "%% FoomaticRIPOptionSetting: MediaType=Transparency"
+*FoomaticRIPOptionSetting MediaType=Transparency: "-m2 "
+*CloseUI: *MediaType
+
+*OpenUI *Duplex/Duplex Printing: PickOne
+*FoomaticRIPOption Duplex: enum CmdLine A
+*OrderDependency: 210 AnySetup *Duplex
+*DefaultDuplex: None
+*Duplex DuplexNoTumble/Long Edge (Standard): "%% FoomaticRIPOptionSetting: Duplex=DuplexNoTumble"
+*FoomaticRIPOptionSetting Duplex=DuplexNoTumble: "-d2 "
+*Duplex DuplexTumble/Short Edge (Flip): "%% FoomaticRIPOptionSetting: Duplex=DuplexTumble"
+*FoomaticRIPOptionSetting Duplex=DuplexTumble: "-d3 "
+*Duplex ManualDuplexNoTumble/Manual Long Edge (Standard): "%% FoomaticRIPOptionSetting: Duplex=ManualDuplexNoTumble"
+*FoomaticRIPOptionSetting Duplex=ManualDuplexNoTumble: "-d4 "
+*Duplex ManualDuplexTumble/Manual Short Edge (Flip): "%% FoomaticRIPOptionSetting: Duplex=ManualDuplexTumble"
+*FoomaticRIPOptionSetting Duplex=ManualDuplexTumble: "-d5 "
+*Duplex None/Off: "%% FoomaticRIPOptionSetting: Duplex=None"
+*FoomaticRIPOptionSetting Duplex=None: "-d1 "
+*CloseUI: *Duplex
+
+*OpenUI *Resolution/Resolution: PickOne
+*FoomaticRIPOption Resolution: enum CmdLine A
+*OrderDependency: 130 AnySetup *Resolution
+*DefaultResolution: 1200x600dpi
+*Resolution 600x600dpi/600x600 dpi: "%% FoomaticRIPOptionSetting: Resolution=600x600dpi"
+*FoomaticRIPOptionSetting Resolution=600x600dpi: "-r600x600 "
+*Resolution 1200x600dpi/1200x600 dpi: "%% FoomaticRIPOptionSetting: Resolution=1200x600dpi"
+*FoomaticRIPOptionSetting Resolution=1200x600dpi: "-r1200x600 "
+*Resolution 2400x600dpi/2400x600 dpi: "%% FoomaticRIPOptionSetting: Resolution=2400x600dpi"
+*FoomaticRIPOptionSetting Resolution=2400x600dpi: "-r2400x600 "
+*CloseUI: *Resolution
+
+*OpenUI *Quality/Printing Quality: PickOne
+*FoomaticRIPOption Quality: enum CmdLine A
+*OrderDependency: 110 AnySetup *Quality
+*DefaultQuality: normal
+*Quality draft/Draft: "%% FoomaticRIPOptionSetting: Quality=draft"
+*FoomaticRIPOptionSetting Quality=draft: " -t "
+*Quality normal/Normal: "%% FoomaticRIPOptionSetting: Quality=normal"
+*FoomaticRIPOptionSetting Quality=normal: " "
+*CloseUI: *Quality
+
+*OpenUI *ColorMode/Color Mode: PickOne
+*FoomaticRIPOption ColorMode: enum CmdLine A
+*OrderDependency: 120 AnySetup *ColorMode
+*DefaultColorMode: Monochrome
+*ColorMode PhotoOnly/Color - Photo Only: "%% FoomaticRIPOptionSetting: ColorMode=PhotoOnly"
+*FoomaticRIPOptionSetting ColorMode=PhotoOnly: "-c -C1 "
+*ColorMode PhotosAndText/Color - Photos and Text: "%% FoomaticRIPOptionSetting: ColorMode=PhotosAndText"
+*FoomaticRIPOptionSetting ColorMode=PhotosAndText: "-c -C2 "
+*ColorMode Color/Color: "%% FoomaticRIPOptionSetting: ColorMode=Color"
+*FoomaticRIPOptionSetting ColorMode=Color: "-c "
+*ColorMode GraphicsAndText/Color - Graphics and Text: "%% FoomaticRIPOptionSetting: ColorMode=GraphicsAndText"
+*FoomaticRIPOptionSetting ColorMode=GraphicsAndText: "-c -C3 "
+*ColorMode ICM/Color - use ICM color profile: "%% FoomaticRIPOptionSetting: ColorMode=ICM"
+*FoomaticRIPOptionSetting ColorMode=ICM: "-c -C10 "
+*ColorMode Monochrome/Monochrome: "%% FoomaticRIPOptionSetting: ColorMode=Monochrome"
+*FoomaticRIPOptionSetting ColorMode=Monochrome: " "
+*CloseUI: *ColorMode
+
+*OpenUI *Copies/Copies: PickOne
+*FoomaticRIPOption Copies: int CmdLine A
+*FoomaticRIPOptionPrototype Copies: "-n%s "
+*FoomaticRIPOptionRange Copies: 1 100
+*OrderDependency: 220 AnySetup *Copies
+*DefaultCopies: 1
+*FoomaticRIPDefaultCopies: 1
+*Copies 1/1: "%% FoomaticRIPOptionSetting: Copies=1"
+*Copies 2/2: "%% FoomaticRIPOptionSetting: Copies=2"
+*Copies 3/3: "%% FoomaticRIPOptionSetting: Copies=3"
+*Copies 4/4: "%% FoomaticRIPOptionSetting: Copies=4"
+*Copies 5/5: "%% FoomaticRIPOptionSetting: Copies=5"
+*Copies 6/6: "%% FoomaticRIPOptionSetting: Copies=6"
+*Copies 7/7: "%% FoomaticRIPOptionSetting: Copies=7"
+*Copies 8/8: "%% FoomaticRIPOptionSetting: Copies=8"
+*Copies 9/9: "%% FoomaticRIPOptionSetting: Copies=9"
+*Copies 10/10: "%% FoomaticRIPOptionSetting: Copies=10"
+*Copies 11/11: "%% FoomaticRIPOptionSetting: Copies=11"
+*Copies 12/12: "%% FoomaticRIPOptionSetting: Copies=12"
+*Copies 13/13: "%% FoomaticRIPOptionSetting: Copies=13"
+*Copies 14/14: "%% FoomaticRIPOptionSetting: Copies=14"
+*Copies 15/15: "%% FoomaticRIPOptionSetting: Copies=15"
+*Copies 16/16: "%% FoomaticRIPOptionSetting: Copies=16"
+*Copies 17/17: "%% FoomaticRIPOptionSetting: Copies=17"
+*Copies 18/18: "%% FoomaticRIPOptionSetting: Copies=18"
+*Copies 19/19: "%% FoomaticRIPOptionSetting: Copies=19"
+*Copies 20/20: "%% FoomaticRIPOptionSetting: Copies=20"
+*Copies 21/21: "%% FoomaticRIPOptionSetting: Copies=21"
+*Copies 22/22: "%% FoomaticRIPOptionSetting: Copies=22"
+*Copies 23/23: "%% FoomaticRIPOptionSetting: Copies=23"
+*Copies 24/24: "%% FoomaticRIPOptionSetting: Copies=24"
+*Copies 25/25: "%% FoomaticRIPOptionSetting: Copies=25"
+*Copies 26/26: "%% FoomaticRIPOptionSetting: Copies=26"
+*Copies 27/27: "%% FoomaticRIPOptionSetting: Copies=27"
+*Copies 28/28: "%% FoomaticRIPOptionSetting: Copies=28"
+*Copies 29/29: "%% FoomaticRIPOptionSetting: Copies=29"
+*Copies 30/30: "%% FoomaticRIPOptionSetting: Copies=30"
+*Copies 31/31: "%% FoomaticRIPOptionSetting: Copies=31"
+*Copies 32/32: "%% FoomaticRIPOptionSetting: Copies=32"
+*Copies 33/33: "%% FoomaticRIPOptionSetting: Copies=33"
+*Copies 34/34: "%% FoomaticRIPOptionSetting: Copies=34"
+*Copies 35/35: "%% FoomaticRIPOptionSetting: Copies=35"
+*Copies 36/36: "%% FoomaticRIPOptionSetting: Copies=36"
+*Copies 37/37: "%% FoomaticRIPOptionSetting: Copies=37"
+*Copies 38/38: "%% FoomaticRIPOptionSetting: Copies=38"
+*Copies 39/39: "%% FoomaticRIPOptionSetting: Copies=39"
+*Copies 40/40: "%% FoomaticRIPOptionSetting: Copies=40"
+*Copies 41/41: "%% FoomaticRIPOptionSetting: Copies=41"
+*Copies 42/42: "%% FoomaticRIPOptionSetting: Copies=42"
+*Copies 43/43: "%% FoomaticRIPOptionSetting: Copies=43"
+*Copies 44/44: "%% FoomaticRIPOptionSetting: Copies=44"
+*Copies 45/45: "%% FoomaticRIPOptionSetting: Copies=45"
+*Copies 46/46: "%% FoomaticRIPOptionSetting: Copies=46"
+*Copies 47/47: "%% FoomaticRIPOptionSetting: Copies=47"
+*Copies 48/48: "%% FoomaticRIPOptionSetting: Copies=48"
+*Copies 49/49: "%% FoomaticRIPOptionSetting: Copies=49"
+*Copies 50/50: "%% FoomaticRIPOptionSetting: Copies=50"
+*Copies 51/51: "%% FoomaticRIPOptionSetting: Copies=51"
+*Copies 52/52: "%% FoomaticRIPOptionSetting: Copies=52"
+*Copies 53/53: "%% FoomaticRIPOptionSetting: Copies=53"
+*Copies 54/54: "%% FoomaticRIPOptionSetting: Copies=54"
+*Copies 55/55: "%% FoomaticRIPOptionSetting: Copies=55"
+*Copies 56/56: "%% FoomaticRIPOptionSetting: Copies=56"
+*Copies 57/57: "%% FoomaticRIPOptionSetting: Copies=57"
+*Copies 58/58: "%% FoomaticRIPOptionSetting: Copies=58"
+*Copies 59/59: "%% FoomaticRIPOptionSetting: Copies=59"
+*Copies 60/60: "%% FoomaticRIPOptionSetting: Copies=60"
+*Copies 61/61: "%% FoomaticRIPOptionSetting: Copies=61"
+*Copies 62/62: "%% FoomaticRIPOptionSetting: Copies=62"
+*Copies 63/63: "%% FoomaticRIPOptionSetting: Copies=63"
+*Copies 64/64: "%% FoomaticRIPOptionSetting: Copies=64"
+*Copies 65/65: "%% FoomaticRIPOptionSetting: Copies=65"
+*Copies 66/66: "%% FoomaticRIPOptionSetting: Copies=66"
+*Copies 67/67: "%% FoomaticRIPOptionSetting: Copies=67"
+*Copies 68/68: "%% FoomaticRIPOptionSetting: Copies=68"
+*Copies 69/69: "%% FoomaticRIPOptionSetting: Copies=69"
+*Copies 70/70: "%% FoomaticRIPOptionSetting: Copies=70"
+*Copies 71/71: "%% FoomaticRIPOptionSetting: Copies=71"
+*Copies 72/72: "%% FoomaticRIPOptionSetting: Copies=72"
+*Copies 73/73: "%% FoomaticRIPOptionSetting: Copies=73"
+*Copies 74/74: "%% FoomaticRIPOptionSetting: Copies=74"
+*Copies 75/75: "%% FoomaticRIPOptionSetting: Copies=75"
+*Copies 76/76: "%% FoomaticRIPOptionSetting: Copies=76"
+*Copies 77/77: "%% FoomaticRIPOptionSetting: Copies=77"
+*Copies 78/78: "%% FoomaticRIPOptionSetting: Copies=78"
+*Copies 79/79: "%% FoomaticRIPOptionSetting: Copies=79"
+*Copies 80/80: "%% FoomaticRIPOptionSetting: Copies=80"
+*Copies 81/81: "%% FoomaticRIPOptionSetting: Copies=81"
+*Copies 82/82: "%% FoomaticRIPOptionSetting: Copies=82"
+*Copies 83/83: "%% FoomaticRIPOptionSetting: Copies=83"
+*Copies 84/84: "%% FoomaticRIPOptionSetting: Copies=84"
+*Copies 85/85: "%% FoomaticRIPOptionSetting: Copies=85"
+*Copies 86/86: "%% FoomaticRIPOptionSetting: Copies=86"
+*Copies 87/87: "%% FoomaticRIPOptionSetting: Copies=87"
+*Copies 88/88: "%% FoomaticRIPOptionSetting: Copies=88"
+*Copies 89/89: "%% FoomaticRIPOptionSetting: Copies=89"
+*Copies 90/90: "%% FoomaticRIPOptionSetting: Copies=90"
+*Copies 91/91: "%% FoomaticRIPOptionSetting: Copies=91"
+*Copies 92/92: "%% FoomaticRIPOptionSetting: Copies=92"
+*Copies 93/93: "%% FoomaticRIPOptionSetting: Copies=93"
+*Copies 94/94: "%% FoomaticRIPOptionSetting: Copies=94"
+*Copies 95/95: "%% FoomaticRIPOptionSetting: Copies=95"
+*Copies 96/96: "%% FoomaticRIPOptionSetting: Copies=96"
+*Copies 97/97: "%% FoomaticRIPOptionSetting: Copies=97"
+*Copies 98/98: "%% FoomaticRIPOptionSetting: Copies=98"
+*Copies 99/99: "%% FoomaticRIPOptionSetting: Copies=99"
+*Copies 100/100: "%% FoomaticRIPOptionSetting: Copies=100"
+*CloseUI: *Copies
+
+*FoomaticRIPOption PrinterType: enum CmdLine A 110
+*FoomaticRIPOptionSetting PrinterType=Color: " "
+
+*CloseGroup: General
+
+*OpenGroup: Adjustment/Adjustment
+
+*OpenUI *ICM/ICM Color Profile: PickOne
+*FoomaticRIPOption ICM: enum CmdLine A
+*OrderDependency: 300 AnySetup *ICM
+*DefaultICM: DL2312
+*ICM DL2312/File DL2312.icm: "%% FoomaticRIPOptionSetting: ICM=DL2312"
+*FoomaticRIPOptionSetting ICM=DL2312: "-GDL2312.icm "
+*ICM DL2324/File DL2324.icm: "%% FoomaticRIPOptionSetting: ICM=DL2324"
+*FoomaticRIPOptionSetting ICM=DL2324: "-GDL2324.icm "
+*ICM km2430_2/File km2430_2.icm: "%% FoomaticRIPOptionSetting: ICM=km2430_2"
+*FoomaticRIPOptionSetting ICM=km2430_2: "-Gkm2430_2.icm "
+*ICM none/No ICM color correction: "%% FoomaticRIPOptionSetting: ICM=none"
+*FoomaticRIPOptionSetting ICM=none: " "
+*ICM testing/File testing.icm: "%% FoomaticRIPOptionSetting: ICM=testing"
+*FoomaticRIPOptionSetting ICM=testing: "-Gtesting.icm "
+*ICM user1/File user1.icm: "%% FoomaticRIPOptionSetting: ICM=user1"
+*FoomaticRIPOptionSetting ICM=user1: "-Guser1.icm "
+*ICM user2/File user2.icm: "%% FoomaticRIPOptionSetting: ICM=user2"
+*FoomaticRIPOptionSetting ICM=user2: "-Guser2.icm "
+*ICM user3/File user3.icm: "%% FoomaticRIPOptionSetting: ICM=user3"
+*FoomaticRIPOptionSetting ICM=user3: "-Guser3.icm "
+*ICM user4/File user4.icm: "%% FoomaticRIPOptionSetting: ICM=user4"
+*FoomaticRIPOptionSetting ICM=user4: "-Guser4.icm "
+*CloseUI: *ICM
+
+*OpenUI *Intent/ICM Color Profile Intent: PickOne
+*FoomaticRIPOption Intent: enum CmdLine A
+*OrderDependency: 310 AnySetup *Intent
+*DefaultIntent: Perceptual
+*Intent Absolute/Absolute Intent: "%% FoomaticRIPOptionSetting: Intent=Absolute"
+*FoomaticRIPOptionSetting Intent=Absolute: "-I3 "
+*Intent Colorimetric/Colorimetric Intent: "%% FoomaticRIPOptionSetting: Intent=Colorimetric"
+*FoomaticRIPOptionSetting Intent=Colorimetric: "-I1 "
+*Intent Perceptual/Perceptual Intent: "%% FoomaticRIPOptionSetting: Intent=Perceptual"
+*FoomaticRIPOptionSetting Intent=Perceptual: "-I0 "
+*Intent Saturation/Saturation Intent: "%% FoomaticRIPOptionSetting: Intent=Saturation"
+*FoomaticRIPOptionSetting Intent=Saturation: "-I2 "
+*CloseUI: *Intent
+
+*CloseGroup: Adjustment
+
+*OpenGroup: Miscellaneous/Miscellaneous
+
+*OpenUI *Nup/N-up Printing: PickOne
+*FoomaticRIPOption Nup: enum CmdLine A
+*OrderDependency: 200 AnySetup *Nup
+*DefaultNup: 1up
+*Nup 1up/1-up: "%% FoomaticRIPOptionSetting: Nup=1up"
+*FoomaticRIPOptionSetting Nup=1up: " "
+*Nup 2up/2-up: "%% FoomaticRIPOptionSetting: Nup=2up"
+*FoomaticRIPOptionSetting Nup=2up: "-2 "
+*Nup 3up/3-up: "%% FoomaticRIPOptionSetting: Nup=3up"
+*FoomaticRIPOptionSetting Nup=3up: "-3 "
+*Nup 4up/4-up: "%% FoomaticRIPOptionSetting: Nup=4up"
+*FoomaticRIPOptionSetting Nup=4up: "-4 "
+*Nup 6up/6-up: "%% FoomaticRIPOptionSetting: Nup=6up"
+*FoomaticRIPOptionSetting Nup=6up: "-6 "
+*Nup 8up/8-up: "%% FoomaticRIPOptionSetting: Nup=8up"
+*FoomaticRIPOptionSetting Nup=8up: "-8 "
+*Nup 10up/10-up: "%% FoomaticRIPOptionSetting: Nup=10up"
+*FoomaticRIPOptionSetting Nup=10up: "-10 "
+*Nup 12up/12-up: "%% FoomaticRIPOptionSetting: Nup=12up"
+*FoomaticRIPOptionSetting Nup=12up: "-12 "
+*Nup 14up/14-up: "%% FoomaticRIPOptionSetting: Nup=14up"
+*FoomaticRIPOptionSetting Nup=14up: "-14 "
+*Nup 15up/15-up: "%% FoomaticRIPOptionSetting: Nup=15up"
+*FoomaticRIPOptionSetting Nup=15up: "-15 "
+*Nup 16up/16-up: "%% FoomaticRIPOptionSetting: Nup=16up"
+*FoomaticRIPOptionSetting Nup=16up: "-16 "
+*Nup 18up/18-up: "%% FoomaticRIPOptionSetting: Nup=18up"
+*FoomaticRIPOptionSetting Nup=18up: "-18 "
+*CloseUI: *Nup
+
+*OpenUI *NupOrient/N-up Orientation: PickOne
+*FoomaticRIPOption NupOrient: enum CmdLine A
+*OrderDependency: 200 AnySetup *NupOrient
+*DefaultNupOrient: port
+*NupOrient land/Landscape: "%% FoomaticRIPOptionSetting: NupOrient=land"
+*FoomaticRIPOptionSetting NupOrient=land: "-ol "
+*NupOrient port/Portrait: "%% FoomaticRIPOptionSetting: NupOrient=port"
+*FoomaticRIPOptionSetting NupOrient=port: " "
+*NupOrient sea/Seascape: "%% FoomaticRIPOptionSetting: NupOrient=sea"
+*FoomaticRIPOptionSetting NupOrient=sea: "-os "
+*CloseUI: *NupOrient
+
+*CloseGroup: Miscellaneous
+
+
+*% Generic boilerplate PPD stuff as standard PostScript fonts and so on
+
+*DefaultFont: Courier
+*Font AvantGarde-Book: Standard "(001.006S)" Standard ROM
+*Font AvantGarde-BookOblique: Standard "(001.006S)" Standard ROM
+*Font AvantGarde-Demi: Standard "(001.007S)" Standard ROM
+*Font AvantGarde-DemiOblique: Standard "(001.007S)" Standard ROM
+*Font Bookman-Demi: Standard "(001.004S)" Standard ROM
+*Font Bookman-DemiItalic: Standard "(001.004S)" Standard ROM
+*Font Bookman-Light: Standard "(001.004S)" Standard ROM
+*Font Bookman-LightItalic: Standard "(001.004S)" Standard ROM
+*Font Courier: Standard "(002.004S)" Standard ROM
+*Font Courier-Bold: Standard "(002.004S)" Standard ROM
+*Font Courier-BoldOblique: Standard "(002.004S)" Standard ROM
+*Font Courier-Oblique: Standard "(002.004S)" Standard ROM
+*Font Helvetica: Standard "(001.006S)" Standard ROM
+*Font Helvetica-Bold: Standard "(001.007S)" Standard ROM
+*Font Helvetica-BoldOblique: Standard "(001.007S)" Standard ROM
+*Font Helvetica-Narrow: Standard "(001.006S)" Standard ROM
+*Font Helvetica-Narrow-Bold: Standard "(001.007S)" Standard ROM
+*Font Helvetica-Narrow-BoldOblique: Standard "(001.007S)" Standard ROM
+*Font Helvetica-Narrow-Oblique: Standard "(001.006S)" Standard ROM
+*Font Helvetica-Oblique: Standard "(001.006S)" Standard ROM
+*Font NewCenturySchlbk-Bold: Standard "(001.009S)" Standard ROM
+*Font NewCenturySchlbk-BoldItalic: Standard "(001.007S)" Standard ROM
+*Font NewCenturySchlbk-Italic: Standard "(001.006S)" Standard ROM
+*Font NewCenturySchlbk-Roman: Standard "(001.007S)" Standard ROM
+*Font Palatino-Bold: Standard "(001.005S)" Standard ROM
+*Font Palatino-BoldItalic: Standard "(001.005S)" Standard ROM
+*Font Palatino-Italic: Standard "(001.005S)" Standard ROM
+*Font Palatino-Roman: Standard "(001.005S)" Standard ROM
+*Font Symbol: Special "(001.007S)" Special ROM
+*Font Times-Bold: Standard "(001.007S)" Standard ROM
+*Font Times-BoldItalic: Standard "(001.009S)" Standard ROM
+*Font Times-Italic: Standard "(001.007S)" Standard ROM
+*Font Times-Roman: Standard "(001.007S)" Standard ROM
+*Font ZapfChancery-MediumItalic: Standard "(001.007S)" Standard ROM
+*Font ZapfDingbats: Special "(001.004S)" Standard ROM
+
diff --git a/PPD/Minolta-magicolor_2430_DL.ppd b/PPD/Minolta-magicolor_2430_DL.ppd
new file mode 100644
index 0000000..b098b0c
--- /dev/null
+++ b/PPD/Minolta-magicolor_2430_DL.ppd
@@ -0,0 +1,467 @@
+*PPD-Adobe: "4.3"
+*%
+*% For information on using this, and to obtain the required backend
+*% script, consult http://www.linuxprinting.org/
+*%
+*% This file is published under the GNU General Public License
+*%
+*% PPD-O-MATIC (3.0.0 or newer) generated this PPD file. It is for use with
+*% all programs and environments which use PPD files for dealing with
+*% printer capability information. The printer must be configured with the
+*% "foomatic-rip" backend filter script of Foomatic 3.0.0 or newer. This
+*% file and "foomatic-rip" work together to support PPD-controlled printer
+*% driver option access with arbitrary free software printer drivers and
+*% printing spoolers.
+*%
+*% To save this file on your disk, wait until the download has completed
+*% (the animation of the browser logo must stop) and then use the
+*% "Save as..." command in the "File" menu of your browser or in the
+*% pop-up manu when you click on this document with the right mouse button.
+*% DO NOT cut and paste this file into an editor with your mouse. This can
+*% introduce additional line breaks which lead to unexpected results.
+*%
+*% You may save this file as 'Minolta-magicolor_2430_DL-foo2zjs.ppd'
+*%
+*%
+*FormatVersion: "4.3"
+*FileVersion: "1.1"
+*LanguageVersion: English
+*LanguageEncoding: ISOLatin1
+*PCFileName: "FOO2ZJS.PPD"
+*Manufacturer: "Minolta"
+*Product: "(magicolor 2430 DL)"
+*cupsVersion: 1.0
+*cupsManualCopies: True
+*cupsModelNumber: 2
+*cupsFilter: "application/vnd.cups-postscript 0 foomatic-rip"
+*%pprRIP: foomatic-rip other
+*ModelName: "Minolta magicolor 2430 DL"
+*ShortNickName: "Minolta magico. 2430 DL foo2zjs"
+*NickName: "Minolta magicolor 2430 DL Foomatic/foo2zjs (recommended)"
+*PSVersion: "(3010.000) 550"
+*PSVersion: "(3010.000) 651"
+*PSVersion: "(3010.000) 652"
+*PSVersion: "(3010.000) 653"
+*PSVersion: "(3010.000) 704"
+*PSVersion: "(3010.000) 705"
+*PSVersion: "(3010.000) 800"
+*LanguageLevel: "3"
+*ColorDevice: True
+*DefaultColorSpace: RGB
+*FileSystem: False
+*Throughput: "1"
+*LandscapeOrientation: Plus90
+*TTRasterizer: Type42
+*1284DeviceID: "MANUFACTURER:MINOLTA-QMS;MODEL:magicolor 2430 DL;COMMAND SET:ZJS,PJL;"
+
+
+
+*VariablePaperSize: False
+
+*FoomaticIDs: Minolta-magicolor_2430_DL foo2zjs
+*FoomaticRIPCommandLine: "foo2zjs-wrapper %A"
+
+*OpenGroup: General/General
+
+*OpenUI *PageSize/Page Size: PickOne
+*FoomaticRIPOption PageSize: enum CmdLine A
+*OrderDependency: 135 AnySetup *PageSize
+*DefaultPageSize: Letter
+*PageSize Letter/Letter: "%% FoomaticRIPOptionSetting: PageSize=Letter"
+*FoomaticRIPOptionSetting PageSize=Letter: "-p1 "
+*PageSize A4/A4: "%% FoomaticRIPOptionSetting: PageSize=A4"
+*FoomaticRIPOptionSetting PageSize=A4: "-p9 "
+*PageSize A5/A5: "%% FoomaticRIPOptionSetting: PageSize=A5"
+*FoomaticRIPOptionSetting PageSize=A5: "-p11 "
+*PageSize B5/B5: "%% FoomaticRIPOptionSetting: PageSize=B5"
+*FoomaticRIPOptionSetting PageSize=B5: "-p13 "
+*PageSize Env10/Env #10: "%% FoomaticRIPOptionSetting: PageSize=Env10"
+*FoomaticRIPOptionSetting PageSize=Env10: "-p20 "
+*PageSize EnvB5/Env B5: "%% FoomaticRIPOptionSetting: PageSize=EnvB5"
+*FoomaticRIPOptionSetting PageSize=EnvB5: "-p34 "
+*PageSize EnvC5/Env C5: "%% FoomaticRIPOptionSetting: PageSize=EnvC5"
+*FoomaticRIPOptionSetting PageSize=EnvC5: "-p28 "
+*PageSize EnvDL/Env DL: "%% FoomaticRIPOptionSetting: PageSize=EnvDL"
+*FoomaticRIPOptionSetting PageSize=EnvDL: "-p27 "
+*PageSize EnvMonarch/Env Monarch: "%% FoomaticRIPOptionSetting: PageSize=EnvMonarch"
+*FoomaticRIPOptionSetting PageSize=EnvMonarch: "-p37 "
+*PageSize Executive/Executive: "%% FoomaticRIPOptionSetting: PageSize=Executive"
+*FoomaticRIPOptionSetting PageSize=Executive: "-p7 "
+*PageSize Legal/Legal: "%% FoomaticRIPOptionSetting: PageSize=Legal"
+*FoomaticRIPOptionSetting PageSize=Legal: "-p5 "
+*CloseUI: *PageSize
+
+*OpenUI *PageRegion: PickOne
+*OrderDependency: 135 AnySetup *PageRegion
+*DefaultPageRegion: Letter
+*PageRegion Letter/Letter: "%% FoomaticRIPOptionSetting: PageSize=Letter"
+*PageRegion A4/A4: "%% FoomaticRIPOptionSetting: PageSize=A4"
+*PageRegion A5/A5: "%% FoomaticRIPOptionSetting: PageSize=A5"
+*PageRegion B5/B5: "%% FoomaticRIPOptionSetting: PageSize=B5"
+*PageRegion Env10/Env #10: "%% FoomaticRIPOptionSetting: PageSize=Env10"
+*PageRegion EnvB5/Env B5: "%% FoomaticRIPOptionSetting: PageSize=EnvB5"
+*PageRegion EnvC5/Env C5: "%% FoomaticRIPOptionSetting: PageSize=EnvC5"
+*PageRegion EnvDL/Env DL: "%% FoomaticRIPOptionSetting: PageSize=EnvDL"
+*PageRegion EnvMonarch/Env Monarch: "%% FoomaticRIPOptionSetting: PageSize=EnvMonarch"
+*PageRegion Executive/Executive: "%% FoomaticRIPOptionSetting: PageSize=Executive"
+*PageRegion Legal/Legal: "%% FoomaticRIPOptionSetting: PageSize=Legal"
+*CloseUI: *PageRegion
+
+*DefaultImageableArea: Letter
+*ImageableArea Letter/Letter: "11.34 11.34 600.66 780.66"
+*ImageableArea A4/A4: "11.34 11.34 583.66 830.66"
+*ImageableArea A5/A5: "11.34 11.34 408.66 583.66"
+*ImageableArea B5/B5: "11.34 11.34 486.66 696.66"
+*ImageableArea Env10/Env #10: "11.34 11.34 285.66 672.66"
+*ImageableArea EnvB5/Env B5: "11.34 11.34 486.66 696.66"
+*ImageableArea EnvC5/Env C5: "11.34 11.34 447.66 637.66"
+*ImageableArea EnvDL/Env DL: "11.34 11.34 299.66 611.66"
+*ImageableArea EnvMonarch/Env Monarch: "11.34 11.34 267.66 528.66"
+*ImageableArea Executive/Executive: "11.34 11.34 510.66 744.66"
+*ImageableArea Legal/Legal: "11.34 11.34 600.66 996.66"
+
+*DefaultPaperDimension: Letter
+*PaperDimension Letter/Letter: "612 792"
+*PaperDimension A4/A4: "595 842"
+*PaperDimension A5/A5: "420 595"
+*PaperDimension B5/B5: "498 708"
+*PaperDimension Env10/Env #10: "297 684"
+*PaperDimension EnvB5/Env B5: "498 708"
+*PaperDimension EnvC5/Env C5: "459 649"
+*PaperDimension EnvDL/Env DL: "311 623"
+*PaperDimension EnvMonarch/Env Monarch: "279 540"
+*PaperDimension Executive/Executive: "522 756"
+*PaperDimension Legal/Legal: "612 1008"
+
+*OpenUI *InputSlot/Media Source: PickOne
+*FoomaticRIPOption InputSlot: enum CmdLine A
+*OrderDependency: 150 AnySetup *InputSlot
+*DefaultInputSlot: Auto
+*InputSlot Lower/Optional Lower Tray: "%% FoomaticRIPOptionSetting: InputSlot=Lower"
+*FoomaticRIPOptionSetting InputSlot=Lower: "-s3 "
+*InputSlot Multipurpose/Multipurpose Tray: "%% FoomaticRIPOptionSetting: InputSlot=Multipurpose"
+*FoomaticRIPOptionSetting InputSlot=Multipurpose: "-s1 "
+*InputSlot Auto/Auto Source: "%% FoomaticRIPOptionSetting: InputSlot=Auto"
+*FoomaticRIPOptionSetting InputSlot=Auto: "-s7 "
+*InputSlot Manual/Manual Feed: "%% FoomaticRIPOptionSetting: InputSlot=Manual"
+*FoomaticRIPOptionSetting InputSlot=Manual: "-s4 "
+*CloseUI: *InputSlot
+
+*OpenUI *MediaType/Media Type: PickOne
+*FoomaticRIPOption MediaType: enum CmdLine A
+*OrderDependency: 150 AnySetup *MediaType
+*DefaultMediaType: Standard
+*MediaType Envelope/Envelope: "%% FoomaticRIPOptionSetting: MediaType=Envelope"
+*FoomaticRIPOptionSetting MediaType=Envelope: "-m257 "
+*MediaType Labels/Labels: "%% FoomaticRIPOptionSetting: MediaType=Labels"
+*FoomaticRIPOptionSetting MediaType=Labels: "-m263 "
+*MediaType Letterhead/Letterhead: "%% FoomaticRIPOptionSetting: MediaType=Letterhead"
+*FoomaticRIPOptionSetting MediaType=Letterhead: "-m259 "
+*MediaType Postcard/Postcard: "%% FoomaticRIPOptionSetting: MediaType=Postcard"
+*FoomaticRIPOptionSetting MediaType=Postcard: "-m262 "
+*MediaType Standard/Standard Paper: "%% FoomaticRIPOptionSetting: MediaType=Standard"
+*FoomaticRIPOptionSetting MediaType=Standard: "-m1 "
+*MediaType ThickStock/Thick Stock: "%% FoomaticRIPOptionSetting: MediaType=ThickStock"
+*FoomaticRIPOptionSetting MediaType=ThickStock: "-m261 "
+*MediaType Transparency/Transparency: "%% FoomaticRIPOptionSetting: MediaType=Transparency"
+*FoomaticRIPOptionSetting MediaType=Transparency: "-m2 "
+*CloseUI: *MediaType
+
+*OpenUI *Duplex/Duplex Printing: PickOne
+*FoomaticRIPOption Duplex: enum CmdLine A
+*OrderDependency: 210 AnySetup *Duplex
+*DefaultDuplex: None
+*Duplex DuplexNoTumble/Long Edge (Standard): "%% FoomaticRIPOptionSetting: Duplex=DuplexNoTumble"
+*FoomaticRIPOptionSetting Duplex=DuplexNoTumble: "-d2 "
+*Duplex DuplexTumble/Short Edge (Flip): "%% FoomaticRIPOptionSetting: Duplex=DuplexTumble"
+*FoomaticRIPOptionSetting Duplex=DuplexTumble: "-d3 "
+*Duplex ManualDuplexNoTumble/Manual Long Edge (Standard): "%% FoomaticRIPOptionSetting: Duplex=ManualDuplexNoTumble"
+*FoomaticRIPOptionSetting Duplex=ManualDuplexNoTumble: "-d4 "
+*Duplex ManualDuplexTumble/Manual Short Edge (Flip): "%% FoomaticRIPOptionSetting: Duplex=ManualDuplexTumble"
+*FoomaticRIPOptionSetting Duplex=ManualDuplexTumble: "-d5 "
+*Duplex None/Off: "%% FoomaticRIPOptionSetting: Duplex=None"
+*FoomaticRIPOptionSetting Duplex=None: "-d1 "
+*CloseUI: *Duplex
+
+*OpenUI *Resolution/Resolution: PickOne
+*FoomaticRIPOption Resolution: enum CmdLine A
+*OrderDependency: 130 AnySetup *Resolution
+*DefaultResolution: 1200x600dpi
+*Resolution 600x600dpi/600x600 dpi: "%% FoomaticRIPOptionSetting: Resolution=600x600dpi"
+*FoomaticRIPOptionSetting Resolution=600x600dpi: "-r600x600 "
+*Resolution 1200x600dpi/1200x600 dpi: "%% FoomaticRIPOptionSetting: Resolution=1200x600dpi"
+*FoomaticRIPOptionSetting Resolution=1200x600dpi: "-r1200x600 "
+*Resolution 2400x600dpi/2400x600 dpi: "%% FoomaticRIPOptionSetting: Resolution=2400x600dpi"
+*FoomaticRIPOptionSetting Resolution=2400x600dpi: "-r2400x600 "
+*CloseUI: *Resolution
+
+*OpenUI *Quality/Printing Quality: PickOne
+*FoomaticRIPOption Quality: enum CmdLine A
+*OrderDependency: 110 AnySetup *Quality
+*DefaultQuality: normal
+*Quality draft/Draft: "%% FoomaticRIPOptionSetting: Quality=draft"
+*FoomaticRIPOptionSetting Quality=draft: " -t "
+*Quality normal/Normal: "%% FoomaticRIPOptionSetting: Quality=normal"
+*FoomaticRIPOptionSetting Quality=normal: " "
+*CloseUI: *Quality
+
+*OpenUI *ColorMode/Color Mode: PickOne
+*FoomaticRIPOption ColorMode: enum CmdLine A
+*OrderDependency: 120 AnySetup *ColorMode
+*DefaultColorMode: Monochrome
+*ColorMode PhotoOnly/Color - Photo Only: "%% FoomaticRIPOptionSetting: ColorMode=PhotoOnly"
+*FoomaticRIPOptionSetting ColorMode=PhotoOnly: "-c -C1 "
+*ColorMode PhotosAndText/Color - Photos and Text: "%% FoomaticRIPOptionSetting: ColorMode=PhotosAndText"
+*FoomaticRIPOptionSetting ColorMode=PhotosAndText: "-c -C2 "
+*ColorMode Color/Color: "%% FoomaticRIPOptionSetting: ColorMode=Color"
+*FoomaticRIPOptionSetting ColorMode=Color: "-c "
+*ColorMode GraphicsAndText/Color - Graphics and Text: "%% FoomaticRIPOptionSetting: ColorMode=GraphicsAndText"
+*FoomaticRIPOptionSetting ColorMode=GraphicsAndText: "-c -C3 "
+*ColorMode ICM/Color - use ICM color profile: "%% FoomaticRIPOptionSetting: ColorMode=ICM"
+*FoomaticRIPOptionSetting ColorMode=ICM: "-c -C10 "
+*ColorMode Monochrome/Monochrome: "%% FoomaticRIPOptionSetting: ColorMode=Monochrome"
+*FoomaticRIPOptionSetting ColorMode=Monochrome: " "
+*CloseUI: *ColorMode
+
+*OpenUI *Copies/Copies: PickOne
+*FoomaticRIPOption Copies: int CmdLine A
+*FoomaticRIPOptionPrototype Copies: "-n%s "
+*FoomaticRIPOptionRange Copies: 1 100
+*OrderDependency: 220 AnySetup *Copies
+*DefaultCopies: 1
+*FoomaticRIPDefaultCopies: 1
+*Copies 1/1: "%% FoomaticRIPOptionSetting: Copies=1"
+*Copies 2/2: "%% FoomaticRIPOptionSetting: Copies=2"
+*Copies 3/3: "%% FoomaticRIPOptionSetting: Copies=3"
+*Copies 4/4: "%% FoomaticRIPOptionSetting: Copies=4"
+*Copies 5/5: "%% FoomaticRIPOptionSetting: Copies=5"
+*Copies 6/6: "%% FoomaticRIPOptionSetting: Copies=6"
+*Copies 7/7: "%% FoomaticRIPOptionSetting: Copies=7"
+*Copies 8/8: "%% FoomaticRIPOptionSetting: Copies=8"
+*Copies 9/9: "%% FoomaticRIPOptionSetting: Copies=9"
+*Copies 10/10: "%% FoomaticRIPOptionSetting: Copies=10"
+*Copies 11/11: "%% FoomaticRIPOptionSetting: Copies=11"
+*Copies 12/12: "%% FoomaticRIPOptionSetting: Copies=12"
+*Copies 13/13: "%% FoomaticRIPOptionSetting: Copies=13"
+*Copies 14/14: "%% FoomaticRIPOptionSetting: Copies=14"
+*Copies 15/15: "%% FoomaticRIPOptionSetting: Copies=15"
+*Copies 16/16: "%% FoomaticRIPOptionSetting: Copies=16"
+*Copies 17/17: "%% FoomaticRIPOptionSetting: Copies=17"
+*Copies 18/18: "%% FoomaticRIPOptionSetting: Copies=18"
+*Copies 19/19: "%% FoomaticRIPOptionSetting: Copies=19"
+*Copies 20/20: "%% FoomaticRIPOptionSetting: Copies=20"
+*Copies 21/21: "%% FoomaticRIPOptionSetting: Copies=21"
+*Copies 22/22: "%% FoomaticRIPOptionSetting: Copies=22"
+*Copies 23/23: "%% FoomaticRIPOptionSetting: Copies=23"
+*Copies 24/24: "%% FoomaticRIPOptionSetting: Copies=24"
+*Copies 25/25: "%% FoomaticRIPOptionSetting: Copies=25"
+*Copies 26/26: "%% FoomaticRIPOptionSetting: Copies=26"
+*Copies 27/27: "%% FoomaticRIPOptionSetting: Copies=27"
+*Copies 28/28: "%% FoomaticRIPOptionSetting: Copies=28"
+*Copies 29/29: "%% FoomaticRIPOptionSetting: Copies=29"
+*Copies 30/30: "%% FoomaticRIPOptionSetting: Copies=30"
+*Copies 31/31: "%% FoomaticRIPOptionSetting: Copies=31"
+*Copies 32/32: "%% FoomaticRIPOptionSetting: Copies=32"
+*Copies 33/33: "%% FoomaticRIPOptionSetting: Copies=33"
+*Copies 34/34: "%% FoomaticRIPOptionSetting: Copies=34"
+*Copies 35/35: "%% FoomaticRIPOptionSetting: Copies=35"
+*Copies 36/36: "%% FoomaticRIPOptionSetting: Copies=36"
+*Copies 37/37: "%% FoomaticRIPOptionSetting: Copies=37"
+*Copies 38/38: "%% FoomaticRIPOptionSetting: Copies=38"
+*Copies 39/39: "%% FoomaticRIPOptionSetting: Copies=39"
+*Copies 40/40: "%% FoomaticRIPOptionSetting: Copies=40"
+*Copies 41/41: "%% FoomaticRIPOptionSetting: Copies=41"
+*Copies 42/42: "%% FoomaticRIPOptionSetting: Copies=42"
+*Copies 43/43: "%% FoomaticRIPOptionSetting: Copies=43"
+*Copies 44/44: "%% FoomaticRIPOptionSetting: Copies=44"
+*Copies 45/45: "%% FoomaticRIPOptionSetting: Copies=45"
+*Copies 46/46: "%% FoomaticRIPOptionSetting: Copies=46"
+*Copies 47/47: "%% FoomaticRIPOptionSetting: Copies=47"
+*Copies 48/48: "%% FoomaticRIPOptionSetting: Copies=48"
+*Copies 49/49: "%% FoomaticRIPOptionSetting: Copies=49"
+*Copies 50/50: "%% FoomaticRIPOptionSetting: Copies=50"
+*Copies 51/51: "%% FoomaticRIPOptionSetting: Copies=51"
+*Copies 52/52: "%% FoomaticRIPOptionSetting: Copies=52"
+*Copies 53/53: "%% FoomaticRIPOptionSetting: Copies=53"
+*Copies 54/54: "%% FoomaticRIPOptionSetting: Copies=54"
+*Copies 55/55: "%% FoomaticRIPOptionSetting: Copies=55"
+*Copies 56/56: "%% FoomaticRIPOptionSetting: Copies=56"
+*Copies 57/57: "%% FoomaticRIPOptionSetting: Copies=57"
+*Copies 58/58: "%% FoomaticRIPOptionSetting: Copies=58"
+*Copies 59/59: "%% FoomaticRIPOptionSetting: Copies=59"
+*Copies 60/60: "%% FoomaticRIPOptionSetting: Copies=60"
+*Copies 61/61: "%% FoomaticRIPOptionSetting: Copies=61"
+*Copies 62/62: "%% FoomaticRIPOptionSetting: Copies=62"
+*Copies 63/63: "%% FoomaticRIPOptionSetting: Copies=63"
+*Copies 64/64: "%% FoomaticRIPOptionSetting: Copies=64"
+*Copies 65/65: "%% FoomaticRIPOptionSetting: Copies=65"
+*Copies 66/66: "%% FoomaticRIPOptionSetting: Copies=66"
+*Copies 67/67: "%% FoomaticRIPOptionSetting: Copies=67"
+*Copies 68/68: "%% FoomaticRIPOptionSetting: Copies=68"
+*Copies 69/69: "%% FoomaticRIPOptionSetting: Copies=69"
+*Copies 70/70: "%% FoomaticRIPOptionSetting: Copies=70"
+*Copies 71/71: "%% FoomaticRIPOptionSetting: Copies=71"
+*Copies 72/72: "%% FoomaticRIPOptionSetting: Copies=72"
+*Copies 73/73: "%% FoomaticRIPOptionSetting: Copies=73"
+*Copies 74/74: "%% FoomaticRIPOptionSetting: Copies=74"
+*Copies 75/75: "%% FoomaticRIPOptionSetting: Copies=75"
+*Copies 76/76: "%% FoomaticRIPOptionSetting: Copies=76"
+*Copies 77/77: "%% FoomaticRIPOptionSetting: Copies=77"
+*Copies 78/78: "%% FoomaticRIPOptionSetting: Copies=78"
+*Copies 79/79: "%% FoomaticRIPOptionSetting: Copies=79"
+*Copies 80/80: "%% FoomaticRIPOptionSetting: Copies=80"
+*Copies 81/81: "%% FoomaticRIPOptionSetting: Copies=81"
+*Copies 82/82: "%% FoomaticRIPOptionSetting: Copies=82"
+*Copies 83/83: "%% FoomaticRIPOptionSetting: Copies=83"
+*Copies 84/84: "%% FoomaticRIPOptionSetting: Copies=84"
+*Copies 85/85: "%% FoomaticRIPOptionSetting: Copies=85"
+*Copies 86/86: "%% FoomaticRIPOptionSetting: Copies=86"
+*Copies 87/87: "%% FoomaticRIPOptionSetting: Copies=87"
+*Copies 88/88: "%% FoomaticRIPOptionSetting: Copies=88"
+*Copies 89/89: "%% FoomaticRIPOptionSetting: Copies=89"
+*Copies 90/90: "%% FoomaticRIPOptionSetting: Copies=90"
+*Copies 91/91: "%% FoomaticRIPOptionSetting: Copies=91"
+*Copies 92/92: "%% FoomaticRIPOptionSetting: Copies=92"
+*Copies 93/93: "%% FoomaticRIPOptionSetting: Copies=93"
+*Copies 94/94: "%% FoomaticRIPOptionSetting: Copies=94"
+*Copies 95/95: "%% FoomaticRIPOptionSetting: Copies=95"
+*Copies 96/96: "%% FoomaticRIPOptionSetting: Copies=96"
+*Copies 97/97: "%% FoomaticRIPOptionSetting: Copies=97"
+*Copies 98/98: "%% FoomaticRIPOptionSetting: Copies=98"
+*Copies 99/99: "%% FoomaticRIPOptionSetting: Copies=99"
+*Copies 100/100: "%% FoomaticRIPOptionSetting: Copies=100"
+*CloseUI: *Copies
+
+*FoomaticRIPOption PrinterType: enum CmdLine A 110
+*FoomaticRIPOptionSetting PrinterType=Color: " "
+
+*CloseGroup: General
+
+*OpenGroup: Adjustment/Adjustment
+
+*OpenUI *ICM/ICM Color Profile: PickOne
+*FoomaticRIPOption ICM: enum CmdLine A
+*OrderDependency: 300 AnySetup *ICM
+*DefaultICM: DL2312
+*ICM DL2312/File DL2312.icm: "%% FoomaticRIPOptionSetting: ICM=DL2312"
+*FoomaticRIPOptionSetting ICM=DL2312: "-GDL2312.icm "
+*ICM DL2324/File DL2324.icm: "%% FoomaticRIPOptionSetting: ICM=DL2324"
+*FoomaticRIPOptionSetting ICM=DL2324: "-GDL2324.icm "
+*ICM km2430_2/File km2430_2.icm: "%% FoomaticRIPOptionSetting: ICM=km2430_2"
+*FoomaticRIPOptionSetting ICM=km2430_2: "-Gkm2430_2.icm "
+*ICM none/No ICM color correction: "%% FoomaticRIPOptionSetting: ICM=none"
+*FoomaticRIPOptionSetting ICM=none: " "
+*ICM testing/File testing.icm: "%% FoomaticRIPOptionSetting: ICM=testing"
+*FoomaticRIPOptionSetting ICM=testing: "-Gtesting.icm "
+*ICM user1/File user1.icm: "%% FoomaticRIPOptionSetting: ICM=user1"
+*FoomaticRIPOptionSetting ICM=user1: "-Guser1.icm "
+*ICM user2/File user2.icm: "%% FoomaticRIPOptionSetting: ICM=user2"
+*FoomaticRIPOptionSetting ICM=user2: "-Guser2.icm "
+*ICM user3/File user3.icm: "%% FoomaticRIPOptionSetting: ICM=user3"
+*FoomaticRIPOptionSetting ICM=user3: "-Guser3.icm "
+*ICM user4/File user4.icm: "%% FoomaticRIPOptionSetting: ICM=user4"
+*FoomaticRIPOptionSetting ICM=user4: "-Guser4.icm "
+*CloseUI: *ICM
+
+*OpenUI *Intent/ICM Color Profile Intent: PickOne
+*FoomaticRIPOption Intent: enum CmdLine A
+*OrderDependency: 310 AnySetup *Intent
+*DefaultIntent: Perceptual
+*Intent Absolute/Absolute Intent: "%% FoomaticRIPOptionSetting: Intent=Absolute"
+*FoomaticRIPOptionSetting Intent=Absolute: "-I3 "
+*Intent Colorimetric/Colorimetric Intent: "%% FoomaticRIPOptionSetting: Intent=Colorimetric"
+*FoomaticRIPOptionSetting Intent=Colorimetric: "-I1 "
+*Intent Perceptual/Perceptual Intent: "%% FoomaticRIPOptionSetting: Intent=Perceptual"
+*FoomaticRIPOptionSetting Intent=Perceptual: "-I0 "
+*Intent Saturation/Saturation Intent: "%% FoomaticRIPOptionSetting: Intent=Saturation"
+*FoomaticRIPOptionSetting Intent=Saturation: "-I2 "
+*CloseUI: *Intent
+
+*CloseGroup: Adjustment
+
+*OpenGroup: Miscellaneous/Miscellaneous
+
+*OpenUI *Nup/N-up Printing: PickOne
+*FoomaticRIPOption Nup: enum CmdLine A
+*OrderDependency: 200 AnySetup *Nup
+*DefaultNup: 1up
+*Nup 1up/1-up: "%% FoomaticRIPOptionSetting: Nup=1up"
+*FoomaticRIPOptionSetting Nup=1up: " "
+*Nup 2up/2-up: "%% FoomaticRIPOptionSetting: Nup=2up"
+*FoomaticRIPOptionSetting Nup=2up: "-2 "
+*Nup 3up/3-up: "%% FoomaticRIPOptionSetting: Nup=3up"
+*FoomaticRIPOptionSetting Nup=3up: "-3 "
+*Nup 4up/4-up: "%% FoomaticRIPOptionSetting: Nup=4up"
+*FoomaticRIPOptionSetting Nup=4up: "-4 "
+*Nup 6up/6-up: "%% FoomaticRIPOptionSetting: Nup=6up"
+*FoomaticRIPOptionSetting Nup=6up: "-6 "
+*Nup 8up/8-up: "%% FoomaticRIPOptionSetting: Nup=8up"
+*FoomaticRIPOptionSetting Nup=8up: "-8 "
+*Nup 10up/10-up: "%% FoomaticRIPOptionSetting: Nup=10up"
+*FoomaticRIPOptionSetting Nup=10up: "-10 "
+*Nup 12up/12-up: "%% FoomaticRIPOptionSetting: Nup=12up"
+*FoomaticRIPOptionSetting Nup=12up: "-12 "
+*Nup 14up/14-up: "%% FoomaticRIPOptionSetting: Nup=14up"
+*FoomaticRIPOptionSetting Nup=14up: "-14 "
+*Nup 15up/15-up: "%% FoomaticRIPOptionSetting: Nup=15up"
+*FoomaticRIPOptionSetting Nup=15up: "-15 "
+*Nup 16up/16-up: "%% FoomaticRIPOptionSetting: Nup=16up"
+*FoomaticRIPOptionSetting Nup=16up: "-16 "
+*Nup 18up/18-up: "%% FoomaticRIPOptionSetting: Nup=18up"
+*FoomaticRIPOptionSetting Nup=18up: "-18 "
+*CloseUI: *Nup
+
+*OpenUI *NupOrient/N-up Orientation: PickOne
+*FoomaticRIPOption NupOrient: enum CmdLine A
+*OrderDependency: 200 AnySetup *NupOrient
+*DefaultNupOrient: port
+*NupOrient land/Landscape: "%% FoomaticRIPOptionSetting: NupOrient=land"
+*FoomaticRIPOptionSetting NupOrient=land: "-ol "
+*NupOrient port/Portrait: "%% FoomaticRIPOptionSetting: NupOrient=port"
+*FoomaticRIPOptionSetting NupOrient=port: " "
+*NupOrient sea/Seascape: "%% FoomaticRIPOptionSetting: NupOrient=sea"
+*FoomaticRIPOptionSetting NupOrient=sea: "-os "
+*CloseUI: *NupOrient
+
+*CloseGroup: Miscellaneous
+
+
+*% Generic boilerplate PPD stuff as standard PostScript fonts and so on
+
+*DefaultFont: Courier
+*Font AvantGarde-Book: Standard "(001.006S)" Standard ROM
+*Font AvantGarde-BookOblique: Standard "(001.006S)" Standard ROM
+*Font AvantGarde-Demi: Standard "(001.007S)" Standard ROM
+*Font AvantGarde-DemiOblique: Standard "(001.007S)" Standard ROM
+*Font Bookman-Demi: Standard "(001.004S)" Standard ROM
+*Font Bookman-DemiItalic: Standard "(001.004S)" Standard ROM
+*Font Bookman-Light: Standard "(001.004S)" Standard ROM
+*Font Bookman-LightItalic: Standard "(001.004S)" Standard ROM
+*Font Courier: Standard "(002.004S)" Standard ROM
+*Font Courier-Bold: Standard "(002.004S)" Standard ROM
+*Font Courier-BoldOblique: Standard "(002.004S)" Standard ROM
+*Font Courier-Oblique: Standard "(002.004S)" Standard ROM
+*Font Helvetica: Standard "(001.006S)" Standard ROM
+*Font Helvetica-Bold: Standard "(001.007S)" Standard ROM
+*Font Helvetica-BoldOblique: Standard "(001.007S)" Standard ROM
+*Font Helvetica-Narrow: Standard "(001.006S)" Standard ROM
+*Font Helvetica-Narrow-Bold: Standard "(001.007S)" Standard ROM
+*Font Helvetica-Narrow-BoldOblique: Standard "(001.007S)" Standard ROM
+*Font Helvetica-Narrow-Oblique: Standard "(001.006S)" Standard ROM
+*Font Helvetica-Oblique: Standard "(001.006S)" Standard ROM
+*Font NewCenturySchlbk-Bold: Standard "(001.009S)" Standard ROM
+*Font NewCenturySchlbk-BoldItalic: Standard "(001.007S)" Standard ROM
+*Font NewCenturySchlbk-Italic: Standard "(001.006S)" Standard ROM
+*Font NewCenturySchlbk-Roman: Standard "(001.007S)" Standard ROM
+*Font Palatino-Bold: Standard "(001.005S)" Standard ROM
+*Font Palatino-BoldItalic: Standard "(001.005S)" Standard ROM
+*Font Palatino-Italic: Standard "(001.005S)" Standard ROM
+*Font Palatino-Roman: Standard "(001.005S)" Standard ROM
+*Font Symbol: Special "(001.007S)" Special ROM
+*Font Times-Bold: Standard "(001.007S)" Standard ROM
+*Font Times-BoldItalic: Standard "(001.009S)" Standard ROM
+*Font Times-Italic: Standard "(001.007S)" Standard ROM
+*Font Times-Roman: Standard "(001.007S)" Standard ROM
+*Font ZapfChancery-MediumItalic: Standard "(001.007S)" Standard ROM
+*Font ZapfDingbats: Special "(001.004S)" Standard ROM
+
diff --git a/README b/README
new file mode 100644
index 0000000..f44ff53
--- /dev/null
+++ b/README
@@ -0,0 +1,140 @@
+ ---------------------------------------------------------------------
+ Please read the "INSTALL" file to see how to install this software.
+ Please read the "INSTALL" file to see how to install this software.
+ Please read the "INSTALL" file to see how to install this software.
+
+ Mac OS X users: also read the "INSTALL-osx.txt" file.
+ ---------------------------------------------------------------------
+
+GENERAL
+ FOO2ZJS
+ -------
+ foo2zjs converts pbm (B/W) images and 1-bit-per-pixel cmyk images
+ (both produced by ghostscript) to Zenographics ZJ-stream format. There
+ is some information about the ZJS format at http://ddk.zeno.com.
+
+ With foo2zjs, you can print to some HP and Minolta/QMS ZjStream
+ printers, such as these:
+
+ - Konica Minolta magicolor 2430 DL B/W and color
+ - Minolta/QMS 2300 DL B/W and color
+ - Minolta/QMS 2200 DL B/W and color
+ - HP LaserJet 1020 B/W
+ - HP LaserJet 1018 B/W
+ - HP LaserJet 1005 B/W
+ - HP LaserJet 1000 B/W
+
+ FOO2HP
+ ------
+ foo2hp converts pbm (B/W) images and N-bit-per-pixel cmyk images
+ (both produced by ghostscript) to Zenographics ZJ-stream format. There
+ is some information about the ZJS format at http://ddk.zeno.com.
+
+ With foo2hp, you can print to some HP ZjStream printers, such as these:
+
+ - HP Color LaserJet 2600n B/W and color
+
+ FOO2OAK
+ -------
+ foo2oak converts pbm (B/W) images and 1-bit-per-pixel cmyk images
+ (both produced by ghostscript) to Oak Technology (now Zoran) OAKT
+ format.
+
+ With foo2oak, you can print to the HP LaserJet 1500 and possibly other
+ OAKT protocol printers, such as these:
+
+ - HP LaserJet 1500 B/W and color, but only 1-bit per pixel
+
+Please read the manual pages for more details on the program operation.
+
+ $ acroread manual.pdf
+
+BUGS AND DEFICIENCIES
+ - Need to tune the manufacturer-supplied ICM color profiles to match the
+ characteristics of Ghostscript.
+
+ - Need to figure out how to get near-invisible dithering out of Ghostscript
+ without affecting the colors. With GS 7.05, if you set -dDITHERING=150,
+ for example, the dithering becomes less visible but you get areas of
+ color blotches. No way to win.
+
+ - Ghostscript 8.0 has worse color dithering compared to 7.05. The symptom
+ is slanted bands separated by 0.5 to 2mm, at a 30 degree angle.
+
+ - Need to support a better input color file format which includes
+ explicit page boundary indications. The current use of the Ghostscript
+ "bitcmyk" format precludes having pages of different sizes within a
+ Postscript stream.
+
+ - It is not entirely clear whether the JBIG-KIT compression library
+ produces compressed data compatible with all implementations of JBIG
+ in ZjStream printers. It is possible that bugs or subtle
+ implementation differences might result in incorrect printer behavior.
+
+AUTHORS
+ FOO2ZJS
+ -------
+ The foo2zjs engine program began life as Robert Szalai's 'pbmtozjs'
+ program. It also uses Markus Kuhn's JBIG-KIT compression library
+ (included, but available at http://www.cl.cam.ac.uk/~mgk25/jbigkit/),
+ and Marti Maria's icc2ps program (included, but also available at
+ http://www.littlecms.com).
+
+ The foo2zjs engine was overhauled by Rick Richardson to add color
+ support for the Minolta/QMS 2300DL, add command line options, limit
+ data chunk size to 65536 bytes, and other miscellaneous features.
+ Rick also contributed the zjsdecode program and the foomatic database
+ entries for the Minolta/QMS magicolor 2300 DL.
+
+ The latest version of foo2zjs can be found at:
+
+ http://foo2zjs.rkkda.com
+ wget http://foo2zjs.rkkda.com/foo2zjs.tar.gz
+
+ FOO2HP
+ -------
+ The foo2hp engine was written entirely from scratch by Rick Richardson.
+
+ The latest version of foo2hp can be found at:
+
+ ${URLHP}
+ wget ${URLHP}/foo2zjs.tar.gz
+ FOO2OAK
+ -------
+ The foo2oak engine was written entirely from scratch by Rick Richardson.
+
+ The latest version of foo2oak can be found at:
+
+ http://foo2oak.rkkda.com
+ wget http://foo2zjs.rkkda.com/foo2zjs.tar.gz
+
+You can contact the current author at mailto://rick.richardson@comcast.net
+I do not read or reply to HTML email or messages sent under an alias.
+
+LICENSE
+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.
+
+If you want to use this program under different license conditions,
+then contact the author for an arrangement.
+
+PATENTS
+It is possible that certain products which can be built using the jbig
+software module might form inventions protected by patent rights in
+some countries (e.g., by patents about arithmetic coding algorithms
+owned by IBM and AT&T in the USA). Provision of this software by the
+author does NOT include any licences for any patents. In those
+countries where a patent licence is required for certain applications
+of this software module, you will have to obtain such a licence
+yourself.
diff --git a/README.in b/README.in
new file mode 100644
index 0000000..11b1e20
--- /dev/null
+++ b/README.in
@@ -0,0 +1,140 @@
+ ---------------------------------------------------------------------
+ Please read the "INSTALL" file to see how to install this software.
+ Please read the "INSTALL" file to see how to install this software.
+ Please read the "INSTALL" file to see how to install this software.
+
+ Mac OS X users: also read the "INSTALL-osx.txt" file.
+ ---------------------------------------------------------------------
+
+GENERAL
+ FOO2ZJS
+ -------
+ foo2zjs converts pbm (B/W) images and 1-bit-per-pixel cmyk images
+ (both produced by ghostscript) to Zenographics ZJ-stream format. There
+ is some information about the ZJS format at http://ddk.zeno.com.
+
+ With foo2zjs, you can print to some HP and Minolta/QMS ZjStream
+ printers, such as these:
+
+ - Konica Minolta magicolor 2430 DL B/W and color
+ - Minolta/QMS 2300 DL B/W and color
+ - Minolta/QMS 2200 DL B/W and color
+ - HP LaserJet 1020 B/W
+ - HP LaserJet 1018 B/W
+ - HP LaserJet 1005 B/W
+ - HP LaserJet 1000 B/W
+
+ FOO2HP
+ ------
+ foo2hp converts pbm (B/W) images and N-bit-per-pixel cmyk images
+ (both produced by ghostscript) to Zenographics ZJ-stream format. There
+ is some information about the ZJS format at http://ddk.zeno.com.
+
+ With foo2hp, you can print to some HP ZjStream printers, such as these:
+
+ - HP Color LaserJet 2600n B/W and color
+
+ FOO2OAK
+ -------
+ foo2oak converts pbm (B/W) images and 1-bit-per-pixel cmyk images
+ (both produced by ghostscript) to Oak Technology (now Zoran) OAKT
+ format.
+
+ With foo2oak, you can print to the HP LaserJet 1500 and possibly other
+ OAKT protocol printers, such as these:
+
+ - HP LaserJet 1500 B/W and color, but only 1-bit per pixel
+
+Please read the manual pages for more details on the program operation.
+
+ $ acroread manual.pdf
+
+BUGS AND DEFICIENCIES
+ - Need to tune the manufacturer-supplied ICM color profiles to match the
+ characteristics of Ghostscript.
+
+ - Need to figure out how to get near-invisible dithering out of Ghostscript
+ without affecting the colors. With GS 7.05, if you set -dDITHERING=150,
+ for example, the dithering becomes less visible but you get areas of
+ color blotches. No way to win.
+
+ - Ghostscript 8.0 has worse color dithering compared to 7.05. The symptom
+ is slanted bands separated by 0.5 to 2mm, at a 30 degree angle.
+
+ - Need to support a better input color file format which includes
+ explicit page boundary indications. The current use of the Ghostscript
+ "bitcmyk" format precludes having pages of different sizes within a
+ Postscript stream.
+
+ - It is not entirely clear whether the JBIG-KIT compression library
+ produces compressed data compatible with all implementations of JBIG
+ in ZjStream printers. It is possible that bugs or subtle
+ implementation differences might result in incorrect printer behavior.
+
+AUTHORS
+ FOO2ZJS
+ -------
+ The foo2zjs engine program began life as Robert Szalai's 'pbmtozjs'
+ program. It also uses Markus Kuhn's JBIG-KIT compression library
+ (included, but available at http://www.cl.cam.ac.uk/~mgk25/jbigkit/),
+ and Marti Maria's icc2ps program (included, but also available at
+ http://www.littlecms.com).
+
+ The foo2zjs engine was overhauled by Rick Richardson to add color
+ support for the Minolta/QMS 2300DL, add command line options, limit
+ data chunk size to 65536 bytes, and other miscellaneous features.
+ Rick also contributed the zjsdecode program and the foomatic database
+ entries for the Minolta/QMS magicolor 2300 DL.
+
+ The latest version of foo2zjs can be found at:
+
+ ${URLZJS}
+ wget ${URLZJS}/foo2zjs.tar.gz
+
+ FOO2HP
+ -------
+ The foo2hp engine was written entirely from scratch by Rick Richardson.
+
+ The latest version of foo2hp can be found at:
+
+ ${URLHP}
+ wget ${URLHP}/foo2zjs.tar.gz
+ FOO2OAK
+ -------
+ The foo2oak engine was written entirely from scratch by Rick Richardson.
+
+ The latest version of foo2oak can be found at:
+
+ ${URLOAK}
+ wget ${URLZJS}/foo2zjs.tar.gz
+
+You can contact the current author at mailto://rick.richardson@comcast.net
+I do not read or reply to HTML email or messages sent under an alias.
+
+LICENSE
+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.
+
+If you want to use this program under different license conditions,
+then contact the author for an arrangement.
+
+PATENTS
+It is possible that certain products which can be built using the jbig
+software module might form inventions protected by patent rights in
+some countries (e.g., by patents about arithmetic coding algorithms
+owned by IBM and AT&T in the USA). Provision of this software by the
+author does NOT include any licences for any patents. In those
+countries where a patent licence is required for certain applications
+of this software module, you will have to obtain such a licence
+yourself.
diff --git a/align.ps b/align.ps
new file mode 100644
index 0000000..2e0d816
--- /dev/null
+++ b/align.ps
@@ -0,0 +1,227 @@
+%!PS-Adobe-3.0
+%%Pages: 1
+%%Title: Alignment testpage for Ghostscript
+%%Creator: Dieter Stueken (<EMAIL: PROTECTED>)
+%%BeginProlog
+% Source: http://www.geocrawler.com/archives/3/378/1997/1/50/2064509/
+
+/rectdraw % <x0> <y0> <x1> <y1> rectdraw -
+ { exch 4 -1 roll exch 2 array astore {0 moveto 0 PH rlineto stroke} forall
+ 2 array astore {0 exch moveto PW 0 rlineto stroke} forall
+ } bind def
+
+/arrow % <ang> <x0> <y0> arrow
+ { gsave translate rotate
+ 0 0 moveto 20 60 lineto -20 60 lineto closepath stroke
+ 0 0 moveto 0 80 lineto stroke
+ grestore
+ } bind def
+
+/triangle { % len ang x y
+ gsave translate dup rotate exch
+ 0 setlinewidth
+ 0 0 moveto
+ dup 0 lineto
+ dup 0.98 mul dup 10 div lineto
+ closepath
+ gsave 0.65 setgray fill grestore stroke
+ 100 10 moveto
+ 100 100 2 index {
+ gsave 0 -12 rmoveto 0 24 rlineto stroke grestore
+ gsave 0 24 rmoveto 10 div 2 index neg rotate
+ cvi =string cvs -6 -4 rmoveto show grestore
+ 100 10 rmoveto
+ } for
+ 0 0 moveto
+ 0 10 2 index {
+ pop
+ gsave 0 -6 rmoveto 0 12 rlineto stroke grestore
+ 10 1 rmoveto
+ } for
+ pop pop
+ grestore
+} bind def
+
+/round {dup 3 1 roll mul cvi exch div} def
+
+/Show { % print value or unfold array
+ dup type /realtype eq {100 round} if
+ dup type /nulltype eq
+ { pop (-NULL-) show}
+ {dup type /arraytype eq
+ { ([ ) show {Show} forall ( ]) show}
+ {=string cvs show ( ) show}
+ ifelse }
+ ifelse
+} bind def
+
+/Pval { % key val, move down 1 line
+ gsave exch
+ gsave Show (:) show grestore
+ 150 0 rmoveto Show
+ grestore
+ 0 -12 rmoveto
+} bind def
+
+/showtext {
+ /S 80 string def
+ { currentfile S readline pop dup (%END) eq { pop exit } if
+ gsave show grestore 0 -12 rmoveto
+ } loop
+} bind def
+
+/.knownget { 2 copy known { get true } { pop pop false } ifelse } bind def
+
+%%EndProlog
+%%BeginSetup
+
+% you may try different settings here, but start with default settings first
+%<<
+% /.HWMargins [8.5 38.0 10.5 12.5]
+% /Margins [-35 -51]
+%>> setpagedevice
+%
+
+%%EndSetup
+%%Page: 1
+
+% printout all values
+
+/Helvetica findfont
+12 scalefont setfont
+120 756 moveto
+
+showtext
+Current settings:
+
+%END
+
+[/OutputDevice
+ /Margins
+ /.HWMargins
+ /.MarginsHWResolution
+ /HWResolution
+ /PageOffset
+ /PageSize
+] { currentpagedevice 1 index
+ .knownget not {(-undefined-)} if Pval
+} forall
+
+showtext
+
+Graphics alignment:
+
+Let the distance in inches from the left edge of the page to the
+vertical line be H, and from the bottom edge to the horizontal line
+be V. You may define the alignment of your page to the paper by
+
+ << /Margins [x y] >> setpagedevice
+with
+%END
+
+gsave
+/res currentpagedevice /.MarginsHWResolution .knownget not {600} if def
+( x = (1 - H) * ) show res 0 get =string cvs show
+(, y = (V - 1) * ) show res 1 get =string cvs show
+grestore 0 -12 rmoveto
+
+showtext
+
+If set correctly the drawn arrows should extend into the
+papers corners (not the clipping corners). After archieving
+that, you may continue with the clipping edges.
+
+The clipping edges may be set by
+
+ << /.HWMargins [ml mb mr mt] >> setpagedevice
+
+where [ml mb mr mt] are the distances of the clipped edges of
+your graphics relative to the papers edges (left bottom right top)
+measured in 1/72 inches. The wedge shaped rules may be used to
+define these values very accurately as its intersections are in
+1/72 inches. Take the value at the cutoff point from the scale to
+the next clockwise edge.
+
+Start setting the margin values to all zero to see the natural hardware
+clipping of your printer. You should then define the margins just as big
+enough to keep the defined margins within your printers real hardware
+clipping. This is archieved if you can see the thin line drawn all around
+your defined margin. In addition the thin drawn arrows are just touching
+the margin and should be totally visible.
+
+When you put this settings into your inititializing file "gs_init.ps"
+you may want to apply this setting to a specific printer device only.
+Here is an example of a printer specific setup:
+
+<<
+ /ljet4 << % make entries for some device
+ /.HWMargins [16.0 13.2 13.0 11.1]
+ /Margins [-132 -92]
+ >>
+ /ljet2p << % and for an other devices, too
+ /.HWMargins [14.4 6.8 14.5 17.5]
+ /Margins [-60 -23]
+ >>
+>> currentpagedevice /OutputDevice get
+.knownget {setpagedevice} if
+%END
+
+% get page size
+currentpagedevice /PageSize get aload pop
+/PH exch def
+/PW exch def
+
+1 setlinewidth
+PW 0 0 0 triangle
+PH 90 PW 0 triangle
+PW 180 PW PH triangle
+PH 270 0 PH triangle
+
+% get clipping values
+clippath pathbbox newpath
+
+% show clipping box
+gsave
+1 setlinewidth % 0.65 setgray
+4 copy rectdraw
+grestore
+
+/CT exch def
+/CR exch def
+/CB exch def
+/CL exch def
+
+% draw the alignment lines
+0 setlinewidth
+72 0 moveto 0 CT rlineto stroke
+0 72 moveto CR 0 rlineto stroke
+
+2 setlinewidth
+1 setlinejoin
+1 setlinecap
+
+0 200 moveto 71 0 rlineto -24 -12 rlineto 0 24 rlineto 24 -12 rlineto stroke
+34 206 moveto (H) show
+
+144 0 moveto 0 71 rlineto -12 -24 rlineto 24 0 rlineto -12 24 rlineto stroke
+150 34 moveto (V) show
+
+
+% draw arrows into to the papers corners
+1 setlinewidth
+45
+90 sub dup 0 0 arrow
+90 sub dup 0 PH arrow
+90 sub dup PW PH arrow
+90 sub dup PW 0 arrow
+pop %45
+
+% draw arrows touching the clipping edges
+0 setlinewidth
+ 0 PW 2 div CB arrow
+180 PW 2 div CT arrow
+-90 CL PH 2 div arrow
+ 90 CR PH 2 div arrow
+
+showpage
+%%EOF \ No newline at end of file
diff --git a/arm2hpdl.c b/arm2hpdl.c
new file mode 100644
index 0000000..0aa261a
--- /dev/null
+++ b/arm2hpdl.c
@@ -0,0 +1,251 @@
+#include <stdio.h>
+#include <stdlib.h>
+#include <stdarg.h>
+#include <string.h>
+#include <sys/types.h>
+#include <sys/stat.h>
+#include <unistd.h>
+
+/*
+ * Global option flags
+ */
+int Debug = 0;
+
+void
+debug(int level, char *fmt, ...)
+{
+ va_list ap;
+
+ if (Debug < level)
+ return;
+
+ va_start(ap, fmt);
+ vfprintf(stderr, fmt, ap);
+ va_end(ap);
+}
+
+int
+error(int fatal, char *fmt, ...)
+{
+ va_list ap;
+
+ if (fatal)
+ fprintf(stderr, "Error: ");
+ else
+ fprintf(stderr, "Warning: ");
+ va_start(ap, fmt);
+ vfprintf(stderr, fmt, ap);
+ va_end(ap);
+
+ if (fatal > 0)
+ exit(fatal);
+ else
+ return (fatal);
+}
+
+void
+usage(void)
+{
+ fprintf(stderr,
+"Usage:\n"
+" arm2hpdl [options] sihp1005.img > sihp1005.dl\n"
+"\n"
+" Add HP download header/trailer to an ARM ELF binary.\n"
+" If the file already has an HP header, just copy it to stdout.\n"
+"\n"
+"Options:\n"
+" -D lvl Set Debug level [%d]\n"
+ , Debug
+ );
+
+ exit(1);
+}
+
+/*
+ * Compute HP-style checksum
+ */
+long
+docheck(long check, unsigned char *buf, int len)
+{
+ int i;
+
+ if (len & 1)
+ error(1, "We should never see an odd number of bytes in this app.\n");
+
+ for (i = 0; i < len; i += 2)
+ check += (buf[i]<<0) | (buf[i+1]<<8);
+ return check;
+}
+
+int
+main(int argc, char *argv[])
+{
+ extern int optind;
+ extern char *optarg;
+ int c;
+ int rc;
+ unsigned char buf[BUFSIZ];
+ int len;
+ FILE *fp;
+ struct stat stats;
+ int size;
+ unsigned char elf[4];
+ long check;
+ int iself;
+ int ispjl;
+
+ while ( (c = getopt(argc, argv, "D:?h")) != EOF)
+ switch (c)
+ {
+ case 'D':
+ Debug = atoi(optarg);
+ break;
+ default:
+ usage();
+ exit(1);
+ }
+
+ argc -= optind;
+ argv += optind;
+
+ if (argc != 1)
+ usage();
+
+ /*
+ * Open the file and figure out if its an ELF file
+ * by reading the first 4 bytes.
+ */
+ fp = fopen(argv[0], "r");
+ if (!fp)
+ error(1, "Can't open '%s'\n", argv[0]);
+
+ len = fread(elf, 1, sizeof(elf), fp);
+ if (len != 4)
+ error(1, "Premature EOF on '%s'\n", argv[0]);
+
+ iself = 0;
+ ispjl = 0;
+ check = 0;
+ if (memcmp(elf, "\177ELF", 4) == 0)
+ {
+ /*
+ * Its an ELF executable file
+ */
+ unsigned char filhdr[17] =
+ {
+ 0xbe, 0xef, 'A', 'B', 'C', 'D', 'E', 'F', 'G', 'H',
+ 0, 0, 0, 0, /* size goes here */
+ 0, 0, 0,
+ };
+ unsigned char sechdr[12] =
+ {
+ 0xc0, 0xde, 'A', 'B', 'C', 'D', 'E', 'F', 'G', 'H', 0, 0
+ };
+
+ iself = 1;
+
+ /*
+ * Create and write the file header
+ */
+ rc = stat(argv[0], &stats);
+ if (rc < 0)
+ error(1, "Can't stat '%s'\n", argv[0]);
+
+ size = stats.st_size + 12 + 4;
+
+ filhdr[10] = size>>24;
+ filhdr[11] = size>>16;
+ filhdr[12] = size>> 8;
+ filhdr[13] = size>> 0;
+
+ fwrite(filhdr, 1, sizeof(filhdr), stdout);
+
+ /*
+ * Create and write the section header
+ */
+ //memset(sechdr+2, 0, sizeof(sechdr)-2);
+
+ check = docheck(check, sechdr, sizeof(sechdr));
+ fwrite(sechdr, 1, sizeof(sechdr), stdout);
+ }
+ else if (memcmp(elf, "\276\357AB", 4) == 0)
+ {
+ /*
+ * This file already has an HP download header.
+ * Don't change it.
+ */
+ if (Debug)
+ error(0, "This file already has an HP header. "
+ "I will just copy it to stdout.\n");
+ }
+ else if (memcmp(elf, "20", 2) == 0)
+ {
+ unsigned char hdr[8];
+
+ ispjl = 1;
+ printf("\033%%-12345X@PJL ENTER LANGUAGE=ACL\r\n");
+
+ rc = stat(argv[0], &stats);
+ if (rc < 0)
+ error(1, "Can't stat '%s'\n", argv[0]);
+
+ size = stats.st_size - 8;
+
+ hdr[0] = 0x00;
+ hdr[1] = 0xac;
+ hdr[2] = 0xc0;
+ hdr[3] = 0xde;
+ hdr[4] = size>>24;
+ hdr[5] = size>>16;
+ hdr[6] = size>> 8;
+ hdr[7] = size>> 0;
+
+ fwrite(hdr, 1, sizeof(hdr), stdout);
+ }
+ else
+ {
+ error(1, "I don't understand this file at all!\n");
+ }
+
+ /*
+ * Write out the 4 bytes we read earlier
+ */
+ if (iself)
+ check = docheck(check, elf, sizeof(elf));
+ fwrite(elf, 1, sizeof(elf), stdout);
+
+ /*
+ * Write out the remainder of the file
+ */
+ while ( (len = fread(buf, 1, sizeof(buf), fp)) )
+ {
+ if (iself)
+ check = docheck(check, buf, len);
+ fwrite(buf, 1, len, stdout);
+ }
+
+ fclose(fp);
+
+ /*
+ * Add the file trailer
+ */
+ if (iself)
+ {
+ /*
+ * Add in the checksum carries and complement it
+ */
+ while (check >> 16)
+ check = (check&0xffff) + (check>>16);
+ check = ~check;
+
+ putchar(0xff);
+ putchar(0xff);
+ putchar((check >> 0) & 0xff);
+ putchar((check >> 8) & 0xff);
+ debug(1, "checksum = %lx\n", check);
+ }
+ if (ispjl)
+ printf("\033%%-12345X");
+
+ exit(0);
+}
diff --git a/c5200mono.prn b/c5200mono.prn
new file mode 100644
index 0000000..dd5cec6
--- /dev/null
+++ b/c5200mono.prn
Binary files differ
diff --git a/crd/2300w-1200@150-l250-kx,ucr100,0-per.crd b/crd/2300w-1200@150-l250-kx,ucr100,0-per.crd
new file mode 100644
index 0000000..fe056d2
--- /dev/null
+++ b/crd/2300w-1200@150-l250-kx,ucr100,0-per.crd
@@ -0,0 +1,4684 @@
+<<
+/ColorRenderingType 1
+/BlackPoint [0.000000 0.000000 0.000000]
+/WhitePoint [0.964200 1.000000 0.824900]
+% Bradford Cone Space
+/MatrixPQR [0.8951 -0.7502 0.0389 0.2664 1.7135 -0.0685 -0.1614 0.0367 1.0296 ]
+/RangePQR [ -0.5 2 -0.5 2 -0.5 2 ]
+% VonKries-like transform in Bradford Cone Space
+/TransformPQR [
+{exch pop exch 3 get mul exch pop exch 3 get div} bind
+{exch pop exch 4 get mul exch pop exch 4 get div} bind
+{exch pop exch 5 get mul exch pop exch 5 get div} bind
+]
+/EncodeLMN [
+{ 0.964200 div dup 0.008856 le {7.787 mul 16 116 div add}{1 3 div exp} ifelse } bind
+{ 1.000000 div dup 0.008856 le {7.787 mul 16 116 div add}{1 3 div exp} ifelse } bind
+{ 0.824900 div dup 0.008856 le {7.787 mul 16 116 div add}{1 3 div exp} ifelse } bind
+]
+/MatrixABC [ 0 1 0 1 -1 1 0 0 -1 ]
+/EncodeABC [
+{ 116 mul 16 sub 100 div } bind
+{ 500 mul 128 add 255 div } bind
+{ 200 mul 128 add 255 div } bind
+]
+/RenderTable [ 33 33 33 [
+<170A00D7170A00D7170A00D7170A00D7170A00D7170A00D7170A00D7170A00
+D7170A00D7170A00D7170A00D7170A00D7170A00D7170A00D7170A00D7170A
+00D7170A00D7170A00D7170A00D7170A00D7170A00D7170A00D7170A00D717
+0A00D7170A00D7170A00D7170A00D7170A00D7170A00D7170A00D7170A00D7
+170A00D7170A00D7170A00D7170A00D7170A00D7170A00D7170A00D7170A00
+D7170A00D7170A00D7170A00D7170A00D7170A00D7170A00D7170A00D7170A
+00D7170A00D7170A00D7170A00D7170A00D7170A00D7170A00D7170A00D717
+0A00D7170A00D7170A00D7170A00D7170A00D7170A00D7170A00D7170A00D7
+170A00D7170A00D7170A00D7170A00D7170A00D7170A00D7170A00D7170A00
+D7170A00D7170A00D7170A00D7170A00D7170A00D7170A00D7170A00D7170A
+00D7170A00D7170A00D7170A00D7170A00D7170A00D7170A00D7170A00D717
+0A00D7170A00D7170A00D7170A00D7170A00D7170A00D7170A00D7170A00D7
+170A00D7170A00D7170A00D7170A00D7170A00D7170A00D7170A00D7170A00
+D7170A00D7170A00D7170A00D7170A00D7170A00D7170A00D7170A00D7170A
+00D7170A00D7170A00D7170A00D7170A00D7170A00D7170A00D7170A00D717
+0A00D7170A00D7170A00D7170A00D7170A00D7170A00D7170A00D7170A00D7
+170A00D7170A00D7170A00D7170A00D7170A00D7170A00D7170A00D7170A00
+D7170A00D7170A00D7170A00D7170A00D7170A00D7170A00D7170A00D7170A
+00D7170A00D7170A00D7170A00D7170A00D7170A00D7170A00D7170A00D717
+0A00D7170A00D7170A00D7170A00D7170A00D7170A00D7170A00D7170A00D7
+170A00D7170A00D7170A00D7170A00D7170A00D7170A00D7170A00D7170A00
+D7170A00D7170A00D7170A00D7170A00D7170A00D7170A00D7170A00D7170A
+00D7170A00D7170A00D7170A00D7170A00D7170A00D7170A00D7170A00D717
+0A00D7170A00D7170A00D7170A00D7170A00D7170A00D7170A00D7170A00D7
+170A00D7170A00D7170A00D7170A00D7170A00D7170A00D7170A00D7170A00
+D7170A00D7170A00D7170A00D7170A00D7170A00D7170A00D7170A00D7170A
+00D7170A00D7170A00D7170A00D7170A00D7170A00D7170A00D7170A00D717
+0A00D7170A00D7170A00D7170A00D7170A00D7170A00D7170A00D7170A00D7
+170A00D7170A00D7170A00D7170A00D7170A00D7170A00D7170A00D7170A00
+D7170A00D7170A00D7170A00D7170A00D7170A00D7170A00D7170A00D7170A
+00D7170A00D7170A00D7170A00D7170A00D7170A00D7170A00D7170A00D717
+0A00D7170A00D7170A00D7170A00D7170A00D7170A00D7170A00D7170A00D7
+170A00D7170A00D7170A00D7170A00D7170A00D7170A00D7170A00D7170A00
+D7170A00D7170A00D7170A00D7170A00D7170A00D7170A00D7170A00D7170A
+00D7170A00D7170A00D7170A00D7170A00D7170A00D7170A00D7170A00D717
+0A00D7170A00D7170A00D7170A00D7170A00D7170A00D7170A00D7170A00D7
+170A00D7170A00D7170A00D7170A00D7170A00D7170A00D7170A00D7170A00
+D7170A00D7170A00D7170A00D7170A00D7170A00D7170A00D7170A00D7170A
+00D7170A00D7170A00D7170A00D7170A00D7170A00D7170A00D7170A00D717
+0A00D7170A00D7170A00D7170A00D7170A00D7170A00D7170A00D7170A00D7
+170A00D7170A00D7170A00D7170A00D7170A00D7170A00D7170A00D7170A00
+D7170A00D7170A00D7170A00D7170A00D7170A00D7170A00D7170A00D7170A
+00D7170A00D7170A00D7170A00D7170A00D7170A00D7170A00D7170A00D717
+0A00D7170A00D7170A00D7170A00D7170A00D7170A00D7170A00D7170A00D7
+170A00D7170A00D7170A00D7170A00D7170A00D7170A00D7170A00D7170A00
+D7170A00D7170A00D7170A00D7170A00D7170A00D7170A00D7170A00D7170A
+00D7170A00D7170A00D7170A00D7170A00D7170A00D7170A00D7170A00D717
+0A00D7170A00D7170A00D7170A00D7170A00D7170A00D7170A00D7170A00D7
+170A00D7170A00D7170A00D7170A00D7170A00D7170A00D7170A00D7170A00
+D7170A00D7170A00D7170A00D7170A00D7170A00D7170A00D7170A00D7170A
+00D7170A00D7170A00D7170A00D7170A00D7170A00D7170A00D7170A00D717
+0A00D7170A00D7170A00D7170A00D7170A00D7170A00D7170A00D7170A00D7
+170A00D7170A00D7170A00D7170A00D7170A00D7170A00D7170A00D7170A00
+D7170A00D7170A00D7170A00D7170A00D7170A00D7170A00D7170A00D7170A
+00D7170A00D7170A00D7170A00D7170A00D7170A00D7170A00D7170A00D717
+0A00D7170A00D7170A00D7170A00D7170A00D7170A00D7170A00D7170A00D7
+170A00D7170A00D7170A00D7170A00D7170A00D7170A00D7170A00D7170A00
+D7170A00D7170A00D7170A00D7170A00D7170A00D7170A00D7170A00D7170A
+00D7170A00D7170A00D7170A00D7170A00D7170A00D7170A00D7170A00D717
+0A00D7170A00D7170A00D7170A00D7170A00D7170A00D7170A00D7170A00D7
+170A00D7170A00D7170A00D7170A00D7170A00D7170A00D7170A00D7170A00
+D7170A00D7170A00D7170A00D7170A00D7170A00D7170A00D7170A00D7170A
+00D7170A00D7170A00D7170A00D7170A00D7170A00D7170A00D7170A00D717
+0A00D7170A00D7170A00D7170A00D7170A00D7170A00D7170A00D7170A00D7
+170A00D7170A00D7170A00D7170A00D7170A00D7170A00D7170A00D7170A00
+D7170A00D7170A00D7170A00D7170A00D7170A00D7170A00D7170A00D7170A
+00D7170A00D7170A00D7170A00D7170A00D7170A00D7170A00D7170A00D717
+0A00D7170A00D7170A00D7170A00D7170A00D7170A00D7170A00D7170A00D7
+170A00D7170A00D7170A00D7170A00D7170A00D7170A00D7170A00D7170A00
+D7170A00D7170A00D7170A00D7170A00D7170A00D7170A00D7170A00D7170A
+00D7170A00D7170A00D7170A00D7170A00D7170A00D7170A00D7170A00D717
+0A00D7170A00D7170A00D7170A00D7170A00D7170A00D7170A00D7170A00D7
+170A00D7170A00D7170A00D7170A00D7170A00D7170A00D7170A00D7170A00
+D7170A00D7170A00D7170A00D7170A00D7170A00D7170A00D7170A00D7170A
+00D7170A00D7170A00D7170A00D7170A00D7170A00D7170A00D7170A00D717
+0A00D7170A00D7170A00D7170A00D7170A00D7170A00D7170A00D7170A00D7
+170A00D7170A00D7170A00D7170A00D7170A00D7170A00D7170A00D7170A00
+D7170A00D7170A00D7170A00D7170A00D7170A00D7170A00D7170A00D7170A
+00D7170A00D7170A00D7170A00D7170A00D7170A00D7170A00D7170A00D717
+0A00D7170A00D7170A00D7170A00D7170A00D7170A00D7170A00D7170A00D7
+170A00D7170A00D7170A00D7170A00D7170A00D7170A00D7170A00D7170A00
+D7170A00D7170A00D7170A00D7170A00D7170A00D7170A00D7170A00D7170A
+00D7170A00D7170A00D7170A00D7170A00D7170A00D7170A00D7170A00D717
+0A00D7170A00D7170A00D7170A00D7170A00D7170A00D7170A00D7170A00D7
+170A00D7170A00D7170A00D7170A00D7170A00D7170A00D7170A00D7170A00
+D7170A00D7170A00D7170A00D7170A00D7170A00D7170A00D7170A00D7170A
+00D7170A00D7170A00D7170A00D7170A00D7170A00D7170A00D7170A00D717
+0A00D7170A00D7170A00D7170A00D7170A00D7170A00D7170A00D7170A00D7
+170A00D7170A00D7170A00D7170A00D7170A00D7170A00D7170A00D7170A00
+D7170A00D7170A00D7170A00D7170A00D7170A00D7170A00D7170A00D7170A
+00D7170A00D7170A00D7170A00D7170A00D7170A00D7170A00D7170A00D717
+0A00D7170A00D7170A00D7170A00D7170A00D7170A00D7170A00D7170A00D7
+170A00D7170A00D7170A00D7170A00D7170A00D7170A00D7170A00D7170A00
+D7170A00D7170A00D7170A00D7170A00D7170A00D7170A00D7170A00D7170A
+00D7170A00D7170A00D7170A00D7170A00D7170A00D7170A00D7170A00D717
+0A00D7170A00D7170A00D7170A00D7170A00D7170A00D7170A00D7170A00D7
+170A00D7170A00D7170A00D7170A00D7170A00D7170A00D7170A00D7170A00
+D7170A00D7170A00D7170A00D7170A00D7170A00D7170A00D7170A00D7170A
+00D7170A00D7170A00D7170A00D7170A00D7170A00D7170A00D7170A00D717
+0A00D7170A00D7170A00D7170A00D7170A00D7170A00D7170A00D7170A00D7
+170A00D7170A00D7170A00D7170A00D7170A00D7170A00D7170A00D7170A00
+D7170A00D7170A00D7170A00D7170A00D7170A00D7170A00D7170A00D7170A
+00D7170A00D7170A00D7170A00D7170A00D7170A00D7170A00D7170A00D717
+0A00D7170A00D7170A00D7170A00D7170A00D7170A00D7170A00D7170A00D7
+170A00D7170A00D7170A00D7170A00D7170A00D7170A00D7170A00D7170A00
+D7170A00D7170A00D7170A00D7170A00D7170A00D7170A00D7170A00D7170A
+00D7170A00D7170A00D7170A00D7170A00D7170A00D7170A00D7170A00D717
+0A00D7170A00D7170A00D7170A00D7170A00D7170A00D7170A00D7170A00D7
+170A00D7170A00D7170A00D7170A00D7170A00D7170A00D7170A00D7170A00
+D7170A00D7170A00D7170A00D7170A00D7170A00D7170A00D7170A00D7170A
+00D7170A00D7170A00D7170A00D7170A00D7170A00D7170A00D7170A00D717
+0A00D7170A00D7170A00D7170A00D7170A00D7170A00D7170A00D7170A00D7
+170A00D7170A00D7170A00D7170A00D7170A00D7170A00D7170A00D7170A00
+D7170A00D7170A00D7170A00D7170A00D7170A00D7170A00D7170A00D7170A
+00D7170A00D7170A00D7170A00D7170A00D7170A00D7170A00D7170A00D717
+0A00D7170A00D7170A00D7170A00D7170A00D7170A00D7170A00D7170A00D7
+170A00D7170A00D7170A00D7170A00D7170A00D7170A00D7170A00D7170A00
+D7170A00D7170A00D7170A00D7170A00D7170A00D7170A00D7170A00D7170A
+00D7170A00D7170A00D7170A00D7170A00D7170A00D7170A00D7170A00D717
+0A00D7170A00D7170A00D7170A00D7170A00D7170A00D7170A00D7170A00D7
+170A00D7170A00D7170A00D7170A00D7170A00D7170A00D7170A00D7170A00
+D7170A00D7170A00D7170A00D7170A00D7170A00D7170A00D7170A00D7170A
+00D7170A00D7170A00D7170A00D7170A00D7170A00D7170A00D7170A00D717
+0A00D7170A00D7170A00D7170A00D7170A00D7170A00D7170A00D7170A00D7
+170A00D7170A00D7170A00D7170A00D7170A00D7170A00D7170A00D7170A00
+D7170A00D7170A00D7170A00D7170A00D7170A00D7170A00D7170A00D7170A
+00D7170A00D7170A00D7170A00D7170A00D7170A00D7170A00D7170A00D717
+0A00D7170A00D7170A00D7170A00D7170A00D7170A00D7170A00D7170A00D7
+170A00D7170A00D7170A00D7170A00D7170A00D7170A00D7170A00D7170A00
+D7170A00D7170A00D7170A00D7170A00D7170A00D7170A00D7170A00D7170A
+00D7170A00D7170A00D7170A00D7170A00D7170A00D7170A00D7170A00D717
+0A00D7170A00D7170A00D7170A00D7170A00D7170A00D7170A00D7170A00D7
+170A00D7170A00D7170A00D7170A00D7170A00D7170A00D7170A00D7170A00
+D7170A00D7170A00D7170A00D7170A00D7170A00D7170A00D7170A00D7170A
+00D7170A00D7170A00D7170A00D7170A00D7170A00D7170A00D7170A00D717
+0A00D7170A00D7170A00D7170A00D7170A00D7170A00D7170A00D7170A00D7
+170A00D7170A00D7170A00D7170A00D7170A00D7170A00D7170A00D7170A00
+D7170A00D7170A00D7170A00D7170A00D7170A00D7170A00D7170A00D7170A
+00D7170A00D7170A00D7170A00D7170A00D7170A00D7170A00D7170A00D717
+0A00D7170A00D7170A00D7170A00D7170A00D7170A00D7170A00D7170A00D7
+170A00D7170A00D7170A00D7170A00D7>
+<A5580000AA5D0000AF640000B66D0000BD790000C9850000E4900004FF9906
+03FFA01300FFA21A08FF97181FFF921C2CBA6C0160F99B4D17622500994E05
+02B5300009C2220013C2220013C2220013C2220013C2220013C2220013C222
+0013C2220013C2220013C2220013C2220013C2220013C2220013C2220013C2
+220013C2220013C2A5580000AA5D0000AF640000B66D0000BD790000C98500
+00E4900004FF990603FFA01300FFA21A08FF97181FFF921C2CBA6C0160F99B
+4D17622500994E0502B5300009C2220013C2220013C2220013C2220013C222
+0013C2220013C2220013C2220013C2220013C2220013C2220013C2220013C2
+220013C2220013C2220013C2220013C2A5580000AA5D0000AF640000B66D00
+00BD790000C9850000E4900004FF990603FFA01300FFA21A08FF97181FFF92
+1C2CBA6C0160F99B4D17622500994E0502B5300009C2220013C2220013C222
+0013C2220013C2220013C2220013C2220013C2220013C2220013C2220013C2
+220013C2220013C2220013C2220013C2220013C2220013C2A5580000AA5D00
+00AF640000B66D0000BD790000C9850000E4900004FF990603FFA01300FFA2
+1A08FF97181FFF921C2CBA6C0160F99B4D17622500994E0502B5300009C222
+0013C2220013C2220013C2220013C2220013C2220013C2220013C2220013C2
+220013C2220013C2220013C2220013C2220013C2220013C2220013C2220013
+C2A5580000AA5D0000AF640000B66D0000BD790000C9850000E4900004FF99
+0603FFA01300FFA21A08FF97181FFF921C2CBA6C0160F99B4D17622500994E
+0502B5300009C2220013C2220013C2220013C2220013C2220013C2220013C2
+220013C2220013C2220013C2220013C2220013C2220013C2220013C2220013
+C2220013C2220013C2A5580000AA5D0000AF640000B66D0000BD790000C985
+0000E4900004FF990603FFA01300FFA21A08FF97181FFF921C2CBA6C0160F9
+9B4D17622500994E0502B5300009C2220013C2220013C2220013C2220013C2
+220013C2220013C2220013C2220013C2220013C2220013C2220013C2220013
+C2220013C2220013C2220013C2220013C2A5580000AA5D0000AF640000B66D
+0000BD790000C9850000E4900004FF990603FFA01300FFA21A08FF97181FFF
+921C2CBA6C0160F99B4D17622500994E0502B5300009C2220013C2220013C2
+220013C2220013C2220013C2220013C2220013C2220013C2220013C2220013
+C2220013C2220013C2220013C2220013C2220013C2220013C2A5580000AA5D
+0000AF640000B66D0000BD790000C9850000E4900004FF990603FFA01300FF
+A21A08FF97181FFF921C2CBA6C0160F99B4D17622500994E0502B5300009C2
+220013C2220013C2220013C2220013C2220013C2220013C2220013C2220013
+C2220013C2220013C2220013C2220013C2220013C2220013C2220013C22200
+13C2A5580000AA5D0000AF640000B66D0000BD790000C9850000E4900004FF
+990603FFA01300FFA21A08FF97181FFF921C2CBA6C0160F99B4D1762250099
+4E0502B5300009C2220013C2220013C2220013C2220013C2220013C2220013
+C2220013C2220013C2220013C2220013C2220013C2220013C2220013C22200
+13C2220013C2220013C2A5580000AA5D0000AF640000B66D0000BD790000C9
+850000E4900004FF990603FFA01300FFA21A08FF97181FFF921C2CBA6C0160
+F99B4D17622500994E0502B5300009C2220013C2220013C2220013C2220013
+C2220013C2220013C2220013C2220013C2220013C2220013C2220013C22200
+13C2220013C2220013C2220013C2220013C2A5580000AA5D0000AF640000B6
+6D0000BD790000C9850000E4900004FF990603FFA01300FFA21A08FF97181F
+FF921C2CBA6C0160F99B4D17622500994E0502B5300009C2220013C2220013
+C2220013C2220013C2220013C2220013C2220013C2220013C2220013C22200
+13C2220013C2220013C2220013C2220013C2220013C2220013C2A5580000AA
+5D0000AF640000B66D0000BD790000C9850000E4900004FF990603FFA01300
+FFA21A08FF97181FFF921C2CBA6C0160F99B4D17622500994E0502B5300009
+C2220013C2220013C2220013C2220013C2220013C2220013C2220013C22200
+13C2220013C2220013C2220013C2220013C2220013C2220013C2220013C222
+0013C2A5580000AA5D0000AF640000B66D0000BD790000C9850000E4900004
+FF990603FFA01300FFA21A08FF97181FFF921C2CBA6C0160F99B4D17622500
+994E0502B5300009C2220013C2220013C2220013C2220013C2220013C22200
+13C2220013C2220013C2220013C2220013C2220013C2220013C2220013C222
+0013C2220013C2220013C2A5580000AA5D0000AF640000B66D0000BD790000
+C9850000E4900004FF990603FFA01300FFA21A08FF97181FFF921C2CBA6C01
+60F99B4D17622500994E0502B5300009C2220013C2220013C2220013C22200
+13C2220013C2220013C2220013C2220013C2220013C2220013C2220013C222
+0013C2220013C2220013C2220013C2220013C2A5580000AA5D0000AF640000
+B66D0000BD790000C9850000E4900004FF990603FFA01300FFA21A08FF9718
+1FFF921C2CBA6C0160F99B4D17622500994E0502B5300009C2220013C22200
+13C2220013C2220013C2220013C2220013C2220013C2220013C2220013C222
+0013C2220013C2220013C2220013C2220013C2220013C2220013C2A5580000
+A95D0000AF640000B56E0000BC7A0000C8850000E1900003FC9A0603FFA112
+00FFA51A05FF9A161EFF951B2AC475015CCB86302F6F3C0E77480900B63301
+05C41D0013C61D0013C61D0013C61D0013C61D0013C61D0013C61D0013C61D
+0013C61D0013C61D0013C61D0013C61D0013C61D0013C61D0013C61D0013C6
+1D0013C6A4590000A95E0000AE650000B46E0000BB7A0000C6850000DE9100
+02FC9C0502FFA31000FFA81A01FF9F141DFF9A1A28D08101569E68026AB180
+3932481D00A6260D00C6060809D1060809D1060809D1060809D1060809D106
+0809D1060809D1060809D1060809D1060809D1060809D1060809D1060809D1
+060809D1060809D1060809D1A4590000A85E0000AE650000B36E0000BA7A00
+00C5860000DA910001FA9D0501FFA40D00FFAB1901FFA71715FFA01925D489
+00519B730167CFAC46273E42098B172E00B0002A01B9002A01B9002A01B900
+2A01B9002A01B9002A01B9002A01B9002A01B9002A01B9002A01B9002A01B9
+002A01B9002A01B9002A01B9002A01B9002A01B9A4590000A85E0000AD6500
+00B36E0000B97A0000C3860000D8920000F99E0401FFA60B00FFAE1600FFB0
+1B0CFFA91622CE98014AAF980754DFD85013AFB24E21074000AA004103AC00
+4103AC004103AC004103AC004103AC004103AC004103AC004103AC004103AC
+004103AC004103AC004103AC004103AC004103AC004103AC004103ACA45900
+00A85E0000AC660000B26F0000B87A0000C1860000D6920000FAA00300FFA8
+0900FFB11400FFB41C05FFB91A18BEA70045B6C1143BCDDD4A1ABEE8651001
+4900A62A6728642A6728642A6728642A6728642A6728642A6728642A672864
+2A6728642A6728642A6728642A6728642A6728642A6728642A6728642A6728
+642A672864A3590000A75F0000AC660000B16F0000B67B0000C0870000D393
+0000FCA20200FFA90900FFB11400FFBC1D05FDC40528A9B60042A8D8143A89
+D21F4BBBFF6B10005000A2A9EA9503A9EA9503A9EA9503A9EA9503A9EA9503
+A9EA9503A9EA9503A9EA9503A9EA9503A9EA9503A9EA9503A9EA9503A9EA95
+03A9EA9503A9EA9503A9EA9503A35A0000A65F0000AB660000B0700000B57B
+0000BF870000D2930000FCA20200FFA90900FFB51201FFCA0D12D7D80028B6
+DE16238CF3034D98FF342E74E6353D0070019792E1830E92E1830E92E1830E
+92E1830E92E1830E92E1830E92E1830E92E1830E92E1830E92E1830E92E183
+0E92E1830E92E1830E92E1830E92E1830E92E1830EA35A0000A65F0000AA66
+0000AF700000B57B0000BF870000D2930000FCA10200FFAB0800F7BD030CE3
+D5001ABDEF0025C6FF360080FF0B4655FA045E3EC418620081078E71D67023
+71D6702371D6702371D6702371D6702371D6702371D6702371D6702371D670
+2371D6702371D6702371D6702371D6702371D6702371D6702371D67023A25A
+0000A5600000AA670000AF700000B57B0000BF870000D2930000FCA10200E1
+AE0104D8C4000DBFDF0019B6FC16119EFF211466FF034B40F600610CAB0080
+00AA068260DC6D3260DC6D3260DC6D3260DC6D3260DC6D3260DC6D3260DC6D
+3260DC6D3260DC6D3260DC6D3260DC6D3260DC6D3260DC6D3260DC6D3260DC
+6D3260DC6D32A25A0000A5600000AA670000AF700000B57B0000BE870000D1
+920000C49E0001C2AE0005BDCA000CABE90016A7FF180D77FF023252FF004C
+30FA00620ACE017818F91E6546DC624246DC624246DC624246DC624246DC62
+4246DC624246DC624246DC624246DC624246DC624246DC624246DC624246DC
+624246DC624246DC624246DC6242A25A0000A5600000AA660000AF700000B5
+7B0000BE870000B7930000B1A00001B1B20005AACF000D9BED00158AFF051C
+64FF003744FF004E21F8006507E007723EFF56464CFF76334CFF76334CFF76
+334CFF76334CFF76334CFF76334CFF76334CFF76334CFF76334CFF76334CFF
+76334CFF76334CFF76334CFF76334CFF76334CFF7633A25A0000A55F0000AA
+660000AF700000B57B0000B1870000A9940000A7A20002A6B800069BD1000D
+8EF000147AFF021F53FF003A34FF005215F7006602EE0D6D29FF4F4D4AFF7D
+2B4AFF7D2B4AFF7D2B4AFF7D2B4AFF7D2B4AFF7D2B4AFF7D2B4AFF7D2B4AFF
+7D2B4AFF7D2B4AFF7D2B4AFF7D2B4AFF7D2B4AFF7D2B4AFF7D2B4AFF7D2BA2
+5A0000A55F0000AA660000AF700000AE7B0000A5890000A09600009FA60002
+99BC00078FD4000E83F4001467FF002446FF003C26FF00560AF8006503FF1B
+650CFF415946FF7E2646FF7E2646FF7E2646FF7E2646FF7E2646FF7E2646FF
+7E2646FF7E2646FF7E2646FF7E2646FF7E2646FF7E2646FF7E2646FF7E2646
+FF7E2646FF7E26A25A0000A55F0000AA660000AE700000A27D00009C8B0000
+9999000197AA000391C1000785D9000D78F9001557FF002A3AFF003F1AFF00
+5803FD066217FF384F1DFF534111FF654811FF654811FF654811FF654811FF
+654811FF654811FF654811FF654811FF654811FF654811FF654811FF654811
+FF654811FF654811FF654811FF6548A25A0000A55F0000AA660000A0720000
+997F0000958D0000929C000190B000038AC600067FE3000C6CFE001747F900
+2E2CFF00450FFF005705FD145917FF42473BFF6F2100FF5F4F00FF5F4F00FF
+5F4F00FF5F4F00FF5F4F00FF5F4F00FF5F4F00FF5F4F00FF5F4F00FF5F4F00
+FF5F4F00FF5F4F00FF5F4F00FF5F4F00FF5F4F00FF5F4FA25A0000A55F0000
+9E68000096740000928200008E9000008CA0000189B4000384CE000578EE00
+0B5CF9001B3CF9003126FF074106FF005608FF224F1CFF4C3A20FF652F02FF
+644802FF644802FF644802FF644802FF644802FF644802FF644802FF644802
+FF644802FF644802FF644802FF644802FF644802FF644802FF644802FF6448
+A25A00009D610000936B00008E7600008B8400008892000086A3000183BA00
+0180DD00026FF5000C48EA002337FD062F17FF004802FF09511BFF3E3915FF
+4F3A18FF64300FFF7B390FFF7B390FFF7B390FFF7B390FFF7B390FFF7B390F
+FF7B390FFF7B390FFF7B390FFF7B390FFF7B390FFF7B390FFF7B390FFF7B39
+0FFF7B390FFF7B399D5B0000916400008B6D00018879000085860000809500
+007FA800007FC2000078E1000261F300103BE5002529FF00360FFF034712FF
+243C1CFF48300BFF4F3B06FF613B12FF883012FF883012FF883012FF883012
+FF883012FF883012FF883012FF883012FF883012FF883012FF883012FF8830
+12FF883012FF883012FF883012FF8830>
+<A4550000A8590000AD5F0000B3660000BB700000C57C0000D6860003F38D00
+0AFF93090BFF941211FF8E171EFF710447FF852732BE5F244C871002976C00
+0AA64B0016AB4C002E9A4A00309A4A00309A4A00309A4A00309A4A00309A4A
+00309A4A00309A4A00309A4A00309A4A00309A4A00309A4A00309A4A00309A
+4A00309A4A00309AA4550000A8590000AD5F0000B3660000BB700000C57C00
+00D6860003F38D000AFF93090BFF941211FF8E171EFF710447FF852732BE5F
+244C871002976C000AA64B0016AB4C002E9A4A00309A4A00309A4A00309A4A
+00309A4A00309A4A00309A4A00309A4A00309A4A00309A4A00309A4A00309A
+4A00309A4A00309A4A00309A4A00309AA4550000A8590000AD5F0000B36600
+00BB700000C57C0000D6860003F38D000AFF93090BFF941211FF8E171EFF71
+0447FF852732BE5F244C871002976C000AA64B0016AB4C002E9A4A00309A4A
+00309A4A00309A4A00309A4A00309A4A00309A4A00309A4A00309A4A00309A
+4A00309A4A00309A4A00309A4A00309A4A00309A4A00309AA4550000A85900
+00AD5F0000B3660000BB700000C57C0000D6860003F38D000AFF93090BFF94
+1211FF8E171EFF710447FF852732BE5F244C871002976C000AA64B0016AB4C
+002E9A4A00309A4A00309A4A00309A4A00309A4A00309A4A00309A4A00309A
+4A00309A4A00309A4A00309A4A00309A4A00309A4A00309A4A00309A4A0030
+9AA4550000A8590000AD5F0000B3660000BB700000C57C0000D6860003F38D
+000AFF93090BFF941211FF8E171EFF710447FF852732BE5F244C871002976C
+000AA64B0016AB4C002E9A4A00309A4A00309A4A00309A4A00309A4A00309A
+4A00309A4A00309A4A00309A4A00309A4A00309A4A00309A4A00309A4A0030
+9A4A00309A4A00309AA4550000A8590000AD5F0000B3660000BB700000C57C
+0000D6860003F38D000AFF93090BFF941211FF8E171EFF710447FF852732BE
+5F244C871002976C000AA64B0016AB4C002E9A4A00309A4A00309A4A00309A
+4A00309A4A00309A4A00309A4A00309A4A00309A4A00309A4A00309A4A0030
+9A4A00309A4A00309A4A00309A4A00309AA4550000A8590000AD5F0000B366
+0000BB700000C57C0000D6860003F38D000AFF93090BFF941211FF8E171EFF
+710447FF852732BE5F244C871002976C000AA64B0016AB4C002E9A4A00309A
+4A00309A4A00309A4A00309A4A00309A4A00309A4A00309A4A00309A4A0030
+9A4A00309A4A00309A4A00309A4A00309A4A00309A4A00309AA4550000A859
+0000AD5F0000B3660000BB700000C57C0000D6860003F38D000AFF93090BFF
+941211FF8E171EFF710447FF852732BE5F244C871002976C000AA64B0016AB
+4C002E9A4A00309A4A00309A4A00309A4A00309A4A00309A4A00309A4A0030
+9A4A00309A4A00309A4A00309A4A00309A4A00309A4A00309A4A00309A4A00
+309AA4550000A8590000AD5F0000B3660000BB700000C57C0000D6860003F3
+8D000AFF93090BFF941211FF8E171EFF710447FF852732BE5F244C87100297
+6C000AA64B0016AB4C002E9A4A00309A4A00309A4A00309A4A00309A4A0030
+9A4A00309A4A00309A4A00309A4A00309A4A00309A4A00309A4A00309A4A00
+309A4A00309A4A00309AA4550000A8590000AD5F0000B3660000BB700000C5
+7C0000D6860003F38D000AFF93090BFF941211FF8E171EFF710447FF852732
+BE5F244C871002976C000AA64B0016AB4C002E9A4A00309A4A00309A4A0030
+9A4A00309A4A00309A4A00309A4A00309A4A00309A4A00309A4A00309A4A00
+309A4A00309A4A00309A4A00309A4A00309AA4550000A8590000AD5F0000B3
+660000BB700000C57C0000D6860003F38D000AFF93090BFF941211FF8E171E
+FF710447FF852732BE5F244C871002976C000AA64B0016AB4C002E9A4A0030
+9A4A00309A4A00309A4A00309A4A00309A4A00309A4A00309A4A00309A4A00
+309A4A00309A4A00309A4A00309A4A00309A4A00309A4A00309AA4550000A8
+590000AD5F0000B3660000BB700000C57C0000D6860003F38D000AFF93090B
+FF941211FF8E171EFF710447FF852732BE5F244C871002976C000AA64B0016
+AB4C002E9A4A00309A4A00309A4A00309A4A00309A4A00309A4A00309A4A00
+309A4A00309A4A00309A4A00309A4A00309A4A00309A4A00309A4A00309A4A
+00309AA4550000A8590000AD5F0000B3660000BB700000C57C0000D6860003
+F38D000AFF93090BFF941211FF8E171EFF710447FF852732BE5F244C871002
+976C000AA64B0016AB4C002E9A4A00309A4A00309A4A00309A4A00309A4A00
+309A4A00309A4A00309A4A00309A4A00309A4A00309A4A00309A4A00309A4A
+00309A4A00309A4A00309AA4550000A8590000AD5F0000B3660000BB700000
+C57C0000D5860003F48E0009FF940A09FF951210FF90171DFF760842F48122
+39CA6A2A41831402966D0008A74B0013AD4700299E44002B9F44002B9F4400
+2B9F44002B9F44002B9F44002B9F44002B9F44002B9F44002B9F44002B9F44
+002B9F44002B9F44002B9F44002B9F44002B9FA3550000A7590000AC5F0000
+B2660000BA710000C47C0000D3870002F6900008FF980D03FF9A150AFF9417
+1AFF831133F0821D3AFD913D23791F0293650605A94C000DB239001CAD3600
+1EAD36001EAD36001EAD36001EAD36001EAD36001EAD36001EAD36001EAD36
+001EAD36001EAD36001EAD36001EAD36001EAD36001EAD36001EADA3550000
+A75A0000AC5F0000B2670000B9710000C27D0000D1880002F4910006FF9A0C
+03FF9E1605FF991815FF911A26F1871B39D8812638762E08845C0C01AB4B02
+07B7120018C70A001BC90A001BC90A001BC90A001BC90A001BC90A001BC90A
+001BC90A001BC90A001BC90A001BC90A001BC90A001BC90A001BC90A001BC9
+0A001BC9A3550000A65A0000AB5F0000B1670000B8710000C17D0000CF8800
+01F1930006FF9B0B02FFA11700FF9F1A10FF951923F88E1A36B26B0A5C9D60
+2A444D2100A3261300BB030615CC000817CA000817CA000817CA000817CA00
+0817CA000817CA000817CA000817CA000817CA000817CA000817CA000817CA
+000817CA000817CA000817CAA2550000A65A0000AB600000B1670000B77200
+00C07D0000CD890001ED940005FF9D0A01FFA31500FFA3190DFF991821F992
+1931AA720063C59A30383F3700981C2B00AC002608B8002708B7002708B700
+2708B7002708B7002708B7002708B7002708B7002708B7002708B7002708B7
+002708B7002708B7002708B7002708B7002708B7A2560000A65A0000AA6000
+00B0670000B6720000BE7E0000CA890000E9950004FF9F0801FFA51200FFA9
+1A07FF9F1520F8A6172DC6A61F33D5C64D1AA8AC4F24144200A4114B15891D
+5420751D5420751D5420751D5420751D5420751D5420751D5420751D542075
+1D5420751D5420751D5420751D5420751D5420751D5420751D542075A25600
+00A55B0000AA600000AF680000B5720000BC7E0000C88A0000E4960002FFA1
+0700FFA81000FFAE1A03FFB91715C2AC003B9FB6004EC7F1391BADE0521F3F
+7C285935782F56AFEF9A00AFEF9A00AFEF9A00AFEF9A00AFEF9A00AFEF9A00
+AFEF9A00AFEF9A00AFEF9A00AFEF9A00AFEF9A00AFEF9A00AFEF9A00AFEF9A
+00AFEF9A00A2560000A55B0000A9610000AE680000B3730000BA7E0000C68A
+0000E4980001FFA30500FFAB0C00FFBD1107F9D1071CC8E4002CB1ED1F2186
+FF095077FA273E3A961E67288F245DABFF9901ABFF9901ABFF9901ABFF9901
+ABFF9901ABFF9901ABFF9901ABFF9901ABFF9901ABFF9901ABFF9901ABFF99
+01ABFF9901ABFF9901ABFF9901A1560000A45B0000A8610000AD690000B273
+0000B87F0000C38B0000E6990000FFA40400FFB50604F1C60112CEDF001EBB
+FC0F1CA3FC221C71FF0D4E41F00168059003891B94266491FF8B1591FF8B15
+91FF8B1591FF8B1591FF8B1591FF8B1591FF8B1591FF8B1591FF8B1591FF8B
+1591FF8B1591FF8B1591FF8B1591FF8B1591FF8B15A1570000A45B0000A862
+0000AC690000B1730000B87F0000C38B0000E6990000E8A60201D6B40007CC
+D00010B3ED001BBAFF2C007AFF033A53FF00542EF0006B00A603833DBB4F4C
+54D4653B54D4653B54D4653B54D4653B54D4653B54D4653B54D4653B54D465
+3B54D4653B54D4653B54D4653B54D4653B54D4653B54D4653B54D4653BA157
+0000A35C0000A7620000AC690000B1730000B87F0000C38B0000C6960000BD
+A30002BDB80007B2D60010A2F502189AFF1B0F63FF003F42FF00551FF2006D
+00D1067A46E563414BE86D3B4BE86D3B4BE86D3B4BE86D3B4BE86D3B4BE86D
+3B4BE86D3B4BE86D3B4BE86D3B4BE86D3B4BE86D3B4BE86D3B4BE86D3B4BE8
+6D3B4BE86D3BA1570000A35C0000A7620000AC690000B1730000B87F0000BB
+8B0000AF970000AEA60002ACBE0007A0D9001092F7021779FF022452FF0041
+31FF005911ED006C05E5176E44FF6B394DFF7D2E4DFF7D2E4DFF7D2E4DFF7D
+2E4DFF7D2E4DFF7D2E4DFF7D2E4DFF7D2E4DFF7D2E4DFF7D2E4DFF7D2E4DFF
+7D2E4DFF7D2E4DFF7D2E4DFF7D2EA1570000A35C0000A7620000AC690000B1
+730000B67F0000AA8C0000A59A0000A4AA00039EC1000992DC001086F80217
+65FF002A44FF004323FF005C06ED006B04FF236732FF653A49FF812949FF81
+2949FF812949FF812949FF812949FF812949FF812949FF812949FF812949FF
+812949FF812949FF812949FF812949FF812949FF8129A1570000A35C0000A7
+620000AC690000B1730000A6810000A08E00009D9C00019AAE000493C50009
+88E1001076FB001954FF003037FF004717FF005D03FE0E6514FF3B5531FF69
+3233FF793033FF793033FF793033FF793033FF793033FF793033FF793033FF
+793033FF793033FF793033FF793033FF793033FF793033FF793033FF7930A1
+570000A35C0000A7620000AC690000A47500009C8200009890000095A00001
+93B4000489CA000980EA000F68FE001D46FE003329FF004B0CFE015C10FD23
+5415FF454C24FF6A3400FF615200FF615200FF615200FF615200FF615200FF
+615200FF615200FF615200FF615200FF615200FF615200FF615200FF615200
+FF615200FF6152A1570000A35C0000A7620000A26B00009977000094850000
+919300008FA400018BB9000483D2000878F5000E59FB00203BFE01351DFF00
+4E03FD035A0FFF2E4C2BFF5B2E00FF594E00FF634C00FF634C00FF634C00FF
+634C00FF634C00FF634C00FF634C00FF634C00FF634C00FF634C00FF634C00
+FF634C00FF634C00FF634C00FF634CA1570000A35C0000A0630000966D0000
+917900008E8700008B96000088A8000185BF00037EDE00066EFB000F46F000
+273DFE102C12FF004E01FF0E5518FF413E2AFF612800FF5D470DFF793D0DFF
+793D0DFF793D0DFF793D0DFF793D0DFF793D0DFF793D0DFF793D0DFF793D0D
+FF793D0DFF793D0DFF793D0DFF793D0DFF793D0DFF793DA1570000A05C0000
+946600008D6F00008A7C0000878A00008399000082AC000181C9000178E900
+055AEF00163AED002925FF003D0AFF034B13FF293E18FF4A3619FF5C2F0CFF
+723913FF893313FF893313FF893313FF893313FF893313FF893313FF893313
+FF893313FF893313FF893313FF893313FF893313FF893313FF893313FF8933
+A1570000935F00008B67000186720000837E0000808C00007C9C00007CB100
+007ACF00016FED000546DF001C31EF002B1AFF003E06FF0B471BFF3B3017FF
+503001FF513D13FF812E11FF8D2E11FF8D2E11FF8D2E11FF8D2E11FF8D2E11
+FF8D2E11FF8D2E11FF8D2E11FF8D2E11FF8D2E11FF8D2E11FF8D2E11FF8D2E
+11FF8D2E11FF8D2E935A000089610001826900007F7400007C800000768E00
+00729E000073B4000070D0000159DD000D3AD9001E29F2002C12FF003D00FF
+10441DFF44280DFF4C3111FF672C11FF872A0DFF922B0DFF922B0DFF922B0D
+FF922B0DFF922B0DFF922B0DFF922B0DFF922B0DFF922B0DFF922B0DFF922B
+0DFF922B0DFF922B0DFF922B0DFF922B>
+<A3510000A6550000AB5A0000B1600000B8670000C2730000D07D0002E18200
+0AF5860014FF890C16FF851220FF660149FB711E3CC2340F68890501947600
+159B5F0028975F003A8E6B0041866B0041866B0041866B0041866B0041866B
+0041866B0041866B0041866B0041866B0041866B0041866B0041866B004186
+6B0041866B004186A3510000A6550000AB5A0000B1600000B8670000C27300
+00D07D0002E182000AF5860014FF890C16FF851220FF660149FB711E3CC234
+0F68890501947600159B5F0028975F003A8E6B0041866B0041866B0041866B
+0041866B0041866B0041866B0041866B0041866B0041866B0041866B004186
+6B0041866B0041866B0041866B004186A3510000A6550000AB5A0000B16000
+00B8670000C2730000D07D0002E182000AF5860014FF890C16FF851220FF66
+0149FB711E3CC2340F68890501947600159B5F0028975F003A8E6B0041866B
+0041866B0041866B0041866B0041866B0041866B0041866B0041866B004186
+6B0041866B0041866B0041866B0041866B0041866B004186A3510000A65500
+00AB5A0000B1600000B8670000C2730000D07D0002E182000AF5860014FF89
+0C16FF851220FF660149FB711E3CC2340F68890501947600159B5F0028975F
+003A8E6B0041866B0041866B0041866B0041866B0041866B0041866B004186
+6B0041866B0041866B0041866B0041866B0041866B0041866B0041866B0041
+86A3510000A6550000AB5A0000B1600000B8670000C2730000D07D0002E182
+000AF5860014FF890C16FF851220FF660149FB711E3CC2340F688905019476
+00159B5F0028975F003A8E6B0041866B0041866B0041866B0041866B004186
+6B0041866B0041866B0041866B0041866B0041866B0041866B0041866B0041
+866B0041866B004186A3510000A6550000AB5A0000B1600000B8670000C273
+0000D07D0002E182000AF5860014FF890C16FF851220FF660149FB711E3CC2
+340F68890501947600159B5F0028975F003A8E6B0041866B0041866B004186
+6B0041866B0041866B0041866B0041866B0041866B0041866B0041866B0041
+866B0041866B0041866B0041866B004186A3510000A6550000AB5A0000B160
+0000B8670000C2730000D07D0002E182000AF5860014FF890C16FF851220FF
+660149FB711E3CC2340F68890501947600159B5F0028975F003A8E6B004186
+6B0041866B0041866B0041866B0041866B0041866B0041866B0041866B0041
+866B0041866B0041866B0041866B0041866B0041866B004186A3510000A655
+0000AB5A0000B1600000B8670000C2730000D07D0002E182000AF5860014FF
+890C16FF851220FF660149FB711E3CC2340F68890501947600159B5F002897
+5F003A8E6B0041866B0041866B0041866B0041866B0041866B0041866B0041
+866B0041866B0041866B0041866B0041866B0041866B0041866B0041866B00
+4186A3510000A6550000AB5A0000B1600000B8670000C2730000D07D0002E1
+82000AF5860014FF890C16FF851220FF660149FB711E3CC2340F6889050194
+7600159B5F0028975F003A8E6B0041866B0041866B0041866B0041866B0041
+866B0041866B0041866B0041866B0041866B0041866B0041866B0041866B00
+41866B0041866B004186A3510000A6550000AB5A0000B1600000B8670000C2
+730000D07D0002E182000AF5860014FF890C16FF851220FF660149FB711E3C
+C2340F68890501947600159B5F0028975F003A8E6B0041866B0041866B0041
+866B0041866B0041866B0041866B0041866B0041866B0041866B0041866B00
+41866B0041866B0041866B0041866B004186A3510000A6550000AB5A0000B1
+600000B8670000C2730000D07D0002E182000AF5860014FF890C16FF851220
+FF660149FB711E3CC2340F68890501947600159B5F0028975F003A8E6B0041
+866B0041866B0041866B0041866B0041866B0041866B0041866B0041866B00
+41866B0041866B0041866B0041866B0041866B0041866B004186A3510000A6
+550000AB5A0000B1600000B8680000C2730000CF7D0002E182000AF5860014
+FF890B16FF851220FF670248FC731E3CC3361067890501947600159B5F0027
+985F00398F6B0040866B0040866B0040866B0040866B0040866B0040866B00
+40866B0040866B0040866B0040866B0040866B0040866B0040866B0040866B
+004086A3510000A6550000AB5A0000B0600000B8680000C1730000CE7E0002
+E0840009F6880012FF8C0B14FF89121DFF71083DFF781E3AD7531F4D8E1205
+8B7900109D5C00209D5700339462003D8B62003D8B62003D8B62003D8B6200
+3D8B62003D8B62003D8B62003D8B62003D8B62003D8B62003D8B62003D8B62
+003D8B62003D8B62003D8BA3520000A6560000AA5B0000B0600000B7680000
+C0740000CC7E0001DE860008F78B010FFF8F0C10FF8C121BFF7C0F31FF7617
+3FF3782E33932109827C020A9E590018A452002A9A59003A9059003A905900
+3A9059003A9059003A9059003A9059003A9059003A9059003A9059003A9059
+003A9059003A9059003A9059003A9059003A90A3520000A5560000AA5B0000
+AF610000B6680000BF740000CA7F0000DE870006F88E030BFF930E0BFF9013
+17FF881626FF730E45FF88322C99320E797F05059F5A0011A94D0021A22D01
+2EA52C012DA62C012DA62C012DA62C012DA62C012DA62C012DA62C012DA62C
+012DA62C012DA62C012DA62C012DA62C012DA62C012DA62C012DA6A2520000
+A5560000A95B0000AF610000B5690000BE740000C9800000DF890005FB9003
+09FF971105FF951413FF8E1821FF72074AEB812636A84B1B606B0D01A24801
+0AB2240018BB020027BE020027BE020027BE020027BE020027BE020027BE02
+0027BE020027BE020027BE020027BE020027BE020027BE020027BE020027BE
+020027BEA2520000A4560000A95B0000AE610000B5690000BD750000C78000
+00DE8B0003FE930307FF9B1201FF9A150EFF92181FFF7D0D3ECD72124DFFA2
+5C0D532200A0251200B4040811C1010822BE010822BE010822BE010822BE01
+0822BE010822BE010822BE010822BE010822BE010822BE010822BE010822BE
+010822BE010822BE010822BEA2520000A4570000A85B0000AD620000B46A00
+00BB750000C5810000DA8C0003FC950206FF9C1001FF9F1808FF97181BFF91
+1B29AD73005EC5982F38867C37401B2C00A601270EB3001E16B3001E16B300
+1E16B3001E16B3001E16B3001E16B3001E16B3001E16B3001E16B3001E16B3
+001E16B3001E16B3001E16B3001E16B3001E16B3A2530000A3570000A85C00
+00AD620000B36A0000BA750000C4810000D68C0001F7970205FF9F0E00FFA5
+1900FF9F1618F5A30B31A2930056DECB461ACDCE5C1835641D6705460D9DB0
+CBA001B0CBA001B0CBA001B0CBA001B0CBA001B0CBA001B0CBA001B0CBA001
+B0CBA001B0CBA001B0CBA001B0CBA001B0CBA001B0CBA001B0CBA001A15300
+00A3570000A75C0000AC620000B26A0000B8760000C1820000D28D0000F399
+0104FFA20B00FFA91403FEB60C18C7B600319AB700468AD8035393F7342D72
+A745360061009EADF99B00ACF99B00ACF99B00ACF99B00ACF99B00ACF99B00
+ACF99B00ACF99B00ACF99B00ACF99B00ACF99B00ACF99B00ACF99B00ACF99B
+00ACF99B00A1530000A3570000A65C0000AB630000B06B0000B6760000BF82
+0000CE8E0000F09B0102FFA60701F4B7030CE2CF0017BDEA0022C5FF320082
+FF084158FC055932C50E690085088C8AFC87198AFC871A8AFC871A8AFC871A
+8AFC871A8AFC871A8AFC871A8AFC871A8AFC871A8AFC871A8AFC871A8AFC87
+1A8AFC871A8AFC871A8AFC871AA1540000A2580000A65D0000AA630000AF6C
+0000B4770000BC830000C98E0000F19E0100D4A80003CEBE000ABCDA0015AB
+FB0619A0FF221065FF014741FB005D12C0007900CE027F47CC5D4547CC5D45
+47CC5D4547CC5D4547CC5D4547CC5D4547CC5D4547CC5D4547CC5D4547CC5D
+4547CC5D4547CC5D4547CC5D4547CC5D4547CC5D45A0540000A2580000A55D
+0000A9640000AE6C0000B3770000BA830000C98E0000B99A0000B8A90004B4
+C3000AA7E200139BFF081678FF022C52FF00482FFD00600AD6017422F42C5C
+4EF678344FF678344FF678344FF678344FF678344FF678344FF678344FF678
+344FF678344FF678344FF678344FF678344FF678344FF678344FF67834A055
+0000A1590000A45E0000A9640000AE6C0000B3770000BA830000AF8F0000AA
+9D0000AAAE0004A5C9000A96E5001289FF041964FF003043FF004A20FC0062
+04E3057027FF43514BFF822C4BFF832C4BFF832C4BFF832C4BFF832C4BFF83
+2C4BFF832C4BFF832C4BFF832C4BFF832C4BFF832C4BFF832C4BFF832C4BFF
+832C4BFF832CA0550000A1590000A45E0000A9640000AE6C0000B3770000AB
+840000A4910000A2A000019FB3000596CB000B8AE8001279FF021C52FF0036
+33FF004F13FD006301F911691DFF485146FF842845FF852845FF852845FF85
+2845FF852845FF852845FF852845FF852845FF852845FF852845FF852845FF
+852845FF852845FF852845FF8528A0550000A1590000A45E0000A9640000AE
+6C0000A8780000A08600009B94000099A3000296B900058BCF000C7FEE0012
+66FF002144FF003925FF005209FE01620EFF29580AFF42561CFF703F1CFF71
+3F1CFF713F1CFF713F1CFF713F1CFF713F1CFF713F1CFF713F1CFF713F1CFF
+713F1CFF713F1CFF713F1CFF713F1CFF713F1CFF713FA0550000A1590000A4
+5E0000A9640000A66E00009D7A0000988800009496000092A800028DBE0005
+83D6000B76F8001254FB002738FF003C18FF005300FB055F1AFF3F4733FF65
+2900FF645000FF654F00FF654F00FF654F00FF654F00FF654F00FF654F00FF
+654F00FF654F00FF654F00FF654F00FF654F00FF654F00FF654F00FF654FA0
+550000A1590000A45E0000A46500009A700000947D0000908A00008E9A0001
+8CAD000286C400047DE200096AFC001444F5002B37FF0E350EFF005300FF14
+5818FF46402BFF682807FF714507FF724507FF724507FF724507FF724507FF
+724507FF724507FF724507FF724507FF724507FF724507FF724507FF724507
+FF724507FF7245A0550000A1590000A35E000097670000907200008D7F0000
+8A8D0000879D000085B1000181CD000376EC000856F1001B39F7002E21FF02
+4206FF045015FF303F13FF4B3D26FF6B2513FF893613FF8B3613FF8B3613FF
+8B3613FF8B3613FF8B3613FF8B3613FF8B3613FF8B3613FF8B3613FF8B3613
+FF8B3613FF8B3613FF8B3613FF8B36A0550000A1590000956100008D690001
+89740000868200008290000080A000007FB700007DDB000071FB000744E400
+2030FB003016FF00440BFF15451BFF41320EFF4E3A01FF583F12FF8F3012FF
+903012FF903012FF903012FF903012FF903012FF903012FF903012FF903012
+FF903012FF903012FF903012FF903012FF903012FF9030A0550000955B0000
+8B630001856B0000827700007F8400007992000078A4000079BE000070D600
+0358E5001038DF002227FC00320DFF02420CFF203C1DFF4B2A09FF4F3612FF
+702E0FFF912C0FFF922C0FFF922C0FFF922C0FFF922C0FFF922C0FFF922C0F
+FF922C0FFF922C0FFF922C0FFF922C0FFF922C0FFF922C0FFF922C0FFF922C
+965600008A5D0001826500007D6E00007B790000768600006E9400006DA600
+006CBC000063D6000345D700162FE000231FFC003307FF063F0CFF293515FF
+49290EFF5A2D15FF7C260BFF98290BFF99290BFF99290BFF99290BFF99290B
+FF99290BFF99290BFF99290BFF99290BFF99290BFF99290BFF99290BFF9929
+0BFF99290BFF99298A580001805F00007A67000075700000727B00006B8800
+006396000062A600005EBA000055D2000639D3001728E4002417FD003303FF
+0E3B0BFF2F2F0EFF4A280DFF602812FF80220AFF9B250AFF9C250AFF9C250A
+FF9C250AFF9C250AFF9C250AFF9C250AFF9C250AFF9C250AFF9C250AFF9C25
+0AFF9C250AFF9C250AFF9C250AFF9C25>
+<A34E0000A5520000A9560000AF5B0000B6610000BF690000CB730001D97900
+09E87B0014FD7D041CFF780C24FD5C0048E2420060C41D007A9B010C8C8500
+248E79003D856D014286AB428141AB418042AB418042AB418042AB418042AB
+418042AB418042AB418042AB418042AB418042AB418042AB418042AB418042
+AB418042AB418042A34E0000A5520000A9560000AF5B0000B6610000BF6900
+00CB730001D9790009E87B0014FD7D041CFF780C24FD5C0048E2420060C41D
+007A9B010C8C8500248E79003D856D014286AB428141AB418042AB418042AB
+418042AB418042AB418042AB418042AB418042AB418042AB418042AB418042
+AB418042AB418042AB418042AB418042A34E0000A5520000A9560000AF5B00
+00B6610000BF690000CB730001D9790009E87B0014FD7D041CFF780C24FD5C
+0048E2420060C41D007A9B010C8C8500248E79003D856D014286AB428141AB
+418042AB418042AB418042AB418042AB418042AB418042AB418042AB418042
+AB418042AB418042AB418042AB418042AB418042AB418042A34E0000A55200
+00A9560000AF5B0000B6610000BF690000CB730001D9790009E87B0014FD7D
+041CFF780C24FD5C0048E2420060C41D007A9B010C8C8500248E79003D856D
+014286AB428141AB418042AB418042AB418042AB418042AB418042AB418042
+AB418042AB418042AB418042AB418042AB418042AB418042AB418042AB4180
+42A34E0000A5520000A9560000AF5B0000B6610000BF690000CB730001D979
+0009E87B0014FD7D041CFF780C24FD5C0048E2420060C41D007A9B010C8C85
+00248E79003D856D014286AB428141AB418042AB418042AB418042AB418042
+AB418042AB418042AB418042AB418042AB418042AB418042AB418042AB4180
+42AB418042AB418042A34E0000A5520000A9560000AF5B0000B6610000BF69
+0000CB730001D9790009E87B0014FD7D041CFF780C24FD5C0048E2420060C4
+1D007A9B010C8C8500248E79003D856D014286AB428141AB418042AB418042
+AB418042AB418042AB418042AB418042AB418042AB418042AB418042AB4180
+42AB418042AB418042AB418042AB418042A34E0000A5520000A9560000AF5B
+0000B6610000BF690000CB730001D9790009E87B0014FD7D041CFF780C24FD
+5C0048E2420060C41D007A9B010C8C8500248E79003D856D014286AB428141
+AB418042AB418042AB418042AB418042AB418042AB418042AB418042AB4180
+42AB418042AB418042AB418042AB418042AB418042AB418042A34E0000A552
+0000A9560000AF5B0000B6610000BF690000CB730001D9790009E87B0014FD
+7D041CFF780C24FD5C0048E2420060C41D007A9B010C8C8500248E79003D85
+6D014286AB428141AB418042AB418042AB418042AB418042AB418042AB4180
+42AB418042AB418042AB418042AB418042AB418042AB418042AB418042AB41
+8042A34E0000A5520000A9560000AF5B0000B6610000BF690000CB730001D9
+790009E87B0014FD7D041CFF780C24FD5C0048E2420060C41D007A9B010C8C
+8500248E79003D856D014286AB428141AB418042AB418042AB418042AB4180
+42AB418042AB418042AB418042AB418042AB418042AB418042AB418042AB41
+8042AB418042AB418042A34E0000A5520000A9560000AF5B0000B6610000BF
+690000CB730001D9790009E87B0014FD7D041CFF780C24FD5C0048E2420060
+C41D007A9B010C8C8500248E79003D856D014286AB428141AB418042AB4180
+42AB418042AB418042AB418042AB418042AB418042AB418042AB418042AB41
+8042AB418042AB418042AB418042AB418042A34E0000A5520000A9560000AF
+5B0000B5610000BF6A0000CA730001D97A0008E87D0013FD7F031CFF7D0E20
+FF610243EB48015DCA2705709801078D8600209076003788690040889E3574
+4C9E33734D9E33734D9E33734D9E33734D9E33734D9E33734D9E33734D9E33
+734D9E33734D9E33734D9E33734D9E33734D9E33734D9E33734DA34F0000A5
+520000A9560000AE5B0000B5610000BE6A0000C9740001D97B0007E87F0011
+FC81031AFF810F1DFF6A073AF6560852D53B0F5F9A06048C88001A9273002E
+8D63003D8B8E25645B8E23635C8E23635C8E23635C8E23635C8E23635C8E23
+635C8E23635C8E23635C8E23635C8E23635C8E23635C8E23635C8E23635C8E
+23635CA24F0000A4520000A8560000AE5B0000B4620000BD6A0000C8750000
+D87D0006E9810010FC830219FF840F1BFF730C31FB5D094EE353194E9F0D03
+8A88001494700026935F00388F8114546C7F13536D7F13536D7F13536D7F13
+536D7F13536D7F13536D7F13536D7F13536D7F13536D7F13536D7F13536D7F
+13536D7F13536D7F13536DA24F0000A4520000A8570000AD5C0000B3620000
+BC6B0000C7760000D67E0005E983000EFC850118FF870F19FF7D1228FD6308
+4BF46B233EA514028985020D966D001E9A5A00329474034481710243827102
+43827102438271024382710243827102438271024382710243827102438271
+02438271024382710243827102438271024382A24F0000A4520000A7570000
+AD5C0000B3620000BB6B0000C5770000D4800004E885000DFC870117FF8A0E
+17FF851522FF6A0847FF7A2835AB1E0384850408976E00189D56002B983E00
+3A9935003D9935003D9935003D9935003D9935003D9935003D9935003D9935
+003D9935003D9935003D9935003D9935003D9935003D9935003D99A2500000
+A4530000A7570000AC5C0000B2630000BA6B0000C4770000D2810003E78700
+0BFC8A0014FF8D0E14FF89151FFF68014CFF7D2536BB3A1365730E019B4A00
+0EAA2F001FAF0D002FB1040038B0040038B0040038B0040038B0040038B004
+0038B0040038B0040038B0040038B0040038B0040038B0040038B0040038B0
+040038B0A2500000A3530000A7570000AB5C0000B1630000B96C0000C27800
+00D0820002E8890009FC8F040EFF93110FFF8E151CFF770A3BFE822236B66D
+24445D290097231100AF040812BA000B29B500092EB300092EB300092EB300
+092EB300092EB300092EB300092EB300092EB300092EB300092EB300092EB3
+00092EB300092EB300092EB3A2500000A3530000A6580000AB5D0000B06300
+00B86C0000C0790000CD830001E88C0006FD940807FF991406FF941616FF90
+1629A7740058876B0668AF984C281A2E009F01280FAB00241FA90F2F298D0F
+2F298D0F2F298D0F2F298D0F2F298D0F2F298D0F2F298D0F2F298D0F2F298D
+0F2F298D0F2F298D0F2F298D0F2F298D0F2F298DA1500000A2540000A55800
+00AA5D0000AF640000B66D0000BE790000CA840001E78F0004FF980704FF9E
+1500FFA11512DC9C01349B920050899C065C9DB63F2D3365186E00480DA1B3
+CDA600AAC49F00AAC49F00AAC49F00AAC49F00AAC49F00AAC49F00AAC49F00
+AAC49F00AAC49F00AAC49F00AAC49F00AAC49F00AAC49F00AAC49F00A15000
+00A2540000A5580000A95D0000AE640000B56E0000BC7A0000C7850000E090
+0003FC9B0602FDA3050CF1B10319C1B8002A94B4003F80CE01516FD9145485
+E54E2B80D16825A5FF9F0199FFA40899FFA40899FFA40899FFA40899FFA408
+99FFA40899FFA40899FFA40899FFA40899FFA40899FFA40899FFA40899FFA4
+0899FFA408A1510000A1540000A4590000A85E0000AD650000B36E0000B97A
+0000C4860000D8910001DE9D0005D1AB000AC8C40013B1E0001CAEFF1A107C
+FE043852F800532AE3006C00AB05814BD25E4345C9604545C9604545C96045
+45C9604545C9604545C9604545C9604545C9604545C9604545C9604545C960
+4545C9604545C9604545C96045A0510000A1550000A3590000A75F0000AC66
+0000B16F0000B77B0000C0870000BE920000B49F0001B5B20006AECF000D9E
+EE011591FF0E1763FF003A42FF00511EF3006900D40B7646FE643F50FF7D31
+50FF7D3150FF7D3150FF7D3150FF7D3150FF7D3150FF7D3150FF7D3150FF7D
+3150FF7D3150FF7D3150FF7D3150FF7D3150FF7D31A0520000A1550000A35A
+0000A65F0000AB660000AF700000B57B0000B4870000AA940000A8A20002A7
+B900069CD2000E8FF1011579FF022152FF003C30FF005610F1006900F4176E
+3EFF683A4AFF862B4AFF862B4AFF862B4AFF862B4AFF862B4AFF862B4AFF86
+2B4AFF862B4AFF862B4AFF862B4AFF862B4AFF862B4AFF862B4AFF862BA052
+0000A1560000A25A0000A55F0000AA660000AF700000AE7B0000A5890000A0
+9700009FA7000399BC00078FD5000E82F5011564FF002643FF003F21FF0059
+06F604670BFF2B5E1AFF534942FF872842FF872842FF872842FF872842FF87
+2842FF872842FF872842FF872842FF872842FF872842FF872842FF872842FF
+872842FF8728A0520000A0560000A25A0000A55F0000AA660000AC700000A1
+7D00009B8B0000989A000196AB000390C2000784DB000D75FB001653FF002C
+36FF004315FF005A02FD0F6116FF404E43FF762109FF6C4C09FF6C4C09FF6C
+4C09FF6C4C09FF6C4C09FF6C4C09FF6C4C09FF6C4C09FF6C4C09FF6C4C09FF
+6C4C09FF6C4C09FF6C4C09FF6C4CA0520000A0560000A25A0000A55F0000AA
+6600009E72000098800000948E0000919D00018FB1000388C800077EE8000C
+68FE001943FA00302AFF03460AFE01590CFF24511FFF4F3C0EFF5D4300FF6A
+4D00FF6A4D00FF6A4D00FF6A4D00FF6A4D00FF6A4D00FF6A4D00FF6A4D00FF
+6A4D00FF6A4D00FF6A4D00FF6A4D00FF6A4D00FF6A4DA0520000A0560000A2
+5A0000A55F00009B69000094750000908200008D9000008BA1000187B60002
+82D1000576F2000B53F2001F3DFA072E1CFF014903FF065514FF364327FF5D
+2C04FF5D440DFF833E0DFF833E0DFF833E0DFF833E0DFF833E0DFF833E0DFF
+833E0DFF833E0DFF833E0DFF833E0DFF833E0DFF833E0DFF833E0DFF833EA0
+520000A0560000A25A000099620000906C00008C7700008985000086930000
+84A5000081BC000180E500016DFB000C42E800252EFE023511FF004908FF17
+4919FF45371DFF5D2D06FF663E12FF943312FF943312FF943312FF943312FF
+943312FF943312FF943312FF943312FF943312FF943312FF943312FF943312
+FF943312FF9433A0520000A0560000985C00008E640001886E0000857A0000
+828700007D9600007DAA00007DC5000072DE000454E6001637E6002623FF00
+380BFF074619FF32331AFF4E2F03FF503D14FF7E2F10FF972E10FF972E10FF
+972E10FF972E10FF972E10FF972E10FF972E10FF972E10FF972E10FF972E10
+FF972E10FF972E10FF972E10FF972EA0520000995700008C5E000185660000
+807000007E7C0000798900007398000073AC000072C5000165DF000542D900
+1A2EE900281AFF003904FF0A431AFF3B2B14FF4F2C0DFF612F12FF832A0DFF
+9B2B0DFF9B2B0DFF9B2B0DFF9B2B0DFF9B2B0DFF9B2B0DFF9B2B0DFF9B2B0D
+FF9B2B0DFF9B2B0DFF9B2B0DFF9B2B0DFF9B2B0DFF9B2B9B5300008C590001
+836100007C68000079720000757E00006E8B0000689A000067AC000065C500
+0156DA000937D6001B27ED002912FF013903FF153D18FF412603FF443417FF
+732310FF89260AFF9E270AFF9E270AFF9E270AFF9E270AFF9E270AFF9E270A
+FF9E270AFF9E270AFF9E270AFF9E270AFF9E270AFF9E270AFF9E270AFF9E27
+8D560000825C00017A620000746A0000707400006B800000648D00005F9C00
+005CAC000059C5000144CF00102FD8001C21F200290AFF023601FF1C3715FF
+452303FF4C2D15FF771F0DFF8B2309FFA12409FFA12409FFA12409FFA12409
+FFA12409FFA12409FFA12409FFA12409FFA12409FFA12409FFA12409FFA124
+09FFA12409FFA12483580001795D0000726400006C6C000068770000628300
+005C900000589E000054AE00004DC2000339CE001128DC001C1BF7002904FF
+0A3308FF282B14FF4C1E17FF661A11FF7A1C0BFF8E1F0AFFA21F0AFFA21F0A
+FFA21F0AFFA21F0AFFA21F0AFFA21F0AFFA21F0AFFA21F0AFFA21F0AFFA21F
+0AFFA21F0AFFA21F0AFFA21F0AFFA21F>
+<A24B0000A54E0000A8520000AD560000B45B0000BD610000C8690000D46F00
+08E1710013F571001FFF69032CF2510046D334005EC30E0179AD0016809E00
+2F7F8902457AB83C7A3FB141973C9B30A6479B30A6479B30A6479B30A6479B
+30A6479B30A6479B30A6479B30A6479B30A6479B30A6479B30A6479B30A647
+9B30A6479B30A647A24B0000A54E0000A8520000AD560000B45B0000BD6100
+00C8690000D46F0008E1710013F571001FFF69032CF2510046D334005EC30E
+0179AD0016809E002F7F8902457AB83C7A3FB141973C9B30A6479B30A6479B
+30A6479B30A6479B30A6479B30A6479B30A6479B30A6479B30A6479B30A647
+9B30A6479B30A6479B30A6479B30A647A24B0000A54E0000A8520000AD5600
+00B45B0000BD610000C8690000D46F0008E1710013F571001FFF69032CF251
+0046D334005EC30E0179AD0016809E002F7F8902457AB83C7A3FB141973C9B
+30A6479B30A6479B30A6479B30A6479B30A6479B30A6479B30A6479B30A647
+9B30A6479B30A6479B30A6479B30A6479B30A6479B30A647A24B0000A54E00
+00A8520000AD560000B45B0000BD610000C8690000D46F0008E1710013F571
+001FFF69032CF2510046D334005EC30E0179AD0016809E002F7F8902457AB8
+3C7A3FB141973C9B30A6479B30A6479B30A6479B30A6479B30A6479B30A647
+9B30A6479B30A6479B30A6479B30A6479B30A6479B30A6479B30A6479B30A6
+47A24B0000A54E0000A8520000AD560000B45B0000BD610000C8690000D46F
+0008E1710013F571001FFF69032CF2510046D334005EC30E0179AD0016809E
+002F7F8902457AB83C7A3FB141973C9B30A6479B30A6479B30A6479B30A647
+9B30A6479B30A6479B30A6479B30A6479B30A6479B30A6479B30A6479B30A6
+479B30A6479B30A647A24B0000A54E0000A8520000AD560000B45B0000BD61
+0000C8690000D46F0008E1710013F571001FFF69032CF2510046D334005EC3
+0E0179AD0016809E002F7F8902457AB83C7A3FB141973C9B30A6479B30A647
+9B30A6479B30A6479B30A6479B30A6479B30A6479B30A6479B30A6479B30A6
+479B30A6479B30A6479B30A6479B30A647A24B0000A54E0000A8520000AD56
+0000B45B0000BD610000C8690000D46F0008E1710013F571001FFF69032CF2
+510046D334005EC30E0179AD0016809E002F7F8902457AB83C7A3FB141973C
+9B30A6479B30A6479B30A6479B30A6479B30A6479B30A6479B30A6479B30A6
+479B30A6479B30A6479B30A6479B30A6479B30A6479B30A647A24B0000A54E
+0000A8520000AD560000B45B0000BD610000C8690000D46F0008E1710013F5
+71001FFF69032CF2510046D334005EC30E0179AD0016809E002F7F8902457A
+B83C7A3FB141973C9B30A6479B30A6479B30A6479B30A6479B30A6479B30A6
+479B30A6479B30A6479B30A6479B30A6479B30A6479B30A6479B30A6479B30
+A647A24B0000A44E0000A8520000AD560000B45B0000BC610000C7690000D4
+6F0008E0720013F572001EFF6B042AF5530045D537005DC4100078AD001481
+9E002D808700437DAE347345B142953C9D32A3469D32A3469D32A3469D32A3
+469D32A3469D32A3469D32A3469D32A3469D32A3469D32A3469D32A3469D32
+A3469D32A3469D32A346A24B0000A44F0000A8520000AD560000B35B0000BC
+620000C66A0000D3700007DF730012F374001DFF700526F9580043DC3E005A
+C5170075AA000F839E0028828600407E9B246456B144913CA1369D44A1369D
+44A1369D44A1369D44A1369D44A1369D44A1369D44A1369D44A1369D44A136
+9D44A1369D44A1369D44A1369D44A1369D44A24C0000A44F0000A7520000AC
+560000B35B0000BB620000C66A0000D2710006DE750011F276001CFF750822
+FA5E033CE6440058C81F0072A7010A849E00248483003B818B145667AC4289
+3FA63B9742A63B9741A63B9741A63B9741A63B9741A63B9741A63B9741A63B
+9741A63B9741A63B9741A63B9741A63B9741A63B9741A63B9741A24C0000A4
+4F0000A7520000AC570000B25C0000BA630000C56B0000D1730005DE76000F
+F178001BFF7A0B1EFB650636EE4A0056CA26006EAB0608849E002087800036
+857C04487C98307450AB40913FAB40913FAB40913FAB40913FAB40913FAB40
+913FAB40913FAB40913FAB40913FAB40913FAB40913FAB40913FAB40913FAB
+40913FA24C0000A44F0000A7530000AC570000B15C0000B9630000C46C0000
+D0740004DE78000EF07A0019FF7C0A1CFD6D0A2FF34F0053CD2F006BAF0C05
+839E001B897D00318978004283861F6162B0458B3DB0458B3DB0458B3DB045
+8B3DB0458B3DB0458B3DB0458B3DB0458B3DB0458B3DB0458B3DB0458B3DB0
+458B3DB0458B3DB0458B3DA24C0000A34F0000A6530000AB570000B15C0000
+B9630000C36C0000CF750003DE7A000DEE7C0018FF7E091CFF760D29F85400
+50D3380068B31202829B00158C79002B8E75003F85750D4E77A33B82469B36
+854A9B36854A9B36854A9B36854A9B36854A9B36854A9B36854A9B36854A9B
+36854A9B36854A9B36854A9B36854A9B36854AA24C0000A34F0000A6530000
+AB580000B05D0000B8640000C26D0000CE770002DE7C000BEE7F0016FF8107
+1BFF7D1023FD5B004DDF46065DBC19008096020D8E790020945F002F934601
+40934B00528A4800518C4800518C4800518C4800518C4800518C4800518C48
+00518C4800518C4800518C4800518C4800518C4800518C4800518CA24D0000
+A3500000A5530000AA580000B05D0000B7640000C06E0000CD790002DD7F00
+09EE820013FF840719FF821020FF650344EE5A0F4EC7360F64760D01954B00
+11A3340026A7210132A70B0044A60A0044A60A0044A60A0044A60A0044A60A
+0044A60A0044A60A0044A60A0044A60A0044A60A0044A60A0044A60A0044A6
+0A0044A6A14D0000A3500000A5540000A9580000AF5E0000B6650000BF6F00
+00CA7A0001DB810007F0850010FF880517FF87101CFF750C33DD680B4E9347
+00755B2800911F0F00A9040814B2020D2CAE03043EA803073DA703073DA703
+073DA703073DA703073DA703073DA703073DA703073DA703073DA703073DA7
+03073DA703073DA703073DA7A14D0000A2510000A4540000A8590000AE5E00
+00B4650000BD6F0000C77B0000D8840005F089000DFF8D0513FF8D1017FF8B
+092FA07200547A62006D84762A4C172C009A002810A5002621A6ACAEB307AA
+AFB208AAAFB208AAAFB208AAAFB208AAAFB208AAAFB208AAAFB208AAAFB208
+AAAFB208AAAFB208AAAFB208AAAFB208AAAFB208A14E0000A2510000A45500
+00A7590000AD5F0000B3660000BB700000C57C0000D5860003F48E0009FF95
+0B08FB9A041CC49800329490004A7D950061538007752C5F157015581E7BAE
+D2A802A7C5B401A6C6B601A6C6B601A6C6B601A6C6B601A6C6B601A6C6B601
+A6C6B601A6C6B601A6C6B601A6C6B601A6C6B601A6C6B601A6C6B601A14E00
+00A2510000A3550000A75A0000AC5F0000B1670000B8710000C27D0000D088
+0001F3920006DC9A000ED7AA0018B4B200268EAF003977C1004E4EB4006728
+94097A258D296296FE980D80DA9E1B80DD9F1A80DD9F1A80DD9F1A80DD9F1A
+80DD9F1A80DD9F1A80DD9F1A80DD9F1A80DD9F1A80DD9F1A80DD9F1A80DD9F
+1A80DD9F1AA14F0000A1520000A2560000A65A0000AA600000B0670000B672
+0000BE7E0000CA890000BD940004B9A1000AB3B60011A5CF001996F4001F74
+F200354DE4005122C8006B00A70C7B4EFB633C4ACF80374DD383334DD38333
+4DD383334DD383334DD383334DD383334DD383334DD383334DD383334DD383
+334DD383334DD383334DD38333A14F0000A1520000A2560000A55B0000A961
+0000AE680000B3720000BA7E0000AE8B0000A8990002A7A90004A2C2000995
+DD001088FA031765FF002B43FF004620FF006003E9056E1CFF3D564AFF832A
+48FF862A48FF862A48FF862A48FF862A48FF862A48FF862A48FF862A48FF86
+2A48FF862A48FF862A48FF862A48FF862A48FF862AA1500000A0530000A157
+0000A45B0000A8610000AC690000B1730000A7810000A18E00009E9D00019B
+AF000594C6000988E2001076FC011A52FF003234FF004B12FF006001FF1566
+0AFF3C5A3BFF7E2B37FF832D37FF832D37FF832D37FF832D37FF832D37FF83
+2D37FF832D37FF832D37FF832D37FF832D37FF832D37FF832D37FF832DA050
+0000A0530000A1570000A35C0000A7620000AC690000A47500009C83000098
+91000096A0000193B5000489CB000A7FEC000F65FE001E43FF003624FF0050
+07FD025F1AFF384B22FF573C00FF625200FF6A5100FF6A5100FF6A5100FF6A
+5100FF6A5100FF6A5100FF6A5100FF6A5100FF6A5100FF6A5100FF6A5100FF
+6A5100FF6A51A0500000A0540000A1570000A35C0000A7620000A16B000099
+77000094850000919400008FA500028BBA000482D4000876F7000F53F90023
+3CFF063317FF005102FE0A5A17FF404531FF692601FF654B01FF714A01FF71
+4A01FF714A01FF714A01FF714A01FF714A01FF714A01FF714A01FF714A01FF
+714A01FF714A01FF714A01FF714AA0500000A0540000A1570000A35C00009E
+630000956E0000907A00008D8800008A97000087A9000184C100037EE40006
+6AFC001142F1002936FF0E310CFF004F08FF1D4C15FF473E30FF6F2011FF82
+3A10FF973810FF973810FF973810FF973810FF973810FF973810FF973810FF
+973810FF973810FF973810FF973810FF973810FF9738A0500000A0540000A1
+5700009C5D0000926600008C700000897D0000868A0000829A000081AE0001
+80CD000073E7000651E8001A36F1002B20FF004007FF074B1AFF393611FF4D
+3908FF593A13FF8C310EFF9D320EFF9E320EFF9E320EFF9E320EFF9E320EFF
+9E320EFF9E320EFF9E320EFF9E320EFF9E320EFF9E320EFF9E320EFF9E32A0
+500000A05400009D580000906000018868000184720000817F00007D8D0000
+7A9D000079B3000077D000016BEF000640DC001E2DF2002D15FF004007FF14
+431DFF442C0DFF50340EFF69320FFF8F2D0CFFA12D0CFFA12D0CFFA12D0CFF
+A12D0CFFA12D0CFFA12D0CFFA12D0CFFA12D0CFFA12D0CFFA12D0CFFA12D0C
+FFA12D0CFFA12DA05000009F5400008F5A0001866200017F6A00007D750000
+79810000728F00006E9F00006FB500006BD0000253DC000F35D9001E25F400
+2E0CFF013E04FF1C3E1DFF4D2508FF513216FF79270CFF962A0AFFA42A0AFF
+A42A0AFFA42A0AFFA42A0AFFA42A0AFFA42A0AFFA42A0AFFA42A0AFFA42A0A
+FFA42A0AFFA42A0AFFA42A0AFFA42AA050000090560000845D00017D640000
+776C0000747700006E8300006791000064A1000061B300005DCE000241D200
+142DDC00201DF8002F07FF073A04FF243813FF4A260BFF5B2A13FF7F230AFF
+992608FFA72608FFA72608FFA72608FFA72608FFA72608FFA72608FFA72608
+FFA72608FFA72608FFA72608FFA72608FFA72608FFA7269253000085580001
+7B5F0000746600006F6E00006B790000658500005E9300005BA2000058B400
+004EC9000637D1001426E1002016FB002E02FF0F370AFF2F2B11FF502215FF
+6D1D10FF821F0AFF9B2207FFA62207FFA62207FFA62207FFA62207FFA62207
+FFA62207FFA62207FFA62207FFA62207FFA62207FFA62207FFA62207FFA622
+865500017B5A0000736000006C67000068710000637C00005C880000589600
+0054A500004FB6000042C7000A2FD3001521E7002111FF032C01FF183113FF
+3E1E14FF5A1B12FF701B11FF85190AFF9C1D08FFA71D08FFA71D08FFA71D08
+FFA71D08FFA71D08FFA71D08FFA71D08FFA71D08FFA71D08FFA71D08FFA71D
+08FFA71D08FFA71D7C560000725C00006A62000065690000617400005B7F00
+00568B0000519800004DA7000047B7000238C9000B28D800151BED002009FF
+052B00FF1E2B11FF421911FF5D1813FF741419FF8A0A0AFF9C1906FFA71B06
+FFA71B06FFA71B06FFA71B06FFA71B06FFA71B06FFA71B06FFA71B06FFA71B
+06FFA71B06FFA71B06FFA71B06FFA71B>
+<A2480000A44A0000A74E0000AC510000B2560000BA5B0000C4600000D06600
+07DD680012EF66001EF95B002EE6450044CE26005CC1030575B1001D74B000
+3772C72F6E48CD3F8D33B730A139A422B447A422B447A422B447A422B447A4
+22B447A422B447A422B447A422B447A422B447A422B447A422B447A422B447
+A422B447A422B447A2480000A44A0000A74E0000AC510000B2560000BA5B00
+00C4600000D0660007DD680012EF66001EF95B002EE6450044CE26005CC103
+0575B1001D74B0003772C72F6E48CD3F8D33B730A139A422B447A422B447A4
+22B447A422B447A422B447A422B447A422B447A422B447A422B447A422B447
+A422B447A422B447A422B447A422B447A2480000A44A0000A74E0000AC5100
+00B2560000BA5B0000C4600000D0660007DD680012EF66001EF95B002EE645
+0044CE26005CC1030575B1001D74B0003772C72F6E48CD3F8D33B730A139A4
+22B447A422B447A422B447A422B447A422B447A422B447A422B447A422B447
+A422B447A422B447A422B447A422B447A422B447A422B447A2480000A44A00
+00A74E0000AC510000B2560000BA5B0000C4600000D0660007DD680012EF66
+001EF95B002EE6450044CE26005CC1030575B1001D74B0003772C72F6E48CD
+3F8D33B730A139A422B447A422B447A422B447A422B447A422B447A422B447
+A422B447A422B447A422B447A422B447A422B447A422B447A422B447A422B4
+47A2480000A44A0000A74E0000AC510000B2560000BA5B0000C4600000D066
+0007DD680012EF66001EF95B002EE6450044CE26005CC1030575B1001D74B0
+003772C72F6E48CD3F8D33B730A139A422B447A422B447A422B447A422B447
+A422B447A422B447A422B447A422B447A422B447A422B447A422B447A422B4
+47A422B447A422B447A2480000A44A0000A74E0000AC510000B2560000BA5B
+0000C4600000D0660007DD680012EF66001EF95B002EE6450044CE26005CC1
+030575B1001D74B0003772C72F6E48CD3F8D33B730A139A422B447A422B447
+A422B447A422B447A422B447A422B447A422B447A422B447A422B447A422B4
+47A422B447A422B447A422B447A422B447A2480000A44A0000A74E0000AC51
+0000B2560000BA5B0000C4600000D0660007DD680012EF66001EF95C002EE7
+450044CE27005CC2030475B1001D74AF003773C72F6D48CC3E8C35B932A137
+A422B347A423B447A423B447A423B447A423B447A423B447A423B447A423B4
+47A423B447A423B447A423B447A423B447A423B447A423B447A2480000A34B
+0000A74E0000AB520000B1560000B95B0000C4610000D0670006DC690011EE
+68001DFA5F002CED4A0042D02C0059C4030176B2001976AE003374C32E684A
+C1368340C03CA22DA526B145A325B147A325B147A325B147A325B147A325B1
+47A325B147A325B147A325B147A325B147A325B147A325B147A325B147A325
+B147A2480000A34B0000A74E0000AB520000B1560000B95B0000C3610000CF
+680005DC6B0010ED6A001CFC62002AF24E0040D2310057C5090074B2001678
+AD002F76B5245E55B22C7749C344A129A429AF45A226AF47A226AF47A226AF
+47A226AF47A226AF47A226AF47A226AF47A226AF47A226AF47A226AF47A226
+AF47A226AF47A226AF47A1480000A34B0000A64F0000AB520000B1560000B8
+5C0000C2620000CE680005DB6C000FEC6C001BFD660128F452003ED7370055
+C50F0071B200127AAD002C78A9195460A6236D53C64BA125A32BAD44A028AD
+47A028AD47A028AD47A028AD47A028AD47A028AD47A028AD47A028AD47A028
+AD47A028AD47A028AD47A028AD47A028AD47A1480000A34B0000A64F0000AA
+520000B0570000B85C0000C2630000CE690004DA6D000EEA6E001AFD6A0225
+F656003CDD3D0053C616006EB2000F7CAC00287AA2124B699B1A635DC9529F
+22A22EAB439F2AAB479F2AAB479F2AAB479F2AAB479F2AAB479F2AAB479F2A
+AB479F2AAB479F2AAB479F2AAB479F2AAB479F2AAB479F2AAB47A1490000A3
+4C0000A64F0000AA530000B0570000B75C0000C1630000CD6A0003D96E000D
+E86F0019FD6E0322F95B0039E2420051C61D006AB4030C7CAC00247C9D0B42
+7091105869C54E9729A232A8439D2DA9479D2DA9479D2DA9479D2DA9479D2D
+A9479D2DA9479D2DA9479D2DA9479D2DA9479D2DA9479D2DA9479D2DA9479D
+2DA947A1490000A34C0000A64F0000AA530000AF570000B75D0000C0640000
+CC6B0002D870000CE6710017FB710321FC600036E848004FC7260067B70708
+7CAB00207F9703397A86044B78BF498E34A336A2429B2FA7479B2FA7479B2F
+A7479B2FA7479B2FA7479B2FA7479B2FA7479B2FA7479B2FA7479B2FA7479B
+2FA7479B2FA7479B2FA747A1490000A34C0000A5500000A9530000AF580000
+B65D0000BF640000CB6D0001D771000BE4730016FA74031FFF660032F04E00
+4CCB300063BC0C047CA8001A82920032818200457FA53779469D319C479432
+934B912F904D912F904D912F904D912F904D912F904D912F904D912F904D91
+2F904D912F904D912F904D912F904D912F904DA14A0000A34D0000A5500000
+A9540000AE580000B55E0000BE650000C96E0001D6730009E3760014F87802
+1EFF6E042BF8560048D83A005FC314007BA40012858300268C6700378C4A00
+468F6C227161541C6D6C541D6E6A541D6E6A541D6E6A541D6E6A541D6E6A54
+1D6E6A541D6E6A541D6E6A541D6E6A541D6E6A541D6E6A541D6E6AA14A0000
+A24D0000A5500000A8540000AE590000B45E0000BC660000C86F0001D57600
+07E3790012F77B011CFF770A22FC61043EEA46005BB62700766F0B01904A00
+139E37002A9F260139A01700499F0E004E9F0D004E9F0D004E9F0D004E9F0D
+004E9F0D004E9F0D004E9F0D004E9F0D004E9F0D004E9F0D004E9F0D004E9F
+0D004E9FA14A0000A24D0000A4510000A7540000AD590000B35F0000BB6600
+00C6710000D3790005E37D000FF57F0119FF810D1BFF720B30BA5A00558A43
+00705626008C1C0E00A3040815AA020E2EA7010A46A31C225F761E2460741E
+2460741E2460741E2460741E2460741E2460741E2460741E2460741E246074
+1E2460741E2460741E246074A14B0000A24E0000A3510000A7550000AB5A00
+00B15F0000B9670000C3720000D17C0003E281000CF4830016FF870C18DF82
+01339A70004F755F00684C4B0086152B00940028129F6D7C7A2B989BB01391
+98B51D9098B51D9098B51D9098B51D9098B51D9098B51D9098B51D9098B51D
+9098B51D9098B51D9098B51D9098B51D9098B51DA14B0000A24E0000A35100
+00A6550000AA5A0000B0600000B7680000C1730000CD7E0001E0850008ED8A
+0011E293001DB291002F8E8C0045768F005E4674007A144E008E004A1295A6
+D5AA0691B2B6119DC3D2019DC3D3019DC3D3019DC3D3019DC3D3019DC3D301
+9DC3D3019DC3D3019DC3D3019DC3D3019DC3D3019DC3D3019DC3D301A14C00
+00A14F0000A2520000A5560000A95B0000AE610000B5690000BE740000C980
+0000D1890005C491000EBD9F0017A6A9002488A9003470B4004C48A300661A
+820082007313876DD5802783E5AF1476D0B91976D0B91976D0B91976D0B919
+76D0B91976D0B91976D0B91976D0B91976D0B91976D0B91976D0B91976D0B9
+1976D0B919A14C0000A14F0000A2520000A4570000A85B0000AD620000B36A
+0000BA750000BB820000AF8D0004AC99000AA6AA001199BE00178AD6001F68
+D0003746CB00501CB2006A009E117633CF564C41CB7D3C6BFFB4156BFFB415
+6BFFB4156BFFB4156BFFB4156BFFB4156BFFB4156BFFB4156BFFB4156BFFB4
+156BFFB4156BFFB4156BFFB415A14D0000A1500000A1530000A3570000A75C
+0000AB630000B16B0000B0770000A5840000A09100039DA1000697B4000A8D
+CB000F80EA001564F8002642F9003E20FC005805F2076512FF375725FE5F3C
+2CFF7E332CFF7D332CFF7D332CFF7D332CFF7D332CFF7D332CFF7D332CFF7D
+332CFF7D332CFF7D332CFF7D332CFF7D332CFF7D33A14E0000A1500000A054
+0000A2580000A55D0000AA630000AA6D00009F7A0000998800009596000194
+A700028FBE000584D6000B76F8001353FC002935FF004014FF00570AFC1758
+15FF454B24FF693300FF6B5000FF6B5000FF6B5000FF6B5000FF6B5000FF6B
+5000FF6B5000FF6B5000FF6B5000FF6B5000FF6B5000FF6B5000FF6B50A14E
+0000A0510000A0540000A1590000A45E0000A66500009B6F0000957D000091
+8B00008E9A00018CAD000287C500057DE4000A69FD001642F7002D2EFF093C
+09FF005606FF21522CFF5C2C00FF594C05FF7A4605FF7A4605FF7A4605FF7A
+4605FF7A4605FF7A4605FF7A4605FF7A4605FF7A4605FF7A4605FF7A4605FF
+7A4605FF7A46A14F0000A0510000A0550000A1590000A35E00009767000090
+7200008D7F00008A8D0000879E000184B2000181CF000375EF000952EE001E
+38FA022F1BFF004703FF075219FF3F3A23FF5E2C01FF5F430FFF9D370FFF9D
+370FFF9D370FFF9D370FFF9D370FFF9D370FFF9D370FFF9D370FFF9D370FFF
+9D370FFF9D370FFF9D370FFF9D37A14F0000A0510000A0550000A159000094
+6100008D6A00018975000086820000829000007FA100007FB900007CDD0001
+6FFE000740E300222DFE003311FF014612FF233D1BFF4A3106FF513D11FF7A
+330BFFA6320AFFA9320AFFA9320AFFA9320AFFA9320AFFA9320AFFA9320AFF
+A9320AFFA9320AFFA9320AFFA9320AFFA9320AFFA932A14F0000A0510000A0
+550000935B00008A630001836C0000817700007E8400007893000076A50000
+78BF00006ED8000350DE001435E1002324FF003509FF044314FF2E321EFF55
+2808FF593512FF822B09FFAB2D08FFAE2D08FFAE2D08FFAE2D08FFAE2D08FF
+AE2D08FFAE2D08FFAE2D08FFAE2D08FFAE2D08FFAE2D08FFAE2D08FFAE2DA1
+4F0000A051000094570000885E0001806500007B6E0000797A000073870000
+6B9400006BA700006ABD00005FD700043FD500182CE400251AFE003604FF0C
+3F13FF362D06FF433218FF722410FF892708FFAA2907FFAC2907FFAC2907FF
+AC2907FFAC2907FFAC2907FFAC2907FFAC2907FFAC2907FFAC2907FFAC2907
+FFAC2907FFAC29A14F000096530000885900017E6000007867000073700000
+6F7C000068880000619700005FA700005CBC00004FD0000935D4001825E900
+2611FE003401FF153A10FF3B2805FF4A2D15FF77200DFF8C2306FFAD2605FF
+AD2605FFAD2605FFAD2605FFAD2605FFAD2605FFAD2605FFAD2605FFAD2605
+FFAD2605FFAD2605FFAD2605FFAD2699500000885500017E5B000075620000
+6F6900006B730000667F00005F8B00005A98000057A9000053BE000141CB00
+0D2DD600181FEF00260AFF043201FF1E3315FF471E15FF611C13FF7A1C0AFF
+8F2004FFA72203FFA72203FFA72203FFA72203FFA72203FFA72203FFA72203
+FFA72203FFA72203FFA72203FFA72203FFA72203FFA7228A5200007E570000
+745D00006D630000676B0000637600005D810000588E0000549B00004FAB00
+0049BE000337CC000E26DB001919F4002505FF0B2F03FF252B15FF4E1912FF
+661912FF7D170CFF911A06FFA91D05FFA91E05FFA91E05FFA91E05FFA91E05
+FFA91E05FFA91E05FFA91E05FFA91E05FFA91E05FFA91E05FFA91E05FFA91E
+80540001755900006C5E000066650000616E00005C79000057850000529100
+004D9E000048AD00003FBF00052FD0000E20E1001912F8002501FF132B01FF
+292613FF521510FF68151AFF820712FF930E03FFAA1B02FFAA1B02FFAA1B02
+FFAA1B02FFAA1B02FFAA1B02FFAA1B02FFAA1B02FFAA1B02FFAA1B02FFAA1B
+02FFAA1B02FFAA1B765500006C5A0000656000005F6700005B710000567C00
+00518800004C94000047A1000041B0000036C3000527D4000F1BE700190BFB
+032400FF1A250CFF371712FF57100CFF6A1313FF800A11FF940A01FFA41801
+FFA51901FFA51901FFA51901FFA51901FFA51901FFA51901FFA51901FFA519
+01FFA51901FFA51901FFA51901FFA519>
+<A1440000A3470000A64A0000AA4D0000B0510000B7550000C1590000CD5D00
+06DA5E0011E95A001DEE4D002EDC370043D219005DBE000C6CB3002369B600
+3E68BD0B655EC525923DAC17AF4C9A0FD2509C14E24A9C14E14A9C14E14A9C
+14E14A9C14E14A9C14E14A9C14E14A9C14E14A9C14E14A9C14E14A9C14E14A
+9C14E14A9C14E14AA1440000A3470000A64A0000AA4D0000B0510000B75500
+00C1590000CD5D0006DA5E0011E95A001DEE4D002EDC370043D219005DBE00
+0C6CB3002369B6003E68BD0B655EC525923DAC17AF4C9A0FD2509C14E24A9C
+14E14A9C14E14A9C14E14A9C14E14A9C14E14A9C14E14A9C14E14A9C14E14A
+9C14E14A9C14E14A9C14E14A9C14E14AA1440000A3470000A64A0000AA4D00
+00B0510000B7550000C1590000CD5D0006DA5E0011E95A001DEE4D002EDC37
+0043D219005DBE000C6CB3002369B6003E68BD0B655EC525923DAC17AF4C9A
+0FD2509C14E24A9C14E14A9C14E14A9C14E14A9C14E14A9C14E14A9C14E14A
+9C14E14A9C14E14A9C14E14A9C14E14A9C14E14A9C14E14AA1440000A34700
+00A64A0000AA4D0000B0510000B7550000C1590000CD5D0006DA5E0011E95A
+001DEE4D002EDC370043D219005DBE000C6CB3002369B6003E68BD0B655EC5
+25923DAC17AF4C9A0FD2509C14E24A9C14E14A9C14E14A9C14E14A9C14E14A
+9C14E14A9C14E14A9C14E14A9C14E14A9C14E14A9C14E14A9C14E14A9C14E1
+4AA1440000A3470000A64A0000AA4D0000B0510000B7550000C1590000CD5D
+0006DA5E0011E95A001DEE4D002EDC370043D219005DBE000C6CB3002369B6
+003E68BD0B655EC525923DAC17AF4C9A0FD2509C14E24A9C14E14A9C14E14A
+9C14E14A9C14E14A9C14E14A9C14E14A9C14E14A9C14E14A9C14E14A9C14E1
+4A9C14E14A9C14E14AA1450000A3470000A64A0000AA4D0000B0510000B755
+0000C1590000CC5D0005DA5F0010E95C001CEF50002DDF3B0041D21C005BC0
+00096DB300216BB4003B69BD0B625FC828903CAF1AAC499A10CD519B15DE4B
+9B15DE4B9B15DE4B9B15DE4B9B15DE4B9B15DE4B9B15DE4B9B15DE4B9B15DE
+4B9B15DE4B9B15DE4B9B15DE4B9B15DE4BA1450000A3470000A64A0000AA4E
+0000B0510000B7550000C05A0000CC5E0004D9600010E95E001BF053002BE3
+3F0040D1200059C200066FB4001F6CB200386ABC0A5F61CA2A8E3CB927AE3B
+9B12C7509C16D94B9C16D94B9C16D94B9C16D94B9C16D94B9C16D94B9C16D9
+4B9C16D94B9C16D94B9C16D94B9C16D94B9C16D94B9C16D94BA1450000A347
+0000A54A0000AA4E0000B0510000B6550000C05A0000CB5F0004D861000FE8
+60001AF256002AE843003ED1240056C4000470B4001C6EB000356CBC0D5C60
+C4258846C333AF2E9F18C34C9D18D24A9D18D24A9D18D24A9D18D24A9D18D2
+4A9D18D24A9D18D24A9D18D24A9D18D24A9D18D24A9D18D24A9D18D24A9D18
+D24AA1450000A3480000A54B0000AA4E0000AF520000B6560000BF5B0000CB
+600003D762000EE7620019F3590028EB47003CD1280054C505036EB500196F
+B000326DBD0F5A60C5278646CE3FB023A41DC0489E1ACC4A9E1ACC4A9E1ACC
+4A9E1ACC4A9E1ACC4A9E1ACC4A9E1ACC4A9E1ACC4A9E1ACC4A9E1ACC4A9E1A
+CC4A9E1ACC4A9E1ACC4AA1460000A3480000A54B0000A94E0000AF520000B5
+560000BF5B0000CA600003D764000EE6630019F55C0027ED4A003BD22D0052
+C50A026CB5001771B0002F6EBD12585FC62C8443DB4DB218A823BC449F1CC6
+499F1CC5499F1CC5499F1CC5499F1CC5499F1CC5499F1CC5499F1CC5499F1C
+C5499F1CC5499F1CC5499F1CC5499F1CC549A1460000A2480000A54B0000A9
+4F0000AF520000B5560000BE5C0000C9610002D665000DE5650018F65F0025
+F14E0039D333004FC6100269B6001373B0002B70BE15555EC9328340ED5DB3
+0AAE29B840A11EBF48A11EBF48A11EBF48A11EBF48A11EBF48A11EBF48A11E
+BF48A11EBF48A11EBF48A11EBF48A11EBF48A11EBF48A11EBF48A1460000A2
+480000A54B0000A94F0000AE530000B4570000BE5C0000C9620002D566000B
+E3670016F6630023F5530036D839004DC6170166B8010F74AF002772BB144E
+60CC39813CF262AE08B02CB03FA321B847A321B747A321B747A321B747A321
+B747A321B747A321B747A321B747A321B747A321B747A321B747A321B747A3
+21B747A1470000A2490000A44C0000A84F0000AD530000B4570000BD5D0000
+C8630000D468000AE1690015F5660021FA590033DF40004AC7200063BB010A
+76AF002375B7144763CC3F7E3AE256A018AF2CA541A424B147A424B147A424
+B147A424B147A424B147A424B147A424B147A424B147A424B147A424B147A4
+24B147A424B147A424B147A1470000A2490000A44C0000A8500000AD530000
+B3580000BC5D0000C7640000D3690008E06C0013F36A001FFE5F0030E84800
+47CB28005FBF050577AF001D78AC093B6FB32C6B4BC14C922C9B2F9A499B38
+B53F9939B5409939B5409939B5409939B5409939B5409939B5409939B54099
+39B5409939B5409939B5409939B5409939B540A1480000A24A0000A44D0000
+A7500000AC540000B2580000BB5E0000C5650000D26B0007DE6E0012F16E00
+1DFE670329F3500043D533005BC40B0077AA00157D8200288567003D876111
+597589428E3B9A5AC22CA267D022A267D022A267D022A267D022A267D022A2
+67D022A267D022A267D022A267D022A267D022A267D022A267D022A1480000
+A24A0000A34D0000A7500000AB540000B1590000B95F0000C4670000D06D00
+05DC71000FEE72001BFE700622F959003EE2400056AA2500726809018B4600
+13983500299829003F9A1E0051984C2D82526043953C6043953C6043953C60
+43953C6043953C6043953C6043953C6043953C6043953C6043953C6043953C
+6043953CA1480000A14A0000A34E0000A6510000AA550000B05A0000B86000
+00C2680000CE700003DA74000DE9760018FD78071EFA700C2AAB550051833E
+006C512400861A0D009E040815A4020D2FA007134F936E6AAA258780C21787
+80C2178780C2178780C2178780C2178780C2178780C2178780C2178780C217
+8780C2178780C2178780C217A1490000A14B0000A34E0000A5520000A95600
+00AF5A0000B6610000BF690000CB730001D978000AE87B0014EE7E0021C27A
+0032936C004B70590064484600811329008F002612992B534B64909AB31C90
+98D018919BD516919BD516919BD516919BD516919BD516919BD516919BD516
+919BD516919BD516919BD516919BD516919BD516A14A0000A14C0000A24F00
+00A4520000A8560000AE5B0000B4620000BD6A0000C8750000D87D0006D382
+0011C589001DA689002C878600416E84005D40680076114A00890048148F50
+8A6C4094C1C70B91B9EA078EB8E9098EB8E9098EB8E9098EB8E9098EB8E909
+8EB8E9098EB8E9098EB8E9098EB8E9098EB8E9098EB8E9098EB8E909A14A00
+00A14C0000A24F0000A4530000A7570000AC5C0000B2630000BA6B0000C477
+0000BE810006B58A000EAC9400189A9D002381A0003269A8004B4193006514
+75007F006E15820D7B3B706DCBA9206EC2D7196EC5DA186EC5DA186EC5DA18
+6EC5DA186EC5DA186EC5DA186EC5DA186EC5DA186EC5DA186EC5DA186EC5DA
+186EC5DA18A14B0000A14D0000A2500000A3530000A6580000AA5D0000B063
+0000B76C0000AF7A0000A7850005A291000B9A9F00118FAF00177FBE001F60
+BD00373FB5005016A000690095147106A4356835C47E4163F6C81662F1C815
+62F1C81562F1C81562F1C81562F1C81562F1C81562F1C81562F1C81562F1C8
+1562F1C81562F1C81562F1C815A14C0000A14E0000A1500000A2540000A458
+0000A95E0000AE650000A67000009F7D0002998A0004959800078FAA000B86
+BD000F78D400165CDD00273EE2003D1DE8005601D00D630CF2385500EC4D57
+04EB714E23F2832C23F2832C23F2832C23F2832C23F2832C23F2832C23F283
+2C23F2832C23F2832C23F2832C23F2832C23F2832CA14C0000A14E0000A051
+0000A1550000A3590000A75E0000A168000097740000938100008F9000018D
+A0000189B6000383D1000677F3000C54F600213DFC073017FF004E02FF0D57
+16FF434224FF662C08FF754308FF824208FF824208FF824208FF824208FF82
+4208FF824208FF824208FF824208FF824208FF824208FF824208FF8242A14D
+0000A14F0000A0520000A1560000A25A00009B610000926B00008E7700008B
+8500008793000085A5000182BD00017FE400026CFB000E41EB00262EFE0536
+0CFF004D10FF254314FF4B3B17FF633012FF8E350EFFA0350EFFA0350EFFA0
+350EFFA0350EFFA0350EFFA0350EFFA0350EFFA0350EFFA0350EFFA0350EFF
+A0350EFFA035A14E0000A1500000A0520000A0560000995C00008F64000189
+6E0000867A0000838700007E9600007EAA00007DC7000072E0000551E40018
+35EA00281FFF003C07FF0A471BFF3C3110FF503609FF643811FF932F09FFAC
+3109FFAC3109FFAC3109FFAC3109FFAC3109FFAC3109FFAC3109FFAC3109FF
+AC3109FFAC3109FFAC3109FFAC31A24E0000A1500000A0520000995700008C
+5E000185670000807000007E7C0000798A00007499000074AE000072C80001
+62DF00073FD8001C2CED002A15FF003C00FF0F451DFF462804FF4B3715FF79
+290DFF972B06FFB22D06FFB22D06FFB22D06FFB22D06FFB22D06FFB22D06FF
+B22D06FFB22D06FFB22D06FFB22D06FFB22D06FFB22DA24E0000A15000009B
+5300008B5A0001826100007C69000079730000747F00006D8C0000689B0000
+66AD000064C7000152D8000B34D7001C24F2002B0EFF043A01FF1C3D17FF48
+260DFF5A2B13FF80240AFF9C2704FFB12904FFB12904FFB12904FFB12904FF
+B12904FFB12904FFB12904FFB12904FFB12904FFB12904FFB12904FFB129A2
+4E00009E5000008C560001815C000179630000736B00006F75000069810000
+638E00005E9D00005BAD000057C6000240CF00112CDA001D1EF7002B07FF07
+3702FF243415FF4F210FFF642310FF83210AFF9E2301FFAE2501FFAE2501FF
+AE2501FFAE2501FFAE2501FFAE2501FFAE2501FFAE2501FFAE2501FFAE2501
+FFAE2501FFAE25A24E00008D52000081580001775E0000706500006B6D0000
+67780000608400005A910000579F000052AF00004AC3000536CF001225E000
+1E18FD002A03FF10320FFF352314FF551D14FF701B0FFF871C0AFF9F1E00FF
+AC2200FFAC2200FFAC2200FFAC2200FFAC2200FFAC2200FFAC2200FFAC2200
+FFAC2200FFAC2200FFAC2200FFAC229050000082540001775A00006E5F0000
+68660000647000005F7B0000598700005494000050A200004BB100003FC300
+082DD200121FE6001E0FFE002A00FF182D0EFF3A1E13FF5B1712FF731615FF
+8B100AFF9F1A00FFAC1F00FFAC1F00FFAC1F00FFAC1F00FFAC1F00FFAC1F00
+FFAC1F00FFAC1F00FFAC1F00FFAC1F00FFAC1F00FFAC1F8352000178560000
+6E5B000067610000616900005D730000587E0000538A00004E96000049A400
+0043B4000136C6000826D700121AEC001D06FE062800FF1F270DFF3F190EFF
+5C1613FF770E1BFF8E0206FF9E1800FFAC1C00FFAC1C00FFAC1C00FFAC1C00
+FFAC1C00FFAC1C00FFAC1C00FFAC1C00FFAC1C00FFAC1C00FFAC1C00FFAC1C
+7954000070570000665C0000606300005B6C000057760000528200004D8E00
+004899000042A700003BB800012ECB000820DC001214F1001D02FE0E2403FF
+261F13FF4B0D0BFF5F130FFF760D18FF8E0005FF9C1400FFAC1900FFAC1900
+FFAC1900FFAC1900FFAC1900FFAC1900FFAC1900FFAC1900FFAC1900FFAC19
+00FFAC1900FFAC1970560000675900005F5E00005A650000566F0000517A00
+004C85000047910000419D00003BAA000033BD000126CF00091AE100120CF5
+001D00FE161F02FF2A1B11FF4E0A0CFF620D10FF780513FF8C0007FF9A0E00
+FFAB1500FFAB1500FFAB1500FFAB1500FFAB1500FFAB1500FFAB1500FFAB15
+00FFAB1500FFAB1500FFAB1500FFAB15>
+<A1410000A1420000A4450000A9480000AF4B0000B64F0000BE520000C85500
+05D5540010E14D001DE33F002DD3290042CB0D015DB8001263B3002960BA00
+445FBB00665CAD01895AA000B2559B03FB4DA011FF40A011FF40A011FF41A0
+11FF41A011FF41A011FF41A011FF41A011FF41A011FF41A011FF41A011FF41
+A011FF41A011FF41A1410000A1420000A4450000A9480000AF4B0000B64F00
+00BE520000C8550005D5540010E14D001DE33F002DD3290042CB0D015DB800
+1263B3002960BA00445FBB00665CAD01895AA000B2559B03FB4DA011FF40A0
+11FF40A011FF41A011FF41A011FF41A011FF41A011FF41A011FF41A011FF41
+A011FF41A011FF41A011FF41A011FF41A1410000A1420000A4450000A94800
+00AF4B0000B64F0000BE520000C8550005D5540010E14D001DE33F002DD329
+0042CB0D015DB8001263B3002960BA00445FBB00665CAD01895AA000B2559B
+03FB4DA011FF40A011FF40A011FF41A011FF41A011FF41A011FF41A011FF41
+A011FF41A011FF41A011FF41A011FF41A011FF41A011FF41A1410000A14200
+00A4450000A9480000AF4C0000B64F0000BE520000C8550004D4550010E14E
+001CE441002DD42B0042CC0E005DB9001164B3002860BA00435FBC00655DAD
+01885BA100B1569A02FA4EA011FF41A011FF419F11FF419F11FF419F11FF41
+9F11FF419F11FF419F11FF419F11FF419F11FF419F11FF419F11FF419F11FF
+41A1420000A1420000A4450000A9490000AE4C0000B5500000BD530000C856
+0004D456000FE150001BE543002CD72E0040CE11005BBA000F65B3002661B9
+004060BD00635EAD01855CA200B0579901FA509F11FF429F11FF429F11FF42
+9F11FF429F11FF429F11FF429F11FF429F11FF429F11FF429F11FF429F11FF
+429F11FF429F11FF42A1420000A1430000A4460000A9490000AE4C0000B550
+0000BD530000C8570003D457000EE153001AE646002ADA32003FCF140059BB
+000D66B3002463B8003D61BE00605FAE01825EA300AE589800F9529F11FF43
+9F11FF449F11FF449F11FF449F11FF449F11FF449F11FF449F11FF449F11FF
+449F11FF449F11FF449F11FF449F11FF44A1420000A1430000A4460000A849
+0000AE4D0000B5500000BD540000C7570003D358000EE2550019E8480029DD
+35003DCF170057BC000A68B4002264B7003B62BE005D60AF027F5EA502AD57
+9902F3539F11FC449F11FC459F11FC459F11FC459F11FC459F11FC459F11FC
+459F11FC459F11FC459F11FC459F11FC459F11FC459F11FC45A1430000A143
+0000A4460000A8490000AE4D0000B4500000BC540000C7580002D359000DE2
+570019E94B0028E039003CD01B0055BE000869B4002065B5003863BD005A62
+B2057D5CAD0FAE4A9B06E9519E11F8459E11F7459E11F7459E11F7459E11F7
+459E11F7459E11F7459E11F7459E11F7459E11F7459E11F7459E11F7459E11
+F745A1430000A1440000A4470000A84A0000AD4D0000B4510000BC550000C6
+580002D35A000CE2580018EB4E0027E33C003AD01F0052C0020669B5001D67
+B4003564BD005763B4097C5AB61BAF3D9F0BDE4E9E12F2469E12F2469E12F2
+469E12F2469E12F2469E12F2469E12F2469E12F2469E12F2469E12F2469E12
+F2469E12F2469E12F246A1430000A1440000A4470000A84A0000AD4E0000B3
+510000BB550000C6590002D25C000BE15A0017EC510025E5400038CF24004F
+C3060567B6001A68B3003266BC005365B70C7959C229AF2EA210D34C9D13EC
+479D13EC489D13EC489D13EC489D13EC489D13EC489D13EC489D13EC489D13
+EC489D13EC489D13EC489D13EC489D13EC48A1440000A1440000A4470000A7
+4A0000AD4E0000B3510000BB560000C55A0001D25D000AE05C0016EE560023
+E8440036CE29004CC60C0465B600176AB3002E68BC004E67B90F7659D43CB0
+1FA716C7499C14E6499C14E5499C14E5499C14E5499C14E5499C14E5499C14
+E5499C14E5499C14E5499C14E5499C14E5499C14E5499C14E549A1440000A1
+450000A4480000A74B0000AC4F0000B2520000BA560000C45B0001D15E0009
+DF5F0014EE590021EC490033D2300049CB120263B900136CB2002A6ABA0048
+69BC127258EE55B10EAD1DBE469C15DF4A9C15DE4A9B15DE4A9B15DE4A9B15
+DE4A9B15DE4A9B15DE4A9B15DE4A9B15DE4A9B15DE4A9B15DE4A9B15DE4A9B
+15DE4AA1450000A1450000A3480000A74B0000AC4F0000B1520000B9570000
+C45C0000CF600008DD610013ED5D001FF04F0031D9380046D0180060BC000D
+6FB200256CB600426BBF166F56EA52A615B020B4459C17D44B9D1BD6489E1E
+D7479E1ED7479E1ED7479E1ED7479E1ED7479E1ED7479E1ED7479E1ED7479E
+1ED7479E1ED7479E1ED747A1450000A1460000A3490000A64C0000AB4F0000
+B1530000B8580000C35D0000CE610006DB640011EC62001DF456002DE24000
+43D321005CC0010771B200206FB2003A6EB114645DA8288A4D9927A84B902C
+D0448B28CD488C2ACE478C2ACE478C2ACE478C2ACE478C2ACE478C2ACE478C
+2ACE478C2ACE478C2ACE478C2ACE478C2ACE47A1460000A1460000A3490000
+A64C0000AA500000B0540000B7580000C15E0000CD630004DA660010EA6600
+1BF75D002AEE4A003FD62C0057C50401739E0015797E00298066003D815A01
+5A81954EA72D9753E42BA361F91FA866FF1CA866FF1CA866FF1CA866FF1CA8
+66FF1CA866FF1CA866FF1CA866FF1CA866FF1CA866FF1CA866FF1CA1470000
+A1470000A34A0000A54D0000AA510000AF540000B6590000C05F0000CB6500
+03D869000DE76A0018FA650026F653003AD13B00519E22006E610800874400
+13923400289129003E9339196A6C7356C02A533DAC404835A3494835A34948
+35A3494835A3494835A3494835A3494835A3494835A3494835A3494835A349
+4835A349A1470000A1480000A24A0000A54E0000A9510000AE550000B55A00
+00BE600000CA680001D66C000BE36E0016F86C0022E3630034A150004D7B39
+00674D230081180C00990408169D010C2E990C185288A090FF0B9A8EFF0D9A
+8EFF0D9A8EFF0D9A8EFF0D9A8EFF0D9A8EFF0D9A8EFF0D9A8EFF0D9A8EFF0D
+9A8EFF0D9A8EFF0D9A8EFF0DA1480000A1480000A24B0000A44E0000A85200
+00AD560000B35B0000BC620000C7690000D4700008E0730013D677001FB473
+002F8C6700476A5300604441007C1126008A00251393002D2E937686AC2E95
+A0FA0C919DFF0C8F9DFF0D8F9DFF0D8F9DFF0D8F9DFF0D8F9DFF0D8F9DFF0D
+8F9DFF0D8F9DFF0D8F9DFF0D8F9DFF0D8F9DFF0DA1490000A1490000A24C00
+00A44F0000A7520000AC570000B25C0000BA630000C46C0000D1740005C27A
+0011B580001C9C82002A817F003E6478005A3B5F00700E4500850045148913
+5B3D736295A5327BA8ED1777A6FF1776A6FF1776A6FF1776A6FF1776A6FF17
+76A6FF1776A6FF1776A6FF1776A6FF1776A6FF1776A6FF1776A6FF17A14900
+00A14A0000A24D0000A3500000A6530000AA580000B05D0000B7640000C06E
+0000B3790006AA82000FA08B00188F92002279950031629C004C3A85006310
+6B007B0069167D006F3377409E8B4060B6D72067BCF81666BBF61666BBF616
+66BBF61666BBF61666BBF61666BBF61666BBF61666BBF61666BBF61666BBF6
+1666BBF616A14A0000A14B0000A14D0000A2500000A4540000A8590000AE5E
+0000B3650000A6720002A07D00079989000C9295001286A2001873AB002259
+AD003838A3005010900069008C166D009734681DB0724E57EDD01C43C7D122
+41C7D12341C7D12341C7D12341C7D12341C7D12341C7D12341C7D12341C7D1
+2341C7D12341C7D12341C7D123A14B0000A14B0000A14E0000A2510000A355
+0000A75A0000AA5F00009E6A000097760003938300058E900008879F000B7E
+B0000F6FBF001753C300293AC6003E16C0005600B5125F00D3305A00D45253
+35F3951B23DEAA2720DCA92920DCA92920DCA92920DCA92920DCA92920DCA9
+2920DCA92920DCA92920DCA92920DCA92920DCA929A14C0000A14C0000A14F
+0000A1520000A2560000A45B000098640000906E00018D7B00018988000284
+97000381AB00047EC5000573E3000A50E4001D36F3002F1CFF004403FF094F
+1AFF433721FF62290EFF78380DFFA1350DFFA2350DFFA2350DFFA2350DFFA2
+350DFFA2350DFFA2350DFFA2350DFFA2350DFFA2350DFFA2350DFFA235A14D
+0000A14D0000A1500000A0530000A1570000935F00008B6700018672000083
+7F0000808D00007C9D00007CB400007AD400016EF6000640DF00202CF80030
+11FF024311FF243B1CFF4E2D01FF513D11FF862F09FFAE3009FFAE3009FFAE
+3009FFAE3009FFAE3009FFAE3009FFAE3009FFAE3009FFAE3009FFAE3009FF
+AE3009FFAE30A14D0000A14E0000A0500000A0540000915A00008762000181
+6A00007E7500007B820000748F000070A0000071B700006CD2000251DC0011
+34DC002023F9003208FF044010FF2D3313FF4C2C15FF6D290FFF8C2A06FFB2
+2C06FFB22C06FFB22C06FFB22C06FFB22C06FFB22C06FFB22C06FFB22C06FF
+B22C06FFB22C06FFB22C06FFB22CA24E0000A24E0000A05000009156000085
+5C00017D640000786C0000757700006F8400006891000065A2000062B50000
+5CD000033FD300152BDF00221AFB003204FF0D3B0FFF332D06FF472F16FF77
+220DFF902604FFB02803FFB12803FFB12803FFB12803FFB12803FFB12803FF
+B12803FFB12803FFB12803FFB12803FFB12803FFB128A24E0000A24E000092
+530000855800017B5F0000746600006F6F00006B7A0000658600005E940000
+5BA4000058B700004CCA000835D2001625E5002311FD003100FF163713FF3F
+230BFF542513FF7C1E0AFF932201FFAA2500FFB12500FFB12500FFB12500FF
+B12500FFB12500FFB12500FFB12500FFB12500FFB12500FFB12500FFB125A2
+4E0000954F0000865500017B5A0000726000006B68000067710000627D0000
+5C8900005797000053A600004EB800013FC8000B2CD500161FEC00230BFF05
+2E00FF1E3015FF481B15FF651912FF7F190AFF951D01FFAA2100FFB12100FF
+B12100FFB12100FFB12100FFB12100FFB12100FFB12100FFB12100FFB12100
+FFB12100FFB121974F0000875200007B570000715C000069620000646A0000
+607400005A800000558C0000519900004CA8000045B9000236CB000B26DA00
+1618F2002204FF0B2C00FF242914FF4E160FFF661918FF830C0CFF961601FF
+AC1D00FFB11E00FFB11E00FFB11E00FFB11E00FFB11E00FFB11E00FFB11E00
+FFB11E00FFB11E00FFB11E00FFB11E875200007C54000072580000685D0000
+626400005D6D000059780000548300004F9000004A9C000045AA00003CBC00
+032DCF000C1FE0001613F7002101FF142703FF2B2112FF53110EFF6A1316FF
+83070CFF971000FFA91A00FFB21B00FFB21B00FFB21B00FFB21B00FFB21B00
+FFB21B00FFB21B00FFB21B00FFB21B00FFB21B00FFB21B7C54000073550000
+69590000615F00005C67000058700000537B00004E87000049930000439F00
+003DAD000034C1000326D3000C19E600160AFA002200FF1B210DFF391310FF
+560E0CFF6C0F16FF85000DFF960A01FFAA1700FFB11800FFB11800FFB11800
+FFB11800FFB11800FFB11800FFB11800FFB11800FFB11800FFB11800FFB118
+725500006A560000625B00005B610000566A0000527400004D7F0000488B00
+00429600003CA2000036B200002BC600041FD7000D13EB001600F90A2000FF
+201C13FF44060DFF580B08FF6B0E12FF83000EFF940500FFA61301FFAF1301
+FFAF1301FFAF1301FFAF1301FFAF1301FFAF1301FFAF1301FFAF1301FFAF13
+01FFAF1301FFAF1369560000635800005B5D000056640000516D00004C7800
+0047830000418E00003B99000035A600002EB8000023CA000518DB000D0AED
+001700FC121A04FF271412FF48010BFF5A0704FF6B0D0EFF82000DFF920100
+FFA30F00FFAD0F00FFAD0F00FFAD0F00FFAD0F00FFAD0F00FFAD0F00FFAD0F
+00FFAD0F00FFAD0F00FFAD0F00FFAD0F>
+<A03D0000A03E0000A13F0000A6420000AC460000B3490000BB4B0000C34D00
+03CD4A000FD540001CD631002CC81D0042BB06045AB200185AB2002E56BA00
+4A55BA006952AB008A519F00AA4C9E01EC439C0BFF389C0BFF389C0BFF389C
+0BFF389C0BFF389C0BFF389C0BFF389C0BFF389C0BFF389C0BFF389C0BFF38
+9C0BFF389C0BFF38A03D0000A03E0000A13F0000A6430000AC460000B34900
+00BB4C0000C34D0003CD4A000FD641001CD731002CC81E0042BB06045AB200
+185AB2002D56BA004955BA006952AC008A529F00AA4C9E01EB439C0BFF389C
+0BFF389C0BFF389C0CFF389C0CFF389C0CFF389C0CFF389C0CFF389C0CFF38
+9C0CFF389C0CFF389C0CFF389C0CFF38A03D0000A03E0000A13F0000A64300
+00AC460000B3490000BA4C0000C34E0003CD4B000ED643001CD934002BCA20
+0041BE07025AB300165BB2002C57B9004756BB006753AC008853A000A94D9D
+01E5459D0DFF399D0DFF399D0DFF399D0DFF399D0DFF399D0DFF399D0DFF39
+9D0DFF399D0DFF399D0DFF399D0DFF399D0DFF399D0DFF39A03E0000A03E00
+00A1400000A6430000AC460000B24A0000BA4C0000C34E0002CD4C000ED744
+001BDA36002ACC22003FC008015AB400145CB2002A58B9004557BC006554AD
+008654A100A84E9C01E0469E0EFF399E0EFF399E0EFF399E0EFF399E0EFF39
+9E0EFF399E0EFF399E0EFF399E0EFF399E0EFF399E0EFF399E0EFF399E0EFF
+39A03E0000A03F0000A2400000A6440000AC470000B24A0000BA4D0000C34F
+0002CD4D000DD746001ADB380029CE24003EC20A0059B500125EB2002859B8
+004258BD006455AE008455A200A74F9B01DB489F0FFF399F0FFF399F0FFF39
+9F0FFF399F0FFF399F0FFF399F0FFF399F0FFF399F0FFF399F0FFF399F0FFF
+399F0FFF399F0FFF39A03E0000A03F0000A2410000A6440000AC470000B24A
+0000BA4D0000C3500001CD4E000DD8480019DC3A0028D027003DC40C0058B6
+00115FB200275AB7004059BE006256AE008256A300A6519A01D649A010FF3A
+9F10FF3AA010FF3AA010FF3AA010FF3AA010FF3AA010FF3AA010FF3AA010FF
+3AA010FF3AA010FF3AA010FF3AA010FF3AA03F0000A03F0000A2410000A644
+0000AC480000B24B0000BA4E0000C3500001CD4F000CD94A0018DE3D0028D3
+29003BC60F0056B6000F60B200255CB7003E5ABF005F57AF007F57A400A552
+9900D24BA211FF3AA011FF3AA011FF3AA011FF3AA011FF3AA011FF3AA011FF
+3AA011FF3AA011FF3AA011FF3AA011FF3AA011FF3AA011FF3AA03F0000A140
+0000A2410000A6450000AB480000B24B0000B94E0000C2510001CD51000BD9
+4C0017DF3F0026D62D003AC8130053B8000C61B300235DB6003B5BBF005C58
+B0007C58A500A4539900CF4DA211FF3CA011FF3CA011FF3CA011FF3CA011FF
+3CA011FF3CA011FF3CA011FF3CA011FF3CA011FF3CA011FF3CA011FF3CA011
+FF3CA1400000A1400000A2420000A6450000AB480000B24B0000B94F0000C2
+520001CD52000AD94E0016E0430025D9300038C9170051B9000963B300205F
+B400385CBE00595AB000795AA601A1559900CB4FA211FF3DA011FF3DA011FF
+3DA011FF3DA011FF3DA011FF3DA011FF3DA011FF3DA011FF3DA011FF3DA011
+FF3DA011FF3DA011FF3DA1400000A1410000A2420000A6460000AB490000B1
+4C0000B94F0000C2530001CD540009DA510015E2470023DC340036CA1C004E
+BE040862B4001D60B400345EBE00555CB100755CA7019D569900C851A311FF
+3FA011FF3FA011FF3FA011FF3FA011FF3FA011FF3FA011FF3FA011FF3FA011
+FF3FA011FF3FA011FF3FA011FF3FA011FF3FA1410000A1410000A2430000A6
+460000AB490000B14D0000B8500000C1540001CC550008D9530014E44B0022
+DF390034CB21004AC3070661B5001A62B4003060BE00505EB400715EA90298
+589900C4549F0EFD44A011FF41A011FF41A011FF41A011FF41A011FF41A011
+FF41A011FF41A011FF41A011FF41A011FF41A011FF41A011FF41A1420000A1
+420000A2440000A6470000AA4A0000B04D0000B7510000C0550000CB570007
+D9560012E54F0020E33F0031CF270047C90C0360B7001565B3002C62BE004A
+61B7006C5FAB03935A9A00C0569C0AFB499F11FF439F11FF439F11FF439F11
+FF439F11FF439F11FF439F11FF439F11FF439F11FF439F11FF439F11FF439F
+11FF43A1420000A1430000A2440000A5470000AA4B0000B04E0000B7520000
+C0560000CB580005D8590011E654001DE846002ED62F0043D111015EBA0010
+68B3002764BA004463BA03675FAF088F589F06B9559209F54F9110F84B8A0E
+F74E890EF74F890EF74F890EF74F890EF74F890EF74F890EF74F890EF74F89
+0EF74F890EF74F890EF74FA1430000A1440000A2450000A5480000A94B0000
+AF4F0000B6520000BF570000CA5A0004D75C000FE659001BEB4C002BDE3800
+3FD21A0059BE000A6BB4002267B6003C66A5055B679811825E8613A4597313
+CC58751BE64F751FEA4C751FEA4C751FEA4C751FEA4C751FEA4C751FEA4C75
+1FEA4C751FEA4C751FEA4C751FEA4C751FEA4CA1440000A1440000A2460000
+A5490000A94C0000AE500000B4530000BD580000C85C0002D55F000DE45D00
+18EF540027E742003BD1240053C402046C940015757B00297B64003D7C5700
+597D6A1F8F5D7C39DD417C3DFB3C7A3FFB3C7A3FFB3C7A3FFB3C7A3FFB3C7A
+3FFB3C7A3FFB3C7A3FFB3C7A3FFB3C7A3FFB3C7A3FFB3C7A3FFB3CA1450000
+A1450000A2460000A4490000A84D0000AD500000B3540000BC590000C75E00
+01D362000BE2620016F35D0023EE4C0036C037004D9320006A5C0600844100
+138D3100278B27003D8D2000598C381F96642C18A26B1E0D96781D0C957A1D
+0C957A1D0C957A1D0C957A1D0C957A1D0C957A1D0C957A1D0C957A1D0C957A
+1D0C957AA1460000A1460000A2470000A44A0000A74E0000AC510000B25500
+00BB5A0000C5600000D1650008DE670013F063001FCC5D00319A4B00497433
+00624820007C160A009404071597010B2C93000F47905C5AB9377971FF2778
+72FF277872FF277872FF277872FF277872FF277872FF277872FF277872FF27
+7872FF277872FF277872FF27A1470000A1470000A1480000A34B0000A74F00
+00AB520000B1560000B95B0000C3620000CF680005D76B0011C670001DA86C
+002D865F0044644D005C3E3B0075102401860023138D002A2C8D2148686676
+88EC235B72F5315A73F7315A73F7315A73F7315A73F7315A73F7315A73F731
+5A73F7315A73F7315A73F7315A73F7315A73F731A1470000A1480000A14900
+00A34C0000A64F0000AA530000AF570000B75D0000C0640000C36C0004B673
+0011A979001C937900297A76003C5C6B00563657006B0C4000800042148400
+4C2F81447F8E465E91DE2A6795FF1C6796FF1C6796FF1C6796FF1C6796FF1C
+6796FF1C6796FF1C6796FF1C6796FF1C6796FF1C6796FF1C6796FF1CA14800
+00A1490000A14A0000A24D0000A5500000A8540000AE580000B45E0000B366
+0000AA710008A17A00109681001985870023718B00325B91004D337700600C
+62007800631678006A33720E7B656344A3D22F5EA9FC155DA9FB155DA9FB15
+5DA9FB155DA9FB155DA9FB155DA9FB155DA9FB155DA9FB155DA9FB155DA9FB
+155DA9FB15A1490000A14A0000A14B0000A24E0000A4510000A7550000AC5A
+0000A96100009F6B0004987600099180000D888B00137B95001A699C002652
+9D00393294004F0B83016800831769008D356400975A5E26B3A8392BB5E92F
+2CB8ED2E2CB9ED2E2CB9ED2E2CB9ED2E2CB9ED2E2CB9ED2E2CB9ED2E2CB9ED
+2E2CB9ED2E2CB9ED2E2CB9ED2EA14A0000A14B0000A14C0000A24F0000A352
+0000A5560000A15C000097650002906F00048C7B0006868700097E94000D74
+A2001164AC001A4BAF002B33B1003F0FA8005500A2155A00B9315600C0554F
+06D5894224F4EC2A22F0EE2B22EFED2B22EFED2B22EFED2B22EFED2B22EFED
+2B22EFED2B22EFED2B22EFED2B22EFED2B22EFED2BA14B0000A14B0000A14D
+0000A1500000A15300009B580000906000018969000285740002828100027D
+8E0003759E000571B2000765C6000E46C6002131D4002F19E8004200E70D4D
+11FF3A3B09FF583B12FF8A310AFFAE3206FFB23206FFB23206FFB23206FFB2
+3206FFB23206FFB23206FFB23206FFB23206FFB23206FFB23206FFB232A14C
+0000A14C0000A14E0000A1500000995500008C5C0001846400017E6D00007C
+790000778600006F9500006FA800006EC0000062DA000540D6001A2CE90027
+16FF003902FF11411DFF49250BFF563012FF83280AFFA62A05FFB22B05FFB2
+2B05FFB22B05FFB22B05FFB22B05FFB22B05FFB22B05FFB22B05FFB22B05FF
+B22B05FFB22BA14D0000A14D0000A14E0000995200008A590001805F00007A
+67000075700000717C00006A8900006397000062A800005EBF000051D30009
+34D5001A24EE00280EFF023701FF1C3A17FF4B230DFF60280FFF872407FFA9
+2602FFB12702FFB12702FFB12702FFB12702FFB12702FFB12702FFB12702FF
+B12702FFB12702FFB12702FFB127A24E0000A24E00009C4F00008A5500017F
+5B000077610000706900006C730000677F0000608B00005A99000058AA0000
+54C0000140CC000F2CD8001A1DF4002806FF073405FF272E14FF521F16FF71
+1C0CFF8B2006FFA52200FFB22400FFB22400FFB22400FFB22400FFB22400FF
+B22400FFB22400FFB22400FFB22400FFB22400FFB224A24E00009E4E00008B
+5200007F570000755D00006D630000686B0000647600005E820000588F0000
+549C000050AC000048BF000435CD000F25DE001B17FA002702FF112F0BFF33
+2314FF581910FF731A0DFF8D1A08FFA81C00FFB22100FFB22100FFB22100FF
+B22100FFB22100FFB22100FFB22100FFB22100FFB22100FFB22100FFB221A0
+4E00008C51000080540001755900006C5E000066650000616E00005C790000
+57850000529200004D9F000048AE00003DC000062DD1000F1FE4001B0FFC00
+2700FF192A09FF371E0FFF5A1716FF790E15FF910B04FFA61A00FFB21D00FF
+B21D00FFB21D00FFB21D00FFB21D00FFB21D00FFB21D00FFB21D00FFB21D00
+FFB21D00FFB21D8D51000080530001765600006B5A0000646000005E680000
+5A720000557D0000508900004B95000046A2000040B1000135C5000625D600
+1019EB001A06FD052600FF202413FF46100DFF5E140EFF771014FF920602FF
+A21800FFB71A00FFB91900FFB91900FFB91900FFB91900FFB91900FFB91900
+FFB91900FFB91900FFB91900FFB91980530001765500006D570000645C0000
+5D620000596B0000547500004F8100004A8C0000459800003FA5000038B600
+012CCA00061FDB001012F0001A00FD0F2200FF241E13FF4C0A0CFF610F13FF
+7B0214FF910104FFA11306FFBC120BFFC50E0BFFC50E0BFFC50E0BFFC50E0B
+FFC50E0BFFC50E0BFFC50E0BFFC50E0BFFC50E0BFFC50E755500006C560000
+655800005D5E000058650000536E00004E79000049850000449000003E9B00
+0037A9000030BC000124CE000718E0001009F2001C00FE171C0AFF311012FF
+500409FF620C0DFF780510FF8E0000FF9D100EFFC20612FFCA0212FFCA0212
+FFCA0212FFCA0212FFCA0212FFCA0212FFCA0212FFCA0212FFCA0212FFCA02
+6B560000645700005D5A000058600000526800004D730000487E0000438800
+003D930000369F00002FAE000028C100011CD1000811E4001001F3051B00FF
+1D170DFF39070FFF520106FF630A09FF78050CFF8C0003FF9C0A04FFB40A07
+FFB80707FFB80707FFB80707FFB80707FFB80707FFB80707FFB80707FFB807
+07FFB80707FFB807635800005D590000585C0000526300004D6C0000487700
+00428200003C8C0000359700002EA3000027B3000020C4000115D500090AE7
+001200F60E1500FF211209FF39060BFF530109FF660009FF780009FF890005
+FF980504FFAA0504FFAC0504FFAC0504FFAC0504FFAC0504FFAC0504FFAC05
+04FFAC0504FFAC0504FFAC0504FFAC05>
+<9D3700009D3700009D380000A13B0000A73F0000AE420000B6440000BE4500
+01C341000CC935001AC826002ABC140040AE010655AD001C51AF00314DB600
+4C4BB9006A48AC008747A000A3429D00D63B9803FF349502FF339502FF3395
+02FF339502FF339502FF339502FF339502FF339502FF339502FF339502FF33
+9502FF339502FF339D3700009D3800009E390000A13C0000A73F0000AF4200
+00B6450000BE460001C442000CCA37001ACA280029BD16003FAF020555AD00
+1A52AF00304DB6004A4CB9006949AC008648A000A2439C00D33C9803FF3595
+03FF339503FF339603FF339603FF339603FF339603FF339603FF339603FF33
+9603FF339603FF339603FF339603FF339D3800009D3800009E390000A13C00
+00A8400000AF430000B7450000BE470001C443000BCA390019CC2A0029BF18
+003EB1020456AE001953AF002E4EB600494CBA00674AAD008549A100A1449C
+00D13D9904FF359603FF349603FF349603FF349603FF349603FF349603FF34
+9603FF349603FF349603FF349603FF349603FF349603FF349D3800009E3900
+009E3A0000A23D0000A8400000AF430000B7460000BE480001C444000BCB3A
+0019CE2C0028C11A003DB2030256AE001754AF002D4FB500474DBA00664BAE
+00844AA100A0469C00CE3E9A04FF369603FF359604FF359604FF359604FF35
+9604FF359604FF359604FF359604FF359604FF359604FF359604FF359604FF
+359E3900009E3900009E3A0000A23D0000A8410000AF440000B7460000BE48
+0000C545000ACB3C0018CF2D0027C31C003CB4030157AF001655AF002B50B5
+00454EBB00644CAE00824BA2009F479C00CB3F9A05FF379704FF359704FF35
+9704FF359704FF359704FF359704FF359704FF359704FF359704FF359704FF
+359704FF359704FF359E3900009E3A00009F3B0000A23E0000A8410000AF44
+0000B6470000BE490000C546000ACC3E0017D0300026C51E003AB6050056AF
+001456B0002A52B500434FBC00624DAF00804CA2009E489B00C8419B06FF37
+9705FF369705FF369705FF369705FF369705FF369705FF369705FF369705FF
+369705FF369705FF369705FF369705FF369E3A00009F3B00009F3C0000A23E
+0000A8420000AF450000B6470000BE4A0000C5480009CD400017D2320025C7
+200039B9080054B0001258B0002853B5004051BD00604EB0007E4EA3009D4A
+9B00C5429D07FF389705FF379705FF379705FF379705FF379705FF379705FF
+379705FF379705FF379705FF379705FF379705FF379705FF379F3B00009F3C
+00009F3D0000A33F0000A8420000AF450000B6480000BE4A0000C6490008CE
+420016D4350024CA230037BC0C0051B100105AB0002555B4003D52BD005D50
+B1007B4FA4009C4C9A00C0449E08FF399907FF379907FF379907FF379907FF
+379907FF379907FF379907FF379907FF379907FF379907FF379907FF379907
+FF379F3C00009F3D0000A03D0000A3400000A8430000AE460000B6490000BE
+4B0000C74B0007CF450015D6380023CE260035C010004FB2000D5BB1002357
+B3003A54BD005A51B2007851A5009A4E9A00BD46A10AFF3A9A09FF389A09FF
+389A09FF389A09FF389A09FF389A09FF389A09FF389A09FF389A09FF389A09
+FF389A09FF389A09FF389F3D0000A03D0000A03E0000A3400000A8440000AE
+470000B54A0000BD4C0000C74D0006D0480013D83C0021D12B0033C315004B
+B5020A5CB2002059B3003656BD005554B3007553A70097509B00BA49A30BFF
+3B9C0BFF389C0BFF389C0BFF389C0BFF389C0BFF389C0BFF389C0BFF389C0B
+FF389C0BFF389C0BFF389C0BFF389C0BFF38A03D0000A03E0000A03F0000A3
+410000A8440000AE480000B54B0000BD4D0000C74E0005D04B0012D9410020
+D62F0031C61A0048BA04075CB2001C5BB3003258BD005156B5007055A80093
+529C00B74BA20AFF3E9E0EFF399E0EFF399E0EFF399E0EFF399E0EFF399E0E
+FF399E0EFF399E0EFF399E0EFF399E0EFF399E0EFF399E0EFF39A03E0000A0
+3F0000A03F0000A3420000A8450000AE480000B54C0000BD4E0000C6500004
+D14E0010DB45001EDB35002ECB200044C007045CB400185EB3002E5ABC004B
+59B7006C57AA008F559D00B44FA108FF42A011FF3AA011FF3AA011FF3AA011
+FF3AA011FF3AA011FF3AA011FF3AA011FF3AA011FF3AA011FF3AA011FF3AA0
+11FF3AA03F0000A1400000A1400000A3430000A8460000AD490000B44D0000
+BC4F0000C6520003D151000FDD4A001BE03C002CD0260041C70B015CB60013
+61B200295DBA00455BBB006659AC008A589800AF558601E6518B10FF45860E
+FF47810DFE49810DFE49810DFE49810DFE49810DFE49810DFE49810DFE4981
+0DFE49810DFE49810DFE49A1400000A1410000A1410000A3440000A7470000
+AD4A0000B34E0000BB510000C5540002D154000DDE500019E3430028D82F00
+3CCA130057BA000D64B3002460AC003B629B0057668C017868730096665E00
+C0645500E4625300E3635000E3645000E3645000E3645000E3645000E36450
+00E3645000E3645000E3645000E3645000E364A1410000A1420000A1420000
+A3450000A7480000AC4B0000B34F0000BA520000C4560001D057000BDE5500
+16E74B0025DF390038CC1E0050B203046A8B0014717600287762003C765500
+56784A0078763F00AA723900E16E3700E16F3500E0703500E0703500E07035
+00E0703500E0703500E0703500E0703500E0703500E0703500E070A1420000
+A1430000A1430000A3460000A6490000AB4C0000B14F0000B9530000C35700
+00CE5A0008DD5A0014EA530021E7430033B3310049891D0067570500803E00
+13873000268526003B871F0057861A007D831903B37D1705B27D1606B27D16
+06B27D1606B27D1606B27D1606B27D1606B27D1606B27D1606B27D1606B27D
+1606B27DA1440000A1440000A1450000A3470000A64A0000AA4D0000B05100
+00B7550000C1590000CD5D0006DA5F0011DF5C001EBB56002F934500456D30
+005D431E00771509008F04071592010B2B8D000E458A1B2282704A49F74549
+4AF744494BF844494BF844494BF844494BF844494BF844494BF844494BF844
+494BF844494BF844494BF844A1450000A1450000A1460000A3480000A54B00
+00A94E0000AF520000B6560000BF5B0000CA600003C8650010B969001C9E64
+002C7F5800405E4700573A36006F0E2201810022128700282A86002F4D833C
+5AB44E4A61FF39405DF63F3B5BF2423B5BF2423B5BF2423B5BF2423B5BF242
+3B5BF2423B5BF2423B5BF2423B5BF2423B5BF242A1460000A1460000A14700
+00A2490000A44C0000A84F0000AD530000B4570000BD5D0000B7640005AC6C
+00119F70001C8A700029736D003A5560005132500066093B007B003E147E00
+482D7C004E53772769A4514F7DFF245280FF1F5683FF1C5683FF1C5683FF1C
+5683FF1C5683FF1C5683FF1C5683FF1C5683FF1C5683FF1C5683FF1CA14700
+00A1470000A1480000A24A0000A44D0000A7500000AC540000B2590000AA61
+0000A169000A997200118D7800197D7D00236A800032517E004A2E6C005C08
+5A0074005E16730065326E006D596A117A92563991EE29358DFA2B318DFA2E
+318DFA2E318DFA2E318DFA2E318DFA2E318DFA2E318DFA2E318DFA2E318DFA
+2E318DFA2EA1480000A1480000A1490000A14B0000A34E0000A6510000AA55
+0000A05D000097650005906E000A8978000F7F810014718A001C618F00284B
+8E003A2C86004D07790166007C186500853561008D585B008E83541EA6EC38
+1DA3FF371CA3FF371CA3FF371CA3FF371CA3FF371CA3FF371CA3FF371CA3FF
+371CA3FF371CA3FF371CA3FF37A1490000A14A0000A14A0000A14C0000A24F
+0000A4520000995900008F61000289690005847400077E7F0009758A000E6A
+9500145A9D001E449F002D2C9F003E099701540096175600A7325200AE544B
+00B782440EC9D23815CBFF3114CBFF3214CBFF3214CBFF3214CBFF3214CBFF
+3214CBFF3214CBFF3214CBFF3214CBFF3214CBFF32A14A0000A14B0000A14B
+0000A14D0000A1500000945600008A5D0001826400027D6E00027A79000373
+8500046A93000763A1000A55AC00153FB200232CBC002F11C2004100C31148
+00E52E4500E9503E10FF902F06FEAE3103FDC92F02FEC72F02FEC72F02FEC7
+2F02FEC72F02FEC72F02FEC72F02FEC72F02FEC72F02FEC72F02FEC72FA14C
+0000A14C0000A14C0000A14E000092530000865A00017D6100007768000074
+7300006E7F0000678C0000629C00005FAF00005BC900033FCE00142CDC001F
+1BF9002F04FF0D3A0CFF332D04FF492F13FF7E2209FF9F2502FFB12702FFB1
+2702FFB12702FFB12702FFB12702FFB12702FFB12702FFB12702FFB12702FF
+B12702FFB127A14D0000A14D0000A14D000092510000845700017A5D000073
+6400006D6D000069770000638400005C91000059A0000055B100004BC60006
+35D1001325E2002013FE002E01FF163415FF431E15FF631C10FF821E0AFFA0
+2000FFB22400FFB22300FFB22300FFB22300FFB22300FFB22300FFB22300FF
+B22300FFB22300FFB22300FFB223A14E0000A24E0000935000008454000179
+590000705F00006A660000656F0000607B00005A8700005594000051A30000
+4CB300003FC500092CD400141EEA00200BFF032D00FF1E2D15FF4B1811FF67
+1A14FF86140AFFA01B00FFB12000FFB22000FFB22000FFB22000FFB22000FF
+B22000FFB22000FFB22000FFB22000FFB22000FFB220A24E00009450000085
+5200007A5600006F5B000068610000626900005E730000587E0000538A0000
+4E9700004AA5000043B6000135C8000925D9001418F0001F02FF0B2A00FF24
+2712FF4F1411FF6B131CFF8B0206FF9F1800FFB11D00FFB41C00FFB41C00FF
+B41C00FFB41C00FFB41C00FFB41C00FFB41C00FFB41C00FFB41C00FFB41C95
+4F0000845200007A54000070570000675C0000606300005B6C000057760000
+528200004D8E0000489A000042A800003BBA00022CCD000A1FDF001411F500
+1F00FF14240AFF321813FF550D0CFF6C1218FF8A0004FF9D1500FFB11908FF
+C71208FFC71208FFC71208FFC71208FFC71208FFC71208FFC71208FFC71208
+FFC71208FFC712845200007954000070560000675900005F5E00005A660000
+566F0000517A00004C86000046920000419E00003AAB000032C0000124D100
+0A18E5001408F7031F00FF1C1E0AFF37120DFF560D0CFF6E0B14FF880006FF
+9A0E00FFAF1515FFE30415FFE30415FFE30415FFE30415FFE30415FFE30415
+FFE30415FFE30415FFE30415FFE304785400006F56000067570000605A0000
+5961000054690000507300004B7F0000458A00004095000039A1000032B100
+002AC500021DD5000B11E9001400F80A1E00FF211913FF45030DFF590706FF
+6C0D0FFF860005FF980A00FFAE1112FFDD0212FFDD0212FFDD0212FFDD0212
+FFDD0212FFDD0212FFDD0212FFDD0212FFDD0212FFDD026E56000066570000
+60580000595C0000546400004F6D00004A780000458300003F8D0000389800
+0031A600002AB6000021C8000316DA000B09EC001500FA121700FF251410FF
+470009FF5A0606FF6E080BFF840007FF970501FFA90B0BFFC6030BFFC6030B
+FFC6030BFFC6030BFFC6030BFFC6030BFFC6030BFFC6030BFFC6030BFFC603
+655700005E590000595B0000545F00004F67000049710000447C00003E8700
+0037910000309C000029AA000022BB00001ACB00040FDD000C02EE051500FC
+191200FF290F0BFF470009FF5D0008FF700007FF820004FF930403FFA30503
+FFB40403FFB40403FFB40403FFB40403FFB40403FFB40403FFB40403FFB404
+03FFB40403FFB4045D590000585B0000545D00004F630000496B0000447600
+003E800000378A00002F94000029A0000022AE00001BBE000012CE000508E1
+000C00F10B1000FD1E0E00FF2E0B08FF4A0005FF5E0004FF6F0004FF7F0002
+FF900302FF9F0302FFAD0202FFAD0202FFAD0202FFAD0202FFAD0202FFAD02
+02FFAD0202FFAD0202FFAD0202FFAD02>
+<993000009A3100009A3100009B320000A0360000A7390000AE3B0000B53D00
+00B9380009BC2C0017BB1F0027AE0E003DA5000A4BA7001F48AB003343B100
+4D41B500693FAD00853DA4009F399E00C7339900FE2D9300FF2A9300FF2A93
+00FF2A9300FF2A9300FF2A9300FF2A9300FF2A9300FF2A9300FF2A9300FF2A
+9300FF2A9300FF2A993000009A3100009A3200009B330000A1370000A73A00
+00AF3C0000B63D0000BA390008BD2E0017BC200027B00F003CA600084CA800
+1D49AB003244B1004C42B6006840AE00843EA4009E3A9E00C5339901FE2E93
+00FF2B9300FF2B9300FF2B9300FF2B9300FF2B9300FF2B9300FF2B9300FF2B
+9300FF2B9300FF2B9300FF2B9300FF2B9A3100009A3200009A3200009B3300
+00A1370000A73A0000AF3D0000B63E0000BB3A0008BE2F0016BE220026B111
+003BA600074DA8001C4AAB003144B1004A42B6006741AE00833FA4009D3B9E
+00C3349A01FE2F9300FF2C9300FF2C9300FF2C9300FF2C9300FF2C9300FF2C
+9300FF2C9300FF2C9300FF2C9300FF2C9300FF2C9300FF2C9A3100009A3200
+009B3300009B340000A2380000A83B0000AF3E0000B73F0000BB3B0007BE30
+0016C0230025B312003AA700054EA8001B4BAB002F46B1004943B7006542AF
+008140A4009C3C9D00C0359A01FE309400FF2C9400FF2C9400FF2D9400FF2D
+9400FF2D9400FF2D9400FF2D9400FF2D9400FF2D9400FF2D9400FF2D9400FF
+2D9A3200009B3300009B3400009C350000A2390000A83C0000B03F0000B740
+0000BC3D0007BF320015C1250024B5140039A8000450A900194CAC002E47B1
+004744B7006443AF008041A4009A3D9D00BE379A01FD319400FF2D9400FF2D
+9400FF2D9400FF2D9400FF2D9400FF2D9400FF2D9400FF2D9400FF2D9400FF
+2D9400FF2D9400FF2D9B3300009B3300009B3400009C350000A33A0000A93D
+0000B03F0000B8410000BD3E0006C0340014C3270023B8170037A9000151A9
+00174EAC002C48B1004446B8006244B0007F42A400993F9D00BB389B01FD32
+9400FF2E9400FF2E9400FF2E9400FF2E9400FF2E9400FF2E9400FF2E9400FF
+2E9400FF2E9400FF2E9400FF2E9400FF2E9B3300009B3400009C3500009D36
+0000A33B0000A93E0000B0400000B8420000BE400006C1370014C5290022BB
+190036AC030150AA00154FAC002A4AB1004247B9005F45B1007C44A5009740
+9C00B73A9B01FC339400FF309400FF309400FF309400FF309400FF309400FF
+309400FF309400FF309400FF309400FF309400FF309400FF309B3400009C35
+00009C3600009D370000A33C0000A93E0000B1410000B8430000BF420005C3
+390013C72C0021BE1C0034AF06004EAB001251AD00284CB1003F49BA005D47
+B2007A45A60095439C00B43C9C01FC359401FF319401FF319401FF319401FF
+319401FF319401FF319401FF319401FF319401FF319401FF319401FF319401
+FF319C3500009C3600009D3700009D380000A33C0000AA3F0000B1420000B8
+440000C0440004C43C0012C92F0020C21F0032B30A004CAB000F53AD00254E
+B0003C4BBA005949B3007747A60094459C00B13E9E02FB369502FF329502FF
+329502FF329502FF329502FF329502FF329502FF329502FF329502FF329502
+FF329502FF329502FF329D3700009D3700009D3800009E390000A43D0000AA
+410000B1430000B9460000C1460003C63F0011CC33001FC6230030B80E0048
+AE010C55AE002250B000384DBA00554BB5007349A80091489C00AE419E02FA
+389603FF339603FF339603FF349603FF349603FF349603FF349603FF349603
+FF349603FF349603FF349603FF349603FF349D3800009E3900009E3A00009F
+3B0000A43E0000AA420000B2450000B9470000C1480003C742000FCE37001D
+CB27002DBD140045B1020956AF001E53B000344FB900514EB600704CA9008E
+4A9D00AC449F02F73B9604FF359604FF359604FF359604FF359604FF359604
+FF359604FF359604FF359604FF359604FF359604FF359604FF359E3900009E
+3A00009F3B00009F3C0000A4400000AA430000B1460000B9480000C14A0002
+C846000DD03C001BD12D002BC3190041B6040557AF001A56B1002F52B9004B
+50B8006B4EAB008A4D9E00A9479F01F43E9705FF379705FF37980AFF36990D
+FF35990DFF35990DFF35990DFF35990DFF35990DFF35990DFF35990DFF3599
+0DFF359F3B00009F3C0000A03D0000A03D0000A4410000AA440000B1470000
+B84A0000C14C0001C949000CD2410019D6330029C91F003DBB060059B10015
+59B1002B55B8004553BB006651A70085539200A4508100C94D8611FF3D8412
+FF3E7C0EFF42790DFE44790DFE44790DFE44790DFE44790DFE44790DFE4479
+0DFE44790DFE44790DFE449F3D0000A03D0000A03E0000A03F0000A4420000
+AA450000B0480000B84B0000C04E0000CA4D000AD4470017D93A0026CF2700
+39C10E0054B4000F5DB2002558A200395D9400546285007264710090625E00
+B75F5A06F0565909F2555709F2555609F2565609F2565609F2565609F25656
+09F2565609F2565609F2565609F2565609F256A03E0000A03F0000A03F0000
+A1400000A5430000AA470000B04A0000B74D0000BF4F0000CA510008D44C00
+14DD410023D72F0035C618004DA00303678200146D710027725F003A725200
+5372490074713F009F6E3800F0693600FE6A3400FE6A3300FC6B3300FC6B33
+00FC6B3300FC6B3300FC6B3300FC6B3300FC6B3300FC6B3300FC6BA03F0000
+A1400000A1410000A1410000A5440000A9480000AF4B0000B64E0000BF5100
+00C9540006D5520011E04A001FD63B0030A92D00477F1B00625204007C3C00
+12812E002580250039811E0054801A00767D1B05C4751805D5751605D37615
+06D3761506D3761506D3761506D3761506D3761506D3761506D3761506D376
+1506D376A1410000A1410000A1420000A1430000A4460000A9490000AE4C00
+00B5500000BD530000C8570003D457000FCB55001CAE4E002C8B400041662C
+005A3F1C00721308008A0406148C010A2A88000D428500116984111FC26F0B
+1DD86F0A1ED96F091FD96F091FD96F091FD96F091FD96F091FD96F091FD96F
+091FD96F091FD96F091FD96FA1420000A1430000A1430000A1440000A44700
+00A84A0000AD4E0000B3510000BC550000C6590002BB5E000FAC61001C955C
+002A7951003C59410053363200690D20017C0020128100262880002C497D03
+3377772146D7510A37DB620A38DD610B39DD610B39DD610B39DD610B39DD61
+0B39DD610B39DD610B39DD610B39DD610B39DD61A1440000A1440000A14500
+00A1450000A3480000A74B0000AC4F0000B1520000B9570000AC5E0006A264
+00119568001B836700286D6400385058004D2E4A006107360075003B137800
+442B77004B4F73024F7B6A185BCC4D1055E64E1157E84C1158E94C1158E94C
+1158E94C1158E94C1158E94C1158E94C1158E94C1158E94C1158E94CA14500
+00A1460000A1460000A1470000A3490000A64D0000AA500000AD540000A15C
+00019863000A906A0011846F00197574002363750031496E00442963005806
+54016F0059166E0061316A00675567006A7D5F026AB1560F72F44A0F74F649
+0F75F7480F75F7480F75F7480F75F7480F75F7480F75F7480F75F7480F75F7
+480F75F748A1470000A1470000A1480000A1480000A24B0000A54E0000A452
+000098590000906000058968000A8170000E777800146A7F001D5A83002843
+800038267B004B0571026300751961007D345D0085555700867B50038DC449
+078FFF400690FF400690FF400690FF400690FF400690FF400690FF400690FF
+400690FF400690FF400690FF40A1480000A1480000A1490000A1490000A24C
+00009F50000092560000895D0002826400057C6D00077576000A6C81000E61
+8A0016528F00213E92002D2591003E058C0252008E18520099314E00A15147
+00A77C4100ADB93C00A8FF3901A9FF3801A9FF3801A9FF3801A9FF3801A9FF
+3801A9FF3801A9FF3801A9FF3801A9FF3801A9FF38A1490000A14A0000A14A
+0000A14A00009C4E00008E540000845A00017C60000176680002717300036B
+7E0005638900085A94000E4B9D001A39A3002426AA003009AA014100AF1443
+00C22E4000C84E3A05F5883300EAA93115E1FF2415E1FF2315E2FF2315E2FF
+2315E2FF2315E2FF2315E2FF2315E2FF2315E2FF2315E2FF2315E2FF23A14B
+0000A14B0000A14B00009C4C00008C52000081570000775D0000706400006B
+6D000067790000608500015A92000155A1000349AD000D37B9001627C60020
+17DC002E01EB0C370DFE332908FF4C2812FF7F1F0AFF9E2100FFB12400FFB6
+2400FFB62400FFB62400FFB62400FFB62400FFB62400FFB62400FFB62400FF
+B62400FFB624A14C0000A14C00009D4D00008B5000007F550000755B00006D
+61000067690000627400005D7F0000578C0000539A00004EA9000047BB0002
+36CB000D25DC001917F7002501FF112E0AFF322213FF5B1813FF7A150AFF97
+1A00FFAE1F00FFB21F00FFB21F00FFB21F00FFB21F00FFB21F00FFB21F00FF
+B21F00FFB21F00FFB21F00FFB21FA14D00009F4E00008B5100007F53000174
+5800006A5D0000646400005F6D00005B77000055830000509000004C9D0000
+46AB00003DBD00042DD0000D1FE300190FFA012400FF1A2709FF381C0EFF5D
+1615FF7D0B0AFF981400FFAD1C00FFB61C00FFB61B00FFB61B00FFB61B00FF
+B61B00FFB61B00FFB61B00FFB61B00FFB61B00FFB61BA14E00008B5100007E
+530000755500006A590000635F00005D66000059700000547B00004F870000
+4A93000044A000003EAE000034C3000425D5000E18E9001807FC052300FF20
+2113FF480D0BFF601313FF7E070BFF980E00FFAE180DFFD00E0EFFD10D0EFF
+D10D0EFFD10D0EFFD10D0EFFD10D0EFFD10D0EFFD10D0EFFD10D0EFFD10D8B
+5100007D530000735500006B560000625B00005C610000576A000052740000
+4D7F0000488B0000439600003DA3000036B400002BC800051ED9000E11EE00
+1800FC0F2000FF251C12FF4D070CFF630C12FF7F000CFF950700FFAC1414FF
+E30414FFE30414FFE30414FFE30414FFE30414FFE30414FFE30414FFE30414
+FFE30414FFE3047D540000725500006A560000635800005B5D000056640000
+516E00004C78000047840000428F00003B9A000035A800002DBA000022CC00
+0617DE000E06F0011A00FE171A0CFF330B11FF500106FF630C0CFF7C020BFF
+930300FFA70F12FFDC0113FFE70113FFE70113FFE70113FFE70113FFE70113
+FFE70113FFE70113FFE70113FFE7017255000068570000615800005C590000
+56600000516800004C720000467D0000408800003A920000339E00002CAD00
+0025BF00001BD0000710E3000F02F3081700FF1D1409FF36080DFF510008FF
+66040AFF7C000AFF920002FFA30907FFBE0410FFE90010FFE90010FFE90010
+FFE90010FFE90010FFE90010FFE90010FFE90010FFE9006757000060580000
+5A5A0000565C0000516300004B6C00004677000040810000398B0000329600
+002BA2000024B100001EC2000013D3000708E6001000F50F1300FF221005FF
+370709FF520007FF670006FF7A0003FF8C0302FF9E0503FFB20407FFD10107
+FFD10107FFD10107FFD10107FFD10107FFD10107FFD10107FFD10107FFD101
+5F590000595B0000545D0000515F00004B670000457100003F7B0000398500
+00328E00002A99000024A700001DB5000016C500020DD6000800E8021100F8
+150E00FF260B03FF390505FF560004FF680003FF780003FF8A0103FF9B0202
+FFAC0201FFB50201FFB50201FFB50201FFB50201FFB50201FFB50201FFB502
+01FFB50201FFB502575B0000535E00004F6000004B630000456B00003F7500
+00397F0000318800002A920000239D00001CAA000016B800000FC7000206D9
+000900EC090B00FA1B0900FF2A0701FF3D0202FF560001FF680000FF760001
+FF870002FF970001FFA60100FFAE0000FFAE0000FFAE0000FFAE0000FFAE00
+00FFAE0000FFAE0000FFAE0000FFAE00>
+<96290000972A0000972B0000972B0000992C00009D2E0000A3300000A93100
+00AD2D0006B1240014AD170025A10700399F000E40A200213CA7003538AE00
+4D37B0006836AB008233A6009E30A400C52B9C00F827A51EFF08A51DFF08A5
+1DFF09A51DFF09A51DFF09A51DFF09A51DFF09A51DFF09A51DFF09A51DFF09
+A51DFF09A51DFF09972A0000972A0000972B0000982C0000992D00009E2F00
+00A4310000AA320000AD2E0006B1250014AF180024A30800389F000D41A200
+203DA7003439AE004C38B1006737AC008134A6009D31A400C32C9C00F727A3
+1BFF0BA31BFF0CA31AFF0CA31AFF0CA31AFF0CA31AFF0CA31AFF0CA31AFF0C
+A31AFF0CA31AFF0CA31AFF0CA31AFF0C972A0000972B0000972C0000982C00
+00992D00009E300000A4320000AA330000AE300005B2260013B01A0023A40A
+00379F000C42A2001F3FA700333AAE004B39B1006537AC008035A6009B31A3
+00C12C9C00F628A118FF0FA117FF10A117FF10A117FF10A117FF10A117FF10
+A117FF10A117FF10A117FF10A117FF10A117FF10A117FF10972B0000972B00
+00982C0000982D00009A2E00009F300000A5330000AB340000AF310005B328
+0013B21B0022A60B0036A0000A43A2001E40A700313BAD00493AB2006438AD
+007E36A6009A33A300BE2D9C00F5299F14FF149F14FF149E14FF149E13FF14
+9E13FF149E13FF149E13FF149E13FF149E13FF149E13FF149E13FF149E13FF
+14972B0000982C0000982D0000982E00009A2F00009F310000A5340000AC35
+0000B0330004B42A0012B41D0021A90D0035A0000844A3001C41A7002F3DAD
+00473BB200623AAE007D37A6009834A300BC2F9D00F42A9C10FF189C0FFF18
+9C0FFF199C0FFF199C0FFF199C0FFF199C0FFF199C0FFF199C0FFF199C0FFF
+199C0FFF199C0FFF19982C0000982D0000982E0000992E00009A300000A032
+0000A6350000AD370000B2350004B52C0011B51F0020AB100033A0000646A3
+001A43A8002E3EAD00453CB300603BAF007B39A6009635A200B8309D00F12B
+990BFF1D990AFF1E990AFF1E990AFF1E990AFF1E990AFF1E990AFF1E990AFF
+1E990AFF1E990AFF1E990AFF1E990AFF1E982D0000982E0000992F0000992F
+00009B310000A0340000A7360000AE380000B3370003B62E0010B722001FAE
+120032A2010447A4001845A8002C40AD00433EB4005E3CB0007A3AA7009437
+A200B4319D00EE2C9605FF239605FF239604FF249504FF249504FF249504FF
+249504FF249504FF249504FF249504FF249504FF249504FF24982E0000992F
+0000992F0000993000009B320000A1350000A8380000AF3A0000B5390002B8
+30000FBA24001EB2150030A5030346A5001547A8002942AD00403FB5005C3E
+B100773CA8009239A100B0339D00EA2E9400FF299300FF289300FF289300FF
+299300FF299300FF299300FF299300FF299300FF299300FF299300FF299300
+FF29992F0000993000009A3100009A3100009C330000A2370000A93A0000B0
+3C0000B63C0001BA34000EBD27001DB619002EA8060245A600124AA8002645
+AC003C41B5005940B300743EA9008F3BA000AC369E00E9309400FF2A9300FF
+2A9300FF2A9300FF2A9300FF2A9300FF2A9300FF2A9300FF2A9300FF2A9300
+FF2A9300FF2A9300FF2A993000009A3100009A3200009B3300009D350000A3
+390000AA3B0000B23E0000B83E0001BC37000DBF2B001BBA1C002CAD0A0143
+A7000E4CA9002348AC003943B5005542B4007140A9008D3EA000A9389E00E3
+329500FF2D9300FF2C9300FF2C9300FF2C9300FF2C9300FF2C9300FF2C9300
+FF2C9300FF2C9300FF2C9300FF2C9300FF2C9A3100009B3200009B3300009B
+3400009E360000A43B0000AB3D0000B3400000B9400001BD3B000BC22F001A
+BF21002AB20E0040A9000A4FAA001F4BAD003546B4005045B6006E42AB008A
+41A000A53B9D00DA359500FF2F9400FF2E9400FF2E9400FF2E9400FF2E9400
+FF2E9400FF2E9400FF2E9400FF2E9400FF2E9400FF2E9400FF2E9B3300009B
+3400009C3500009C3600009F380000A53C0000AC3F0000B3410000BA430000
+BF3F000AC4330018C5250028B814003DAB000653AB001B4EAD003149B4004B
+47B8006945AC008644A100A13F9C00D1389401FF328F02FF338D03FF348A04
+FF358A04FF358A04FF358A04FF358A04FF358A04FF358A04FF358A04FF358A
+04FF359C3500009C3600009D3700009D3800009F3A0000A53E0000AC410000
+B4430000BB450000C1420008C6390016CA2A0025BF19003AAE010056AC0016
+52AE002C4DB300454AB8006449A1007F4E8D00984B7C00B2487D0AFC3F7D10
+FF397A10FF3B7810FF3C7710FF3C7710FF3C7710FF3C7710FF3C7710FF3C77
+10FF3C7710FF3C7710FF3C9D3700009D3800009E3900009E3A0000A03B0000
+A63F0000AC420000B4450000BC470000C3460006C93E0014CE310023C52000
+35B5090050AE001156A8002554980037598C00505D7E006B5F6D00875D5E00
+AB5B5400E0576616FF426518FF416419FF416419FF416419FF416419FF4164
+19FF416419FF416419FF416419FF416419FF419E3900009E3A00009F3B0000
+9F3C0000A13E0000A6410000AC440000B4470000BB490000C44A0005CB4400
+12D2390020CD280031BD13004A92040363790013696B00266D5B00386C4F00
+506D46006F6C3E00936A3800D966491AFF4D461AFE4E4217FD514217FD5142
+17FD514217FD514217FD514217FD514217FD514217FD514217FD519F3B0000
+9F3C0000A03D0000A03E0000A13F0000A6430000AC460000B3490000BB4C00
+00C44D0003CD4A000FD641001DC335002D9F2900447518005D4D0301783900
+127B2C00247A2300387B1D00517B1A0070781600A8751300E1721100E1720F
+01E2720F01E2720F01E2720F01E2720F01E2720F01E2720F01E2720F01E272
+0F01E272A03D0000A03E0000A03F0000A03F0000A2410000A6440000AC4800
+00B24B0000BA4E0000C3500001CD4F000CBB4E001BA246002A843A003C5F29
+00563B1B006D1208008504061487000A2883000D40800010627F0015A57900
+16E36F0018E36E0019E36D0019E36D0019E36D0019E36D0019E36D0019E36D
+0019E36D0019E36D0019E36DA03F0000A1400000A1410000A1410000A24300
+00A6460000AB490000B14C0000B9500000BD540001AE57000FA058001B8C53
+0028724A0039543D004F322F00640C1E0177001F127C002427790029447700
+2F6F740031A76B012FF45F0130F65E0131F85E0131F85E0131F85E0131F85E
+0131F85E0131F85E0131F85E0131F85E0131F85EA1410000A1420000A14200
+00A1430000A2440000A5470000AA4B0000B04E0000AF530000A3590006985D
+00118C60001A7C5E0026675A00354B5100482B44005D053200700038137200
+41297000474B6E004A7268004CAD5F0049F158004AF158004BF257004BF257
+004BF257004BF257004BF257004BF257004BF257004BF257004BF257A14300
+00A1440000A1440000A1450000A2460000A5490000A84C0000A45100009957
+0002905D000A886200117D6700186F6A00225D6C003043640040265B005404
+4E016A00541569005C2E66006252630065745C0064A052076BFC49076CFD47
+086EFE46086EFE46086EFE46086EFE46086EFE46086EFE46086EFE46086EFE
+46086EFE46A1450000A1450000A1460000A1460000A2480000A44A00009C4F
+000091560000895B0005816200097A68000E706F00146375001D547900283D
+76003622710049026A0260006F195D00763259007E5254007F734C0081A447
+0186FF3D0187FF3C0187FF3C0187FF3C0187FF3C0187FF3C0187FF3C0187FF
+3C0187FF3C0187FF3C0187FF3CA1470000A1470000A1470000A1480000A149
+0000984E00008C530000835900027B5F0004746700066E6F00096578000F5A
+8000174C8500213886002C2086003D028203500087194D008F314900964D43
+009B723D00A0A839009EFA35009CFF33009DFF33009DFF33009DFF33009DFF
+33009DFF33009DFF33009DFF33009DFF33009DFF33A1480000A1490000A149
+0000A1490000964C0000885100007E570000755C00006F6400016A6C000264
+7600055C810009538A00104491001C33960024209B0030039A024000A3163E
+00AE2D3A00B34B3600CE7C3200CCA62E09C8FF2806BDFF2706BEFF2706BEFF
+2706BEFF2706BEFF2706BEFF2706BEFF2706BEFF2706BEFF2706BEFF27A14A
+0000A14A0000A14B0000954C0000865000007B550000725A00006A60000065
+690000617300005B7E0001558A00034E960008409F001231AA001823B50022
+0EC0002F00CB103300DD282F02E348290BFE7D2107FF9E2100F6B82300F2D1
+2200F3D12200F3D12200F3D12200F3D12200F3D12200F3D12200F3D12200F3
+D12200F3D122A14B0000A14C0000954E0000855000007A5300007058000067
+5E0000626500005D6F0000587A0000538700004E94000049A2000042B20001
+35C6000825D7001218EE001D02FF0A2900FF252512FF521211FF701115FF91
+0800FFAA1B00FFB71B00FFB81B00FFB81B00FFB81B00FFB81B00FFB81B00FF
+B81B00FFB81B00FFB81B00FFB81BA14D0000944F0000845200007954000070
+560000665B00005F6200005A6A000056750000518000004C8C000046980000
+41A600003AB700012CCB00081EDD001210F3001D00FF152309FF321710FF55
+0E0EFF710D14FF910201FFAA1711FFD80A12FFDA0912FFDA0912FFDA0912FF
+DA0912FFDA0912FFDA0912FFDA0912FFDA0912FFDA09954F00008352000177
+5400006F560000675800005E5D000059640000546E00004F7900004A850000
+459000003F9C000039AA000031BD000124D0000918E3001207F5041D00FF1C
+1C10FF3E0A0DFF580A0AFF700B12FF8F0000FFA51214FFDD0313FFE30413FF
+E30413FFE30413FFE30413FFE30413FFE30413FFE30413FFE30413FFE30483
+520001765500006D560000665700005F59000058600000536800004E720000
+497E0000448800003E94000037A0000030AF000028C300011CD4000910E800
+1200F70A1B00FF211712FF45010BFF5A0707FF71090DFF8C0000FFA30E11FF
+CF0013FFE80013FFE80013FFE80013FFE80013FFE80013FFE80013FFE80013
+FFE80013FFE800765500006C560000645700005D590000585C000053630000
+4D6C000048770000438200003D8C0000369700002FA4000028B400001FC600
+0214D8000A08EB001400FA131500FF26120DFF450009FF5C0209FF730009FF
+890003FF9E0704FFB4050EFFE9000EFFE9000EFFE9000EFFE9000EFFE9000E
+FFE9000EFFE9000EFFE9000EFFE9006A560000625800005C590000575B0000
+535F00004D67000048710000427C00003C860000359000002E9B000027A900
+0020B9000018C900030DDB000A00EC051300FC191000FF2A0D09FF470007FF
+5E0005FF710004FF850202FF9A0503FFAD0308FFDB0008FFDB0008FFDB0008
+FFDB0008FFDB0008FFDB0008FFDB0008FFDB0008FFDB00615800005A5A0000
+555C0000525F00004D620000476B0000427600003B800000348900002D9300
+00269F00001FAD000019BC000011CC000406DF000B00F10C0E00FE1E0C00FF
+2E0905FF4D0003FF600002FF700003FF830003FF970101FFA70202FFB60002
+FFB60002FFB60002FFB60002FFB60002FFB60002FFB60002FFB60002FFB600
+595B0000545D0000506000004C62000048660000417000003B7A0000348300
+002D8D0000259700001EA3000018B0000012BE00000ACE000501E2020B00F2
+130900FF230700FF320401FF4B0000FF5F0000FF700001FF810001FF940000
+FFA20100FFB20000FFB20000FFB20000FFB20000FFB20000FFB20000FFB200
+00FFB20000FFB200535E00004E6100004A64000046670000416B00003B7400
+00347E00002D870000259000001E9B000017A6000011B200000BC0000103CF
+000600E4090600F3190500FE280300FF350000FF4F0000FF640000FF720000
+FF820000FF920000FF9F0000FFAE0000FFB00000FFB00000FFB00000FFB000
+00FFB00000FFB00000FFB00000FFB000>
+<9424000094240000942500009425000095260000972600009B2700009F2600
+00A3240004A71D0012A3110022980202339B0012349E002331A500362EAA00
+4D2EAB00652DA8007E2BA7009928A800C224A000ED20A71EFF00A51DFF00A5
+1DFF00A51DFF00A51DFF00A51DFF00A51DFF00A51DFF00A51DFF00A51DFF00
+A51DFF00A51DFF009424000094250000942500009526000095260000972700
+009B2700009F270000A3250003A81E0011A4120021990201349B0011359E00
+2232A500352FAA004C2FAC00642EA9007D2CA7009829A800C025A000EC20A8
+1FFF00A51DFF00A51DFF00A51DFF00A51DFF00A51DFF00A51DFF00A51DFF00
+A51DFF00A51DFF00A51DFF00A51DFF00942400009425000095260000952600
+0095270000982700009B280000A0280000A4260003A81F0011A51300219A03
+00339B0010369E002133A5003430AA004A30AC00632FA9007C2CA700972AA8
+00BE26A000EB21A81FFF00A61EFF00A61EFF00A61EFF00A61EFF00A61EFF00
+A61EFF00A61EFF00A61EFF00A61EFF00A61EFF00A61EFF0094250000952600
+00952600009527000095270000982800009C290000A0290000A4270003A921
+0010A71500209C0500329B000E379E002034A4003231AA004931AD006230AA
+007A2DA700962BA800BC27A000E922A920FF00A61FFF00A61FFF00A61FFF00
+A61FFF00A61FFF00A61FFF00A61FFF00A61FFF00A61FFF00A61FFF00A61FFF
+009526000095260000952700009528000096280000982900009C290000A12A
+0000A5280003AA22000FA917001F9E0700319B000C399E001E36A4003133AA
+004732AD006031AB00792FA700942CA700B928A000E723AA22FF00A720FF00
+A720FF00A720FF00A720FF00A720FF00A720FF00A720FF00A720FF00A720FF
+00A720FF00A720FF009526000095270000962800009628000096290000992A
+00009D2A0000A22B0000A62A0002AB24000EAB19001EA10A00309B000A3B9E
+001C38A4002F35AA004533AE005E32AC007730A700932DA700B629A000E524
+AB23FF00A821FF00A821FF00A821FF00A821FF00A821FF00A821FF00A821FF
+00A821FF00A821FF00A821FF00A821FF009527000096280000962800009629
+0000972A0000992B00009D2C0000A32D0000A72C0001AC26000DAC1B001CA4
+0C002E9C00073C9F001A3AA3002D36AA004334AF005C34AD007631A700912F
+A700B32BA100E226AC24FF00A822FF00A822FF00A822FF00A822FF00A822FF
+00A822FF00A822FF00A822FF00A822FF00A822FF00A822FF00962800009629
+000096290000972A0000972B00009A2C00009E2D0000A42F0000A92F0001AD
+29000CAF1E001BA70F002C9E02063DA000173DA3002A39AA004036AF005A35
+AE007433A8008E30A600AF2CA100DE27AE26FF00A924FF00A924FF00A923FF
+00A923FF01A923FF01A923FF01A923FF01A923FF01A923FF01A923FF01A923
+FF0196290000972A0000972A0000972B0000972C00009A2D00009F2F0000A6
+310000AB310000AF2B000BB1210019AB13002BA003043DA000153FA300283B
+AA003D38B0005737AF007135A9008C32A500AB2EA100DA29A91EFF0AA41CFF
+0AA41CFF0AA41CFF0AA41CFF0BA41CFF0BA41CFF0BA41CFF0BA41CFF0BA41C
+FF0BA41CFF0BA41CFF0B972A0000972B0000972C0000982C0000982D00009B
+2F0000A1310000A7330000AD340000B02E0009B4240018AF160029A306023D
+A1001142A400243EA900393AB0005339B1006E38AA008935A500A630A100D6
+2BA416FF149F14FF149F14FF149E13FF149E13FF149E13FF149E13FF149E13
+FF149E13FF149E13FF149E13FF149E13FF14972C0000982C0000982D000098
+2E0000992F00009C310000A2330000A9360000AF370000B3320008B6280016
+B31A0026A709003CA2000D45A5002142A900353DB0004F3CB3006B3AAB0086
+38A500A233A000CE2E9C08FF22990BFF1D990AFF1E990AFF1E990AFF1E990A
+FF1E990AFF1E990AFF1E990AFF1E990AFF1E990AFF1E990AFF1E982D000098
+2E0000992F000099300000993000009D330000A3360000AA380000B13A0000
+B5360006B82C0014B81F0024AC0E0039A3000849A5001D46A9003140AF004A
+3EB400673DAE00823AA5009E379A00C1339203FA2F8A05FF2C8806FF2D8607
+FF2E8507FF2E8507FF2E8507FF2E8507FF2E8507FF2E8507FF2E8507FF2E85
+07FF2E992F0000993000009A3100009A3100009A3200009E350000A5380000
+AC3B0000B33D0000B83B0004BB310012BD240022B3140035A400034DA70018
+4AAA002D44AF004542AC005F449A00784888008E467900A7437301E541760D
+FF36740EFF36720EFF37710FFF37710FFF37710FFF37710FFF37710FFF3771
+0FFF37710FFF37710FFF379A3100009A3200009B3300009B3400009B340000
+A0380000A63B0000AE3E0000B5400000BB400003BE360010C22A001FBB1A00
+31AC070249A800124E9C0024509000355384004B57780064596A007E575D00
+9F565400C8516216FF3C6017FF3C5F17FF3D5E17FF3D5E17FF3D5E17FF3D5E
+17FF3D5E17FF3D5E17FF3D5E17FF3D5E17FF3D9B3300009B3400009C350000
+9C3600009D370000A13A0000A73E0000AE400000B6430000BD430002C13C00
+0EC731001CC221002DAB1200468603035E7200136365002567570036674C00
+4C68440069683C0089653700BC61491CFF45451AFF474017FF4B3C14FF4E3C
+14FF4E3C14FF4E3C14FF4E3C14FF4E3C14FF4E3C14FF4E3C14FF4E9C360000
+9D3700009D3800009E3900009E390000A23C0000A8400000AF430000B74500
+00BE470001C443000CCA38001AB32F00299325003F6C160059480201733600
+11752A002374220036761C004E7519006972170095701200F16B1001F36B0E
+01F46B0C01F66B0C01F66B0C01F66B0C01F66B0C01F66B0C01F66B0C01F66B
+0C01F66B9D3800009E3900009E3A00009F3B00009F3C0000A33F0000A84200
+00AF450000B6480000BE4A0000BE49000AAC460019983F00267D3500385927
+0052371900681107007F030613810009277E000C3E7A000E5C790013927600
+14E2690016E2680017E3670018E3670018E3670018E3670018E3670018E367
+0018E3670018E3670018E3679F3B00009F3C0000A03D0000A03E0000A03E00
+00A3410000A8440000AE470000B54A0000B14E0001A350000E964F0019854B
+00256C4400354F39004B2F2C00600B1D0172001D1276002326730027407100
+2D686F00309B68022DFB59022EFE58022FFE58012FFD57012FFD57012FFD57
+012FFD57012FFD57012FFD57012FFD57012FFD57A03E0000A03F0000A03F00
+00A1400000A1410000A3430000A8460000AD490000A54E00009A5300069056
+0010845700197556002460520032474B004428400058042E006B0035126C00
+3D266A0043466900476B64004A9F5C0046EB520047F4500048F5500049F550
+0049F5500049F5500049F5500049F5500049F5500049F5500049F550A14000
+00A1410000A1420000A1420000A1430000A3450000A74800009C4D00009253
+000189570009805C000F765F0017686200215762002D3E5C003C2254005003
+480265004F156400582C61005E4D5F00606C580061934F0267FF480567FF42
+0568FF420569FF410569FF410569FF410569FF410569FF410569FF410569FF
+410569FF41A1420000A1430000A1440000A1440000A1450000A3470000964C
+00008B520000835700047A5C00087362000D696800135E6D001C4E6F002737
+6C00331D6800460162035C006918580070305400774E5000796C48007B9242
+0081F33A0080FF380080FF370081FF370081FF370081FF370081FF370081FF
+370081FF370081FF370081FF37A1450000A1450000A1460000A1460000A147
+0000924B0000865000007D560001755B00036D610005676900095F70000E55
+770017477B0021327C002B1A7B003B007A044C00801A4800872F44008D493F
+00916A3A009596360095E3310093FF2E0093FF2E0093FF2E0093FF2E0093FF
+2E0093FF2E0093FF2E0093FF2E0093FF2E0093FF2EA1470000A1470000A148
+0000A14800008F4B0000834F00007954000070590000695F0000646700015E
+700004577900094E8100113F87001B2D8C0024198F00300190043D00991739
+00A12D3500A5483100AF6E2F00B89E2C00B0DA2901A8FF2501A8FF2501A8FF
+2501A8FF2501A8FF2501A8FF2501A8FF2501A8FF2501A8FF2501A8FF25A148
+0000A1490000A14900008E4C0000814F0000775200006D570000655C000060
+6400005B6D00005678000150830004478C000A3A9500132C9D00191BA40024
+05AB012F00B8132E00C5282A00C6432600E4712600EA932200DBB92201D0F4
+1F01D0F51F01D1F71F01D1F71F01D1F71F01D1F71F01D1F71F01D1F71F01D1
+F71F01D1F71FA14A0000A14B00008C4E00007F500000755200006C55000063
+5A00005D610000596A0000547500004F8100004A8D0000439900013AA60006
+2EB6000A21C4001314D7001D00E80B2501FA252013FF4E0D0CFF691118FF8D
+0000FFA71813FFEA0A14FFED0915FFEE0815FFEE0815FFEE0815FFEE0815FF
+EE0815FFEE0815FFEE0815FFEE08A14C00008B4F00007D520000735400006B
+550000625900005B5F000056680000527200004D7E00004789000042950000
+3CA1000034B100002AC600031DD8000D11ED001700FC0F1E03FF281712FF4F
+0408FF650D11FF840000FF9E1114FFD60213FFE40313FFE40313FFE40313FF
+E40313FFE40313FFE40313FFE40313FFE40313FFE4038B5100007C54000071
+55000068570000625800005B5C000056630000506C00004B77000046820000
+408D00003A99000033A600002CB8000022CA000416DD000D06EF001900FE17
+1809FF320C0FFF510006FF660A0CFF820003FF9D0B0EFFC50112FFE90012FF
+E90012FFE90012FFE90012FFE90012FFE90012FFE90012FFE90012FFE9007B
+5400007056000067570000605800005A5A0000555F0000506700004A710000
+457C00003F86000039910000319D00002AAB000023BD000019CE00050FE100
+0D01F1081600FE1D1306FF340A0AFF520109FF690008FF810004FF980504FF
+B0050DFFE8000DFFE8000DFFE8000DFFE8000DFFE8000DFFE8000DFFE8000D
+FFE8000DFFE8006F560000655700005E590000595B0000545D000050620000
+4A6B0000447600003E800000388A00003094000029A1000022B000001BC000
+0112D1000607E4000E00F50F1000FE220E03FF360807FF540005FF690005FF
+7E0002FF950402FFA90306FFCF0006FFCE0006FFCE0006FFCE0006FFCE0006
+FFCE0006FFCE0006FFCE0006FFCE00645700005C590000575B0000535E0000
+4F6000004A660000447000003E7A000037840000308E00002899000021A500
+001BB3000014C300010BD4000601E7030E00F7160C00FF270901FF390503FF
+570002FF690002FF7B0003FF930001FFA40101FFB50001FFB40001FFB40001
+FFB40001FFB40001FFB40001FFB40001FFB40001FFB4005B5A0000555C0000
+515F00004D62000049640000446B00003E750000377E00002F880000289100
+00219C00001AA9000013B600000DC5000204D6000800E90B0900F81C0700FF
+2B0500FF3B0100FF570000FF6A0000FF7B0001FF8F0000FFA00000FFB00000
+FFB20000FFB20000FFB20000FFB20000FFB20000FFB20000FFB20000FFB200
+545D00004F6000004B63000047660000436900003D6F0000377900002F8200
+00288B00002195000019A0000013AB00000DB7000006C5000300D8040600EC
+120400F9210300FF2F0100FF420000FF5D0000FF6D0000FF7D0000FF8E0000
+FF9E0000FFAB0000FFB20000FFB20000FFB20000FFB20000FFB20000FFB200
+00FFB20000FFB2004E6100004964000044680000406A00003C6D0000377300
+002F7C000028850000218E00001998000012A200000CAC000005B8000200C6
+010400DC0A0100EB180000F8250000FF310000FF4A0000FF5F0000FF6D0000
+FF7C0000FF8C0000FF9C0000FFA60000FFB20000FFB20000FFB20000FFB200
+00FFB20000FFB20000FFB20000FFB200>
+<931F0000931F00009320000093200000932100009421000096210000992000
+009C1E00029F1700109A0B001F9400052B970015299B002527A2003626A600
+4C26A6006325A5007923A6009422A800B71EA200E119A516FF02A014FF00A0
+14FF00A014FF00A014FF00A014FF00A014FF00A014FF00A014FF00A014FF00
+A014FF00A014FF00931F000093200000932000009321000093210000942200
+0096210000992000009C1F00019F18000F9B0C001F9400042B9800142A9B00
+2428A2003527A6004B27A7006226A5007824A6009322A900B61FA200E01AA5
+16FF02A015FF00A015FF00A015FF00A015FF00A015FF00A015FF00A015FF00
+A015FF00A015FF00A015FF00A015FF00932000009320000093210000932100
+009422000094220000972200009A2100009D1F0001A019000E9C0E001E9400
+032D9800132B9B002329A2003427A6004928A7006127A6007725A6009123A9
+00B520A300DE1BA617FF02A116FF00A116FF00A116FF00A116FF00A116FF00
+A116FF00A116FF00A116FF00A116FF00A116FF00A116FF0093200000932100
+0093210000942200009422000094230000972200009A2200009D200001A11A
+000D9E0F001D9501022C9800112C9B00212AA2003329A6004829A8005F28A6
+007626A6009024A900B321A300DD1CA718FF03A117FF00A117FF00A117FF00
+A117FF00A117FF00A117FF00A117FF00A117FF00A117FF00A117FF00A117FF
+00932100009321000094220000942200009423000094230000972300009A22
+00009D210001A21C000DA011001C9703012C98000F2E9B00202BA100312AA7
+00462AA8005E29A7007527A6008E25A900B122A400DC1DA819FF03A218FF00
+A218FF00A218FF00A218FF00A218FF00A218FF00A218FF00A218FF00A218FF
+00A218FF00A218FF0093210000942200009422000094230000942300009424
+0000972400009A2300009E220001A31E000BA213001B9905012B98000D309B
+001E2DA1002F2BA700442BA9005C2AA8007328A6008D26A800AF23A400DA1E
+A91AFF04A319FF00A319FF00A319FF00A319FF00A319FF00A319FF00A319FF
+00A319FF00A319FF00A319FF00A319FF009422000094230000942300009424
+00009424000094250000972500009B2400009F240001A420000AA31500199B
+08012A98000B329B001C2FA0002D2DA700422CAA005A2CA900712AA6008B28
+A800AC25A500D820AA1BFF05A41AFF00A41BFF00A41BFF00A41BFF00A41BFF
+00A41BFF00A41BFF00A41BFF00A41BFF00A41BFF00A41BFF00942300009424
+000094240000942500009425000095260000982600009C260000A0260000A5
+220009A61800189E0A0029990108339C001932A0002B2FA7003F2EAB00572D
+AA00702BA7008929A800A926A500D621AC1CFF06A51CFF00A51CFF00A51CFF
+00A51CFF00A51CFF00A51CFF00A51CFF00A51CFF00A51CFF00A51CFF00A51C
+FF00942400009424000094250000952600009526000095270000982700009D
+280000A1270000A5240008A81B0016A20D0027990105359C0017349F002831
+A7003C2FAC00552FAB006D2DA800862BA800A628A500D323A917FE0DA61EFF
+00A61EFF00A61EFF00A61EFF00A61EFF00A61EFF00A61EFF00A61EFF00A61E
+FF00A61EFF00A61EFF00942500009426000095260000952700009527000096
+280000992900009E290000A2290000A6260006AA1E0014A51100259B020336
+9C001337A0002534A7003931AC005131AD006A2FA900842DA700A22AA600CF
+25A20DFC18A71FFF00A720FF00A720FF00A720FF00A720FF00A720FF00A720
+FF00A720FF00A720FF00A720FF00A720FF0095260000952700009528000096
+28000096290000972900009A2A00009F2B0000A42C0000A8290005AC220013
+A91500239D0400379D000F3BA0002238A6003634AC004D33AE006732AA0081
+30A6009E2CA500C9289C01FA22A822FF00A822FF00A822FF00A722FF00A723
+FF00A723FF00A723FF00A723FF00A723FF00A723FF00A723FF009528000096
+28000096290000972A0000972A0000972B00009B2C0000A02E0000A62F0000
+AA2D0003AF250011AE190021A20900349D000B3EA0001E3BA6003137AC0049
+36B0006435AC007E32A20097309700B42F8C00E32D8202FF298003FF2A7E03
+FF2A7D04FF2B7C04FF2B7C04FF2B7C04FF2B7C04FF2B7C04FF2B7C04FF2B7C
+04FF2B96290000972A0000972B0000972B0000982C0000982D00009C2F0000
+A2310000A9330000AE320002B12A000FB21E001EA90F00319E000642A1001A
+40A5002D3BAA004339A000593E920070428300844076009D3E6E00C33C6C07
+FF356A07FF356808FF366708FF366709FF376709FF376709FF376709FF3767
+09FF376709FF376709FF37972B0000972C0000982D0000982D0000982E0000
+992F00009E320000A4340000AB360000B1370000B42F000DB624001BB01500
+2DA4050341A10013459100234B8800334E7D00465071005D52650076525C00
+93515300B44B5C13FF385F19FF33611DFF306320FF2D6421FF2C6421FF2C64
+21FF2C6421FF2C6421FF2C6421FF2C6421FF2C982D0000982E0000992F0000
+993000009A3100009A320000A0350000A6380000AE3A0000B43B0000B83500
+0ABB2A0019B71C00299C1000407B0304576A00125E5F002361530033614900
+4863410063633A007F603600A45B481CFF3F4218FF423D15FF463912FF4A37
+11FF4B3711FF4B3711FF4B3711FF4B3711FF4B3711FF4B3711FF4B99300000
+993100009A3100009A3200009B3300009C340000A2390000A83C0000B03E00
+00B7400000BC3C0008B8320016A52B00258921003A641400534301016D3300
+116F2800216E200034701A004A701800636D1700866B1100E2660E01FD650D
+01FD650B02FE650B02FE650B02FE650B02FE650B02FE650B02FE650B02FE65
+0B02FE659A3200009B3300009C3400009C3500009C3600009D370000A33C00
+00A93F0000B1410000B8430000B0430008A03F00168F390023763000345324
+004D341700640F06007A0305137B00092678000B3B74000E57720012847100
+14CD660015E6620016E7610017E7610018E7600018E7600018E7600018E760
+0018E7600018E7600018E7609C3600009D3700009D3800009E3900009E3A00
+009F3B0000A43E0000AA420000B2450000A6490000994A000C8D4800177D44
+0022663E00324A3500472B29005C091B016D001C11700021246D00243C6A00
+2B6169002F8F64002DD258002CFC54002DFC53002EFC52002EFC52002EFC52
+002EFC52002EFC52002EFC52002EFC52002EFC529E3900009E3A00009F3B00
+009F3C0000A03D0000A03E0000A4410000A84400009C4A0000924E00058850
+000E7D5000176F4E00215A4B002F42460040253C0054042B01650032126600
+3A2564004042630044645F004890580046CE4F0044F4490045F5490046F648
+0047F6480047F6480047F6480047F6480047F6480047F6480047F648A03D00
+00A03E0000A03E0000A03F0000A0400000A1400000A1440000954A00008B4F
+0001825200077955000E6F580016625A001F5159002A395500381F4D004C02
+43025F004B145E00532A5C0059485A005B6554005D874B005EBD440061FF3F
+0061FF3E0062FF3E0063FF3E0063FF3E0063FF3E0063FF3E0063FF3E0063FF
+3E0063FF3EA03F0000A1400000A1410000A1420000A14200009B4300009049
+0000864E00007C530002745700076C5C000C646100125965001B4966002532
+64003119600043005B045600641852006B2F4E0070494B007365440074863E
+0079C638007AFF32007AFF32007BFF32007BFF32007BFF32007BFF32007BFF
+32007BFF32007BFF32007BFF32A1420000A1430000A1440000A14400009A46
+00008C490000814D0000785200006F570002685C0004616300075A69000E50
+6F0016417200202C73002A1572003A00720647007A1A4100802E3E0085463A
+00896336008C8732008FC82E008BFF2A008BFF29008CFF29008CFF29008CFF
+29008CFF29008CFF29008CFF29008CFF29008CFF29A1450000A1450000A146
+000099470000894A00007E4C0000745000006C550000645B00005E62000059
+6A000452720009497900113A7F001A278200231284002F0087063800901833
+00972C30009A462D00A2652B00AA922900A5C527009BFF21009BFF21009BFF
+20009BFF20009BFF20009BFF20009BFF20009BFF20009BFF20009BFF20A147
+0000A147000098490000874C00007B4E0000724F000069530000615900005B
+60000057680000527200014B7D00054284000B358C00132693001A13980025
+009E032D00AA152900B3282500B5422200C1652300CC8C2000C5B52000BAFC
+1C00B8FF1B00B8FF1B00B8FF1B00B8FF1B00B8FF1B00B8FF1B00B8FF1B00B8
+FF1B00B8FF1BA1490000984B0000864E000079500000705100006852000060
+570000595D000055660000507000004B7B0000458700013D910004339C0008
+27A7000D19B200170AC0001F00CD102000DE231D01F33B1C00F2621A08FB86
+0F00FCAA1613FDFA0A0EF2FF0C0FF4FF0B10F4FF0B10F4FF0B10F4FF0B10F4
+FF0B10F4FF0B10F4FF0B10F4FF0B984C0000844F0000775200006D53000065
+5500005F560000585C0000536400004E6E0000497A0000438500003D910000
+369E00002FAD000027C000011CD2000810E6001100F60A1A00FF211511FF45
+0008FF5C0709FF770409FF950409FFB90512FFE90011FFE90011FFE90011FF
+E90011FFE90011FFE90011FFE90011FFE90011FFE90083510000755400006B
+550000635700005C590000585B0000526200004D6B00004876000042810000
+3C8B0000359600002DA3000026B200001FC4000114D6000907E9001200F913
+1300FF26100CFF460009FF5F0008FF770006FF910304FFAB040CFFE8000CFF
+E7000CFFE7000CFFE7000CFFE7000CFFE7000CFFE7000CFFE7000CFFE70074
+55000069560000615800005B5A0000565C0000525E00004C66000047700000
+417B00003B850000338E00002C9A000025A700001EB7000016C700020CD900
+0900EB051200FC190E00FF2B0C08FF490005FF610004FF750002FF8D0302FF
+A60305FFC60005FFC40004FFC40004FFC40004FFC40004FFC40004FFC40004
+FFC40004FFC400685700005F580000595B0000545D0000505F00004C620000
+466A0000407500003A7F0000338800002B920000249E00001DAB000017BA00
+000FCA000305DD000A00EF0C0C00FE1F0A00FF2F0704FF4C0002FF610001FF
+730002FF8B0001FFA10101FFB40000FFB30000FFB30000FFB30000FFB30000
+FFB30000FFB30000FFB30000FFB3005E590000575B0000525E00004E610000
+4A64000046660000406F00003A790000328200002B8C0000249600001CA200
+0016AE000010BC000008CB000401DE040900F1140700FE240600FF330201FF
+4C0000FF630000FF740000FF880000FF9D0000FFAF0000FFB20000FFB20000
+FFB20000FFB20000FFB20000FFB20000FFB20000FFB200565C0000515F0000
+4C6200004865000043680000406B00003A740000327D00002B860000239000
+001C9A000015A500000FB0000008BD000101CB000600E20B0400F11A0300FD
+290100FF360000FF550000FF690000FF770000FF890000FF9D0000FFAA0000
+FFB20000FFB20000FFB20000FFB20000FFB20000FFB20000FFB20000FFB200
+4F6000004A63000045670000416A00003D6D0000396F0000327700002B8000
+00238900001C930000159C00000EA6000007B1000101BD010400CF050100E3
+100000F01D0000FC2A0000FF370000FF550000FF690000FF750000FF860000
+FF9B0000FFA40000FFB20000FFB20000FFB20000FFB20000FFB20000FFB200
+00FFB20000FFB20048650000436800003E6C00003A6E000036710000327300
+002B7B0000248300001C8C0000159500000E9E000009A6000002B0000400BD
+010300CE050100E30F0000F01D0000FC290000FF350000FF530000FF670000
+FF720000FF830000FF960000FFA00000FFAF0000FFB20000FFB20000FFB200
+00FFB20000FFB20000FFB20000FFB200>
+<90190000911A0000911A0000911B0000911B0000911C0000931C0000951B00
+00971800019811000D9105001D91000921940017209800251E9E00351DA100
+4A1EA100601DA100751CA2008C1AA400AC18A100CF139F06F70A9B0CFF009B
+0CFF009B0CFF009B0CFF009B0CFF009B0CFF009B0CFF009B0CFF009B0CFF00
+9B0CFF009B0CFF00911A0000911A0000911B0000911B0000921C0000921C00
+00931C0000951B0000971900009812000C9307001C91000822940016219800
+241F9E00341EA100491FA2005F1EA100741DA2008B1BA500AB19A200CF149F
+05F80C9C0CFF009C0CFF009C0CFF009C0DFF009C0DFF009C0DFF009C0DFF00
+9C0DFF009C0DFF009C0DFF009C0DFF00911A0000911B0000911B0000921C00
+00921C0000921D0000931D0000961C0000981A00009914000B9408001B9100
+062494001522980023209E00331FA2004820A2005E1FA100731EA2008A1CA5
+00AA1AA200CE159F05F80D9C0DFF009C0DFF009C0DFF009C0DFF009C0DFF00
+9C0DFF009C0DFF009C0DFF009C0DFF009C0DFF009C0DFF00911B0000911C00
+00921C0000921D0000921D0000921D0000931D0000961D0000981B00009A15
+000B960A001A9100052495001323980022219F003220A2004621A3005D20A2
+00721FA300891DA600A81BA300CD169F04F80F9C0EFF009D0EFF009D0FFF00
+9D0FFF009D0FFF009D0FFF009D0FFF009D0FFF009D0FFF009D0FFF009D0FFF
+00911C0000921C0000921D0000921D0000921E0000921E0000941E0000961D
+0000981C00009B16000A980C00199201042595001224980020229F003021A3
+004522A4005B21A3007120A300881EA600A61CA400CC179F04F7109D10FF00
+9D10FF009D10FF009D10FF009D10FF009D10FF009D10FF009D10FF009D10FF
+009D10FF009D10FF00921C0000921D0000921E0000921E0000931F0000931F
+0000941F0000971E0000991D00009C1800099A0E0018930303259500102698
+001F249E002E23A3004323A5005923A4006F21A3008620A600A51DA400CA19
+9F02F6139E11FF009E11FF009E11FF009E11FF009E11FF009E11FF009E11FF
+009E11FF009E11FF009E11FF009E11FF00921D0000921E0000931E0000931F
+0000931F00009320000094200000971F00009A1E00009D1A00079C10001795
+04022595000E2898001D269E002D24A3004024A5005724A5006D23A4008521
+A700A31FA500C91A9E01F5159F12FF009F13FF009F13FF009F13FF009F13FF
+009F13FF009F13FF009F13FF009F13FF009F13FF009F13FF00921E0000931F
+0000931F000093200000932000009321000095210000972000009A1F00009E
+1C00069E1300159706012595000B2A99001B289E002B26A4003E26A6005526
+A6006B24A5008322A700A120A600C71C9F00F417A014FF00A014FF00A014FF
+00A014FF00A014FF00A014FF00A014FF00A014FF00A014FF00A014FF00A014
+FF00931F000093200000932000009321000093210000942200009522000098
+2200009B2100009E1E0005A01600139A0900249500082C9900182A9D002828
+A4003B28A7005228A7006926A6008124A7009E22A700C51E9F00F219A116FF
+00A116FF00A116FF00A116FF00A116FF00A116FF00A116FF00A116FF00A116
+FF00A116FF00A116FF00932000009321000093210000942200009422000094
+23000095230000982300009B2200009F200003A31900129D0C00229500052E
+9900152D9D00262BA400382AA8004F2AA8006628A6007E26A7009B24A800C3
+209F00EF1BA318FF00A218FF00A218FF00A218FF00A218FF00A218FF00A218
+FF00A218FF00A218FF00A218FF00A218FF0093210000942200009423000094
+230000942400009424000095240000982400009C240000A0230002A41C0010
+A110002096010131990012309D00232EA400352CA8004B2CAA00632AA7007C
+28A7009726A800C022A000EC1DA51BFF00A11CFF00A01DFF009F1EFF009E1F
+FF009E1FFF009E1FFF009E1FFF009E1FFF009E1FFF009E1FFF009423000094
+2300009424000094240000942500009426000096260000992600009D260000
+A1250001A620000EA514001D9B05012F9A000D349C001F31A300312FA90047
+2EAB00602DA800782B9C008E2C9400AA2C8A00CF2A7D00FE267901FF267700
+FF277600FF287401FF287401FF287401FF287401FF287401FF287401FF2874
+01FF2894240000942500009425000095260000952700009527000097280000
+9A2900009F290000A3280001A823000BA819001BA00A002C9A0009379D001B
+35A2002D32A0004034960054388B00693B7F007C3A740095386B00B4376500
+F3356405FF316205FF326105FF336005FF346005FF346005FF346005FF3460
+05FF346005FF346005FF349526000095270000952700009628000096290000
+96290000982A00009C2B0000A12C0000A62C0000AA280009AD1E0018A71000
+299E0305389500133F8800214580003047760041496B00574B61006E4B5900
+894B5200A6464F03F3426C29FF1E6D2BFF1D6C2CFF1D6B2CFF1D6B2CFF1D6B
+2CFF1D6B2CFF1D6B2CFF1D6B2CFF1D6B2CFF1D962800009629000096290000
+972A0000972B0000972B0000992C00009E2E0000A3300000A9310000AD2D00
+07B1240015AA1700268F0E003B72020450640012575900215A4F00305B4600
+445D3E005D5E3800775B340096573607FE504017FF3D3A14FF413711FF4433
+0EFF47320EFF48320EFF48320EFF48320EFF48320EFF48320EFF48972A0000
+972B0000972C0000982C0000982D0000982E00009A2F00009F320000A63400
+00AD360000B1330004A92D0013982600217F1E00355D11004E3E0102663000
+1069260020691E00326A1800466A16005E6816007B661300B8630E02FF5F0D
+02FF5F0C03FF5F0A03FF5F0A03FF5F0A03FF5F0A03FF5F0A03FF5F0A03FF5F
+0A03FF5F982D0000982E0000992E0000992F0000993000009A3100009C3300
+00A2360000A8390000B03B0000A33C0006963900138633001F6F2C00304E22
+00493016005F0E0600740305127500092573000B396F000D526C0011796C00
+14B6630014E75C0016E75B0017E65B0018E65A0018E65A0018E65A0018E65A
+0018E65A0018E65A0018E65A993000009A3100009A3200009B3300009B3400
+009B3400009E360000A53B0000A73E00009C4300009144000A85420015763E
+00205F39002F453100432827005708190168001B116A001F23670022396400
+285B64002D8460002EB756002BF64E002CF54D002DF54D002DF54C002DF54C
+002DF54C002DF54C002DF54C002DF54C002DF54C9B3300009B3400009C3500
+009D3600009D3700009D3800009F3A00009E3F0000954500008B4A0003814A
+000D764A0016684800205445002C3D41003C2238004F03290160002F125F00
+36235E003D3E5D00415E5A004583540045B44A0042F2420043F3420044F341
+0045F3410045F3410045F3410045F3410045F3410045F3410045F3419D3700
+009D3800009E3900009E3A00009F3B00009F3C0000984000008F460000854B
+00007C4E00067350000D695200155C53001D4B520028344F00341B48004701
+3E035800461457004F2856005544540058604F00597D47005AA740005CFD38
+005DFE38005DFE37005EFE37005EFE37005EFE37005EFE37005EFE37005EFE
+37005EFE379F3B0000A03D0000A03D0000A03E0000A03F0000964200008A46
+0000804B0000774F00026E5200066756000B5E5B0011535D001A445F00232D
+5D002E165800400055054F005F184C00672D47006B4545006E603F006F7C3A
+0072A9350074FF2E0074FF2D0075FF2D0075FF2D0075FF2D0075FF2D0075FF
+2D0075FF2D0075FF2D0075FF2DA03F0000A1400000A1410000A14100009444
+0000874700007C4A0000734E00006A520001635700045C5D00075563000D4B
+6700153C6A001F276B002811690038006B084100751B3A007B2D37007F4334
+00825E3100857C2E0088B02B0085FA260085FF250085FF250085FF250085FF
+240085FF240085FF240085FF240085FF240085FF24A1420000A1430000A144
+000092470000844A0000794B0000704D000067510000605700005A5D000055
+6500044E6C00094472001135760019227900220D7B002E008008330089192D
+008F2B2B0092432800985F27009D8226009DB3240095F51E0093FF1D0093FF
+1D0094FF1C0094FF1C0094FF1C0094FF1C0094FF1C0094FF1C0094FF1CA145
+0000A146000090490000814C0000764D00006D4E0000665000005E55000058
+5C0000536400004D6D0001477600063D7D000C2F8300131E88001C0C8D0025
+00950628009F162400A6282100A8401E00AF5E1F00B9831E00B7AA1E00AEE7
+1A00A8FF1800A8FF1700A9FF1700A9FF1700A9FF1700A9FF1700A9FF1700A9
+FF1700A9FF17A14800008F4B00007F4D0000734F00006A500000635200005D
+540000565A0000516200004C6B00004776000040800002378900062C92000B
+1F9B001111A3001A01AE021F00BB121C00C6241900D1391800D35A1600DE7C
+1400E5A3140EEDF70C02D2FF1102D2FF1102D3FF1102D3FF1002D3FF1002D3
+FF1002D3FF1002D3FF1002D3FF108E4C00007D4F0000715100006853000060
+5400005B56000055590000506100004A6A0000457500003F800000388B0000
+319600002AA3000021B3000216C200090BD4001100E50B1500F71F1207FF38
+080AFF570108FF700007FF8B0204FFA8050CFFED000CFFED000CFFEC000CFF
+EC000CFFEC000CFFEC000CFFEC000CFFEC000CFFEC007B5100006F53000065
+5500005E570000585A0000545C00004F610000496A0000447500003E7F0000
+378900002F930000289F000021AE00001ABE000011CF000506E2000D00F40F
+0F00FF230C02FF370706FF570004FF6D0003FF840102FFA10303FFBE0003FF
+BD0003FFBC0003FFBC0003FFBC0003FFBC0003FFBC0003FFBC0003FFBC006D
+560000635800005B5A0000565C0000525E00004E61000049650000436F0000
+3D790000368300002E8C00002797000020A4000019B1000013C000010AD100
+0601E6040C00F6160A00FF280801FF3A0302FF580001FF6C0001FF820001FF
+9C0100FFB20000FFB20000FFB20000FFB20000FFB20000FFB20000FFB20000
+FFB20000FFB200615800005A5A0000545D0000506000004B63000047650000
+436A00003D740000367D00002E870000279000001F9B000018A7000012B300
+000CC2000103D3000700E80C0700F71C0600FF2C0300FF3C0000FF5A0000FF
+6E0000FF810000FF990000FFAE0000FFB20000FFB20000FFB20000FFB20000
+FFB20000FFB20000FFB20000FFB200585B0000535E00004E61000049640000
+45670000416A00003C6E0000357800002E810000268A00001F940000189F00
+0011A900000BB5000004C2000400D5050400EA120300F7220200FF2F0000FF
+490000FF620000FF700000FF830000FF9B0000FFA90000FFB20000FFB20000
+FFB20000FFB20000FFB20000FFB20000FFB20000FFB200515F00004C620000
+47660000426900003E6C00003A6E0000357200002E7B0000268400001F8E00
+001897000010A000000AAA000102B5000400C3030200D8090100E9150000F6
+230000FF2F0000FF480000FF600000FF6E0000FF800000FF960000FFA40000
+FFB20000FFB20000FFB20000FFB20000FFB20000FFB20000FFB20000FFB200
+4A63000045670000406B00003B6E000037700000327200002E760000267F00
+001F87000018900000109900000CA1000006AA000201B5000400C2020200D7
+090100E9150000F5220000FF2F0000FF450000FF5E0000FF6D0000FF7D0000
+FF910000FF9F0000FFAF0000FFB20000FFB20000FFB20000FFB20000FFB200
+00FFB20000FFB200436900003D6C0000386F0000337200002F7400002B7600
+00267900001F8100001A89000015910000109900000CA1000006AA000201B4
+000400C2020200D6080100E8140000F4220000FF2E0000FF420000FF5C0000
+FF6C0000FF7A0000FF8C0000FF9D0000FFA90000FFB20000FFB20000FFB200
+00FFB20000FFB20000FFB20000FFB200>
+<8D1400008E1500008E1500008E1600008F1600008F1700008F170000911600
+0092130000920D00098C0201188D000B199000171893002416980033159B00
+48169C005D159C0071149D0087139E00A1109D00C00C9A00E1099805FF0097
+04FF009704FF009704FF009704FF009704FF009704FF009704FF009704FF00
+9704FF009704FF008E1500008E1500008E1600008F1600008F1700008F1700
+008F1800009116000092140000920E00098D0401178D000A1A900016199300
+2317980032169B0046179C005C169D0070159E0086149F00A1119E00C00D9B
+00E20A9906FF009805FF009805FF009805FF009805FF009805FF009805FF00
+9805FF009805FF009805FF009805FF008E1500008E1600008F1700008F1700
+008F1700008F180000901800009117000093150000930F00088E0501178D00
+091B9000151A94002218990031179C0045189D005B179D006F169E008515A0
+00A0139E00C00E9C00E20B9906FF009805FF009806FF009806FF009806FF00
+9806FF009806FF009806FF009806FF009806FF009806FF008E1600008F1700
+008F1700008F18000090180000901900009019000092180000931600009411
+0007900600168E00071C9100141B94002119990030189D0044199E005A189E
+006E179F008416A0009E149F00BF109D00E30C9A08FF009906FF009906FF00
+9906FF009906FF009906FF009906FF009906FF009906FF009906FF009906FF
+008F1700008F1700008F180000901800009019000090190000901A00009219
+00009417000095120006910800158E00061E9100131C9500201B9A002F199D
+00421A9F00581A9E006D189F008217A1009D15A000BE119D00E30D9B09FF00
+9908FF009A08FF009A08FF009A08FF009A08FF009A08FF009A08FF009A08FF
+009A08FF009A08FF008F180000901800009019000090190000901A0000911A
+0000911A0000931A00009518000096140005930A00158E00041F9200111E95
+001F1C9A002D1B9E00401BA000561B9F006B1AA0008119A2009B17A100BD13
+9E00E30F9C0BFF009A09FF009A09FF009A09FF009A09FF009A09FF009A09FF
+009A09FF009A09FF009A09FF009A09FF009019000090190000901A0000911A
+0000911A0000911B0000911B0000931B00009519000097160004950C00138F
+01032092000F1F95001D1E9A002B1C9F003E1DA100541DA000691BA0007F1A
+A2009918A300BB149F00E3109D0CFF009B0AFF009B0BFF009B0BFF009B0BFF
+009B0BFF009B0BFF009B0BFF009B0BFF009B0BFF009B0BFF0090190000911A
+0000911A0000911B0000911B0000921C0000921C0000941C0000961A000098
+170003970E00129003012092000D2195001B209A002A1E9F003C1EA100521F
+A100681DA1007D1CA300971AA400BA16A000E2129F0EFF009B0CFF009B0CFF
+009B0CFF009B0CFF009B0CFF009B0CFF009B0CFF009B0CFF009B0CFF009B0C
+FF00911A0000911B0000911B0000921C0000921C0000921D0000921D000094
+1D0000971C000099190002991100109205002092000A24960019229A002820
+A0003920A3004F20A300661FA1007B1EA400941CA500B818A000E114A010FF
+009C0EFF009C0EFF009C0EFF009C0EFF009C0EFF009C0EFF009C0EFF009C0E
+FF009C0EFF009C0EFF00911B0000921C0000921D0000921D0000921E000092
+1E0000931F0000951E0000971D0000991B00019B14000F9608001E92000826
+960016249A002522A1003722A4004C22A4006321A3007820A400921EA600B6
+1BA100DF16A212FF019D10FF009D10FF009D10FF009D10FF009E10FF009E10
+FF009E10FF009E10FF009E10FF009E10FF00921D0000921D0000921E000093
+1E0000931F0000931F00009320000095200000981F00009A1D00009D17000D
+990C001C92000429960013279A002325A1003424A4004925A5006024A40076
+22A5009020A800B31DA000DB199E13FF069917FF009818FF009719FF00971A
+FF00961BFF00961BFF00961BFF00961BFF00961BFF00961BFF00921E000093
+1F0000931F0000932000009320000093210000932100009621000099200000
+9B1F00009F1A000B9D10001A9503022897000F2A9A002028A0003026A50045
+27A7005C269E0071279500852890009F288800BF277B00E6238F24FF008E25
+FF008921FF05831BFF0C7E16FF117E16FF117E16FF117E16FF117E16FF117E
+16FF1193200000932000009321000093210000942200009422000094230000
+96230000992200009C210000A11E0008A11400189906012897000B2E9A001C
+2C9F002C2A97003C2E8E004F32830062337900753370008C336800A8326100
+D6305F03FF2C5E04FF2D5C04FF2D5C05FF2E5B06FF2D5B06FF2D5B06FF2D5B
+06FF2D5B06FF2D5B06FF2D9321000094220000942300009423000094240000
+9424000094250000962500009A2500009E240000A2210006A51900159E0C00
+25980106318C0013388100203D78002D406F003D42650051445D0067455600
+804450009B414A00BF3C6523FF1E6424FF1E6325FF1E6325FF1E6225FF1E62
+25FF1E6225FF1E6225FF1E6225FF1E6225FF1E942300009424000094240000
+94250000942500009526000095270000972700009B280000A0280000A42500
+04A81E00129D150022850C00356B0205485E00124F540020534B002E554200
+40573B0058583600705632008B522F00B94E3D15FF383711FF3D330FFF4030
+0CFF432D0AFF462D0AFF462D0AFF462D0AFF462D0AFF462D0AFF4694250000
+952600009526000095270000962800009628000096290000992A00009D2B00
+00A22B0000A62A00029C2700108E22001E761B0030560F00493A01025F2D00
+0F6324001F631D002F6516004365140059631400736113009C5F0D01FE590B
+02FE590A02FE590902FE590803FE590803FE590803FE590803FE590803FE59
+0803FE59952700009628000096290000972A0000972A0000972B0000972C00
+009B2D00009F2F0000A0320000973600048C3300117E2E001D6828002D4A1F
+00442D14005A0D05006D0205126F0009246D000B3769000D4E660010706600
+14A0600014E7560016E6550017E5550017E4540018E4540018E4540018E454
+0018E4540018E4540018E454972A0000972B0000972C0000982D0000982D00
+00992E0000992F00009C3100009A370000933E0000893F00087E3C00136F39
+001E5934002C402E003F2625005307180163001A1164001E22610021365E00
+26555E002B795A002DA352002AEE48002BEE48002CEE47002CEE46002DEE46
+002DEE46002DEE46002DEE46002DEE46002DEE46982D0000992E0000992F00
+00993000009A3100009A3200009B330000953A00008D400000844500017A45
+000B704400156242001F4E40002A373C00371F34004A0327025A002C125900
+332356003B3A57003F58540042774E0043A1450041E23C0041ED3B0042EE3A
+0042EE3A0043EE3A0043EE3A0043EE3A0043EE3A0043EE3A0043EE3A9A3100
+009A3200009B3300009C3400009C3500009D360000913D0000884200007F47
+0000764900056D4A000C634C0014564D001C454C00252F4900301842004301
+3A035200421450004C274F0053414C00545B49005575430056993B0057DE33
+0058FA310059FA31005AFB31005AFB31005AFB31005AFB31005AFB31005AFB
+31005AFB319C3600009D3700009D3800009E3900009D3A0000904000008443
+00007B470000724A0001694D00066251000B595400104E5700183E58002128
+56002B1251003C004F0649005A184500632C400066413D00695A39006A7536
+006C99310070E72B006FFF29006FFF29006FFF280070FF280070FF280070FF
+280070FF280070FF280070FF289F3B00009F3C0000A03D00009D3E00008D43
+000081460000774700006E4A0000664E00015F52000358580006505D000C46
+6100143763001D226300260C6100350065093B006F1B3300752C310079412F
+007D5A2C007F752A00819C270081E023007FFF21007FFF21007FFF21007FFF
+20007FFF20007FFF20007FFF20007FFF20007FFF20A03F0000A04000009D41
+00008B4600007F480000744900006C4A0000644E00005C5200005659000050
+5F0003496600083F6B00102F6F00181D7100210872002D00790A2E00821A28
+00872A26008A412400905B23009477220095A1210091DA1C008DFF19008EFF
+19008EFF19008EFF19008EFF19008EFF19008EFF19008EFF19008EFF19A142
+00009C440000894800007B4B0000714C0000684D0000624E00005B52000054
+5800004F5F000049680001426F00053776000C297B0013187F001C06830025
+008C092400961720009C281D009E3F1A00A4591A00A9781B00AD9F1A00A7D0
+18009FFF1300A0FF1300A0FF1300A0FF1300A0FF1300A0FF1300A0FF1300A0
+FF1300A0FF139C460000874A0000784D00006E4E0000654F00005E50000059
+520000535700004D5E000048670000427100003B7A0002318200072589000C
+168F00150896001B00A2071C00AD141800B6241500BB381300BF541200C674
+1100CD971000CCC91300BEFF0F00BEFF0E00BEFF0E00BFFF0E00BFFF0E00BF
+FF0E00BFFF0E00BFFF0E00BFFF0E864C0000764F00006B500000625200005B
+53000056560000525800004C5E000047670000417100003B7B000033850000
+2C8E0000239A000219A500070DAF000E01BD011400CD0F1000DB200E00EA32
+0C01F04D0A00F36B0802F8890502FEAF060AFAFF0008F1FF0108F1FF0108F2
+FF0108F2FF0108F2FF0108F2FF0108F2FF0108F2FF01745100006853000060
+55000059570000545A00004F5D00004B60000046670000407100003A7C0000
+328600002B910000239C00001CA9000016B700000EC7000205DA000900EE0C
+0B00FD1F0900FF300502FF4E0001FF640000FF790001FF970000FFB10000FF
+B20000FFB20000FFB20000FFB20000FFB20000FFB20000FFB20000FFB20066
+5500005D580000575B0000525F00004D61000049640000456700003F6E0000
+39780000328100002A8B0000239500001BA0000014AC00000EB9000007C800
+0400DC040700F0140600FD250400FF340000FF4F0000FF670000FF7B0000FF
+940000FFAC0000FFB20000FFB20000FFB20000FFB20000FFB20000FFB20000
+FFB20000FFB2005B5A0000555C0000506000004B6300004666000042690000
+3E6C000039730000317C00002A850000228F00001B98000014A300000DAE00
+0006BA000200C9010500E10B0200EF1A0100FC290000FF380000FF570000FF
+6B0000FF7C0000FF930000FFA60000FFB20000FFB20000FFB20000FFB20000
+FFB20000FFB20000FFB20000FFB200545D00004E6100004964000044680000
+3F6B00003B6E000037700000317600002A7F0000228800001B920000139B00
+000CA4000004AE000300BB010400CB050100E10E0000EE1B0000FB290000FF
+360000FF550000FF6A0000FF790000FF8E0000FFA10000FFB20000FFB20000
+FFB20000FFB20000FFB20000FFB20000FFB20000FFB2004C62000047660000
+416A00003C6D000038700000337200002F740000297A0000228200001B8B00
+00139400000F9C00000AA4000004AE000300BA010400CA040200E00D0000EE
+1B0000FB280000FF340000FF540000FF690000FF760000FF8A0000FF9E0000
+FFB00000FFB20000FFB20000FFB20000FFB20000FFB20000FFB20000FFB200
+456700003F6B00003A6F000035710000307400002C76000028770000227C00
+001D840000188C0000149400000F9C00000AA4000004AD000300BA010400CA
+040200E00D0000ED1A0000FA270000FF330000FF520000FF660000FF730000
+FF860000FF9C0000FFAA0000FFB20000FFB20000FFB20000FFB20000FFB200
+00FFB20000FFB2003D6D000037700000317300002C75000028770000247800
+0023790000217D00001D840000188C0000149400000F9B00000AA4000004AD
+000300B9000400C9040200DF0C0000EC190000F9260000FF320000FF4F0000
+FF640000FF710000FF830000FF990000FFA40000FFB20000FFB20000FFB200
+00FFB20000FFB20000FFB20000FFB200>
+<8A0F00008A0F00008B1000008B1000008B1100008B1100008C1100008C1100
+008D0F00008C0900068701021289000C118B0017108D00220F9100300E9400
+430D9600580C97006D0C9800820A980098089700B0069500CB029501F60093
+00FF009300FF009300FF009300FF009300FF009300FF009300FF009300FF00
+9300FF009300FF008A0F00008B1000008B1000008B1100008C1100008C1200
+008C1200008D1200008E0F00008D0A00058802021289000B128B0016118D00
+22109100300F9500420E9700580D97006C0D9900810C9900970A9800B00796
+00CB039501F5019401FF009401FF009401FF009401FF009401FF009401FF00
+9401FF009401FF009401FF009401FF008B1000008B1000008B1100008C1100
+008C1200008C1200008D1300008D1300008E1000008D0C0005890302128A00
+0A138C0015128E00211192002F109600410F9700560F98006B0E9900800D9A
+00970B9900B0089700CB049601F4029401FF009401FF009401FF009401FF00
+9401FF009401FF009401FF009401FF009401FF009401FF008B1100008C1100
+008C1200008C1200008D1300008D1300008D1400008E1400008F1100008E0D
+00048A0401118A0009158C0014138E00201292002D11970040119800551099
+006A0F9A007F0E9B00960C9A00B0099800CC069600F3029501FF009501FF00
+9501FF009501FF009501FF009501FF009501FF009501FF009501FF009501FF
+008C1100008C1200008D1300008D1300008D1400008D1400008E1400008E14
+0000901200008F0E00038C0500118A0007168D0013158F001F1493002C1297
+003F1299005412990068119B007E109C00950E9B00B00B9900CC079700F203
+9501FF009501FF009501FF009501FF009501FF009501FF009501FF009501FF
+009501FF009501FF008C1200008D1300008D1300008D1400008E1400008E15
+00008E1500008F15000090130000911000028D0600118B0006188D00121690
+001E1594002B1498003D139A0052139A0067129B007C119D0093109C00AF0C
+9A00CC089800F3059602FF009602FF009602FF009602FF009602FF009602FF
+009602FF009602FF009602FF009602FF008D1300008D1400008E1500008E15
+00008E1600008E1600008F1600008F16000091140000921200018F0800108B
+0004198E00101890001C169400291599003B159B0051159B0065149C007A13
+9E0092119E00AE0E9C00CD0A9900F3079704FF009704FF009704FF009704FF
+009704FF009704FF009704FF009704FF009704FF009704FF008E1400008E15
+00008E1600008E1600008F1700008F1700008F180000901800009216000093
+130001910B000E8B00021B8E000E1A91001B18950028179A0039179C004E17
+9D0064169D0078159F0090139F00AD109D00CD0C9A00F4089805FF009805FF
+009805FF009805FF009805FF009805FF009805FF009805FF009805FF009805
+FF008E1600008F1600008F1700008F1700008F180000901800009019000090
+1900009317000094150000930D000C8C02011C8F000C1C9200191A96002619
+9B0037199D004C199E0062189E007617A0008E15A000AB129E00CD0E9B00F5
+0A9906FF009906FF009906FF009906FF009906FF009906FF009906FF009906
+FF009906FF009906FF008F1700008F18000090180000901900009019000090
+190000901A0000911A000093190000951700009510000B8F04001B8F00091E
+9200171C9700241B9B00341A9F00491B9F005F1A9F007419A0008B18A200A9
+15A000CC109D04F4099A08FF009A08FF009A08FF009A08FF009A08FF009909
+FF009909FF009909FF009909FF009909FF0090180000901900009019000090
+1A0000911A0000911B0000911B0000921B0000941A00009618000097130009
+93080019900006219300141F9700221D9C00311CA000461DA1005C1DA00071
+1BA100891AA200A6189B00C7169000ED139212FF009114FF009015FF008F16
+FF008F16FF008E17FF008E17FF008E17FF008E17FF008E17FF00901A000091
+1A0000911B0000911B0000911C0000921C0000921D0000921D0000951C0000
+971A000099160007960C0016910204229300112297001F209D002F1FA10043
+1FA000582096006B228E007D238A0094248500B2237800D020881FFF01871F
+FF018620FF018520FF028521FF028421FF028421FF028421FF028421FF0284
+21FF02911B0000911C0000921C0000921D0000921D0000921E0000921E0000
+931E0000961E0000981C00009B1900059A1000149304012394000D2597001C
+2396002A248E00392886004B2C7C005D2C73006F2C6C00842D65009E2D5E00
+C22B5A01FE275801FE295701FE2A5602FE2A5603FE2A5503FE2A5503FE2A55
+03FE2A5503FE2A5503FE2A921D0000921D0000921E0000931E0000931F0000
+93200000932000009420000096200000991F00009C1C00039E140011970800
+228F00072B840012317A001E3570002A396800383B5F004B3D5800603E5300
+783E4E00913C4800B0375212FF285013FF284F13FF284E13FF294E14FF294D
+14FF294D14FF294D14FF294D14FF294D14FF29931F0000931F000093200000
+9320000093210000932100009422000094220000972200009A2100009D2000
+01A119000F9212001E7B09003064020541580011474F001E4B46002B4E3F00
+3C5038005252330069503000824D2D00A348360FFD38320EFF3A2E0BFF3E2B
+09FF402907FF432706FF442706FF442706FF442706FF442706FF4493210000
+93210000942200009422000094230000942300009424000094240000972400
+009B2400009A2400019223000E841F001B6E18002C510E0043370102572B00
+0F5C22001D5D1B002D5F1400405F1200545D12006C5B12008C5A0B00EC5509
+00FB540701FC540601FC550501FC550401FC550401FC550401FC550401FC55
+0401FC55942300009423000094240000942500009425000095260000952600
+009627000099270000952B00008D2F0003842E000F762A001B6025002B451D
+00402A1300550C0400660205116900092367000B3563000D4B600010695F00
+13905B0014CF520015E34F0016E24E0017E24D0018E14D0018E14D0018E14D
+0018E14D0018E14D0018E14D94250000952600009527000095270000962800
+009629000096290000972A0000903000008A37000081390006763700126834
+001D5230002A3B2A003A2322004E0616015D0018115E001D225A001F355800
+234F5800297154002C944C002ACA44002AE942002BE941002BEA40002CE940
+002CE940002CE940002CE940002CE940002CE9409628000096290000972A00
+00972B0000972B0000982C0000962E00008C330000853B00007E410000743F
+000B693E00145B3D001E473B0026313800321C30004502250254002A125100
+31234F0038384F003C534E003F6F480040913F003FC338003EED35003FED34
+0040ED340040ED330040ED330040ED330040ED330040ED330040ED33972B00
+00982C0000982D0000992E0000992F0000953200008B380000823D00007942
+0000704400046745000C5D4600145047001A3F4700222A44002C153D003E01
+37044B003E15470048274600503E440051564100526E3D00538E370053BD2F
+0054F52C0055F52B0055F62B0056F62B0056F62B0056F62B0056F62B0056F6
+2B0056F62B993000009A3100009A3200009B33000095360000893D00007F40
+0000754300006D460000654800055D4B000A544F000F485100163851001E24
+5000280F4B0038004B07410056193D005F2B3800623F350064563200666E30
+00678C2D0069BE270069FF250069FF24006AFF24006AFF24006AFF24006AFF
+24006AFF24006AFF24006AFF249C3500009C3600009D370000963C00008741
+00007C440000724500006A460000624A00015B4E0002545300054C58000A41
+5B0012315C001A1E5C0024095A003200600B35006A1B2E006F2B2C00733E29
+00775626007A6E25007B8D23007CC2200079FF1D0079FF1D0079FF1D007AFF
+1C007AFF1C007AFF1C007AFF1C007AFF1C007AFF1C9E3A00009F3C00009540
+000085440000784600006E47000067480000604A0000594E0000525400004C
+5B0001456000073A64000F2A67001718690020046A012B00730C28007C1A24
+00802A2200833F200089571E008D711D008E921D008DC31A0088FF150088FF
+150089FF150089FF150089FF150089FF150089FF150089FF150089FF15A03F
+00009443000083470000754900006B4A0000634B00005D4C0000584E000051
+5400004B5B0000456300003D6A0004326F000B247300121276001B017A0024
+00850B1F008E181C0094281900963C17009A5416009F6F1600A3921500A1BD
+150099FB0F0099FF0F0099FF0F0099FF0E009AFF0E009AFF0E009AFF0E009A
+FF0E009AFF0E93460000814A0000734B0000684C0000604E00005A50000055
+510000505300004A5B0000446300003D6B0000367300022B7A00081E80000E
+0E850016038D011A00980A1700A2161400A9241100AC370E00AF4F0D00B36B
+0D00BC8C0C00BDB40D00B1EE0B00AEFF0A00AEFF0A00AEFF0900AEFF0900AE
+FF0900AEFF0900AEFF0900AEFF097E4C0000704D0000654F00005D51000057
+530000525500004D580000495B0000436300003C6C0000367500002E7E0000
+258600031B8F00060F97000D04A0001200AE071000BB120C00C5200A00CB32
+0700CC490500D5660400DC840300E1A40403E9F60102D3FC0202D3FB0202D3
+FB0202D3FB0202D3FB0202D3FB0202D3FB0202D3FB026D500000635200005B
+540000545700004F5A00004B5D000046600000426300003C6D000035770000
+2D800000268A00001F95000017A0000010AC000107BA000601CA020800E10D
+0600F11E0500FE2D0200FF3F0000FF5F0000FF730000FF8C0000FFA80000FF
+B20000FFB20000FFB20000FFB20000FFB20000FFB20000FFB20000FFB20060
+55000058580000525B00004D5F000048630000446700003F6B00003C6D0000
+357700002D800000268900001E930000179D000010A700000AB3000003C000
+0400D3050300E8130100F5220000FF300000FF4C0000FF630000FF730000FF
+8A0000FFA20000FFB20000FFB20000FFB20000FFB20000FFB20000FFB20000
+FFB20000FFB200565C0000505F00004B63000046670000416A00003C6D0000
+386F0000347100002D7A0000268300001E8C0000179600000F9F000008A800
+0101B3000400C0020300D5080100E8140000F5220000FF2F0000FF480000FF
+610000FF710000FF870000FF9F0000FFB20000FFB20000FFB20000FFB20000
+FFB20000FFB20000FFB20000FFB2004F60000049640000436800003E6C0000
+396F000035710000307300002D750000257D00001E860000178F0000129700
+000D9F000008A8000101B2000400C0020300D4070100E7130000F4210000FF
+2E0000FF450000FF5F0000FF6F0000FF830000FF9C0000FFB00000FFB20000
+FFB20000FFB20000FFB20000FFB20000FFB20000FFB20047660000416A0000
+3B6E000036710000317300002D75000029770000257800001F8000001B8700
+00168F0000129700000D9F000008A8000102B2000400BF020300D3070100E6
+120000F3200000FF2D0000FF420000FF5D0000FF6E0000FF800000FF9A0000
+FFAA0000FFB20000FFB20000FFB20000FFB20000FFB20000FFB20000FFB200
+3F6B0000396F0000337200002E750000297700002578000023790000237900
+001F8000001B870000178F0000129700000D9F000008A7000102B2000400BF
+020300D2060100E5120000F21F0000FE2C0000FF3F0000FF5B0000FF6C0000
+FF7D0000FF930000FFA40000FFB20000FFB20000FFB20000FFB20000FFB200
+00FFB20000FFB20036710000307400002A7600002578000023790000237900
+002379000023790000207F00001B870000178E0000129600000D9E000008A7
+000002B1000400BE010300D1060100E4110000F11E0000FD2B0000FF3C0000
+FF590000FF6B0000FF7A0000FF8D0000FF9F0000FFAF0000FFB20000FFB200
+00FFB20000FFB20000FFB20000FFB200>
+<8409000084090000850A0000860A0000860B0000870B0000870C0000870C00
+00870A0000850600038200040B84000C0A850016098600200889002D078E00
+3E05900053039100670392007C01920090019100A4019000BC009000E2008F
+00FF008F00FF008F00FF008F00FF008F00FF008F00FF008F00FF008F00FF00
+8F00FF008F00FF0085090000850A0000860B0000860B0000870B0000870C00
+00880C0000880D0000880B0000860700028300030C85000C0B8600150A8700
+20098A002C088F003D06910052059100670492007B02930090029200A40190
+00BB009100E1008F00FF008F00FF008F00FF008F00FF008F00FF008F00FF00
+8F00FF008F00FF008F00FF008F00FF00850A0000860B0000870B0000870C00
+00880C0000880D0000890D0000890D0000890C0000870800028401020C8500
+0B0C8600140B88001F0A8A002B098F003C07920051069200660593007A0494
+008F039300A4029100BB019100DF009000FF009000FF009000FF009000FF00
+9000FF009000FF009000FF009000FF009000FF009000FF00860B0000870C00
+00880C0000880D0000890D0000890E0000890E00008A0E00008A0D00008909
+00028501010D86000A0D8700130C88001E0C8B002A0B90003B099200500793
+0065079400790695008E049400A3039200BB019200DE009100FF009100FF00
+9100FF009100FF009100FF009100FF009100FF009100FF009100FF009100FF
+00870C0000880D0000890D0000890E0000890E00008A0E00008A0F00008A0F
+00008B0E00008A0B00018602010D8600080F8800120D89001D0D8C00290C90
+003A0A93004E09940063089500780796008E059500A3039300BA019300DC00
+9100FF009100FF009100FF009100FF009100FF009100FF009100FF009100FF
+009100FF009100FF00880D0000890D0000890E00008A0F00008A0F00008A0F
+00008B1000008B1000008C0F00008B0C00008703000D870007108900110F8A
+001C0E8D00280D9100390C94004D0B9500620A9600770997008C079600A305
+9400BA029400DB009200FF009200FF009200FF009200FF009200FF009200FF
+009200FF009200FF009200FF009200FF00890E00008A0F00008A0F00008B10
+00008B1000008B1100008B1100008C1100008D1000008D0D00008905000C87
+0006128A0010108B001B108E00270F9200370D95004B0D9600600C9700750B
+98008B099800A2079600BB049500DB019300FF009300FF009300FF009300FF
+009300FF009300FF009300FF009300FF009300FF009300FF008A0F00008B10
+00008B1000008B1100008C1100008C1200008C1200008D1300008D1200008E
+0F00008C08000A880004148A000E128C0019128F0026109300350F96004A0F
+97005F0E9800730D9900890C9900A1099700BB069600DB039401FF009401FF
+009401FF009401FF009401FF009401FF009401FF009401FF009401FF009401
+FF008B1000008B1100008C1200008C1200008D1300008D1300008D1300008D
+1400008E1300008F1000008E0A0009890102158B000C148D00181390002412
+940033119800471199005D109900710F9B00880E9B00A00B9900BC089700DC
+049501FF009501FF009501FF009501FF009501FF009501FF009501FF009501
+FF009501FF009501FF008C1200008C1200008D1300008D1300008D1400008E
+1400008E1500008E1500008F15000090120000900D00078B0301158C000A17
+8E0016159100231495003113990045139A005B129A006F129C0085119D009F
+0E9B00BC0A9900DD069602FF009502FF009403FF009204FF009105FF009106
+FF009006FF009006FF009006FF009006FF008D1300008D1400008E1400008E
+1500008E1500008E1600008F1600008F1700009016000092140000920F0005
+8D0500148C0008198F0014189200211696002F159A0042169C0058159C006D
+149D00831399009A149300B5138B00D5108B0CFF028A0FFF008810FF008811
+FF018711FF018611FF018611FF018611FF018611FF018611FF018E1500008E
+1500008E1600008F1700008F1700008F1800008F1800009018000091180000
+9316000094120003910900138D00051C9000111A93001E1997002C189C003F
+189600531B8D00651D8600761E82008B1F8000A41F7400C01C6C00F5167A14
+FF097914FF0A7714FF0B7614FF0C7614FF0C7514FF0C7514FF0C7514FF0C75
+14FF0C8F1700008F1700008F180000901800009019000090190000901A0000
+911A0000921A00009418000096150002940C00108D01011E90000E1D94001C
+1C8E00271E860034227E004626740057256C00682667007D27620094285B00
+B3275600E9245400FA245200FA265101FA265101FA265002FA265002FA2650
+02FA265002FA265002FA26901800009019000090190000911A0000911A0000
+911B0000911B0000911C0000931C0000951A0000971800019711000E910400
+1E870007257C00112A72001C2E690027316100333359004435530059374F00
+70374B0089364600A8324200EC324A0EFF27480EFF27470EFF27470FFF2846
+0FFF28460FFF28460FFF28460FFF28460FFF28911A0000911B0000911B0000
+911C0000921C0000921D0000921D0000921E0000941E0000961D0000981B00
+009716000B8810001B7207002C5E0105395300103F49001C43410028463B00
+384934004D4B3000634A2D007A472A0096432800D9412E0BFD362A08FC3A27
+06FC3D2504FB3F2303FB412203FB412203FB412203FB412203FB41921C0000
+921D0000921D0000921E0000931E0000931F0000931F000093200000952000
+00971F0000912000008920000B7B1C0019661600294C0C003C3401024F2800
+0E5520001C5719002B5912003C590F0050570F0066560F0081540A00C65307
+00F44E0600F44E0400F54F0300F54F0200F54F0200F54F0200F54F0200F54F
+0200F54F921E0000931F000093200000932000009321000093210000942200
+0094220000952200008C260000852A00027C29000D6E26001959220028411B
+003B2811004F0B04005F0205106200082161000B335D000D47590010645800
+1385540015B44D0014DE480016DE470017DD470017DD460018DD460018DD46
+0018DD460018DD460018DD4693210000932100009422000094230000942300
+00942400009424000091260000882B0000823100007A3300066F310011602F
+001C4C2C002736270035202000480515015600171157001B2153001E335100
+224A510026684E00298645002AB13F0029E33C0029E33B002AE33A002BE43A
+002BE43A002BE43A002BE43A002BE43A002BE43A9423000094240000942500
+009425000095260000952700008F2A0000852F00007E350000773B00006D39
+000A623800155438001D413700232C33002C192C00400223034D0028134A00
+2E23470035364800394E47003B6842003D8439003CAD33003CEA2F003DEA2E
+003DEA2E003EEA2D003EEA2D003EEA2D003EEA2D003EEA2D003EEA2D952600
+00952700009628000096290000962A00008E2E0000843500007B390000733D
+00006B3F0004623F000D574000134A4200183942001E273F00281338003901
+340544003B16400044273E004C3B3B004D5139004E6836004F8332004FAA2C
+0050ED250050EE250051EF250051EF250052F0250052F0250052F0250052F0
+250052F025972A0000972B0000982C0000982D00008E330000833A0000783D
+0000703F00006841000060430005584700094F4A000D434C0013334C001A21
+4A00240C4500340046083A0051193600592A31005E3C2E0060522A0062682A
+006283290064AA240063FF200064FF200064FF200065FF200065FF1F0065FF
+1F0065FF1F0065FF1F0065FF1F992F0000993000009A3100008D380000813E
+0000754100006C420000654300005E460000574A0001504F0003485300073C
+55000F2C5600171A5600210653002F005B0C2F00641B2900692927006D3C25
+0072532100756A200075841F0076AA1C0074F5190074FF180075FF180075FF
+180075FF180075FF180075FF180075FF180075FF189B3400009C3500008D3D
+00007E4200007244000069450000614600005B480000554A00004F50000048
+560000405B0004355E000C256100141462001E01620129006D0D2300751A20
+007A291E007D3C1C0083531900876B19008886180088AD160084EE120084FF
+110084FF100084FF100085FF100085FF100085FF100085FF100085FF109E3A
+00008B4100007C4500006F470000664800005E490000584B0000534D00004E
+50000047570000405E0000386400032D68000A1F6C00110E6F001A00730320
+007E0D1B00871918008C2715008E3A120092501100966911009A8610009CAE
+110096E30C0093FF0A0094FF0A0094FF0A0094FF0A0094FF0A0094FF0A0094
+FF0A0094FF0A8A450000794800006C490000634B00005B4C0000554E000050
+5000004B53000046570000405E000039660000306D0002257300071878000E
+097C001500840317008F0D130099170F009F250D00A1350A00A34A0800A764
+0700AD840600B1A40600A9D20600A5FE0500A5FD0500A5FD0500A5FD0500A5
+FD0500A5FD0500A5FD0500A5FD05774B00006A4C0000604E00005850000052
+5200004D55000048580000445B00003F5F0000386700003170000029770000
+1F7F00041385000A078C000F0096031000A20B0B00AD150800B5220500B731
+0200B8460000C1600000C7800000CA990000C9C90000BDF50100BEF50100BE
+F50000BEF50000BEF50000BEF50000BEF50000BEF500674F00005D51000056
+530000505700004A5A0000455D0000416100003D6400003869000030720000
+297A0000218300001A8D000011950003069D000800A8020800B9080400C912
+0100D51F0000E52D0000FE3F0000F65B0000F8710000F88A0000FCAA0000F1
+DC0000F2DA0000F3D80000F4D60000F4D60000F4D60000F4D60000F4D6005B
+540000535800004D5C000048600000436400003E6800003A6B0000366E0000
+30730000297D0000228700001A910000139A00000CA3000005AC000300B800
+0400C8040200DF0C0000ED1A0000FB280000FF360000FF570000FF6C0000FF
+800000FF9C0000FFB20000FFB20000FFB20000FFB20000FFB20000FFB20000
+FFB20000FFB200515D00004B62000046670000406A00003B6E000036700000
+327300002E75000029780000218100001A8A000015920000109A00000BA200
+0005AC000200B8000400C7040200DE0C0000ED190000FA270000FF340000FF
+550000FF6B0000FF7D0000FF990000FFAF0000FFB20000FFB20000FFB20000
+FFB20000FFB20000FFB20000FFB20049640000436800003D6C000038700000
+337200002E7500002A76000026780000227B00001E830000198A0000159200
+00109A00000BA2000005AB000201B7000400C6030200DD0B0000EC190000F9
+270000FF330000FF530000FF690000FF790000FF930000FFA90000FFB20000
+FFB20000FFB20000FFB20000FFB20000FFB20000FFB200416A00003B6E0000
+357100002F7400002A760000267800002379000023790000227B00001E8200
+00198A000015920000109A00000BA2000005AB000201B7000400C5030200DC
+0B0000EB180000F9260000FF320000FF510000FF670000FF760000FF8D0000
+FFA20000FFB20000FFB20000FFB20000FFB20000FFB20000FFB20000FFB200
+386F0000327300002C75000027780000237900002379000023790000237900
+00227B00001E820000198A000015920000109900000BA2000006AB000201B6
+000400C5030200DB0A0100EB170000F8250000FF310000FF4F0000FF650000
+FF730000FF880000FF9E0000FFB20000FFB20000FFB20000FFB20000FFB200
+00FFB20000FFB2002F74000029770000237900002379000023790000237900
+002379000023790000227B00001E8200001A89000015910000109900000CA1
+000006AA000201B6000400C4030200D90A0100EA160000F7240000FF300000
+FF4C0000FF620000FF700000FF840000FF9C0000FFAB0000FFB20000FFB200
+00FFB20000FFB20000FFB20000FFB200>
+<7A0400007B0400007C0400007C0500007D0500007E0600007F0600007F0600
+00800700007D0300007C0005047E000C037F00150380001E02820029018700
+39008A004C008A0061008B0075008C0089008B009B008A00B0008A00D0008A
+00FF008A00FF008A00FF008A00FF008A00FF008A00FF008A00FF008A00FF00
+8A00FF008A00FF007B0400007C0500007D0500007E0600007E0600007F0600
+008007000081070000810700007E0400007D0004057F000C04800014038100
+1D0382002902870038008B004B008B0060008C0075008D0088008C009B008B
+00B0008B00CF008B00FF008A00FF008A00FF008A00FF008A00FF008A00FF00
+8A00FF008A00FF008A00FF008A00FF007C0500007D0500007E0600007F0600
+008007000081070000810700008208000083080000800500007D0003068000
+0B058100130482001D0483002803880037018C004A018C005F018D0074008E
+0088008D009A008C00B0008C00CF008C00FF008B00FF008B00FF008B00FF00
+8B00FF008B00FF008B00FF008B00FF008B00FF008B00FF007E0600007F0600
+00800700008107000082080000820800008308000084090000840900008106
+00007E00020781000A068200130582001C0584002704890036028D0049018D
+005E018E0073018F0087008E009A008D00AF008D00CE008D00FF008C00FF00
+8C00FF008C00FF008C00FF008C00FF008C00FF008C00FF008C00FF008C00FF
+0080070000810700008208000082080000830800008409000084090000850A
+0000850A0000830700007F000108820009088300120783001B068500260589
+0035038E0048028E005D028F007201900086008F0099008E00AE008E00CD00
+8E00FF008D00FF008D00FF008D00FF008D00FF008D00FF008D00FF008D00FF
+008D00FF008D00FF0081080000820800008309000084090000850A0000850A
+0000860A0000860B0000860B00008508000081010009820008098300110884
+001A07860025078A0034058F0047038F005C02900071019100850090009800
+8F00AE008F00CC008F00FF008E00FF008E00FF008E00FF008E00FF008E00FF
+008E00FF008E00FF008E00FF008E00FF008309000084090000850A0000850A
+0000860B0000860B0000870C0000870C0000880C0000870A00008303000883
+00060B8400100A86001909870024088B0033079000450490005B0491006F03
+92008401920098019000AD019000CB009000FF008F00FF008F00FF008F00FF
+008F00FF008F00FF008F00FF008F00FF008F00FF008F00FF00850A0000860A
+0000860B0000870B0000870C0000880C0000880D0000890D0000890E000089
+0B0000860500078400050D86000E0B8700180B8800230A8C00310991004406
+9200590692006E0593008304930097039200AD029100C9009200FE009000FF
+009000FF009000FF009000FF009000FF009000FF009000FF009000FF009000
+FF00860B0000870C0000880C0000880D0000890D0000890E00008A0E00008A
+0F00008A0F00008A0C0000880700058500030E86000C0D8800170D8A00220C
+8D00300B920042099300570894006C0795008106950096049300AC029200C8
+009300FA009100FF009100FF009100FF009100FF009100FF009100FF009100
+FF009100FF009100FF00880D0000890D0000890E00008A0E00008A0F00008A
+0F00008B1000008B1000008B1000008C0E00008B0A00048702020F87000B10
+8900150F8B00200E8E002E0D9300400B9400550A95006A0A96007F08970095
+069500AC049400C7019100F4008D00FF008B01FF008A01FF008902FF008902
+FF008803FF008803FF008803FF008803FF00890E00008A0F00008A0F00008B
+1000008B1000008B1100008C1100008C1200008C1200008D1000008D0C0003
+89030110880008128A0013118C001F1090002C0F94003E0E9600530D970068
+0C93007B0E8F008E0F8A00A50F8400BF0C7E00E709810AFF00800AFF017F0B
+FF027E0BFF027D0BFF037C0AFF037C0AFF037C0AFF037C0AFF038B1000008B
+1000008B1100008C1100008C1200008C1200008D1300008D1300008D140000
+8F1200008F0F00018B06000F890006158C0011148D001D1291002A1193003A
+128D004D1685005E177E006F187900821A7600981A6F00B2186800DC136B06
+FF0F6704FE106402FE126201FE136100FD136000FD146000FD146000FD1460
+00FD148C1100008C1200008D1300008D1300008D1400008D1400008E150000
+8E1500008E16000090140000911100008F09000C890003188D000E168C001A
+16840024197C002F1D75003F206C00501F65006120610075225D008C235800
+A8225300D1215000F6204E00F5214D00F5224C00F6224B00F6234B00F6234B
+00F6234B00F6234B00F6238D1300008D1400008E1500008E1500008E160000
+8F1600008F1700008F1700008F1800009116000092140000920D000A8C0301
+187E000720750010246A001A286100242A59002E2C52003D2E4D0053304A00
+69314700813044009E2E3F00C92D3F04FE2A3F05FE293E06FE293D07FE293D
+07FE293D07FE293D07FE293D07FE293D07FE298E1500008E1600008F170000
+8F1700008F1800009018000090190000901900009019000092190000941700
+008E1400087F0E001769060028580005324D000F3744001A3C3C00263F3600
+3441300047432B005C432A00724127008C3E2500B43C2907F7332505F53722
+03F3392002F13B1F01F03C1D00F03D1D00F03D1D00F03D1D00F03D8F180000
+901800009019000090190000901A0000911A0000911B0000911B0000911C00
+00931B00008A1D0000811C0009731900165E130025470A0036310102472500
+0D4D1E001B5017002952100038530D004A510C00604F0B00784E0800AC5107
+00EB470500EA470300E9480300E8480201E7480202E7470202E7470202E747
+0202E747901A0000911A0000911B0000911B0000921C0000921D0000921D00
+00921E00008E1F0000852200007E2600017425000C66230018521F00243C18
+0035251000490A04005801040F5B0009205A000B3055000D435200105E5000
+137C4D0015A2460014DB410015DA400016DB3F0017DB3F0017DB3E0018DB3E
+0018DB3E0018DB3E0018DB3E921C0000921D0000921D0000921E0000931F00
+00931F0000932000008B230000822700007B2C0000732E0005682D0010592B
+001B46280023322400301D1D0042041301500016114F001A214C001D314A00
+20464A0024614700277C3F0029A1390027E3360028E4350029E4340029E434
+002AE433002AE433002AE433002AE433002AE433931F000093200000932000
+00932100009321000094220000882600007F2C000078300000713500006734
+000A5C3400144D33001A3C32001F292F00281729003A012103460026134200
+2B234000323440003649400037613B00397B3300399D2E0039E129003AEA29
+003AEA28003BE928003BE927003CE927003CE927003CE927003CE927942200
+0094220000942300009424000094240000872B00007E300000753500006D38
+0000653A00035C3A000C513C0012453D0015353D001A233A00231034003400
+31063D00381639004026360047383300494C31004A622F004B7B2D004C9C28
+004CD220004DE71F004DE81F004EE91F004EE91F004EEA1F004EEA1F004EEA
+1F004EEA1F94250000952600009527000093280000862F00007C360000723A
+00006A3C0000633D00005B3F0003534200074A45000A3F47000F2F4700161D
+4500210A40003000430934004C192F0053282C00583928005C4D23005E6323
+005E7B24005E9B22005FDA1B005FFF1B005FFF1B0060FF1B0060FF1A0060FF
+1A0060FF1A0060FF1A0060FF1A96290000972A0000932D0000853500007A3B
+00006F3D0000673F00005F4100005A420000534600004C4B0000444F000338
+50000B285100141750001E044D012B00560D29005E1B240063282300683820
+006D4E1C0070651B00717C1B00709B180070D4150070FF140070FF130070FF
+130071FF130071FF130071FF130071FF130071FF13982E000094320000853B
+0000773F00006C410000634200005C44000056450000514700004B4C000044
+5100003C57000130590009215B0012105B001C005C032400670F1F006F1B1B
+0073271A00773817007C4E140081661300827D1200839D120081D10E0080FF
+0C0080FF0B0080FF0B0080FF0B0081FF0B0081FF0B0081FF0B0081FF0B9537
+0000833F000075420000694400006046000059470000534900004E4B00004A
+4E0000435200003C590000345F0001286200081A65001009670019006D051B
+00770F1600801A13008527100087370E008B4B0B008E630B00927C0900969D
+0A0092CB08008FFF05008FFF050090FF040090FF040090FF040090FF040090
+FF040090FF048243000072460000664700005D490000564B0000504D00004B
+50000046520000425500003B5A0000346100002C670001216C00071370000E
+04740015007D061300880F0E0091190A009625070098340400994602009C5E
+0200A27B0100A7980000A3C001009EFF01009EFF01009EFF01009EFF01009E
+FF01009EFF01009EFF01009EFF0170490000644A00005A4C0000534F00004D
+51000048550000435700003E5A00003A5D0000336300002C6A000024710000
+197700050D7C000B01830010008E070B00990E0600A2180200A8230000AA31
+0000AB430000B25B0000B7790000BD930000BAB70000AEF70000AEF90000AE
+F90000AEF90000AEF90000AEF90000AEF90000AEF900614D00005850000051
+5300004B560000455A0000405D00003B61000036630000326600002C6C0000
+247400001D7C000013840003088B000700930109009C050600A80A0300B511
+0100BF1C0000C6290000CA3A0000D3520000D96C0000DD870000E0A50000DA
+F50000D1F80000D1F80000D1F80000D1F80000D1F80000D1F80000D1F80056
+5400004F580000485C0000426000003D64000038680000336B00002F6E0000
+2B700000257700001D80000017890000129100000D9A000007A2000201AC00
+0500BC030300CF070100E5120000F3200000FF2E0000FF480000FF630000FF
+740000FF8F0000FFAB0000FFB20000FFB20000FFB20000FFB20000FFB20000
+FFB20000FFB2004C5D000046620000406700003A6C00003570000030740000
+2B7600002777000023790000207E00001C850000188D0000139500000E9D00
+0009A6000003B0000400BD010300D0060100E5110000F21F0000FF2D0000FF
+440000FF600000FF720000FF8A0000FFA50000FFB20000FFB20000FFB20000
+FFB20000FFB20000FFB20000FFB200446800003D6C00003770000031730000
+2C75000027770000237900002379000023790000207E00001C850000188D00
+00139500000E9D000009A6000003AF000300BC010300CF050100E4100000F1
+1E0000FE2C0000FF410000FF5E0000FF6F0000FF860000FF9F0000FFB20000
+FFB20000FFB20000FFB20000FFB20000FFB20000FFB2003B6E000034710000
+2E750000287700002479000023790000237900002379000023790000217D00
+001C850000188D0000139500000E9D00000AA5000003AF000300BC010400CE
+050100E3100000F01E0000FD2B0000FF3D0000FF5C0000FF6E0000FF820000
+FF9D0000FFB20000FFB20000FFB20000FFB20000FFB20000FFB20000FFB200
+317300002B7600002578000023790000237900002379000023790000237900
+0023790000217D00001C850000188C0000139400000E9C00000AA5000003AF
+000300BB010400CC050100E20F0000F01D0000FC2A0000FF3A0000FF590000
+FF6C0000FF7E0000FF9A0000FFAC0000FFB20000FFB20000FFB20000FFB200
+00FFB20000FFB2002877000023790000237900002379000023790000237900
+00237900002379000023790000217D00001D850000188C0000139400000F9C
+00000AA5000004AE000300BB010400CB050100E10E0000EF1C0000FC290000
+FF370000FF560000FF6B0000FF7B0000FF920000FFA50000FFB20000FFB200
+00FFB20000FFB20000FFB20000FFB200>
+<72000000720000007300000073000000740000007501000075010000760100
+0076020000760100007600050078000C007900140079001C007A0026007E00
+3400820046008300590084006C0085008000850092008400A4008400BD0085
+00F1008300FF008300FF008300FF008300FF008300FF008300FF008300FF00
+8300FF008300FF007300000073000000740000007501000075010000760100
+00770200007702000078020000770100007700040179000B007A0013007A00
+1B007B0026007F003300830045008400590085006C0086007F008600910085
+00A4008500BD008600F0008400FF008400FF008400FF008400FF008400FF00
+8400FF008400FF008400FF008400FF00740000007401000075010000760100
+00770200007702000078020000780300007903000078020000780004017A00
+0B007B0012007B001B007C0025007F003200840044008500580086006B0087
+007F00870091008600A4008600BD008600EE008500FF008500FF008500FF00
+8500FF008500FF008500FF008500FF008500FF008500FF0075010000760100
+0077020000770200007803000079030000790300007A0300007A0400007A03
+0000790003027B000A007C0012007C001A017D002401800031008500430086
+00570087006B0088007F00880091008700A4008700BD008800ED008600FF00
+8600FF008600FF008600FF008600FF008600FF008600FF008600FF008600FF
+00770200007702000078030000790300007A0300007A0400007B0400007B04
+00007C0500007B040000790002037C0009017D0011017D0019017E00230181
+003000860042008700560088006A008A007E008A0091008800A4008800BD00
+8900EC008700FF008700FF008800FF008800FF008800FF008800FF008800FF
+008800FF008800FF0078030000790300007A0300007B0400007B0400007C05
+00007D0500007D0500007E0600007E0500007A0001047D0008037E0010027F
+0019027F00220282002F008800400089005500890069008B007E008B009000
+8A00A4008900BC008A00EB008900FF008900FF008900FF008900FF008900FF
+008900FF008900FF008900FF008900FF007A0400007B0400007C0400007D05
+00007D0500007E0600007F0600008007000080070000800600007C0101037D
+0007047F000F03800018038100220284002E0189003F008A0054008B006900
+8C007D008C0090008B00A3008A00BC008B00E9008A00FF008A00FF008A00FF
+008A00FF008A00FF008A00FF008A00FF008A00FF008A00FF007C0500007D05
+00007E0600007F060000800700008007000081070000820800008308000082
+0700007F0300037E00060680000E05810017048200210485002D038A003E01
+8C0052018C0067018E007C008E008F008D00A3008C00BB008D00E6008B00FF
+008B00FF008B00FF008B00FF008B00FF008B00FF008B00FF008B00FF008B00
+FF007E0600007F060000800700008107000082080000830800008409000084
+0900008509000084090000810500018000040882000C078300150684001F05
+86002C058B003C028D0050028E0066018F007A008F008E008E00A2008D00BA
+008E00E3008D00FF008D00FF008D00FF008D00FF008D00FF008D00FF008D00
+FF008D00FF008D00FF00810700008208000083080000840900008409000085
+0A0000850A0000860B0000860B0000870A0000840700018101030983000B09
+8400140885001E0787002A078C003A048F004E038F0064029100790091008D
+009000A1008B00B6008800DC008500FF008300FF008200FF008100FF008000
+FF007F00FF007F00FF007F00FF007F00FF008409000085090000850A000086
+0A0000860B0000870B0000870C0000880C0000880D0000890C000087090001
+8301010B8400090B8500120A87001D0A890028098E00380791004C058F0061
+068A0072088500840A8100980A7B00AE097700CC067905FF007705FF017605
+FF027505FF037405FF037305FF037305FF047305FF047305FF04860A000086
+0B0000870C0000880C0000880D0000890D0000890E0000890E00008A0E0000
+8A0E00008A0B00008603000B8500060E8700100D88001B0C8A00270B880034
+0D830045107C0057127500681471007A156D008E156800A6136400C8106300
+FE0E6000FE0E5F00FD0F5E00FD0F5D00FD105C00FC105C00FC105C00FC105C
+00FC10880C0000880D0000890E0000890E00008A0F00008A0F00008A100000
+8B1000008B1000008C1000008C0D0000890700088600041189000E0F830017
+127A00211573002B186C00381A6400481B5E005A1C5B006E1D5700841E5400
+9D1E4F00C01D4D00F21B4B00F21C4A00F21D4900F21D4800F11E4700F11E47
+00F11F4700F11F4700F11F8A0E00008A0F00008A1000008B1000008B110000
+8C1100008C1200008C1200008C1200008D1200008E1000008D0A0006830201
+147700071B6D000F1F620018225900212552002A274C00372947004C2B4400
+622B4100782B4000942A3C00B7293B01FA273902FB273803FB273803FC2837
+03FD283603FD283603FE283603FE283603FE288B1000008C1100008C120000
+8C1200008D1300008D1300008D1400008D1400008E1500008E150000901200
+0085120005760D0014610400235200062B48000E303E001835370023383100
+313B2B00423C2800563C25006B3B230082392100A3372100EA341F00EB351D
+00E9351C00E7361B00E6361A00E6361A00E6371A00E6371A00E6378D130000
+8D1300008D1400008E1500008E1500008E1600008F1600008F1700008F1700
+008B180000821A0000791A00066B17001357110021420900302E01033F2300
+0C461B0019481400264B0E00354C0A00464B09005A49080071480600974C05
+00D1420400DA400200D9400201D9400202D93F0203D83F0203D83F0203D83F
+0203D83F8E1500008E1600008F1700008F1700008F18000090180000901900
+0090190000881C00007F200000772300006D22000A5F2000154C1C00213816
+002F220E00410903005001040F5400081F52000B2F4E000D404A0010584700
+1373440015933F0014C93A0014D8390015D9380016D9380017D9370017D937
+0017D9370017D9370017D9378F1800009018000090190000901A0000911A00
+00911B0000911B0000851F00007C240000742800006C2A00036129000F5227
+00184125001F2E21002B1B1B003B031201490015104700192144001C304200
+1E424200215A4000247237002792330027CA310026E22F0027E32E0028E32E
+0028E42E0028E42D0028E52D0028E52D0028E52D911A0000911B0000911C00
+00921C0000921D00008F1E00008223000079280000712C00006A3000006130
+0009552F0012482F0017382E001B272B0024152500330120033F0024133B00
+292338002E33380032453700335A330035722D003690290038C2250037E923
+0038E8230038E7220039E6220039E6210039E5210039E5210039E521921D00
+00921E0000931F0000931F00008D22000080280000772D00006E3100006734
+0000603600025736000A4C38000F4039001131390016213600200E2F002E00
+2E063600351632003C252F0042352C0045482A00475C280047732700489125
+0049BB1C0049E51A004AE61A004AE619004BE719004BE719004BE719004BE7
+19004BE7199321000093210000942200008B2500007F2C0000753200006C36
+0000643800005D3A0001573C00014F3F0003474200053B43000B2B4200131A
+40001D083B002B003F0B2D00481929004E2726005236230057491E00595E1D
+005A741F005A901E005BBD17005BFB15005BFB15005CFB15005CFB15005CFB
+14005DFB14005DFB14005DFB1494240000942500008A2900007E3100007337
+0000693A0000603C00005A3E0000543F00004F41000048460000404B000034
+4C0007244C0011134A001B0248022700510E2400591A20005D271E0062361B
+00674A17006B6016006C7615006C9014006CBA10006CFB0E006CFB0E006CFA
+0D006CFA0D006DFA0D006DFA0D006DFA0D006DFA0D962800008A2F00007D37
+0000703C0000663E00005D40000056410000514300004C4500004748000040
+4D0000375200002C5400061D55000F0C54001A0057041F00610F1A00691B17
+006D2616007135130075490F007B600E007D770C007D900C007DB909007CFF
+06007DFF06007DFF06007DFF05007DFF05007DFF05007DFF05007DFF058B34
+00007C3D00006E3F0000634100005A430000534500004E470000494A000044
+4C00003F4F0000375400002F590000245C0006165E000E0660001700670716
+0071101200791B0E007F270B008135080084460500875D05008A7403008F91
+02008EB702008BFE01008BFF01008CFF01008CFF00008CFF00008CFF00008C
+FF00008CFF00794100006B4300006045000058470000514900004B4C000046
+4F0000405100003C540000375600002F5C0000276100001C6500050E69000D
+016D01120076080E00811109008A1B05008E26010090320000924300009359
+0000977100009D8F00009CB1000096EF000096FF000096FF000096FF000096
+FF000096FF000096FF000096FF00694600005E480000554B00004E4E000048
+510000425400003D57000038590000335C00002F5E0000276400001F6B0000
+147000050774000B007C030C00850808008E0F0500961703009C2001009E2D
+00009F3C0000A2520000A66C0000AD8A0000AEAC0000A5DD0000A3FD0000A3
+FD0000A3FD0000A3FD0000A3FD0000A3FD0000A3FD005B4C0000534F00004B
+520000455600003F5A0000395D0000346000002F6200002B65000027670000
+1F6E000018750001117B0004098000080086000B0090050800990A0500A410
+0200AD190000B3250000B5340000B8490000C0640000C5820000C89D0000C3
+D40000B9F60000BAF60000BAF60000BAF60000BAF60000BAF60000BAF60050
+53000049580000425C00003C60000036640000316700002C6A0000286D0000
+246F0000227100001E780000197F0000158600000E8E000207950006019C01
+0700A8040500B8080200C8100100D41C0000E32A0000FC3B0000F9570000F9
+6F0000FB890000FEAD0000F7CE0000F8CC0000F9CA0000FAC80000FAC80000
+FAC80000FAC800475D00004063000039680000336C00002E70000029730000
+247600002377000023780000237900001F8100001A88000016900000119800
+000CA0000007A9000101B5000400C3020200D90A0100EB170000F9260000FF
+330000FF540000FF6B0000FF7F0000FF9D0000FFB20000FFB20000FFB20000
+FFB20000FFB20000FFB20000FFB2003E6B000037700000307300002B760000
+2578000023790000237900002379000023790000237900001F8000001B8800
+0016900000119800000CA0000007A9000101B4000400C2020200D8090100EA
+160000F8250000FF320000FF510000FF690000FF7B0000FF9A0000FFB20000
+FFB20000FFB20000FFB20000FFB20000FFB20000FFB200347200002D750000
+27770000237900002379000023790000237900002379000023790000237900
+001F8000001B880000168F0000119700000CA0000007A9000101B4000400C1
+020200D7090100E9150000F7240000FF310000FF4F0000FF670000FF780000
+FF930000FFAC0000FFB20000FFB20000FFB20000FFB20000FFB20000FFB200
+2A760000247900002379000023790000237900002379000023790000237900
+0023790000237900001F8000001B870000168F0000119700000D9F000007A8
+000101B3000400C1020300D5080100E8140000F5230000FF300000FF4C0000
+FF640000FF740000FF8C0000FFA40000FFB20000FFB20000FFB20000FFB200
+00FFB20000FFB2002379000023790000237900002379000023790000237900
+00237900002379000023790000237900001F8000001B870000168F00001297
+00000D9F000008A8000101B2000400C0020300D4070100E7130000F4210000
+FF2F0000FF480000FF610000FF710000FF860000FF9F0000FFB20000FFB200
+00FFB20000FFB20000FFB20000FFB200>
+<6B0003006B0002006C0002006C0002006D0002006D0001006E0001006E0001
+006E0001006F0001007000050070000B007100130072001B00730024007400
+300078003F007B0051007C0063007D0075007E0087007D0099007C00AD007C
+00CD007C00FB007C00FB007C00FB007C00FB007C00FB007C00FC007C00FC00
+7C00FC007C00FC006C0002006C0002006D0002006D0001006E0001006E0001
+006F0001006F00010070000100700001007100040071000B00720012007300
+1A007400230076002F0079003E007C0051007D0063007E0075007F0088007E
+0099007E00AD007D00CD007E00FD007E00FD007E00FD007E00FE007E00FE00
+7E00FE007E00FE007E00FE007E00FE006D0002006D0001006E0001006E0001
+006F0001006F00010070000100700001007100010071000000720004007200
+0A0073001100740019007500230077002E007B003D007D0050007E00620080
+00750081008800800099007F00AD007F00CD007F00FF007F00FF007F00FF00
+7F00FF007F00FF007F00FF007F00FF007F00FF007F00FF006E0001006E0001
+006F0001007000010070000100710001007100000072000000720000007200
+0000730003007400090075001100760019007700220078002D007C003C007F
+0050007F0062008100750082008800810099008000AD008000CE008000FF00
+8000FF008000FF008000FF008000FF008000FF008000FF008000FF008000FF
+006F0001007000010070000100710001007200000072000000730000007300
+00007300000074000000740002007500090076001000770018007800210079
+002C007E003B0080004F00810061008200740083008800820099008100AD00
+8100CE008100FF008100FF008100FF008100FF008100FF008100FF008100FF
+008200FF008200FF0071000100710000007200000072000000730000007400
+000074000000750100007501000076010000750001017600080077000F0078
+001700790020007B002B007F003A0082004E00820061008400740085008700
+840099008300AD008300CE008300FF008300FF008300FF008300FF008300FF
+008300FF008300FF008300FF008300FF007200000073000000730000007400
+00007501000075010000760100007702000077020000780200007601010178
+00070079000E007A0016007B001F007C002A008000390083004D0084006000
+8500730086008700850099008400AD008500CE008400FF008400FF008400FF
+008400FF008400FF008400FF008400FF008400FF008400FF00740000007501
+0000750100007602000077020000770200007803000079030000790300007A
+03000078010101790006017B000D007B0015007C001E007E00290082003800
+85004B0085005F008700730088008700870099008600AD008600CE008600FF
+008600FF008600FF008600FF008600FF008600FF008600FF008600FF008600
+FF0076010000770200007702000078030000790300007A0300007A0400007B
+0400007B0400007C0500007A0200007A0004027C000C017D0014017E001D01
+7F0028018300370087004A0087005E00890072008A008600890098008800AD
+008800CD008700FF008700FF008700FF008500FF008400FF008400FF008300
+FF008300FF008300FF0078030000790300007A0300007B0400007B0400007C
+0500007D0500007E0500007E0600007F0600007D0400007B0003047E000A03
+7F0013027F001C0281002602850035008900480089005D008B0071008C0085
+00870095008200A8007F00C4007C00FE007A00FF007800FF007700FF007700
+FF007600FF007600FF007600FF007600FF007B0400007B0400007C0500007D
+0500007E0600007F0600008007000081070000810700008208000080060000
+7D0001067F0009058000110481001B0382002503860033018B004601850058
+02800069057C007B0677008D067300A1056F00B9046F01EC026F02FF016E02
+FF016D02FF026C02FF026C02FF026B02FF026B02FF026B02FF027E0500007F
+06000080070000810700008108000082080000830800008409000084090000
+850A0000840800007F020006810007078200100683001906830023067D002E
+0878003D0B72004E0D6D00600F690072116500861162009B105E00B80D5E00
+EE0A5E02FC095C02FB0A5A01FA0B5900F90C5800F90C5700F80D5700F80D57
+00F80D8107000082080000830800008409000085090000850A0000860A0000
+860B0000860B0000870B0000860A0000830500048200050A83000E097A0015
+0D71001E1069002713620032165C004017570052185400671A52007C1A4F00
+931A4C00B1194A00E0174800ED174600ED184500ED194400ED194400ED1A43
+00ED1A4300ED1A4300ED1A84090000850A0000860A0000860B0000870B0000
+870C0000880C0000880D0000890D0000890E00008A0C0000870800027B0201
+0F6F00071665000E1A5B00161D51001F214A00272344003325410045273E00
+5B273C0070273A0089253800A8243600DB233500F4243400F6243300F62532
+00F7253100F7253100F7263100F7263100F726870B0000870C0000880D0000
+890D0000890E00008A0E00008A0F00008A0F00008A1000008B100000880F00
+007D1000016F0B00105A03001F4D00062542000E2A3900162F310021322B00
+2E3427003D3523005035210064341F007A331D0095311D00C42F1D00E12E1B
+00DF2E1A00DD2F1900DD2F1800DD2F1700DC2F1700DC2F1700DC2F890E0000
+8A0E00008A0F00008A1000008B1000008B1100008C1100008C1200008C1200
+00851500007B1700007118000363150010510F001D3D07002B2B0103382000
+0C3E19001841120024440C003245080041450600544205016B410401874202
+00B4400300D1380201D2380202D2370203D2370203D3370204D3360204D336
+0204D3368B1000008B1100008C1100008C1200008D1300008D1300008D1400
+008C14000081180000781C0000701F0000661F0007581D00124719001D3413
+0029200D00390803004901040E4C00081E49000B2D45000D3E420010523E00
+126B3B001587370015B3340014D5320015D5310016D5310016D5300017D530
+0017D6300017D6300017D6308D1300008D1400008D1400008E1500008E1500
+008E1600008A1800007E1C0000752100006D240000662700015A26000B4D24
+00143D22001B2B1D00261918003303110141001410400018203C001B2F3A00
+1D3F39001F533600226A2F0025872C0028B52C0025E12A0025E2290026E329
+0026E4280027E4280027E5280027E5280027E5288E1600008F1700008F1700
+008F18000090180000871B00007B200000722500006A290000632C00005B2C
+0006502C000F432C0012342A0018242800201323002D011E04380022133400
+272231002B312F002E412D0030542900326A27003386250036AF220033EC1F
+0034EB1E0035EA1E0036E91D0036E81D0036E81D0036E81D0036E81D901900
+0090190000911A0000911B0000861F00007A250000702A0000672D00006030
+00015A310002523300064834000A3C35000D2E3500121E32001C0D2C002900
+2B072F0032162B00382428003D3325004044230043572100446C2000458720
+0047AB190046E4150047E5150048E5140048E5140048E5140049E6140049E6
+140049E614921C0000921D0000921D000084230000782900006E2E00006532
+00005D34000156360001513800004B3B0000433E0000373F0007283E000F18
+3B001A06360026003C0B270044192300492520004D331D0052451A00555918
+00566E180056871A0058AC130057F40F0058F50F0058F50F0059F50E0059F5
+0E0059F50E0059F50E0059F50E932000009320000083270000762E00006B33
+0000623600015A380001533B00004E3C0000493E0000434100003B45000030
+4800032147000D1145001801430222004D0E1E00541A1A00572519005C3316
+0061451200655A100068700F0068880E0068AA0B0067EA080068F0080068EF
+070068EE070068ED070069EC070069EC070069EC0792240000822C00007534
+0000693800005F3A0001573D0000503F00004B41000046430000414500003B
+480000324C0000284F0003194F000C094F00170052061A005C101500631A11
+00672510006B330D006F440A00735A0800767005007888040079A9030078DF
+010079FC010079FD010079FD010079FD01007AFE01007AFE01007AFE018133
+000073390000673C00005C3E0000544100004E43000048450000434800003D
+4A0000384C0000324F000029540000205700031258000C035A011400610811
+006B110C00731C0800792704007B3302007D4201007E560100826C00008686
+000087A8000085E4000084FF000084FF000084FF000084FF000084FF000084
+FF000084FF00703E0000644000005A420000524500004B480000454B00003F
+4D00003A50000034520000305300002A570000225B0000175F00040A62000B
+0067030E006F0A0A00781107007F1A040085230200872E0100883D00008950
+00008C6700009182000093A200008FD300008EFF00008EFF00008EFF00008E
+FF00008EFF00008EFF00008EFF00614400005846000050490000484D000042
+5000003C53000036550000305800002C5A0000285B0000225F00001A640000
+12690004086C000A0070010E0078070B00810D07008A150400901E02009329
+000095370000964A0000996100009E7E0000A39E00009DC6000099FF000099
+FF00009AFF00009AFF00009AFF00009AFF00009AFF00544B00004D4E000046
+5200003F55000038590000325C00002D5E0000286100002463000021640000
+1F6700001A6D0000147200020C760007037B000C0083040B008C0907009610
+04009E180200A4220000A6300000A7420000AC590000B1770000B8940000B4
+C00000AAFA0000AAFA0000AAFA0000AAFA0000AAFA0000AAFA0000AAFA004A
+530000435700003C5C0000355F00002F6300002966000025680000216A0000
+216B0000226C0000206F00001C750000177C00001082000308890007019000
+090099040700A5090400B1100100BC190000C4260000C8370000CF4F0000D7
+6A0000DB870000DFA90000CFF60000CFF60000CFF70000CFF70000D0F70000
+D0F70000D0F700405E000039630000326700002C6B0000266E000022710000
+22720000237300002374000023740000217800001D80000018880000149000
+000F9900000AA2000004AD000300BA010400CB050100E20F0000F01D0000FE
+2C0000FF420000FF600000FF730000FF910000FFB00000FFB20000FFB20000
+FFB20000FFB20000FFB20000FFB200366B0000307000002974000024770000
+237900002379000023790000237900002379000023790000227B00001D8300
+00198B0000149300000F9B00000BA3000004AD000300B9010400CA040200E1
+0E0000EF1C0000FD2B0000FF3E0000FF5E0000FF700000FF8A0000FFA90000
+FFB20000FFB20000FFB20000FFB20000FFB20000FFB2002D75000026780000
+23790000237900002379000023790000237900002379000023790000237900
+00227B00001E830000198A0000149200000F9A00000BA3000004AC000300B9
+000400C9040200E00D0000EE1B0000FC290000FF3A0000FF5B0000FF6E0000
+FF850000FFA10000FFB20000FFB20000FFB20000FFB20000FFB20000FFB200
+23790000237900002379000023790000237900002379000023790000237900
+002379000023790000227B00001E830000198A000015920000109A00000BA3
+000005AC000300B8000400C8040200DF0C0000ED1A0000FB280000FF370000
+FF580000FF6C0000FF810000FF9D0000FFB20000FFB20000FFB20000FFB200
+00FFB20000FFB2002379000023790000237900002379000023790000237900
+0023790000237900002379000023790000227B00001E830000198A00001592
+0000109A00000BA2000005AB000201B7000400C7030200DE0B0000ED190000
+FA270000FF340000FF550000FF6B0000FF7D0000FF9A0000FFB00000FFB200
+00FFB20000FFB20000FFB20000FFB200>
+<63000600630006006400060065000500650005006600050067000400670004
+0068000400680004006800040068000B0068001200690019006A0022006A00
+2C006C0039007100480074005A0076006A0077007C0077008E007600A00074
+00B8007300E7007300E8007300E8007300E8007400E8007400E8007400E800
+7400E8007400E8006400050064000500650005006600050067000400680004
+00680004006900040069000400690003006A00040069000A00690011006A00
+18006B0021006C002C006E003800720048007500590076006A0078007C0078
+008E007700A0007500B8007500EC007500EC007500EC007500EC007500EC00
+7500ED007500ED007500ED007500ED00660005006600050067000400680004
+006800040069000400690003006A0003006A0003006A0003006B0003006A00
+0A006B0011006C0018006D0020006E002B006F003800730048007600590077
+006A007A007D007A008E007800A0007700B8007600EF007600F1007600F100
+7600F1007600F1007600F2007600F2007600F2007600F20068000400680004
+0069000400690003006A0003006A0003006A0003006B0003006B0002006C00
+02006C0003006C0009006D0010006E0017006F00200070002A007100370075
+00470077005900790069007B007D007B008F007900A0007800B8007800F100
+7800F5007800F5007800F5007800F5007800F5007800F5007800F5007800F5
+0069000300690003006A0003006A0003006B0003006B0002006C0002006C00
+02006C0002006D0002006D0002006E0008006F000F007000170071001F0072
+0029007300360077004700790059007A0069007D007D007D008F007B00A000
+7A00B9007A00F3007A00F8007A00F8007A00F8007A00F8007A00F8007A00F8
+007A00F8007A00F8006A0003006B0003006B0002006C0002006C0002006D00
+02006D0001006D0001006E0001006E0001006F0001006F00070070000E0071
+00160072001E007300280075003500790046007B0058007C0069007E007D00
+7E008F007C00A1007C00B9007C00EF007C00FB007C00FB007C00FB007C00FB
+007C00FB007C00FB007C00FB007C00FB006C0002006C0002006D0002006D00
+01006E0001006E0001006F0001006F0001006F000100700001007000010071
+00060072000D007300150074001D0075002700770034007B0045007C005800
+7E006A007F007D0080008F007E00A1007E00BA007E00F5007E00FE007E00FE
+007E00FE007E00FE007E00FE007E00FE007E00FE007E00FE006D0001006D00
+01006E0001006F0001006F0001007000010070000100710001007100000072
+000000720000007300050073000C007400140076001C007700260079003300
+7E0044007E0057007F00690081007C0081008F008000A1008000BA008100F5
+008000FF008000FF008000FF008000FF008000FF008000FF008000FF008000
+FF006F0001006F000100700001007100010071000000720000007200000073
+0000007300000074000000740000007400040075000B007600130077001B00
+780025007B00310080004200800056008100690083007C0083008F008200A1
+008200BA008100F0007E00FF007C00FE007B00FD007A00FD007A00FD007900
+FC007900FC007900FC00710001007100000072000000730000007300000074
+00000074010000750100007601000076020000760200007600030177000A00
+7800110079001A007A0023007C00300081004100820055008300680082007A
+007D008B0078009B007500B2007300D6007300FC007100FC007100FD007000
+FD007000FF006F00FF006F00FF006F00FF0073000000730000007401000075
+01000076010000760200007702000078020000780300007903000079030000
+77000202790009007A0010007B0018007C0022007E002E0080003E007B004E
+0076006002720071046F0083046B0096036700AC026600CD016901FF006801
+FF006701FF006702FF006602FF006602FF006502FF006502FF007601000076
+020000770200007802000078030000790300007A0300007A0400007B040000
+7C0400007C0500007A0101017B0007027C000F017D0017017900200273002A
+046C0037076700450A6300570C6100690E5E007E0E5B00920D5800AB0A5800
+D5085A02FB055801FA075600F9085500F8095400F7095300F7095300F60A53
+00F60A79030000790300007A0400007B0400007C0400007C0500007D050000
+7E0600007F0600007F060000800700007D0300017C0005047A000C05710013
+0968001C0C6000241059002E1253003A1450004B164D005F164B0074174900
+8A164800A5154600CB144500E9134300E8144200E8144100E7154000E71540
+00E7163F00E7163F00E7167C0500007C0500007D0500007E0600007F060000
+8007000081070000820800008208000083080000840900007F060000730201
+0B670006115D000D155300151949001D1D420025213D0030233A0040233800
+54233600692234007F2133009A203200C11F3200EA1E3000E91F2F00E91F2E
+00E9202D00E8202D00E7202C00E7202C00E720800700008007000081070000
+82080000830900008409000085090000850A0000860A0000860B00007F0D00
+00750E0000670A000C5302001A470006203D000D243300152A2C001F2D2700
+2B2F2200392F1F004A2F1D005D2E1B00722E1A008A2C1900AE2A1B00D82719
+00D6281700D6281600D5291600D5291500D5291500D5291500D52984090000
+84090000850A0000860A0000860B0000870B0000870C0000880C0000870D00
+007C110000741400006A1600015C13000C4B0D001938060026280103311E00
+0B371600163A1000223C0A002F3E05003C3E03014F3C0302643902037D3801
+029E370201CF300202CF300203CF2F0104CF2F0104CF2F0104CF2F0105CF2F
+0105CF2F870C0000870C0000880C0000880D0000890E00008A0E00008A0F00
+00841100007915000070190000691C00005F1D0003521B000E421600183011
+00241E0B00320703004100040D4300081C40000B2B3C000D3B39000F4E3500
+12633100157C2E0016A12E0013CF2B0014CF2B0015CF2B0016CF2A0016CF2A
+0017CF2A0017CF2A0017CF2A8A0E00008A0F00008A0F00008B1000008B1000
+008B11000082140000771900006D1D0000662100005F230000552300074721
+000F391E0017291A00211716002C020F013A0013103800171F34001A2D3100
+1C3C2F001E4E2B0020622600237C260026A2270023DB250024DC240024DD24
+0025DD230025DE230025DE230025DE230025DE238C1100008C1200008C1200
+008D1300008D13000080180000741D00006B220000632500005C2800005629
+00014B2900093F28000E312700142224001C12200027011C04310020132D00
+25212A00282F27002B3E24002D5021002F641F00317D1F00349E1E0032DF1B
+0032E51A0033E4190033E3190034E2190034E1180034E1180034E1188E1500
+008E1500008E1600008D1700007E1C0000722200006826000060290000582C
+0001522E00024D30000044310004393100092B31000F1C2E00180C28002300
+280728002F1625003523220039311F003C401C003F531A0041661A00427E1A
+00439E160044D3100044E2100045E20F0045E30F0046E30F0046E30F0046E4
+0E0046E40E90180000901800008C1A00007C20000070260000662B00005D2E
+0001563000024F3200004A340000453600003E390000343B0002253A000B15
+3700160532002100390C210040181D0044241A00493117004D411400505412
+0052691200537F1300549F0F0055D6090055F0090055F0080055F1080056F1
+080056F1080056F1080056F108901C00008A1E00007B2500006E2B0000642F
+00005A320002533500004D37000048390000423B00003E3C0000354000002C
+4300011E42000A0E400014003F031D00480E18004E19140052241200573010
+005B410D005F550A00636B080065820600669F050064C8020064EC020064EB
+020064EB010064EA010065EA010065EA010065EA017D2800007A2A00006D30
+00006134000058370001503900004A3C0000443E00003F4000003941000034
+4300002C470000234A0001164A000906490014004E07150056100F005D1A0B
+006224090066310600684006006B5404006E69010071800000729C000070C2
+00006FF200006FF3000070F3000070F3000070F3000070F3000070F3006E34
+00006B3500005F380001563B00004E3E000048400000414300003B45000035
+470000304900002C4A0000244E00001B5100010E53000902550210005C090C
+00631108006A1A06006E230400702E0400723C0300744E0300776401007B7C
+00007D9800007BC100007BFF00007BFF00007BFF00007BFF00007BFF00007B
+FF00007BFF00603C00005D3D0000534000004C430000454600003E49000037
+4B0000314D00002C4F000028500000245200001D560000145900010A5B0008
+005D010F0064070C006B0E090073170600792004007C2B02007E3701007F48
+0000815F0100857700008994000088BF000085FF000085FF000086FF000086
+FF000086FF000086FF000086FF0054430000514400004A480000424B00003B
+4E0000345100002E5300002955000024570000205800001F5900001B5D0000
+166100010D6400070266000E006C050D00740B09007D130600851C03008926
+01008A3200008C4300008D580000917100009790000096B5000091FF000091
+FF000091FF000091FF000091FF000091FF000091FF00494C0000474D00003F
+50000038540000315700002B590000255C0000215E0000205F000020600000
+206000001C640000176900000F6D00050671000B0077020D007F080900890F
+06009116030097200100992C00009B3B00009D510000A16B0000A88B0000A8
+AF00009FEF00009FFF00009FFF00009FFF00009FFF00009FFF00009FFF003E
+5500003C570000355A00002D5E000027610000226300002165000021660000
+2166000021670000216800001E6C000019720000127800030A7D0007028300
+0B008C04090095090600A00F0300A9180100AF230000B2320000B4470000BC
+620000C2820000C5A00000BCDC0000B6F70000B6F70000B6F70000B6F70000
+B7F70000B7F70034600000326200002B66000025690000216B0000226C0000
+226D0000226E0000226F000022700000227100001F7600001B7D0000168500
+00118D000109940004029A000700A6030600B5070300C60D0100D5190000E3
+270000F8370000FD550000FE6E0000FF880000FFAE0000FFBD0000FFBD0000
+FFBC0000FFBC0000FFBC0000FFBC002A6D0000286E00002272000023730000
+23740000237600002377000023780000237900002379000023790000207E00
+001C860000178E0000129600000D9E000009A7000002B1000400BF020300D4
+070100E8140000F6230000FF310000FF510000FF6A0000FF7F0000FF9E0000
+FFB20000FFB20000FFB20000FFB20000FFB20000FFB2002379000023790000
+23790000237900002379000023790000237900002379000023790000237900
+0023790000207E00001C860000178D0000139500000E9E000009A6000002B1
+000400BE020300D2070100E7130000F5220000FF300000FF4E0000FF680000
+FF7B0000FF9B0000FFB20000FFB20000FFB20000FFB20000FFB20000FFB200
+23790000237900002379000023790000237900002379000023790000237900
+00237900002379000023790000207E00001C850000178D0000139500000E9D
+000009A6000002B0000400BE010300D1060100E6120000F3210000FF2E0000
+FF4A0000FF640000FF760000FF940000FFB00000FFB20000FFB20000FFB200
+00FFB20000FFB2002379000023790000237900002379000023790000237900
+002379000023790000237900002379000023790000207E00001C850000188D
+0000139500000E9D000009A6000003B0000400BD010300D0060100E5110000
+F21F0000FF2D0000FF450000FF610000FF720000FF8C0000FFA70000FFB200
+00FFB20000FFB20000FFB20000FFB200>
+<59000900590009005A0009005B0009005B0008005C0008005D0008005D0008
+005E0008005E0007005F0007005F000A005F0011005F001800600020006100
+2A0062003500650041006B0050006F0060007000700071008200700094006E
+00AA006C00CA006D00DE006D00DE006D00DE006D00DE006D00DE006D00DE00
+6D00DE006D00DE005B0009005B0009005B0008005C0008005D0008005E0008
+005E0008005F0007005F000700600007006000070060000A00600011006100
+1800610020006200290063003400670041006D005000700060007100700072
+008200710094006F00AA006D00CA006E00DE006E00DE006E00DE006E00DE00
+6E00DE006E00DE006E00DE006E00DE005D0008005D0008005D0008005E0008
+005F0007005F00070060000700610007006100070062000600620006006200
+0900620010006200170063001F006400280065003300680040006E00500071
+0060007200700073008200720094007000AA006F00CA006F00DE006F00DE00
+6F00DE006F00DE006F00DE006F00DE006F00DE006F00DE005F0007005F0007
+005F0007006000070060000700610006006200060062000600630006006400
+0600640005006400080064000F006400160065001E0066002700670032006A
+0040006F004F00720060007300710074008200730094007200AA007000C900
+7000DD007000DD007000DD007000DD007000DD007000DD007000DD007000DD
+00600007006000070061000700620006006200060063000600640005006400
+05006500050066000500660005006500080065000E006600150067001D0068
+002600690032006C003F0070004F0073006000740071007500820075009500
+7300AA007200C9007100E1007100E1007100E1007100E2007100E2007200E2
+007200E2007200E20063000600630006006300060064000500650005006500
+050066000500670004006700040068000400680004006700070067000D0068
+00140069001C006A0025006B0031006E003E0072004F007500600076007100
+76008300760095007500AA007400C9007300E7007300E7007300E7007300E7
+007300E8007300E8007300E8007300E8006500050065000500650005006600
+05006700040068000400680004006900040069000300690003006A0003006A
+0006006A000C006A0014006B001B006C0024006D00300070003D0074004E00
+760060007700710078008300770095007600AA007600CA007500EE007500EE
+007500EE007500EE007500EE007500EE007600EE007600EE00670004006700
+0400680004006900040069000300690003006A0003006A0003006B0003006B
+0002006B0002006C0005006C000B006D0013006E001A006F0023006F002F00
+72003C0076004E0078006000790071007A008400790095007800AA007800CA
+007800F4007800F5007800F5007800F5007800F5007800F5007800F5007800
+F50069000300690003006A0003006A0003006B0003006B0002006C0002006C
+0002006C0002006D0002006D0001006E0004006E000A006F00120070001900
+7100220072002D0075003B0078004D007A005F007B0071007C0084007B0096
+007800A9007600C9007300EE007200EC007100EB007000EB007000EA006F00
+E9006F00EA006F00EB006B0002006B0002006B0002006C0002006C0002006D
+0001006D0001006E0001006E0001006F0001006F0001007000030070000900
+71001000720018007300210074002C0077003A007B004D007A005E0077006E
+0073007F00700091006C00A5006A00C1006B00F5006B00FC006A00FF006900
+FF006900FF006800FF006800FF006800FF006D0001006D0001006D0001006E
+0001006F0001006F0001007000010070000100710001007100010071000000
+720002007300080073000F00740017007500200077002B00720037006E0045
+006B005600690067026600790363008C026000A2005F00C2006300FF006200
+FF006100FF006000FF005F01FF005F01FF005E01FF005E01FF006F0001006F
+00010070000100700001007100010072000000720000007300000073000000
+7400000074000000740001007500070076000E007700160070001D00680026
+01610032045C003E075A004E095800600A5600740C5500880A53009F075200
+C2055501FC045300FA045100F8055000F7064F00F5064F00F4064E00F4074E
+00F30772000000720000007200000073000000740000007401000075010000
+75010000760100007702000077020000760100007700050171000B02680012
+055F001A095600220D50002A114B003513480044134700571345006B144400
+8013430099114200B9104200E50E4000E40F3F00E3103E00E3103D00E2113C
+00E2113C00E1113B00E1117501000075010000750100007601000077020000
+770200007803000079030000790300007A0400007A040000760400006A0201
+075F00060D55000C114B00141641001B1B3A00232035002E2133003C203100
+4E1F3000611E2F00761E2E008E1D2D00AE1B2E00DD192D00DC192B00DC1A2A
+00DB1A2900DA1A2900DA1B2800DA1B2800D91B780300007803000079030000
+790300007A0400007B0400007C0400007C0500007D0500007E060000760900
+006D0C0000600900074D0200154200061B37000C202E00132627001D292200
+282A1E00362A1B0045291900572917006A291600802816009E251800CE2117
+00CE221500CE221400CE231300CD231300CD231200CD231200CD237C050000
+7C0500007C0500007D0500007E0600007F06000080070000810700007D0900
+00730D00006B1100006313000056110008460C0014340400212501032B1B00
+0A30140015330D00203508002C360300393701014A3501035E320105742F00
+04912E0101C22A0102CA290103CA290104C9290105C9290105C9280105C928
+0006C928800700008007000081070000820800008308000084090000850900
+007B0D0000701100006815000060180000591A00004C1800093E1400142D0F
+001F1C0A002B0602003900040D3B00081B37000B2933000D3830000F492C00
+115D2900157226001691270013BE260014C8250014C8250015C9250015C925
+0016C9240016C9240016C924850A0000850A0000850A0000860B0000870B00
+00870C0000791100006E160000651A00005D1D0000561F00004F200002431F
+000B351C00132618001C16140026020E013200120F3000161E2C00192B2800
+1B3A26001C4A22001E5D1F0021731F002492200023C2210022D3200023D41F
+0023D41F0024D51F0024D51E0024D51E0024D51E880D0000880D0000890D00
+00890E000085100000771500006C1A0000621E00005A210000532400004D25
+0001462600033A2500092E24001020220017101D0021011A042A001F122600
+24202300262D1F00293B1C002B4C1A002D5F19002F7519003191190031BC17
+0030D7160031D6150031D6150032D5140032D5140032D5140032D5148B1000
+008B1000008B10000084130000751900006A1F000060230000582600005028
+00014A2A0000452B00003F2D0000352E0004282D000B1A2B00130B25001D00
+260722002D151F0032221B00362E1800393D15003C4E13003E6113003F7613
+004192110042BB0C0041DB0B0042DC0A0043DC0A0043DD090043DD090044DD
+090044DE098D1400008D14000082170000731E0000672300005E270000552A
+00014E2C0001482E0000423000003D310000373300002F3700002236000713
+330011042E001B00360B1A003C17160040221300452E1000493D0E004C500C
+004E640A00507A09005295070053BF030051EC030052EC020052EC020052EC
+020052EC010053EC010053EC017A1E00007A1E000072220000662800005B2B
+0001522E00024B310000453300003F3500003A360000353800002F3A000026
+3D00001A3E00060C3C0010003B031700440E120049180D004D220A00522E08
+00573D0600594F05005C6502005F7C0000609501005EB800005CED00005CED
+00005CED00005CED00005CED00005CED00005CED006B2A00006B2A0000642D
+0000593000025033000049360000433800003C3A0000363C0000303E00002C
+3F0000274100001E44000013450005044400100049070F0051100900551806
+00582106005B2C06005E3A0600614C060064610300677801006991010067B1
+000065E8000065E8000065E8000065E8000065E8000065E8000065E8005E33
+00015E330001573500014E380000473B0000403D0000393F0000324100002D
+44000028450000244700001F490000174C00000D4D0005014C000F0051060D
+00580E0A005E160700621F0600652A0600683705006A4705006D5D03007073
+0000728C000072AE000070F3000070F3000070F3000070F3000070F3000070
+F4000070F400523B0000523B00004D3D0000454000003D430000354500002F
+48000029490000244B0000204D00001C4E00001B4F0000175200000F540004
+0455000D0059050E00600C0B00671407006D1D050071270400733303007542
+0300775702007A6E00007E8800007EAA00007CF100007CFF00007CFF00007C
+FF00007DFF00007DFF00007DFF004743000047430000434600003A49000032
+4B00002C4E000026500000215200001D5300001D5400001E5400001D550000
+18590000115C0004075E000B0061030E0068090B0071110800791905007E23
+0300802F0100823D000083500100856700008A8300008CA5000089E7000088
+FF000088FF000088FF000088FF000088FF000089FF003C4D00003C4D000037
+4F00002F51000029540000235600001E5800001F5900001F5A00001F5B0000
+1F5B00001E5C00001A610000136500020A680009016B010E0072060B007B0D
+0800841505008B1E02008E2901008F3600009149000093610000997D00009D
+A0000097D0000095FF000095FF000095FF000095FF000095FF000095FF0031
+560000315600002D580000265B0000205E0000205F00002060000020610000
+206100002062000020630000206400001B690000166F00010D730006047700
+0B007F030B0088080800910F05009A1702009F210000A22E0000A3400000A7
+580000AD770000B3960000ACC40000A6FB0000A6FB0000A6FB0000A6FB0000
+A7FB0000A7FB00276100002761000023630000216500002166000021670000
+2168000021690000216A0000216B0000226B0000216D00001D730000187A00
+00128000020A870006038E00090096030800A1080400AE0E0200BA170000C2
+240000C7340000CD4C0000D6690000DB880000DEAD0000CDF60000CEF60000
+CEF60000CFF60000CFF70000CFF700226C0000226C0000226D0000226E0000
+226F0000227100002272000023730000237400002375000023760000237700
+001E7F00001A87000015900000109900000CA1000006AB000201B7000400C6
+030200DF0C0000EE1B0000FC290000FF3D0000FF5F0000FF730000FF940000
+FFB20000FFB20000FFB20000FFB20000FFB20000FFB2002377000023770000
+23770000237900002379000023790000237900002379000023790000237900
+0023790000237900001F8100001A88000016900000119800000CA1000006AA
+000201B6000400C5030200DD0B0000ED190000FB280000FF390000FF5C0000
+FF700000FF8C0000FFAE0000FFB20000FFB20000FFB20000FFB20000FFB200
+23790000237900002379000023790000237900002379000023790000237900
+00237900002379000023790000237900001F8100001A880000169000001198
+00000CA1000006AA000201B5000400C4030200DB0A0000EC180000FA270000
+FF350000FF580000FF6D0000FF860000FFA50000FFB20000FFB20000FFB200
+00FFB20000FFB2002379000023790000237900002379000023790000237900
+002379000023790000237900002379000023790000237900001F8000001A88
+000016900000119800000CA0000007A9000101B5000400C3020200DA0A0100
+EB170000F9260000FF330000FF550000FF6B0000FF810000FF9F0000FFB200
+00FFB20000FFB20000FFB20000FFB200>
+<50000C0050000C0050000C0051000C0051000C0052000C0053000B0053000B
+0054000B0054000B0055000B0055000B005400110054001800540020005600
+2800580031005C003B0061004800670056006A0066006B0077006A00890068
+009F006600BD006800F2006800F2006800F2006800F2006800F1006800F100
+6800F1006800F10052000C0052000C0052000C0052000C0053000B0054000B
+0054000B0055000B0056000A0056000A0057000A0057000A00560010005600
+170056001F0057002700590030005D003B0062004700680056006B0066006C
+0077006B00890069009F006700BC006900ED006900ED006900ED006900ED00
+6900ED006900ED006900ED006900EC0054000B0054000B0054000B0054000B
+0055000B0056000A0056000A0057000A0057000A0058000A00580009005900
+090058000F005800170058001E00590026005B0030005E003B006300470069
+0056006C0066006D0077006C0089006A009E006800BB006A00E8006A00E800
+6A00E8006A00E8006A00E8006A00E8006A00E8006A00E80055000A0055000A
+0055000A0056000A0057000A0058000A0058000A0059000900590009005A00
+09005A0009005B0009005A000F005A0016005B001D005C0025005D002F005F
+003A00650047006A0056006D0066006E0077006E008A006C009E006A00B900
+6A00E3006A00E3006B00E3006B00E3006B00E3006B00E3006B00E3006B00E3
+0058000A0058000A0058000A0058000A00590009005A0009005A0009005B00
+09005B0008005C0008005C0008005D0008005D000E005C0015005D001C005E
+0025005F002E0061003A00660047006C0056006F0066006F0077006F008A00
+6D009E006B00B8006B00DF006B00DF006B00DE006C00DE006C00DE006C00DE
+006C00DE006C00DE005A0009005A0009005A0009005A0009005B0009005C00
+08005C0008005D0008005E0008005E0008005F0007005F0007005F000D005F
+00140060001B006100240061002D0063003900680047006D00560070006700
+7000770071008A006F009E006D00B8006D00DE006D00DE006D00DE006D00DE
+006D00DE006D00DE006D00DE006D00DE005C0008005C0008005C0008005D00
+08005D0008005E0008005F0007005F00070060000700600007006100070061
+00060061000C006100130062001A006300220063002C00650038006A004600
+6F005600710067007200780072008A0071009D006F00B7006E00DE006E00DE
+006E00DE006E00DE006E00DE006E00DE006E00DE006E00DE005E0007005E00
+07005E0007005F000700600007006100070061000600620006006200060063
+000600640006006400050064000B0063001200640019006500210066002B00
+670037006C00460070005600730067007300780074008A0073009D007100B6
+007000DD007000DD007000DD006F00DB006E00DA006E00D9006D00D9006D00
+D9006100070061000700610007006200060063000600630006006400050065
+0005006500050066000500660005006700040066000A006600100067001800
+6800200068002A006A0036006E00450072005600740067007500780073008A
+006F009C006C00B6006C00F3006B00F6006A00F6006A00F9006900F9006900
+F9006800F9006800FB00640005006400050064000500650005006500050066
+00050067000400680004006800040069000400690004006900030068000900
+69000F006A0017006B001F006B0029006D003500710044006F0053006D0063
+006B0074006700860064009A006100B6006500FF006300FF006200FF006100
+FF006100FF006000FF006000FF006000FF0067000400670004006700040068
+0004006800040069000400690003006A0003006A0003006B0003006B000300
+6B0002006B0007006C000E006D0015006E001E006C0027006500320060003E
+0060004C005F005D015E006F025C008201590097005700B5005C00FF005A00
+FF005900FF005800FF005700FF005700FF005700FF005600FF006A0003006A
+0003006A0003006A0003006B0003006B0002006C0002006C0002006C000200
+6D0002006D0001006D0001006E0006006F000D006C00140065001B005E0024
+0058002E035300380551004506500057074F006A094E007F084D0094054C00
+B0034E00EB024D00F6024C00F3024B00F1034A00EF034900EE044800ED0448
+00EC046C0002006C0002006C0002006C0002006D0002006D0001006E000100
+6E0001006F0001006F00010070000100700001006F00040067000A015E0011
+03550018074D001F0C460027114200301340003E12400050113F0062113E00
+77103E008E0E3D00AA0C3D00D40A3C00DF0A3B00DE0B3A00DD0B3900DC0C38
+00DC0C3800DC0C3700DB0C6E0001006E0001006E0001006F0001006F000100
+7000010071000100710000007200000072000000730000006D030000620201
+03570005094D000B0E430012133A0019193200201E2E002B1F2C00391D2B00
+491B2A005A1A2A006E1A290084192800A0172A00C7142A00D4142800D31427
+00D2152600D1152500D1152500D0152400D016710000007100000071000000
+720000007200000073000000740000007401000075010000730300006C0600
+00640900005A090003480200103C00051732000B1C2900122223001A251E00
+26261A00322517004123150051231400632312007723120091211400B61D14
+00C81C1300C71D1200C71D1100C61D1000C61E1000C61E0F00C61E74010000
+74010000740100007501000076010000770200007702000078030000720600
+00690A0000610D00005A10000050100003410B000F3004001C220103251800
+092A1200132C0B001F2E06002A2F0200362E0001462D0003592A00066D2800
+0686270003AA250103C3230104C3230005C3230005C2230006C2230006C223
+0006C222780300007803000078030000790300007A0400007B0400007A0500
+00710A0000670E00005E1200005715000051170000471700043912000F2A0D
+001A190900250602003100040C3200081A2F000B282A000D3627000F462400
+10582200136B1F0015841F0014AA210013C2200013C2200014C21F0015C21F
+0015C21F0015C21F0015C21F7D0500007D0500007D0500007E0600007F0600
+007B0900006F0E0000641200005C160000541900004E1B0000481D00003E1C
+00053119000E2416001714130020020D012B00110F2800151D240018292100
+1A371D001B461B001D5819001F6C180022851A0022AB1C0020CB1B0021CC1B
+0021CC1A0022CC1A0022CC1A0022CC1A0022CC198308000083080000830800
+00840900007A0D00006D12000062170000591A0000511D00004A2000004421
+00003F230000362300042A22000B1E2000130F1C001B01190423001D112000
+221F1C00252B180027391500294913002B5A12002D6E12002F8613002FA812
+002ECC11002ECC11002FCC10002FCB100030CB0F0030CB0F0030CB0F870B00
+00870B0000870B0000791000006B160000601B0000571F00004F2200004824
+0000412500003C27000038280000302A0000252A00061828000F0924001800
+25071B002B1418002F201400332C1100373A0E003A4B0C003C5D0B003D700B
+003E880A003FA807003FD2050040D3040041D4040041D5030042D5030042D5
+030042D6037715000077150000771500006A1B00005E200000552300004C26
+0001452800003F2A0000392B0000342D0000302F0000293100001F33000311
+30000C032C001600330B140038160F003C200C00412C0800463A06004A4B05
+004A5F03004C7301004D8A00004DAC00004BE200004BE200004BE200004BE3
+00004BE300004BE300004BE3006820000068200000682000005D2500005228
+00014A2A0000432D00003C2E000036300000313200002C3400002836000021
+380000183A00010A38000B0038041100400E0A0044170600461F06004A2A05
+004E38050050480500525C0400547201005689000056A9000053E7000052EB
+000053EB000053EB000053EB000053EB000053EB005A2900005A2900005A29
+0000512C0002482F0000413100003A340000333600002D380000283A000024
+3C0000203D0000193F000010410001053F000B0041050D00460C0A004B1507
+004D1D06005027060055340600574506005A5904005D6F01005F8701005FA5
+00005BDC00005BED00005BED00005BED00005BED00005BED00005BED004E32
+00004E3200004E320000463400003F37000037390000303C00002A3E000025
+400000204100001C4300001A44000017450000114700010746000A0047030F
+004D0B0B0053130800561B0600592506005D3106006041060062540500666B
+02006883000069A0010065C8000065E8000065E8000065E8000065E8000065
+E8000065E800443A0000443A0000443A00003D3D0000343F00002D41000027
+440000214600001C4700001B4800001B4900001B490000184B0000134D0001
+094E0009004F020F0054090C005B1109006119060065230500682E05006A3C
+05006C4F050070660200737E0000749B000071C5000071F5000071F5000072
+F5000072F5000072F5000072F500394300003943000039430000314500002A
+480000244A00001E4C00001C4D00001C4E00001C4E00001C4F00001D500000
+1A520000155500000C5600070258010E005D070D00640E0A006C1706007220
+0400742B030076380200784902007B6001007F7800008196000080C500007F
+FF00007FFF00007FFF00007FFF00007FFF00007FFF002E4C00002E4C00002E
+4C0000274E0000215100001D5200001D5300001D5400001E5500001E550000
+1E5600001E5700001C590000175D00000E5F00060461000D0067040D006E0B
+0A00771306007E1C0400832602008532000087420000875800008B72000090
+9100008EBC00008CFF00008CFF00008CFF00008CFF00008CFF00008CFF0024
+55000024550000245500001E5800001E5900001F5A00001F5B00001F5B0000
+1F5C00001F5D00001F5E00001F5E00001D61000019660000116A0004086D00
+0A0072020D007A070A00840E07008C16040092200200952B0000963B000098
+5000009C6A0000A38B0000A2B300009BFF00009BFF00009BFF00009BFF0000
+9BFF00009BFF00205F0000205F0000205F0000206000002061000020620000
+2063000020640000216500002166000021660000216700001F6A00001A7000
+00147500020C7B00060481000A0089030A00920807009C0F0300A6170100AC
+220000AF310000B1450000B9610000BF820000C2A40000B5EA0000B3F80000
+B3F80000B3F80000B4F80000B4F80021680000216800002168000021690000
+216A0000216B0000226C0000226D0000226E0000226F000022700000227100
+00207500001C7C000018840000138C00000C930003049A000600A5010600B4
+050300C60A0100D7160000E6240000FA340000FF520000FF6C0000FF880000
+FFB20000FFB60000FFB60000FFB50000FFB50000FFB5002272000022720000
+22720000237400002375000023760000237800002379000023790000237900
+002379000023790000217C00001D840000188B0000149400000F9C00000AA5
+000003AF000300BC010400CF050100E5110000F3200000FF2F0000FF4E0000
+FF690000FF800000FFA10000FFB20000FFB20000FFB20000FFB20000FFB200
+23790000237900002379000023790000237900002379000023790000237900
+0023790000237900002379000023790000217C00001D830000198B00001493
+00000F9B00000AA4000004AE000300BB010400CD050100E4100000F21F0000
+FF2E0000FF4A0000FF660000FF7B0000FF9D0000FFB20000FFB20000FFB200
+00FFB20000FFB2002379000023790000237900002379000023790000237900
+00237900002379000023790000237900002379000023790000227C00001D83
+0000198B0000149300000F9B00000AA4000004AD000300BA010400CC050100
+E20F0000F11E0000FE2C0000FF440000FF620000FF760000FF970000FFB200
+00FFB20000FFB20000FFB20000FFB200>
+<47001000470010004700100047001000480010004800100049000F004A000F
+004A000F004B000F004B000E004B000E004B0010004900170049001F004C00
+26004F002D0054003600590041005F004E0063005C0065006D0064007F0062
+0095006000B2006400FD006400FD006400FD006400FD006400FD006400FD00
+6400FD006400FD0049000F0049000F0049000F0049000F004A000F004A000F
+004B000F004B000E004C000E004C000E004D000E004D000E004D0010004B00
+17004B001E004D00250050002D00550036005A00400060004D0064005C0066
+006D0065007F00630094006100B0006500FC006500FC006500FC006500FC00
+6500FC006500FC006500FC006500FC004A000F004A000F004A000F004B000F
+004B000E004C000E004D000E004D000E004E000D004E000D004F000D004F00
+0D004F000F004D0016004D001E004E00250051002C00560036005A00400061
+004D0065005C0067006D0067007F00650093006200AF006600FA006600FA00
+6600FA006600FA006600FA006600FA006600FA006600FA004C000E004C000E
+004C000E004D000E004D000E004E000D004F000D004F000D0050000D005000
+0C0051000C0051000C0051000E004F0015004F001D005000240053002C0057
+0035005B00400062004D0066005C0068006C0068007F00660093006400AD00
+6600F5006600F8006700F8006700F7006700F7006700F7006700F7006700F7
+004E000D004E000D004E000D004F000D004F000D0050000D0051000C005100
+0C0052000C0052000C0053000B0053000B0053000D005200140052001C0053
+00230055002B00580035005C00400063004D0068005C006A006C0069007F00
+680093006500AC006600E6006700F5006700F5006700F5006700F5006700F5
+006700F5006700F50051000C0051000C0051000C0051000C0052000C005200
+0C0053000B0053000B0054000B0055000B0055000B0056000A0056000C0055
+00130054001B005500220057002B00590034005D00400064004D0069005C00
+6B006C006B007E00690092006700AB006700D9006800F0006800F0006800F0
+006800F0006800F0006800F0006800F00053000B0053000B0053000B005300
+0B0054000B0055000B0055000B0056000A0057000A0057000A0058000A0058
+000A0058000B005700120057001900580021005A002A005C0034005F003F00
+66004D006A005C006C006C006C007E006B0092006900AA006800D0006900EA
+006900E9006900E9006900E9006900E9006900E9006900E90056000A005600
+0A0056000A0056000A0057000A0057000A0058000A0059000900590009005A
+0009005A0009005B0009005B000A005A0011005A0018005B0020005C002900
+5E00330061003F0067004D006C005D006E006D006E007F006D0092006B00A9
+006900CC006A00E9006900EE006900F3006800F7006800FB006800FB006800
+FD0058000900580009005800090059000900590009005A0009005B0009005B
+0008005C0008005C0008005D0008005D0008005E0009005D0010005E001700
+5E001F005F0028006000320063003E0069004C006D005D006D006C006B007D
+00670091006300A9006200D9006400FF006300FF006200FF006100FF006100
+FF006000FF006000FF005B0009005B0009005B0009005B0008005C0008005D
+0008005E0008005E0008005F0007005F000700600007006000070061000800
+60000F006100160061001D00620026006300310062003D0062004900630059
+006200690060007B005C008F005900AA005C00E7005A00FF005900FF005900
+FF005800FF005700FF005700FF005700FF005E0007005E0007005E0007005E
+0007005F000700600007006100070061000600620006006300060063000600
+640006006300070063000D006300140064001C005F00240059002E00560038
+005600440056005300560065015500790052008E004F00A9005100DE005100
+FF005000FF005000FF004F00FF004E00FF004E00FF004E00FF006200060062
+00060062000600620006006300060063000600640005006500050065000500
+6600050066000500670004006700050066000C006000130059001A00530023
+004E002B024B0034054A003F0449004E04480061064800750648008A034600
+A3014600CC014600EF004500ED014400EB014300E9014200E8014200E70141
+00E70165000500650005006500050065000500660005006700040068000400
+6800040069000400690003006A0003006A000300640003005C000900540010
+014B00160743001D0D3C00231338002D1539003A113900490E38005B0E3800
+6E0D3800840B38009D093800C0073700DB063600D9073500D9073400D80733
+00D7073300D7083200D7086900040069000400690004006900040069000300
+6A0003006A0003006B0003006B0002006C0002006A000200610001005A0101
+014E00040745000A0B3B001011330016172C001E1C2800281C2600351A2600
+4417250054162500661624007B15240094142600B4112600CF0F2500CE0F24
+00CD102300CC102200CC112100CB112100CB116B0002006B0002006B000200
+6B0002006C0002006D0002006D0001006D0001006E000100670000005F0300
+005A060000520800004202000C370004132D000A192500101E1F0018211A00
+242116002F2013003C1E11004B1E10005C1F0F006F1F0E00861D1000A51A12
+00C3181100C2180F00C2180E00C1190E00C1190D00C1190D00C1196E000100
+6E0001006E0001006E0001006F000100700001007000010070000000660300
+005E070000570A0000500D0000490E00003C0A000A2C0400161F0102201600
+08241000122609001D28050028280101342700024225000454230006672100
+087C1F00069A200003BD1E0004BC1E0005BC1E0006BC1D0006BC1D0007BC1D
+0007BC1D720000007200000072000000720000007200000073000000700200
+00650700005C0B0000540E00004D11000047130000411500013511000A270C
+00151808001F0502002900040C2A00081927000B2623000D3320000F421D00
+10531B0012661900147B1900149A1B0012BC1B0012BC1B0013BD1A0013BD1A
+0014BD1A0014BD1A0014BD1A76010000760100007601000076010000770200
+0070060000640B00005A0F0000521200004A150000441700003F190000391A
+00012D180009211500131312001A020D012400110E2200151B1E0017281A00
+1A3517001B4314001C5413001E661200207C1300209A16001EC417001FC417
+001FC4160020C4160020C4150020C4150020C4157A0400007A0400007A0400
+007A0400006F090000620F0000581300004F17000048190000411B00003B1D
+0000361F000032200000272000061C1E000E0D1A00160118041D001D111A00
+211D16002429120026370F0028460C002A560B002B680B002D7D0C002D990D
+002BC20D002CC40C002CC30C002CC30B002DC30B002DC30A002DC30A710C00
+00710C0000710C00006E0E000061130000561800004D1B0000451D00003E1F
+000038210000332300002F2500002B260000222800021627000A0822001300
+24071500291312002D1E0D00312A09003538060039480500395904003A6A03
+003A7E02003898020039C0020039C7020039C8020039C802003AC802003AC8
+02003AC80262170000621700006217000060180000551C00004B1F00004322
+00003C24000036260000312700002C290000282B0000242D00001B2F00000F
+2E0007022B011000310A0C0035140800381E05003B2903003F360300424503
+004157030041690200427E01004299000043C5010042D4010042D4010042D4
+010042D5000042D5000042D500552000005520000055200000532100004924
+0000412600003A280000332A00002E2C0000292E000024300000203200001C
+33000014350000083500060033020C00380A09003C1306003D1C0600402604
+00453304004842040049540300496802004B7D00004B9900004BC600004AE0
+00004AE000004AE000004AE000004AE000004AE0004A2800004A2800004A28
+0000482800003F2B0000382D0000312F00002B32000025340000213600001C
+37000018390000173A0000123B00000A3A00050138020D003D090B00421107
+00441A0600462305004B2F05004F3F05005051040052660200547C01005598
+000053C2000052EA000052EA000052EA000052EA000052EA000052EA003F2F
+00003F2F00003F2F00003E300000353200002E35000027380000223A00001D
+3C0000183D0000183E0000183E0000193F0000134000000C400005023F010D
+0043070C00481009004C1806004E210600522C0600563B0600584D06005B63
+03005E7A01005F9401005DBA00005BED00005BED00005BED00005BED00005B
+ED00005BED00353800003538000035380000333800002B3B0000253E00001E
+40000019420000194200001A4300001A4300001A4400001A44000015460000
+0E4700040346000D004A060E00500E0A0055160700581F06005C2906005F37
+060061480600655E0400687501006A8F010068B1000066E7000066E7000066
+E7000066E7000066E7000066E7002A4100002A4100002A4100002841000022
+4400001B4600001B4700001B4800001B4800001B4900001B4A00001B4A0000
+1B4B0000174D0000104F0003054F000C0052040E00580B0B005F130800651D
+0600682705006B3305006C43050070580300736F0000768A000076AF000074
+F7000074F8000074F8000074F8000074F8000074F800204A0000204A000020
+4A00001F4A00001C4C00001C4D00001C4E00001C4E00001C4F00001D500000
+1D5000001D5100001D52000019550000135800020859000A005C020F006209
+0C006A1008007219050077230300792E03007B3D01007C5101007F68000084
+84000085AA000083FD000082FF000082FF000083FF000083FF000083FF001D
+5200001D5200001D5200001D5200001D5300001E5400001E5500001E560000
+1E5700001E5700001E5800001E5900001F5900001B5D0000156100010C6400
+080166000E006D060C00760C09007F140500851E0300892901008B3600008C
+4900008E610000947E000097A3000091E3000091FF000091FF000091FF0000
+91FF000091FF001F5A00001F5A00001F5A00001F5A00001F5C00001F5C0000
+1F5D00001F5E0000205F0000206000002061000020610000206200001C6700
+00176C00010F7000050674000A007B020C00840809008D0E0500961603009C
+2001009E2D0000A03F0000A3570000A9770000B0990000A7CD0000A3FD0000
+A3FD0000A3FD0000A4FD0000A4FD0020630000206300002063000020640000
+2165000021660000216700002168000021690000216A0000216B0000226B00
+00226C00001E7200001A780000147F00020C850005048D000800940209009F
+070500AC0D0200B8150000C2220000C8320000CD4A0000D7670000DB880000
+E3B70000CFF60000CFF70000D0F70000D0F70000D0F800226E0000226E0000
+226E0000226E0000226F000022710000227200002373000023740000237500
+00237600002377000023780000207F00001B870000178E0000129700000D9F
+000007A8000101B4000400C2020200DA0A0100EB180000FA270000FF380000
+FF5D0000FF730000FF990000FFB20000FFB20000FFB20000FFB20000FFB200
+23790000237900002379000023790000237900002379000023790000237900
+002379000023790000237900002379000023790000207F00001C860000178E
+0000129600000D9F000008A8000101B3000400C1020200D8090100EA170000
+F9260000FF350000FF5A0000FF6F0000FF8F0000FFB20000FFB20000FFB200
+00FFB20000FFB2002379000023790000237900002379000023790000237900
+0023790000237900002379000023790000237900002379000023790000207E
+00001C860000178E0000129600000D9E000008A7000102B2000400C0020300
+D6080100E9150000F8250000FF330000FF560000FF6D0000FF870000FFAB00
+00FFB20000FFB20000FFB20000FFB200>
+<41001300410013004100130041001300410013004100130041001300410012
+0042001200420012004300120043001200430012004200160041001D004300
+230046002A004B00320051003C00570047005C0055005F0065005F0076005D
+008B005A00A7005D00DE006000FF006000FF006000FF006000FF006000FF00
+6000FF006000FF004100130041001300410013004100130041001200420012
+00420012004300120043001200440012004400110044001100450011004300
+150042001D004400230047002A004C00320052003C00580047005D00550060
+006500600076005E008A005C00A5005D00D8006100FF006100FF006100FF00
+6100FF006100FF006100FF006100FF00430012004300120043001200430012
+00430012004300120044001100440011004500110045001100460011004600
+1100460010004500150043001C004500230049002A004D00320053003B0059
+0047005E00540061006400610076005F008A005D00A4005E00D2006200FF00
+6200FF006200FF006200FF006200FF006200FF006200FF0044001100440011
+00440011004400110045001100450011004600110046001100460010004700
+10004700100048001000480010004700140045001C00460022004A0029004E
+00310054003B005A0046005F0054006200640063007500610089005E00A300
+5F00CE006300FE006300FE006300FE006300FE006300FE006300FE006300FE
+00460011004600110046001100460011004600100047001000470010004800
+10004800100049000F0049000F004A000F004A000F004900130047001B0048
+0022004C0029005000310055003B005B004600600054006300640064007500
+620088006000A1006000CA006400FE006400FE006400FE006400FE006400FE
+006400FE006400FE0048001000480010004800100048001000480010004900
+0F004A000F004A000F004B000F004B000E004C000E004C000E004C000E004B
+0012004A001A004A0021004D0028005200300056003A005C00460061005400
+6500630066007500640088006100A0006100C6006500FD006500FD006500FD
+006500FD006500FD006500FD006500FD004A000F004A000F004A000F004A00
+0F004B000F004B000E004C000E004C000E004D000E004E000D004E000D004E
+000D004F000D004E0012004C0019004D0020004F0027005300300057003A00
+5D0046006300540066006300670074006600880063009F006200C3006600FA
+006600FA006600FA006600FA006600FA006600FA006600FA004D000E004D00
+0E004D000E004D000E004D000E004E000D004E000D004F000D0050000D0050
+000C0051000C0051000C0052000C00500010005000180050001F0051002600
+55002F00590039005E0045006400530068006300690074006800870065009E
+006100C2006400FF006200FE006100FF006100FF006000FF006000FF005F00
+FF0050000D0050000D0050000D0050000D0050000D0051000C0051000C0052
+000C0052000C0053000B0054000B0054000B0054000B0054000F0053001600
+53001E005400260057002E005A0039005F0045006500530065006200630073
+005F0086005B009F005900C7005B00FF005900FF005800FF005800FF005700
+FF005600FF005600FF0052000C0052000C0052000C0052000C0053000B0054
+000B0054000B0055000B0055000A0056000A0057000A0057000A0058000A00
+57000E005600150057001D005800250059002D00570037005800420059004F
+005A005F00580071005600860051009F005100C9005100FF005000FF004F00
+FF004E00FF004E00FF004D00FF004D00FF0056000A0056000A0056000A0056
+000A0056000A0057000A0057000A0058000A0059000900590009005A000900
+5A0009005B0009005B000C005A00140058001B00520023004F002B004D0033
+004D003E004E004B004E005C004E006F004C00840049009D004800C4004800
+FD004700FC004600FA004500F9004500F8004400F8004400F7005900090059
+0009005900090059000900590009005A0009005B0009005B0008005C000800
+5D0008005D0008005E0008005E0008005C000B00540012004D001900490021
+004500280442002F0643003A03430048014200580341006C03420081014000
+99003F00BA003E00EA003D00E7003B00E6003B00E5003A00E4003A00E30039
+00E3005D0008005D0008005D0008005D0008005D0008005E0008005E000700
+5F000700600007006000070061000700610006005A000500530008004A000E
+01420014073A001A0E3400201430002915310036103200440C3200540B3200
+660A32007A08320092063200B1043200D7033000D6032F00D5042E00D4042E
+00D4042D00D3042D00D3056000070060000700600007006000070061000700
+62000600620006006300060064000600640005005E00040057000300500001
+01450003043E00090935000E0F2D00141527001C1924002619220032172100
+401420004F13200060121F0072121F0089112100A60E2300CB0B2100CA0B20
+00C90C1F00C90C1E00C80C1E00C80C1D00C80D640005006400050064000500
+6400050065000500660005006600050067000400670004005C000200550001
+014B030000470500003D0300073200030F2900081521000F1A1B00171C1700
+221D13002D1B100039190E0047190C00571A0B00681A0B007D1A0C00981710
+00BF130E00BE140D00BE140C00BD150B00BD150A00BC150A00BC1569000400
+69000400690004006900040069000400690003006A000300640002005A0101
+00520400014B07000045090000400B0000380A00042A0400111D01021B1400
+081F0E00112108001B22030126220102322000033F1E0005501C0006621B00
+08751900078F1A0004B3190005B7190006B7180006B7180007B7180007B718
+0007B7186C0002006C0002006C0002006C0002006C0002006D000200620000
+005A04000051070000490A0000430D00003E0F00003911000031110004240C
+000F160800190502002300040B2400081820000B241C000E3119000F3F1600
+0F4F15001161140013741300148D150011B1160011B8160012B8150013B915
+0013B9150013B9150013B9156F0001006F0001006F0001006F0001006F0001
+0062030000590800004F0B0000470F0000411100003B130000361500003117
+00002A1700041F14000D11110015010C011E00100E1C00141A180017261400
+193310001A410E001B510D001C620C001E750D001F8D0F001DB213001DBD12
+001DBD11001EBD11001EBD10001EBD10001FBD106A0400006A0400006A0400
+006A04000062070000570C00004D100000451300003E150000381800003219
+00002E1B00002A1D0000251E00011A1D00090C1A001100180417001C101400
+201C100023280B00253408002643060027530500296405002A7605002A8D07
+0028AD0A0027BD0A0027BD0A0027BD0A0027BD0A0027BD0A0027BD0A5D0D00
+005D0D00005D0D00005D0D0000561000004C140000431700003C190000351C
+0000301E00002B20000027210000242300001F250000142500050621000D00
+23070E0027120B002B1D07002E280300303501003243010031530200316303
+0031750400308B05002EAB07002DBF07002DBF07002DBF07002DBF07002DBF
+07002EC007501600005016000050160000501600004A180000411B0000391E
+0000332000002D2200002924000024260000202800001D290000172B00000D
+2B00020129010A002D0808002F120700301B06003326030036320200394002
+00385102003861030038730300378A030037AA030036C5040036C5040036C5
+040037C6030037C6030037C603441E0000441E0000441E0000441E00003F20
+000037220000312400002B27000026290000212B00001D2D0000192E000015
+2F0000123000000C300002022E000A0030070A003410070035190600382304
+003B2E0300403D0300404D0300405F030040720200408A010040AC010040D1
+010040D1010040D1010040D1010040D1010040D2013A2500003A2500003A25
+00003A250000362700002E290000282C0000232E00001D3000001932000015
+3300001634000016340000143500000E350001043300090034050B003A0E08
+003B1706003D200500412B040046390400484A0400485D0300497101004A89
+00004BAC000049DE000049DF000049DF000049DF000049DF000049DF00302D
+0000302D0000302D0000302D00002C2E0000263100001F3400001A36000016
+37000017380000173800001739000017390000153A00000F3B000106390009
+003A040D003F0C090043150600441D0600482805004C3505004F460500515A
+0400527001005488000055AA000051EA000051EA000052EA000052EA000052
+EA000052EA0026360000263600002636000026360000233700001C3A000018
+3B0000183C0000183D0000183D0000183E0000183E0000193F000017400000
+11410001084000080040030E00450A0B004B1307004D1B0600502506005532
+0600584106005A5505005D6D01005F85010060A500005CE400005CED00005C
+ED00005CED00005CED00005CED001D3E00001D3E00001D3E00001D3E000019
+4000001941000019410000194200001A4300001A4300001A4400001A450000
+1A45000019460000134800000A4800070048010F004D080C00541009005919
+06005C2306005F2E0600623D060064500500686802006B8000006C9F010068
+CA000068E9000068E9000068E9000068E9000068E9001A4600001A4600001A
+4600001A4600001A4600001B4700001B4800001B4900001B4A00001B4A0000
+1C4B00001C4B00001C4C00001B4D0000155000000D5200060151000F005706
+0D005E0E0A00651607006A2005006D2A05006F380400714A04007461020078
+7A00007A99000077C9000078FC000078FC000078FC000078FC000078FC001C
+4D00001C4D00001C4D00001C4D00001C4E00001C4F00001D4F00001D500000
+1D5100001D5200001D5200001D5300001D5400001C55000018590000105B00
+04055D000C0061040E00690B0B0071120700791C04007D2602007F32010081
+42000082590100867300008A93000089C6000087FF000087FF000087FF0000
+87FF000087FF001E5500001E5500001E5500001E5500001E5600001E570000
+1E5800001E5900001F5A00001F5A00001F5B00001F5C00001F5C00001E5E00
+001A6200001367000309690009016E010D0076070B007F0D0800881504008E
+1F0200912B0000923A000094500000976B00009F8D00009DB8000097FF0000
+97FF000097FF000098FF000098FF001F5E00001F5E00001F5E00001F5E0000
+205F0000206000002061000020620000206300002064000021650000216600
+0021660000206800001B6E0000167300010E790005057E000A0086020B0090
+070700990E0400A3150200AA200000AD2F0000AF430000B6600000BD830000
+BFA80000B1F90000B1F80000B1F80000B2F80000B2F8002169000021690000
+2169000021690000216A0000216B0000226C0000226D0000226E0000226F00
+00227000002271000022720000227400001D7B000019830000148B00000F94
+0001089B000301A4000600B4040400C6080100DA120000EA210000FE310000
+FF500000FF6B0000FF880000FFB20000FFB20000FFB20000FFB20000FFB200
+23750000237500002375000023750000237600002377000023790000237900
+002379000023790000237900002379000023790000237A00001E8200001A89
+000015910000109A00000BA2000005AC000300B9000400CA040200E20F0000
+F11E0000FF2D0000FF4B0000FF690000FF810000FFA80000FFB20000FFB200
+00FFB20000FFB2002379000023790000237900002379000023790000237900
+0023790000237900002379000023790000237900002379000023790000237A
+00001E8100001A89000015910000109900000BA2000005AB000200B8000400
+C9040200E00D0000F01D0000FE2C0000FF450000FF650000FF7C0000FF9F00
+00FFB20000FFB20000FFB20000FFB200>
+<41001300410013004100130041001300410013004100130041001300410013
+004100130041001300410013004100130041001300410013003F001A003F00
+20004100270047002E004C0036005200410057004E005B005D005C006E005B
+00820058009C005800C3005E00FF005E00FF005E00FF005E00FF005E00FF00
+5E00FF005E00FF004100130041001300410013004100130041001300410013
+00410013004100130041001300410013004100130041001300410013004100
+13003F001A003F0020004100260047002E004C0036005200410057004E005B
+005D005C006D005B00810058009B005800C2005E00FF005E00FF005E00FF00
+5E00FF005E00FF005E00FF005E00FF00410013004100130041001300410013
+00410013004100130041001300410013004100130041001300410013004100
+130041001300410013003F001A003F0020004100260047002E004C00360052
+00400057004D005B005C005C006D005B00810058009A005800C0005E00FF00
+5E00FF005E00FF005E00FF005E00FF005E00FF005E00FF0041001300410013
+00410013004100130041001300410013004100130041001300410013004100
+1300410013004100130041001300410013003F001A003F0020004100260047
+002E004C0036005200400058004D005C005C005D006C005C00800059009900
+5900BD005F00FF005F00FF005F00FF005F00FF005F00FF005F00FF005F00FF
+00410013004100130041001300410013004100130041001300410013004100
+13004100130041001300410013004200120042001200420013004000190040
+001F004300260048002D004D0035005300400059004D005D005B005E006C00
+5E007F005B0097005A00BB006000FF006000FF006000FF006000FF006000FF
+006000FF006000FF0041001300410013004100130041001300410013004100
+13004200120042001200430012004300120043001200440012004400110044
+0012004200180042001F004500260049002D004E00350054003F005A004C00
+5E005B0060006B005F007E005C0096005B00B8006100FF006100FF006100FF
+006100FF006100FF006100FF006100FF004300120043001200430012004300
+12004300120043001200440012004400110045001100450011004500110046
+00110046001100460011004400180043001E00470025004A002C004F003500
+55003F005B004C005F005A0061006B0061007E005E0094005C00B5006200FF
+006200FF006200FF006200FF006100FF006100FF006000FE00450011004500
+11004500110045001100450011004500110046001100460010004700100047
+001000480010004800100048001000490010004700170046001E0049002500
+4C002C005000340056003F005C004B0061005A0063006B0061007D005D0094
+005900B6005B00FE005A00FF005900FF005800FF005700FF005700FF005600
+FF004700100047001000470010004700100047001000480010004800100049
+000F0049000F004A000F004A000F004B000F004B000E004B000E004A001500
+49001D004A0024004E002B005200340058003E005A004A005C0059005B006A
+0058007D00540094005000B8005200FF005000FF004F00FF004E00FF004E00
+FF004D00FF004D00FF004A000F004A000F004A000F004A000F004A000F004A
+000F004B000E004C000E004C000E004D000E004D000E004E000D004E000D00
+4F000D004D0014004C001C004D0023004D002A004D0032004E003B00500047
+0051005700510068004F007D004B0095004900B7004800FF004700FF004600
+FF004500FE004500FE004400FE004400FE004D000E004D000E004D000E004D
+000E004D000E004E000D004E000D004F000D004F000D0050000D0050000C00
+51000C0051000C0052000C00500013004B001A00470021004500280045002F
+004500380046004400470054004600670046007C00430094004000B3003F00
+F4003E00F5003D00F4003C00F3003B00F3003B00F2003A00F20050000C0050
+000C0050000C0050000C0050000C0051000C0052000C0052000C0053000B00
+53000B0054000B0054000B0055000B0051000A004A0010004400180040001E
+023B00240739002B093B0036033D0043003C0052003B0064003B0079003900
+90003700AD003500E0003400E6003300E5003200E3003200E2003100E10031
+00E10054000B0054000B0054000B0054000B0054000B0055000B0055000B00
+56000A0057000A0057000A0058000A00550009004E0008004800070041000D
+013A0012073300180D2D001E122A0027132B00330E2D00400A2C004F082C00
+60062B0073052C0089042C00A5022B00CD012A00D5012900D3012800D20128
+00D2012700D1022700D10258000A0058000A0058000A0058000A0058000A00
+58000900590009005A0009005A0009005B000900530007004C000600440004
+003E000202370007062F000D0C2900131123001A15200024151E002F131D00
+3C101C004A0F1B005A0E1B006C0E1B00800D1C009A0B1E00BD071D00C8071C
+00C7081B00C6081A00C6081A00C5091900C5095C0008005C0008005C000800
+5C0008005C0008005D0008005D0008005E0008005A00070052000500470003
+00400001023B010003370400022D00020B250007111E000E15190016181500
+201811002B170D0036150B00421509005215080062160700751608008D140B
+00AD110B00BA100A00B9100900B8110800B8110700B7110700B71160000700
+600007006000070060000700600007006100070062000600590004004E0002
+00440101013F0300023B06000136080000330A00002705000B1A0101161200
+071A0C00101C06001A1D0201241C01022F1A00043C1800054C1600065D1400
+087014000886140006A3140006B3130006B3130007B2130007B2130008B213
+0008B212650005006500050065000500650005006500050063000400570002
+004C010001440500003F070000390A0000350C0000300E00002D100000220C
+000A140800140402001E00040B1D0008171A000B2316000E2F13000F3C1000
+104B0E00105D0D00126F0D0013840F0011A1110011B4110011B4100012B410
+0012B4100012B4100013B4105F0002005F0002005F0002005F0002005F0002
+00570100014B050000440800003D0B0000370E0000321000002D1200002914
+0000261600001C14000810110010010C011900100D16001419120017250E00
+18310A00193E07001A4D06001B5E06001D6F06001D8408001CA00C001BB70C
+001BB70C001BB70C001BB70C001BB70C001BB70C5505000055050000550500
+0055050000550500004B090000430C00003B0F0000351200002F1400002A16
+000027180000231A0000201C0000181C00040A19000C00170411001B100E00
+1F1B0A00222605002333010023400100224F0100235E0200236E0400238207
+00219E0A001FBA0C0020BA0C0020BA0C0020BA0C0020BA0C0020BA0C490D00
+00490D0000490D0000490D0000490D00004110000039130000321600002D18
+0000281B0000241D0000211F00001D2100001A22000012230001051E000800
+2107080024100700261A06002725030028300100283E0100284D0100285C02
+00286D040028810600279C090025BB0B0025BB0B0025BB0B0025BC0B0025BC
+0B0025BC0B3F1500003F1500003F1500003F1500003F15000037180000301A
+00002A1D0000261F0000212100001D2300001925000016260000122700000D
+280000042500070024050900280E07002A1806002B2204002D2E02002F3B01
+002F4B01002E5A02002F6B03002E7F05002D9A07002BBE08002BBE08002BBE
+08002BBE08002BBE08002BBE08351C0000351C0000351C0000351C0000351C
+00002E1F000028210000232400001E2600001A28000015290000132A000013
+2B0000132B00000F2B0000062A00050029030A002D0C07002E160700302005
+00322B030036380200374802003658020036690300367E03003599040034C3
+050034C4040034C4040034C4040034C4040034C4042C2400002C2400002C24
+00002C2400002C24000026260000202900001B2B0000162C0000142D000014
+2E0000142E0000142F0000142F000010300000082F0004002D020B00310A08
+0034130700351D0500382803003C340300404402003F5603003F6803003F7D
+02003E9801003FC601003FCF01003FCF01003FCF01003FCF01003FCF01232B
+0000232B0000232B0000232B0000232B00001D2E0000183000001531000015
+3200001532000015330000153300001634000016340000123500000A350003
+0032000D0036080A003A1107003C1A06003F24040043310400474004004852
+030048660300497C00004998000049CA000048DE000048DE000049DE000049
+DE000049DE001A3400001A3400001A3400001A3400001A3400001635000016
+360000163600001637000017380000173800001739000017390000173A0000
+133B00000D3B00030238000D003C070C00410F080044180600462105004A2D
+05004E3C0500504E050052630300547B01005697000053C6000052EA000052
+EA000052EB000052EB000052EB00173A0000173A0000173A0000173A000017
+3A0000183B0000183C0000183C0000183D0000183E0000183E0000193F0000
+193F000019400000154100000F4200020440000C0043050D00490D0A004D16
+0700501E060053290600573706005A4906005D5F0400607701006293010060
+BB00005DED00005DED00005EED00005EED00005EED00194100001941000019
+410000194100001941000019420000194200001A4300001A4400001A450000
+1A4500001A4600001A4600001B47000017490000114A0001074A000A004C04
+0F00520B0B00581308005D1C0600602606006333060065430600695904006C
+7101006F8D00006DB200006BED00006BED00006BED00006CED00006CEE001B
+4800001B4800001B4800001B4800001B4800001B4900001B4A00001B4B0000
+1C4B00001C4C00001C4D00001C4D00001C4E00001C4E000019510000145300
+010A5500080056020F005C080C00641009006B19060070230400722E040074
+3D0300775203007A6A00007E8600007EAF00007CFF00007CFF00007DFF0000
+7DFF00007DFF001D5000001D5000001D5000001D5000001D5000001D510000
+1D5200001D5300001D5400001E5400001E5500001E5600001E5700001E5700
+001B5A0000175E00000E6000060262000E0068050D00700C09007A14060081
+1E03008429020086360000884900008A6100008F80000092A700008DFD0000
+8DFF00008DFF00008DFF00008DFF001F5900001F5900001F5900001F590000
+1F5900001F5A00001F5B00001F5C00001F5D00001F5E0000205F0000206000
+0020600000206100001D64000019690000116E00040871000A0077010D0080
+070A008A0E060092150300992001009C2C00009D3E0000A0570000A6770000
+AD9D0000A2DE0000A1FE0000A1FE0000A1FE0000A1FE002064000020640000
+20640000206400002064000021650000216600002167000021680000216900
+00216A0000216B0000226C0000226C00001F7000001B770000167E00010E84
+0004078C000700930109009D060600AA0B0300B8130100C21F0000CA2F0000
+CE470000D9660000DE890000EBC80000D2F90000D3F90000D3F90000D4FA00
+22700000227000002270000022700000227000002271000022720000237400
+00237500002376000023770000237800002379000023790000217D00001D85
+0000188C0000139500000E9D000009A6000002B1000400BF020300D5080100
+E9150000F9260000FF350000FF5C0000FF740000FF9C0000FFB20000FFB200
+00FFB20000FFB2002379000023790000237900002379000023790000237900
+00237900002379000023790000237900002379000023790000237900002379
+0000217C00001D840000188C0000139400000E9D000009A6000003B0000400
+BE010300D3070100E8140000F7240000FF330000FF580000FF700000FF9400
+00FFB20000FFB20000FFB20000FFB200>
+<41001300410013004100130041001300410013004100130041001300410013
+00410013004100130041001300410013004100130041001300400016003E00
+1C004000230042002A00490032004F003B00550047005A0056005C0066005C
+007800590091005700B2005E00FF005E00FF005E00FF005E00FF005E00FF00
+5E00FF005E00FF004100130041001300410013004100130041001300410013
+00410013004100130041001300410013004100130041001300410013004100
+1300400015003E001C004000230042002A00490032004F003B00550047005A
+0055005C0066005C007800590090005700B0005E00FF005E00FF005E00FF00
+5E00FF005E00FF005E00FF005E00FF00410013004100130041001300410013
+00410013004100130041001300410013004100130041001300410013004100
+13004100130041001300400015003E001C004000230042002900490032004E
+003B00550047005A0055005C0065005C00770059008F005700AE005E00FF00
+5E00FF005E00FF005E00FF005E00FF005E00FF005E00FF0041001300410013
+00410013004100130041001300410013004100130041001300410013004100
+130041001300410013004100130041001300400015003E001C004000230042
+002900490032004E003B0055004600590055005C0065005C00770059008E00
+5700AD005E00FF005E00FF005E00FF005E00FF005E00FF005E00FF005E00FF
+00410013004100130041001300410013004100130041001300410013004100
+1300410013004100130041001300410013004100130041001300400015003E
+001C004000230042002900490031004E003A0055004600590054005C006500
+5C00760059008D005700AB005E00FD005E00FF005E00FF005E00FF005E00FF
+005E00FF005E00FF0041001300410013004100130041001300410013004100
+13004100130041001300410013004100130041001300410013004100130041
+001300400015003E001C004000230042002900490031004E003A0054004600
+590054005C0064005C00760059008C005700AA005E00F9005E00FF005E00FF
+005E00FF005E00FF005E00FF005E00FF004100130041001300410013004100
+13004100130041001300410013004100130041001300410013004100130041
+0013004100130041001300400015003E001C00400022004200290049003100
+4E003A0054004600590053005C0064005C0075005A008B005700A8005D00EE
+005D00FF005C00FF005B00FF005A00FF005900FF005800FF00410013004100
+13004100130041001300410013004100130041001300410013004100130041
+00130041001300410013004100130041001300400015003F001C0040002200
+43002900490031004F003A00550045005A0053005C0063005A00750056008B
+005100A9005300EE005200FF005100FF004F00FF004F00FF004E00FF004D00
+FF004100130041001300410013004100130041001300410013004100130041
+00130042001200420012004200120043001200430012004300120043001400
+41001B0042002200450028004A0030004E0039005100430053005100530062
+00510075004D008B004900AA004900E8004800FE004600FE004600FE004500
+FE004400FD004400FD00420012004200120042001200420012004200120043
+00120043001200440012004400110044001100450011004500110046001100
+460011004600130043001B00440021004200270044002E0046003600490041
+004A005000490061004800750045008D004100AA004000E0003E00FA003D00
+F9003C00F8003C00F7003B00F7003B00F60045001100450011004500110045
+00110045001100450011004600110046001000470010004700100048001000
+480010004800100049000F0047001200420018003E001F003D0025003D002C
+003E0034003F003E0040004E003F0060003E0074003C008C003900A8003700
+D6003500F0003400EF003300EE003300EE003200ED003200EC004800100048
+0010004800100048001000480010004800100049000F0049000F004A000F00
+4A000F004B000F004B000E004C000E0046000D0041000F003C00150037001B
+0333002108310028093500330335003E0034004D0033005E00320071003100
+88002F00A3002D00CC002C00E4002B00E3002A00E2002A00E1002900E00029
+00E0004B000E004B000E004B000E004B000E004B000E004B000E004C000E00
+4D000E004D000E004E000D004F000D004A000C0044000B003F000A003A000B
+00330010052D00160A29001D0E2600250F2700300B28003D0727004B042600
+5B0325006C022500810125009B012500BD002400D4002300D3002200D20021
+00D1002100D1002100D0004F000D004F000D004F000D004F000D004F000D00
+4F000D0050000C0051000C0051000C004F000B0047000A00410009003C0007
+0037000501310006032B000C092500120D200019111D0022111B002D0E1A00
+390C1800460A1700550A1600660916007909170090071800AF051900C60417
+00C5041700C4041600C3051500C3051500C20553000B0053000B0053000B00
+53000B0053000B0053000B0054000B0055000B004E000A00450008003F0006
+0038000401320002022E0001042B0102052200070C1C000D11170015131300
+1F130F0029120C00331109003F1007004D1005005D1105006F110500841007
+009F0E0800B60C0700B50C0600B40D0500B40D0500B30D0400B30D58000A00
+58000A0058000A0058000A0058000A0058000A00570009004C000700430005
+003B00030234010103300200032E0400022B06000125060005180101101000
+07150B00101705001A170201231600022D1400043912000648100007590E00
+086B0E00087F0E0007970E0006AF0E0007AF0E0007AF0D0008AF0D0008AF0D
+0008AF0D5800070058000700580007005800070058000700560007004B0005
+00400002013801000433040002300600012D090000290B0000250C0000200C
+00041308000F0402001900050B1800081714000B2210000D2D0D000F3A0A00
+0F48080010590700116A0700127D080011950A0010AF0B0010AF0A0011AF0A
+0011AF0A0011AF0A0012AF0A4A0003004A0003004A0003004A0003004A0003
+00480002003F02000339050001330800002F0B00002A0D0000260F00002211
+0000201300011A1300030E10000B000C011400100D100013190D0016240800
+172F0400183C0100184A00001859010018690300187C05001793090015B10B
+0015B10B0015B10B0015B20B0015B20B0015B20B4105000141050001410500
+0141050001410500013F06000038090000320C00002D0F0000281100002314
+0000201600001D1800001A190000151B0001091800070017040B001B100800
+1C1A06001D2404001D2E01001D3B00001C4900001C5801001C6703001C7905
+001B91090019B40C0019B50C0019B50C0019B50C0019B50C0019B50C390C00
+00390C0000390C0000390C0000390C0000370D0000301000002A1300002516
+0000211800001D1A00001A1C0000161E0000131F00000E1F0000061B000400
+1B0408001E0E08002017070021220400212C02002139010021470100215602
+002165030021780500208F08001EB30D001DB80C001DB80C001DB80C001DB8
+0C001EB80C30140000301400003014000030140000301400002E1500002817
+0000231A00001F1D00001A1F00001621000012220000112200001123000010
+23000008210003001D020800220C080024150700251F0500262A0200263601
+0026450100265402002664030026760500268D080023B00B0023BB0B0023BB
+0B0023BB0B0023BB0B0023BB0B281B0000281B0000281B0000281B0000281B
+0000261C0000211F00001C2100001723000012250000122500001226000012
+26000012260000112700000A26000200210009002609080027120700291D05
+002B2703002C3401002D4201002C5202002D6203002D7404002C8C06002AAE
+090029BE090029BE090029BE090029BE090029BE0920230000202300002023
+000020230000202300001F2300001926000014280000122800001329000013
+29000013290000132A0000132A0000122A00000C2B000102280009002A0709
+002D1007002E1A06003024040033300200363F0100354F0200356003003572
+0300348A040033AC050032C3050032C3050032C3050033C3050033C305172A
+0000172A0000172A0000172A0000172A0000162A0000132B0000132C000014
+2C0000142D0000142D0000142E0000142E0000142E0000132F00000E300000
+042E0008002E050A00330E070034170600362104003A2D03003E3B02003F4C
+02003E5E03003E7102003E8901003EAD01003ECE01003ECE01003ECE01003E
+CE01003ECE01142F0000142F0000142F0000142F0000142F00001430000015
+30000015310000153100001532000015320000153300001633000016340000
+1534000010360000063400070033030C00380C09003B1506003D1E05004029
+04004537040048470400485B0300497002004A8800004AAE000049DE000049
+DF000049DF000049DF000049DF001635000016350000163500001635000016
+35000016350000163600001637000017370000173800001738000017390000
+173A0000173A0000173B0000123C0000093B0006003A020D003F0A0B004412
+0700451B0600482505004D3205005042050052570400546D02005687000057
+AB000053EC000053EC000053EC000053EC000053EC00183C0000183C000018
+3C0000183C0000183C0000183C0000183C0000183D0000183E0000193F0000
+193F000019400000194000001941000019410000144300000C430005014201
+0E0047080C004D1009005119060053220600572E06005B3D06005D51060061
+6A02006383000064A4000060EA000060EB000060EB000060EB000060EB001A
+4300001A4300001A4300001A4300001A4300001A4300001A4400001A450000
+1A4500001A4600001B4700001B4700001B4800001B4900001B490000164C00
+000E4D0004034C000E0051060E00570D0A005E160700621F0600652A060068
+3805006A4B05006E630200727C0000739D00006FD0000070F3000070F30000
+70F4000070F4001C4B00001C4B00001C4B00001C4B00001C4B00001C4B0000
+1C4C00001C4D00001C4E00001C4E00001C4F00001D5000001D5000001D5100
+001D52000018550000125800030759000B005C030E00630A0B006B12080073
+1B050077260300793202007B4201007D5A0100817400008596000083D40000
+82FF000082FF000082FF000082FF001D5400001D5400001D5400001D540000
+1D5400001D5400001E5500001E5600001E5700001E5800001E5900001F5900
+001F5A00001F5B00001F5B00001A600000156400020B670008016A010E0071
+060C007A0D0800831505008A1F02008D2A00008F39000091500000946B0000
+9B8F000098C1000094FF000094FF000094FF000095FF001F5E00001F5E0000
+1F5E00001F5E00001F5E00001F5E0000205F00002061000020620000206300
+0020630000216400002165000021660000216700001D6C0000187200011077
+0004077C00090083010C008D060800970C0500A1140200A81F0000AC2D0000
+AD420000B55F0000BC850000BDAF0000B0F90000B0F90000B1F90000B1F900
+216A0000216A0000216A0000216A0000216A0000216A0000226C0000226D00
+00226E0000226F000022700000227100002272000023730000237400001F7B
+00001A830000168B0000119400000B9D000104A6000400B4010400C6040200
+E00E0000F01D0000FF2E0000FF4E0000FF6B0000FF8B0000FFB20000FFB200
+00FFB20000FFB2002378000023780000237800002378000023780000237900
+00237900002379000023790000237900002379000023790000237900002379
+0000237900001F7F00001B870000168F0000119800000CA0000006AA000201
+B6000400C6030200DF0C0000EF1C0000FE2C0000FF490000FF690000FF8300
+00FFB00000FFB20000FFB20000FFB200>
+<41001300410013004100130041001300410013004100130041001300410013
+00410013004100130041001300410013004100130041001300410013003F00
+19003F001F004100260046002E004C0036005200400058004E005B005E005C
+0070005A0086005700A3005C00E3005E00FF005E00FF005E00FF005E00FF00
+5E00FF005E00FF004100130041001300410013004100130041001300410013
+00410013004100130041001300410013004100130041001300410013004100
+1300410013003F0019003F001F004100260046002D004C0036005200400057
+004E005B005D005C006F005B0085005700A2005B00DC005E00FF005E00FF00
+5E00FF005E00FF005E00FF005E00FF00410013004100130041001300410013
+00410013004100130041001300410013004100130041001300410013004100
+13004100130041001300410013003F0018003F001F004100260046002D004B
+0035005200400057004D005B005D005C006F005B0084005700A1005A00D500
+5E00FF005E00FF005E00FF005E00FF005E00FF005E00FF0041001300410013
+00410013004100130041001300410013004100130041001300410013004100
+130041001300410013004100130041001300410013003F0018003F001F0041
+00260046002D004B0035005100400057004D005B005C005C006E005B008300
+5800A0005900D1005E00FF005E00FF005E00FF005E00FF005E00FF005E00FF
+00410013004100130041001300410013004100130041001300410013004100
+1300410013004100130041001300410013004100130041001300410013003F
+0018003F001F004100250046002D004B0035005100400057004D005B005C00
+5C006E005B00830058009E005900CD005E00FF005E00FF005E00FF005E00FF
+005E00FF005E00FF0041001300410013004100130041001300410013004100
+13004100130041001300410013004100130041001300410013004100130041
+001300410013003F0018003F001F004100250046002D004B00350051003F00
+57004C005B005C005C006D005B00820058009D005900CA005E00FF005E00FF
+005E00FF005E00FF005E00FF005E00FF004100130041001300410013004100
+13004100130041001300410013004100130041001300410013004100130041
+0013004100130041001300410013003F0018003F001F004100250045002D00
+4B00350051003F0057004C005B005B005C006C005B00810058009B005700C8
+005A00FF005800FF005700FF005600FF005500FF005400FF00410013004100
+13004100130041001300410013004100130041001300410013004100130041
+00130041001300410013004100130041001300410013003F0018003F001E00
+4100250045002C004B00350051003F0056004C0057005B0056006C00530081
+004E009D004C00CB004D00FF004B00FF004A00FF004900FE004800FE004800
+FE004100130041001300410013004100130041001300410013004100130041
+00130041001300410013004100130041001300410013004100130041001300
+3F0018003F001E004100250045002C00460033004B003D004D004B004C005A
+004B006D004900830044009F004200CA004100FA004000F9003F00F8003E00
+F7003D00F7003D00F600410013004100130041001300410013004100130041
+00130041001300410013004100130041001300410013004100130041001300
+41001300410013003F0018003D001E003C0024003C002B003E00320040003B
+004200490041005B0040006E003E0085003B00A0003800C8003600F3003500
+F2003400F1003300F0003300F0003200EF0041001300410013004100130041
+00130041001300410013004100130041001300410013004100130041001300
+4100130041001300410013003F0012003B00160037001C0035002300350029
+003600310037003B003700490036005A0035006E003300840031009F002F00
+C5002D00EB002C00EA002C00EA002B00E9002B00E9002A00E8004100130041
+00130041001300410013004100130041001300410013004200120042001200
+430012004300120043001200420011003D00100039000F0035001300310019
+022E001F052D0027052E0030022E003B002D0048002B0059002A006C002800
+810027009B002600BD002500E2002400E1002300E0002300DF002200DF0022
+00DE0044001200440012004400120044001200440012004400120044001100
+4500110045001100460011004500110040000F003B000E0037000D0033000B
+002E000F022A00150626001C092400240A24002E0724003A02230047012100
+57001F0067001E007A001E0092001E00B1001D00D4001C00D3001B00D2001B
+00D1001A00D0001A00CF004700100047001000470010004700100047001000
+4700100047001000480010004800100044000F003E000D0039000B0034000A
+00300008002C00070127000B05230011091E00180B1C00210B1A002B091800
+370716004305140051051300610512007304120088041300A2021400C30113
+00C2021200C1021100C0021000BF021000BF024B000F004B000F004B000F00
+4B000F004B000F004B000F004B000E004B000E0043000D003C000B00360009
+00310007012D0005022A000402250002031E0006071A000D0C1500140E1200
+1E0E0F00280C0B00310B09003C0B0600490B0400590C03006A0C03007D0B03
+00940A0500B2080400B1090300B0090200B0090200AF090201AF094F000D00
+4F000D004F000D004F000D004F000D004F000D004A000C0041000A003A0008
+00330006012E0004022A00020326010103210200031D0400031601010B0F00
+07100A001011050019120201221000022B0E0004360C0005450A0006550800
+0767070008790700078E080006AC080007AD080007AD070008AC070008AC07
+0008AC06440009004400090044000900440009004400090044000900400008
+0038000501300003022B00000429030002250500021F0700021D0900021B0B
+0002120800090302001500040C130008170E000A210B000C2C07000E370400
+0E4502000F5501000F6501000F7703000E8C05000CA807000CAC07000CAC07
+000CAC07000CAC07000CAC073A0003023A0003023A0003023A0003023A0003
+023A000302350002022F0100032C04000227070001220900011F0C00011B0E
+000218100002161100020D100006000D020E00100E0B001219070013230400
+132C010013370000134400001353000012630200127403001289060010A608
+000FAE08000FAE08000FAE08000FAE08000FAE083104000231040002310400
+023104000231040002310400022F0600012A090000250C0000200E00011D10
+000119130001161500011317000010180000071600020014040700160D0800
+1717070017210500172B020017360000164300001652000016610200167204
+001587070013A30A0013B00A0013B00A0013B00A0013B00A0013B00A2B0C00
+002B0C00002B0C00002B0C00002B0C00002B0C0000280D0000231000001F13
+00011B16000017180000131A00000F1A00000E1B00000E1B0000091A000100
+16020800190B08001A1507001B1F05001B2903001B3401001A4100001A5001
+001A5F02001A7004001A85070018A20B0017B30C0017B30C0017B30C0017B3
+0C0017B30C2413000024130000241300002413000024130000241300002115
+00001D180000181A0000141C00000F1D00000F1D00000F1E00000F1E00000F
+1E00000B1D000001190007001C0908001E1208001F1C060020260300203201
+001F3F00001F4E01001F5D02001F6E04001F8307001DA00B001BB70C001CB7
+0C001CB70C001CB70C001CB70C1D1B00001D1B00001D1B00001D1B00001D1B
+00001D1B00001A1C0000151F00001020000010200000102100001021000010
+21000010210000102200000D220000031C0005001E06080021100800231A06
+0024240400252F0200253D0100244C0100255B0200256C040025810600239D
+0A0021BA0C0021BA0C0021BA0C0021BA0C0021BA0C15220000152200001522
+00001522000015220000152200001222000011230000112400001124000011
+240000112500001225000012250000122600000E2600000624000500210408
+00260D070027170700292104002A2D02002C3A01002B4901002B5902002C6A
+03002B7F05002A9B080028BD0A0028BD0A0028BD0A0028BD090028BD091226
+00001226000012260000122600001226000012260000122700001227000012
+28000012280000122800001329000013290000132A0000132A0000102A0000
+082A00040027020A002B0B08002D1407002E1E050031290300343602003546
+01003457020034680300347D04003399050031C2050031C2050032C2050032
+C2050032C205132B0000132B0000132B0000132B0000132B0000132B000013
+2B0000132C0000132C0000142D0000142D0000142D0000142E0000142E0000
+142F0000122F00000B2F0002012D010A003008090033120700351B06003726
+04003B3203003F4202003F5403003E6603003E7C02003D9901003ECB01003E
+CE01003ECE01003ECF01003ECF011530000015300000153000001530000015
+30000015300000153000001531000015320000153200001533000015330000
+163400001634000016350000133500000D3600020233000B0036060B003B0F
+07003C1806003F220500432E0400473D0400494F0400496403004A7B00004B
+9900004AD000004AE000004AE000004AE000004AE000163600001636000016
+36000016360000163600001636000016370000173700001738000017390000
+17390000173A0000173A0000173B0000183B0000153C00000F3D0001053B00
+0A003D050D00420D090046150600481E06004C29050050380600534A050055
+600300577901005A97010057CA000055ED000055ED000055ED000055ED0018
+3D0000183D0000183D0000183D0000183D0000183D0000183E0000183F0000
+193F000019400000194100001941000019420000194200001A430000174400
+0012460001084500090046030F004B0A0B0051130800551B0600582606005C
+3306005F440600625A0400657401006790010065BA000063E9000064E90000
+64E9000064E9001A4500001A4500001A4500001A4500001A4500001A450000
+1A4600001A4700001B4700001B4800001B4900001B4A00001B4A00001C4B00
+001C4B00001A4D0000154F00000B5100070151010F0057080D005E0F090064
+180600692205006C2E05006E3D040071530400746C01007889000077B50000
+76FA000076FA000076FA000076FA001C4E00001C4E00001C4E00001C4E0000
+1C4E00001C4E00001C4F00001D5000001D5100001D5100001D5200001D5300
+001D5400001E5400001E5500001C570000175A00000F5D0005045F000D0064
+040D006C0B0A00751306007C1D040080280200823601008449000086620000
+8B8200008DAD000089FF000089FF000089FF00008AFF001E5800001E580000
+1E5800001E5800001E5800001E5800001E5900001F5A00001F5B00001F5C00
+001F5D00001F5E00001F5E0000205F0000206000001E6200001A670000136B
+00030A6F00090074000D007D060A00860D07008F150400961F0100992C0000
+9B3D00009E570000A3790000A9A300009FFC00009FFF00009FFF00009FFF00
+20640000206400002064000020640000206400002064000021650000216600
+00216700002168000021690000216A0000216B0000226C0000226D0000216F
+00001C760000177D000011840003098B000601920009009C040600A9090300
+B8110100C41D0000CD2D0000D5440000DE650000E38B0000F3EB0000D8FD00
+00D9FD0000DAFE002272000022720000227200002272000022720000227200
+00237300002374000023760000237700002378000023790000237900002379
+000023790000227B00001E830000198A0000149300000F9B00000AA4000003
+AE000300BC010300D1060100E7130000F7240000FF340000FF5C0000FF7600
+00FFA00000FFB20000FFB20000FFB200>
+<41001300410013004100130041001300410013004100130041001300410013
+00410013004100130041001300410013004100130041001300410013004000
+15003F001B004000220042002900490031004E003B00550047005A0056005C
+0068005C007B00580096005800C2005E00FF005E00FF005E00FF005E00FF00
+5E00FF005E00FF004100130041001300410013004100130041001300410013
+00410013004100130041001300410013004100130041001300410013004100
+130041001300400015003F001B004000220042002900490031004E003B0055
+0047005A0056005C0067005C007B00580095005800C0005E00FF005E00FF00
+5E00FF005E00FF005E00FF005E00FF00410013004100130041001300410013
+00410013004100130041001300410013004100130041001300410013004100
+1300410013004100130041001300410014003F001B00400022004200290049
+0031004E003A00550047005A0056005C0067005C007A00580094005800BD00
+5E00FF005E00FF005E00FF005E00FF005E00FF005E00FF0041001300410013
+00410013004100130041001300410013004100130041001300410013004100
+13004100130041001300410013004100130041001300410014003F001B0040
+00220042002900490031004E003A00550046005A0055005C0066005C007900
+590093005800BA005E00FF005E00FF005E00FF005E00FF005E00FF005E00FF
+00410013004100130041001300410013004100130041001300410013004100
+13004100130041001300410013004100130041001300410013004100130041
+0014003F001B004000220042002900490031004E003A005400460059005500
+5C0066005C007900590092005700B8005E00FF005E00FF005E00FF005E00FF
+005E00FF005E00FF0041001300410013004100130041001300410013004100
+13004100130041001300410013004100130041001300410013004100130041
+00130041001300410014003F001B004000220042002800490031004E003A00
+54004600590054005C0065005C007800590091005700B5005E00FF005E00FF
+005E00FF005E00FF005E00FF005E00FF004100130041001300410013004100
+13004100130041001300410013004100130041001300410013004100130041
+001300410013004100130041001300410014003F001B004000220042002800
+490030004E00390054004500590054005C0065005C007700560090005300B7
+005600FF005400FF005300FF005100FF005000FF005000FF00410013004100
+13004100130041001300410013004100130041001300410013004100130041
+0013004100130041001300410013004100130041001300410014003F001B00
+4000210042002800480030004D003900510044005300530053006400510079
+004C0092004900B7004800FE004700FD004600FC004500FC004400FB004300
+FB004100130041001300410013004100130041001300410013004100130041
+00130041001300410013004100130041001300410013004100130041001300
+410014003F001B00400021004000280041002F004400370048004200480053
+004700650046007A00420094003F00B7003D00F6003B00F5003A00F5003900
+F5003900F5003800F400410013004100130041001300410013004100130041
+00130041001300410013004100130041001300410013004100130041001300
+4100130041001300410014003B001A00390020003800260039002D003B0036
+003D0041003D0052003B0065003A007C00360095003400B7003200EE003100
+ED003000ED002F00EC002E00EC002E00EC0041001300410013004100130041
+00130041001300410013004100130041001300410013004100130041001300
+4100130041001300410013003D001200390012003500180032001F00310025
+0131002D003200360031004200300053002E0066002C007B002B0094002A00
+B5002800E7002700E6002600E6002500E5002500E4002400E4004100130041
+00130041001300410013004100130041001300410013004100130041001300
+4100130041001300410013003D0012003900110035001000310010002E0016
+002B001D02290023032A002D00290037002600440025005400230066002100
+7900200090002000AF001F00DA001E00DD001D00DC001D00DC001C00DB001C
+00DA0041001300410013004100130041001300410013004100130041001300
+4100130041001300410013003F0012003A0011003500100030000E002D000D
+002A000E002700140124001B042200230422002D01200038001E0045001B00
+5400190063001700750017008A001700A4001700CA001600D0001500CF0015
+00CE001400CD001400CC004100130041001300410013004100130041001300
+410013004100130041001300410013003B0011003600100031000E002D000D
+002A000C0027000A0024000A01200011041D0018061B00210619002B031600
+35021400410112004E0110005E010F006E010E0080010E0097000E00B6000D
+00BE000C00BD000C00BB010B00BA010B00BA01430012004300120043001200
+43001200430012004300120043001200400011003A000F0034000D002F000C
+002B000A0027000801230007011E0006011B00060218000D07150015091200
+1E080F0027070B002F05090039050600460504005406020067060201770602
+018C050200A7050100AE050000AD050001AD050001AD050001AD043E000F00
+3E000F003E000F003E000F003E000F003E000F003E000F0039000D0032000B
+002D00090029000701230005021D0004021A00020317010102140101040E00
+070B0A00100C0500190B0300220A01012A0900033406000542040006500300
+06640200077401000787020006A2030006AB030006AB030006AB030006AB03
+0006AB0336000A0036000A0036000A0036000A0036000A0036000A0036000A
+00300008002B000602260004021D0002031901000317030002150500021307
+0003110800040202001100040D0C0007170800092105000B2A01000B340000
+0A4100000A5000000A6100000A7101000A840300089E040008AB040008AB04
+0008AB040008AB040008AB042D0004022D0004022D0004022D0004022D0004
+022D0004022D00040229000203200101031C0300031906000217080002140A
+0002110C00020F0E00020B100001000E0206000E0E07000E1706000E200400
+0E2902000E3300000D3F00000D4E00000D5E00000D6F02000D8204000B9A05
+000AAB06000AAB06000AAB06000AAB06000AAB062603000326030003260300
+0326030003260300032603000326030003200500021C080002190B0002150D
+0002121000020F1200010B1300000A1400000A1400000011010600110B0700
+11150700111E05001127020011310100113D0000114C0000115B0100106C02
+00107F04000F9707000DAD07000DAD07000DAD07000DAD07000DAD071F0A00
+011F0A00011F0A00011F0A00011F0A00011F0A00011F0A00011B0D00021710
+000213130001101500000B1600000B1600000C1600000C1700000C17000002
+130006001308080015120700151C06001525030015300100153C0000144A00
+0014590100146A0300147D05001395080011AF090011AF090011AF090011AF
+090011AF091912000119120001191200011912000119120001191200011912
+000116150001111700000D1800000D1900000D1900000D1900000D1A00000D
+1A00000D1A000004170004001706070018100800191A06001A2304001A2E01
+00193A0000194800001957010019670300187A05001793090015B20B0015B2
+0B0015B20B0015B20B0015B20B131A0000131A0000131A0000131A0000131A
+0000131A0000131A00000E1B00000E1B00000E1C00000E1C00000E1C00000F
+1D00000F1D00000F1D00000F1D0000071A000300190308001B0D08001D1707
+001E2105001E2C02001E3801001D4600001D5501001E6503001E7805001D90
+09001AB60C001AB60C001AB60C001AB60C001AB60C0F1E00000F1E00000F1E
+00000F1E00000F1E00000F1E00000F1E00000F1E00000F1F0000101F000010
+200000102000001020000010210000102100001021000009200002001B0108
+001F0A080021140700231E0500232903002435010023440100235301002463
+030024760500238E080020B40C0020BA0C0020BA0C0020BA0C0020BA0C1122
+00001122000011220000112200001122000011220000112200001122000011
+23000011230000112400001124000011240000112500001225000012250000
+0C25000002200008002308080026110700281B0600292603002A3201002B41
+01002A5102002B6103002B7304002A8C070028B10A0027BD0A0027BD0A0027
+BD0A0027BD0A12260000122600001226000012260000122600001226000012
+26000012270000122700001228000012280000122900001329000013290000
+132A0000132A00000E2B00000428000700290509002C0E07002D1806002F23
+0400322E0200353D0100344D0200345E030034710300338A040032AE050031
+C2050031C2050032C2050032C205132B0000132B0000132B0000132B000013
+2B0000132B0000132B0000132C0000132C0000142D0000142D0000142E0000
+142E0000142E0000142F0000142F000010300000072F0005002D030B00320C
+080034150600361F0500392A03003E380200404903003F5B03003F7002003F
+89010040B001003FD001003FD001003FD001003FD001153100001531000015
+31000015310000153100001531000015310000153100001532000015330000
+153300001634000016340000163500001635000016360000123700000A3600
+040034010D0039090A003D1207003E1B060041260400463304004A4404004A
+5803004B6E02004D8800004DB000004BE300004BE300004BE300004BE30017
+38000017380000173800001738000017380000173800001738000017380000
+17390000173A0000173A0000183B0000183C0000183C0000183D0000183D00
+00143F00000D3F0004023D010D0041070C00461008004A1806004C22060050
+2E0500543E060056520500596B02005C8501005CAB000058ED000058ED0000
+58ED000059ED00194000001940000019400000194000001940000019400000
+19400000194000001941000019420000194300001A4300001A4400001A4500
+001A4500001A46000016470000104900020448000C004B050E00510D0A0057
+1507005B1F06005E2A060062380600644B0600686403006B7F00006CA20000
+68E9000068EA000069EA000069EA001B4900001B4900001B4900001B490000
+1B4900001B4900001B4900001B4900001B4A00001C4B00001C4C00001C4C00
+001C4D00001C4E00001C4E00001C4F000019510000135400010955000A0058
+020F005E090C00661108006D1B0500722604007432030076430200785B0200
+7D7700007F9A00007DE800007DFF00007DFF00007EFF001D5300001D530000
+1D5300001D5300001D5300001D5300001D5300001D5300001E5400001E5500
+001E5600001E5700001E5800001E5800001F5900001F5A00001B5D00001661
+00010D6400070267000E006D050C00760C090080140500871E03008A2A0100
+8C3900008E500000916C00009893000093D0000092FF000092FF000092FF00
+1F5E00001F5E00001F5E00001F5E00001F5E00001F5E00001F5E0000205F00
+00206000002061000020620000206300002064000021650000216600002166
+00001E6A00001970000012760003097B00080181010B008B050900950B0500
+A0130200A71D0000AC2C0000AC410000B45F0000BD870000BCBB0000B0F900
+00B0F90000B0F900226C0000226C0000226C0000226C0000226C0000226C00
+00226C0000226D0000226E0000226F00002270000022720000237300002374
+00002375000023750000207B00001C830000178C0000129500000D9F000008
+A8000101B4000400C4030200DE0B0000EF1C0000FE2C0000FF4E0000FF6C00
+00FF920000FFB20000FFB20000FFB200>
+<41001300410013004100130041001300410013004100130041001300410013
+00410013004100130041001300410013004100130041001300410013004100
+13003F0018003F001E004100250046002D004B0035005200400058004E005B
+005F005C0073005A008B005700AE005E00FF005E00FF005E00FF005E00FF00
+5E00FF005E00FF004100130041001300410013004100130041001300410013
+00410013004100130041001300410013004100130041001300410013004100
+130041001300410013003F0018003F001E004100250045002D004B00350052
+00400058004E005B005F005C0072005A008A005700AC005E00FF005E00FF00
+5E00FF005E00FF005E00FF005E00FF00410013004100130041001300410013
+00410013004100130041001300410013004100130041001300410013004100
+1300410013004100130041001300410013003F0017003F001E004100250045
+002D004B0035005100400057004D005B005E005C0071005A0089005700AB00
+5E00FF005E00FF005E00FF005E00FF005E00FF005E00FF0041001300410013
+00410013004100130041001300410013004100130041001300410013004100
+13004100130041001300410013004100130041001300410013003F0017003F
+001E004100250045002C004B0035005100400057004D005B005E005C007100
+5A0088005700A9005E00FF005E00FF005E00FF005E00FF005E00FF005E00FF
+00410013004100130041001300410013004100130041001300410013004100
+13004100130041001300410013004100130041001300410013004100130041
+001300400017003F001E004100250045002C004B00350051003F0057004D00
+5B005D005C0070005A0087005700A7005E00FF005E00FF005E00FF005E00FF
+005E00FF005E00FF0041001300410013004100130041001300410013004100
+13004100130041001300410013004100130041001300410013004100130041
+0013004100130041001300400017003F001E004100250045002C004B003400
+51003F0057004C005B005C005C006F005A0086005700A5005E00FC005E00FF
+005D00FF005B00FF005A00FF005900FF004100130041001300410013004100
+13004100130041001300410013004100130041001300410013004100130041
+00130041001300410013004100130041001300400017003F001E0041002500
+45002C004B00340051003F0057004C005B005C0059006E00550086004F00A7
+005200F5005000FF004E00FF004D00FF004C00FF004B00FF00410013004100
+13004100130041001300410013004100130041001300410013004100130041
+00130041001300410013004100130041001300410013004100130040001700
+3F001E004100240044002C00490034004C003D004F004B004E005C004D0070
+004A0087004600A8004400EA004200FB004100FA004000F9003F00F8003E00
+F8004100130041001300410013004100130041001300410013004100130041
+00130041001300410013004100130041001300410013004100130041001300
+41001300400017003E001D003C0024003D002A003F00320041003B0044004A
+0042005C00410071003F008A003B00A9003800E0003700F3003500F2003400
+F1003400F0003300F000410013004100130041001300410013004100130041
+00130041001300410013004100130041001300410013004100130041001300
+4100130041001300400012003B00160037001C003500220035002900360031
+0036003B003700490036005D003400720031008A002F00A9002D00D8002C00
+EB002B00EA002A00E9002900E9002900E80041001300410013004100130041
+00130041001300410013004100130041001300410013004100130041001300
+41001300410013003F0012003B001100370010003300140030001A002D0020
+022D0028012D0031002C003C002A004B0029005D0027007100250088002400
+A6002300D0002200E2002100E2002100E1002000E0002000DF004100130041
+00130041001300410013004100130041001300410013004100130041001300
+4100130041001300400012003B0011003600100032000F002F000E002C0012
+002900180226001F04250027022500320023003E0020004C001E005D001C00
+6F001B0084001A009E001A00C3001900D7001900D6001800D5001700D40017
+00D30041001300410013004100130041001300410013004100130041001300
+4100130041001300410013003C0011003700100032000F002E000E002B000D
+0028000C0025000F01220017041F001E051E0027021C0032001A003E001700
+4C0015005B0013006B0011007E00110095001100B4001100C8001000C6000F
+00C5000F00C4000E00C3004100130041001300410013004100130041001300
+4100130041001300410013003F0012003900110033000F002E000E002A000D
+0027000C0024000B0021000A001E000E021B00150418001E04170027011400
+310011003B000E0048000C0057000A0068000900780008008C000800A70008
+00B7000700B5000600B4000600B3000500B2003C0011003C0011003C001100
+3C0011003C0011003C0011003C0011003B001100350010002F000E002B000D
+0027000C0023000A001F0009001C0008001900070016000B03130014041100
+1D030E0026010C002E00090037000600440004005000020064000100730001
+01850100019F000001AC000002AC000002AC000002AC000002AC0032000F00
+32000F0032000F0032000F0032000F0032000F0032000F0031000F002C000D
+0028000C0023000A001F0009001B0007001700060114000401110003010E00
+0704090011060600190403002103010029030002310100033E0000034C0000
+036100000370000003810000039B010003AB010003AB010003AB010003AB01
+0003AB012B000B002B000B002B000B002B000B002B000B002B000B002B000B
+002A000B00250009011F0007011A0005011600030212000202100101020F03
+00020D0400020101000D00030F040005160300051F02000528010005300000
+053B0000054B0000055E0000066D0000057E01000596010004AB020004AB02
+0004AB020004AB020004AB0222000601220006012200060122000601220006
+012200060122000601200006021A0003021601010213020003110400020F06
+00020C090002070D0001060E0000010D010300090C050008140500081D0300
+08260200082F0000083A00000849000008590000086A0000087B0100079203
+0006AB030006AB030006AB030006AB030006AB031801010318010103180101
+03180101031801010318010103180101031802010315040002120700030E0A
+00030B0D000207100000071000000710000007100000030F0002000D090600
+0C1306000C1C04000C2402000C2D01000C3800000B4600000B5600000B6701
+000B7902000A8F040009AB050009AB050009AB050009AB050009AB05150900
+0315090003150900031509000315090003150900031509000314090003100D
+00020C10000108120000091200000912000009120000091200000913000005
+11000200100606000F1007000F1A060010230300102C01000F3700000F4400
+000F5400000F6401000E7603000E8C05000CA906000CAC06000CAC06000CAC
+07000CAC070F1200010F1200010F1200010F1200010F1200010F1200010F12
+00010E1200010A1400000A1400000A1400000A1500000B1500000B1500000B
+1500000B160000071400020012030600130D08001317070014210500142A02
+0013350000134200001351000013610100127303001289060010A708000FAE
+08000FAE08000FAE090010AE090B1600000B1600000B1600000B1600000B16
+00000B1600000B1600000C1600000C1700000C1700000C1800000C1800000C
+1800000D1800000D1900000D1900000A1800010115010700160A0800181407
+00181E0500182803001833010018400000174F0000175F0200177004001786
+070015A40A0014B10A0014B10A0014B10B0014B10B0D1A00000D1A00000D1A
+00000D1A00000D1A00000D1A00000D1A00000D1A00000E1A00000E1B00000E
+1B00000E1B00000E1C00000E1C00000E1C00000E1D00000C1C000002180006
+001A0807001B1108001D1B06001D2503001D3101001D3E00001C4D01001C5D
+02001C6E04001C8307001AA20B0019B50C0019B50C0019B50C0019B50C0F1E
+00000F1E00000F1E00000F1E00000F1E00000F1E00000F1E00000F1E00000F
+1E00000F1F00000F1F0000101F000010200000102000001020000010210000
+0E210000051C0004001C050800200E08002218060023230400232E0200233B
+0100224A0100235A0200236B040023810600219F0A001FBA0C001FBA0C001F
+BA0C001FBA0C11220000112200001122000011220000112200001122000011
+22000011220000112200001123000011230000112400001124000011240000
+112500001225000010250000082400030020020900250B0700261507002820
+05002A2B02002B3801002A4801002A5802002B6903002B7E0500299D080027
+BC0A0027BC0A0027BD0A0027BD0A1227000012270000122700001227000012
+27000012270000122700001227000012270000122800001228000012290000
+1329000013290000132A0000132A0000112A00000B2B000202280109002B08
+08002D1207002E1C0500302703003334020036430100355502003567030035
+7C0400339B050032C2050032C3050032C3050032C305132C0000132C000013
+2C0000132C0000132C0000132C0000132C0000132C0000142C0000142D0000
+142E0000142E0000142E0000142F0000142F000014300000133000000D3100
+01032F00090030060A00350F070036180600382304003C2F0300413E030041
+51030040640300417B0100409A010041D2010041D2010041D3010041D30115
+32000015320000153200001532000015320000153200001532000015320000
+15330000163400001634000016350000163500001636000016360000163700
+001538000010390001063700080037040C003C0C090040150600411F050045
+2A04004A3904004C4B04004D6103004F7A0000519A00004ED900004EE60000
+4EE600004EE600173A0000173A0000173A0000173A0000173A0000173A0000
+173A0000173A0000173B0000183C0000183C0000183D0000183D0000183E00
+00193F0000193F00001840000012410000094100070040020F00450A0B004B
+1207004E1B06005125060056330600584506005B5C04005F76010061950100
+5DCA00005CED00005DED00005DED0019430000194300001943000019430000
+1943000019430000194300001A4300001A4400001A4400001A4500001A4600
+001A4700001B4700001B4800001B4800001A490000154C00000D4D0005014C
+000F0051070D00580F09005F18060063220600662E0500683E06006B540400
+6F6E0100728C000070BC00006FF3000070F3000070F3001C4D00001C4D0000
+1C4D00001C4D00001C4D00001C4D00001C4D00001C4D00001C4E00001C4E00
+001D4F00001D5000001D5100001D5200001D5200001D5300001D5400001857
+0000115A0004065C000C0060040E00670B0B0070130700781D04007C280200
+7E3601007F490000826300008784000088B7000085FF000086FF000086FF00
+1E5800001E5800001E5800001E5800001E5800001E5800001E5800001E5800
+001F5900001F5A00001F5B00001F5C00001F5D00001F5E00001F5E0000205F
+00001F6000001B650000156A00020C6D00070271000D007A050B00830C0700
+8D140400941E0200972B0000993D00009C570000A27B0000A6AA00009DFF00
+009DFF00009DFF002165000021650000216500002165000021650000216500
+002165000021650000216700002168000021690000216A0000216B0000226C
+0000226D0000226D0000226E00001D750000197D0000138400010B8B000503
+930008009B030700A9080400B90E0100C71A0000D22A0000E2410000E66500
+00EA8C0000E1FF0000E0FF0000E0FF00>
+<41001300410013004100130041001300410013004100130041001300410013
+00410013004100130041001300410013004100130041001300410013004100
+1300410014003F001B004000210042002800490031004E003B00550047005A
+0057005C0069005B00800058009F005C00EA005E00FF005E00FF005E00FF00
+5E00FF005E00FF004100130041001300410013004100130041001300410013
+00410013004100130041001300410013004100130041001300410013004100
+13004100130041001300410014003F001B004000210042002800490031004E
+003A00550047005A0057005C0069005B007F0058009E005B00DF005E00FF00
+5E00FF005E00FF005E00FF005E00FF00410013004100130041001300410013
+00410013004100130041001300410013004100130041001300410013004100
+130041001300410013004100130041001300410014003F001A004000210042
+002800490031004E003A00550047005A0056005C0068005B007E0058009C00
+5A00D6005E00FF005E00FF005E00FF005E00FF005E00FF0041001300410013
+00410013004100130041001300410013004100130041001300410013004100
+1300410013004100130041001300410013004100130041001300410014003F
+001A004000210042002800490030004E003A00550046005A0056005C006800
+5C007D0058009B005900D1005E00FF005E00FF005E00FF005E00FF005E00FF
+00410013004100130041001300410013004100130041001300410013004100
+13004100130041001300410013004100130041001300410013004100130041
+001300410013003F001A004000210042002800480030004E003A0055004600
+5A0055005C0067005C007C00580099005900CC005E00FF005E00FF005E00FF
+005E00FF005E00FF0041001300410013004100130041001300410013004100
+13004100130041001300410013004100130041001300410013004100130041
+0013004100130041001300410013003F001A003F0021004200280048003000
+4E00390054004600590055005C0067005C007B00580098005800C9005B00FF
+005900FF005700FF005600FF005400FF004100130041001300410013004100
+13004100130041001300410013004100130041001300410013004100130041
+00130041001300410013004100130041001300410013003F001A003F002100
+42002800480030004D00390054004500560054005600660053007C004D0099
+004B00CD004B00FF004A00FE004800FE004700FD004600FC00410013004100
+13004100130041001300410013004100130041001300410013004100130041
+00130041001300410013004100130041001300410013004100130041001300
+3F001A003F0021004100270042002E00460037004A0043004A005400490067
+0047007E0042009B004000CA003E00F7003C00F6003B00F5003A00F5003900
+F5004100130041001300410013004100130041001300410013004100130041
+00130041001300410013004100130041001300410013004100130041001300
+41001300410013003C0019003A001F00380026003A002D003C0036003E0042
+003E0053003C0068003A00800037009C003400C8003200EF003100ED003000
+ED002F00EC002E00EC00410013004100130041001300410013004100130041
+00130041001300410013004100130041001300410013004100130041001300
+41001300410013003D0012003A0011003500170032001E003100240131002C
+003100360031004200300054002E0068002C007F002A009C002900C4002700
+E7002600E6002500E5002500E4002400E40041001300410013004100130041
+00130041001300410013004100130041001300410013004100130041001300
+41001300410013003D0012003900110034000F0031000F002E0015002A001C
+022800230429002C012800370026004400240055002100680020007D001F00
+97001E00BB001E00DD001D00DC001C00DA001B00D9001B00D9004100130041
+00130041001300410013004100130041001300410013004100130041001300
+41001300410013003E0012003900110034000F0030000E002C000D0029000D
+002600130123001A042100220421002C001E0038001C004500190055001700
+65001500780015008F001500AE001500CF001400CD001300CC001200CB0012
+00CA0041001300410013004100130041001300410013004100130041001300
+4100130041001300400012003A00110034000F0030000E002C000D0028000C
+0025000B0022000A001F0011031C0019041A00220319002C00160037001300
+4300100052000E0062000D0073000C0087000B00A1000B00BE000A00BC000A
+00BA000900B9000900B8004000120040001200400012004000120040001200
+4000120040001200400012003C0011003600100030000E002C000D0028000C
+0024000B0021000A001D0009001A0008001700100415001804120022021000
+2B000D0034000A003F0008004D0006005E0005006E0003007F000200980002
+00AE000201AE000101AD000101AD000101AD00350010003500100035001000
+350010003500100035001000350010003500100032000F002D000D0028000C
+0024000B0020000A001C0008001800070015000600130005000F000E040C00
+18030A0020010700280004002F00020039000100480000015B0000016C0000
+017C00000295000001AC000001AC000001AC000001AC000001AC002C000D00
+2C000D002C000D002C000D002C000D002C000D002C000D002C000D0029000C
+0025000B0020000A001B0008001700070014000600110004000F0003000D00
+020006000E020300150101001D000000260000002D00000037000000470000
+015A0000016B0000017B00000293000001AB000001AC000001AC000001AC00
+0001AC0024000B0024000B0024000B0024000B0024000B0024000B0024000B
+0024000B0021000A001C0008001700070013000500100004000E0002000C00
+0100060000000000000000000E000000140000001D000000250000002C0000
+013600000146000001590000016A0000027900000290000002A9000002AC00
+0002AC000002AC000002AC001A0008001A0008001A0008001A0008001A0008
+001A0008001A0008001A0008001800070013000501100003010E0102010B02
+00010204000002050000020600000206000000030C020003120200031B0100
+03240100032B00000335000003440000045400000467000004760000048B00
+0003A6010003AB010003AB010003AB010003AB011100020211000202110002
+021100020211000202110002021100020211000202100101020E0300010905
+0002040B0000040C0000040C0000040D0000040D0000050D00000009070300
+061104000619030006220200062A0100063400000641000007500000076300
+00077401000687010005A3020005AB020005AB020005AB020005AB020C0700
+020C0700020C0700020C0700020C0700020C0700020C0700020C0700020A0A
+0002050E0000050E0000060E0000060F0000060F0000060F0000060F000007
+0F0000000D0304000A0E06000A1705000A2003000A2901000A3200000A3F00
+000A4E00000A6000000A71010009840300089F040007AB040007AB040007AB
+040007AB040710000007100000071000000710000007100000071000000710
+00000710000007100000071000000810000008110000081100000811000008
+110000081200000912000001100104000E0B07000E1506000E1E04000E2702
+000E3100000E3D00000D4C00000D5C00000D6D02000D8104000B9A05000AAB
+06000AAB06000AAB06000AAB06091200000912000009120000091200000912
+000009120000091200000912000009130000091300000A1300000A1300000A
+1400000A1400000A1400000A1500000B150000031200040011080700121207
+00121C060012250300122F0100123B00001249000011590100116A0200117E
+0400109707000EAD08000EAD08000EAD08000EAD080B1600000B1600000B16
+00000B1600000B1600000B1600000B1600000B1600000B1600000B1600000C
+1700000C1700000C1700000C1800000C1800000C1800000C18000006160003
+0015050700160F08001719070017230400172D020017390000164700001656
+010016670200167B05001594080013B00A0013B00A0013B00A0013B00A0D19
+00000D1900000D1900000D1900000D1900000D1900000D1900000D1900000D
+1A00000D1A00000E1A00000E1B00000E1B00000E1B00000E1C00000E1C0000
+0E1C0000081A000200180208001A0B08001C1607001C2005001D2A02001C36
+00001C4400001C5401001C6503001C7805001B92090018B40C0018B40C0018
+B40C0018B50C0F1E00000F1E00000F1E00000F1E00000F1E00000F1E00000F
+1E00000F1E00000F1E00000F1E00000F1F00000F1F0000101F000010200000
+1020000010200000102000000B200001021B0107001E09080020120800221D
+0600232703002334010022420100225201002262030023750500228F08001F
+B90D001FB90D001FB90C001FB90C1122000011220000112200001122000011
+22000011220000112200001122000011220000112300001123000011240000
+11240000112400001125000012250000122500000D26000004220006002205
+0800260F070027190600292404002A3002002B3E01002A4F02002B6003002B
+7304002A8C070028B50A0027BD0A0027BD0A0028BD0A122700001227000012
+27000012270000122700001227000012270000122700001228000012280000
+122800001329000013290000132A0000132A0000132A0000132B00000F2B00
+00072A00050028030A002D0C07002E15070030200400332C0300363A020037
+4B0200365D030036700300358A030034B2040034C4050034C4050034C40414
+2D0000142D0000142D0000142D0000142D0000142D0000142D0000142D0000
+142D0000142E0000142E0000142F0000142F00001530000015300000153100
+0015310000123200000A320003002F010C003309090037120600381C06003B
+270400403403004445030043590300436E02004389000045B5000044D70000
+44D7000044D700163400001634000016340000163400001634000016340000
+16340000163400001635000016350000163600001636000016370000173800
+00173800001739000017390000143A00000E3B00020238000C003B070C0041
+0F080043180600452205004A2F05004E3F050050540400526C020054880000
+54B3000051E9000051EA000051EA00183D0000183D0000183D0000183D0000
+183D0000183D0000183D0000183D0000183D0000183E0000183F0000193F00
+00194000001940000019410000194200001942000017430000114500010643
+000B0045040E004C0C0A0051150700541E0600582906005C3906005E4C0600
+626602006582000065A9000062EA000062EA000062EA001A4600001A460000
+1A4600001A4600001A4600001A4600001A4600001A4600001B4700001B4800
+001B4900001B4900001B4A00001B4B00001C4B00001C4C00001C4C00001A4E
+0000145100000A5200080053020F0059090C0061110800681A06006C250500
+6F32040071440400745D0200797900007AA0000078FC000078FC000079FD00
+1D5100001D5100001D5100001D5100001D5100001D5100001D5100001D5100
+001D5200001D5300001D5400001E5500001E5500001E5600001E5700001E58
+00001E5800001C5B0000175F00000F6200050464000D006A040D00730B0900
+7C140600841E0300872A0100893900008B5000008E6E00009598000090EE00
+008FFF00008FFF001F5E00001F5E00001F5E00001F5E00001F5E00001F5E00
+001F5E00001F5E0000205F0000206000002061000020620000206300002064
+00002165000021660000216600001F6900001A6F0000147500020B7A000703
+80000B0089040900930A06009F110300A71C0000AC2A0000AD3F0000B55F00
+00BE8A0000B9CE0000B0F90000B1F900>
+] 4 { dup 0.1 lt { 1.2 mul 0.02 sub } if
+ dup 0 lt { pop 0 } if
+ } bind dup dup dup ]
+/RenderingIntent (Perceptual)
+>>
+setcolorrendering
diff --git a/crd/2300w-1200@150-l250-kx,ucr100,50-per.crd b/crd/2300w-1200@150-l250-kx,ucr100,50-per.crd
new file mode 100644
index 0000000..804cd82
--- /dev/null
+++ b/crd/2300w-1200@150-l250-kx,ucr100,50-per.crd
@@ -0,0 +1,4684 @@
+<<
+/ColorRenderingType 1
+/BlackPoint [0.000000 0.000000 0.000000]
+/WhitePoint [0.964200 1.000000 0.824900]
+% Bradford Cone Space
+/MatrixPQR [0.8951 -0.7502 0.0389 0.2664 1.7135 -0.0685 -0.1614 0.0367 1.0296 ]
+/RangePQR [ -0.5 2 -0.5 2 -0.5 2 ]
+% VonKries-like transform in Bradford Cone Space
+/TransformPQR [
+{exch pop exch 3 get mul exch pop exch 3 get div} bind
+{exch pop exch 4 get mul exch pop exch 4 get div} bind
+{exch pop exch 5 get mul exch pop exch 5 get div} bind
+]
+/EncodeLMN [
+{ 0.964200 div dup 0.008856 le {7.787 mul 16 116 div add}{1 3 div exp} ifelse } bind
+{ 1.000000 div dup 0.008856 le {7.787 mul 16 116 div add}{1 3 div exp} ifelse } bind
+{ 0.824900 div dup 0.008856 le {7.787 mul 16 116 div add}{1 3 div exp} ifelse } bind
+]
+/MatrixABC [ 0 1 0 1 -1 1 0 0 -1 ]
+/EncodeABC [
+{ 116 mul 16 sub 100 div } bind
+{ 500 mul 128 add 255 div } bind
+{ 200 mul 128 add 255 div } bind
+]
+/RenderTable [ 33 33 33 [
+<1C0D00DF1C0D00DF1C0D00DF1C0D00DF1C0D00DF1C0D00DF1C0D00DF1C0D00
+DF1C0D00DF1C0D00DF1C0D00DF1C0D00DF1C0D00DF1C0D00DF1C0D00DF1C0D
+00DF1C0D00DF1C0D00DF1C0D00DF1C0D00DF1C0D00DF1C0D00DF1C0D00DF1C
+0D00DF1C0D00DF1C0D00DF1C0D00DF1C0D00DF1C0D00DF1C0D00DF1C0D00DF
+1C0D00DF1C0D00DF1C0D00DF1C0D00DF1C0D00DF1C0D00DF1C0D00DF1C0D00
+DF1C0D00DF1C0D00DF1C0D00DF1C0D00DF1C0D00DF1C0D00DF1C0D00DF1C0D
+00DF1C0D00DF1C0D00DF1C0D00DF1C0D00DF1C0D00DF1C0D00DF1C0D00DF1C
+0D00DF1C0D00DF1C0D00DF1C0D00DF1C0D00DF1C0D00DF1C0D00DF1C0D00DF
+1C0D00DF1C0D00DF1C0D00DF1C0D00DF1C0D00DF1C0D00DF1C0D00DF1C0D00
+DF1C0D00DF1C0D00DF1C0D00DF1C0D00DF1C0D00DF1C0D00DF1C0D00DF1C0D
+00DF1C0D00DF1C0D00DF1C0D00DF1C0D00DF1C0D00DF1C0D00DF1C0D00DF1C
+0D00DF1C0D00DF1C0D00DF1C0D00DF1C0D00DF1C0D00DF1C0D00DF1C0D00DF
+1C0D00DF1C0D00DF1C0D00DF1C0D00DF1C0D00DF1C0D00DF1C0D00DF1C0D00
+DF1C0D00DF1C0D00DF1C0D00DF1C0D00DF1C0D00DF1C0D00DF1C0D00DF1C0D
+00DF1C0D00DF1C0D00DF1C0D00DF1C0D00DF1C0D00DF1C0D00DF1C0D00DF1C
+0D00DF1C0D00DF1C0D00DF1C0D00DF1C0D00DF1C0D00DF1C0D00DF1C0D00DF
+1C0D00DF1C0D00DF1C0D00DF1C0D00DF1C0D00DF1C0D00DF1C0D00DF1C0D00
+DF1C0D00DF1C0D00DF1C0D00DF1C0D00DF1C0D00DF1C0D00DF1C0D00DF1C0D
+00DF1C0D00DF1C0D00DF1C0D00DF1C0D00DF1C0D00DF1C0D00DF1C0D00DF1C
+0D00DF1C0D00DF1C0D00DF1C0D00DF1C0D00DF1C0D00DF1C0D00DF1C0D00DF
+1C0D00DF1C0D00DF1C0D00DF1C0D00DF1C0D00DF1C0D00DF1C0D00DF1C0D00
+DF1C0D00DF1C0D00DF1C0D00DF1C0D00DF1C0D00DF1C0D00DF1C0D00DF1C0D
+00DF1C0D00DF1C0D00DF1C0D00DF1C0D00DF1C0D00DF1C0D00DF1C0D00DF1C
+0D00DF1C0D00DF1C0D00DF1C0D00DF1C0D00DF1C0D00DF1C0D00DF1C0D00DF
+1C0D00DF1C0D00DF1C0D00DF1C0D00DF1C0D00DF1C0D00DF1C0D00DF1C0D00
+DF1C0D00DF1C0D00DF1C0D00DF1C0D00DF1C0D00DF1C0D00DF1C0D00DF1C0D
+00DF1C0D00DF1C0D00DF1C0D00DF1C0D00DF1C0D00DF1C0D00DF1C0D00DF1C
+0D00DF1C0D00DF1C0D00DF1C0D00DF1C0D00DF1C0D00DF1C0D00DF1C0D00DF
+1C0D00DF1C0D00DF1C0D00DF1C0D00DF1C0D00DF1C0D00DF1C0D00DF1C0D00
+DF1C0D00DF1C0D00DF1C0D00DF1C0D00DF1C0D00DF1C0D00DF1C0D00DF1C0D
+00DF1C0D00DF1C0D00DF1C0D00DF1C0D00DF1C0D00DF1C0D00DF1C0D00DF1C
+0D00DF1C0D00DF1C0D00DF1C0D00DF1C0D00DF1C0D00DF1C0D00DF1C0D00DF
+1C0D00DF1C0D00DF1C0D00DF1C0D00DF1C0D00DF1C0D00DF1C0D00DF1C0D00
+DF1C0D00DF1C0D00DF1C0D00DF1C0D00DF1C0D00DF1C0D00DF1C0D00DF1C0D
+00DF1C0D00DF1C0D00DF1C0D00DF1C0D00DF1C0D00DF1C0D00DF1C0D00DF1C
+0D00DF1C0D00DF1C0D00DF1C0D00DF1C0D00DF1C0D00DF1C0D00DF1C0D00DF
+1C0D00DF1C0D00DF1C0D00DF1C0D00DF1C0D00DF1C0D00DF1C0D00DF1C0D00
+DF1C0D00DF1C0D00DF1C0D00DF1C0D00DF1C0D00DF1C0D00DF1C0D00DF1C0D
+00DF1C0D00DF1C0D00DF1C0D00DF1C0D00DF1C0D00DF1C0D00DF1C0D00DF1C
+0D00DF1C0D00DF1C0D00DF1C0D00DF1C0D00DF1C0D00DF1C0D00DF1C0D00DF
+1C0D00DF1C0D00DF1C0D00DF1C0D00DF1C0D00DF1C0D00DF1C0D00DF1C0D00
+DF1C0D00DF1C0D00DF1C0D00DF1C0D00DF1C0D00DF1C0D00DF1C0D00DF1C0D
+00DF1C0D00DF1C0D00DF1C0D00DF1C0D00DF1C0D00DF1C0D00DF1C0D00DF1C
+0D00DF1C0D00DF1C0D00DF1C0D00DF1C0D00DF1C0D00DF1C0D00DF1C0D00DF
+1C0D00DF1C0D00DF1C0D00DF1C0D00DF1C0D00DF1C0D00DF1C0D00DF1C0D00
+DF1C0D00DF1C0D00DF1C0D00DF1C0D00DF1C0D00DF1C0D00DF1C0D00DF1C0D
+00DF1C0D00DF1C0D00DF1C0D00DF1C0D00DF1C0D00DF1C0D00DF1C0D00DF1C
+0D00DF1C0D00DF1C0D00DF1C0D00DF1C0D00DF1C0D00DF1C0D00DF1C0D00DF
+1C0D00DF1C0D00DF1C0D00DF1C0D00DF1C0D00DF1C0D00DF1C0D00DF1C0D00
+DF1C0D00DF1C0D00DF1C0D00DF1C0D00DF1C0D00DF1C0D00DF1C0D00DF1C0D
+00DF1C0D00DF1C0D00DF1C0D00DF1C0D00DF1C0D00DF1C0D00DF1C0D00DF1C
+0D00DF1C0D00DF1C0D00DF1C0D00DF1C0D00DF1C0D00DF1C0D00DF1C0D00DF
+1C0D00DF1C0D00DF1C0D00DF1C0D00DF1C0D00DF1C0D00DF1C0D00DF1C0D00
+DF1C0D00DF1C0D00DF1C0D00DF1C0D00DF1C0D00DF1C0D00DF1C0D00DF1C0D
+00DF1C0D00DF1C0D00DF1C0D00DF1C0D00DF1C0D00DF1C0D00DF1C0D00DF1C
+0D00DF1C0D00DF1C0D00DF1C0D00DF1C0D00DF1C0D00DF1C0D00DF1C0D00DF
+1C0D00DF1C0D00DF1C0D00DF1C0D00DF1C0D00DF1C0D00DF1C0D00DF1C0D00
+DF1C0D00DF1C0D00DF1C0D00DF1C0D00DF1C0D00DF1C0D00DF1C0D00DF1C0D
+00DF1C0D00DF1C0D00DF1C0D00DF1C0D00DF1C0D00DF1C0D00DF1C0D00DF1C
+0D00DF1C0D00DF1C0D00DF1C0D00DF1C0D00DF1C0D00DF1C0D00DF1C0D00DF
+1C0D00DF1C0D00DF1C0D00DF1C0D00DF1C0D00DF1C0D00DF1C0D00DF1C0D00
+DF1C0D00DF1C0D00DF1C0D00DF1C0D00DF1C0D00DF1C0D00DF1C0D00DF1C0D
+00DF1C0D00DF1C0D00DF1C0D00DF1C0D00DF1C0D00DF1C0D00DF1C0D00DF1C
+0D00DF1C0D00DF1C0D00DF1C0D00DF1C0D00DF1C0D00DF1C0D00DF1C0D00DF
+1C0D00DF1C0D00DF1C0D00DF1C0D00DF1C0D00DF1C0D00DF1C0D00DF1C0D00
+DF1C0D00DF1C0D00DF1C0D00DF1C0D00DF1C0D00DF1C0D00DF1C0D00DF1C0D
+00DF1C0D00DF1C0D00DF1C0D00DF1C0D00DF1C0D00DF1C0D00DF1C0D00DF1C
+0D00DF1C0D00DF1C0D00DF1C0D00DF1C0D00DF1C0D00DF1C0D00DF1C0D00DF
+1C0D00DF1C0D00DF1C0D00DF1C0D00DF1C0D00DF1C0D00DF1C0D00DF1C0D00
+DF1C0D00DF1C0D00DF1C0D00DF1C0D00DF1C0D00DF1C0D00DF1C0D00DF1C0D
+00DF1C0D00DF1C0D00DF1C0D00DF1C0D00DF1C0D00DF1C0D00DF1C0D00DF1C
+0D00DF1C0D00DF1C0D00DF1C0D00DF1C0D00DF1C0D00DF1C0D00DF1C0D00DF
+1C0D00DF1C0D00DF1C0D00DF1C0D00DF1C0D00DF1C0D00DF1C0D00DF1C0D00
+DF1C0D00DF1C0D00DF1C0D00DF1C0D00DF1C0D00DF1C0D00DF1C0D00DF1C0D
+00DF1C0D00DF1C0D00DF1C0D00DF1C0D00DF1C0D00DF1C0D00DF1C0D00DF1C
+0D00DF1C0D00DF1C0D00DF1C0D00DF1C0D00DF1C0D00DF1C0D00DF1C0D00DF
+1C0D00DF1C0D00DF1C0D00DF1C0D00DF1C0D00DF1C0D00DF1C0D00DF1C0D00
+DF1C0D00DF1C0D00DF1C0D00DF1C0D00DF1C0D00DF1C0D00DF1C0D00DF1C0D
+00DF1C0D00DF1C0D00DF1C0D00DF1C0D00DF1C0D00DF1C0D00DF1C0D00DF1C
+0D00DF1C0D00DF1C0D00DF1C0D00DF1C0D00DF1C0D00DF1C0D00DF1C0D00DF
+1C0D00DF1C0D00DF1C0D00DF1C0D00DF1C0D00DF1C0D00DF1C0D00DF1C0D00
+DF1C0D00DF1C0D00DF1C0D00DF1C0D00DF1C0D00DF1C0D00DF1C0D00DF1C0D
+00DF1C0D00DF1C0D00DF1C0D00DF1C0D00DF1C0D00DF1C0D00DF1C0D00DF1C
+0D00DF1C0D00DF1C0D00DF1C0D00DF1C0D00DF1C0D00DF1C0D00DF1C0D00DF
+1C0D00DF1C0D00DF1C0D00DF1C0D00DF1C0D00DF1C0D00DF1C0D00DF1C0D00
+DF1C0D00DF1C0D00DF1C0D00DF1C0D00DF1C0D00DF1C0D00DF1C0D00DF1C0D
+00DF1C0D00DF1C0D00DF1C0D00DF1C0D00DF1C0D00DF1C0D00DF1C0D00DF1C
+0D00DF1C0D00DF1C0D00DF1C0D00DF1C0D00DF1C0D00DF1C0D00DF1C0D00DF
+1C0D00DF1C0D00DF1C0D00DF1C0D00DF1C0D00DF1C0D00DF1C0D00DF1C0D00
+DF1C0D00DF1C0D00DF1C0D00DF1C0D00DF1C0D00DF1C0D00DF1C0D00DF1C0D
+00DF1C0D00DF1C0D00DF1C0D00DF1C0D00DF1C0D00DF1C0D00DF1C0D00DF1C
+0D00DF1C0D00DF1C0D00DF1C0D00DF1C0D00DF1C0D00DF1C0D00DF1C0D00DF
+1C0D00DF1C0D00DF1C0D00DF1C0D00DF1C0D00DF1C0D00DF1C0D00DF1C0D00
+DF1C0D00DF1C0D00DF1C0D00DF1C0D00DF1C0D00DF1C0D00DF1C0D00DF1C0D
+00DF1C0D00DF1C0D00DF1C0D00DF1C0D00DF1C0D00DF1C0D00DF1C0D00DF1C
+0D00DF1C0D00DF1C0D00DF1C0D00DF1C0D00DF1C0D00DF1C0D00DF1C0D00DF
+1C0D00DF1C0D00DF1C0D00DF1C0D00DF1C0D00DF1C0D00DF1C0D00DF1C0D00
+DF1C0D00DF1C0D00DF1C0D00DF1C0D00DF1C0D00DF1C0D00DF1C0D00DF1C0D
+00DF1C0D00DF1C0D00DF1C0D00DF1C0D00DF1C0D00DF1C0D00DF1C0D00DF1C
+0D00DF1C0D00DF1C0D00DF1C0D00DF1C0D00DF1C0D00DF1C0D00DF1C0D00DF
+1C0D00DF1C0D00DF1C0D00DF1C0D00DF1C0D00DF1C0D00DF1C0D00DF1C0D00
+DF1C0D00DF1C0D00DF1C0D00DF1C0D00DF1C0D00DF1C0D00DF1C0D00DF1C0D
+00DF1C0D00DF1C0D00DF1C0D00DF1C0D00DF1C0D00DF1C0D00DF1C0D00DF1C
+0D00DF1C0D00DF1C0D00DF1C0D00DF1C0D00DF1C0D00DF1C0D00DF1C0D00DF
+1C0D00DF1C0D00DF1C0D00DF1C0D00DF1C0D00DF1C0D00DF1C0D00DF1C0D00
+DF1C0D00DF1C0D00DF1C0D00DF1C0D00DF1C0D00DF1C0D00DF1C0D00DF1C0D
+00DF1C0D00DF1C0D00DF1C0D00DF1C0D00DF1C0D00DF1C0D00DF1C0D00DF1C
+0D00DF1C0D00DF1C0D00DF1C0D00DF1C0D00DF1C0D00DF1C0D00DF1C0D00DF
+1C0D00DF1C0D00DF1C0D00DF1C0D00DF1C0D00DF1C0D00DF1C0D00DF1C0D00
+DF1C0D00DF1C0D00DF1C0D00DF1C0D00DF1C0D00DF1C0D00DF1C0D00DF1C0D
+00DF1C0D00DF1C0D00DF1C0D00DF1C0D00DF1C0D00DF1C0D00DF1C0D00DF1C
+0D00DF1C0D00DF1C0D00DF1C0D00DF1C0D00DF1C0D00DF1C0D00DF1C0D00DF
+1C0D00DF1C0D00DF1C0D00DF1C0D00DF1C0D00DF1C0D00DF1C0D00DF1C0D00
+DF1C0D00DF1C0D00DF1C0D00DF1C0D00DF1C0D00DF1C0D00DF1C0D00DF1C0D
+00DF1C0D00DF1C0D00DF1C0D00DF1C0D00DF1C0D00DF1C0D00DF1C0D00DF1C
+0D00DF1C0D00DF1C0D00DF1C0D00DF1C0D00DF1C0D00DF1C0D00DF1C0D00DF
+1C0D00DF1C0D00DF1C0D00DF1C0D00DF1C0D00DF1C0D00DF1C0D00DF1C0D00
+DF1C0D00DF1C0D00DF1C0D00DF1C0D00DF1C0D00DF1C0D00DF1C0D00DF1C0D
+00DF1C0D00DF1C0D00DF1C0D00DF1C0D00DF1C0D00DF1C0D00DF1C0D00DF1C
+0D00DF1C0D00DF1C0D00DF1C0D00DF1C0D00DF1C0D00DF1C0D00DF1C0D00DF
+1C0D00DF1C0D00DF1C0D00DF1C0D00DF1C0D00DF1C0D00DF1C0D00DF1C0D00
+DF1C0D00DF1C0D00DF1C0D00DF1C0D00DF1C0D00DF1C0D00DF1C0D00DF1C0D
+00DF1C0D00DF1C0D00DF1C0D00DF1C0D00DF1C0D00DF1C0D00DF1C0D00DF1C
+0D00DF1C0D00DF1C0D00DF1C0D00DF1C0D00DF1C0D00DF1C0D00DF1C0D00DF
+1C0D00DF1C0D00DF1C0D00DF1C0D00DF1C0D00DF1C0D00DF1C0D00DF1C0D00
+DF1C0D00DF1C0D00DF1C0D00DF1C0D00DF1C0D00DF1C0D00DF1C0D00DF1C0D
+00DF1C0D00DF1C0D00DF1C0D00DF1C0D00DF1C0D00DF1C0D00DF1C0D00DF1C
+0D00DF1C0D00DF1C0D00DF1C0D00DF1C0D00DF1C0D00DF1C0D00DF1C0D00DF
+1C0D00DF1C0D00DF1C0D00DF1C0D00DF1C0D00DF1C0D00DF1C0D00DF1C0D00
+DF1C0D00DF1C0D00DF1C0D00DF1C0D00DF1C0D00DF1C0D00DF1C0D00DF1C0D
+00DF1C0D00DF1C0D00DF1C0D00DF1C0D00DF1C0D00DF1C0D00DF1C0D00DF1C
+0D00DF1C0D00DF1C0D00DF1C0D00DF1C0D00DF1C0D00DF1C0D00DF1C0D00DF
+1C0D00DF1C0D00DF1C0D00DF1C0D00DF1C0D00DF1C0D00DF1C0D00DF1C0D00
+DF1C0D00DF1C0D00DF1C0D00DF1C0D00DF1C0D00DF1C0D00DF1C0D00DF1C0D
+00DF1C0D00DF1C0D00DF1C0D00DF1C0D00DF1C0D00DF1C0D00DF1C0D00DF1C
+0D00DF1C0D00DF1C0D00DF1C0D00DF1C0D00DF1C0D00DF1C0D00DF1C0D00DF
+1C0D00DF1C0D00DF1C0D00DF1C0D00DF1C0D00DF1C0D00DF1C0D00DF1C0D00
+DF1C0D00DF1C0D00DF1C0D00DF1C0D00DF1C0D00DF1C0D00DF1C0D00DF1C0D
+00DF1C0D00DF1C0D00DF1C0D00DF1C0D00DF1C0D00DF1C0D00DF1C0D00DF1C
+0D00DF1C0D00DF1C0D00DF1C0D00DF1C0D00DF1C0D00DF1C0D00DF1C0D00DF
+1C0D00DF1C0D00DF1C0D00DF1C0D00DF>
+<A5580000AA5D0000AF640000B66D0000BD790000C9850000E4900004FE9907
+03FFA01300FFA21B09FF971720FF931C2CFE84164AF35A0079B6380094790E
+06B36716239F420029B8420029B8420029B8420029B8420029B8420029B842
+0029B8420029B8420029B8420029B8420029B8420029B8420029B8420029B8
+420029B8420029B8A5580000AA5D0000AF640000B66D0000BD790000C98500
+00E4900004FE990703FFA01300FFA21B09FF971720FF931C2CFE84164AF35A
+0079B6380094790E06B36716239F420029B8420029B8420029B8420029B842
+0029B8420029B8420029B8420029B8420029B8420029B8420029B8420029B8
+420029B8420029B8420029B8420029B8A5580000AA5D0000AF640000B66D00
+00BD790000C9850000E4900004FE990703FFA01300FFA21B09FF971720FF93
+1C2CFE84164AF35A0079B6380094790E06B36716239F420029B8420029B842
+0029B8420029B8420029B8420029B8420029B8420029B8420029B8420029B8
+420029B8420029B8420029B8420029B8420029B8420029B8A5580000AA5D00
+00AF640000B66D0000BD790000C9850000E4900004FE990703FFA01300FFA2
+1B09FF971720FF931C2CFE84164AF35A0079B6380094790E06B36716239F42
+0029B8420029B8420029B8420029B8420029B8420029B8420029B8420029B8
+420029B8420029B8420029B8420029B8420029B8420029B8420029B8420029
+B8A5580000AA5D0000AF640000B66D0000BD790000C9850000E4900004FE99
+0703FFA01300FFA21B09FF971720FF931C2CFE84164AF35A0079B638009479
+0E06B36716239F420029B8420029B8420029B8420029B8420029B8420029B8
+420029B8420029B8420029B8420029B8420029B8420029B8420029B8420029
+B8420029B8420029B8A5580000AA5D0000AF640000B66D0000BD790000C985
+0000E4900004FE990703FFA01300FFA21B09FF971720FF931C2CFE84164AF3
+5A0079B6380094790E06B36716239F420029B8420029B8420029B8420029B8
+420029B8420029B8420029B8420029B8420029B8420029B8420029B8420029
+B8420029B8420029B8420029B8420029B8A5580000AA5D0000AF640000B66D
+0000BD790000C9850000E4900004FE990703FFA01300FFA21B09FF971720FF
+931C2CFE84164AF35A0079B6380094790E06B36716239F420029B8420029B8
+420029B8420029B8420029B8420029B8420029B8420029B8420029B8420029
+B8420029B8420029B8420029B8420029B8420029B8420029B8A5580000AA5D
+0000AF640000B66D0000BD790000C9850000E4900004FE990703FFA01300FF
+A21B09FF971720FF931C2CFE84164AF35A0079B6380094790E06B36716239F
+420029B8420029B8420029B8420029B8420029B8420029B8420029B8420029
+B8420029B8420029B8420029B8420029B8420029B8420029B8420029B84200
+29B8A5580000AA5D0000AF640000B66D0000BD790000C9850000E4900004FE
+990703FFA01300FFA21B09FF971720FF931C2CFE84164AF35A0079B6380094
+790E06B36716239F420029B8420029B8420029B8420029B8420029B8420029
+B8420029B8420029B8420029B8420029B8420029B8420029B8420029B84200
+29B8420029B8420029B8A5580000AA5D0000AF640000B66D0000BD790000C9
+850000E4900004FE990703FFA01300FFA21B09FF971720FF931C2CFE84164A
+F35A0079B6380094790E06B36716239F420029B8420029B8420029B8420029
+B8420029B8420029B8420029B8420029B8420029B8420029B8420029B84200
+29B8420029B8420029B8420029B8420029B8A5580000AA5D0000AF640000B6
+6D0000BD790000C9850000E4900004FE990703FFA01300FFA21B09FF971720
+FF931C2CFE84164AF35A0079B6380094790E06B36716239F420029B8420029
+B8420029B8420029B8420029B8420029B8420029B8420029B8420029B84200
+29B8420029B8420029B8420029B8420029B8420029B8420029B8A5580000AA
+5D0000AF640000B66D0000BD790000C9850000E4900004FE990703FFA01300
+FFA21B09FF971720FF931C2CFE84164AF35A0079B6380094790E06B3671623
+9F420029B8420029B8420029B8420029B8420029B8420029B8420029B84200
+29B8420029B8420029B8420029B8420029B8420029B8420029B8420029B842
+0029B8A5580000AA5D0000AF640000B66D0000BD790000C9850000E4900004
+FE990703FFA01300FFA21B09FF971720FF931C2CFE84164AF35A0079B63800
+94790E06B36716239F420029B8420029B8420029B8420029B8420029B84200
+29B8420029B8420029B8420029B8420029B8420029B8420029B8420029B842
+0029B8420029B8420029B8A5580000AA5D0000AF640000B66D0000BD790000
+C9850000E4900004FE990703FFA01300FFA21B09FF971720FF931C2CFE8416
+4AF35A0079B6380094790E06B36716239F420029B8420029B8420029B84200
+29B8420029B8420029B8420029B8420029B8420029B8420029B8420029B842
+0029B8420029B8420029B8420029B8420029B8A5580000AA5D0000AF640000
+B66D0000BD790000C9850000E4900004FE990703FFA01300FFA21B09FF9717
+20FF931C2CFE84164AF35A0079B6380094790E06B36716239F420029B84200
+29B8420029B8420029B8420029B8420029B8420029B8420029B8420029B842
+0029B8420029B8420029B8420029B8420029B8420029B8420029B8A5580000
+A95D0000AF640000B56E0000BC7A0000C8850000E2900003FC9A0603FFA112
+00FFA51B06FF9A161FFF961B2AFE820B52E1620073BB4B008C701701B55405
+0EBB320021C4320021C4320021C4320021C4320021C4320021C4320021C432
+0021C4320021C4320021C4320021C4320021C4320021C4320021C4320021C4
+320021C4A4590000A95E0000AE650000B46E0000BB7A0000C6850000DE9100
+02FC9C0602FFA31000FFA91A02FF9F141DFF9A1A28F1830057D672006BCE59
+00847E3800A2311400CB040A0EDC040A0EDC040A0EDC040A0EDC040A0EDC04
+0A0EDC040A0EDC040A0EDC040A0EDC040A0EDC040A0EDC040A0EDC040A0EDC
+040A0EDC040A0EDC040A0EDCA4590000A85E0000AD650000B36E0000BA7A00
+00C4860000DA910001FA9D0501FFA50E00FFAB1901FFA71715FFA01925D18B
+0051F98C0061B9860074857E0588213C00B8043906C2043906C2043906C204
+3906C2043906C2043906C2043906C2043906C2043906C2043906C2043906C2
+043906C2043906C2043906C2043906C2043906C2A4590000A85E0000AD6500
+00B26E0000B97A0000C3860000D8920000FA9E0401FFA70B00FFAE1700FFB0
+1B0CFFAA1622D09D0147D2AB0056C3C2006593CC007833860098006702B300
+6702B3006702B3006702B3006702B3006702B3006702B3006702B3006702B3
+006702B3006702B3006702B3006702B3006702B3006702B3006702B3A35900
+00A75E0000AC660000B26F0000B87B0000C1860000D5920000FAA00301FFA8
+0A00FFB11400FFB51C05FFBA1A18CEAE0042B1C00054A6F0005EA4F825522C
+A10193009400A6009400A6009400A6009400A6009400A6009400A6009400A6
+009400A6009400A6009400A6009400A6009400A6009400A6009400A6009400
+A6009400A6A3590000A75F0000AC660000B16F0000B67B0000C0870000D393
+0000FCA20300FFA90900FFB11400FFBD1D05FFC80925C4CE013ACDFD2A1E8E
+FF055B6AFF126431F0078900C2009D00C2009D00C2009D00C2009D00C2009D
+00C2009D00C2009D00C2009D00C2009D00C2009D00C2009D00C2009D00C200
+9D00C2009D00C2009D00C2009DA35A0000A75F0000AB660000B0700000B57B
+0000BE870000D2930000FCA20300FFA90900FFB51300FFCB0F11DCDB0028CF
+FC1A1C8DF2034C76FF125846FF037019EC008B00F6019300F6019300F60193
+00F6019300F6019300F6019300F6019300F6019300F6019300F6019300F601
+9300F6019300F6019300F6019300F6019300F60193A35A0000A65F0000AA67
+0000AF700000B57B0000BE870000D2930000FCA20300FFAB0800F8BE040DE5
+D7001ACCF31316C7FF350180FF0B4554FF045D33FF04720BF4008600FF2086
+00FF208600FF208600FF208600FF208600FF208600FF208600FF208600FF20
+8600FF208600FF208600FF208600FF208600FF208600FF208600FF2086A25A
+0000A5600000AA670000AF700000B57B0000BE870000D2930000FCA10200E2
+AE0105D9C4000DC0E10019B8FD180F9FFF211466FF034A40FF00601EFF0077
+04FF0D8100FF307B00FF307B00FF307B00FF307B00FF307B00FF307B00FF30
+7B00FF307B00FF307B00FF307B00FF307B00FF307B00FF307B00FF307B00FF
+307B00FF307BA25A0000A5600000AA670000AF700000B57B0000BE870000D1
+920000C59E0001C3AF0006BDCB000DABEA0016A7FF180D77FF023252FF004C
+2EFF006312FF007400FF1A7A00FF387200FF387200FF387200FF387200FF38
+7200FF387200FF387200FF387200FF387200FF387200FF387200FF387200FF
+387200FF387200FF387200FF3872A25A0000A5600000AA660000AF700000B5
+7B0000BE870000B7930000B1A00001B1B30006AACF000D9BEE00158AFF051C
+63FF003744FF004E20FF006608FF057100FF287000FF436A00FF436A00FF43
+6A00FF436A00FF436A00FF436A00FF436A00FF436A00FF436A00FF436A00FF
+436A00FF436A00FF436A00FF436A00FF436A00FF436AA25A0000A5600000AA
+660000AF700000B57B0000B1870000A9940000A7A20002A6B800069BD1000E
+8EF000147AFF021F53FF003A34FF005214FF006603FF0C6D00FF306800FF4D
+6300FF4D6300FF4D6300FF4D6300FF4D6300FF4D6300FF4D6300FF4D6300FF
+4D6300FF4D6300FF4D6300FF4D6300FF4D6300FF4D6300FF4D6300FF4D63A2
+5A0000A55F0000AA660000AF700000AE7B0000A5890000A09600019FA60003
+99BC00078FD4000E83F4001567FF002446FF003C26FF00560AFF006503FF1A
+6505FF3E5E00FF565C00FF565C00FF565C00FF565C00FF565C00FF565C00FF
+565C00FF565C00FF565C00FF565C00FF565C00FF565C00FF565C00FF565C00
+FF565C00FF565CA25A0000A55F0000AA660000AE700000A17D00009C8B0000
+9899000197AA000491C1000785D9000D78FA001556FF002A3BFF003F19FF00
+5803FF046217FF384E1DFF554100FF5D5500FF5D5500FF5D5500FF5D5500FF
+5D5500FF5D5500FF5D5500FF5D5500FF5D5500FF5D5500FF5D5500FF5D5500
+FF5D5500FF5D5500FF5D5500FF5D55A25A0000A55F0000AA660000A0720000
+997F0000958D0000929C000190AF000389C600077FE3000C6CFE001747FA00
+2E2BFF00460FFF005705FF115917FF42473BFF6F2100FF5F4F00FF5F4F00FF
+5F4F00FF5F4F00FF5F4F00FF5F4F00FF5F4F00FF5F4F00FF5F4F00FF5F4F00
+FF5F4F00FF5F4F00FF5F4F00FF5F4F00FF5F4F00FF5F4FA25A0000A55F0000
+9E68000096740000928200008E8F00008C9F000188B4000383CE000678EE00
+0B5CF9001C3CFA003126FF074106FF005608FF214F1CFF4D3A20FF652F02FF
+644802FF644802FF644802FF644802FF644802FF644802FF644802FF644802
+FF644802FF644802FF644802FF644802FF644802FF644802FF644802FF6448
+A25A00009D610000936B00008E7600008B8400008892000085A3000183B900
+0280DC00026FF5000C48EA002337FE062E17FF004802FF08511BFF3E3914FF
+4F3A18FF64300FFF7C390FFF7C390FFF7C390FFF7C390FFF7C390FFF7C390F
+FF7C390FFF7C390FFF7C390FFF7C390FFF7C390FFF7C390FFF7C390FFF7C39
+0FFF7C390FFF7C399D5B0000916400018B6D00018879000084860000809500
+007FA700007FC2000078E1000261F200103BE5002529FF00360FFF034612FF
+243C1CFF483009FF4E3C06FF613B11FF893111FF893111FF893111FF893111
+FF893111FF893111FF893111FF893111FF893111FF893111FF893111FF8931
+11FF893111FF893111FF893111FF8931>
+<A4550000A8590000AD5F0000B3660000BB700000C57C0000D6860004F28D00
+0BFF930A0BFF941212FF8F171EFF710448FF5C0163ED3C007EAC1000999F07
+1B9E931C3F8C75064D9A750851987508519875085198750851987508519875
+08519875085198750851987508519875085198750851987508519875085198
+7508519875085198A4550000A8590000AD5F0000B3660000BB700000C57C00
+00D6860004F28D000BFF930A0BFF941212FF8F171EFF710448FF5C0163ED3C
+007EAC1000999F071B9E931C3F8C75064D9A75085198750851987508519875
+08519875085198750851987508519875085198750851987508519875085198
+75085198750851987508519875085198A4550000A8590000AD5F0000B36600
+00BB700000C57C0000D6860004F28D000BFF930A0BFF941212FF8F171EFF71
+0448FF5C0163ED3C007EAC1000999F071B9E931C3F8C75064D9A7508519875
+08519875085198750851987508519875085198750851987508519875085198
+750851987508519875085198750851987508519875085198A4550000A85900
+00AD5F0000B3660000BB700000C57C0000D6860004F28D000BFF930A0BFF94
+1212FF8F171EFF710448FF5C0163ED3C007EAC1000999F071B9E931C3F8C75
+064D9A75085198750851987508519875085198750851987508519875085198
+75085198750851987508519875085198750851987508519875085198750851
+98A4550000A8590000AD5F0000B3660000BB700000C57C0000D6860004F28D
+000BFF930A0BFF941212FF8F171EFF710448FF5C0163ED3C007EAC1000999F
+071B9E931C3F8C75064D9A7508519875085198750851987508519875085198
+75085198750851987508519875085198750851987508519875085198750851
+987508519875085198A4550000A8590000AD5F0000B3660000BB700000C57C
+0000D6860004F28D000BFF930A0BFF941212FF8F171EFF710448FF5C0163ED
+3C007EAC1000999F071B9E931C3F8C75064D9A750851987508519875085198
+75085198750851987508519875085198750851987508519875085198750851
+9875085198750851987508519875085198A4550000A8590000AD5F0000B366
+0000BB700000C57C0000D6860004F28D000BFF930A0BFF941212FF8F171EFF
+710448FF5C0163ED3C007EAC1000999F071B9E931C3F8C75064D9A75085198
+75085198750851987508519875085198750851987508519875085198750851
+98750851987508519875085198750851987508519875085198A4550000A859
+0000AD5F0000B3660000BB700000C57C0000D6860004F28D000BFF930A0BFF
+941212FF8F171EFF710448FF5C0163ED3C007EAC1000999F071B9E931C3F8C
+75064D9A750851987508519875085198750851987508519875085198750851
+98750851987508519875085198750851987508519875085198750851987508
+5198A4550000A8590000AD5F0000B3660000BB700000C57C0000D6860004F2
+8D000BFF930A0BFF941212FF8F171EFF710448FF5C0163ED3C007EAC100099
+9F071B9E931C3F8C75064D9A75085198750851987508519875085198750851
+98750851987508519875085198750851987508519875085198750851987508
+51987508519875085198A4550000A8590000AD5F0000B3660000BB700000C5
+7C0000D6860004F28D000BFF930A0BFF941212FF8F171EFF710448FF5C0163
+ED3C007EAC1000999F071B9E931C3F8C75064D9A7508519875085198750851
+98750851987508519875085198750851987508519875085198750851987508
+519875085198750851987508519875085198A4550000A8590000AD5F0000B3
+660000BB700000C57C0000D6860004F28D000BFF930A0BFF941212FF8F171E
+FF710448FF5C0163ED3C007EAC1000999F071B9E931C3F8C75064D9A750851
+98750851987508519875085198750851987508519875085198750851987508
+5198750851987508519875085198750851987508519875085198A4550000A8
+590000AD5F0000B3660000BB700000C57C0000D6860004F28D000BFF930A0B
+FF941212FF8F171EFF710448FF5C0163ED3C007EAC1000999F071B9E931C3F
+8C75064D9A7508519875085198750851987508519875085198750851987508
+51987508519875085198750851987508519875085198750851987508519875
+085198A4550000A8590000AD5F0000B3660000BB700000C57C0000D6860004
+F28D000BFF930A0BFF941212FF8F171EFF710448FF5C0163ED3C007EAC1000
+999F071B9E931C3F8C75064D9A750851987508519875085198750851987508
+51987508519875085198750851987508519875085198750851987508519875
+0851987508519875085198A4550000A8590000AD5F0000B3660000BB700000
+C57C0000D5860003F38D000AFF940B09FF951210FF90171DFF760843FF6205
+5EF141007CB1160097990014A69B2541867104489C71074D9A71074D9A7107
+4D9A71074D9A71074D9A71074D9A71074D9A71074D9A71074D9A71074D9A71
+074D9A71074D9A71074D9A71074D9A71074D9AA3550000A7590000AC5F0000
+B2660000BA710000C37C0000D3870003F4900008FF980E03FF9A150AFF9417
+1BFF831134FF730E4EFF500076C12600929D080CA7AE3A427B67003BA56703
+41A1670341A1670341A1670341A1670341A1670341A1670341A1670341A167
+0341A1670341A1670341A1670341A1670341A1670341A1670341A1A3550000
+A75A0000AC5F0000B2670000B9710000C27D0000D1880002F3910007FF9A0C
+03FF9E1605FF991816FF921A26FF85193CFF670D61D339008CA01002A88920
+24912A0021C71E0027C81E0027C81E0027C81E0027C81E0027C81E0027C81E
+0027C81E0027C81E0027C81E0027C81E0027C81E0027C81E0027C81E0027C8
+1E0027C8A3550000A65A0000AB5F0000B1670000B8710000C17D0000CF8800
+01F0930006FF9C0B02FFA21700FFA01A10FF961924FF8F1935EB761157DE58
+047F7F3900A02F1600C0030A1BD4000C23CE000C23CE000C23CE000C23CE00
+0C23CE000C23CE000C23CE000C23CE000C23CE000C23CE000C23CE000C23CE
+000C23CE000C23CE000C23CEA2550000A65A0000AB600000B0670000B77100
+00C07D0000CD890001ED940005FF9D0A01FFA31500FFA4190DFF991722FF94
+1931E381015F98730077726B0293243C00B1003010C10A391BB30A391BB30A
+391BB30A391BB30A391BB30A391BB30A391BB30A391BB30A391BB30A391BB3
+0A391BB30A391BB30A391BB30A391BB30A391BB3A2560000A65A0000AA6000
+00B0670000B6720000BE7E0000CA890000E9950004FF9F0900FFA61300FFA9
+1A07FF9F1520FAA7182CBC9D0058A1A7006978AA047D307A009C00560BB308
+5A13AA085A13AA085A13AA085A13AA085A13AA085A13AA085A13AA085A13AA
+085A13AA085A13AA085A13AA085A13AA085A13AA085A13AA085A13AAA25600
+00A55B0000AA600000AF680000B5720000BC7E0000C88A0000E4960002FFA1
+0700FFA81000FFAE1A03FFBA1914CBB00039AEC204469DF3005585FF115F49
+F5027D0EC9039A07BF099807BF099807BF099807BF099807BF099807BF0998
+07BF099807BF099807BF099807BF099807BF099807BF099807BF099807BF09
+9807BF0998A2560000A55B0000A9610000AE680000B3730000BA7E0000C68A
+0000E5980001FFA40500FFAB0D00FFBE1106FCD80D18D1EA0528C5FC2D1187
+FF094F5BFF086438FE077902E1009200FF029300FF029300FF029300FF0293
+00FF029300FF029300FF029300FF029300FF029300FF029300FF029300FF02
+9300FF029300FF029300FF0293A1560000A45B0000A8610000AD690000B273
+0000B87F0000C38B0000E6990000FFA40500FFB50704F2C70112D0E1001ED1
+FF2C03A3FC221C70FF0D4D40FF00671EFB007F00FF158900FF2A8300FF2A83
+00FF2A8300FF2A8300FF2A8300FF2A8300FF2A8300FF2A8300FF2A8300FF2A
+8300FF2A8300FF2A8300FF2A8300FF2A8300FF2A83A1570000A45B0000A862
+0000AC690000B1730000B87F0000C38B0000E6990000E8A60201D7B50008CD
+D10011B4EF001BBAFF2C0079FF033A52FF00542DFF006B10FF007B00FF277C
+00FF367800FF367800FF367800FF367800FF367800FF367800FF367800FF36
+7800FF367800FF367800FF367800FF367800FF367800FF367800FF3678A157
+0000A35C0000A7620000AC690000B1730000B87F0000C38B0000C6960000BD
+A30002BDB90007B2D60010A2F602189AFF1B0F63FF003F41FF00551DFF006E
+06FF077700FF317200FF406F00FF406F00FF406F00FF406F00FF406F00FF40
+6F00FF406F00FF406F00FF406F00FF406F00FF406F00FF406F00FF406F00FF
+406F00FF406FA1570000A35C0000A7620000AC690000B1730000B87F0000BB
+8B0000AF970000AEA60003ACBE0008A0DA001092F8021779FF022452FF0041
+30FF005911FF006C01FF127100FF3A6A00FF4C6800FF4C6800FF4C6800FF4C
+6800FF4C6800FF4C6800FF4C6800FF4C6800FF4C6800FF4C6800FF4C6800FF
+4C6800FF4C6800FF4C6800FF4C68A1570000A35C0000A7620000AC690000B1
+730000B57F0000A98C0000A59A0001A4AA00049EC1000992DD001086F90217
+65FF002A44FF004222FF005C07FF006A04FF236700FF436300FF576000FF57
+6000FF576000FF576000FF576000FF576000FF576000FF576000FF576000FF
+576000FF576000FF576000FF576000FF576000FF5760A1570000A35C0000A7
+620000AC690000B1730000A6810000A08E00009D9C00019AAE000593C5000A
+88E1001076FB001953FF003037FF004616FF005D03FF0B6514FF3C540CFF55
+5000FF5E5900FF5E5900FF5E5900FF5E5900FF5E5900FF5E5900FF5E5900FF
+5E5900FF5E5900FF5E5900FF5E5900FF5E5900FF5E5900FF5E5900FF5E59A1
+570000A35C0000A7620000AC690000A47500009C8200009890000095A00002
+93B4000489C9000A80EA000F67FF001D46FE003328FF004C0CFF005C10FF22
+5315FF464C24FF6B3400FF645200FF645200FF645200FF645200FF645200FF
+645200FF645200FF645200FF645200FF645200FF645200FF645200FF645200
+FF645200FF6452A1570000A35C0000A7620000A26B00009977000094850000
+919300008FA300028BB8000482D1000878F4000E59FC00213BFE01351CFF00
+4E03FF015A0FFF2D4C2BFF5B2E00FF594D00FF634C00FF634C00FF634C00FF
+634C00FF634C00FF634C00FF634C00FF634C00FF634C00FF634C00FF634C00
+FF634C00FF634C00FF634C00FF634CA1570000A35C0000A0630000966D0000
+917900008E8700008B96000188A8000285BE00037EDE00066EFA000F46F100
+273DFF102C12FF004E01FF0C5518FF413E2AFF622800FF5C470DFF7A3D0DFF
+7A3D0DFF7A3D0DFF7A3D0DFF7A3D0DFF7A3D0DFF7A3D0DFF7A3D0DFF7A3D0D
+FF7A3D0DFF7A3D0DFF7A3D0DFF7A3D0DFF7A3D0DFF7A3DA1570000A05C0000
+946600008D6F00008A7C0000878900008399000081AC000181C8000178E900
+055AEE00163AEE002925FF003D0AFF034B13FF293E18FF4B3618FF5C300CFF
+723911FF8B3411FF8B3411FF8B3411FF8B3411FF8B3411FF8B3411FF8B3411
+FF8B3411FF8B3411FF8B3411FF8B3411FF8B3411FF8B3411FF8B3411FF8B34
+A1570000935F00008B67000186710000837E0000808C00007B9B00007CB100
+007ACE00016FED000546DE001C31EF002B1AFF003E06FF0B471BFF3B3016FF
+503001FF513D12FF832F0EFF8F300EFF8F300EFF8F300EFF8F300EFF8F300E
+FF8F300EFF8F300EFF8F300EFF8F300EFF8F300EFF8F300EFF8F300EFF8F30
+0EFF8F300EFF8F30935A000089610001826900007F7400007C800000768E00
+00719E000073B4000070CF000158DC000D39D8001E29F2002C12FF003D00FF
+11441DFF44280CFF4C3110FF682C11FF882A0DFF932B0DFF932B0DFF932B0D
+FF932B0DFF932B0DFF932B0DFF932B0DFF932B0DFF932B0DFF932B0DFF932B
+0DFF932B0DFF932B0DFF932B0DFF932B>
+<A3510000A6550000AB5A0000B1600000B8670000C2730000D07D0002E18200
+0BF5860014FF890C16FF851220FF660249FA4F0063DE2B007C9D000296BA11
+2D88A30B4C8D94146582A7329863A7329863A7329863A7329863A7329863A7
+329863A7329863A7329863A7329863A7329863A7329863A7329863A7329863
+A7329863A7329863A3510000A6550000AB5A0000B1600000B8670000C27300
+00D07D0002E182000BF5860014FF890C16FF851220FF660249FA4F0063DE2B
+007C9D000296BA112D88A30B4C8D94146582A7329863A7329863A7329863A7
+329863A7329863A7329863A7329863A7329863A7329863A7329863A7329863
+A7329863A7329863A7329863A7329863A3510000A6550000AB5A0000B16000
+00B8670000C2730000D07D0002E182000BF5860014FF890C16FF851220FF66
+0249FA4F0063DE2B007C9D000296BA112D88A30B4C8D94146582A7329863A7
+329863A7329863A7329863A7329863A7329863A7329863A7329863A7329863
+A7329863A7329863A7329863A7329863A7329863A7329863A3510000A65500
+00AB5A0000B1600000B8670000C2730000D07D0002E182000BF5860014FF89
+0C16FF851220FF660249FA4F0063DE2B007C9D000296BA112D88A30B4C8D94
+146582A7329863A7329863A7329863A7329863A7329863A7329863A7329863
+A7329863A7329863A7329863A7329863A7329863A7329863A7329863A73298
+63A3510000A6550000AB5A0000B1600000B8670000C2730000D07D0002E182
+000BF5860014FF890C16FF851220FF660249FA4F0063DE2B007C9D000296BA
+112D88A30B4C8D94146582A7329863A7329863A7329863A7329863A7329863
+A7329863A7329863A7329863A7329863A7329863A7329863A7329863A73298
+63A7329863A7329863A3510000A6550000AB5A0000B1600000B8670000C273
+0000D07D0002E182000BF5860014FF890C16FF851220FF660249FA4F0063DE
+2B007C9D000296BA112D88A30B4C8D94146582A7329863A7329863A7329863
+A7329863A7329863A7329863A7329863A7329863A7329863A7329863A73298
+63A7329863A7329863A7329863A7329863A3510000A6550000AB5A0000B160
+0000B8670000C2730000D07D0002E182000BF5860014FF890C16FF851220FF
+660249FA4F0063DE2B007C9D000296BA112D88A30B4C8D94146582A7329863
+A7329863A7329863A7329863A7329863A7329863A7329863A7329863A73298
+63A7329863A7329863A7329863A7329863A7329863A7329863A3510000A655
+0000AB5A0000B1600000B8670000C2730000D07D0002E182000BF5860014FF
+890C16FF851220FF660249FA4F0063DE2B007C9D000296BA112D88A30B4C8D
+94146582A7329863A7329863A7329863A7329863A7329863A7329863A73298
+63A7329863A7329863A7329863A7329863A7329863A7329863A7329863A732
+9863A3510000A6550000AB5A0000B1600000B8670000C2730000D07D0002E1
+82000BF5860014FF890C16FF851220FF660249FA4F0063DE2B007C9D000296
+BA112D88A30B4C8D94146582A7329863A7329863A7329863A7329863A73298
+63A7329863A7329863A7329863A7329863A7329863A7329863A7329863A732
+9863A7329863A7329863A3510000A6550000AB5A0000B1600000B8670000C2
+730000D07D0002E182000BF5860014FF890C16FF851220FF660249FA4F0063
+DE2B007C9D000296BA112D88A30B4C8D94146582A7329863A7329863A73298
+63A7329863A7329863A7329863A7329863A7329863A7329863A7329863A732
+9863A7329863A7329863A7329863A7329863A3510000A6550000AB5A0000B1
+600000B8670000C2730000D07D0002E182000BF5860014FF890C16FF851220
+FF660249FA4F0063DE2B007C9D000296BA112D88A30B4C8D94146582A73298
+63A7329863A7329863A7329863A7329863A7329863A7329863A7329863A732
+9863A7329863A7329863A7329863A7329863A7329863A7329863A3510000A6
+550000AB5A0000B1600000B8680000C2730000CF7D0002E182000AF5860014
+FF890C16FF861220FF670249FB4F0063DE2C007C9C010196B9102C89A30C4C
+8C93136383A6319664A6319664A6319664A6319664A6319664A6319664A631
+9664A6319664A6319664A6319664A6319664A6319664A6319664A6319664A6
+319664A3510000A6550000AA5A0000B0600000B7680000C1730000CE7D0002
+E0840009F6880012FF8C0B15FF89121DFF71083DFF57015FE9370078A80C00
+92AD041F96AA1B4B8584014F9796247F7196247F7196247F7196247F719624
+7F7196247F7196247F7196247F7196247F7196247F7196247F7196247F7196
+247F7196247F7196247F71A3520000A5560000AA5B0000B0600000B7680000
+C0730000CC7E0001DF860008F78B010FFF8F0C11FF8C121BFF7C0F32FF5E01
+5BF7430074BA19008EA702149CB32A4A7D7F00449D87166A8287166A828716
+6A8287166A8287166A8287166A8287166A8287166A8287166A8287166A8287
+166A8287166A8287166A8287166A8287166A82A3520000A5560000A95B0000
+AF610000B6680000BF740000CA7F0001DE870006F78E030CFF930F0BFF9013
+18FF891626FF650057FE4E006FD328008AA4050B9FAD273C837A003AA24E01
+4FA54C014FA54C014FA54C014FA54C014FA54C014FA54C014FA54C014FA54C
+014FA54C014FA54C014FA54C014FA54C014FA54C014FA54C014FA5A2520000
+A5560000A95B0000AF610000B5690000BE740000C9800000DF890005FA9003
+0AFF971105FF951414FF8F1822FF6F034FFF5C0763E53600849E1002A26003
+15AF3E002DB70A003CC20A003CC20A003CC20A003CC20A003CC20A003CC20A
+003CC20A003CC20A003CC20A003CC20A003CC20A003CC20A003CC20A003CC2
+0A003CC2A2520000A4560000A95B0000AE610000B5690000BC750000C78000
+00DE8B0004FC930308FF9B1201FF9A160FFF92171FFF7D0D3FFF731351DB56
+007B7835009D291400B9040A17C8000838C4000838C4000838C4000838C400
+0838C4000838C4000838C4000838C4000838C4000838C4000838C4000838C4
+000838C4000838C4000838C4A2520000A4570000A85B0000AD620000B46A00
+00BB750000C5810000DA8C0003FB950207FF9D1001FF9F1808FF97171CFF92
+1B29E1830558906F007369660192243E00AC013012BB29533F9528543F9528
+543F9528543F9528543F9528543F9528543F9528543F9528543F9528543F95
+28543F9528543F9528543F9528543F9528543F95A2530000A3570000A85C00
+00AD620000B36A0000BA750000C3810000D68C0002F7970205FF9F0E00FFA5
+1901FF9F1618FFA9122AA997005491A100666EA9027D3E8A0E8F005E0FAC16
+6C3894166C3894166C3894166C3894166C3894166C3894166C3894166C3894
+166C3894166C3894166C3894166C3894166C3894166C3894166C3894A15300
+00A3570000A75C0000AC620000B26A0000B8760000C1820000D18D0001F399
+0104FFA20B00FFA91402FFB80F16CEB90031A3BF024193EE00507AFE115D40
+EC027A02A6069738D24F6B37D24F6C37D24F6C37D24F6C37D24F6C37D24F6C
+37D24F6C37D24F6C37D24F6C37D24F6C37D24F6C37D24F6C37D24F6C37D24F
+6C37D24F6CA1530000A3570000A65C0000AB630000B06B0000B6760000BF82
+0000CD8E0000F19B0102FFA60701F4B8030CE4D00018C3ED061DC6FF310081
+FF084157FF055930FF02700EFD008300FF2F8100FF2F8100FF2F8100FF2F81
+00FF2F8100FF2F8100FF2F8100FF2F8100FF2F8100FF2F8100FF2F8100FF2F
+8100FF2F8100FF2F8100FF2F81A1540000A2580000A65D0000AA630000AF6C
+0000B4770000BB830000C98E0000F19E0100D5A90004CFBF000ABDDB0015AC
+FD0619A1FF221065FF014640FF005D1CFF007404FF0D7E00FF387600FF3976
+00FF397600FF397600FF397600FF397600FF397600FF397600FF397600FF39
+7600FF397600FF397600FF397600FF397600FF3976A0540000A2580000A55D
+0000A9640000AE6C0000B3770000BA830000C98E0000B99B0000B9AA0004B5
+C4000AA7E300139BFF081678FF022C52FF00482DFF00610FFF007200FF1B75
+00FF486D00FF486D00FF486D00FF486D00FF486D00FF486D00FF486D00FF48
+6D00FF486D00FF486D00FF486D00FF486D00FF486D00FF486D00FF486DA055
+0000A1590000A45E0000A9640000AE6C0000B3770000BA830000AF8F0000AB
+9D0001AAAE0005A5C9000B97E6001389FF041964FF003043FF00491EFF0063
+05FF036F00FF286C00FF546500FF566400FF566400FF566400FF566400FF56
+6400FF566400FF566400FF566400FF566400FF566400FF566400FF566400FF
+566400FF5664A0550000A1590000A45E0000A9640000AE6C0000B3770000AB
+840000A4910000A2A000019FB3000596CA000C8AE9001278FF021C52FF0036
+32FF004F12FF006301FF106908FF395F00FF5E5D00FF5F5D00FF5F5D00FF5F
+5D00FF5F5D00FF5F5D00FF5F5D00FF5F5D00FF5F5D00FF5F5D00FF5F5D00FF
+5F5D00FF5F5D00FF5F5D00FF5F5DA0550000A1590000A45E0000A9640000AE
+6C0000A8780000A08600009B94000199A3000296B800068BCE000C7FEF0012
+65FF002144FF003924FF005208FF00620EFF28570AFF445500FF655600FF66
+5600FF665600FF665600FF665600FF665600FF665600FF665600FF665600FF
+665600FF665600FF665600FF665600FF665600FF6656A0550000A1590000A4
+5E0000A9640000A66E00009C7A0000978800009496000192A700028DBD0006
+82D5000B76F8001253FC002738FF003C18FF005400FF025F1AFF3F4733FF66
+2900FF685000FF6A4F00FF6A4F00FF6A4F00FF6A4F00FF6A4F00FF6A4F00FF
+6A4F00FF6A4F00FF6A4F00FF6A4F00FF6A4F00FF6A4F00FF6A4F00FF6A4FA0
+550000A1590000A45E0000A46500009A700000947C0000908A00008E990001
+8BAC000386C300057DE200096AFC001444F8002B36FF0D350EFF005300FF12
+5818FF46402BFF682807FF714507FF724507FF724507FF724507FF724507FF
+724507FF724507FF724507FF724507FF724507FF724507FF724507FF724507
+FF724507FF7245A0550000A1590000A35E000097670000907200008D7F0000
+8A8D0000869D000184B1000281CD000376EC000856F1001B39F9002E21FF02
+4206FF045015FF303F13FF4C3D26FF6B2512FF8B3711FF8C3711FF8C3711FF
+8C3711FF8C3711FF8C3711FF8C3711FF8C3711FF8C3711FF8C3711FF8C3711
+FF8C3711FF8C3711FF8C3711FF8C37A0550000A1590000956000008D690001
+8974000086810000828F00007FA000007FB700007DDB000071FB000744E400
+2130FC003015FF00440BFF15451BFF41320CFF4D3B01FF583F0EFF92330DFF
+93330DFF93330DFF93330DFF93330DFF93330DFF93330DFF93330DFF93330D
+FF93330DFF93330DFF93330DFF93330DFF93330DFF9333A0550000955B0000
+8B630001846B0000827700007F8400007992000077A4000079BD000070D600
+0358E4001038DF002227FB00320DFF02420CFF203C1DFF4B2A08FF4F3610FF
+722F0EFF922D0EFF932D0EFF932D0EFF932D0EFF932D0EFF932D0EFF932D0E
+FF932D0EFF932D0EFF932D0EFF932D0EFF932D0EFF932D0EFF932D0EFF932D
+965600008A5D0001826500007D6D00007A790000758600006D9300006DA600
+006CBC000063D6000344D600162FDF00231FFC003307FF063F0CFF293515FF
+49290EFF5A2D15FF7C260BFF99290BFF9A290BFF9A290BFF9A290BFF9A290B
+FF9A290BFF9A290BFF9A290BFF9A290BFF9A290BFF9A290BFF9A290BFF9A29
+0BFF9A290BFF9A298A580001805F00007A67000075700000717B00006A8700
+006395000062A600005EBA000054D0000739D2001728E3002417FD003303FF
+0E3B0BFF2F2F0EFF4A280DFF602812FF80220AFF9B250AFF9C250AFF9C250A
+FF9C250AFF9C250AFF9C250AFF9C250AFF9C250AFF9C250AFF9C250AFF9C25
+0AFF9C250AFF9C250AFF9C250AFF9C25>
+<A34E0000A5520000A9560000AF5B0000B6610000BF690000CB730002D97800
+0AE87B0014FD7D031DFF780C24FE5B0049EC420061D31C007ABA001089D008
+3583CB005B85B00A767F8705A9808505B1808505B1808505B1808505B18085
+05B1808505B1808505B1808505B1808505B1808505B1808505B1808505B180
+8505B1808505B180A34E0000A5520000A9560000AF5B0000B6610000BF6900
+00CB730002D978000AE87B0014FD7D031DFF780C24FE5B0049EC420061D31C
+007ABA001089D0083583CB005B85B00A767F8705A9808505B1808505B18085
+05B1808505B1808505B1808505B1808505B1808505B1808505B1808505B180
+8505B1808505B1808505B1808505B180A34E0000A5520000A9560000AF5B00
+00B6610000BF690000CB730002D978000AE87B0014FD7D031DFF780C24FE5B
+0049EC420061D31C007ABA001089D0083583CB005B85B00A767F8705A98085
+05B1808505B1808505B1808505B1808505B1808505B1808505B1808505B180
+8505B1808505B1808505B1808505B1808505B1808505B180A34E0000A55200
+00A9560000AF5B0000B6610000BF690000CB730002D978000AE87B0014FD7D
+031DFF780C24FE5B0049EC420061D31C007ABA001089D0083583CB005B85B0
+0A767F8705A9808505B1808505B1808505B1808505B1808505B1808505B180
+8505B1808505B1808505B1808505B1808505B1808505B1808505B1808505B1
+80A34E0000A5520000A9560000AF5B0000B6610000BF690000CB730002D978
+000AE87B0014FD7D031DFF780C24FE5B0049EC420061D31C007ABA001089D0
+083583CB005B85B00A767F8705A9808505B1808505B1808505B1808505B180
+8505B1808505B1808505B1808505B1808505B1808505B1808505B1808505B1
+808505B1808505B180A34E0000A5520000A9560000AF5B0000B6610000BF69
+0000CB730002D978000AE87B0014FD7D031DFF780C24FE5B0049EC420061D3
+1C007ABA001089D0083583CB005B85B00A767F8705A9808505B1808505B180
+8505B1808505B1808505B1808505B1808505B1808505B1808505B1808505B1
+808505B1808505B1808505B1808505B180A34E0000A5520000A9560000AF5B
+0000B6610000BF690000CB730002D978000AE87B0014FD7D031DFF780C24FE
+5B0049EC420061D31C007ABA001089D0083583CB005B85B00A767F8705A980
+8505B1808505B1808505B1808505B1808505B1808505B1808505B1808505B1
+808505B1808505B1808505B1808505B1808505B1808505B180A34E0000A552
+0000A9560000AF5B0000B6610000BF690000CB730002D978000AE87B0014FD
+7D031DFF780C24FE5B0049EC420061D31C007ABA001089D0083583CB005B85
+B00A767F8705A9808505B1808505B1808505B1808505B1808505B1808505B1
+808505B1808505B1808505B1808505B1808505B1808505B1808505B1808505
+B180A34E0000A5520000A9560000AF5B0000B6610000BF690000CB730002D9
+78000AE87B0014FD7D031DFF780C24FE5B0049EC420061D31C007ABA001089
+D0083583CB005B85B00A767F8705A9808505B1808505B1808505B1808505B1
+808505B1808505B1808505B1808505B1808505B1808505B1808505B1808505
+B1808505B1808505B180A34E0000A5520000A9560000AF5B0000B6610000BF
+690000CB730002D978000AE87B0014FD7D031DFF780C24FE5B0049EC420061
+D31C007ABA001089D0083583CB005B85B00A767F8705A9808505B1808505B1
+808505B1808505B1808505B1808505B1808505B1808505B1808505B1808505
+B1808505B1808505B1808505B1808505B180A34E0000A5520000A9560000AF
+5B0000B5610000BE690000CA730001D97A0009E87D0013FD7F031CFF7D0E21
+FF610244F548005FD8220078B4000A8BC8062E87CA065883A9066D848E0EA6
+798B0EAF788B0EAF788B0EAF788B0EAF788B0EAF788B0EAF788B0EAF788B0E
+AF788B0EAF788B0EAF788B0EAF788B0EAF788B0EAF788B0EAF78A34F0000A5
+520000A9560000AE5B0000B5610000BE6A0000C9740001D87B0008E87F0012
+FC81031AFF810F1DFF69073BFD4F005CDF2B0074B506068BBE03268CCC1155
+7F9F01628B991AA270951BAC6F951BAC6F951BAC6F951BAC6F951BAC6F951B
+AC6F951BAC6F951BAC6F951BAC6F951BAC6F951BAC6F951BAC6F951BAC6F95
+1BAC6FA24F0000A4520000A8560000AE5B0000B4620000BD6A0000C8750000
+D87D0007E9810010FC830219FF840F1BFF730D32FF550059E8360071BB0F04
+89B4001E91CE1C517B9A005A90A3279C69A128A967A128A967A128A967A128
+A967A128A967A128A967A128A967A128A967A128A967A128A967A128A967A1
+28A967A128A967A128A967A24F0000A4520000A8570000AD5C0000B3620000
+BC6B0000C6760000D67E0006E983000EFC850218FF870F19FF7D1228FF5A00
+55F240006DC2170187AB001594CF274D7795005294AF369563AF38A65EAF38
+A65EAF38A65EAF38A65EAF38A65EAF38A65EAF38A65EAF38A65EAF38A65EAF
+38A65EAF38A65EAF38A65EAF38A65EAF38A65EA24F0000A4520000A7570000
+AD5C0000B3620000BB6B0000C5770000D47F0004E884000DFC870117FF8A0E
+18FF861522FF610052F949006AD1220084A5020C96C3203E7E8404479A5707
+60984C0061A14C0061A14C0061A14C0061A14C0061A14C0061A14C0061A14C
+0061A14C0061A14C0061A14C0061A14C0061A14C0061A14C0061A1A2500000
+A4530000A7570000AC5C0000B2630000BA6B0000C4770000D2810003E78700
+0BFC8A0115FF8D0E15FF89151FFF68014DFC520165E02E007F900F029C5C00
+15AB430032B2240045B5180050B4180050B4180050B4180050B4180050B418
+0050B4180050B4180050B4180050B4180050B4180050B4180050B4180050B4
+180050B4A2500000A3530000A6570000AB5C0000B1630000B96C0000C27800
+00D0820003E7890009FC8F040EFF93110FFF8E151CFF770A3CFE61025EB751
+00776C2F0098251200B2050917BF000D3DBE000F43B9000F43B9000F43B900
+0F43B9000F43B9000F43B9000F43B9000F43B9000F43B9000F43B9000F43B9
+000F43B9000F43B9000F43B9A2500000A3530000A6580000AB5D0000B06300
+00B86C0000C0780000CD830001E88C0007FD940807FF991406FF951617FF90
+1728B0770058886D006F5F600090213E00A5013013B115433C9E0E47449D0E
+47449D0E47449D0E47449D0E47449D0E47449D0E47449D0E47449D0E47449D
+0E47449D0E47449D0E47449D0E47449D0E47449DA1500000A2540000A55800
+00AA5D0000AF640000B66D0000BE790000CA840001E78F0004FE980704FF9E
+1500FFA21710E29F04329E95004F889E006264A5007B2A7D009A005E11A521
+814987066E4394066E4394066E4394066E4394066E4394066E4394066E4394
+066E4394066E4394066E4394066E4394066E4394066E4394066E4394A15000
+00A2540000A4580000A95D0000AE640000B56E0000BC7A0000C7850000E090
+0003FC9B0602FDA4050DF1B20319C3BA002A99BB003C85DB004E64F9006131
+CC007D00960B9134D9586900D0428300D0428300D0428300D0428300D04283
+00D0428300D0428300D0428300D0428300D0428300D0428300D0428300D042
+8300D04283A1510000A1540000A4590000A85E0000AD650000B36E0000B97A
+0000C4860000D8910001DE9D0005D2AB000BC8C50013B1E2001CB2FF1F0C7C
+FF043852FF00522CFE006A0BF6017B00FD297A00FE3D7400FE3D7400FE3D74
+00FE3D7400FE3D7400FE3D7400FE3D7400FE3D7400FE3D7400FE3D7400FE3D
+7400FE3D7400FE3D7400FE3D74A0510000A1550000A3590000A75F0000AC66
+0000B16F0000B77B0000C0860000BE920000B5A00001B5B20006AED0000E9E
+EF011591FF0D1763FF003A42FF00511CFF006A03FF077400FF316F00FF4B6B
+00FF4B6B00FF4B6B00FF4B6B00FF4B6B00FF4B6B00FF4B6B00FF4B6B00FF4B
+6B00FF4B6B00FF4B6B00FF4B6B00FF4B6B00FF4B6BA0520000A1550000A35A
+0000A65F0000AB660000AF700000B57B0000B4870000AA940000A8A20002A7
+B900069CD2000E8FF2011579FF022151FF003C2FFF005610FF006901FF176D
+00FF3B6700FF5B6200FF5B6200FF5B6200FF5B6200FF5B6200FF5B6200FF5B
+6200FF5B6200FF5B6200FF5B6200FF5B6200FF5B6200FF5B6200FF5B62A052
+0000A1560000A25A0000A55F0000AA660000AF700000AE7B0000A5890000A0
+9700019FA7000399BC00078ED5000E82F6001564FF002743FF003E21FF005A
+06FF03660BFF2B5E00FF465E00FF665B00FF665B00FF665B00FF665B00FF66
+5B00FF665B00FF665B00FF665B00FF665B00FF665B00FF665B00FF665B00FF
+665B00FF665BA0520000A0560000A25A0000A55F0000AA660000AC700000A1
+7D00009B8B0000989A000196AB000490C2000784DB000E75FC001652FF002C
+36FF004214FF005A02FF0B6116FF414E33FF6E2B00FF715300FF715300FF71
+5300FF715300FF715300FF715300FF715300FF715300FF715300FF715300FF
+715300FF715300FF715300FF7153A0520000A0560000A25A0000A55F0000AA
+6600009E72000097800000948D0000919D00018FB1000388C800077EE8000C
+68FF001943FB003028FF03470AFF00590CFF23511EFF4F3C0EFF5D4300FF6D
+4D00FF6D4D00FF6D4D00FF6D4D00FF6D4D00FF6D4D00FF6D4D00FF6D4D00FF
+6D4D00FF6D4D00FF6D4D00FF6D4D00FF6D4D00FF6D4DA0520000A0560000A2
+5A0000A55F00009B69000094750000908200008D9000008AA1000187B50003
+82D1000576F2000C53F300203DFB072D1BFF014903FF055514FF364327FF5D
+2C04FF5C440DFF843E0DFF843E0DFF843E0DFF843E0DFF843E0DFF843E0DFF
+843E0DFF843E0DFF843E0DFF843E0DFF843E0DFF843E0DFF843E0DFF843EA0
+520000A0560000A25A000099620000906B00018C7700008985000085930000
+83A5000181BC000180E500016DFA000C42E900252FFF033410FF004908FF16
+4919FF46371DFF5D2E06FF663E0EFF96350EFF96350EFF96350EFF96350EFF
+96350EFF96350EFF96350EFF96350EFF96350EFF96350EFF96350EFF96350E
+FF96350EFF9635A0520000A0560000985C00008E640001886E000085790000
+828700007D9600007DA900007CC5000072DE000454E5001637E6002623FF00
+380BFF074619FF333319FF4E2F03FF503D13FF802F0CFF99300CFF99300CFF
+99300CFF99300CFF99300CFF99300CFF99300CFF99300CFF99300CFF99300C
+FF99300CFF99300CFF99300CFF9930A0520000995700008C5E000185660001
+807000007D7C0000798900007398000073AC000071C5000165DF000542D800
+1A2EE800281AFF003904FF0A431AFF3C2B14FF4F2C0DFF612F12FF842A0CFF
+9B2B0CFF9B2B0CFF9B2B0CFF9B2B0CFF9B2B0CFF9B2B0CFF9B2B0CFF9B2B0C
+FF9B2B0CFF9B2B0CFF9B2B0CFF9B2B0CFF9B2B0CFF9B2B9B5300008C590001
+836100017C68000079720000757E00006D8B0000689A000067AC000065C500
+0155D7000A37D5001B27ED002912FF013903FF153D18FF412603FF443317FF
+732310FF89260AFF9F270AFF9F270AFF9F270AFF9F270AFF9F270AFF9F270A
+FF9F270AFF9F270AFF9F270AFF9F270AFF9F270AFF9F270AFF9F270AFF9F27
+8D560000825C00017A620000746A0000707400006A800000648D00005F9B00
+005CAC000059C5000143CD00102ED7001C20F100290AFF023601FF1C3714FF
+452303FF4C2D15FF77200DFF8B2309FFA12409FFA22409FFA22409FFA22409
+FFA22409FFA22409FFA22409FFA22409FFA22409FFA22409FFA22409FFA224
+09FFA22409FFA22483570001795D0000726400006C6C000068770000628300
+005C900000589E000054AD00004DC1000439CD001128DB001C1AF6002904FF
+0A3307FF282B14FF4C1E13FF651D11FF7A1C0BFF8E1F0AFFA21F0AFFA21F0A
+FFA21F0AFFA21F0AFFA21F0AFFA21F0AFFA21F0AFFA21F0AFFA21F0AFFA21F
+0AFFA21F0AFFA21F0AFFA21F0AFFA21F>
+<A24B0000A54E0000A8520000AD560000B45B0000BD610000C8690000D46F00
+09E1710014F571001FFE68022EF4510047D834005ECE0B0179C000197EF402
+417CD8006479CE10946DB512CC69AD13FE65AC12FD65AC12FD65AC12FD65AC
+12FD65AC12FD65AC12FD65AC12FD65AC12FD65AC12FD65AC12FD65AC12FD65
+AC12FD65AC12FD65A24B0000A54E0000A8520000AD560000B45B0000BD6100
+00C8690000D46F0009E1710014F571001FFE68022EF4510047D834005ECE0B
+0179C000197EF402417CD8006479CE10946DB512CC69AD13FE65AC12FD65AC
+12FD65AC12FD65AC12FD65AC12FD65AC12FD65AC12FD65AC12FD65AC12FD65
+AC12FD65AC12FD65AC12FD65AC12FD65A24B0000A54E0000A8520000AD5600
+00B45B0000BD610000C8690000D46F0009E1710014F571001FFE68022EF451
+0047D834005ECE0B0179C000197EF402417CD8006479CE10946DB512CC69AD
+13FE65AC12FD65AC12FD65AC12FD65AC12FD65AC12FD65AC12FD65AC12FD65
+AC12FD65AC12FD65AC12FD65AC12FD65AC12FD65AC12FD65A24B0000A54E00
+00A8520000AD560000B45B0000BD610000C8690000D46F0009E1710014F571
+001FFE68022EF4510047D834005ECE0B0179C000197EF402417CD8006479CE
+10946DB512CC69AD13FE65AC12FD65AC12FD65AC12FD65AC12FD65AC12FD65
+AC12FD65AC12FD65AC12FD65AC12FD65AC12FD65AC12FD65AC12FD65AC12FD
+65A24B0000A54E0000A8520000AD560000B45B0000BD610000C8690000D46F
+0009E1710014F571001FFE68022EF4510047D834005ECE0B0179C000197EF4
+02417CD8006479CE10946DB512CC69AD13FE65AC12FD65AC12FD65AC12FD65
+AC12FD65AC12FD65AC12FD65AC12FD65AC12FD65AC12FD65AC12FD65AC12FD
+65AC12FD65AC12FD65A24B0000A54E0000A8520000AD560000B45B0000BD61
+0000C8690000D46F0009E1710014F571001FFE68022EF4510047D834005ECE
+0B0179C000197EF402417CD8006479CE10946DB512CC69AD13FE65AC12FD65
+AC12FD65AC12FD65AC12FD65AC12FD65AC12FD65AC12FD65AC12FD65AC12FD
+65AC12FD65AC12FD65AC12FD65AC12FD65A24B0000A54E0000A8520000AD56
+0000B45B0000BD610000C8690000D46F0009E1710014F571001FFE68022EF4
+510047D834005ECE0B0179C000197EF402417CD8006479CE10946DB512CC69
+AD13FE65AC12FD65AC12FD65AC12FD65AC12FD65AC12FD65AC12FD65AC12FD
+65AC12FD65AC12FD65AC12FD65AC12FD65AC12FD65AC12FD65A24B0000A54E
+0000A8520000AD560000B45B0000BD610000C8690000D46F0009E0710014F5
+71001FFE68022EF4510047D834005ECE0B0179C000197EF402417CD8006479
+CE10946DB512CC69AD13FE65AC12FD65AC12FD65AC12FD65AC12FD65AC12FD
+65AC12FD65AC12FD65AC12FD65AC12FD65AC12FD65AC12FD65AC12FD65AC12
+FD65A24B0000A44E0000A8520000AD560000B45B0000BC610000C7690000D4
+6F0008E0720013F572001FFF69022CF7530046DA37005DCF0E0079C000177F
+EF023E7DD900627ACC0E8F6FB111C46BA811F567A811F468A811F468A811F4
+68A811F468A811F468A811F468A811F468A811F468A811F468A811F468A811
+F468A811F468A811F468A24B0000A44F0000A8520000AD560000B35B0000BB
+620000C66A0000D3700007DF730012F374001DFF6E032AFB580043E23E005B
+D0160075BF001281E001367FD9005C7CC80A8474A90EB46F9F0EE36C9E0EE3
+6D9E0EE36D9E0EE36D9E0EE36D9E0EE36D9E0EE36D9E0EE36D9E0EE36D9E0E
+E36D9E0EE36D9E0EE36D9E0EE36D9E0EE36DA24C0000A44F0000A7520000AC
+560000B25B0000BB620000C66A0000D2710006DE750011F276001CFF720526
+FC5E033DEC440059D31D0072BE000D83D4012F81D902577DC3067A79A30CA7
+74960AD372960AD372960AD372960AD372960AD372960AD372960AD372960A
+D372960AD372960AD372960AD372960AD372960AD372960AD372A24C0000A4
+4F0000A7520000AC570000B25C0000BA630000C56B0000D1720006DE760010
+F178001BFF780821FD660636F54A0056D625006FC1060A82C8002884D90551
+7FBF017080A30D9C768E06C5788E06C5798E06C5798E06C5798E06C5798E06
+C5798E06C5798E06C5798E06C5798E06C5798E06C5798E06C5798E06C5798E
+06C579A24C0000A44F0000A7530000AC570000B15C0000B9630000C46C0000
+D0740005DE78000EF07A0019FF7B081FFE6D0A30F84F0054D92E006CC50B07
+82BF002186D9084C80BE006983A40E92798602B97F8602B87F8602B87F8602
+B87F8602B87F8602B87F8602B87F8602B87F8602B87F8602B87F8602B87F86
+02B87F8602B87F8602B87FA24C0000A34F0000A6530000AB570000B15C0000
+B9630000C36C0000CF750004DE7A000DEE7C0018FF7D081DFF760D29FC5400
+51DF380068C9110381BC001B89D90C4680BC006286A9148A778506AF7F8507
+AE7F8507AE7F8507AE7F8507AE7F8507AE7F8507AE7F8507AE7F8507AE7F85
+07AE7F8507AE7F8507AE7F8507AE7F8507AE7FA24C0000A34F0000A6530000
+AB580000B05D0000B8640000C26D0000CE770002DD7C000BEE7F0016FF8108
+1BFF7E1023FF5B004DE9410065D21A007FB100118DBB0937878F0E56886E0F
+7189500080974C007F984C007F984C007F984C007F984C007F984C007F984C
+007F984C007F984C007F984C007F984C007F984C007F984C007F98A14D0000
+A3500000A5530000AA580000B05D0000B7640000C06E0000CD780002DD7E00
+09EE820014FF840719FF821020FF650345F54C0060D929007A840D02975900
+16A4440036A9320050AD2B09739F2509759F2509759F2509759F2509759F25
+09759F2509759F2509759F2509759F2509759F2509759F2509759F2509759F
+2509759FA14D0000A3500000A5540000A9580000AF5E0000B5650000BF6F00
+00CA7A0001DB810007F0850010FF880617FF87101CFF750D34EA5E005BA24D
+0073642C0093211000AC050919B6041340B6001058B0001357AF001357AF00
+1357AF001357AF001357AF001357AF001357AF001357AF001357AF001357AF
+001357AF001357AF001357AFA14D0000A2510000A4540000A8590000AE5E00
+00B4650000BD6F0000C77B0000D8830005EF89000DFF8D0613FF8E1117FF8B
+0A2EA47500548168006B5557008B1B35019D002E15AA084340A103435B9A02
+435B9A02435B9A02435B9A02435B9A02435B9A02435B9A02435B9A02435B9A
+02435B9A02435B9A02435B9A02435B9A02435B9AA14E0000A2510000A45500
+00A7590000AD5F0000B3660000BB700000C47C0000D5860003F38E000AFF95
+0B08FB9A041CC69900329692004A829B005F589100791D650094005C149E05
+703F9401695A8F006B5C8E006B5C8E006B5C8E006B5C8E006B5C8E006B5C8E
+006B5C8E006B5C8E006B5C8E006B5C8E006B5C8E006B5C8E006B5C8EA14E00
+00A2510000A3550000A75A0000AC5F0000B1670000B8710000C17D0000D088
+0001F2920006DD9A000FD8AA0018B5B300268FB100397AC7004D57D1006226
+AC007E008C128C00AC388517B9746F15BB727015BB727015BB727015BB7270
+15BB727015BB727015BB727015BB727015BB727015BB727015BB727015BB72
+7015BB7270A14F0000A1520000A2560000A65A0000AA600000B0670000B672
+0000BE7E0000CA890000BD940004B9A1000AB3B60011A5D0001998F6011F77
+FB00334FF2004F27EC006805DD087800F12A7400F85C6D00FA5F6C00FA5F6C
+00FA5F6C00FA5F6C00FA5F6C00FA5F6C00FA5F6C00FA5F6C00FA5F6C00FA5F
+6C00FA5F6C00FA5F6C00FA5F6CA14F0000A1520000A2560000A55B0000A961
+0000AE680000B3720000BA7E0000AE8B0000A8990002A7A90005A1C2000995
+DE001088FA031765FF002B43FF00451EFF006004FF046C00FF2B6900FF5762
+00FF5D6100FF5D6100FF5D6100FF5D6100FF5D6100FF5D6100FF5D6100FF5D
+6100FF5D6100FF5D6100FF5D6100FF5D6100FF5D61A1500000A0530000A157
+0000A45B0000A8610000AC690000B1730000A7810000A18E00009E9D00019B
+AF000593C6000A88E2001076FC001A52FF003233FF004B11FF006001FF1266
+0AFF3F5A00FF5F5A00FF695900FF695900FF695900FF695900FF695900FF69
+5900FF695900FF695900FF695900FF695900FF695900FF695900FF6959A050
+0000A0530000A1570000A35C0000A7620000AC690000A47500009C83000098
+90000095A0000293B5000488CA000A7FEC000F65FF001F43FF003523FF0050
+07FF005F1AFF384A22FF573C00FF675200FF745100FF745100FF745100FF74
+5100FF745100FF745100FF745100FF745100FF745100FF745100FF745100FF
+745100FF7451A0500000A0540000A1570000A35C0000A7620000A16B000099
+77000094850000919300008FA400028ABA000481D3000976F7000F53FB0023
+3CFF063317FF005102FF085A17FF404531FF692601FF654B01FF724B01FF72
+4B01FF724B01FF724B01FF724B01FF724B01FF724B01FF724B01FF724B01FF
+724B01FF724B01FF724B01FF724BA0500000A0540000A1570000A35C00009E
+630000956E0000907A00008D8800008997000187A9000284C100037DE30006
+6AFC001142F2002936FF0D310CFF004F08FF1C4C15FF483E30FF6F2011FF83
+3910FF983810FF983810FF983810FF983810FF983810FF983810FF983810FF
+983810FF983810FF983810FF983810FF983810FF9838A0500000A0540000A1
+5700009C5D0000926600008C700000897C0000858A0000819A000080AE0001
+80CC000173E7000651E7001A37F2002B1FFF004007FF074B1AFF3A3610FF4C
+3A08FF5A3A0FFF8F330CFFA1330CFFA1330CFFA1330CFFA1330CFFA1330CFF
+A1330CFFA1330CFFA1330CFFA1330CFFA1330CFFA1330CFFA1330CFFA133A0
+500000A05400009D580000906000018868000184720000817F00007D8D0000
+799D000079B3000077D000016BEF000640DB001E2DF2002D15FF004007FF14
+431DFF452C0CFF50350CFF6A330EFF902E0BFFA12E0BFFA12E0BFFA12E0BFF
+A12E0BFFA12E0BFFA12E0BFFA12E0BFFA12E0BFFA12E0BFFA12E0BFFA12E0B
+FFA12E0BFFA12EA05000009F5400008F5A0001866200017F6A00007C750000
+79810000728F00006E9F00006FB500006BD0000252DA000F35D8001F25F400
+2E0CFF013E04FF1C3E1DFF4D2508FF513215FF7A270CFF972A0AFFA52A0AFF
+A52A0AFFA52A0AFFA52A0AFFA52A0AFFA52A0AFFA52A0AFFA52A0AFFA52A0A
+FFA52A0AFFA52A0AFFA52A0AFFA52AA050000090560000845D00017D640000
+776C0000747700006E8300006791000063A0000061B300005DCE000241D000
+142DDB00201DF7002F07FF073A03FF243813FF4A260BFF5C2A13FF7F230AFF
+9A2608FFA72608FFA72608FFA72608FFA72608FFA72608FFA72608FFA72608
+FFA72608FFA72608FFA72608FFA72608FFA72608FFA7269252000085580001
+7B5F0000746600006F6E00006A790000648500005E9300005BA2000058B400
+004EC8000637D0001526E0002116FA002E02FF0F370AFF2F2B11FF502213FF
+6C2010FF821F0AFF9B2207FFA62207FFA62207FFA62207FFA62207FFA62207
+FFA62207FFA62207FFA62207FFA62207FFA62207FFA62207FFA62207FFA622
+865500017B5A0000726000006C67000068710000627C00005C880000579600
+0054A400004FB5000141C6000A2ED2001521E6002110FE032C01FF183013FF
+3E1E14FF591B11FF701C11FF86190AFF9C1D08FFA71D08FFA71D08FFA71D08
+FFA71D08FFA71D08FFA71D08FFA71D08FFA71D08FFA71D08FFA71D08FFA71D
+08FFA71D08FFA71D7C560000725C00006A62000065690000607400005B7F00
+00568B0000519800004DA6000046B6000238C8000B28D600151BEC002009FF
+052B00FF1E2B11FF421911FF5D1813FF741418FF8A0A0AFF9C1906FFA61B06
+FFA61B06FFA61B06FFA61B06FFA61B06FFA61B06FFA61B06FFA61B06FFA61B
+06FFA61B06FFA61B06FFA61B06FFA61B>
+<A2480000A44A0000A74E0000AC510000B2560000BA5B0000C4600000D06500
+08DD680012EF66001EF85B002EE7440045D226005DCB000575BF001F73E200
+4372D400686ED500A56BA700E269A713FF58A713FF58A713FF58A713FF58A7
+13FF58A713FF58A713FF58A713FF58A713FF58A713FF58A713FF58A713FF58
+A713FF58A713FF58A2480000A44A0000A74E0000AC510000B2560000BA5B00
+00C4600000D0650008DD680012EF66001EF85B002EE7440045D226005DCB00
+0575BF001F73E2004372D400686ED500A56BA700E269A713FF58A713FF58A7
+13FF58A713FF58A713FF58A713FF58A713FF58A713FF58A713FF58A713FF58
+A713FF58A713FF58A713FF58A713FF58A2480000A44A0000A74E0000AC5100
+00B2560000BA5B0000C4600000D0650008DD680012EF66001EF85B002EE744
+0045D226005DCB000575BF001F73E2004372D400686ED500A56BA700E269A7
+13FF58A713FF58A713FF58A713FF58A713FF58A713FF58A713FF58A713FF58
+A713FF58A713FF58A713FF58A713FF58A713FF58A713FF58A2480000A44A00
+00A74E0000AC510000B2560000BA5B0000C4600000D0650008DD680012EF66
+001EF85B002EE7440045D226005DCB000575BF001F73E2004372D400686ED5
+00A56BA700E269A713FF58A713FF58A713FF58A713FF58A713FF58A713FF58
+A713FF58A713FF58A713FF58A713FF58A713FF58A713FF58A713FF58A713FF
+58A2480000A44A0000A74E0000AC510000B2560000BA5B0000C4600000D065
+0008DD680012EF66001EF85B002EE7440045D226005DCB000575BF001F73E2
+004372D400686ED500A56BA700E269A713FF58A713FF58A713FF58A713FF58
+A713FF58A713FF58A713FF58A713FF58A713FF58A713FF58A713FF58A713FF
+58A713FF58A713FF58A2480000A44A0000A74E0000AC510000B2560000BA5B
+0000C4600000D0650008DD680012EF66001EF85B002EE7440045D226005DCB
+000575BF001F73E2004372D400686ED500A56BA700E269A713FF58A713FF58
+A713FF58A713FF58A713FF58A713FF58A713FF58A713FF58A713FF58A713FF
+58A713FF58A713FF58A713FF58A713FF58A2480000A44B0000A74E0000AC51
+0000B2560000BA5B0000C4600000D0660007DD680012EF66001EF95B002EE8
+450044D227005CCB000575BF001F73E2004272D500676ED500A56BA700E169
+A713FF58A713FF58A713FF58A713FF58A713FF58A713FF58A713FF58A713FF
+58A713FF58A713FF58A713FF58A713FF58A713FF58A713FF58A1480000A34B
+0000A74E0000AB520000B1560000B95B0000C4610000CF670007DC690011EE
+68001DFA5F002DED4A0043D32C005ACE000177BF001C75E2003E74D7006370
+D8009F6DAC02DA69A712FF5BA813FF5AA813FF5AA813FF5AA813FF5AA813FF
+5AA813FF5AA813FF5AA813FF5AA813FF5AA813FF5AA813FF5AA813FF5AA813
+FF5AA1480000A34B0000A74E0000AB520000B1560000B95B0000C3610000CF
+670006DB6A0011ED6A001CFC62002BF24E0041D5310058CE060075C0001876
+DB003976D9006071D600966FB105D069A811FF5DA913FF5CA913FF5CA913FF
+5CA913FF5CA913FF5CA913FF5CA913FF5CA913FF5CA913FF5CA913FF5CA913
+FF5CA913FF5CA913FF5CA1480000A34B0000A64F0000AB520000B1560000B8
+5C0000C2620000CE680005DB6C0010EC6C001BFD660029F552003FDA370056
+CE0D0071C0001478D5003477DB005C73D5008D71B708C669A911FF60AA13FF
+5EAA13FF5EAA13FF5EAA13FF5EAA13FF5EAA13FF5EAA13FF5EAA13FF5EAA13
+FF5EAA13FF5EAA13FF5EAA13FF5EAA13FF5EA1480000A34B0000A64F0000AA
+520000B0570000B85C0000C2630000CE690004DA6D000FEA6E001AFD690126
+F756003CE03D0054CD14006EC000117ACE002F79DF005875D3008573BD0BBC
+68A910FF62AB13FF60AB13FF60AB13FF60AB13FF60AB13FF60AB13FF60AB13
+FF60AB13FF60AB13FF60AB13FF60AB13FF60AB13FF60AB13FF60A1490000A3
+4C0000A64F0000AA530000B0570000B75C0000C1630000CD6A0003D96E000E
+E86F0019FD6D0224F95A003AE5420052CD1C006BC3030D7BC8002A7BE60154
+78D2007D75C00FB369AB10FC65AC13FF62AC13FF62AC13FF62AC13FF62AC13
+FF62AC13FF62AC13FF62AC13FF62AC13FF62AC13FF62AC13FF62AC13FF62AC
+13FF62A1490000A34C0000A64F0000AA530000AF570000B75D0000C0640000
+CC6B0003D870000DE7710018FB6F0223FC600037EC48004FCC260067C60609
+7CC200247DED01507AD1007478C313A969AE12F466AD13FF65AD13FF65AD13
+FF65AD13FF65AD13FF65AD13FF65AD13FF65AD13FF65AD13FF65AD13FF65AD
+13FF65AD13FF65AD13FF65A1490000A34C0000A5500000A9530000AF580000
+B65D0000BF640000CB6C0001D771000BE4730016FA730221FF660033F44F00
+4CD0300063CA0A057CC0001E80F104497DD2006C7BBF149C6D7F00CC7C6D01
+D97E6C01D97E6C01D97E6C01D97E6C01D97E6C01D97E6C01D97E6C01D97E6C
+01D97E6C01D97E6C01D97E6C01D97E6C01D97EA14A0000A24D0000A5500000
+A9540000AE580000B55E0000BE650000C96D0001D6730009E3760014F87701
+1FFF6D042CFA560048DE3A0060D012007BBD001683A60032888400518D831B
+87785100A98D4700C58A4600C58B4600C58B4600C58B4600C58B4600C58B46
+00C58B4600C58B4600C58B4600C58B4600C58B4600C58B4600C58BA14A0000
+A24D0000A5500000A8540000AD590000B45E0000BC660000C76F0001D57600
+07E3790012F77B011CFF770923FD61043FF146005CC3270076780A01915400
+179E410034A1340054A52C0B8E98220FA993210EA894210EA894210EA89421
+0EA894210EA894210EA894210EA894210EA894210EA894210EA894210EA894
+210EA894A14A0000A24D0000A4510000A7540000AD590000B35F0000BB6600
+00C5710000D3790005E37D000FF57F0119FF810D1BFF710B30C35B00569147
+00705C29008D1D0E00A605091AAD04123EAC1C2781931B2D9D8C1B2D9D8C1B
+2D9D8C1B2D9D8C1B2D9D8C1B2D9D8C1B2D9D8C1B2D9D8C1B2D9D8C1B2D9D8C
+1B2D9D8C1B2D9D8C1B2D9D8CA14B0000A24E0000A3510000A7550000AB5A00
+00B15F0000B9670000C3720000D17C0003E281000CF5830016FF870C18E083
+02339C7100507A63006850510086162F0096002D16A3003B3C9F0542759303
+42888E0242888F0242888F0242888F0242888F0242888F0242888F0242888F
+0242888F0242888F0242888F0242888F0242888FA14B0000A24E0000A35100
+00A6550000AA5A0000B0600000B7680000C0730000CD7E0002E0850008EC8A
+0012E393001DB291002F8F8D00457993005D4E820077165800900057169700
+663C9122858872167A9174167B9274167B9274167B9274167B9274167B9274
+167B9274167B9274167B9274167B9274167B9274167B9274167B9274A14C00
+00A14F0000A2520000A5560000A95B0000AE610000B5690000BD740000C980
+0000D1890005C491000EBD9F0018A6A9002488AA003471B8004B4BB000631D
+93007F00841587008F3A800DB27A7200A2877500A3877500A3877500A38775
+00A3877500A3877500A3877500A3877500A3877500A3877500A3877500A387
+7500A38775A14C0000A14F0000A2520000A3570000A85C0000AD620000B36A
+0000BA750000BB820000B08D0004AC99000BA6AA001199BE00188BD7001F69
+D5003548D6004F1FC8006801B80F7600D9306F00DD5A6901F2846401F38464
+01F3846401F3846401F3846401F3846401F3846401F3846401F3846401F384
+6401F3846401F3846401F38464A14D0000A1500000A1530000A3570000A65C
+0000AB630000B16B0000B0770000A5840001A09100039DA1000697B4000A8D
+CB001080EB001664FA002542FC003E20FF005906FF066512FF38560AFF5153
+00FF6B5800FF6B5800FF6B5800FF6B5800FF6B5800FF6B5800FF6B5800FF6B
+5800FF6B5800FF6B5800FF6B5800FF6B5800FF6B58A14D0000A1500000A054
+0000A2580000A55D0000AA630000AA6D00009F7A0000998800009596000193
+A700038EBE000683D6000C76F9001353FD002935FF004013FF00570AFF1458
+15FF454A24FF6A3300FF735000FF735000FF735000FF735000FF735000FF73
+5000FF735000FF735000FF735000FF735000FF735000FF735000FF7350A14E
+0000A0510000A0540000A1590000A45E0000A66500009B6F0000957D000091
+8A00008E9A00018CAD000386C400057DE4000A68FD001643F9002D2DFF093D
+09FF005606FF20522BFF5C2C00FF584C05FF7B4605FF7B4605FF7B4605FF7B
+4605FF7B4605FF7B4605FF7B4605FF7B4605FF7B4605FF7B4605FF7B4605FF
+7B4605FF7B46A14F0000A0510000A0550000A1590000A35E00009767000090
+7200008D7F00008A8D0000869D000184B2000281CF000375EF000952EE001E
+39FC022E1BFF004702FF075219FF3F3A22FF5E2C01FF5E430EFF9E360EFF9E
+360EFF9E360EFF9E360EFF9E360EFF9E360EFF9E360EFF9E360EFF9E360EFF
+9E360EFF9E360EFF9E360EFF9E36A14F0000A0510000A0550000A159000094
+6100008C6A00018975000085820000829000007FA100007EB900007CDD0001
+6FFE000840E300222DFF003210FF014612FF233D1BFF4A3105FF513E11FF7B
+330BFFA9310AFFAC320AFFAC320AFFAC320AFFAC320AFFAC320AFFAC320AFF
+AC320AFFAC320AFFAC320AFFAC320AFFAC320AFFAC32A14F0000A0510000A0
+550000935B00008A630001836C0000817700007D8400007892000076A50000
+77BF00006ED8000350DD001435E1002324FF003509FF044314FF2E321DFF55
+2807FF5A3611FF832C09FFAB2D08FFAF2D08FFAF2D08FFAF2D08FFAF2D08FF
+AF2D08FFAF2D08FFAF2D08FFAF2D08FFAF2D08FFAF2D08FFAF2D08FFAF2DA1
+4F0000A051000094570000885E0001806500007B6E00007979000073860000
+6B9400006BA6000069BD00005FD600053FD400182CE300251AFE003604FF0C
+3F13FF362C06FF433218FF722410FF8A2707FFAB2906FFAD2906FFAD2906FF
+AD2906FFAD2906FFAD2906FFAD2906FFAD2906FFAD2906FFAD2906FFAD2906
+FFAD2906FFAD29A14F000096530000885900017E6000007767000073700000
+6E7C000068880000619600005FA700005CBC00004ECE000A35D3001825E800
+2611FE003401FF153A10FF3B2805FF4A2D15FF77200DFF8C2305FFAD2605FF
+AD2605FFAD2605FFAD2605FFAD2605FFAD2605FFAD2605FFAD2605FFAD2605
+FFAD2605FFAD2605FFAD2605FFAD2699500000885500017D5B000075620000
+6F6900006A730000657E00005F8B00005998000057A8000053BD000140CA00
+0E2DD500181FED00260AFF043201FF1E3315FF471E12FF601F12FF7A1D0AFF
+8F2004FFA62203FFA72203FFA72203FFA72203FFA72203FFA72203FFA72203
+FFA72203FFA72203FFA72203FFA72203FFA72203FFA7228A5200007E570000
+745D00006D630000676B0000637600005D810000588E0000539B00004FAA00
+0048BD000336CB000E26DA001919F3002504FF0B2F03FF252B15FF4E1912FF
+661A12FF7D170CFF911A06FFA91D05FFA91E05FFA91E05FFA91E05FFA91E05
+FFA91E05FFA91E05FFA91E05FFA91E05FFA91E05FFA91E05FFA91E05FFA91E
+7F540001755900006C5E000065650000616E00005C79000057840000529100
+004D9E000048AC00003EBE00052ECE000E20E0001912F6002501FF132A01FF
+292613FF521510FF68151AFF820712FF930E03FFA91B02FFAA1B02FFAA1B02
+FFAA1B02FFAA1B02FFAA1B02FFAA1B02FFAA1B02FFAA1B02FFAA1B02FFAA1B
+02FFAA1B02FFAA1B765500006C5A0000646000005F6700005A710000567C00
+00518800004C94000047A1000041AF000136C2000527D3000F1BE600190BF9
+032400FF1B250CFF371712FF570F0CFF6A1313FF800A11FF940901FFA41801
+FFA51901FFA51901FFA51901FFA51901FFA51901FFA51901FFA51901FFA519
+01FFA51901FFA51901FFA51901FFA519>
+<A1440000A3470000A64A0000AA4D0000B0510000B7550000C1590000CD5D00
+06DA5E0011E95A001EED4D002EDC370043D518005DC3000D6CBC002569CB00
+4467CE006A64BF009662A800CE5EA710FF4FA412FF4BA412FF4BA412FF4BA4
+12FF4BA412FF4BA412FF4BA412FF4BA412FF4BA412FF4BA412FF4BA412FF4B
+A412FF4BA412FF4BA1440000A3470000A64A0000AA4D0000B0510000B75500
+00C1590000CD5D0006DA5E0011E95A001EED4D002EDC370043D518005DC300
+0D6CBC002569CB004467CE006A64BF009662A800CE5EA710FF4FA412FF4BA4
+12FF4BA412FF4BA412FF4BA412FF4BA412FF4BA412FF4BA412FF4BA412FF4B
+A412FF4BA412FF4BA412FF4BA412FF4BA1440000A3470000A64A0000AA4D00
+00B0510000B7550000C1590000CD5D0006DA5E0011E95A001EED4D002EDC37
+0043D518005DC3000D6CBC002569CB004467CE006A64BF009662A800CE5EA7
+10FF4FA412FF4BA412FF4BA412FF4BA412FF4BA412FF4BA412FF4BA412FF4B
+A412FF4BA412FF4BA412FF4BA412FF4BA412FF4BA412FF4BA1440000A34700
+00A64A0000AA4D0000B0510000B7550000C1590000CD5D0006DA5E0011E95A
+001EED4D002EDC370043D518005DC3000D6CBC002569CB004467CE006A64BF
+009662A800CE5EA710FF4FA412FF4BA412FF4BA412FF4BA412FF4BA412FF4B
+A412FF4BA412FF4BA412FF4BA412FF4BA412FF4BA412FF4BA412FF4BA412FF
+4BA1440000A3470000A64A0000AA4D0000B0510000B7550000C1590000CD5D
+0006DA5E0011E95A001EED4D002EDC370043D518005DC3000D6CBC002569CB
+004467CE006A64BF009662A800CE5EA710FF4FA412FF4BA412FF4BA412FF4B
+A412FF4BA412FF4BA412FF4BA412FF4BA412FF4BA412FF4BA412FF4BA412FF
+4BA412FF4BA412FF4BA1450000A3470000A64A0000AA4D0000B0510000B755
+0000C1590000CC5D0006D95F0011E95C001DEE50002DDF3B0042D41B005BC5
+000A6DBD00236AC9004168CF006765C1009363AA00CC5FA70FFF50A413FF4C
+A413FF4CA413FF4CA413FF4CA413FF4CA413FF4CA413FF4CA413FF4CA413FF
+4CA413FF4CA413FF4CA413FF4CA413FF4CA1450000A3470000A54A0000AA4E
+0000B0510000B7550000C05A0000CB5E0005D9600010E85E001CF053002BE3
+3F0040D3200059C700076EBE00216BC8003D6AD1006566C3009065AD00CA60
+A60EFF53A513FF4DA513FF4DA513FF4DA513FF4DA513FF4DA513FF4DA513FF
+4DA513FF4DA513FF4DA513FF4DA513FF4DA513FF4DA513FF4DA1450000A347
+0000A54A0000AA4E0000AF510000B6550000C05A0000CB5F0004D861000FE8
+60001BF156002AE743003ED3240057C9000570BE001E6DC8003A6BD3006268
+C6008E67B000C961A50CFF56A513FF4FA513FF4FA513FF4FA513FF4FA513FF
+4FA513FF4FA513FF4FA513FF4FA513FF4FA513FF4FA513FF4FA513FF4FA513
+FF4FA1450000A2470000A54B0000A94E0000AF520000B6560000BF5B0000CA
+600004D762000FE762001AF3590028EA47003DD3280054C904046EBF001B6E
+C700376CD5005F69C8008968B400C763A40BFF59A513FF50A513FF51A513FF
+51A513FF51A513FF51A513FF51A513FF51A513FF51A513FF51A513FF51A513
+FF51A513FF51A513FF51A1460000A2480000A54B0000A94E0000AF520000B5
+560000BF5B0000CA600003D763000EE6630019F45C0027ED4A003BD42D0052
+CA0A036CBF001870C500336ED7005B6ACA008569B800C564A209FF5CA613FF
+52A613FF52A613FF52A613FF52A613FF52A613FF52A613FF52A613FF52A613
+FF52A613FF52A613FF52A613FF52A613FF52A1460000A2480000A54B0000A9
+4F0000AE520000B5560000BE5C0000C9610003D665000DE5650018F65F0025
+F04E0039D5330050CA100269BF001571C4002F6FDA00586CCC00806BBD00C4
+65A107FF60A613FF54A613FF54A613FF54A613FF54A613FF54A613FF54A613
+FF54A613FF54A613FF54A613FF54A613FF54A613FF54A613FF54A1460000A2
+480000A54B0000A94F0000AE530000B4570000BD5C0000C8620002D566000C
+E3670017F6630023F4530037D939004DCA170166C2001073C2002B71DC0053
+6FCE007A6CC300C067A106FB63A713FF56A713FF57A713FF57A713FF57A713
+FF57A713FF57A713FF57A713FF57A713FF57A713FF57A713FF57A713FF57A7
+13FF57A1470000A2490000A44C0000A84F0000AD530000B4570000BD5D0000
+C8630001D467000AE1690015F5660022F9580034E140004BCB1F0063C6000B
+76C0002674DF004D72D100736FC901B869A305F566A713FF59A813FF59A813
+FF59A813FF59A813FF59A813FF59A813FF59A813FF59A813FF59A813FF59A8
+13FF59A813FF59A813FF59A1470000A2490000A44C0000A8500000AD530000
+B3580000BC5D0000C6640000D3690009DF6C0014F36A0020FD5F0030EA4700
+47CF28005FCA030677BF002077E8014775D4006C72B707A76F7F01E0766500
+F3766000EC776000EC776000EC776000EC776000EC776000EC776000EC7760
+00EC776000EC776000EC776000EC776000EC77A1470000A24A0000A44D0000
+A7500000AC540000B2580000BA5E0000C5650000D16B0007DE6E0012F16E00
+1DFE66022BF4500044D933005BCE080078B900187C9500308379004D878F1C
+91734E00B4874100EC813D00ED823D00ED823D00ED823D00ED823D00ED823D
+00ED823D00ED823D00ED823D00ED823D00ED823D00ED823D00ED82A1480000
+A14A0000A34D0000A7500000AB540000B1590000B95F0000C3660000D06D00
+05DC710010EE72001BFE6E0326FA59003EE7410057B02500726D09018C5000
+17983E00319A3200519D2201949B2209F48F210DF38E210DF38E210DF38E21
+0DF38E210DF38E210DF38E210DF38E210DF38E210DF38E210DF38E210DF38E
+210DF38EA1480000A14A0000A34E0000A6510000AA550000B05A0000B86000
+00C2680000CE700003DA74000DE9760018FD760421FB700C2BAE5600528740
+006C562600871B0D00A0050919A5030F39A30C1F7E9B2230E27F2334E37D23
+34E37D2334E37D2334E37D2334E37D2334E37D2334E37D2334E37D2334E37D
+2334E37D2334E37D2334E37DA1490000A14B0000A34E0000A5520000A95600
+00AF5A0000B6610000BF690000CB720002D978000AE87B0015EE7E0021C17A
+0032946D004C725C00654C4B0081132C0191002B169C00383A9A023F6D9101
+3EAE840242B4820242B4820242B4820242B4820242B4820242B4820242B482
+0242B4820242B4820242B4820242B4820242B482A14A0000A14C0000A24F00
+00A4520000A8560000AE5B0000B4620000BD6A0000C8750000D87D0007D382
+0011C589001DA589002D888700427088005C447100761250008C0052179100
+5F3C8B00677085227CDD64237FDD63237FDD63237FDD63237FDD63237FDD63
+237FDD63237FDD63237FDD63237FDD63237FDD63237FDD63237FDD63A14A00
+00A14C0000A24F0000A4530000A7570000AC5C0000B2630000BA6B0000C477
+0000BE810006B58A000FAC940018999C002381A0003269AA004B4299006416
+7F007F007A178200863B7B009F7A7514A2C26113A4C26113A4C26113A4C261
+13A4C26113A4C26113A4C26113A4C26113A4C26113A4C26113A4C26113A4C2
+6113A4C261A14B0000A14D0000A2500000A3530000A6580000AA5D0000B063
+0000B76C0000AF7A0001A7850006A291000B9A9F00128FAF00187FBE002060
+BF003740BB005018AC006800A3147100BD346B00C65F6501E7A85E01E7AD5D
+01E7AD5D01E7AD5D01E7AD5D01E7AD5D01E7AD5D01E7AD5D01E7AD5D01E7AD
+5D01E7AD5D01E7AD5D01E7AD5DA14C0000A14E0000A1500000A2540000A458
+0000A95E0000AE650000A67000009F7D0002998A0004959800078FA9000B86
+BD000F78D400165CDE00273FE8003D1EF5005602EA0A6215FF404F00FF5157
+00FF775200FF865100FF865100FF865100FF865100FF865100FF865100FF86
+5100FF865100FF865100FF865100FF865100FF8651A14C0000A14E0000A051
+0000A1550000A3590000A75F0000A068000097730001938100018F8F00018C
+A0000289B5000382D0000676F3000D54F600213DFD073017FF004F02FF0C57
+16FF434224FF662C08FF764307FF824207FF824207FF824207FF824207FF82
+4207FF824207FF824207FF824207FF824207FF824207FF824207FF8242A14D
+0000A14F0000A0520000A1560000A25A00009B610000926B00008E7700008B
+8500008793000084A5000182BC00027FE400036BFA000E41EC00262FFF0535
+0CFF004D10FF254314FF4B3B17FF633010FF90360DFFA2350DFFA2350DFFA2
+350DFFA2350DFFA2350DFFA2350DFFA2350DFFA2350DFFA2350DFFA2350DFF
+A2350DFFA235A14E0000A1500000A0520000A0560000995C00008F64000189
+6E0000867A0000828700007E9600007DAA00007DC7000071E0000550E30018
+35EB00281FFF003C07FF0A471BFF3C310FFF503608FF65380DFF953109FFAE
+3109FFAE3109FFAE3109FFAE3109FFAE3109FFAE3109FFAE3109FFAE3109FF
+AE3109FFAE3109FFAE3109FFAE31A14E0000A1500000A0520000995700008C
+5E000185660001807000007E7C0000798900007399000074AE000072C70001
+62DF00073ED7001C2CED002A15FF003C00FF0F441DFF472804FF4B3714FF7B
+2A0CFF982B06FFB22D06FFB22D06FFB22D06FFB22D06FFB22D06FFB22D06FF
+B22D06FFB22D06FFB22D06FFB22D06FFB22D06FFB22DA14E0000A15000009B
+5300008B5A0001826100007C68000078720000747F00006D8B0000679B0000
+66AD000064C7000150D6000C34D6001C24F1002B0EFF043A01FF1C3D17FF48
+260DFF5B2B13FF81240AFF9D2703FFB12903FFB12903FFB12903FFB12903FF
+B12903FFB12903FFB12903FFB12903FFB12903FFB12903FFB12903FFB129A1
+4E00009E5000008C560001815C000179630000736A00006F75000069810000
+638E00005E9C00005AAD000056C5000240CE00112CD9001D1DF6002B07FF07
+3702FF243415FF4F210EFF642410FF83210AFF9F2301FFAE2501FFAE2501FF
+AE2501FFAE2501FFAE2501FFAE2501FFAE2501FFAE2501FFAE2501FFAE2501
+FFAE2501FFAE25A14E00008D52000081580001775E0000706400006A6D0000
+66780000608400005A910000579F000052AF000049C2000635CE001225DE00
+1E17FB002A03FF10320FFF352313FF551D11FF6F1D0FFF871C0AFF9F1E00FF
+AC2200FFAC2200FFAC2200FFAC2200FFAC2200FFAC2200FFAC2200FFAC2200
+FFAC2200FFAC2200FFAC2200FFAC228F50000082540001775A00006E5F0000
+68660000637000005E7B0000598700005494000050A100004BB100003EC200
+082DD100121FE5001E0FFD002A00FF182D0EFF3A1E13FF5B1712FF731615FF
+8B100AFF9F1A00FFAC1F00FFAC1F00FFAC1F00FFAC1F00FFAC1F00FFAC1F00
+FFAC1F00FFAC1F00FFAC1F00FFAC1F00FFAC1F00FFAC1F8352000178560000
+6E5B000067610000616900005D730000587E0000538A00004E96000049A400
+0043B4000135C5000926D6001219EB001D06FE062800FF1F270DFF3F190EFF
+5C1613FF770E1BFF8E0206FF9E1700FFAB1C00FFAB1C00FFAB1C00FFAB1C00
+FFAB1C00FFAB1C00FFAB1C00FFAB1C00FFAB1C00FFAB1C00FFAB1C00FFAB1C
+795400006F570000665C0000606300005B6B000057760000518100004D8D00
+004799000042A600003BB700012DCA000920DB001214F0001D02FE0E2403FF
+261E13FF4B0D0BFF5F130FFF760D18FF8D0005FF9C1400FFAC1800FFAC1800
+FFAC1800FFAC1800FFAC1800FFAC1800FFAC1800FFAC1800FFAC1800FFAC18
+00FFAC1800FFAC1870560000675900005F5E00005A650000566F0000517A00
+004C85000047910000419D00003BAA000033BD000126CE00091AE000120CF3
+001D00FD161F02FF2A1A11FF4E0A0CFF620D10FF780513FF8B0007FF9A0D00
+FFAB1500FFAB1500FFAB1500FFAB1500FFAB1500FFAB1500FFAB1500FFAB15
+00FFAB1500FFAB1500FFAB1500FFAB15>
+<A1410000A1420000A4450000A9480000AF4B0000B64F0000BE520000C85500
+05D4540010E04D001DE33F002ED3290043CC0D015DBB001363B9002A5FC700
+485EC5006A5BB501925AA600BD54A40AF848A111FF40A111FF40A111FF40A1
+11FF40A111FF40A111FF40A111FF40A111FF40A111FF40A111FF40A111FF40
+A111FF40A111FF40A1410000A1420000A4450000A9480000AF4B0000B64F00
+00BE520000C8550005D4540010E04D001DE33F002ED3290043CC0D015DBB00
+1363B9002A5FC700485EC5006A5BB501925AA600BD54A40AF848A111FF40A1
+11FF40A111FF40A111FF40A111FF40A111FF40A111FF40A111FF40A111FF40
+A111FF40A111FF40A111FF40A111FF40A1410000A1420000A4450000A94800
+00AF4B0000B64F0000BE520000C8550005D4540010E04D001DE33F002ED329
+0043CC0D015DBB001363B9002A5FC700485EC5006A5BB501925AA600BD54A4
+0AF848A111FF40A111FF40A111FF40A111FF40A111FF40A111FF40A111FF40
+A111FF40A111FF40A111FF40A111FF40A111FF40A111FF40A1410000A14200
+00A4450000A9480000AE4C0000B64F0000BE520000C8550005D4550010E14E
+001DE340002DD42B0042CD0E005DBC001264B9002960C700475EC600695BB6
+01905BA700BC55A40AF749A111FF41A111FF41A111FF41A111FF41A111FF41
+A111FF41A111FF41A111FF41A111FF41A111FF41A111FF41A111FF41A111FF
+41A1420000A1420000A4450000A9490000AE4C0000B5500000BD530000C856
+0004D456000FE150001CE543002CD72E0040CF10005BBD001065B9002761C6
+00445FC900685CB7018D5CA800BB56A309F54BA110FF42A110FF42A110FF42
+A110FF42A110FF42A110FF42A110FF42A110FF42A110FF42A110FF42A110FF
+42A110FF42A110FF42A1420000A1430000A4460000A8490000AE4C0000B550
+0000BD530000C7570004D457000FE152001BE645002BDA31003FD0140059BE
+000D66BA002562C5004160CA00655DB8008B5DA900BA57A107F34DA010FF43
+A010FF43A010FF43A010FF43A010FF43A010FF43A010FF43A010FF43A010FF
+43A010FF43A010FF43A010FF43A010FF43A1420000A1430000A4460000A849
+0000AE4D0000B4500000BD540000C7570003D358000EE254001AE7480029DD
+35003DD0170057C0000B67BA002363C4003F61CB00635EB900885EAB00B959
+A006F250A111FF44A111FF44A111FF44A111FF44A111FF44A111FF44A111FF
+44A111FF44A111FF44A111FF44A111FF44A111FF44A111FF44A1430000A143
+0000A4460000A8490000AE4D0000B4500000BC540000C7580003D359000EE2
+560019E94B0028E039003CD11A0055C1000969BB002165C3003C63CD006060
+BB008560AE00B75AA005F252A111FF45A111FF46A111FF46A111FF46A111FF
+46A111FF46A111FF46A111FF46A111FF46A111FF46A111FF46A111FF46A111
+FF46A1430000A1440000A4470000A84A0000AD4D0000B4510000BC550000C6
+580002D35A000DE1580018EA4E0027E23C003AD01E0053C3020769BB001E66
+C2003964CF005D61BD008361B100B65B9F04F254A211FF47A211FF47A211FF
+47A211FF47A211FF47A211FF47A211FF47A211FF47A211FF47A211FF47A211
+FF47A211FF47A211FF47A1430000A1440000A4470000A84A0000AD4E0000B3
+510000BB550000C6590002D25B000CE15A0017EC510025E5400038CF230050
+C6060567BC001C68C1003565D1005A63C0007F62B400B45C9D03F357A212FF
+48A212FF48A212FF48A212FF48A212FF48A212FF48A212FF48A212FF48A212
+FF48A212FF48A212FF48A212FF48A212FF48A1440000A1440000A4470000A7
+4A0000AD4E0000B2510000BB560000C55A0001D15D000BE05C0016EE550023
+E8440036CF29004DCA0B0465BD00186AC0003167D3005764C3007B63B900B2
+5E9C01F35BA312FF4AA312FF4AA312FF4AA312FF4AA312FF4AA312FF4AA312
+FF4AA312FF4AA312FF4AA312FF4AA312FF4AA312FF4AA312FF4AA1440000A1
+450000A4480000A74B0000AC4F0000B2520000BA560000C45B0001D05E000A
+DE5E0015ED590022EC490034D230004ACE110263BF00146CBF002D69D30051
+67C8007665BE00AF609D00F05EA412FF4CA413FF4CA413FF4CA413FF4CA413
+FF4CA413FF4CA413FF4CA413FF4CA413FF4CA413FF4CA413FF4CA413FF4CA4
+13FF4CA1450000A1450000A3480000A74B0000AC4F0000B1520000B9570000
+C35C0000CF600008DD610013ED5D0020F04F0031D9370046D4180160C3000F
+6EBE00286BD2004A69CD007167C300A863A000E961A513FF4EA013FF509D13
+FF519D13FF519D13FF519D13FF519D13FF519D13FF519D13FF519D13FF519D
+13FF519D13FF519D13FF51A1450000A1460000A3490000A64C0000AB4F0000
+B1530000B8580000C25D0000CE610007DB640012EC61001DF356002EE24000
+43D621005CC7000871BE00226ED500436DC400686DA9009A6F7900B4706000
+F36E5A00EF6F5800EE705800EE705800EE705800EE705800EE705800EE7058
+00EE705800EE705800EE705800EE705800EE70A1460000A1460000A3490000
+A64C0000AA500000B0540000B7580000C15E0000CD630005D9660010EA6600
+1BF75D002AEE4A003FD82B0057CC020273A80017788C002E7E74004A816C00
+79884E00A6814000F17A3C00FC7A3A00FD7B3A00FD7B3A00FD7B3A00FD7B3A
+00FD7B3A00FD7B3A00FD7B3A00FD7B3A00FD7B3A00FD7B3A00FD7BA1470000
+A1470000A34A0000A54D0000AA510000AF550000B6590000C05F0000CB6500
+03D769000EE76A0019FA650026F653003BD23B0052A222006E650700884B00
+16933A002F9330004C9524007E941E05E08B1B05FB8A1A05FA8B1A05FA8B1A
+05FA8B1A05FA8B1A05FA8B1A05FA8B1A05FA8B1A05FA8B1A05FA8B1A05FA8B
+1A05FA8BA1470000A1480000A24A0000A54E0000A9510000AE550000B55A00
+00BE600000C9670001D56C000BE36E0016F86C0022E3630034A250004D7D3A
+00684F240082190B009B0508199F020D369B05176B9A0C22E486172AFF7B17
+2BFF7B172BFF7B172BFF7B172BFF7B172BFF7B172BFF7B172BFF7B172BFF7B
+172BFF7B172BFF7B172BFF7BA1480000A1480000A24B0000A44E0000A85200
+00AD560000B35B0000BC620000C7690000D3700008E0720013D677001FB373
+00308C6700486B5400614644007C1229018C0028159500333695003A678D00
+3BA881003ED87A003FD979003FD979003FD979003FD979003FD979003FD979
+003FD979003FD979003FD979003FD979003FD979A1490000A1490000A24C00
+00A44F0000A7530000AC570000B25C0000BA630000C46B0000D0730005C27A
+0011B580001D9B81002B807F003F667A005A3D6300710E490087004C178B00
+59398600606B801A76E6670364FD6C0566FD6B0566FD6B0566FD6B0566FD6B
+0566FD6B0566FD6B0566FD6B0566FD6B0566FD6B0566FD6B0566FD6BA14900
+00A14A0000A14D0000A3500000A6530000AA580000B05D0000B7640000C06E
+0000B2790007AA82000FA08A00198E91002379950032629D004C3B89006310
+70007C0071187D007C3B77008D72710EA1DD5F23A3FA4F23A4FA4F23A4FA4F
+23A4FA4F23A4FA4F23A4FA4F23A4FA4F23A4FA4F23A4FA4F23A4FA4F23A4FA
+4F23A4FA4FA14A0000A14A0000A14D0000A2510000A4540000A8590000AE5E
+0000B3650000A6720002A07D00079988000D9195001285A1001973AA002359
+AD003839A60050119700680094176D00A7366700B2616100BDA25C08C4CF52
+07C3CE5107C3CE5107C3CE5107C3CE5107C3CE5107C3CE5107C3CE5107C3CE
+5107C3CE5107C3CE5107C3CE51A14B0000A14B0000A14E0000A2510000A355
+0000A75A0000AA5F00009E6A000197760004938200058D900008869E000C7E
+B000106EBF001853C300293AC9003E17C9005501C1115F01EC325900EC5752
+05FC894B00FAAB4C00FBAB4C00FBAB4C00FBAB4C00FBAB4C00FBAB4C00FBAB
+4C00FBAB4C00FBAB4C00FBAB4C00FBAB4C00FBAB4CA14C0000A14C0000A14F
+0000A1520000A2560000A45B000098640000906E00028D7A00028988000284
+97000381AA00047DC4000572E2000A50E4001E37F5002F1CFF004403FF084F
+1AFF433721FF622A0EFF79380DFFA4350DFFA4340DFFA4340DFFA4340DFFA4
+340DFFA4340DFFA4340DFFA4340DFFA4340DFFA4340DFFA4340DFFA434A14D
+0000A14D0000A0500000A0530000A1570000935F00008B6700018672000083
+7F00007F8D00007B9D00007BB400007AD400016EF6000640DE00202DF90030
+11FF024310FF243B1CFF4F2D01FF513D11FF872F09FFAF3008FFAF3008FFAF
+3008FFAF3008FFAF3008FFAF3008FFAF3008FFAF3008FFAF3008FFAF3008FF
+AF3008FFAF30A14D0000A14E0000A0500000A0540000915A00008762000181
+6A00007E7500007A810000748F000070A0000071B700006CD2000250DA0011
+34DB002123F9003208FF044010FF2D3313FF4D2C14FF6E290FFF8D2A05FFB2
+2C05FFB22C05FFB22C05FFB22C05FFB22C05FFB22C05FFB22C05FFB22C05FF
+B22C05FFB22C05FFB22C05FFB22CA14E0000A14E0000A05000009156000085
+5C00017D640000786C0000757700006F8300006791000064A1000062B50000
+5CD000033FD100162BDF002219FA003204FF0D3B0FFF342D06FF472F16FF78
+220DFF912504FFB02802FFB12802FFB12802FFB12802FFB12802FFB12802FF
+B12802FFB12802FFB12802FFB12802FFB12802FFB128A14E0000A14E000092
+530000855800017B5F0000746600006F6E00006A790000648600005E930000
+5BA3000058B600004BC8000834D1001624E4002311FC003100FF163713FF3F
+230AFF542613FF7C1E0AFF932201FFAA2500FFB22500FFB22500FFB22500FF
+B22500FFB22500FFB22500FFB22500FFB22500FFB22500FFB22500FFB225A1
+4E0000954F0000855500017B5A0000726000006B68000067710000627D0000
+5C8900005796000053A600004EB700013FC7000B2CD400161EEA00230BFE05
+2E00FF1E2F15FF481B13FF651B12FF7F190AFF941D01FFAA2100FFB12100FF
+B12100FFB12100FFB12100FFB12100FFB12100FFB12100FFB12100FFB12100
+FFB12100FFB121974F0000875200007B570000715C000069620000646A0000
+607400005A800000558C0000509900004CA7000044B8000335CA000C25D900
+1618F0002204FF0B2C00FF242914FF4E160FFF661918FF830C0CFF961601FF
+AB1D00FFB11E00FFB11E00FFB11E00FFB11E00FFB11E00FFB11E00FFB11E00
+FFB11E00FFB11E00FFB11E00FFB11E875200007C54000072580000685D0000
+626400005D6D000059780000548300004F9000004A9C000044AA00003CBB00
+042DCE000C1FDF001613F5002101FF142703FF2B2112FF53110EFF6A1316FF
+83070CFF961000FFA91A00FFB21B00FFB21B00FFB21B00FFB21B00FFB21B00
+FFB21B00FFB21B00FFB21B00FFB21B00FFB21B00FFB21B7C54000073550000
+69590000615F00005C67000058700000537B00004E87000049930000439F00
+003DAD000034C1000325D2000C19E5001609F8002200FF1B210DFF391210FF
+560E0CFF6C0F16FF85000DFF950A01FFAA1700FFB11800FFB11800FFB11800
+FFB11800FFB11800FFB11800FFB11800FFB11800FFB11800FFB11800FFB118
+725500006A560000615B00005B610000566A0000527400004D7F0000488A00
+00429600003CA2000035B200002BC500041ED6000D13E9001600F70A2000FF
+201C13FF44060DFF580A08FF6B0E12FF83000EFF930500FFA51301FFAF1201
+FFAF1201FFAF1201FFAF1201FFAF1201FFAF1201FFAF1201FFAF1201FFAF12
+01FFAF1201FFAF1269560000635800005B5D000056640000516D00004C7800
+0047830000418E00003B99000034A600002DB7000023C9000518DA000D0AEC
+011700FA121A04FF271412FF48010BFF5A0704FF6B0D0DFF81000DFF920100
+FFA20F00FFAC0F00FFAC0F00FFAC0F00FFAC0F00FFAC0F00FFAC0F00FFAC0F
+00FFAC0F00FFAC0F00FFAC0F00FFAC0F>
+<A03D0000A03E0000A13F0000A6420000AC460000B3490000BB4B0000C34D00
+03CC4A000FD540001DD631002DC81D0043BB05045AB400185AB5002F56C200
+4C54BF006C52AF008E51A200AF4BA505FB419C0BFF389C0BFF389C0BFF389C
+0BFF389C0BFF389C0BFF389C0BFF389C0BFF389C0BFF389C0BFF389C0BFF38
+9C0BFF389C0BFF38A03D0000A03E0000A13F0000A6430000AC460000B34900
+00BA4C0000C34D0003CC4A000FD541001DD731002CC81E0042BC06045AB400
+185AB5002E56C2004C54BF006B52B0008D52A200AE4CA505FA419C0BFF389C
+0BFF389C0BFF389C0BFF389C0BFF389C0BFF389C0BFF389C0BFF389C0BFF38
+9C0BFF389C0BFF389C0BFF389C0BFF38A03D0000A03E0000A13F0000A64300
+00AC460000B3490000BA4C0000C34E0003CC4B000ED642001CD934002BCA20
+0041BE07025AB500165BB5002C57C1004955C0006A53B1008C53A400AE4DA4
+04F7439D0CFF399D0DFF399D0DFF399D0DFF399D0DFF399D0DFF399D0DFF39
+9D0DFF399D0DFF399D0DFF399D0DFF399D0DFF399D0DFF39A03E0000A03E00
+00A1400000A6430000AC460000B24A0000BA4C0000C34E0002CC4C000ED644
+001BDA36002ACC220040C008015AB600155CB5002B58C0004756C2006853B2
+008A53A500AD4EA303F5449E0EFF399E0EFF399E0EFF399E0EFF399E0EFF39
+9E0EFF399E0EFF399E0EFF399E0EFF399E0EFF399E0EFF399E0EFF399E0EFF
+39A03E0000A03F0000A1400000A6440000AC470000B24A0000BA4D0000C34F
+0002CC4D000DD746001ADB38002ACE24003EC309005AB600135DB5002959C0
+004557C4006654B3008854A600AC4FA303F246A00FFF399F0FFF399F0FFF39
+9F0FFF399F0FFF399F0FFF399F0FFF399F0FFF399F0FFF399F0FFF399F0FFF
+399F0FFF399F0FFF39A03E0000A03F0000A1410000A6440000AC470000B24A
+0000BA4D0000C3500001CC4E000DD8480019DC3A0029D027003DC40C0058B7
+00115EB500275ABF004258C5006555B4008655A700AC50A202F048A010FF3A
+A010FF3AA010FF3AA010FF3AA010FF3AA010FF3AA010FF3AA010FF3AA010FF
+3AA010FF3AA010FF3AA010FF3AA010FF3AA03F0000A03F0000A2410000A644
+0000AB480000B24B0000B94E0000C2500001CC4F000CD84A0019DD3D0028D2
+29003CC60F0056B8000F60B600265BBF004059C6006356B5008456A800AB51
+A101ED4AA110FF3BA111FF3AA111FF3AA111FF3AA111FF3AA111FF3AA111FF
+3AA111FF3AA111FF3AA111FF3AA111FF3AA111FF3AA111FF3AA03F0000A040
+0000A2410000A6450000AB480000B24B0000B94E0000C2510001CC51000BD9
+4C0018DF3F0027D52C003AC8120054B9000D61B600245DBE003D5AC7006057
+B6008158AA00AA53A100EA4CA10FFF3DA111FF3BA111FF3CA111FF3CA111FF
+3CA111FF3CA111FF3CA111FF3CA111FF3CA111FF3CA111FF3CA111FF3CA111
+FF3CA0400000A1400000A2420000A6450000AB480000B14B0000B94F0000C2
+520001CD52000BD94E0017E0430025D8300038CA160051BB000A62B700215E
+BD003A5CC9005D59B7007E59AC00A854A100E54EA10FFF3FA111FF3DA111FF
+3DA111FF3DA111FF3DA111FF3DA111FF3DA111FF3DA111FF3DA111FF3DA111
+FF3DA111FF3DA111FF3DA1400000A1410000A2420000A6460000AB490000B1
+4C0000B84F0000C1530001CD54000AD9510015E2460024DB340036CA1B004E
+BF030862B8001E60BC00365DCA00595BB9007A5BAE01A556A000DF50A10EFF
+41A111FF3FA111FF3FA111FF3FA111FF3FA111FF3FA111FF3FA111FF3FA111
+FF3FA111FF3FA111FF3FA111FF3FA111FF3FA1410000A1410000A2430000A6
+460000AB490000B14D0000B8500000C1540001CC550009D9530014E44B0022
+DF390034CB21004AC5070661B9001A62BC00325FCC00555DBD00765CB101A2
+58A000D853A30FFF43A111FF41A111FF41A111FF41A111FF41A111FF41A111
+FF41A111FF41A111FF41A111FF41A111FF41A111FF41A111FF41A1420000A1
+420000A2440000A6470000AA4A0000B04D0000B7510000C0550000CB570007
+D8560013E44F0020E33F0031CF270047CB0B0360BB001664BC002E61CD0050
+5FC200725EB5019F5AA100D256A611FF44A010FF43A010FF43A010FF43A010
+FF43A010FF43A010FF43A010FF43A010FF43A010FF43A010FF43A010FF43A0
+10FF43A1420000A1430000A2440000A5470000AA4B0000B04E0000B7520000
+BF560000CA580006D8590011E553001EE845002ED52F0043D310015FBE0011
+67BB002964CB004962C7006D5FB901995DA400CE58A012FF499713FF489516
+FF479516FF479516FF479516FF479516FF479516FF479516FF479516FF4795
+16FF479516FF479516FF47A1430000A1440000A2450000A5480000A94B0000
+AF4F0000B6520000BE570000CA5A0004D75C000FE659001BEB4C002BDE3800
+40D319005AC2000B6ABC002467C8004165B400636A9F008F6B7700AB6B5F00
+E4695800F4685400F3695400F3695400F3695400F3695400F3695400F36954
+00F3695400F3695400F3695400F3695400F369A1440000A1440000A2460000
+A5490000A94C0000AE500000B4530000BD580000C85C0003D55F000EE45D00
+19EF540027E742003BD2240053C802056C9B00167583002D7A6E00467C6400
+6C804E00977C4000DC753B00FF743800FF753800FF753800FF753800FF7538
+00FF753800FF753800FF753800FF753800FF753800FF753800FF75A1450000
+A1450000A2460000A4490000A84D0000AD500000B3540000BC590000C75E00
+01D362000BE1620016F25D0023EE4C0037C036004D9520006B5E0600854600
+168D37002C8D2D00478F24006E8E1A00B7891800FA851500F8871500F88715
+00F8871500F8871500F8871500F8871500F8871500F8871500F8871500F887
+1500F887A1460000A1460000A2470000A44A0000A74E0000AC510000B25500
+00BA5A0000C5600000D1640009DE670014F0630020CB5C00319A4B00497534
+00634921007D170A009505081898020C3295011158940019BA8C1928FF7319
+2AFF71192AFF71192AFF71192AFF71192AFF71192AFF71192AFF71192AFF71
+192AFF71192AFF71192AFF71A1470000A1470000A1480000A34B0000A64F00
+00AB520000B1560000B95B0000C3620000CF680006D66B0011C670001EA86C
+002E865F0044644D005C403D0076102601860026158F002F328E00375F8800
+39997E093DF26F073EF16F073EF16F073EF16F073EF16F073EF16F073EF16F
+073EF16F073EF16F073EF16F073EF16F073EF16FA1470000A1480000A14900
+00A34C0000A64F0000AA530000AF570000B75D0000C0640000C36B0005B673
+0011A978001C9278002A7A76003D5C6C00573759006C0B4300820047168500
+5236810058637B005EB1700058F769005AF868005AF868005AF868005AF868
+005AF868005AF868005AF868005AF868005AF868005AF868005AF868A14800
+00A1490000A14A0000A24D0000A5500000A8540000AE580000B45E0000B366
+0000A9710008A17900109681001985870023718B00325B91004E337900600C
+6500790069187800713872007F696D0691E2611E90FF4C1E91FF4B1E91FF4B
+1E91FF4B1E91FF4B1E91FF4B1E91FF4B1E91FF4B1E91FF4B1E91FF4B1E91FF
+4B1E91FF4BA1490000A14A0000A14B0000A24E0000A3510000A7550000AC5A
+0000A86100009F6B0004987500099180000E888B00147B95001A699B002652
+9D003A3295004F0C870168008818690097366400A1605D00AEA65818BBFF41
+17BCFF4117BCFF4117BCFF4117BCFF4117BCFF4117BCFF4117BCFF4117BCFF
+4117BCFF4117BCFF4117BCFF41A14A0000A14B0000A14C0000A14F0000A252
+0000A5560000A15C000096650002906F00058C7B0006868700097E94000D74
+A2001163AC001B4BAF002C33B1003F0FAA005500A6155B00C5325600CD584E
+04EC954717EDDD351CF3E62F1CF4E62F1CF4E62F1CF4E62F1CF4E62F1CF4E6
+2F1CF4E62F1CF4E62F1CF4E62F1CF4E62F1CF4E62FA14B0000A14B0000A14D
+0000A1500000A15300009B580000906000018969000285740002828100027C
+8E0003749D000570B1000764C4000F46C6002131D4002F19EA004200EA0C4D
+1BFF453209FF583B12FF8B3109FFB03205FFB23305FFB23205FFB23205FFB2
+3205FFB23205FFB23205FFB23205FFB23205FFB23205FFB23205FFB232A14C
+0000A14C0000A14D0000A1500000995500008C5C0001846400017E6D00007C
+790000778600006F9500006FA800006EC0000062DA00053FD5001A2CE80027
+16FF003901FF11411DFF49250AFF563012FF842809FFA72A05FFB22B05FFB2
+2B05FFB22B05FFB22B05FFB22B05FFB22B05FFB22B05FFB22B05FFB22B05FF
+B22B05FFB22BA14D0000A14D0000A14E0000995200008A590001805F000079
+67000075700000717C00006A8800006397000062A800005EBF00004FD1000A
+34D4001A24ED00280EFF023701FF1C3A17FF4C230DFF61280FFF882407FFA9
+2602FFB12702FFB12702FFB12702FFB12702FFB12702FFB12702FFB12702FF
+B12702FFB12702FFB12702FFB127A14E0000A14E00009B4F00008A5500017F
+5B000077610000706900006C730000677F0000608B00005A99000058A90000
+53BF00013FCB000F2CD7001B1DF2002806FF073405FF272E14FF521F13FF70
+1E0CFF8B2006FFA52200FFB22400FFB22400FFB22400FFB22400FFB22400FF
+B22400FFB22400FFB22400FFB22400FFB22400FFB224A14E00009D4E00008B
+5200007F570001755D00006D630000686B0000647600005E820000588E0000
+549C00004FAC000047BE000435CC001025DD001B17F8002702FF112F0BFF33
+2314FF581910FF731A0DFF8D1A08FFA81C00FFB22000FFB22000FFB22000FF
+B22000FFB22000FFB22000FFB22000FFB22000FFB22000FFB22000FFB220A0
+4E00008C51000080540001755900006C5E000065650000616E00005C790000
+57850000529200004D9F000048AE00003DC000062CD000101EE3001B0FFB00
+2700FF192A09FF371E0FFF5A1715FF790E15FF910B04FFA61A00FFB21D00FF
+B21D00FFB21D00FFB21D00FFB21D00FFB21D00FFB21D00FFB21D00FFB21D00
+FFB21D00FFB21D8D51000080530001765500006B5A0000646000005E680000
+5A710000557D0000508800004B95000046A2000040B1000134C4000625D500
+1019E9001A05FC052600FF202313FF46100DFF5E130EFF771014FF920602FF
+A21700FFB71900FFB91900FFB91900FFB91900FFB91900FFB91900FFB91900
+FFB91900FFB91900FFB91900FFB91980530001755500006D570000645C0000
+5D620000596B0000547500004F8000004A8C0000459800003FA5000038B500
+012CC900061FDA001012EE001A00FC102200FF241E13FF4C0A0CFF610F13FF
+7B0214FF910104FFA01206FFBB110BFFC50E0BFFC50E0BFFC50E0BFFC50E0B
+FFC50E0BFFC50E0BFFC50E0BFFC50E0BFFC50E0BFFC50E755500006C560000
+655800005D5E000058650000536E00004E79000049850000449000003E9B00
+0037A900002FBB000124CD000718DF001009F1011B00FD171C0AFF310F12FF
+500309FF620C0DFF780510FF8E0000FF9D100EFFC20612FFC90212FFC90212
+FFC90212FFC90212FFC90212FFC90212FFC90212FFC90212FFC90212FFC902
+6B560000645700005D5A000058600000526800004D720000487E0000438800
+003D930000369F00002FAD000027C000011CD0000811E3001101F2051B00FF
+1D170DFF38070FFF510106FF620A09FF77050CFF8B0003FF9B0A04FFB40A07
+FFB80707FFB80707FFB80707FFB80707FFB80707FFB80707FFB80707FFB807
+07FFB80707FFB807635800005D590000585C0000526300004D6C0000487700
+00428200003C8C0000359600002EA3000027B3000020C4000115D4000909E6
+001200F50E1500FF211209FF39060BFF520109FF660008FF780009FF890004
+FF970504FFA90504FFAB0504FFAB0504FFAB0504FFAB0504FFAB0504FFAB05
+04FFAB0504FFAB0504FFAB0504FFAB05>
+<9D3700009D3700009D380000A13B0000A73F0000AE420000B6440000BD4500
+01C341000DC935001BC826002ABC140041AE010655AE001C51B000324CB900
+4D4ABB006C48AE008948A100A5429F01DB3A9803FF349502FF339502FF3396
+02FF339602FF339602FF339602FF339602FF339602FF339602FF339602FF33
+9602FF339602FF339D3700009D3800009E390000A13C0000A73F0000AF4200
+00B6450000BE460001C442000CC937001ACA28002ABD16003FB0020555AE00
+1B52B100304DBA004C4BBC006A49AE008749A200A4439F01D83B9903FF3596
+02FF339603FF339603FF339603FF339603FF339603FF339603FF339603FF33
+9603FF339603FF339603FF339603FF339D3800009D3800009E390000A13C00
+00A7400000AF430000B6450000BE470001C443000CCA38001ACC2A0029BF18
+003EB1020456AF001953B1002F4EBA004A4CBD00694AAF008649A200A3449F
+01D63C9904FF359603FF349603FF349603FF349603FF349603FF349603FF34
+9603FF349603FF349603FF349603FF349603FF349603FF349D3800009E3900
+009E3A0000A23D0000A8400000AF430000B7460000BE480001C444000BCB3A
+0019CE2C0028C01A003DB2030257AF001854B1002D4FBA00484DBE00674AB0
+00854AA300A2469F01D43E9A04FF369703FF349703FF359703FF359703FF35
+9703FF359703FF359703FF359703FF359703FF359703FF359703FF359703FF
+359D3900009E3A00009E3A0000A23D0000A8410000AF440000B6460000BE48
+0000C445000BCB3C0018CF2D0027C21B003CB4030157AF001655B1002C50B9
+00464EBF00664BB100844BA400A1479F01D23F9B05FF379704FF359704FF35
+9704FF359704FF359704FF359704FF359704FF359704FF359704FF359704FF
+359704FF359704FF359E3900009E3A00009F3B0000A23E0000A8410000AF44
+0000B6470000BE490000C546000ACC3E0018D02F0026C41E003BB6050056B0
+001456B2002A51B900444FC000644CB100824DA400A1489E01CF409C06FF37
+9705FF369705FF369705FF369705FF369705FF369705FF369705FF369705FF
+369705FF369705FF369705FF369705FF369E3A00009F3B00009F3C0000A23E
+0000A8420000AF450000B6470000BE4A0000C5470009CD400017D2320025C7
+200039B9080054B1001258B2002853B9004250C100624DB200804EA5009F4A
+9E01CC429D07FF389805FF379805FF379805FF379805FF379805FF379805FF
+379805FF379805FF379805FF379805FF379805FF379805FF379E3B00009F3C
+00009F3D0000A23F0000A8420000AE450000B6480000BE4A0000C6490009CE
+420016D3350024CA230037BC0C0052B1001059B3002654B9003F52C2005F4F
+B4007D4FA6009F4C9E00C9449E07FF399907FF379907FF379907FF379907FF
+379907FF379907FF379907FF379907FF379907FF379907FF379907FF379907
+FF379F3C00009F3D0000A03D0000A2400000A8430000AE460000B6490000BD
+4B0000C64B0008CF450015D5380023CE260036C010004FB3000D5BB3002356
+B8003B53C3005C51B5007A51A8009E4E9E00C546A008FF3B9B09FF389B09FF
+389B09FF389B09FF389B09FF389B09FF389B09FF389B09FF389B09FF389B09
+FF389B09FF389B09FF389F3D0000A03D0000A03E0000A3400000A8440000AE
+470000B54A0000BD4C0000C74D0007D0470014D73C0022D12A0033C215004C
+B6020A5CB4002058B7003855C4005853B7007752AA009B509F00C248A20AFF
+3C9C0BFF389C0BFF389C0BFF389C0BFF389C0BFF389C0BFF389C0BFF389C0B
+FF389C0BFF389C0BFF389C0BFF389C0BFF38A03D0000A03E0000A03F0000A3
+410000A8440000AE480000B54B0000BD4D0000C64E0006D04A0012D9400020
+D52F0031C61A0048BB04085CB5001D5BB7003357C5005455BA007354AD0098
+52A000BF4BA40BFF3D9E0EFF399E0EFF399E0EFF399E0EFF399E0EFF399E0E
+FF399E0EFF399E0EFF399E0EFF399E0EFF399E0EFF399E0EFF39A03E0000A0
+3F0000A03F0000A3420000A8450000AE480000B44C0000BC4E0000C6500005
+D14E0010DB45001EDA35002ECB200044C107045CB600185DB7002F5AC7004F
+58BD006F56B0009555A100BC4EA70CFF3FA111FF3AA111FF3AA111FF3AA111
+FF3AA111FF3AA111FF3AA111FF3AA111FF3AA111FF3AA111FF3AA111FF3AA1
+11FF3AA03F0000A0400000A1400000A3430000A8460000AD490000B44D0000
+BC4F0000C6520003D151000FDC4A001CDF3C002CD0260041C80A015CB90013
+60B7002A5CC500485AC3006A58B30091579C00BA548D06F34D9114FF418D15
+FF428B16FF428B16FF428B16FF428B16FF428B16FF428B16FF428B16FF428B
+16FF428B16FF428B16FF42A1400000A1410000A1410000A3440000A7470000
+AD4A0000B34E0000BB510000C5540002D054000DDE500019E3430029D82F00
+3DCB130057BC000D64B800255FB4003E61A6005E66940083687500A2665E00
+D1645600F9625300F9635100F9645100F9645100F9645100F9645100F96451
+00F9645100F9645100F9645100F9645100F964A1410000A1420000A1420000
+A3450000A7480000AC4B0000B34F0000BA520000C4560001D057000BDD5500
+17E74B0025DF390038CC1D0050B40305698F0016717C002B76690042775D00
+62794D0089774000C6723A00FF6E3800FF6F3600FF6F3600FF6F3600FF6F36
+00FF6F3600FF6F3600FF6F3600FF6F3600FF6F3600FF6F3600FF6FA1420000
+A1430000A1430000A3460000A6490000AB4C0000B1500000B9530000C25700
+00CE5A0009DC5A0014EA530021E6430034B231004A8A1D0067580500814200
+158734002A862A004288230064881B009A841800FC7D1500FC7F1300FC7F13
+00FC7F1300FC7F1300FC7F1300FC7F1300FC7F1300FC7F1300FC7F1300FC7F
+1300FC7FA1440000A1440000A1450000A3470000A64A0000AA4D0000B05100
+00B7550000C1590000CC5D0006DA5F0011DE5C001EBA55002F924500456D30
+005E441F00771509009004071793010B2F8F000E4E8C0016918B1624FF6D16
+25FF6C1527FF6C1527FF6C1527FF6C1527FF6C1527FF6C1527FF6C1527FF6C
+1527FF6C1527FF6C1527FF6CA1450000A1450000A1460000A2480000A54B00
+00A94E0000AF520000B6560000BF5B0000CA600004C8650010B969001D9D64
+002C7F5700415E4700583B37006F0E23018100241488002B2F880033578300
+368C7B0234FA6B0336FF690438FF690438FF690438FF690438FF690438FF69
+0438FF690438FF690438FF690438FF690438FF69A1460000A1460000A14700
+00A2490000A44C0000A84F0000AD530000B4570000BD5D0000B7640006AC6C
+00119E70001C8A6F0029736D003B5561005232510067093D007C0042157F00
+4D327D00535C770056946D0053F0640053FE630055FE620055FE620055FE62
+0055FE620055FE620055FE620055FE620055FE620055FE620055FE62A14700
+00A1470000A1480000A24A0000A44D0000A7500000AC540000B2590000AA61
+0000A169000A987100118C78001A7C7D002469800033517E004B2E6D005D08
+5C017400621773006A366E0073606A017798611884FF4B1883FF491884FF48
+1884FF481884FF481884FF481884FF481884FF481884FF481884FF481884FF
+481884FF48A1480000A1480000A1490000A14B0000A34E0000A6510000AA55
+0000A05D000097650005906E000A8978000F7F8100147189001D608E00284A
+8E003A2C87004D077B0166007F1866008B366100945C5A00958D5412A8FF42
+10A2FF400FA2FF400FA2FF400FA2FF400FA2FF400FA2FF400FA2FF400FA2FF
+400FA2FF400FA2FF400FA2FF40A1490000A14A0000A14A0000A14C0000A24F
+0000A4520000995900008F61000389690005847400077D7E000A748A000E69
+940014599C001F449E002D2C9F003E099801540098175600AC325200B5564B
+00C1894412E0F33615CFFF3115D0FF3115D0FF3115D0FF3115D0FF3115D0FF
+3115D0FF3115D0FF3115D0FF3115D0FF3115D0FF31A14A0000A14B0000A14B
+0000A14D0000A1500000945600008A5D0001826400027D6E00037A79000373
+8500056A92000763A1000B54AB00163EB100232CBC003011C2004100C31148
+00E82E4500ED523E10FF912F05FFB0311CFDFF231CFEFF231CFEFF231CFEFF
+231CFEFF231CFEFF231CFEFF231CFEFF231CFEFF231CFEFF231CFEFF23A14B
+0000A14C0000A14C0000A14E000092530000865A00017D6000007768000073
+7300006E7F0000678C0000619C00005FAF00005AC700043FCD00142CDB001F
+1BF9002F04FF0D3A0CFF332D03FF492F13FF7E2209FF9F2502FFB12702FFB1
+2702FFB12702FFB12702FFB12702FFB12702FFB12702FFB12702FFB12702FF
+B12702FFB127A14D0000A14D0000A14D000092510000845700017A5D000073
+6400006D6C000069770000638300005C91000059A0000055B100004BC40006
+35D0001424E1002013FC002E01FF163415FF431E12FF621F10FF821E0AFFA0
+2000FFB22400FFB22300FFB22300FFB22300FFB22300FFB22300FFB22300FF
+B22300FFB22300FFB22300FFB223A14E0000A14E0000935000008454000179
+590000705F000069660000656F0000607A00005A8700005594000051A20000
+4CB300003EC400092CD300141EE800200BFF032D00FF1E2D15FF4B1811FF67
+1A14FF86130AFFA01B00FFB12000FFB22000FFB22000FFB22000FFB22000FF
+B22000FFB22000FFB22000FFB22000FFB22000FFB220A14E00009450000084
+520001795600006F5B000068610000626900005D730000587E0000538A0000
+4E9700004AA5000043B5000135C7000A25D8001418EE001F02FF0B2A00FF24
+2612FF4F1411FF6B131CFF8A0206FF9F1800FFB11C00FFB41C00FFB41C00FF
+B41C00FFB41C00FFB41C00FFB41C00FFB41C00FFB41C00FFB41C00FFB41C95
+4F0000845200017954000070570000665C0000606300005B6C000057760000
+528200004D8E0000489A000042A800003AB900022CCC000A1EDE001411F300
+1F00FF15240AFF321813FF550D0CFF6C1218FF8A0004FF9D1500FFB11908FF
+C71208FFC71208FFC71208FFC71208FFC71208FFC71208FFC71208FFC71208
+FFC71208FFC712845200017954000070560000675900005F5E00005A660000
+556F0000507A00004B86000046910000419D00003AAB000032BF000224D000
+0A18E3001408F6041F00FF1C1E0AFF37120DFF560D0CFF6E0B13FF880006FF
+9A0E00FFAF1515FFE20415FFE20415FFE20415FFE20415FFE20415FFE20415
+FFE20415FFE20415FFE20415FFE204785400006F560000675700005F5A0000
+59610000546900004F7300004B7E0000458900003F95000039A1000032B000
+0029C400021DD4000B11E8001400F60A1D00FF211913FF45030DFF590705FF
+6C0D0FFF860005FF980A00FFAD1112FFDC0212FFDC0212FFDC0212FFDC0212
+FFDC0212FFDC0212FFDC0212FFDC0212FFDC0212FFDC026E56000066570000
+5F580000595C0000546400004F6D00004A780000448300003F8D0000389800
+0031A500002AB6000021C8000316D9000B09EB001500F9131700FF251410FF
+460009FF5A0606FF6E080BFF840007FF960501FFA80B0BFFC5030BFFC5030B
+FFC5030BFFC5030BFFC5030BFFC5030BFFC5030BFFC5030BFFC5030BFFC503
+655700005E590000595B0000545F00004F67000049710000447C00003E8600
+0037900000309C000029AA000022BA000019CB00040FDC000C02ED051400FB
+191200FF290F0BFF470009FF5D0007FF6F0007FF820004FF920403FFA20503
+FFB30403FFB30403FFB30403FFB30403FFB30403FFB30403FFB30403FFB304
+03FFB30403FFB3045D590000575B0000535D00004F620000496B0000437600
+003D800000378A00002F94000028A0000022AE00001BBE000012CE000508DF
+000C00F00B1000FC1E0D00FF2E0B07FF4A0005FF5E0004FF6F0004FF7F0002
+FF8F0302FF9F0302FFAC0202FFAC0202FFAC0202FFAC0202FFAC0202FFAC02
+02FFAC0202FFAC0202FFAC0202FFAC02>
+<99300000993100009A3100009B320000A0360000A7390000AE3B0000B53D00
+00B9380009BC2C0017BB1F0027AE0E003DA5000A4BA8001F48AB003343B300
+4D41B6006A3FAE00853DA400A0399F00C8339900FE2D9400FF2A9400FF2A94
+00FF2A9400FF2A9400FF2A9400FF2A9400FF2A9400FF2A9400FF2A9400FF2A
+9400FF2A9400FF2A993000009A3100009A3200009B330000A1370000A73A00
+00AE3C0000B53D0000BA390009BD2E0017BC200027AF0F003CA600094CA800
+1D49AC003244B3004C42B7006940AE00843EA4009F3A9E00C6339A01FE2E94
+00FF2B9400FF2B9400FF2B9400FF2B9400FF2B9400FF2B9400FF2B9400FF2B
+9400FF2B9400FF2B9400FF2B9400FF2B9A3100009A3200009A3200009B3300
+00A1370000A73A0000AF3D0000B63E0000BB3A0008BE2F0016BE220026B111
+003BA600074DA8001C4AAC003145B3004B42B8006741AF00833FA4009E3B9E
+00C4349A01FE2F9400FF2C9400FF2C9400FF2C9400FF2C9400FF2C9400FF2C
+9400FF2C9400FF2C9400FF2C9400FF2C9400FF2C9400FF2C9A3100009A3200
+009B3300009B340000A1380000A83B0000AF3E0000B73F0000BB3B0008BE30
+0016BF230025B312003AA700064EA9001B4BAC003046B3004943B8006642B0
+008240A4009D3C9E00C1359A01FE309400FF2C9400FF2C9400FF2C9400FF2D
+9400FF2D9400FF2D9400FF2D9400FF2D9400FF2D9400FF2D9400FF2D9400FF
+2D9A3200009B3300009B3400009C350000A2390000A83C0000B03F0000B740
+0000BC3D0007BF320015C1250024B5140039A8000450A900194CAC002E47B3
+004744B9006443B0008141A5009B3D9E00BF379B01FE319400FF2D9400FF2D
+9400FF2D9400FF2D9400FF2D9400FF2D9400FF2D9400FF2D9400FF2D9400FF
+2D9400FF2D9400FF2D9A3300009B3300009B3400009C350000A33A0000A93D
+0000B03F0000B7410000BD3E0007C0340015C3270024B7160037A9000151AA
+00174EAD002C48B3004546BA006244B1008042A5009A3F9D00BC389B01FE32
+9400FF2E9400FF2E9400FF2E9400FF2E9400FF2E9400FF2E9400FF2E9400FF
+2E9400FF2E9400FF2E9400FF2E9400FF2E9B3300009B3400009C3500009C36
+0000A33B0000A93E0000B0400000B8420000BE400006C1370014C4290023BA
+190036AC030150AA00154FAD002A4AB3004347BB006045B2007D44A6009841
+9D00B83A9C01FE339400FF309400FF309400FF309400FF309400FF309400FF
+309400FF309400FF309400FF309400FF309400FF309400FF309B3400009C35
+00009C3600009D370000A33C0000A93F0000B0410000B8430000BF420005C2
+390013C62C0022BE1C0034AF06004EAB001351AE00284CB3004049BC005E47
+B4007B45A70096439D00B53C9D01FE359401FF319401FF319401FF319401FF
+319401FF319401FF319401FF319401FF319401FF319401FF319401FF319401
+FF319C3500009C3600009D3700009D380000A33C0000A93F0000B1420000B8
+440000C0440004C43C0012C92F0020C21F0032B309004CAC001053AE00254E
+B2003C4BBD005B49B5007847A80095459D00B33E9E02FE369501FF329502FF
+329502FF329502FF329502FF329502FF329502FF329502FF329502FF329502
+FF329502FF329502FF329D3700009D3800009D3800009E390000A33D0000AA
+410000B1430000B9460000C1460004C53F0011CB33001FC6230030B80E0049
+AE010C55AF002250B200394DBD00574BB7007549A90093489E00B141A003FE
+389603FF339603FF339603FF339603FF339603FF339603FF339603FF339603
+FF339603FF339603FF339603FF339603FF339D3800009E3900009E3A00009F
+3B0000A43E0000AA420000B2450000B9470000C1480003C742000FCD37001D
+CB27002EBD140045B2020956B0001E53B300354FBE00524DB900714BAB0090
+4A9F00AE43A203FF3A9704FF359704FF359704FF359704FF359704FF359704
+FF359704FF359704FF359704FF359704FF359704FF359704FF359E3900009E
+3A00009F3B00009F3C0000A4400000AA430000B1460000B9480000C14A0002
+C846000ECF3C001CD02D002BC3190041B6040558B1001A56B3003052BE004D
+50BC006D4EAD008C4DA000AC47A404FF3D9805FF379805FF37990AFF36990D
+FF35990DFF35990DFF35990DFF35990DFF35990DFF35990DFF35990DFF3599
+0DFF359F3B00009F3C00009F3D0000A03D0000A4410000AA440000B1470000
+B84A0000C04C0001C949000CD141001AD6330029C81F003EBB060059B30015
+59B4002B55BE004753C0006850AA0088539400A8508300D14D8813FF3C8613
+FF3D8414FF3E8214FF3E8214FF3E8214FF3E8214FF3E8214FF3E8214FF3E82
+14FF3E8214FF3E8214FF3E9F3D0000A03D0000A03E0000A03F0000A4420000
+AA450000B0480000B84B0000C04E0001CA4D000AD3470017D9390026CF2700
+3AC00E0054B5000F5DB5002658A6003B5D9A0058628A007964730097625E00
+C0605B06FD575A09FF555809FF565709FF575709FF575709FF575709FF5757
+09FF575709FF575709FF575709FF575709FF57A03E0000A03F0000A03F0000
+A1400000A5430000AA470000B04A0000B74D0000BF4F0000CA500008D44C00
+15DD410023D62F0035C618004DA10304678500156D75002A7264003F725700
+5A734B007E723F00AF6E3900FF693600FF6A3400FF6A3300FF6B3300FF6B33
+00FF6B3300FF6B3300FF6B3300FF6B3300FF6B3300FF6B3300FF6BA03F0000
+A1400000A1410000A1410000A4440000A9480000AF4B0000B64E0000BE5100
+00C9530006D5520012E049001FD53B0030A82D00477F1B00635304007D3E00
+14813100278027003E8221005C821B00857E1700EB781400FF771200FF7812
+01FF771201FF771201FF771201FF771201FF771201FF771201FF771201FF77
+1201FF77A1410000A1410000A1420000A1430000A4460000A8490000AE4C00
+00B5500000BD530000C8570004D457000FCB55001DAD4E002D8B3F0041662C
+005A3F1C00721308008B0407168D010A2D89000D4886011379860418E5740C
+1EFF6C0A1EFF6C0A1FFF6C0A1FFF6C0A1FFF6C0A1FFF6C0A1FFF6C0A1FFF6C
+0A1FFF6C0A1FFF6C0A1FFF6CA1420000A1430000A1430000A1440000A44700
+00A84A0000AD4E0000B3510000BB550000C6590002BB5E0010AC61001C945B
+002A7850003D584100533633006A0D21017D0021138200282B81002F507E00
+3480780032D26A0735FF620837FF610838FF610838FF610838FF610838FF61
+0838FF610838FF610838FF610838FF610838FF61A1440000A1440000A14500
+00A1450000A3480000A74B0000AC4F0000B1520000B9570000AC5E0006A264
+00129568001C826600286D6300394F58004D2E4A006207380076003D147900
+472E77004E55730051846B0050D261004EFF5D004FFF5D0050FF5D0050FF5D
+0050FF5D0050FF5D0050FF5D0050FF5D0050FF5D0050FF5D0050FF5DA14500
+00A1460000A1460000A1470000A3490000A64D0000AA500000AD540000A15C
+00029863000A90690012846F00197573002463750032486E00452963005806
+550170005B176E0064336B006B5A67006E855E0977EC510F76FE481077FE47
+1078FE471078FE471078FE471078FE471078FE471078FE471078FE471078FE
+471078FE47A1470000A1470000A1470000A1480000A24B0000A54E0000A452
+0000985900008F6000068967000A8170000F76780015697E001E5983002943
+800038267B004B05720264007719620080345D00895757008A80500193EA48
+0690FF400691FF400591FF400591FF400591FF400591FF400591FF400591FF
+400591FF400591FF400591FF40A1480000A1480000A1490000A1490000A24C
+00009F50000092560000895C0003826400057C6D00077576000A6C80000F60
+890016518F00213E91002D2591003E058C0252008F1852009B314E00A45247
+00AA7F4100B3C73C00A9FF3901AAFF3801AAFF3801AAFF3801AAFF3801AAFF
+3801AAFF3801AAFF3801AAFF3801AAFF3801AAFF38A1490000A14A0000A14A
+0000A14A00009C4E00008D540000845A00017B60000276680002717200036B
+7D0005638900085994000E4B9C001A39A3002426A9003009A9014100AF1443
+00C22E3F00C94F3A05F7893200ECAB3115E1FF2415E2FF2315E2FF2315E2FF
+2315E2FF2315E2FF2315E2FF2315E2FF2315E2FF2315E2FF2315E2FF23A14B
+0000A14B0000A14B00009C4C00008C52000080570000775D0000706400006B
+6D000067780000608400015A92000155A0000449AC000E37B8001727C50020
+16DB002E01E90D370DFC332908FF4C2812FF7F1F0AFF9E2100FFB12400FFB6
+2400FFB62400FFB62400FFB62400FFB62400FFB62400FFB62400FFB62400FF
+B62400FFB624A14C0000A14C00009D4D00008B5000007F550000755B00006C
+61000066690000627300005D7F0000578C0000529900004EA9000047BA0003
+36CA000D25DB001917F5002501FF112E0AFF322213FF5B1713FF7A150AFF97
+1A00FFAD1F00FFB21F00FFB21F00FFB21F00FFB21F00FFB21F00FFB21F00FF
+B21F00FFB21F00FFB21F00FFB21FA14D00009E4E00008B5100007F53000174
+5800006A5D0000646400005F6C00005A77000055830000509000004B9D0000
+46AB00003CBD00052DCF000E1EE100190FF9012400FF1A2709FF381C0EFF5D
+1615FF7D0A0AFF981400FFAD1C00FFB61B00FFB61B00FFB61B00FFB61B00FF
+B61B00FFB61B00FFB61B00FFB61B00FFB61B00FFB61BA14E00008B5100007E
+530001755500006A590000635F00005D66000059700000547B00004F870000
+4A93000044A000003EAE000033C2000425D4000E18E8001806FA052300FF20
+2113FF480D0BFF601313FF7E070BFF970E00FFAE180DFFD00E0EFFD10D0EFF
+D10D0EFFD10D0EFFD10D0EFFD10D0EFFD10D0EFFD10D0EFFD10D0EFFD10D8B
+5100007D530001735500006B560000625B00005C610000576A000052740000
+4D7F0000488B0000439600003DA3000036B300002AC700051DD8000E11ED00
+1800FA101F00FF251B12FF4D070CFF630C12FF7E000CFF950700FFAB1414FF
+E20414FFE20414FFE20414FFE20414FFE20414FFE20414FFE20414FFE20414
+FFE20414FFE2047D540000725500006A560000635800005B5D000056640000
+516D00004C78000047840000418F00003B9A000034A700002DB9000022CB00
+0616DD000E06EE011A00FD17190CFF330B11FF500106FF620C0CFF7C020BFF
+930300FFA70F12FFDB0113FFE70113FFE70113FFE70113FFE70113FFE70113
+FFE70113FFE70113FFE70113FFE7017155000068570000615800005C590000
+56600000516800004B720000467D0000408700003A920000339E00002CAC00
+0025BE00001ACF00070FE2000F02F1081700FF1D1409FF36080DFF510008FF
+66040AFF7B000AFF910002FFA20907FFBE040FFFE7000FFFE7000FFFE7000F
+FFE7000FFFE7000FFFE7000FFFE7000FFFE7000FFFE7006757000060580000
+5A5A0000565C0000516300004B6C00004677000040810000398B0000329500
+002BA2000024B100001DC2000013D2000708E5001000F40F1200FF221005FF
+370708FF520007FF670006FF790003FF8C0302FF9E0503FFB20304FFBE0204
+FFBE0204FFBE0204FFBE0204FFBE0204FFBE0204FFBE0204FFBE0204FFBE02
+5E590000595B0000545D0000515F00004B670000457100003F7B0000398500
+00328E00002A99000023A600001DB5000016C400010CD5000800E7021100F7
+150D00FF260B03FF390505FF550003FF670003FF770003FF890103FF9A0202
+FFAB0201FFB50201FFB50201FFB50201FFB50201FFB50201FFB50201FFB502
+01FFB50201FFB502575B0000535E00004F6000004B630000456B00003F7500
+00397F0000318800002A920000239D00001CAA000016B700000FC7000206D8
+000900EB090B00F81B0900FF2B0701FF3C0202FF560001FF670000FF750001
+FF860001FF970001FFA60100FFAD0000FFAD0000FFAD0000FFAD0000FFAD00
+00FFAD0000FFAD0000FFAD0000FFAD00>
+<96290000972A0000972B0000972B0000992C00009D2E0000A3300000A93100
+00AD2D0006B1240015AD170025A10700399F000E40A200213CA7003538AE00
+4D37B0006836AB008233A6009E30A400C52B9B00F927A51EFF08A51DFF08A5
+1DFF09A51DFF09A51DFF09A51DFF09A51DFF09A51DFF09A51DFF09A51DFF09
+A51DFF09A51DFF09972A0000972B0000972B0000972C0000992D00009E2F00
+00A4310000AA320000AD2E0006B1250014AE180024A30800399F000D41A200
+203DA7003439AE004C38B1006737AC008134A6009C31A400C32C9C00F827A3
+1BFF0BA31BFF0CA31AFF0CA31AFF0CA31AFF0CA31AFF0CA31AFF0CA31AFF0C
+A31AFF0CA31AFF0CA31AFF0CA31AFF0C972A0000972B0000972C0000982C00
+00992E00009E300000A4320000AA330000AE300005B2260013B01A0023A409
+00389F000C42A2001F3FA700333AAE004B39B1006638AD008035A6009B32A3
+00C12C9C00F728A118FF0FA117FF10A117FF10A117FF10A117FF10A117FF10
+A117FF10A117FF10A117FF10A117FF10A117FF10A117FF10972B0000972C00
+00982C0000982D00009A2E00009F310000A5330000AB340000AF310005B328
+0013B21B0022A60B0036A0000A43A2001E40A700313CAE00493AB2006439AD
+007E36A6009A33A300BE2D9C00F6299F14FF149F14FF149E14FF149E13FF14
+9E13FF149E13FF149E13FF149E13FF149E13FF149E13FF149E13FF149E13FF
+14972B0000982C0000982D0000982E00009A2F00009F310000A5340000AC35
+0000B0330004B4290012B31D0021A80D0035A0000845A3001C42A800303DAE
+00473BB300623AAE007D37A6009834A300BC2F9D00F42A9C10FF189C0FFF18
+9C0FFF199C0FFF199C0FFF199C0FFF199C0FFF199C0FFF199C0FFF199C0FFF
+199C0FFF199C0FFF19982C0000982D0000982E0000992E00009A300000A033
+0000A6350000AD370000B1350004B52B0011B51F0021AB100034A0000646A3
+001A43A8002E3EAD00453CB300603BAF007C39A6009635A200B8309D00F22B
+990BFF1D990AFF1E990AFF1E990AFF1E990AFF1E990AFF1E990AFF1E990AFF
+1E990AFF1E990AFF1E990AFF1E990AFF1E982D0000982E0000992F0000992F
+00009B310000A0340000A7360000AE380000B3370003B62E0010B722001FAE
+120032A2010447A4001845A8002C40AD00433EB4005E3CB1007A3AA7009437
+A200B5329D00EF2C9605FF239605FF239604FF249604FF249604FF249604FF
+249604FF249604FF249604FF249604FF249604FF249604FF24982E0000992F
+000099300000993000009B320000A1350000A8380000AF3A0000B4390002B8
+30000FBA24001EB2150030A5030346A5001547A8002942AD00403FB5005C3E
+B200783CA8009239A100B1339E00EC2E9400FF299300FF289300FF289300FF
+289300FF289300FF289300FF289300FF289300FF289300FF289300FF289300
+FF28992F0000993000009A3100009A3100009C330000A2370000A93A0000B0
+3C0000B63C0001B933000EBC27001DB619002EA8060245A600124AA9002745
+AD003D41B6005940B400753EA900903BA100AD369E00EA309400FF2A9400FF
+2A9400FF2A9400FF2A9400FF2A9400FF2A9400FF2A9400FF2A9400FF2A9400
+FF2A9400FF2A9400FF2A993000009A3100009A3200009B3300009D350000A3
+390000AA3B0000B23E0000B83E0001BB37000DBF2B001BBA1C002CAC0A0143
+A7000F4CAA002348AD003944B6005542B5007240AA008D3EA100A9389F00E6
+329500FF2C9400FF2C9400FF2C9400FF2C9400FF2C9400FF2C9400FF2C9400
+FF2C9400FF2C9400FF2C9400FF2C9400FF2C9A3200009A3300009B3300009B
+3400009E360000A43B0000AB3D0000B3400000B9400001BD3B000CC12F001A
+BF20002AB20E0041A9000A4FAA00204BAE003546B6005144B8006E42AC008A
+41A100A63B9E00DC359600FF2F9400FF2E9400FF2E9400FF2E9400FF2E9400
+FF2E9400FF2E9400FF2E9400FF2E9400FF2E9400FF2E9400FF2E9B3300009B
+3400009C3500009C3600009E380000A53C0000AC3F0000B3410000BA430000
+BF3E000AC4330018C5250028B813003DAB000653AC001C4EAE00314AB6004C
+47BA006A45AE008744A200A23F9D00D3389501FF328F02FF338D03FF348B04
+FF358B04FF358B04FF358B04FF358B04FF358B04FF358B04FF358B04FF358B
+04FF359C3500009C3600009D3700009D3800009F3A0000A53E0000AC410000
+B4430000BB450000C1420009C6390017CA2A0026BE19003AAE010056AD0017
+52AF002C4DB600464ABB006549A200804E8D009A4C7D00B5487F0CFF3D7D11
+FF397A10FF3B7810FF3C7810FF3C7810FF3C7810FF3C7810FF3C7810FF3C78
+10FF3C7810FF3C7810FF3C9D3700009D3800009E3900009E3A0000A03B0000
+A63F0000AC420000B4450000BC470000C3460007C93E0014CE310023C52000
+36B5090050AF001156A90025549A0038598F00525D81006F5F6F008A5D5E00
+AF5B5400EA586616FF426518FF426419FF416419FF416419FF416419FF4164
+19FF416419FF416419FF416419FF416419FF419E3900009E3A00009F3B0000
+9F3C0000A13E0000A6410000AC440000B4470000BB490000C44A0005CB4400
+12D2390020CD270031BD13004A920403637A0014696E00286D5E003B6D5200
+536E4800736D3E009B6A3F09E95E491AFF4D471AFF4E4217FF504217FF5142
+17FF514217FF514217FF514217FF514217FF514217FF514217FF519F3B0000
+9F3C0000A03D0000A03E0000A13F0000A6430000AC460000B3490000BB4C00
+00C34D0003CD4A000FD640001DC335002D9F2800447518005E4E0301783A00
+137B2E00257A25003A7C1F00557C1B0077791700BD751300FF711101FF7111
+03FF701103FF701103FF701103FF701103FF701103FF701103FF701103FF70
+1103FF70A03D0000A03E0000A03F0000A03F0000A2410000A6440000AC4800
+00B24B0000BA4E0000C3500001CD4F000DBA4D001BA246002A833A003D5F29
+00563B1A006D1207008604061587000A2A83000D438100106A800015BC7702
+17FC6C0017FC6C0019FC6B0019FC6B0019FC6B0019FC6B0019FC6B0019FC6B
+0019FC6B0019FC6B0019FC6BA03F0000A1400000A1410000A1410000A24300
+00A6460000AB490000B14C0000B8500000BD540001AE57000F9F57001B8C52
+002871490039533D004F322F00650C1F01770020137C0025287A002B487800
+3175740032B4690833FE5C0935FF5A0A37FF590937FF590937FF590937FF59
+0937FF590937FF590937FF590937FF590937FF59A1410000A1420000A14200
+00A1430000A2440000A5470000AA4B0000B04E0000AE530000A3580007985C
+00118C5F001B7B5E0026665A00364B5100482B45005D053200710039137300
+432A7100494E6E004C7768004DB75E004AFF57004BFF57004CFF56004CFF56
+004CFF56004CFF56004CFF56004CFF56004CFF56004CFF56004CFF56A14300
+00A1440000A1440000A1450000A2460000A4490000A84C0000A45100009957
+0002905D000A876200117C6700196E6A00235D6B003042640040255B005404
+4F016B00551669005E2F66006554630067785B0066A952066CFC48076DFD47
+086FFE46086FFE46086FFE46086FFE46086FFE46086FFE46086FFE46086FFE
+46086FFE46A1450000A1450000A1460000A1460000A2470000A44A00009C4F
+000091560000895B0005816100097968000E6F6F00146375001D537800283C
+75003622710049026A0260006F195D00773259008052540081754C0085AE46
+0187FF3D0187FF3C0088FF3C0088FF3C0088FF3C0088FF3C0088FF3C0088FF
+3C0088FF3C0088FF3C0088FF3CA1470000A1470000A1470000A1480000A149
+0000984D00008C530000835900027B5F0004746700066E6F000A6578000F5A
+7F00174B8400213786002D1F85003D028203500087194D0090314900974D43
+009D743D00A2AC39009FFE34009DFF33009DFF33009DFF33009DFF33009DFF
+33009DFF33009DFF33009DFF33009DFF33009DFF33A1480000A1490000A149
+0000A1490000964C0000885100007E570000755C00006F6400016A6C000264
+7600055C800009538A00104490001C339600241F9A00300399024000A2163E
+00AD2D3A00B34C3600CE7D3200CCA72E09C9FF2706BDFF2706BEFF2706BEFF
+2706BEFF2706BEFF2706BEFF2706BEFF2706BEFF2706BEFF2706BEFF27A14A
+0000A14A0000A14B0000954C0000865000007B550000725A00006A60000065
+680000617300005B7E0001558A00034D950008409F001231A9001822B40022
+0DBF002F00CA103200DB282F00E1462A0BFD7D2106FF9D2100F6B82300F2D1
+2200F3D12200F3D12200F3D12200F3D12200F3D12200F3D12200F3D12200F3
+D12200F3D122A14B0000A14C0000944E0000855000007A5300007058000067
+5D0000616500005D6F0000587A0000538600004E93000049A1000042B10001
+35C5000825D6001218ED001D02FF0A2900FF252512FF521210FF701115FF91
+0800FFA91B00FFB71B00FFB71B00FFB81B00FFB81B00FFB81B00FFB81B00FF
+B81B00FFB81B00FFB81B00FFB81BA14D0000944F0000845200007954000070
+560000665B00005F6200005A6A000056750000518000004C8C000046980000
+41A5000039B600012CCA00081EDC001210F1001D00FF152309FF321710FF55
+0E0EFF710D14FF910201FFAA1711FFD70A12FFD90912FFD90912FFD90912FF
+D90912FFD90912FFD90912FFD90912FFD90912FFD909954F00008352000177
+5400006E560000675800005E5D000059640000546E00004F7900004A840000
+459000003F9C000038A9000030BD000123CF000917E2001207F4041D00FF1C
+1C10FF3E090DFF580A0AFF700B11FF8E0000FFA51214FFDC0313FFE30413FF
+E30413FFE30413FFE30413FFE30413FFE30413FFE30413FFE30413FFE30483
+520001765500006D560000655700005F59000058600000536800004E720000
+497D0000448800003E930000379F000030AE000027C200011CD3000910E600
+1200F50A1B00FF211712FF45010BFF5A0606FF71090DFF8B0000FFA20E11FF
+CE0013FFE90013FFE90013FFE90013FFE90013FFE90013FFE90013FFE90013
+FFE90013FFE900765500006C560000645700005D590000585C000053630000
+4D6C000048770000438200003D8C0000369700002FA4000027B400001FC600
+0214D7000A07E9001400F9131500FF26120DFF450009FF5C0209FF720009FF
+890002FF9D0704FFB3050EFFE2000DFFE2000DFFE2000DFFE2000DFFE2000D
+FFE2000DFFE2000DFFE2000DFFE2006A560000625800005C590000575B0000
+535F00004D67000048710000427B00003C860000358F00002D9B000026A900
+0020B8000017C900030DDA000A00EB051300FB191000FF2A0D09FF470007FF
+5D0005FF710004FF850202FF990503FFAC0304FFBC0104FFBC0104FFBC0104
+FFBC0104FFBC0104FFBC0104FFBC0104FFBC0104FFBC01615800005A5A0000
+555C0000515F00004D620000476B0000417600003B800000348900002D9300
+00269F00001FAD000018BB000010CB000406DD000B00EF0C0D00FD1E0B00FF
+2E0805FF4C0003FF5F0002FF700003FF820003FF970101FFA70201FFB60001
+FFB60001FFB60001FFB60001FFB60001FFB60001FFB60001FFB60001FFB600
+595A0000545D0000506000004C62000047660000417000003B7A0000348300
+002C8C0000259700001EA3000017AF000011BE00000ACD000501E1020A00F1
+130900FF240700FF320301FF4B0000FF5F0000FF700000FF810001FF930000
+FFA20100FFB20000FFB20000FFB20000FFB20000FFB20000FFB20000FFB200
+00FFB20000FFB200535E00004E6100004A64000046660000416A00003B7400
+00347D00002C870000259000001E9B000017A6000011B100000BBF000103CE
+000600E3090600F2190500FE280300FF350000FF4F0000FF630000FF720000
+FF810000FF910000FF9F0000FFAE0000FFB00000FFB00000FFB00000FFB000
+00FFB00000FFB00000FFB00000FFB000>
+<9424000094240000942500009425000095260000972600009B2700009F2600
+00A3240004A71D0012A3110022980202339A0012349D002331A500362FAA00
+4D2EAB00652DA8007D2BA7009928A800C1249F00ED20A71EFF00A51DFF00A5
+1DFF00A51DFF00A51DFF00A51DFF00A51DFF00A51DFF00A51DFF00A51DFF00
+A51DFF00A51DFF009424000094250000942500009526000095260000972700
+009B2700009F270000A3250004A81E0012A4120022980201349A0011359D00
+2232A400352FAA004C2FAB00642EA8007D2CA7009829A700C025A000EC20A7
+1EFF00A51DFF00A51DFF00A51DFF00A51DFF00A51DFF00A51DFF00A51DFF00
+A51DFF00A51DFF00A51DFF00A51DFF00942400009425000095260000952600
+0095270000972700009B280000A0280000A4260003A81F0011A51300219903
+00349B0010369D002133A4003430AA004A30AC00632FA9007B2CA700972AA7
+00BD26A000EA21A81FFF00A61EFF00A61EFF00A61EFF00A61EFF00A61EFF00
+A61EFF00A61EFF00A61EFF00A61EFF00A61EFF00A61EFF0094250000942600
+00952600009527000095270000982800009C290000A0290000A4270003A921
+0010A71500209B0500339B000E379D002034A4003232AA004931AD006230AA
+007A2DA600952BA700BB27A000E922A920FF00A61FFF00A61FFF00A61FFF00
+A61FFF00A61FFF00A61FFF00A61FFF00A61FFF00A61FFF00A61FFF00A61FFF
+009426000095260000952700009528000096280000982900009C2A0000A12A
+0000A5280003AA22000FA917001F9E0700319B000C399E001E36A4003133AA
+004732AD006031AB00792FA600942CA700B828A000E723AA21FF00A720FF00
+A720FF00A720FF00A720FF00A720FF00A720FF00A720FF00A720FF00A720FF
+00A720FF00A720FF009526000095270000952800009628000096290000982A
+00009D2B0000A22B0000A62A0002AB24000EAA19001EA00A00309B000A3B9E
+001C38A4002F35AA004533AE005E32AC007730A600922DA700B629A000E525
+AB23FF00A821FF00A821FF00A821FF00A821FF00A821FF00A821FF00A821FF
+00A821FF00A821FF00A821FF00A821FF009527000096280000962900009629
+0000972A0000992B00009D2C0000A32D0000A72C0001AC26000DAC1B001CA3
+0C002E9C00073C9F001A3AA3002D37AA004334AE005C34AD007531A700902F
+A600B22BA000E126AC24FF00A822FF00A822FF00A822FF00A822FF00A822FF
+00A822FF00A822FF00A822FF00A822FF00A822FF00A822FF00962800009629
+000096290000972A0000972B00009A2C00009E2D0000A42F0000A92F0001AD
+29000CAE1E001BA70F002D9D02063D9F00173DA3002A39AA004036AF005A35
+AE007333A7008E30A600AF2CA100DE28AE26FF00A924FF00A924FF00A923FF
+00A923FF01A923FF01A923FF01A923FF01A923FF01A923FF01A923FF01A923
+FF0196290000972A0000972B0000972B0000972C00009A2D00009F2F0000A6
+310000AB320000AF2B000BB121001AAB13002B9F03043DA000153FA300283B
+AA003D38B0005737AF007135A9008C33A500AB2EA100DA29A91EFF0AA41CFF
+0AA41CFF0AA41CFF0AA41CFF0BA41CFF0BA41CFF0BA41CFF0BA41CFF0BA41C
+FF0BA41CFF0BA41CFF0B972A0000972B0000972C0000982D0000982D00009B
+2F0000A1310000A7330000AD340000B02E0009B4240018AF160029A206023D
+A1001142A400243EA900393AB000533AB1006E38AA008935A400A631A100D6
+2BA416FF149F14FF149F14FF149E13FF149E13FF149E13FF149E13FF149E13
+FF149E13FF149E13FF149E13FF149E13FF14972C0000982C0000982D000098
+2E0000992F00009C310000A2330000A9360000AF370000B2320008B6280016
+B31A0027A609003CA2000D45A5002142A900363DB0004F3CB3006B3AAC0086
+38A500A233A000CE2E9C08FF22990BFF1D990AFF1E990AFF1E990AFF1E990A
+FF1E990AFF1E990AFF1E990AFF1E990AFF1E990AFF1E990AFF1E982D000098
+2E0000992F000099300000993000009D330000A3360000AA380000B13A0000
+B5360006B82C0015B81F0024AC0E0039A3000849A6001D46AA003140B0004B
+3FB500673DAE00833BA5009E379A00C1339203FB2F8A05FF2C8806FF2D8607
+FF2E8507FF2E8507FF2E8507FF2E8507FF2E8507FF2E8507FF2E8507FF2E85
+07FF2E992F000099300000993100009A3100009A3200009E350000A5390000
+AC3B0000B33D0000B83B0005BB310013BD240022B3140035A400034DA70018
+4AAA002D44B0004542AD0060449A00794888008E467900A7437301E741760E
+FF36740EFF36720FFF37710FFF37710FFF37710FFF37710FFF37710FFF3771
+0FFF37710FFF37710FFF379A3100009A3200009B3300009B3400009B340000
+A0380000A63B0000AD3E0000B5400000BB3F0003BE360011C22A001FBA1A00
+31AC070249A800134E9D0024509100365386004C57790066596A007F585D00
+A0575400CB516216FF3C6017FF3C5F17FF3D5E18FF3D5E18FF3D5E18FF3D5E
+18FF3D5E18FF3D5E18FF3D5E18FF3D5E18FF3D9B3300009B3400009C350000
+9C3600009D370000A13A0000A73E0000AE400000B6430000BD430002C13C00
+0EC730001DC221002EAB1100468603035E7200136367002568590037674D00
+4D6845006A683D008B653700C361491CFF45451AFF484017FF4B3C14FF4E3C
+14FF4E3C14FF4E3C14FF4E3C14FF4E3C14FF4E3C14FF4E3C14FF4E9C360000
+9D3700009D3800009D3900009E390000A13C0000A8400000AF430000B74500
+00BE470001C443000CCA38001AB32F00299325003F6C160059480201743700
+12752B002474230037761D0050761A006C7317009C711201FF6A1102FF6A10
+03FF690F04FF690F04FF690F04FF690F04FF690F04FF690F04FF690F04FF69
+0F04FF699D3800009E3900009E3A00009F3B00009F3C0000A23F0000A84200
+00AF450000B6480000BE4A0000BE49000BAC460019973F00277C3500395826
+00523719006911070080040614810009287E000C3F7B000F5F7900149C7500
+15F3680016F3670017F3660018F3660018F3660018F3660018F3660018F366
+0018F3660018F3660018F3669F3B00009F3C0000A03D0000A03E0000A03E00
+00A3410000A8440000AE470000B54A0000B14E0001A350000E954F001A844B
+00256B4300364E38004B2E2C00600A1D0172001E1276002326740028427100
+2E6B6F0030A1670831FD560933FF540934FF540935FF530935FF530935FF53
+0935FF530935FF530935FF530935FF530935FF53A03E0000A03F0000A03F00
+00A0400000A1410000A3430000A8460000AD490000A54E00009A5300069056
+0010845700197455002460510032464B004428400058042F006B0036136C00
+3E276B0045486900486D64004BA25B0147F4510047FE500048FE4F0049FE4F
+0049FE4F0049FE4F0049FE4F0049FE4F0049FE4F0049FE4F0049FE4FA14000
+00A1410000A1420000A1420000A1430000A3450000A74800009C4D00009253
+000289570009805B0010755F0017686100215761002E3D5C003C2254005003
+4902650050156400592D61005F4E5F00616D580062954F0669FF440568FF42
+0569FF410569FF410569FF410569FF410569FF410569FF410569FF410569FF
+410569FF41A1420000A1430000A1440000A1440000A1450000A3470000964C
+00008B520000825700047A5C00087262000D696700135E6C001C4E6E002737
+6C00341D6800460162035C006918580070305400784E50007A6C48007C9442
+0082F63A0080FF370081FF370081FF370081FF370081FF370081FF370081FF
+370081FF370081FF370081FF37A1450000A1450000A1460000A1460000A147
+0000924B0000865000007D550001745B00036D610005676900095F70000E55
+760017467A0021317C002C1A7B003B0079054C00801A4800872F44008D493F
+00926A3A009598360096E7310093FF2E0093FF2E0093FF2E0093FF2E0093FF
+2E0093FF2E0093FF2E0093FF2E0093FF2E0093FF2EA1470000A1470000A148
+0000A14800008F4B0000834F00007954000070590000685F0000636700025E
+7000055779000A4D8100113F87001B2D8B0024198E0030008F043D00981739
+00A02C3500A4483100AF6D2F00B89E2C00B0DB2901A8FF2501A8FF2501A8FF
+2501A8FF2501A8FF2501A8FF2501A8FF2501A8FF2501A8FF2501A8FF25A148
+0000A1490000A14900008E4C0000814E0000775200006D570000655C000060
+6400005B6D00005678000150830005478C000A3A9400132B9D00191BA40024
+04AA012E00B7132D00C3282A00C5422600E0702600E8922200DAB82200D0F4
+1F01D0F51F01D1F71F01D1F71F01D1F71F01D1F71F01D1F71F01D1F71F01D1
+F71F01D1F71FA14A0000A14B00008C4E00007F500000755200006C55000063
+5A00005D610000586A0000547500004F8100004A8D0000439800013AA50006
+2EB5000B20C4001313D6001D00E60B2501F9252013FF4E0D0CFF691118FF8D
+0000FFA71813FFEA0A14FFEC0915FFED0815FFED0815FFED0815FFED0815FF
+ED0815FFED0815FFED0815FFED08A14C00008B4F00007D520000735400006A
+550000625900005B5F000056680000527200004C7E00004789000042950000
+3BA1000034B100002AC500031DD7000D10EB001700FA101E03FF281712FF4F
+0408FF650D11FF840000FF9E1114FFD60113FFE30313FFE40313FFE40313FF
+E40313FFE40313FFE40313FFE40313FFE40313FFE4038B5000007C54000071
+55000068570000625800005B5C000056630000506C00004B77000046820000
+408D00003A98000033A600002BB7000021C9000416DC000D05ED011900FD17
+1809FF320C0FFF510005FF660A0CFF820002FF9C0B0EFFC40112FFE80012FF
+E80012FFE80012FFE80012FFE80012FFE80012FFE80012FFE80012FFE8007B
+5400007056000067570000605800005A5A0000555F0000506700004A710000
+457C00003F86000038910000319C00002AAB000023BC000019CD00050EE000
+0D01F0081500FE1D1205FF340A0AFF520109FF690008FF800003FF970504FF
+AF050BFFD7000BFFD6000BFFD6000BFFD6000BFFD6000BFFD6000BFFD6000B
+FFD6000BFFD6006F560000655700005E590000585B0000545D00004F620000
+4A6B0000447600003E800000378A00003094000029A1000022AF00001BBF00
+0112D0000607E3000E00F40F1000FE220E03FF360807FF530005FF690004FF
+7D0002FF940402FFA90303FFBB0103FFBA0103FFBA0103FFBA0103FFBA0103
+FFBA0103FFBA0103FFBA0103FFBA01645700005C590000575B0000535E0000
+4F6000004A660000447000003E7A0000378400002F8D00002898000021A500
+001AB3000014C200010BD3000600E6030E00F6160B00FF270901FF390503FF
+560002FF690002FF7B0003FF920001FFA40101FFB40001FFB40001FFB40001
+FFB40001FFB40001FFB40001FFB40001FFB40001FFB4005B5A0000555C0000
+515F00004D61000049640000446A00003D750000377E00002F870000289100
+00219C00001AA8000013B500000DC4000204D5000800E80B0900F71C0700FF
+2B0500FF3B0100FF570000FF6A0000FF7B0001FF8E0000FFA00000FFB00000
+FFB20000FFB20000FFB20000FFB20000FFB20000FFB20000FFB20000FFB200
+545D00004F6000004B63000046660000426900003D6F0000377900002F8200
+00288B00002195000019A0000012AA00000DB7000006C4000300D7040600EB
+120400F8210300FF2F0100FF420000FF5D0000FF6D0000FF7D0000FF8E0000
+FF9E0000FFAB0000FFB20000FFB20000FFB20000FFB20000FFB20000FFB200
+00FFB20000FFB2004E6100004964000044670000406A00003C6D0000377300
+002F7C000028850000218E00001998000012A200000CAC000005B7000300C5
+020300DB0A0100EA180000F8250000FF310000FF4A0000FF5F0000FF6D0000
+FF7C0000FF8B0000FF9C0000FFA60000FFB20000FFB20000FFB20000FFB200
+00FFB20000FFB20000FFB20000FFB200>
+<931F0000931F00009320000093200000932100009421000096210000992000
+009C1E00029F1700109A0B00209300052B970015299B002527A1003626A500
+4C26A6006225A4007923A5009322A800B71EA200E019A516FF02A014FF00A0
+14FF00A014FF00A014FF00A014FF00A014FF00A014FF00A014FF00A014FF00
+A014FF00A014FF00931F000093200000932000009321000093210000942200
+0096210000992000009C1F00019F18000F9B0C001F9300042C9700142A9B00
+2428A1003527A5004A27A6006126A5007824A6009222A800B51FA200DF1AA5
+16FF02A015FF00A015FF00A015FF00A015FF00A015FF00A015FF00A015FF00
+A015FF00A015FF00A015FF00A015FF00932000009320000093210000932100
+009322000094220000972200009A2100009D1F0001A019000E9C0E001E9300
+022D9700132B9B002329A1003427A6004928A6006027A5007725A6009123A8
+00B420A200DE1BA617FF03A116FF00A116FF00A116FF00A116FF00A116FF00
+A116FF00A116FF00A116FF00A116FF00A116FF00A116FF0093200000932100
+0093210000932200009422000094230000972200009A2200009D200001A11A
+000E9E0F001D9501022D9800112C9B00212AA1003229A6004729A7005F28A6
+007626A6008F24A800B221A300DC1CA718FF03A117FF00A117FF00A117FF00
+A117FF00A117FF00A117FF00A117FF00A117FF00A117FF00A117FF00A117FF
+00932100009321000093220000942200009423000094230000972300009A22
+00009D210001A21C000DA011001C9603012C98000F2E9B00202CA100312AA6
+00462AA8005D29A7007427A6008E25A800B022A300DB1DA819FF04A218FF00
+A218FF00A218FF00A218FF00A218FF00A218FF00A218FF00A218FF00A218FF
+00A218FF00A218FF0093210000942200009423000094230000942400009424
+0000972400009A2300009E220001A31E000CA213001B9905012B98000D309B
+001E2DA0002F2BA600442BA9005B2AA8007328A6008C26A800AE23A400D91E
+A91AFF04A319FF00A319FF00A319FF00A319FF00A319FF00A319FF00A319FF
+00A319FF00A319FF00A319FF00A319FF009422000094230000942300009424
+00009424000094250000972500009B2400009F240001A420000AA315001A9B
+08012A98000B329B001C2FA0002D2DA700422CA900592CA900712AA6008A28
+A800AC25A400D720AA1BFF05A41AFF00A41AFF00A41BFF00A41BFF00A41BFF
+00A41BFF00A41BFF00A41BFF00A41BFF00A41BFF00A41BFF00942300009424
+000094240000942500009425000095260000982600009C260000A0260000A5
+220009A51800189E0A0029990108339B0019329F002B2FA7003F2EAA00572D
+AA006F2BA6008829A800A926A500D621AC1CFF06A41CFF00A41CFF00A51CFF
+00A51CFF00A51CFF00A51CFF00A51CFF00A51CFF00A51CFF00A51CFF00A51C
+FF00942400009424000094250000942600009526000095270000982700009D
+280000A1270000A5240008A81B0016A20D0027990105359C0017349F002831
+A7003C2FAB00542FAB006D2DA700862BA700A528A500D223A817FE0DA51EFF
+00A61EFF00A61EFF00A61EFF00A61EFF00A61EFF00A61EFF00A61EFF00A61E
+FF00A61EFF00A61EFF00942500009426000095260000952700009527000096
+280000992900009E2A0000A2290000A6260006AA1E0015A51100259A020336
+9C0013389F002534A6003932AC005131AC006A2FA800842DA600A12AA500CE
+25A20DFC18A71FFF00A720FF00A720FF00A720FF00A720FF00A720FF00A720
+FF00A720FF00A720FF00A720FF00A720FF0095260000952700009528000096
+28000096290000972900009A2A00009F2B0000A42C0000A8290005AC210013
+A91500239D0400379D000F3BA0002238A6003534AC004D33AE006732AA0081
+30A6009E2CA500C8289C01FA22A821FF00A822FF00A822FF00A722FF00A722
+FF00A722FF00A722FF00A722FF00A722FF00A722FF00A722FF009528000096
+28000096290000962A0000972A0000972B00009B2C0000A02E0000A62F0000
+AA2D0004AE250011AD190021A20900349D000B3EA0001E3CA6003138AC0049
+36B0006335AB007D32A20097319600B42F8C00E32D8202FF298003FF2A7E03
+FF2B7D04FF2B7C04FF2B7C04FF2B7C04FF2B7C04FF2B7C04FF2B7C04FF2B7C
+04FF2B96290000972A0000972B0000972C0000982C0000982D00009C2F0000
+A2310000A9330000AD320002B12A000FB11E001EA90F00319E000642A1001A
+40A5002D3BAA00433AA000593F920070428300844076009D3E6D00C23D6C07
+FF356A07FF366808FF366708FF376709FF376709FF376709FF376709FF3767
+09FF376709FF376709FF37972B0000972C0000982D0000982E0000982E0000
+992F00009E320000A4340000AB360000B1370000B42F000DB624001CB01500
+2DA4050341A00014469100234B8800334E7E00465071005D52650075525C00
+93515300B34B5C13FF385F19FF33611DFF306320FF2D6422FF2C6422FF2C64
+22FF2C6422FF2C6422FF2C6422FF2C6422FF2C982D0000982E0000992F0000
+99300000993100009A320000A0350000A6380000AD3A0000B43B0000B83500
+0ABB2A0019B71C002A9B1000417B0304576A00125E5F002361540033624900
+4863410063633A007F603600A55C481DFF3E4218FF433D15FF463912FF4A37
+11FF4B3711FF4B3711FF4B3711FF4B3711FF4B3711FF4B3711FF4B99300000
+993100009A3200009A3200009B3300009C340000A2390000A83C0000B03E00
+00B7400000BC3C0008B8320016A42A00258821003A641300544301016D3300
+116F2900226F200034701A004B701800646D1700886C1201E8661104FF6310
+04FF630E05FF630E05FF630E05FF630E05FF630E05FF630E05FF630E05FF63
+0E05FF639A3200009B3300009B3400009C3500009C3600009D370000A33C00
+00A93F0000B1410000B8430000AF430008A03F00168E390023753000345324
+004E341700640F06007A0305137B00092678000C3C75000E58730013887100
+15D3660015ED620017ED610018ED600018ED600018ED600018ED600018ED60
+0018ED600018ED600018ED609C3600009D3700009D3800009E3900009E3A00
+009F3B0000A43E0000AA420000B2450000A6490000994A000C8C4800177D44
+0023653D0032493400472B29005C091B016D001C11700022246D00253C6A00
+2B626A002F9164002DDA57042EFF51042FFF510330FF500330FF500330FF50
+0330FF500330FF500330FF500330FF500330FF509E3900009E3A00009F3B00
+009F3C0000A03D0000A03E0000A4410000A84400009C4A0000924E0005884F
+000E7D5000186E4E00215A4B002F42450040253B0054042C01650032126600
+3A2564004142640045655F004992580046D14E0045F9490046F9490047F948
+0047F9480047F9480047F9480047F9480047F9480047F9480047F9489F3D00
+00A03E0000A03E0000A03F0000A0400000A1400000A1440000954A00008B4F
+0001825200077955000E6F5800166259001F5159002B395500391E4D004C02
+43025F004B145E00542A5C005A485A005C6654005D884B005EBF440161FF3E
+0162FF3E0163FF3D0163FF3D0163FF3D0163FF3D0163FF3D0163FF3D0163FF
+3D0163FF3DA03F0000A1400000A1410000A1420000A14200009B4300008F49
+0000854E00007C530003745700076C5C000C636100125864001B4966002631
+640031195F0043005B045600641852006B2E4E0071494B007365440075863E
+007AC838007AFF32007BFF32007BFF32007BFF31007BFF31007BFF31007BFF
+31007BFF31007BFF31007BFF31A1420000A1430000A1440000A14400009A46
+00008C490000814D0000775200006F560002675C0004616300085A69000E50
+6F0016417100202C73002A1571003A00720647007A1A4100802E3D0085453A
+00896336008D8732008FC82E008BFF29008CFF29008CFF29008CFF29008CFF
+29008CFF29008CFF29008CFF29008CFF29008CFF29A1450000A1450000A146
+000099470000894A00007E4C0000745000006B550000645B00005E62000159
+6A00045272000A487900113A7E001A278200231284002F0087063800901833
+00962C2F009A452C00A1652B00A9912900A5C427009BFF21009BFF21009BFF
+20009BFF20009BFF20009BFF20009BFF20009BFF20009BFF20009BFF20A147
+0000A147000098490000874C00007B4E0000724F000069530000615900005B
+60000057680000527200014B7C00054284000C358B00132592001A13970025
+009D032C00A9152900B2282500B4412200BF652300CB8B2000C5B42000BBFB
+1C00B8FF1B00B8FF1B00B9FF1B00B9FF1B00B9FF1B00B9FF1B00B9FF1B00B9
+FF1B00B9FF1BA1490000984B0000854E0000795000006F5100006852000060
+570000595D000055660000507000004B7B0000458700013D910004329B0008
+27A7000D19B1001709BF001F00CC102000DC231D01F13B1C00F0611A08FA86
+0F00FBA91613FDF90A12F6FF0A12F7FF0912F7FF0912F7FF0912F7FF0912F7
+FF0912F7FF0912F7FF0912F7FF09984C0000844F0000775200006D53000065
+5500005F560000585C0000536400004E6E0000497A0000438500003D910000
+369D00002EAC000027C000011BD100080FE5001100F50A1900FF211511FF45
+0008FF5B0709FF770409FF950309FFB90511FFE80011FFE80011FFE80011FF
+E80011FFE80011FFE80011FFE80011FFE80011FFE80082510000755400006B
+550000635700005C590000585B0000526200004D6B00004876000042800000
+3B8B0000349500002DA2000026B200001EC4000114D5000907E8001200F813
+1300FF26100BFF460009FF5F0008FF760006FF910304FFAB0409FFD00109FF
+CE0109FFCD0109FFCD0109FFCD0109FFCD0109FFCD0109FFCD0109FFCD0174
+55000069560000615800005A5A0000565C0000525E00004C66000047700000
+417A00003B850000338E00002C9A000025A700001EB6000016C700020CD800
+0900EA051100FA190E00FF2B0B08FF490005FF600004FF740002FF8D0302FF
+A50303FFB90103FFB90003FFB90003FFB90003FFB90003FFB90003FFB90003
+FFB90003FFB900685700005F580000595B0000545D0000505F00004C620000
+466A0000407500003A7F0000328800002B920000249E00001DAB000016B900
+000FC9000305DB000A00EE0C0C00FC1F0A00FF2F0603FF4C0001FF610001FF
+730002FF8A0001FFA10101FFB30000FFB30000FFB30000FFB30000FFB30000
+FFB30000FFB30000FFB30000FFB3005E590000575B0000525E00004E610000
+4A63000046660000406F00003A790000328200002B8C0000239600001CA100
+0015AE00000FBB000008CA000401DD040900F0140700FD240500FF330201FF
+4C0000FF630000FF740000FF880000FF9C0000FFAF0000FFB20000FFB20000
+FFB20000FFB20000FFB20000FFB20000FFB20000FFB200565C0000515F0000
+4C6200004865000043680000406B000039740000327D00002B860000238F00
+001C99000015A400000EAF000008BC000201CA000600E10B0400F01A0300FD
+290100FF360000FF550000FF690000FF770000FF890000FF9D0000FFA90000
+FFB20000FFB20000FFB20000FFB20000FFB20000FFB20000FFB20000FFB200
+4F6000004A63000045670000416A00003D6C0000396F0000327700002B8000
+00238900001C930000159C00000EA6000007B0000101BC010300CF060100E2
+100000EF1D0000FC2A0000FF370000FF550000FF690000FF750000FF860000
+FF9B0000FFA40000FFB20000FFB20000FFB20000FFB20000FFB20000FFB200
+00FFB20000FFB20048650000436800003E6B00003A6E000036710000327300
+002B7A0000238300001C8C0000159500000E9E000009A6000002B0000400BC
+010300CE050100E1100000EE1D0000FC290000FF350000FF530000FF670000
+FF720000FF830000FF960000FFA00000FFAF0000FFB20000FFB20000FFB200
+00FFB20000FFB20000FFB20000FFB200>
+<901A0000911A0000911B0000911B0000911B0000911C0000931C0000951B00
+00971800019811000D9106001D90000922940017209800251E9D00351DA000
+4A1EA100601DA000751CA1008C1AA400AB18A100CF139E06F70A9B0CFF009B
+0CFF009B0CFF009B0CFF009B0CFF009B0CFF009B0CFF009B0CFF009B0CFF00
+9B0CFF009B0CFF00901A0000911A0000911B0000911B0000911C0000921C00
+00931C0000951B0000971900009812000C9307001C90000823940016219800
+241F9E00341EA100491FA1005F1EA000741DA1008B1BA400AA19A100CE149E
+05F70C9B0CFF009B0CFF009B0CFF009B0CFF009B0DFF009B0DFF009B0DFF00
+9B0DFF009B0DFF009B0DFF009B0DFF00911A0000911B0000911B0000921C00
+00921C0000921D0000931D0000961C0000971A00009914000C9408001B9000
+062494001422980023209E00331FA1004820A2005E1FA100731EA2008A1CA5
+00A91AA200CE159E05F70D9C0DFF009C0DFF009C0DFF009C0DFF009C0DFF00
+9C0DFF009C0DFF009C0DFF009C0DFF009C0DFF009C0DFF00911B0000911C00
+00921C0000921D0000921D0000921E0000931E0000961D0000981B00009A15
+000B960A001A9100052594001323980022219E003120A2004621A3005C20A1
+00711FA200881DA500A81BA300CC169F04F70F9C0EFF009C0EFF009C0EFF00
+9C0FFF009C0FFF009C0FFF009C0FFF009C0FFF009C0FFF009C0FFF009C0FFF
+00911C0000921C0000921D0000921D0000921E0000921E0000941E0000961D
+0000981C00009B16000A980C00199201042595001224980020239E003021A2
+004422A3005B22A2007020A200871EA600A61CA300CB179F04F6109D10FF00
+9D10FF009D10FF009D10FF009D10FF009D10FF009D10FF009D10FF009D10FF
+009D10FF009D10FF00921C0000921D0000921E0000921E0000921F0000931F
+0000941F0000971E0000991D00009C1800099A0E0018930303259500102698
+001F249E002E23A2004223A4005923A3006F21A3008620A600A41DA400CA19
+9F02F6139E11FF009E11FF009E11FF009E11FF009E11FF009E11FF009E11FF
+009E11FF009E11FF009E11FF009E11FF00921D0000921E0000921E0000931F
+0000931F00009320000094200000971F0000991E00009D1A00079C10001795
+04022595000E2898001D269E002C24A3004025A5005724A4006D23A3008421
+A600A21FA500C81A9E01F5159F12FF009F13FF009F13FF009F13FF009F13FF
+009F13FF009F13FF009F13FF009F13FF009F13FF009F13FF00921E0000931F
+0000931F000093200000932000009321000095210000972000009A1F00009E
+1C00069E1300159706012595000B2A98001B289D002A26A3003E26A5005426
+A5006B24A4008223A700A020A600C71C9E00F417A014FF00A014FF00A014FF
+00A014FF00A014FF00A014FF00A014FF00A014FF00A014FF00A014FF00A014
+FF00931F000093200000932000009321000093210000932200009522000098
+2200009B2100009E1E0005A0160014990900249500082C9800182A9D002828
+A3003B28A6005228A6006926A5008024A7009E22A700C51E9F00F219A116FF
+00A116FF00A116FF00A116FF00A116FF00A116FF00A116FF00A116FF00A116
+FF00A116FF00A116FF00932000009321000093210000942200009422000094
+23000095230000982300009B2200009F200004A31900129D0C00229500052F
+9900152D9D00252BA300382AA7004F2AA8006628A6007E26A7009A24A800C3
+209F00EF1BA318FF00A218FF00A218FF00A218FF00A218FF00A218FF00A218
+FF00A218FF00A218FF00A218FF00A218FF0093220000942200009423000094
+230000942400009424000095240000982400009C240000A0230002A41C0010
+A010002096010131990012309C00222EA300352CA8004B2CA900632BA7007B
+28A6009726A800BF229F00EC1DA51BFF00A11CFF00A01DFF009F1EFF009E1F
+FF009E1FFF009E1FFF009E1FFF009E1FFF009E1FFF009E1FFF009423000094
+2300009424000094240000942500009426000096260000992600009D260000
+A1250001A620000EA514001D9A05012F99000D349C001F31A200312FA80047
+2EAB00602DA800782B9C008E2C9300AA2C8A00CE2A7D00FE267901FF267700
+FF277501FF287401FF287401FF287401FF287401FF287401FF287401FF2874
+01FF2894240000942500009425000095260000952700009527000097280000
+9A2900009F290000A3280001A823000BA819001BA00A002D9A0009389D001B
+35A2002D329F004034960054388A00683B7E007C3A730094386B00B3376500
+F2356405FF316205FF326105FF336005FF346005FF346005FF346005FF3460
+05FF346005FF346005FF349526000095270000952700009628000096290000
+96290000982A00009B2B0000A12C0000A62C0000AA280009AC1E0018A61000
+299D0305389500133F8800214580003047760041496B00564C60006D4C5900
+884B5100A5464E03F3426C29FF1E6D2CFF1D6C2CFF1D6C2CFF1D6B2CFF1D6B
+2CFF1D6B2CFF1D6B2CFF1D6B2CFF1D6B2CFF1D962800009629000096290000
+972A0000972B0000972B0000992C00009D2E0000A3300000A9310000AD2D00
+07B1240015AA1700268F0E003B72020450640012575900215A4F00305B4600
+435D3E005D5E3800775B340096573606FE503F17FF3D3A14FF413611FF4533
+0EFF48320EFF48320EFF48320EFF48320EFF48320EFF48320EFF48972A0000
+972B0000972C0000982D0000982D0000982E00009A2F00009F320000A63400
+00AD360000B1330004A92D0013982600217E1E00355C11004E3E0102663000
+1069270020691E00316B1800466B16005E6816007B661300B8630F03FF5E0D
+03FF5E0C03FF5E0B04FF5F0B04FF5F0B04FF5F0B04FF5F0B04FF5F0B04FF5F
+0B04FF5F982D0000982E0000992E0000992F0000993000009A3100009C3300
+00A2360000A8390000B03B0000A23C0006953900148633001F6E2C00304E21
+00493016005F0E0600740305127500092573000B396F000D536C00127A6C00
+15B6630015E95C0016E85B0017E85B0018E85A0018E85A0018E85A0018E85A
+0018E85A0018E85A0018E85A993000009A3100009A3200009B3300009B3400
+009B3400009E370000A53B0000A73E00009C4300009144000A85420015763E
+00205F39002F453100432827005708190168001B116A002023670023396400
+295B64002D8460002EB756002BF84E002CF84D002DF74D002EF74C002EF74C
+002EF74C002EF74C002EF74C002EF74C002EF74C9B3300009B3400009C3500
+009C3600009D3700009D3800009F3A00009E3F0000954500008B490003814A
+000D76490016684800205445002C3D40003C2237004F03290160002F125F00
+37235E003D3D5D00415E5A004582540045B44A0043F4420044F4420044F441
+0045F4410045F4410045F4410045F4410045F4410045F4410045F4419D3700
+009D3800009E3900009E3A00009F3B00009F3C0000984000008E460000854B
+00007C4E00067350000D695100155C53001E4B520028344F00351B47004701
+3E035800461457004F2856005644540058604F00597D47005AA740005CFE38
+005DFE38005EFE37005EFE37005FFE37005FFE37005FFE37005FFE37005FFE
+37005FFE379F3B00009F3D0000A03D0000A03E0000A03F0000964200008946
+0000804B0000774E00026E5200066756000B5E5A0011535D001A435E00242D
+5D002E155800400055054F005E184C00662D47006B4544006E5F3F006F7B3A
+0072A8350074FF2E0075FF2D0075FF2D0075FF2D0075FF2D0075FF2D0075FF
+2D0075FF2D0075FF2D0075FF2DA03F0000A0400000A1410000A14100009444
+0000864700007C4A0000734E00006A520002635700045C5D00075563000D4B
+6700163C69001F276B002810690038006B084100741B3A007A2D37007E4334
+00825E3100857B2D0088AF2B0086F9260085FF250085FF250085FF240085FF
+240085FF240085FF240085FF240085FF240085FF24A1420000A1430000A144
+000092470000844A0000794B0000704D00006751000060570000595D000054
+6500044D6C00094471001135760019227900220D7A002E007F09330088192D
+008E2B2B0091432800975E27009C8126009CB2240095F31E0093FF1D0093FF
+1C0094FF1C0094FF1C0094FF1C0094FF1C0094FF1C0094FF1C0094FF1CA145
+0000A146000090490000814C0000764D00006D4E0000665000005E55000057
+5B0000536400004D6D0001467500063D7D000C2F8300131E87001C0C8C0025
+00940628009F162400A6282100A7401E00AE5D1E00B7821E00B7A91E00AEE5
+1A00A8FF1800A8FF1700A9FF1700A9FF1700A9FF1700A9FF1700A9FF1700A9
+FF1700A9FF17A14800008F4B00007F4D0000734F00006A500000635100005D
+540000565A0000516200004C6B00004676000040800002378900062C92000B
+1F9A001110A2001A01AD021F00BA131C00C5231900D0391700D1591600DD7B
+1400E3A2140AEFF60E02D2FF1102D3FF1102D3FF1002D3FF1002D3FF1002D3
+FF1002D3FF1002D3FF1002D3FF108E4C00007D4F0000715100006752000060
+5400005A56000055590000506100004A6A0000457500003F800000388B0000
+3196000029A3000021B2000216C100090AD3001100E40B1400F61F1207FF38
+080AFF570108FF6F0006FF8A0204FFA8050CFFE7000BFFE2000AFFDC000AFF
+DC000AFFDC000AFFDC000AFFDC000AFFDC000AFFDC007B5100006F53000065
+5500005D570000585A0000545C00004F610000496A0000447500003E7F0000
+378900002F930000289F000021AD00001ABD000011CE000506E1010D00F30F
+0F00FE230C02FF370705FF560004FF6C0003FF840102FFA00302FFB80002FF
+B80002FFB80002FFB80002FFB80002FFB80002FFB80002FFB80002FFB8006D
+560000635800005B5A0000565C0000525E00004E61000049650000436F0000
+3D790000368300002E8C00002797000020A3000019B1000012C000010AD000
+0601E5040C00F5160A00FF280801FF3A0302FF580000FF6C0001FF810001FF
+9C0100FFB20000FFB20000FFB20000FFB20000FFB20000FFB20000FFB20000
+FFB20000FFB200615800005A5A0000545D0000506000004B62000047650000
+436A00003C740000357D00002E860000279000001F9B000018A7000012B300
+000BC2000103D2000700E70C0700F61C0500FF2C0300FF3C0000FF5A0000FF
+6E0000FF810000FF980000FFAE0000FFB20000FFB20000FFB20000FFB20000
+FFB20000FFB20000FFB20000FFB200585B0000535E00004E61000049640000
+45670000406A00003C6E0000357800002E810000268A00001F940000189E00
+0011A900000BB4000004C1000400D4050400E9120200F6220100FF2F0000FF
+490000FF620000FF700000FF830000FF9B0000FFA80000FFB20000FFB20000
+FFB20000FFB20000FFB20000FFB20000FFB20000FFB200515F00004C620000
+47660000426900003E6C00003A6E0000357200002E7B0000268400001F8D00
+001797000010A0000009AA000102B5000400C3030200D7090000E8150000F5
+230000FF2F0000FF480000FF600000FF6E0000FF800000FF960000FFA30000
+FFB20000FFB20000FFB20000FFB20000FFB20000FFB20000FFB20000FFB200
+4A63000045670000406B00003B6E000037700000327200002E760000267E00
+001F87000018900000109900000BA1000006A9000201B4000400C2030200D6
+090000E8150000F5220000FF2F0000FF450000FF5E0000FF6D0000FF7D0000
+FF900000FF9F0000FFAF0000FFB20000FFB20000FFB20000FFB20000FFB200
+00FFB20000FFB200436900003D6C0000386F0000337200002F7400002B7600
+00267900001F8100001A89000015910000109800000CA1000006A9000201B4
+000400C1020200D5090000E7140000F4210000FF2E0000FF420000FF5C0000
+FF6C0000FF7A0000FF8B0000FF9D0000FFA90000FFB20000FFB20000FFB200
+00FFB20000FFB20000FFB20000FFB200>
+<8D1400008E1500008E1500008E1600008F1600008F1700008F170000911600
+0092130000920D000A8B0201188D000B199000171893002416970033169A00
+47169B005D159C0071149D0087139E00A1109D00BF0C9A00E1099805FF0097
+04FF009704FF009704FF009704FF009704FF009704FF009704FF009704FF00
+9704FF009704FF008E1500008E1500008E1600008F1600008F1700008F1700
+008F1800009116000092140000920E00098D0401178D000A1A900016199300
+2317980032169B0046179C005C169C0070159D0086149F00A0129D00BF0D9B
+00E10A9905FF009805FF009805FF009805FF009805FF009805FF009805FF00
+9805FF009805FF009805FF009805FF008E1500008E1600008F1700008F1700
+008F1800008F180000901800009117000093150000930F00088E0501178D00
+091B9000151A93002218980031179C0045189D005B179D006F169E0085159F
+009F139E00BF0E9C00E20B9906FF009805FF009805FF009805FF009806FF00
+9806FF009806FF009806FF009806FF009806FF009806FF008E1600008F1700
+008F1700008F18000090180000901900009019000092180000931600009411
+0007900600168E00071D9100141B94002119990030189C0044199D0059189D
+006E179E008316A0009E149F00BF109C00E20C9A08FF009906FF009906FF00
+9906FF009906FF009906FF009906FF009906FF009906FF009906FF009906FF
+008F1700008F1800008F180000901800009019000090190000901A00009219
+00009417000095120006910800168E00061E9100131C9400201B99002E1A9D
+00421A9E00581A9E006C199F008218A1009C15A000BD119D00E20D9B09FF00
+9908FF009908FF009908FF009908FF009908FF009908FF009908FF009908FF
+009908FF009908FF008F180000901800009019000090190000901A0000911A
+0000911A0000931A00009518000096140005930A00158E01041F9100111E95
+001F1C99002D1B9D00401C9F00561B9F006B1A9F008019A1009B17A100BC13
+9E00E20F9C0BFF009A09FF009A09FF009A09FF009A09FF009A09FF009A09FF
+009A09FF009A09FF009A09FF009A09FF009019000090190000901A0000911A
+0000911A0000911B0000911B0000931B00009519000097160004950C00138F
+02032092000F2095001D1E9A002B1C9E003E1DA000541DA000691CA0007E1A
+A2009919A200BB149E00E2109D0CFF009B0AFF009B0AFF009B0BFF009B0BFF
+009B0BFF009B0BFF009B0BFF009B0BFF009B0BFF009B0BFF0090190000901A
+0000911A0000911B0000911B0000911C0000921C0000941C0000961A000098
+170003970E00129003012192000D2295001B209A00291E9F003C1EA100521F
+A100671DA0007C1CA300971AA400B9169F00E2129E0EFF009B0CFF009B0CFF
+009B0CFF009B0CFF009B0CFF009B0CFF009B0CFF009B0CFF009B0CFF009B0C
+FF00911A0000911B0000911B0000921C0000921C0000921D0000921D000094
+1D0000971C000099190002991100109205002092000A24950019229A002820
+A0003920A2004F20A200651FA1007A1EA300941CA500B718A000E014A010FF
+009C0EFF009C0EFF009C0EFF009C0EFF009C0EFF009C0EFF009C0EFF009C0E
+FF009C0EFF009C0EFF00911C0000921C0000921D0000921D0000921E000092
+1E0000931F0000951E0000971D0000991B00019B14000F9608001F92000826
+960016249A002522A0003622A3004C22A3006221A2007820A400921EA600B5
+1BA100DE16A212FF019D10FF009D10FF009D10FF009D10FF009D10FF009D10
+FF009D10FF009D10FF009D10FF009D10FF00921D0000921D0000921E000092
+1F0000931F0000932000009320000095200000981F00009A1D00009D17000D
+990C001C92000429960013279A002225A0003324A4004925A5005F24A30076
+22A4008F20A700B21DA000DB199B0FFF0A9917FF009818FF009719FF00971A
+FF00961BFF00961BFF00961BFF00961BFF00961BFF00961BFF00921E000093
+1F0000931F0000932000009321000093210000932100009621000099210000
+9B1F00009F1A000B9D10001A9503022897000F2A99001F28A0003027A50045
+27A6005C269E007027950085288F009E288800BE277A00E5238F24FF008E25
+FF008921FF05831BFF0C7E16FF117E16FF117E16FF117E16FF117E16FF117E
+16FF1193200000932000009321000093210000942200009422000094230000
+96230000992200009C210000A11E0008A11400189906002897000B2E9A001C
+2C9F002C2A96003C2E8D004F32830062337900743370008B336800A7326100
+D4305F03FF2C5D04FF2D5C04FF2D5C05FF2E5B06FF2D5B06FF2D5B06FF2D5B
+06FF2D5B06FF2D5B06FF2D9321000094220000942300009423000094240000
+9424000094250000962500009A2500009D240000A2210006A51900159E0C00
+25980106318B0013388100203D77002D406F003C42650050455C0066455600
+7F444F009A414900BD3C6423FF1E6424FF1E6325FF1E6225FF1E6225FF1E62
+25FF1E6225FF1E6225FF1E6225FF1E6225FF1E942300009424000094240000
+94250000942500009526000095270000972700009B280000A0280000A42500
+04A81E00129D150022840C00356B0205485E00114F54001F534A002D554200
+3F573B00575936006F5632008A522F00B74E3D16FF383712FF3D330FFF402F
+0CFF432D0AFF462D0AFF462D0AFF462D0AFF462D0AFF462D0AFF4694250000
+942600009526000095270000962800009628000096290000992A00009D2B00
+00A22C0000A62A00029C2700108D22001E761B0030560F00493A01025F2D00
+0F6324001F631C002F6516004265140058631400726113009B5F0C01FD590B
+02FD590902FD590802FD5A0802FD5A0802FD5A0802FD5A0802FD5A0802FD5A
+0802FD5A952700009628000096290000962A0000972A0000972B0000972C00
+009A2D00009F2F0000A0320000973600048C3300117E2E001D6728002E491F
+00452D14005A0D05006D0205116F0009246D000B3769000D4E6600116F6600
+14A0600014E6560016E5550017E4550018E4540018E3540018E3540018E354
+0018E3540018E3540018E354972A0000972B0000972C0000982D0000982E00
+00982E0000992F00009C3100009A370000933E0000893F00087D3C00136F39
+001F5834002D402D003F2524005307180163001A1164001E22610021365E00
+26555E002B795A002DA352002AED48002BED48002CED47002DED46002DED46
+002DED46002DED46002DED46002DED46002DED46982D0000982E0000992F00
+00993000009A3100009A3200009B330000953A00008D400000844500027A44
+000B6F4300156142001F4D40002A373C00371F34004B0327025A002C125800
+332356003B3A57003F58540042774E0043A0450041E13C0041EC3B0042EC3A
+0042ED3A0043ED390043ED390043ED390043ED390043ED390043ED399A3100
+009A3200009B3300009B3500009C3500009C360000913D0000884200007F47
+0000764900056D4A000D634B0014564C001C454C00252F4900301842004301
+3A03520042144F004C274F0053404C00545A48005575430056983B0058DD33
+0058F8310059F931005AF931005AFA30005AFA30005AFA30005AFA30005AFA
+30005AFA309C3600009D3700009D3800009E3900009D3A00008F4000008443
+00007B470000724A0001694D00066150000B595400104E5600183E57002128
+56002B1251003C004F0648005A184400622C3F0066413D00685A39006A7436
+006C98310070E52A006FFF29006FFF290070FF280070FF280070FF280070FF
+280070FF280070FF280070FF289E3B00009F3C0000A03D00009D3E00008D43
+000081460000774700006E4A0000664E00015F52000458580006505D000C46
+6000143762001D226300260C6100350065093B006F1B3300742C310078402E
+007C5A2B007F742900819B270081DE23007FFF21007FFF21007FFF21007FFF
+20007FFF20007FFF20007FFF20007FFF20007FFF20A03F0000A04000009D41
+00008B4600007E480000744900006B4A0000644E00005C5200005659000050
+5F0003496600083F6B00102F6E00181D7000210871002D00790A2D00821A28
+00872A26008A412400905A22009477210095A0200091D81C008DFF19008EFF
+19008EFF19008EFF19008EFF19008EFF19008EFF19008EFF19008EFF19A142
+00009C440000894800007B4A0000714C0000684D0000614E00005B51000054
+5800004F5F000049680001426F00053775000C297B0013187E001C06830025
+008C092400961720009B281D009D3E1A00A3581A00A8771A00AD9E1900A7CE
+18009FFF1300A0FF1300A0FF1300A0FF1300A0FF1300A0FF1300A0FF1300A0
+FF1300A0FF139C460000874A0000784C00006D4E0000654F00005E50000059
+520000535700004D5E000048670000427100003B7A0002318100072589000C
+168E00150896001B00A1071B00AD141800B5241500BA381300BD531100C473
+1100CC960F00CBC71200BEFF0F00BEFF0E00BEFF0E00BFFF0E00BFFF0E00BF
+FF0E00BFFF0E00BFFF0E00BFFF0E854C0000764F00006B500000625200005B
+53000056560000525800004C5E000047660000417100003A7B000033840000
+2B8E00002399000219A400070DAE000E01BC021300CC0F1000DA200E00E832
+0C00EE4D0900F16B0802F7890502FDAE060AFAFF0008F1FF0108F2FF0108F2
+FF0108F2FF0108F2FF0108F2FF0108F2FF0108F2FF01745100006853000060
+55000059570000545A00004F5D00004B6000004667000040710000397C0000
+328600002A910000239C00001CA9000015B700000EC7000204D9000900ED0D
+0A00FC1F0800FF300502FF4D0000FF640000FF780001FF960000FFB10000FF
+B20000FFB20000FFB20000FFB20000FFB20000FFB20000FFB20000FFB20066
+5500005D580000575B0000525E00004D61000049640000456700003F6E0000
+39780000318100002A8B0000239500001BA0000014AC00000EB9000007C700
+0400DB050700EF140500FC250400FF340000FF4F0000FF670000FF7B0000FF
+940000FFAC0000FFB20000FFB20000FFB20000FFB20000FFB20000FFB20000
+FFB20000FFB2005B5A0000555C0000506000004B6300004666000042690000
+3E6C000038730000317C00002A850000228E00001B98000014A300000DAD00
+0006BA000200C8010500E00B0200EE1A0100FC290000FF380000FF570000FF
+6B0000FF7C0000FF930000FFA60000FFB20000FFB20000FFB20000FFB20000
+FFB20000FFB20000FFB20000FFB200535D00004E6100004964000044680000
+3F6B00003B6E00003770000031760000297F0000228800001B920000139B00
+000CA4000004AE000300BA010300CB050100E00E0000ED1B0000FB290000FF
+360000FF550000FF6A0000FF790000FF8E0000FFA10000FFB20000FFB20000
+FFB20000FFB20000FFB20000FFB20000FFB20000FFB2004C62000047660000
+416A00003C6D000038700000337200002F74000029790000228200001B8B00
+00139400000E9C00000AA4000003AD000300BA010400CA040100DF0D0000ED
+1B0000FA280000FF340000FF540000FF690000FF760000FF8A0000FF9E0000
+FFAF0000FFB20000FFB20000FFB20000FFB20000FFB20000FFB20000FFB200
+446700003F6B00003A6E000034710000307300002B75000028770000227C00
+001C840000188C0000139400000E9B00000AA4000004AD000300B9010400C9
+040100DE0D0000EC1A0000FA270000FF330000FF520000FF660000FF730000
+FF860000FF9C0000FFAA0000FFB20000FFB20000FFB20000FFB20000FFB200
+00FFB20000FFB2003C6D000037700000317300002C75000028770000247800
+0023790000217D00001D840000188B0000139300000F9B00000AA4000004AD
+000300B9010400C8040100DE0C0000EB190000F9260000FF320000FF4F0000
+FF640000FF710000FF830000FF990000FFA30000FFB20000FFB20000FFB200
+00FFB20000FFB20000FFB20000FFB200>
+<8A0F00008A0F00008A1000008B1000008B1100008B1100008C1100008C1100
+008D0F00008C0900068701021289000C118A0017108C00220F9000300E9400
+430D9600580C96006D0C9800820A980098089600AF069500CB029501F60093
+00FF009300FF009300FF009300FF009300FF009300FF009300FF009300FF00
+9300FF009300FF008A0F00008B1000008B1000008B1100008C1100008C1200
+008C1200008D1200008E1000008D0A00068802021289000B128B0016118D00
+211091002F0F9500420E9600570E97006C0D9800810C9900970A9700AF0796
+00CB039501F5019301FF009301FF009301FF009401FF009401FF009401FF00
+9401FF009401FF009401FF009401FF008B1000008B1000008B1100008C1200
+008C1200008C1200008D1300008D1300008E1000008D0C0005890302128900
+0A148B0015128D00211191002E10950041109700560F97006B0E9900800D9A
+00970B9800B0089700CB049601F4029401FF009401FF009401FF009401FF00
+9401FF009401FF009401FF009401FF009401FF009401FF008B1100008C1100
+008C1200008C1200008D1300008D1300008D1400008E1400008F1100008E0D
+00048A0401128A0009158C0014148E00201292002D11960040119800551098
+00690F99007F0E9B00960C9A00B0099800CB069600F3029501FF009501FF00
+9501FF009501FF009501FF009501FF009501FF009501FF009501FF009501FF
+008C1200008C1200008D1300008D1300008D1400008D1400008E1400008E14
+0000901200008F0E00038C0500128A0007168D0013158F001F1493002C1297
+003E1299005412990068119A007D109C00950E9B00AF0B9900CC079700F203
+9501FF009501FF009501FF009501FF009501FF009501FF009501FF009501FF
+009501FF009501FF008C1200008D1300008D1400008D1400008E1500008E15
+00008E1500008F15000090130000911000028D0600118A0006188D00121690
+001E1594002B1498003D149A0052139A0067129B007C129C0093109C00AE0C
+9A00CC089800F2059602FF009602FF009602FF009602FF009602FF009602FF
+009602FF009602FF009602FF009602FF008D1300008D1400008E1500008E15
+00008E1600008E1600008F1600008F17000091140000921200018F0800108B
+0004198E00101890001C179400291598003B159B0050159B0065149C007A13
+9D0092119D00AE0E9B00CC0A9800F3079703FF009704FF009704FF009704FF
+009704FF009704FF009704FF009704FF009704FF009704FF008E1400008E15
+00008E1600008E1600008F1700008F1700008F180000901800009216000093
+130001910B000E8B00021B8E000E1A91001B1895002817990039179C004E17
+9C0063169D0078159E0090139F00AD109D00CC0C9900F4089805FF009805FF
+009805FF009805FF009805FF009805FF009805FF009805FF009805FF009805
+FF008E1600008F1600008F1700008F1700008F180000901800009019000090
+1900009317000094150000930D000D8C02011C8F000C1C9100191A95002619
+9A0037199D004C199D0061189D0076179F008D15A000AB129E00CC0E9B00F5
+0A9906FF009906FF009906FF009906FF009906FF009906FF009906FF009906
+FF009906FF009906FF008F1700008F1800008F180000901900009019000090
+190000901A0000911A000093190000951700009510000B8F04001B8F00091E
+9200171D9600241B9B00341A9E00491B9F005F1A9F007419A0008B18A200A9
+159F00CC109D04F4099A08FF009A08FF009A08FF009A08FF009A08FF009909
+FF009909FF009909FF009909FF009909FF0090180000901900009019000090
+1A0000911A0000911B0000911B0000921B0000941A00009618000097130009
+930800198F0006219300141F9600221D9C00311C9F00461DA0005C1DA00071
+1BA000881AA200A6189A00C6169000EC139212FF009114FF009015FF008F16
+FF008F16FF008E17FF008E17FF008E17FF008E17FF008E17FF00901A000091
+1A0000911B0000911B0000911C0000921C0000921D0000921D0000951C0000
+971A000099160007960C0017910204229300112296001F209C002E1FA00042
+209F00582095006A228D007D23890094248500B1237800CF20881EFF02861F
+FF03851FFF038520FF038420FF038420FF038420FF038420FF038420FF0384
+20FF03911B0000911C0000921C0000921D0000921D0000921E0000921E0000
+931F0000961E0000981D00009B1900059A1000149304012394000D2597001C
+23960029248E00382886004A2C7B005C2C72006E2C6C00842D65009D2D5E00
+C12B5A01FD275801FD295701FD2A5602FD2A5503FD2A5503FD2A5503FD2A55
+03FD2A5503FD2A5503FD2A921D0000921D0000921E0000921F0000931F0000
+93200000932000009420000096200000991F00009C1C00039E140012970800
+228F00072B8400123179001E3570002A396700383B5F004A3D57005F3E5200
+773E4D00903C4800AF375010FF2A4E11FF2A4D11FF2A4C11FF2B4C12FF2B4B
+12FF2B4B12FF2B4B12FF2B4B12FF2B4B12FF2B921F0000931F000093200000
+9320000093210000932100009422000094220000972200009A2100009D2000
+01A119000F9112001F7A09003064020541580011474E001D4B46002B4E3E00
+3C5037005252320068503000814D2C00A248350EFD39320EFF3A2E0BFF3E2B
+09FF402807FF432706FF442706FF442706FF442706FF442706FF4493210000
+93210000932200009422000094230000942300009424000094240000972400
+009B2400009A2400019223000E841F001C6D18002D510E0043370102582A00
+0F5C22001D5D1A002D5F14003F5F1200535D11006B5B11008A5A0A00EA5608
+00FA540600FB550500FB550400FB550300FC550300FC550300FC550300FC55
+0300FC55942300009423000094240000942500009425000095260000952600
+009527000099270000952B00008D2F0003842D000F762A001B6025002B451D
+00402A1300550C0400660205116900092267000B3463000D4A600010685F00
+138F5B0015CD520015E14F0016E14E0017E04D0018E04D0018E04D0018E04D
+0018E04D0018E04D0018E04D94250000952600009527000095270000962800
+009629000096290000972A0000903000008937000081390007763600126734
+001D5230002A3B2A003B2222004E0616015D0018115D001D225A0020345800
+234F5700297054002C934C002BC844002AE742002BE741002BE740002CE740
+002CE740002CE740002CE740002CE740002CE7409628000096290000962A00
+00972B0000972B0000982C0000962E00008C330000853B00007E400000743F
+000B693E00155A3D001E473B0027313700321C30004602250254002A125100
+31234F0038384F003C534E003E6E480040903F003FC138003EEB35003FEB34
+0040EA340040EA330041EA330041EA330041EA330041EA330041EA33972B00
+00982D0000982D0000992E0000992F0000953200008B380000823D00007942
+0000704400056745000C5D4600145047001B3F4700222A44002C153D003E01
+36044B003E15470048274600503D430051554100526E3D00538D370053BB2F
+0054F22B0055F32B0055F32B0056F32B0056F32A0056F32A0056F32A0056F3
+2A0056F32A993000009A3100009A3200009B33000095360000893D00007F40
+0000754300006D460000654800065C4B000A544F000F485100163851001E24
+5000280F4B0038004A07410055193D005E2B3800623E350064553100656D30
+00678C2D0069BC270069FF250069FF24006AFF24006AFF24006AFF24006AFF
+24006AFF24006AFF24006AFF249C3500009C3600009D370000953C00008741
+00007B440000724500006A460000624A00015B4E0003545300054C57000A41
+5A0012315C001A1E5C002409590032005F0B3400691B2D006F2B2C00733E29
+00775626007A6E25007A8D23007CC01F0079FE1D0079FE1D0079FE1D007AFE
+1C007AFE1C007AFE1C007AFE1C007AFE1C007AFE1C9E3A00009F3C00009440
+000085440000784600006E47000066480000604A0000594E0000525400004C
+5B0001446000073A64000F2A670016186900200469012B00720C28007B1A23
+0080292200833F1F0089561E008D701D008E911C008DC11A0088FF150088FF
+150089FF150089FF150089FF140089FF140089FF140089FF140089FF14A03F
+00009443000082470000754900006B4A0000634B00005D4C0000584E000051
+5400004B5B0000456300003D690005326F000B247300121276001B01790024
+00850B1F008E181C0093271900953C16009A5415009E6F1500A3911500A1BC
+150099FB0F0099FF0F0099FF0F0099FF0E0099FF0E0099FF0E0099FF0E0099
+FF0E0099FF0E93460000804A0000724B0000684C0000604E00005A50000054
+510000505300004A5A0000446300003D6B0000367300022B7A00081E80000E
+0E840016038C011A00980A1700A2161400A9241100AB370E00AE4E0D00B26A
+0C00BB8C0B00BCB30D00B1EC0A00AEFC0900AEFC0900AEFC0900AEFC0900AE
+FC0900AEFC0900AEFC0900AEFC097E4C0000704D0000654F00005D51000057
+530000525500004D580000495A0000436300003C6C0000367500002E7E0000
+258600031B8F00060F97000D03A0001200AD070F00BB120C00C4200900CA32
+0700CB490400D3650300DA840300DFA20303E9F30102D3FA0202D3FA0202D3
+FA0202D3F90202D3F90202D3F90202D3F90202D3F9026D500000635200005A
+540000545700004F5A00004A5D000046600000426300003C6D000035770000
+2D800000268A00001E95000017A0000010AC000107B9000601C9020800E00D
+0600F01D0400FD2D0200FF3F0000FF5F0000FF730000FF8B0000FFA70000FF
+B20000FFB20000FFB20000FFB20000FFB20000FFB20000FFB20000FFB20060
+55000058580000525B00004D5F000048630000446700003F6B00003C6D0000
+357700002D800000268900001E930000179D000010A700000AB2000002BF00
+0400D3050300E7130100F5220000FF300000FF4C0000FF630000FF730000FF
+8A0000FFA20000FFB20000FFB20000FFB20000FFB20000FFB20000FFB20000
+FFB20000FFB200565C0000505F00004B63000046660000416A00003C6D0000
+386F0000347100002D7A0000258300001E8C0000179600000F9E000008A800
+0101B2000400C0020200D4080000E6130000F4220000FF2F0000FF480000FF
+610000FF710000FF870000FF9F0000FFB20000FFB20000FFB20000FFB20000
+FFB20000FFB20000FFB20000FFB2004F60000049640000436800003E6C0000
+396F000035710000307300002C750000257D00001E860000168F0000119700
+000D9F000007A7000101B2000400BF020200D3070100E6130000F3210000FF
+2E0000FF450000FF5F0000FF6F0000FF830000FF9C0000FFB00000FFB20000
+FFB20000FFB20000FFB20000FFB20000FFB20000FFB20047660000416A0000
+3B6D000036700000317300002C75000028770000257800001F8000001B8700
+00168F0000119700000D9F000008A7000101B1000400BF020300D2070100E5
+120000F2200000FF2D0000FF420000FF5D0000FF6E0000FF800000FF9A0000
+FFAA0000FFB20000FFB20000FFB20000FFB20000FFB20000FFB20000FFB200
+3E6B0000396F0000337200002E750000297700002578000023790000237900
+001F7F00001B870000168E0000129600000D9E000008A7000102B1000400BE
+020300D1060100E4120000F11F0000FE2C0000FF3F0000FF5B0000FF6C0000
+FF7D0000FF930000FFA30000FFB20000FFB20000FFB20000FFB20000FFB200
+00FFB20000FFB20036700000307300002A7600002578000023790000237900
+0023790000237900001F7F00001B870000178E0000129600000D9E000008A7
+000002B1000400BE020300D0060100E3110000F01E0000FD2B0000FF3C0000
+FF590000FF6B0000FF7A0000FF8D0000FF9F0000FFAF0000FFB20000FFB200
+00FFB20000FFB20000FFB20000FFB200>
+<8409000084090000850A0000860A0000860B0000860B0000870C0000870C00
+00870B0000850600038200040B84000C0A850016098600200889002D078E00
+3E05900052049000670391007C01920090019000A4018F00BC009000E2008F
+00FF008F00FF008F00FF008F00FF008F00FF008F00FF008F00FF008F00FF00
+8F00FF008F00FF00850A0000850A0000860B0000860B0000870C0000870C00
+00880C0000880D0000880B0000860700028300030C84000C0B8600150A8700
+200989002C088F003D06900051059100660492007B0392008F029100A40190
+00BB009000E0008F00FF008F00FF008F00FF008F00FF008F00FF008F00FF00
+8F00FF008F00FF008F00FF008F00FF00850A0000860B0000870B0000870C00
+00880C0000880D0000890D0000890E0000890C0000870800028401020C8500
+0B0C8600140B87001F0A8A002B098F003C07910050069200650693007A0493
+008F039200A3029100BB019100DF009000FF009000FF009000FF009000FF00
+9000FF009000FF009000FF009000FF009000FF009000FF00860B0000870C00
+00870C0000880D0000890D0000890E0000890E00008A0E00008A0D00008909
+00028501010D86000A0D8700130C88001E0C8B002A0B8F003B0992004F0793
+0064079400790694008E049300A3039200BA019200DD009000FF009000FF00
+9100FF009100FF009100FF009100FF009100FF009100FF009100FF009100FF
+00870C0000880D0000880D0000890E0000890E00008A0F00008A0F00008A0F
+00008B0E00008A0B00018602010D8600080F8800120E89001D0D8C00290C90
+003A0A93004E09930063089500780796008D059500A3039300BA019200DC00
+9100FF009100FF009100FF009100FF009100FF009100FF009100FF009100FF
+009100FF009100FF00880D0000890E0000890E00008A0F00008A0F00008A10
+00008B1000008B1000008C0F00008B0C00018703000D870007108900110F8A
+001C0E8D00280D9100390C94004D0B9500620A9600760997008C079600A205
+9400BA029300DB009200FF009200FF009200FF009200FF009200FF009200FF
+009200FF009200FF009200FF009200FF00890E00008A0F00008A0F00008B10
+00008B1000008B1100008B1100008C1100008D1000008D0E00008905000C87
+000612890010118B001B108E00270F9200370E95004B0D9600600C9600750B
+98008B099700A2079500BA049400DB019300FF009300FF009300FF009300FF
+009300FF009300FF009300FF009300FF009300FF009300FF008A0F00008B10
+00008B1000008B1100008C1100008C1200008C1200008D1300008D1200008E
+0F00008C08000B880004148A000E138C0019128E0026109300350F9600490F
+97005E0E9800730D9900890C9900A1099700BB069600DB039401FF009401FF
+009401FF009401FF009401FF009401FF009401FF009401FF009401FF009401
+FF008B1000008B1100008C1200008C1200008D1300008D1300008D1400008D
+1400008E1300008F1100008E0A0009890102158B000C158D0018138F002412
+940033119700471198005D109900710F9A00870E9B00A00B9900BB089700DB
+049501FF009501FF009501FF009501FF009501FF009501FF009501FF009501
+FF009501FF009501FF008C1200008C1200008D1300008D1400008D1400008E
+1400008E1500008E1500008F15000090120000900D00078B0301158B000A17
+8E0016159100231495003113990045139A005A139A006F129B0085119C009E
+0E9B00BB0A9900DC069602FF009502FF009303FF009204FF009105FF009006
+FF009006FF009006FF009006FF009006FF008D1300008D1400008E1400008E
+1500008E1600008E1600008F1600008F1700009016000092140000920F0005
+8D0500148C0008198F0014189100201796002F159A0042169B0058159B006C
+149C008213990099149300B5138B00D4108A0CFF028A0FFF008810FF008710
+FF018711FF018611FF028611FF028611FF028611FF028611FF028E1500008E
+1500008E1600008F1700008F1700008F1800008F1800009018000091180000
+9316000094120003910900138D00051C8F00111B92001E1997002C189B003F
+189600531B8D00641D8500751E81008A1F7F00A41F7400C01C6C00F4167812
+FF0C720DFF106E09FF126A07FF146804FF166704FF166704FF166704FF1667
+04FF168F1700008F1700008F180000901800009019000090190000901A0000
+901A0000921A00009418000096150002940C00108D01011E90000E1E93001B
+1C8D00261E850034237D004526730056256C00682667007C27610094285B00
+B3275600E8245300F9245200F8265100F9265001F9274F01F9274F01F9274F
+01F9274F01F9274F01F927901800009019000090190000901A0000911A0000
+911B0000911B0000911C0000931C0000951A0000971800019711000E910400
+1E870007257C00112A72001C2E680027316000333359004436520059374E00
+6F374B0088364600A7324200E9324609FF2B450BFF2A450CFF2A440CFF2A44
+0DFF2A440DFF2A440DFF2A440DFF2A440DFF2A911A0000911B0000911B0000
+911C0000921C0000921D0000921D0000921E0000941E0000961D0000981B00
+009716000C8810001B7107002C5E0105395200103F49001B43410028463B00
+384934004C4B2F00624A2D0079472A0095432800D5412E0BFC362A08FB3A27
+06FA3D2404F93F2203F9412203F9412203F9412203F9412203F941921C0000
+921D0000921D0000921E0000921E0000931F0000931F000093200000942000
+00971F0000912000018920000B7B1C0019651600294B0C003D3301024F2800
+0E5520001C5718002A5912003B590F004F570F0065560F0080540A00C35307
+00F24E0500F24F0400F24F0300F24F0200F2500200F2500200F2500200F250
+0200F250921E0000931F000093200000932000009321000093210000932200
+0094220000952300008C260000852A00027C29000D6E26001959220028401B
+003B2711004F0B04005F0205106200092161000B325C000D47590010635800
+1384540015B34D0015DC480016DC470017DB470017DB460018DB460018DB46
+0018DB460018DB460018DB4693210000932100009422000094230000942300
+00942400009424000091260000882B000082310000793300066F310011602F
+001C4C2C002736270036202000480515015600171157001B2153001E325100
+2149510026684E00298545002AB03F0029E03C002AE13B002AE13A002BE23A
+002BE23A002BE239002BE239002BE239002BE2399423000094240000942500
+009425000095260000952700008F2A0000852F00007E350000773B00006D39
+000A623800155338001D413700232C33002C192C00400223034D0028134A00
+2E23470035364800394D47003B6742003D8439003CAC33003CE82F003DE82E
+003DE82E003EE82D003EE72D003EE72D003EE72D003EE72D003EE72D952600
+00952700009628000096290000962A00008E2E0000843500007B390000733D
+00006B3F0004623F000D574000134A4200183941001E263F00281238003901
+330544003B153F0044263E004C3B3B004D5039004E6736004F8332004FA92C
+0050EA250050EB250051EC250051ED250052EE240052EE240052EE240052EE
+240052EE24972A0000972B0000982C0000982D00008D330000833A0000783D
+0000703F00006841000060430005584600094E49000D434C0013334C001A21
+4A00240C4500340046083A0051193600592A31005D3C2E0060512A0061682A
+006282290064A9240063FF200064FF200064FF200065FF200065FF1F0065FF
+1F0065FF1F0065FF1F0065FF1F992F0000993000009A3100008D380000813E
+0000754100006C420000654300005E460001574A0001504E0003475300073C
+55000F2C5600171A5600210653002F005A0C2E00641B2900692927006D3B25
+00725221007569200075831F0076A91C0074F4190074FF180074FF180075FF
+180075FF180075FF180075FF180075FF180075FF189B3400009C3600008D3D
+00007E4200007244000069450000614600005B480000554A00004F50000048
+560000405B0004345E000C256100141461001E01620129006C0D2300741A1F
+0079281E007D3B1B0082521900876B18008785180088AC160084EC120084FF
+100084FF100084FF100085FF100085FF100085FF100085FF100085FF109E3A
+00008B4100007C4500006F470000664800005E490000584B0000534D00004E
+50000047570000405E0000386400032D68000A1E6C00110E6E001A00730320
+007E0D1B00861917008B2715008E391200924F100095681000998510009CAC
+100096E10C0093FF0A0094FF0A0094FF0A0094FF0A0094FF0A0094FF0A0094
+FF0A0094FF0A8A450000794800006C490000634B00005B4C0000554E000050
+5000004B530000465700003F5E000039660000306D0002257200071877000E
+097C001500840317008F0D130099170F009E250C00A0350900A24A0700A664
+0700AC830600B0A30500A9D00500A5FB0500A5FB0400A5FB0400A5FB0400A5
+FB0400A5FB0400A5FB0400A5FB04764A0000694C0000604E00005850000052
+5200004D55000048580000445B00003F5F000038670000306F000029770000
+1F7E00041385000A078C000F0095030F00A20B0B00AD150700B5220500B731
+0200B7460000C0600000C67F0000CA990000C8C80000BDF20000BDF20000BE
+F20000BEF30000BEF30000BEF30000BEF30000BEF300674F00005D51000056
+530000505600004A5A0000455D0000416100003D6400003869000030710000
+297A0000218300001A8C000010950003069C000800A8020800B9080400C912
+0100D51F0000E52D0000FC3F0000F55B0000F7710000F88A0000FBAA0000F2
+DC0000F3DA0000F3D80000F4D60000F4D60000F4D60000F4D60000F4D6005B
+540000535800004D5C000048600000436400003E680000396B0000356E0000
+30730000297D0000228700001A900000139900000BA2000004AB000300B801
+0400C7040100DE0C0000EC1A0000FB280000FF360000FF570000FF6C0000FF
+7F0000FF9C0000FFB20000FFB20000FFB20000FFB20000FFB20000FFB20000
+FFB20000FFB200515D00004B62000045670000406A00003B6E000036700000
+327300002E75000029780000218100001A8A0000149200000F9A00000BA200
+0005AB000200B7010400C7040100DD0C0000EB190000FA270000FF340000FF
+550000FF6B0000FF7D0000FF990000FFAE0000FFB20000FFB20000FFB20000
+FFB20000FFB20000FFB20000FFB20049640000436800003D6C0000386F0000
+337200002E7400002A76000026780000227B00001E820000198A0000159200
+00109A00000BA2000005AB000200B7000400C6030200DC0B0000EB190000F9
+260000FF330000FF530000FF690000FF790000FF930000FFA80000FFB20000
+FFB20000FFB20000FFB20000FFB20000FFB20000FFB200416A00003B6E0000
+357100002F7400002A760000267800002379000023790000227B00001E8200
+00198A000015910000109900000BA2000005AB000201B6000400C5030200DB
+0B0000EA180000F8260000FF320000FF510000FF670000FF760000FF8D0000
+FFA20000FFB20000FFB20000FFB20000FFB20000FFB20000FFB20000FFB200
+386F0000327300002C75000027770000237900002379000023790000237900
+00227A00001E8200001989000015910000109900000BA1000005AA000201B6
+000400C4030200D90A0000E9170000F7250000FF310000FF4F0000FF650000
+FF730000FF880000FF9E0000FFB20000FFB20000FFB20000FFB20000FFB200
+00FFB20000FFB2002F74000029770000237800002379000023790000237900
+002379000023790000227A00001E8200001989000015910000109900000BA1
+000006AA000201B5000400C3030200D80A0000E9160000F6240000FF300000
+FF4C0000FF620000FF700000FF840000FF9C0000FFAB0000FFB20000FFB200
+00FFB20000FFB20000FFB20000FFB200>
+<7A0400007B0400007C0400007C0500007D0500007E0600007F0600007F0600
+00800700007D0300007C0005047E000C037F00150380001E02810029028600
+390089004C008A0061008B0075008C0089008B009B008A00B0008A00D0008A
+00FF008900FF008900FF008900FF008900FF008900FF008900FF008900FF00
+8900FF008900FF007B0400007C0500007D0500007E0600007E0600007F0600
+008007000081070000810700007E0400007D0004057F000C04800014038100
+1D0382002902870038008A004B008B0060008C0074008D0088008C009A008B
+00B0008B00CF008B00FF008A00FF008A00FF008A00FF008A00FF008A00FF00
+8A00FF008A00FF008A00FF008A00FF007C0500007D0500007E0600007F0600
+008007000081070000810800008208000083080000800500007D0003068000
+0B058100130481001D0483002803880037018B004A018B005F018D0074008E
+0087008D009A008C00AF008C00CE008C00FF008B00FF008B00FF008B00FF00
+8B00FF008B00FF008B00FF008B00FF008B00FF008B00FF007E0600007F0600
+00800700008107000082080000820800008308000084090000840900008106
+00007E00020781000A068200130582001C0584002704880036028C0049018C
+005E018E0073018E0087008E0099008D00AF008D00CE008D00FF008C00FF00
+8C00FF008C00FF008C00FF008C00FF008C00FF008C00FF008C00FF008C00FF
+0080070000810700008208000082080000830900008409000084090000850A
+0000850A0000830700007F000108810009088200120783001B068500260689
+0035038D0048028E005D028F0072018F0086008F0099008E00AE008E00CD00
+8E00FF008D00FF008D00FF008D00FF008D00FF008D00FF008D00FF008D00FF
+008D00FF008D00FF0081080000820800008309000084090000850A0000850A
+0000860A0000860B0000860B00008508000081010009820008098300110884
+001A08860025078A0034058E0046038F005C02900070019100850090009800
+8F00AE008F00CC008F00FF008E00FF008E00FF008E00FF008E00FF008E00FF
+008E00FF008E00FF008E00FF008E00FF008309000084090000850A0000850A
+0000860B0000860B0000870C0000870C0000880C0000870A00008303000883
+00060B8400100A85001909870024088B0033078F00450490005A0491006F03
+92008401910098019000AD019000CA009000FF008F00FF008F00FF008F00FF
+008F00FF008F00FF008F00FF008F00FF008F00FF008F00FF00850A0000860A
+0000860B0000870B0000870C0000880C0000880D0000890D0000890E000089
+0B0000860500078400050D85000E0C8600180B8800230A8C00310990004306
+9100590692006D0593008204930097039100AD029100C9009100FE009000FF
+009000FF009000FF009000FF009000FF009000FF009000FF009000FF009000
+FF00860B0000870C0000880C0000880D0000890D0000890E0000890E00008A
+0F00008A0F00008A0D0000880700058500030E86000C0E8800170D8900220C
+8D002F0B910042099300570893006C0795008106950096049300AC029200C7
+009200FA009100FF009100FF009100FF009100FF009100FF009100FF009100
+FF009100FF009100FF00880D0000890D0000890E00008A0E00008A0F00008A
+0F00008A1000008B1000008B1000008C0E00008A0A00048702020F87000B10
+8900150F8B00200E8E002E0D9200400B9400550A95006A0A96007F08960095
+069500AC049400C7019100F4008D00FF008B01FF008A01FF008902FF008902
+FF008803FF008803FF008803FF008803FF00890E00008A0F00008A0F00008B
+1000008B1000008B1100008C1100008C1200008C1200008D1000008D0C0003
+89030110880008128A0013118C001F108F002C0F94003D0E9600530D960067
+0C93007A0E8E008E0F8A00A50F8300BF0C7E00E609810AFF01800AFF017E0A
+FF027D0AFF037C0AFF037C0AFF037C0AFF037C0AFF037C0AFF038B1000008B
+1000008B1100008C1100008C1200008C1200008D1300008D1300008D140000
+8F1200008F0F00018B06000F890006158B0011148D001D139100291193003A
+128C004C1684005E177D006F18790081197600981A6F00B2186800DB136A05
+FE0F6703FE116402FD126201FD136100FD136000FC146000FC146000FC1460
+00FC148C1200008C1200008D1300008D1300008D1400008D1400008E150000
+8E1500008E16000090140000911100008F09000C890003188D000E168C001A
+16840024197C002F1D74003F206C004F1F65006120610075225D008B235700
+A7225300D0215000F5204E00F4214D00F4224C00F5224B00F5234B00F5234B
+00F5234B00F5234B00F5238D1300008D1400008E1500008E1500008E160000
+8F1600008F1700008F1700008F1800009116000092140000920D000A8C0301
+187E000720740010246A001A286100232B59002E2C52003D2E4D0052304900
+68314700803044009E2E3F00C82D3F04FD2A3E05FD2A3D05FD2A3C06FE2A3C
+06FE2A3C06FE2A3C06FE2A3C06FE2A3C06FE2A8E1500008E1600008F170000
+8F1700008F180000901800009019000090190000901A000092190000941700
+008E1400087F0E001769060028580005324D000F384300193C3C00253F3600
+34412F0047432B005C432900714127008B3E2400B33C2807F6342504F33722
+03F1392002EF3B1E01EE3C1D00ED3D1D00ED3D1D00ED3D1D00ED3D8F180000
+901800009019000090190000901A0000911A0000911B0000911B0000911C00
+00931B00008A1D0000801C0009731900165E130025460A0036300102472500
+0D4D1E001A5016002852100038530C004A510B005F4F0B00774E0800AA5106
+00E8470400E7480300E6480200E5480201E4480202E3480202E3480202E348
+0202E348901A0000911A0000911B0000911C0000921C0000921D0000921D00
+00921E00008D1F0000852200007E2600017425000C66230018521F00253C18
+0035251000490A04005801050F5B0009205A000B3055000D435200105D5000
+137B4C0015A0460014D8410015D8400016D83F0017D83F0017D93E0018D93E
+0018D93E0018D93E0018D93E921C0000921D0000921D0000921E0000931F00
+00931F0000932000008B230000822700007B2C0000732E0005682D0010592B
+001B46280023322400301D1D0042041301500016114F001A214C001D314A00
+2045490024604700277B3E00299F390027E1360028E2350029E2340029E234
+002AE233002AE233002AE233002AE233002AE233931F000093200000932000
+00932100009322000094220000882600007F2C000078300000703500006734
+000A5B3300144D33001A3C32001F292F00281729003A012103460026134200
+2B234000313440003649400037603B00387A3300399C2E0039DE29003AE729
+003BE728003BE628003BE627003CE627003CE627003CE627003CE627932200
+0094230000942300009424000094250000872B00007E300000753500006D38
+0000653A00035C3A000C513C0012453D0015353D001A233A00231034003400
+30063D00381639004026360047383300494B31004A612F004B7A2C004B9B28
+004CD020004DE41F004DE51F004EE61F004EE61E004EE71E004EE71E004EE7
+1E004EE71E94250000952600009527000093280000862F00007C360000723A
+00006A3C0000633D00005B3F0003534200074A45000A3F47000F2E4700161D
+4500210A3F002F00420933004C192F0053282B00583928005C4D23005D6323
+005E7A24005E9A22005FD81B0260FF190260FF190260FF190161FF190161FF
+190161FF190161FF190161FF1996290000972A0000932D0000853500007A3B
+00006F3D0000663F00005F41000059420000534600004C4A0000444F000338
+50000B28510014174F001E044D012B00550D29005E1B240063282300673820
+006C4E1B0070651B00707C1A00709A180070D2140070FD130070FD130070FD
+130071FD130071FD130071FD130071FD130071FD13982E000094320000853B
+0000773F00006C410000634200005C44000056450000514700004B4C000044
+5100003C57000130590009215A0012105B001C005C032400660F1F006E1B1B
+0073271A00763817007C4D140081661300827D1200829C110081CF0E0080FF
+0C0080FF0B0080FF0B0080FF0B0081FF0B0081FF0B0081FF0B0081FF0B9537
+0000833F000075420000694400006046000059470000534900004E4B00004A
+4D0000435200003C590000345E0001286200081A65001009670019006C051B
+00770F16007F1A13008427100087370D008A4A0B008E620A00917C0900969C
+0A0092CA08008FFF05008FFF050090FF040090FF040090FF040090FF040090
+FF040090FF048243000072460000664700005D490000564B0000504D00004B
+50000046520000425400003B5A0000346100002B670001206C00071370000E
+04740015007D061300880F0E0090190A009625070098340400994602009C5E
+0100A27B0100A7980000A3BF01009EFD01009EFD01009EFD01009EFD00009E
+FD00009EFD00009EFD00009EFD0070490000634A00005A4C0000534F00004D
+51000048540000435700003E5A00003A5D0000336300002B6A000024710000
+197700050D7C000B0183000F008D070B00980E0600A2170200A8230000AA31
+0000AB430000B15B0000B7780000BC930000BAB60000AEF50000AEF80000AE
+F80000AEF80000AEF80000AEF80000AEF80000AEF800614D00005850000051
+5300004A560000455A0000405D00003B60000036630000326600002C6C0000
+247400001C7C000013830003088B000700920109009C060600A80A0300B411
+0100BF1B0000C6290000CA3A0000D2520000D86C0000DC870000E0A50000D9
+F30000D1F70000D1F70000D1F70000D2F80000D2F80000D2F80000D2F80055
+5400004E580000485C0000426000003D64000038680000336B00002E6E0000
+2B700000247700001D80000017880000129100000D99000007A1000201AC00
+0500BB030300CE070100E3120000F2200000FF2E0000FF480000FF630000FF
+740000FF8F0000FFAB0000FFB20000FFB20000FFB20000FFB20000FFB20000
+FFB20000FFB2004C5D000046620000406700003A6C00003570000030740000
+2B7600002777000023780000207E00001C850000178D0000139500000E9D00
+0009A5000002AF000400BC010300CF060100E3110000F11F0000FF2D0000FF
+440000FF600000FF720000FF8A0000FFA40000FFB20000FFB20000FFB20000
+FFB20000FFB20000FFB20000FFB200446800003D6C00003770000031730000
+2C75000027770000237900002379000023790000207D00001C850000178D00
+00139500000E9C000009A5000003AF000300BC010300CE050100E2100000F0
+1E0000FE2C0000FF410000FF5E0000FF6F0000FF860000FF9F0000FFB20000
+FFB20000FFB20000FFB20000FFB20000FFB20000FFB2003B6E000034710000
+2E740000287700002378000023790000237900002379000023790000207D00
+001C850000188C0000139400000E9C000009A5000003AF000300BB010300CD
+050100E2100000EF1E0000FD2B0000FF3D0000FF5C0000FF6E0000FF820000
+FF9D0000FFB20000FFB20000FFB20000FFB20000FFB20000FFB20000FFB200
+317300002B7600002578000023790000237900002379000023790000237900
+0023790000217D00001C850000188C0000139400000E9C00000AA5000003AE
+000300BB010300CC050100E10F0000EE1D0000FC2A0000FF3A0000FF590000
+FF6C0000FF7E0000FF9A0000FFAC0000FFB20000FFB20000FFB20000FFB200
+00FFB20000FFB2002877000023790000237900002379000023790000237900
+00237900002379000023790000217D00001C840000188C0000139400000E9C
+00000AA4000003AE000300BA010300CB050100E00E0000ED1C0000FB290000
+FF370000FF560000FF6B0000FF7B0000FF920000FFA50000FFB20000FFB200
+00FFB20000FFB20000FFB20000FFB200>
+<72000000720000007300000073000000740100007501000075010000760100
+0076020000760100007600050177000C007800140079001C007A0026007E00
+3400820045008200590083006C0085007F00850091008400A4008400BD0084
+00F1008300FF008300FF008300FF008300FF008300FF008300FF008300FF00
+8300FF008300FF007300000073000000740000007501000075010000760200
+00760200007702000078020000770100007700040179000B00790013007A00
+1B007B0026007E003300830045008300590084006C0086007F008600910085
+00A4008400BD008500F0008400FF008400FF008400FF008400FF008400FF00
+8400FF008400FF008400FF008400FF00740000007401000075010000760200
+00770200007702000078030000780300007903000078020000780004017A00
+0B007B0012007B001B007C0025007F003200840044008500580085006B0087
+007F00870091008600A4008500BD008600ED008500FF008500FF008500FF00
+8500FF008500FF008500FF008500FF008500FF008500FF0075010000760100
+0077020000770200007803000079030000790300007A0400007A0400007A03
+0000790003027B000A017C0012007C001A017D002401800031008500430086
+00570087006B0088007E00880091008700A4008600BD008700ED008600FF00
+8600FF008600FF008600FF008600FF008600FF008600FF008600FF008600FF
+00770200007702000078030000790300007A0300007A0400007B0400007B04
+00007C0500007B040000790002037C0009027D0011017D0019017E00230181
+003000860042008700560088006A0089007E00890091008800A4008800BC00
+8900EB008700FF008700FF008700FF008700FF008700FF008700FF008700FF
+008700FF008700FF0078030000790300007A0400007B0400007B0400007C05
+00007D0500007D0500007E0600007E0500007A0001047D0008037E0010027E
+0019027F00220282002F008700400089005500890069008B007D008B009000
+8A00A4008900BC008A00EB008900FF008900FF008900FF008900FF008900FF
+008900FF008900FF008900FF008900FF007A0400007B0400007C0500007D05
+00007D0500007E0600007F0600008007000080070000800600007C0101047D
+0007047F000F03800018038100220283002E0189003F008A0054008B006800
+8C007D008C0090008B00A3008A00BC008B00E9008A00FF008A00FF008A00FF
+008A00FF008A00FF008A00FF008A00FF008A00FF008A00FF007C0500007D05
+00007E0600007F060000800700008007000081070000820800008308000082
+0800007F0300037E00060680000E05810017048200200484002D038A003D01
+8C0052018C0067018D007B008E008F008D00A2008C00BB008C00E6008B00FF
+008B00FF008B00FF008B00FF008B00FF008B00FF008B00FF008B00FF008B00
+FF007E0600007F070000800700008108000082080000830800008409000084
+090000850A000084090000810500027F00040882000C078200150683001F06
+86002B058B003C038D0050028E0065018F007A008F008E008E00A2008D00BA
+008E00E3008C00FF008C00FF008C00FF008D00FF008D00FF008D00FF008D00
+FF008D00FF008D00FF00810700008208000083080000840900008409000085
+0A0000850A0000860B0000860B0000870B0000840700018101030A83000B09
+8400140885001E0787002A078C003A048F004E038F0064029000790091008D
+009000A1008B00B6008800DC008500FF008300FF008100FF008000FF008000
+FF007F00FF007F00FF007F00FF007F00FF008409000085090000850A000086
+0B0000860B0000870C0000870C0000880C0000880D0000880C000087090001
+8301010B8400090B8500120A86001D0A890028098D00380790004C058F0061
+06890072098500840A8000970A7B00AD097700CC067905FF007705FF027505
+FF027405FF037405FF037305FF047305FF047305FF047305FF04860B000086
+0B0000870C0000880C0000880D0000890D0000890E0000890E00008A0F0000
+8A0E00008A0B00008603000B8500060E8700100D88001B0C8A00270B880034
+0D820044107B0056127500671470007A156D008E156800A6136400C8106200
+FD0D6000FD0E5F00FC0F5E00FC0F5D00FC105C00FB105C00FB105C00FB105C
+00FB10880C0000880D0000890E0000890E00008A0F00008A0F00008A100000
+8B1000008B1000008C1000008C0D0000890700098600041188000E10830017
+127A00211572002B186B00381A6400471B5E005A1C5A006E1D5700831E5300
+9D1E4F00BF1D4D00F11B4B00F11C4A00F11D4800F11D4800F11E4700F11E47
+00F11E4700F11E4700F11E8A0E00008A0F00008A1000008B1000008B110000
+8C1100008C1200008C1200008C1200008D1200008E1000008D0A0006830201
+147700071B6D000F1F620018225900212551002A274B00372947004B2B4400
+612B4100782B400093293C00B6283A01F9273902FA273802FB283702FB2836
+02FC283602FD293602FD293602FD293602FD298B1000008B1100008C120000
+8C1200008D1300008D1300008D1400008D1400008E1500008E150000901200
+0085120005760D0014610400235200052B47000E303E001835360023383000
+313B2B00423C2700563C25006A3B230082392100A2372100E8341F00E9351D
+00E7351C00E5361B00E4361A00E4361A00E4361A00E4361A00E4368D130000
+8D1300008D1400008E1500008E1500008E1600008E1600008F1700008F1700
+008B180000821A0000791A00066A17001357110021420900302E01033F2300
+0C461B0019481400264B0E00354C0A00454B08005949080071480600954C05
+00CF420300D8400201D7400201D6400202D6400203D63F0203D63F0203D63F
+0203D63F8E1500008E1600008F1700008F1700008F18000090180000901900
+0090190000881C00007E200000772300006D22000A5F2000154C1C00213816
+002F220E00410903005001040F5300081F52000B2E4E000D404A0010584700
+1372440015923F0014C73A0015D7390016D7380016D7380017D8370017D837
+0017D8370017D8370017D8378F1800009018000090190000901A0000911A00
+00911B0000911B0000851F00007C240000742800006C2A00036129000F5227
+0018412500202E21002B1B1B003B031201490015104700192144001C304200
+1E42410021594000247237002792330027C8310027E02F0027E12E0028E22E
+0028E22E0028E32D0029E32D0029E32D0029E32D911A0000911B0000911C00
+00921C0000921D00008F1E00008223000079280000712C00006A3000006130
+0009552F0013472F0017372E001B272B002415250033011F033F0024133B00
+292338002E32370032453700335A330035712D003690290038C1250037E623
+0038E5230038E4220039E3220039E3210039E2210039E2210039E221921D00
+00921E0000931F0000931F00008C22000080280000772D00006E3100006734
+0000603600025636000B4C38000F4039001231390016203600200E2F002E00
+2D063600351632003C252F0041352C0044472900465C280047722700489024
+0049BA1C0049E31A004AE319004AE419004BE419004BE519004BE519004BE5
+19004BE5199321000093210000942200008B2500007F2D0000753200006C36
+0000643800005D3A0001573C00014F3F0003474200053B43000B2B4200131A
+40001D083A002B003F0B2D00481929004D2726005236230056491E00595E1D
+005A731F005A901E005BBC17005BF815005BF815005CF915005CF914005CF9
+14005DF914005DF914005DF91494240000942500008A2A00007E3200007237
+0000693A0000603C0001593E0000543F00004F41000048460000404A000034
+4C0007244C0011134A001B0247022700510E2300581A1F005C261E0061351B
+00664917006A6015006C7615006C8F14006CB910006BF80E006CF80E006CF7
+0D006CF70D006DF70D006DF70D006DF70D006DF70D962800008A2F00007D37
+0000703C0000663E00005D40000056410000514300004C450000474800003F
+4D0000375200002C5400061D55000F0C5400190057041F00610F1A00681B17
+006C2616007035130075490F007A600D007C760C007D8F0B007DB809007CFE
+06007DFE06007DFE06007DFE05007DFE05007DFE05007DFE05007DFE058B34
+00007C3D00006E3F0000634100005A430000534500004E470000494A000044
+4C00003F4F0000375400002F590000245C0006165E000E0660001700660716
+0071101100791B0E007E270B008134080084460500865C04008A7403008F90
+02008EB702008BFE01008BFF01008CFF00008CFF00008CFF00008CFF00008C
+FF00008CFF00794100006B4300006045000058470000514900004B4C000046
+4F0000405100003C530000375600002E5C0000276100001C6500050E69000C
+016D01120076080E0081110900891B05008E26010090320000924300009359
+0000977100009D8F00009CB1000096EE000096FF000096FF000096FF000096
+FF000096FF000096FF000096FF00694600005D480000554B00004E4E000048
+510000425400003D57000038590000335B00002E5E0000276400001F6A0000
+146F00050774000B007B030B00840808008E0F0500961702009B2000009E2C
+00009F3C0000A2520000A66C0000AD8A0000AEAB0000A5DD0000A3FB0000A3
+FB0000A3FB0000A3FB0000A3FB0000A3FB0000A3FB005B4C0000524F00004B
+520000455600003F5A0000395D0000346000002F6200002B65000027670000
+1F6E000018750000117A0004088000080086000B0090050800990A0500A410
+0200AC190000B3250000B5340000B8490000C0640000C5820000C89D0000C3
+D30000B9F50000B9F50000BAF50000BAF50000BAF50000BAF50000BAF50050
+53000049570000425C00003C60000036640000316700002C6A0000276D0000
+246F0000227000001E770000197F0000148600000E8E000207940005019C01
+0700A8040400B7080200C7100000D41C0000E32A0000FB3B0000F9570000F9
+6F0000FA890000FEAD0000F7CE0000F9CC0000F9CA0000FAC80000FAC70000
+FAC70000FAC700475D00004063000039680000336C00002E6F000029730000
+247500002377000023780000237900001F8000001A88000016900000119800
+000CA0000006A9000101B4000400C2030200D80A0000E9170000F8260000FF
+330000FF540000FF6B0000FF7F0000FF9D0000FFB20000FFB20000FFB20000
+FFB20000FFB20000FFB20000FFB2003E6B000037700000307300002A760000
+2578000023790000237900002379000023790000237900001F8000001A8800
+00168F0000119800000CA0000007A9000101B4000400C2020200D7090000E9
+160000F7250000FF320000FF510000FF690000FF7B0000FF9A0000FFB20000
+FFB20000FFB20000FFB20000FFB20000FFB20000FFB200347100002D750000
+27770000237900002379000023790000237900002379000023790000237900
+001F8000001A870000168F0000119700000C9F000007A8000101B3000400C1
+020200D6090000E8150000F6240000FF310000FF4F0000FF670000FF780000
+FF930000FFAB0000FFB20000FFB20000FFB20000FFB20000FFB20000FFB200
+2A760000247800002379000023790000237900002379000023790000237900
+0023790000237900001F8000001B870000168F0000119700000C9F000007A8
+000101B2000400C0020200D4080000E7140000F5220000FF300000FF4C0000
+FF640000FF740000FF8C0000FFA40000FFB20000FFB20000FFB20000FFB200
+00FFB20000FFB2002379000023790000237900002379000023790000237900
+00237900002379000023790000237900001F8000001B870000168F00001197
+00000D9F000007A7000101B2000400BF020200D3080000E6130000F4210000
+FF2F0000FF480000FF610000FF710000FF860000FF9E0000FFB20000FFB200
+00FFB20000FFB20000FFB20000FFB200>
+<6B0003006B0002006C0002006C0002006D0002006D0001006E0001006E0001
+006E0001006F0001007000050070000B007100130072001B00730024007400
+300078003E007A0051007C0063007D0075007E0087007D0099007C00AD007C
+00CD007C00FB007C00FB007C00FB007C00FB007C00FB007C00FB007C00FB00
+7C00FB007C00FB006C0002006C0002006D0002006D0001006E0001006E0001
+006F0001006F00010070000100700001007100040071000B00720012007300
+1A007400230075002F0079003E007C0050007D0062007E0075007F0088007E
+0099007D00AD007D00CD007D00FD007D00FD007D00FD007D00FD007E00FD00
+7E00FE007E00FE007E00FE007E00FE006D0002006D0001006E0001006E0001
+006F0001006F00010070000100700001007100010071000100720004007200
+0A0073001100740019007500220077002E007B003D007D0050007E00620080
+00750081008800800099007F00AD007F00CD007F00FF007F00FF007F00FF00
+7F00FF007F00FF007F00FF007F00FF007F00FF007F00FF006E0001006E0001
+006F0001007000010070000100710001007100010072000000720000007200
+0000730003007400090074001100750019007600220078002D007C003C007E
+004F007F0062008100740082008800810099008000AD008000CE008000FF00
+8000FF008000FF008000FF008000FF008000FF008000FF008000FF008000FF
+006F0001007000010070000100710001007200000072000000730000007300
+00007300000074000000740002007500090076001000770018007800210079
+002C007D003B0080004E00810061008200740083008800820099008100AD00
+8100CE008100FF008100FF008100FF008100FF008100FF008100FF008100FF
+008100FF008100FF0071000100710001007200000072000000730000007400
+000074010000750100007501000076010000750001017600080077000F0078
+001700790020007A002B007F003A0081004E00820061008300740085008700
+840099008300AD008300CE008200FF008300FF008300FF008300FF008300FF
+008300FF008300FF008300FF008300FF007200000073000000730000007401
+00007501000075010000760200007702000077020000780200007601010178
+00070179000E007A0016007A001F007C002A008000390083004C0084006000
+8500730086008700850099008400AD008500CE008400FF008400FF008400FF
+008400FF008400FF008400FF008400FF008400FF008400FF00740000007501
+0000750100007602000077020000770200007803000079030000790300007A
+03000078010101790006017B000D007B0015007C001E007D00290082003800
+85004B0085005F008700730088008600870099008600AD008600CE008500FF
+008600FF008600FF008600FF008600FF008600FF008600FF008600FF008600
+FF0076010000770200007702000078030000790300007A0300007A0400007B
+0400007B0400007C0500007A0300007A0004027C000C017D0014017D001D01
+7F002801830036008700490087005E008800720089008600890098008800AD
+008800CD008700FF008700FF008600FF008500FF008400FF008400FF008300
+FF008300FF008300FF0078030000790300007A0400007B0400007B0400007C
+0500007D0500007E0600007E0600007F0600007D0400007B0003047E000A03
+7E0013027F001C0280002602840035008900480089005D008A0071008B0085
+00860095008200A8007F00C4007C00FE007A00FF007800FF007700FF007700
+FF007600FF007600FF007600FF007600FF007B0400007B0400007C0500007D
+0500007E0600007F0600008007000081070000810700008208000080060000
+7D0001067F0009058000110481001A0382002503860033018B004601850058
+02800069057C007B0677008D067300A1056F00B9046F01EB026F02FF016E02
+FF016D02FF026C02FF026C02FF026B02FF036B02FF036B02FF037E0600007F
+06000080070000810700008108000082080000830800008409000084090000
+850A0000840800007F020006800007088200100683001906830023067D002E
+0878003D0B72004E0D6C005F0F680072116500861161009B105E00B70D5E00
+ED0A5E02FC095C02FB0A5A01F90B5900F80C5800F80C5700F70D5700F70D57
+00F70D8107000082080000830800008409000085090000850A0000860A0000
+860B0000860B0000870C0000860A0000830500048200050A83000D0A7A0015
+0D71001E1069002713620032165C004017570052185400671A51007C1A4F00
+931A4C00B1194A00E0174800ED174600EC184500EC194400EC194400EC1A43
+00EC1A4300EC1A4300EC1A84090000850A0000860A0000860B0000870C0000
+870C0000880C0000880D0000890D0000890E0000890C0000870800027B0201
+0F6F00061665000E1A5A00161D51001F214A00272444003326400045273E00
+5B273C0070263A0089253800A8243600DA233500F3243300F4243200F52532
+00F5253100F6253100F6253000F5253000F525870B0000870C0000880D0000
+890D0000890E00008A0E00008A0F00008A0F00008A1000008B100000881000
+007D1000016E0B00105A03001F4D00062542000E2A3800162F310021322B00
+2D3426003D3523005035210064341F0079331D0095311D00C32F1D00DF2E1B
+00DD2E1A00DC2F1900DC2F1800DB2F1700DB2F1700DB2F1700DB2F890E0000
+8A0E00008A0F00008A1000008B1000008B1100008B1100008C1200008C1200
+00841500007B1700007118000363150010510F001D3D07002B2B0103382000
+0C3E19001741120024440C003245070040450600544205016A400301864102
+00B4400200CF380201D0380202D0370203D1370203D1370104D1360104D136
+0104D1368B1000008B1100008C1200008C1200008D1300008D1300008D1400
+008C14000081190000781C0000701F0000661F0007581D00124719001D3413
+0029200D00390803004901040E4C00081E49000B2D45000D3D420010523E00
+126A3B001587370015B2340014D4320015D4310016D4310016D4300017D430
+0017D4300017D4300017D4308D1300008D1400008D1400008E1500008E1600
+008E1600008A1800007E1C0000752100006D240000662700015A26000C4D24
+00143D22001C2B1D002619180033031101410014103F0018203C001B2F3900
+1D3F38001F53360022692F0024862C0028B42C0025E02A0025E1290026E229
+0026E3280027E3280027E4280027E4280027E4288E1600008F1700008F1700
+008F18000090180000871B00007B200000722500006A290000632C00005B2C
+0006502C000F432C0012342A0018242700201322002D011D04380022133400
+272231002B312F002E412D002F542900326A27003386240036AE220034E91F
+0034E81E0035E61E0036E61D0036E51D0036E51D0036E41C0036E41C901900
+00901A0000911A0000911B0000851F00007A250000702A0000672D00006030
+000159310002513200064734000A3C35000D2E3400131E32001C0D2B002900
+2B072F0032162B00382428003C3325003F43230042572100446C2000458620
+0046AB190046E2150047E3140048E3140048E3140048E4140049E4140049E4
+140049E414921C0000921D0000921D000084230000782900006D2E00006532
+00005D34000256360001513800004B3B0000433E0000373F0007283E000F18
+3B001906360026003C0B270044192300482520004D331D0051451900555917
+00566E180056861A0058AB130057F20F0058F30F0058F30E0059F30E0059F3
+0E0059F30E0059F30E0059F30E932000009320000082270000762E00006B33
+0000623600015A380001533A00004E3C0000493E0000434100003B45000030
+4800032147000D1144001801430222004C0E1E00531A1A00572519005C3316
+0061451200655A100067700F0068880E0068A90B0067E8080068EE070068EC
+070068EB070068EA070068E9060068E9060068E90692240000822C00007534
+0000693800005F3A0001573D0000503F00004B41000046430000414500003B
+480000324C0000284F0003194F000C094E00170052061A005B101500621A11
+00672510006B330D006F440A00735A0800767005007888040079A9030078DD
+010079FB010079FB010079FC010079FC01007AFD00007AFD00007AFD008133
+000073390000673C00005C3E0000544100004E43000048450000434800003D
+4A0000384C0000324F000029530000205700031258000C035A011400610811
+006B110C00731C0700792704007B3301007D4100007E550100816C00008586
+000087A7000084E3000084FF000084FF000084FF000084FF000084FF000084
+FF000084FF00703E0000644000005A420000524500004B480000454B00003F
+4D00003A500000345100003053000029560000225B0000175F00030A62000B
+0066030E006F0A0A00771107007F1A040084230200862E0000883C00008950
+00008B6700009182000093A200008FD200008EFF00008EFF00008EFF00008E
+FF00008EFF00008EFF00008EFF0061440000574600004F490000484D000042
+5000003C53000036550000305800002C5A0000275B0000225F00001A640000
+12680004086B00090070010D0078070A00810D070089150400901E02009329
+000094370000964A0000986100009E7D0000A39E00009DC6000099FF000099
+FF000099FF00009AFF00009AFF00009AFF00009AFF00544B00004D4E000046
+5200003F55000038590000325B00002D5E0000286000002462000020640000
+1F6700001A6C0000147100020C760007027B000C0083040A008C0907009510
+04009E180100A3220000A62F0000A6420000AC590000B1770000B8940000B4
+BE0000A9F80000AAF80000AAF80000AAF80000AAF80000AAF80000AAF8004A
+530000435700003C5B0000355F00002F6300002966000025680000216A0000
+216B0000216C0000206F00001B750000177C00001082000308890007019000
+090098040700A4090300B1100100BC190000C4260000C7370000CF4F0000D6
+6A0000DB870000DEA80000CFF50000CFF60000CFF60000CFF60000D0F60000
+D0F60000D0F600405E000039620000326700002C6B0000266E000022710000
+22720000227300002373000023740000217800001D80000018880000149000
+000F9900000AA2000004AC000300B9010400CB050100E10F0000EF1D0000FE
+2C0000FF420000FF600000FF730000FF910000FFB00000FFB20000FFB20000
+FFB20000FFB20000FFB20000FFB200366B0000307000002974000023770000
+237900002379000023790000237900002379000023790000227B00001D8300
+00198A0000149200000F9A00000AA3000004AC000300B9010400CA040100E0
+0E0000EE1C0000FD2B0000FF3E0000FF5E0000FF700000FF8A0000FFA80000
+FFB20000FFB20000FFB20000FFB20000FFB20000FFB2002C75000026770000
+23790000237900002379000023790000237900002379000023790000237900
+00227B00001D830000198A0000149200000F9A00000AA3000004AC000300B8
+010400C9040100DF0D0000ED1B0000FC290000FF3A0000FF5B0000FF6E0000
+FF850000FFA10000FFB20000FFB20000FFB20000FFB20000FFB20000FFB200
+23790000237900002379000023790000237900002379000023790000237900
+002379000023790000227B00001D830000198A0000149200000F9A00000BA2
+000004AB000300B8010400C7040100DE0C0000EC1A0000FB280000FF370000
+FF580000FF6C0000FF810000FF9D0000FFB20000FFB20000FFB20000FFB200
+00FFB20000FFB2002379000023790000237900002379000023790000237900
+0023790000237900002379000023790000227B00001E820000198A00001592
+0000109A00000BA2000005AB000200B7010400C6040100DD0C0000EB190000
+FA270000FF340000FF550000FF6B0000FF7D0000FF9A0000FFB00000FFB200
+00FFB20000FFB20000FFB20000FFB200>
+<63000600630006006400060064000500650005006600050067000500670004
+0068000400680004006800040068000B0068001200690019006A0022006A00
+2C006C003900700048007400590075006A0076007B0076008D007500A00074
+00B8007300E7007300E7007300E7007300E7007300E7007300E7007300E700
+7300E7007300E7006400050064000500650005006600050067000400670004
+00680004006900040069000400690003006A00040069000A00690011006A00
+18006B0021006C002C006E003800720048007500590076006A0077007C0077
+008D007600A0007500B8007500EB007500EB007500EB007500EC007500EC00
+7500EC007500EC007500EC007500EC00660005006600050067000400680004
+006800040069000400690003006A0003006A0003006A0003006B0003006A00
+0A006B0011006C0018006D0020006E002B006F003800730048007600590077
+006A0078007C0078008E007800A0007600B8007600EE007600F0007600F000
+7600F1007600F1007600F1007600F1007600F1007600F10068000400680004
+0069000400690003006A0003006A0003006A0003006B0003006B0002006C00
+02006C0003006C0009006D0010006E0017006F00200070002A007100370075
+00470077005900780069007A007C007A008E007900A0007800B8007800F000
+7800F4007800F4007800F5007800F5007800F5007800F5007800F5007800F5
+0069000300690003006A0003006A0003006B0003006B0002006C0002006C00
+02006C0002006D0002006D0002006E0008006E000F006F00170071001F0071
+0029007300360076004600790059007A0069007B007C007B008E007B00A000
+7A00B8007A00F2007A00F7007A00F7007A00F7007A00F7007A00F7007A00F7
+007A00F7007A00F7006A0003006B0003006B0002006C0002006C0002006D00
+02006D0001006D0001006E0001006E0001006F0001006F00070070000E0071
+00160072001E007300280075003500790046007A0058007C0069007D007C00
+7D008E007C00A1007B00B9007C00EF007B00FA007C00FA007C00FA007C00FA
+007C00FA007C00FB007C00FB007C00FB006C0002006C0002006D0002006D00
+01006E0001006E0001006F0001006F0001006F000100700001007000010071
+00060072000D007200150074001D0075002700770034007B0045007C005800
+7D0069007F007C007F008F007E00A1007E00BA007E00F4007E00FE007E00FE
+007E00FE007E00FE007E00FE007E00FE007E00FE007E00FE006D0001006D00
+01006E0001006F0001006F0001007000010070000100710001007100000072
+000000720001007300050073000C007400140075001C007600260079003300
+7E0044007E0057007F00690081007C0081008F008000A1007F00BA008000F4
+007F00FF007F00FF008000FF008000FF008000FF008000FF008000FF008000
+FF006F0001006F000100700001007100010071000100720000007200000073
+0000007300000074000000740000007400040075000B007600130077001B00
+780025007A0031007F004200800056008100690083007C0083008F008200A1
+008100BA008100F0007E00FE007C00FC007B00FC007A00FB007900FB007900
+FB007800FB007800FB00710001007100000072000000730000007300000074
+00000074010000750100007601000076020000760200007600030177000A00
+7800110079001A007A0023007C00300081004100820055008300680081007A
+007D008B0078009B007500B1007300D5007200FC007100FC007000FC007000
+FD007000FF006F00FE006F00FE006F00FE0073000000730000007401000075
+01000076010000760200007702000078020000780300007903000079030000
+77000202790009007A0010007B0018007C0022007E002E0080003E007A004E
+0076006002720071046F0083046B0096036700AC026600CD016901FF006801
+FF006701FF006601FF006602FF006602FF006502FF006502FF007601000076
+020000770200007802000078030000790300007A0400007A0400007B040000
+7C0500007C0500007A0101027B0007027C000F017D0017017900200272002A
+046C0036076700450A6300560C6000690E5E007E0E5B00910D5800AB0A5800
+D4085A02FB055801F9075600F8085400F7095400F6095300F6095300F50A53
+00F50A79030000790300007A0400007B0400007C0400007C0500007D050000
+7E0600007F0600007F060000800700007D0300017C0005047A000C05710013
+0968001B0C6000241059002E135300391450004A164D005F164B0073174900
+89164700A4154600CA134500E9134300E8144200E7144100E7154000E71540
+00E6153F00E6163F00E6167C0500007C0500007D0500007E0600007F060000
+80070000810700008208000082080000830800008409000080060000730201
+0B670006115D000D155200151949001D1E420025213D0030233A0040233800
+54233600682234007F2133009A203200C01F3200E91E3000E81F2F00E81F2E
+00E7202D00E7202D00E6202C00E6202C00E620800700008007000081080000
+820800008309000084090000850A0000850A0000860A0000860B00007F0D00
+00750E0000670A000C5302001A470006203D000D243300152A2C001F2E2600
+2B2F2200392F1F004A2E1D005D2E1B00712E19008A2C1900AD2A1A00D72719
+00D5281700D4281600D4281500D4291500D4291400D4291400D42984090000
+84090000850A0000860A0000860B0000870C0000870C0000880C0000870D00
+007C110000741500006A1600015C13000C4B0D001938060026280103311D00
+0B371600163A1000223C0A002F3E05003C3E03014E3C0302643902037D3701
+029E370201CE300202CE300203CE2F0104CE2F0104CE2F0105CE2F0105CE2F
+0105CE2F870C0000870C0000880C0000880D0000890E0000890E00008A0F00
+00841100007915000070190000691C00005F1D0003521A000E421600193011
+00241D0B00320703004100040D4300081C40000B2B3C000D3B39000F4D3500
+12633100157B2D0016A02E0013CE2B0014CE2B0015CE2B0016CE2A0016CE2A
+0017CE2A0017CE2A0017CE2A8A0E00008A0F00008A0F00008B1000008B1000
+008B11000082140000771900006D1D0000662100005F230000542300074721
+000F391E0018291A00211716002C020F013A0013103700171F33001A2D3000
+1C3C2E001E4E2B0020622600237C260026A1270023DA250024DB240024DC24
+0025DC230025DD230025DD230025DD230025DD238C1100008C1200008C1200
+008D1300008D14000080180000741D00006B220000632500005C2800005529
+00014B2900093E28000E312700142224001C12200027011B04310020132D00
+25212900282F27002B3E24002D4F21002F641F00317C1F00349E1E0032DD1B
+0032E31A0033E2190033E0190034E0190034DF180034DF180034DF188E1500
+008E1500008E1600008D1700007E1C0000722200006826000060290000582C
+0001522D00024D30000044310004383100092B31000F1C2E00180C28002300
+280728002F1625003523220039301E003C401C003F521A0041661900427E1A
+00439D160044D1100044E10F0045E10F0045E20F0046E20F0046E20E0046E2
+0E0046E20E8F180000901800008C1A00007C21000070260000662B00005D2E
+0001553000024F3200004A340000453600003E390000343B0002253A000B15
+3700150532002100390C210040181D0044241A00483117004D411400505412
+0052691100537F1300549E0F0055D5090055EF080055EF080055EF080056EF
+080056EF070056EF070056EF07901C00008A1E00007B2500006E2B0000642F
+00005A320002533500014C37000047390000423B00003E3C0000354000002B
+4300011D42000A0E400014003F031D00480E18004E19140052241200573010
+005B410D005F550A00626B070065820600669F050064C8020063EB020064EA
+020064EA010064E9010064E9010065E9010065E9017D2800007A2A00006D30
+00006134000158370001503900004A3C0000443E00003F4000003941000034
+4300002C470000234A0001164A000906490014004D07150056100F005D1A0A
+006124080066310600684005006B5304006E69010071800000729C000070C2
+00006FF100006FF100006FF1000070F2000070F2000070F2000070F2006E34
+00006B3500005F380001563B00004E3E000047400000414300003B45000035
+470000304900002C4A0000244E00001B5100010E53000902540210005C090C
+0063110800691A05006E230400702E0400723C0300744E0300776401007B7C
+00007C9800007BC100007BFF00007BFF00007BFF00007BFF00007BFF00007B
+FF00007BFF00603C00015D3D0000534000004C420000454600003E49000037
+4B0000314D00002C4F000028500000245200001C560000145900010A5B0008
+005D010F0063070C006B0E090073170500792003007C2B02007E3701007F48
+0000815E0000857700008894000087BE000085FF000085FF000086FF000086
+FF000086FF000086FF000086FF00534300005144000049480000424B00003B
+4E0000345100002E5300002955000024570000205800001E5900001B5D0000
+166100010D6400070266000E006C050C00740B09007D130600841C03008826
+01008A3200008C4200008D580000917100009690000095B4000091FF000091
+FF000091FF000091FF000091FF000091FF000091FF00494C0000474D00003F
+50000037540000315700002A590000255C0000205E00001F5F0000205F0000
+206000001C640000176900000F6D00050670000B0076020C007F080900880E
+06009016030096200100992C00009A3B00009D510000A06B0000A78A0000A8
+AE00009FED00009FFD00009FFD00009FFD00009FFD00009FFD00009FFD003E
+5500003C560000345A00002D5E000027600000226300002065000021650000
+2166000021670000216800001E6C000019720000127800030A7D0007028300
+0B008C04090095090600A00F0200A9180000AF230000B1320000B4470000BB
+620000C2820000C5A00000BBDB0000B6F60000B6F60000B6F60000B6F60000
+B6F60000B6F60034600000326100002B65000024690000216B0000216C0000
+226D0000226E0000226F000022700000227000001F7600001B7D0000168500
+00108C000109930004029A000700A6030500B5070200C60D0000D4190000E3
+270000F7370000FD540000FE6E0000FF880000FFAD0000FFBD0000FFBD0000
+FFBC0000FFBC0000FFBC0000FFBC002A6D0000286E00002272000022730000
+23740000237500002377000023780000237800002379000023790000207E00
+001C860000178D0000129500000D9E000008A6000002B1000400BF020300D3
+070000E7140000F5230000FF310000FF510000FF6A0000FF7F0000FF9E0000
+FFB20000FFB20000FFB20000FFB20000FFB20000FFB2002379000023790000
+23790000237900002379000023790000237900002379000023790000237900
+0023790000207E00001C850000178D0000129500000D9D000009A6000002B0
+000400BE020300D2070100E6130000F4220000FF300000FF4E0000FF680000
+FF7B0000FF9B0000FFB20000FFB20000FFB20000FFB20000FFB20000FFB200
+23790000237900002379000023790000237900002379000023790000237900
+00237900002379000023790000207E00001C850000178D0000139500000E9D
+000009A6000002B0000400BD020300D0060100E4120000F3210000FF2E0000
+FF4A0000FF640000FF760000FF940000FFB00000FFB20000FFB20000FFB200
+00FFB20000FFB2002379000023790000237900002379000023790000237900
+002379000023790000237900002379000023790000207D00001C850000178D
+0000139500000E9D000009A5000002AF000300BC010300CF060100E3110000
+F11F0000FF2D0000FF450000FF610000FF720000FF8C0000FFA70000FFB200
+00FFB20000FFB20000FFB20000FFB200>
+<59000900590009005A0009005B0009005B0008005C0008005D0008005D0008
+005E0008005E0008005F0007005F000A005F0011005F001800600020006100
+2A0062003500650041006B0050006F0060007000700070008200700094006D
+00AA006C00CA006C00DE006D00DE006D00DE006D00DE006D00DE006D00DE00
+6D00DE006D00DE005B0009005B0009005B0008005C0008005D0008005E0008
+005E0008005F0007005F000700600007006000070060000A00600011006100
+1800610020006200290063003400670041006C005000700060007100700071
+008200710094006F00AA006D00CA006D00DE006D00DE006D00DE006D00DE00
+6E00DE006E00DE006E00DE006E00DE005D0008005D0008005D0008005E0008
+005F0007005F00070060000700610007006100070062000600620006006200
+0900620010006200170063001F006400280065003300680040006E00500071
+0060007200700072008200720094007000AA006F00C9006E00DD006E00DD00
+6E00DD006E00DD006F00DD006F00DD006F00DD006F00DD005E0007005E0007
+005F0007006000070060000700610007006200060062000600630006006300
+0600640005006400080064000F006400160065001E0066002700660032006A
+0040006F004F00720060007300710074008200730094007100AA007000C900
+6F00DD007000DD007000DD007000DD007000DD007000DD007000DD007000DD
+00600007006000070061000700620006006200060063000600640006006400
+05006500050065000500660005006500080065000E006600150067001D0067
+002600680032006C003F0070004F0073006000740071007500820075009400
+7300AA007200C9007100E0007100E1007100E1007100E1007100E1007100E1
+007100E1007100E10063000600630006006300060064000600650005006500
+050066000500670004006700040068000400680004006700070067000D0068
+00140069001C006A0025006B0031006E003E0072004F007400600076007100
+76008300760095007500AA007400C9007300E6007300E7007300E7007300E7
+007300E7007300E7007300E7007300E7006500050065000500650005006600
+05006700040068000400680004006900040069000300690003006A0003006A
+0006006A000C006A0014006B001B006C0024006D00300070003D0074004E00
+760060007700710078008300770095007600AA007500CA007500ED007500ED
+007500ED007500ED007500EE007500EE007500EE007500EE00670004006700
+0400680004006800040069000400690003006A0003006A0003006B0003006B
+0002006B0002006C0005006C000B006C0013006E001A006F0023006F002F00
+72003C0076004E00780060007900710079008300790095007800AA007700CA
+007700F4007700F4007700F4007700F4007800F4007800F4007800F4007800
+F40069000300690003006A0003006A0003006B0003006B0002006C0002006C
+0002006C0002006D0002006D0001006E0004006E000A006F00120070001900
+7100220072002D0075003B0078004D007A005F007B0071007C0084007B0096
+007800A9007500C8007300EB007200EA007100E9007000E8006F00E7006F00
+E7006E00E8006E00E9006B0002006B0002006B0002006C0002006C0002006D
+0002006D0001006E0001006E0001006F0001006F0001007000030070000900
+71001000720018007300210074002C0077003A007A004C007A005E0077006E
+0073007F00700090006C00A5006A00C1006B00F3006A00FB006A00FF006900
+FF006900FF006800FF006800FF006800FF006D0001006D0001006D0001006E
+0001006F0001006F0001007000010070000100710001007100010071000000
+720002007300080073000F00740017007500200077002B00720037006E0045
+006B005600690067026600790363008C026000A2005F00C2006300FF006100
+FF006100FF006000FF005F00FF005F01FF005E01FF005E01FF006F0001006F
+00010070000100700001007100010072000000720000007300000073000000
+7400000074000000740001007500070076000E007600160070001D00680026
+01610032045C003E075A004D095800600A5600740C5500880A53009F075200
+C1055501FB045300F9045100F7055000F6064F00F5064F00F4064E00F3074E
+00F30772000000720000007200000073000000740000007401000075010000
+75010000760200007702000077020000760100007700050170000B02670012
+055E001A095600220D50002A114B003513480044134700571345006B144400
+8013430098114200B9104200E50E4000E40F3F00E3103D00E2103D00E1113C
+00E1113C00E1113B00E1117501000075010000750100007602000077020000
+770200007803000079030000790300007A0400007A040000760400006A0201
+085F00060D55000C114A00141641001B1B3A00232035002E2133003C203100
+4E1F3000611E2F00761E2E008E1D2D00AD1B2E00DC192D00DC192B00DB1A2A
+00DA1A2900DA1A2900D91B2800D91B2800D91B780300007803000079030000
+790300007A0400007B0400007C0500007C0500007D0500007E060000760900
+006D0C0000600900084D0200154200061B37000C202E00132627001D292200
+282A1E00362A1B0045291900572817006A281600802815009E251800CD2116
+00CE221500CD221400CD221300CD231300CD231200CC231200CC237C050000
+7C0500007C0500007D0500007E0600007F06000080070000810700007D0900
+00730D00006B1100006313000056110008460C0014340400212501032B1B00
+0A30140015330D00203508002C360300393701014A3501035E310105742F00
+04912E0101C22A0103C9290103C9290104C8290105C8280105C8280105C828
+0006C828800700008007000081070000820800008309000084090000850900
+007B0D0000701100006815000060180000591A00004C18000A3E1400142D0F
+001F1B0A002B0602003900040D3B00081B37000B2933000D3830000F492C00
+115D2900157225001691270013BD260014C8250014C8250015C8250016C824
+0016C8240016C8240016C824850A0000850A0000850A0000860B0000870B00
+00870C0000791100006E160000651A00005D1D0000561F00004F200003421F
+000B351C00132618001C16140026020E013200120F2F00161E2C00192B2800
+1B3A25001C4A22001E5D1F0021731F002491200023C1210022D21F0023D31F
+0023D31F0024D41E0024D41E0024D41E0024D41E880D0000880D0000890D00
+00890E000085100000771500006C1A0000621E00005A210000532400004D25
+0001462600033A2500092E24001020220018101D0021011A042A001F122600
+24202300262D1F00293B1C002B4C1A002D5F18002F7419003191190031BB16
+0030D5160031D5150031D4140032D4140032D4140032D4140032D4138B1000
+008B1000008B11000084130000751900006A1F000060230000572600005028
+00014A2A0001452B00003F2D0000352E0004282D000B1A2B00130B25001D00
+260722002D151F0032221B00362E1800393D15003C4E13003E6112003F7613
+004191110042BA0C0041DA0B0042DB0A0043DB0A0043DC090043DC090044DC
+090044DC098D1400008D14000082170000731E0000672300005E270000552A
+00014D2C0001472E0000423000003D310000373300002F3600002236000713
+330011042E001B00360B1A003C17160040221300442E1000493D0E004C4F0C
+004E640A00507A09005295070053BE030051EB020052EB020052EB020052EB
+020052EB010053EC010053EC017A1E00007A1E000072220000662800005B2B
+0001522E00024B310000453300003F3500003A360000343800002F3A000026
+3D00001A3E00060C3C0010003B031700440E120049180D004D220A00522E08
+00563D0600594F05005C6502005E7B0000609501005EB800005CED00005CED
+00005CED00005CED00005CED00005CED00005CED006B2A00006B2A0000642D
+0000593000025033000049360000433800003C3A0000363C0000303E00002C
+3F0000274100001E440000134500050444000F0049070E0050100900551806
+00582106005B2C06005E3A0600614B060064610300677700006990010067B1
+000064E8000065E7000065E7000065E7000065E7000065E7000065E7005D33
+00025D330002573500014E380000473B0000403D0000393F0000324100002D
+43000028450000244700001F480000174C00000D4D0005014C000F0051060D
+00580E0A005E160700621F05006529050067360500694705006D5C03007073
+0000728C000072AE000070F2000070F2000070F2000070F2000070F2000070
+F2000070F200523B0000523B00004D3D0000454000003D430000354500002F
+48000029490000244B0000204D00001C4E00001B4F0000165200000F540004
+0455000D0059050E005F0C0A00671407006D1D050071270400733303007542
+0200775702007A6D00007E8700007EAA00007CF000007CFF00007CFF00007C
+FF00007CFF00007DFF00007DFF004743000047430000424600003A49000032
+4B00002B4D000026500000215100001D5300001D5400001D5400001D550000
+18590000115C0003075E000B0061030E0068090B0070110700781904007D23
+0200802E0100823C000082500000856700008A8300008CA4000089E6000088
+FF000088FF000088FF000088FF000088FF000088FF003C4D00003C4D000037
+4E00002F51000028540000235600001E5800001E5900001F5A00001F5B0000
+1F5B00001E5C00001A610000136400020A670009016B010E0072060B007B0D
+0800841504008A1E02008E2900008F3600009149000093610000987D00009D
+A0000097CF000095FF000095FF000095FF000095FF000095FF000095FF0031
+560000315600002C580000265B0000205E00001F5F00002060000020600000
+206100002062000020630000206400001B690000166E00010D730006047700
+0B007E030B0088090800910F0400991702009F210000A22E0000A3400000A7
+580000AC770000B3960000ACC30000A6FA0000A6FA0000A6FA0000A6FA0000
+A6FA0000A6FA00276100002761000023630000206500002166000021670000
+2168000021690000216A0000216B0000216B0000216D00001D730000187A00
+00128000020A870006038E00090096030700A1080400AE0E0100B9170000C2
+240000C7340000CD4C0000D5690000DA880000DDAC0000CEF50000CEF50000
+CFF50000CFF60000CFF60000CFF600216C0000216C0000226D0000226E0000
+226F0000227000002272000022730000237400002375000023750000227700
+001E7F00001A87000015900000109900000BA1000005AA000201B6000400C6
+040100DD0C0000EC1B0000FC290000FF3D0000FF5F0000FF730000FF940000
+FFB20000FFB20000FFB20000FFB20000FFB20000FFB2002376000023760000
+23770000237900002379000023790000237900002379000023790000237900
+0023790000237900001F8100001A88000015900000109800000CA1000006AA
+000201B5000400C5030200DC0B0000EB190000FB280000FF390000FF5C0000
+FF700000FF8C0000FFAE0000FFB20000FFB20000FFB20000FFB20000FFB200
+23790000237900002379000023790000237900002379000023790000237900
+00237900002379000023790000237900001F8000001A880000169000001198
+00000CA0000006A9000201B5000400C4030200DA0B0000EA180000FA270000
+FF350000FF580000FF6D0000FF860000FFA50000FFB20000FFB20000FFB200
+00FFB20000FFB2002379000023790000237900002379000023790000237900
+002379000023790000237900002379000023790000237900001F8000001A88
+000016900000119800000CA0000006A9000101B4000400C3030200D90A0000
+E9170000F8260000FF330000FF550000FF6B0000FF810000FF9E0000FFB200
+00FFB20000FFB20000FFB20000FFB200>
+<50000C0050000C0050000C0051000C0051000C0052000C0053000C0053000B
+0054000B0054000B0055000B0055000B005400110054001800540020005600
+2800580031005C003B0061004800670056006A0066006B0077006A00890068
+009F006600BD006800F2006800F2006800F1006800F1006800F1006800F100
+6800F1006800F10052000C0052000C0052000C0052000C0053000B0054000B
+0054000B0055000B0056000A0056000A0057000A0057000A00560010005600
+170056001F0057002700590030005D003B0062004700680056006B0066006C
+0077006B00890069009F006700BC006900ED006900ED006900ED006900ED00
+6900ED006900EC006900EC006900EC0054000B0054000B0054000B0054000B
+0055000B0056000A0056000A0057000A0057000A0058000A00580009005900
+090058000F005800170058001E00590026005B0030005E003B006300470069
+0056006C0066006D0077006C0089006A009E006800BA006A00E8006A00E800
+6A00E8006A00E8006A00E8006A00E8006A00E8006A00E70055000B0055000B
+0055000B0056000A0057000A0058000A0058000A0059000900590009005A00
+09005A0009005B0009005A000F005A0016005A001D005B0025005D002F005F
+003A00650047006A0056006D0066006E0077006E008A006C009E006A00B900
+6A00E3006A00E3006A00E3006A00E3006A00E3006A00E3006B00E3006B00E3
+0058000A0058000A0058000A0058000A00590009005A0009005A0009005B00
+09005B0008005C0008005C0008005D0008005D000E005C0015005D001C005E
+0025005F002E0061003A00660047006C0056006F0066006F0077006F008A00
+6D009E006B00B8006B00DF006B00DF006B00DF006B00DF006B00DF006B00DE
+006B00DE006B00DE005A0009005A0009005A0009005A0009005B0009005C00
+08005C0008005D0008005E0008005E0008005F0007005F0007005F000D005F
+0014005F001B006000240061002D0063003900680046006D00560070006700
+7000770070008A006F009E006D00B8006D00DE006D00DE006D00DE006D00DE
+006D00DE006D00DE006D00DE006D00DE005C0008005C0008005C0008005D00
+08005D0008005E0008005F0007005F00070060000700600007006100070061
+00060061000C006100130062001A006300220063002C00650038006A004600
+6F005600710067007200780072008A0071009D006F00B7006E00DD006E00DD
+006E00DD006E00DD006E00DD006E00DD006E00DD006E00DD005E0007005E00
+07005E0007005F000700600007006100070061000600620006006200060063
+000600630006006400050063000B0063001200640019006500210066002B00
+670037006C00460070005600720067007300780074008A0072009D007100B6
+006F00DD006F00DD006F00DD006F00DB006E00D9006D00D8006D00D8006D00
+D8006100070061000700610007006200060063000600630006006400050065
+0005006500050066000500660005006700040066000A006600110067001800
+6700200068002A00690036006E00450072005600740067007500780073008A
+006F009C006C00B5006C00F3006B00F6006A00F5006A00FA006900FA006900
+FA006800F9006800FB00640005006400050064000500650005006500050066
+00050067000400680004006800040069000400690004006900030068000900
+69000F00690017006B001F006B0029006C003500700044006E0053006D0063
+006A0074006700860064009A006100B6006400FF006300FF006200FF006100
+FF006100FF006000FF006000FF006000FF0067000400670004006700040068
+0004006800040069000400690003006A0003006A0003006B0003006B000300
+6B0002006B0007006C000E006C0015006E001E006C0027006500320060003E
+0060004C005F005D015E006F025C008201590097005700B5005C00FF005A00
+FF005900FF005800FF005700FF005700FF005700FF005600FF006900030069
+000300690003006A0003006B0003006B0002006C0002006C0002006C000200
+6D0002006D0001006D0001006E0006006F000D006C00140065001B005D0024
+0057002E035300380551004506500057074F006A094E007F084D0094054C00
+B0034E00EA024D00F5024C00F2024B00F0034A00EF034900ED034800EC0448
+00EC046C0002006C0002006C0002006C0002006D0002006D0001006E000100
+6E0001006F0001006F00010070000100700001006F00040067000A015E0011
+03550018074D001F0C460027114200301440003E12400050113F0062113E00
+77103D008D0E3D00A90C3D00D40A3C00DF0A3B00DE0B3A00DD0B3900DC0C38
+00DC0C3800DB0C3700DB0C6E0001006E0001006E0001006F0001006F000100
+7000010071000100710001007200000072000000730000006D030000620201
+035700050A4D000B0E430012133A0019193200201E2E002B1F2C00391D2B00
+491B2A005A1A2A006D1A2900841928009F172A00C6142900D4142800D31427
+00D2152600D1152500D0152500D0152400D016710001007100010071000100
+720000007200000073000000740000007401000075010000730300006C0600
+00640900005A090003470200113C00051732000B1C2900122222001A251E00
+26261A00322516004123150051231400632312007723120091211400B61D14
+00C81C1300C71D1200C61D1100C61D1000C61E0F00C61E0F00C51E74010000
+74010000740100007501000076020000770200007702000078030000720600
+00690A0000610D00005A10000050100003410B000F3004001C220103251800
+092A1200132C0B001F2E06002A2F0200362E0001462D0003592A00066D2800
+0685260003AA250103C3230104C2230005C2230005C2230006C2230006C122
+0006C122780300007803000078030000790300007A0400007B0400007A0500
+00700A0000670E00005E1200005715000051170000471700043912000F2A0D
+001A190900250602003100040C3200081A2E000B282A000D3627000F452400
+10582100136B1F0015841F0014AA210013C1200013C11F0014C11F0015C11F
+0015C11F0015C11F0015C21F7D0500007D0500007D0500007E0600007F0600
+007B0900006F0E0000641200005B160000541900004E1B0000481D00003E1C
+00053119000E2416001714130020020D012B00110F2800151D240018292000
+1A371D001B461B001D5819001F6C180022851A0022AB1C0020CB1B0021CB1B
+0021CB1A0022CB1A0022CB1A0022CB1A0022CB198308000083080000830800
+00840900007A0D00006D12000062170000591A0000511D00004A2000004421
+00003F230000362300042A22000B1E2000130F1C001B01190423001D112000
+221F1C00252B180027391500294913002B5A12002D6D12002F8613002FA712
+002ECB11002ECB11002FCB10002FCB100030CB0F0030CB0F0030CA0F870B00
+00870B0000870B0000791100006B160000601B0000571F00004F2200004724
+0000412500003C27000038280000302A0000252A00061828000F0923001800
+25071B002B1418002F201400332C1000373A0E003A4B0C003C5D0B003D700A
+003E8709003FA806003FD2050040D3040041D3040041D4030042D4030042D5
+030042D5037715000077150000771500006A1B00005E200000542300004C26
+0001452800003F2A0000392B0000342D0000302F0000293100001F33000311
+30000C032C001600330B130038160F003C200C00412C0800463A06004A4B04
+004A5E03004C7301004D8A00004DAC00004BE200004BE200004BE200004BE2
+00004BE200004BE200004BE2006720000067200000672000005D2500005228
+00014A2A0000432D00003C2E000036300000313200002C3400002836000021
+380000183A00010A38000B0038041000400D0A0044160600461F0500492A05
+004E38050050480500525C0300547101005689000056A9000052E7000052EA
+000052EA000053EA000053EA000053EA000053EB005A2900015A2900015A29
+0001502C0002482F0000413100003A330000333600002D380000283A000024
+3B0000203D0000193F000010410001053F000B0041050D00460C0A004B1507
+004D1D0600502705005434060057440600595804005C6F01005F8600005FA5
+00005BDC00005BED00005BED00005BED00005BED00005BED00005BED004E32
+00004E3200004E320000463400003F37000037390000303C00002A3E000025
+400000204100001C4300001A44000017450000114700010746000A0047030E
+004D0B0B0053130700561B0600592506005D3106005F41060062540500656B
+01006882000069A0000065C7000065E7000065E7000065E7000065E7000065
+E7000065E700443A0000443A0000443A00003D3D0000343F00002C41000027
+440000214600001C4700001B4800001B4900001B490000184B0000134D0001
+094E0009004E020F0054090C005B1108006119060065230500672E0500693C
+05006C4F04006F660200737D0000749A000071C5000071F4000071F4000071
+F4000072F4000072F4000072F400394200003942000039420000314500002A
+480000234A00001E4C00001C4D00001C4E00001C4E00001C4F00001C4F0000
+1A510000155400000C5600070257010E005D070D00640E09006C1706007120
+0400742B030076370200784902007A5F01007E7800008196000080C400007F
+FF00007FFF00007FFF00007FFF00007FFF00007FFF002E4C00002E4C00002E
+4C0000274E0000205000001D5200001D5300001D5400001E5400001E550000
+1E5600001E5600001C590000175C00000E5F00060361000D0066040D006E0B
+0A00771306007E1C0400832602008532000087420000875800008B71000090
+9100008EBB00008CFF00008CFF00008CFF00008CFF00008CFF00008CFF0024
+55000024550000245500001E5800001E5900001E5A00001F5A00001F5B0000
+1F5C00001F5D00001F5D00001F5E00001D6100001966000011690004086D00
+0A0071020D007A070A00830E06008C160300921F0100952B0000963A000098
+5000009B6A0000A28B0000A2B200009BFE00009BFE00009BFE00009BFE0000
+9BFE00009BFE001F5F00001F5F00001F5F0000206000002061000020620000
+2063000020640000206500002165000021660000216700001F6A00001A7000
+00147500020C7B00060480000A0089030A00920806009C0F0300A5170100AC
+220000AF300000B0450000B8610000BF820000C2A30000B4E90000B3F70000
+B3F70000B3F70000B3F70000B4F70021680000216800002168000021690000
+216A0000216B0000216C0000226D0000226E0000226F000022700000227100
+00207500001C7C000017840000138C00000C930003049A000600A4010600B4
+050300C50A0100D6160000E5240000F9340000FF520000FF6C0000FF880000
+FFB20000FFB60000FFB60000FFB50000FFB50000FFB5002272000022720000
+22720000237300002375000023760000237700002378000023790000237900
+002379000023790000217C00001D840000188B0000149300000E9B00000AA4
+000003AE000300BB010300CE050100E3110000F2200000FF2F0000FF4E0000
+FF690000FF800000FFA10000FFB20000FFB20000FFB20000FFB20000FFB200
+23790000237900002379000023790000237900002379000023790000237900
+0023790000237900002379000023790000217C00001D830000188B00001493
+00000F9B00000AA4000003AD000300BA010300CD050100E2100000F11F0000
+FF2E0000FF4A0000FF660000FF7B0000FF9D0000FFB20000FFB20000FFB200
+00FFB20000FFB2002379000023790000237900002379000023790000237900
+00237900002379000023790000237900002379000023790000217B00001D83
+0000198B0000149300000F9B00000AA3000004AD000300BA010400CB050100
+E10F0000F01E0000FE2C0000FF440000FF620000FF760000FF970000FFB200
+00FFB20000FFB20000FFB20000FFB200>
+<47001000470010004700100047001000480010004800100049000F004A000F
+004A000F004B000F004B000F004B000E004B0010004900170049001F004B00
+26004F002D0054003600590041005F004E0063005C0065006D0064007F0062
+0095006000B2006400FD006400FD006400FD006400FD006400FD006400FC00
+6400FC006400FC0049000F0049000F0049000F0049000F004A000F004A000F
+004B000F004B000E004C000E004C000E004D000E004D000E004D0010004B00
+17004B001E004D00250050002D00550036005900400060004D0064005C0066
+006D0065007F00630094006100B0006500FB006500FB006500FB006500FB00
+6500FB006500FB006500FB006500FB004A000F004A000F004A000F004B000F
+004B000E004C000E004D000E004D000E004E000D004E000D004F000D004F00
+0D004F000F004D0016004D001E004E00250051002C00560036005A00400061
+004D0065005C0067006D0067007F00650093006200AF006600F9006600F900
+6600F9006600F9006600F9006600F9006600F9006600F9004C000E004C000E
+004C000E004D000E004D000E004E000D004E000D004F000D0050000D005000
+0C0051000C0051000C0051000E004F0015004F001D005000240053002C0057
+0035005B00400062004D0066005C0068006C0068007F00660093006400AD00
+6600F4006600F7006700F7006700F7006700F7006700F7006700F7006700F7
+004E000D004E000D004E000D004F000D004F000D0050000D0051000C005100
+0C0052000C0052000C0053000C0053000B0053000D005200140052001C0053
+00230055002B00580035005C00400063004D0068005C006A006C0069007E00
+680093006500AC006600E6006700F5006700F5006700F5006700F5006700F5
+006700F5006700F50051000C0051000C0051000C0051000C0052000C005200
+0C0053000B0053000B0054000B0055000B0055000B0056000B0056000C0054
+00130054001B005500220057002B00590034005D00400064004D0069005C00
+6B006C006B007E00690092006700AB006700D9006800F0006800F0006800F0
+006800F0006800F0006800F0006800F00053000B0053000B0053000B005300
+0B0054000B0055000B0055000B0056000A0056000A0057000A0058000A0058
+000A0058000B005700120057001A00580021005A002A005B0034005F003F00
+66004D006A005C006C006C006C007E006B0092006900AA006700D0006900EA
+006900E9006900E9006900E9006900E9006900E9006900E90056000A005600
+0A0056000A0056000A0057000A0057000A0058000A0059000900590009005A
+0009005A0009005B0009005B000A005A0011005A0018005B0020005C002900
+5E00330061003F0067004D006C005C006E006D006E007E006D0092006B00A9
+006900CC006A00E9006900EE006900F3006800F7006800FB006800FB006800
+FD0058000900580009005800090059000900590009005A0009005B0009005B
+0009005C0008005C0008005D0008005D0008005E0009005D0010005D001700
+5E001F005F0028006000320063003E0069004C006D005D006D006C006B007D
+00670091006300A9006200D8006400FF006300FF006200FF006100FF006100
+FF006000FF006000FF005B0009005B0009005B0009005B0008005C0008005D
+0008005E0008005E0008005F0007005F000700600007006000070061000800
+60000F006100160061001D00620026006300310062003D0062004900630059
+006200690060007B005C008F005900AA005C00E6005A00FF005900FF005800
+FF005800FF005700FF005700FF005700FF005E0008005E0008005E0008005E
+0007005F000700600007006100070061000600620006006200060063000600
+630006006300070063000D006300140064001C005F00240059002E00560038
+005500440056005300560065015500790052008E004F00A9005100DD005100
+FF005000FF004F00FF004F00FF004E00FF004E00FF004E00FF006100060061
+00060061000600620006006200060063000600640005006500050065000500
+6600050066000500670004006700050066000C006000130058001A00530023
+004E002B034B0033054A003F0449004E04480061064800750648008A034600
+A3014600CC004600EE004500EC014400EA014300E9014200E8014200E70141
+00E70165000500650005006500050065000500660005006700040068000400
+680004006900040069000300690003006A000300640003005C000900540010
+024B00160743001D0D3C00231338002D1539003A113900490E38005B0E3800
+6E0D3800840B38009D093800C0073700DA063600D9063500D8073400D80733
+00D7073300D7083200D6086900040069000400690004006900040069000300
+6A0003006A0003006B0003006B0002006C0002006A000200610001005A0101
+014E00040745000A0C3B001011330016172C001E1C2800281C2600351A2600
+4417250054162500661624007B15240094142600B4102600CE0F2500CD0F24
+00CD102300CC102200CB102100CB112100CB116B0002006B0002006B000200
+6B0002006C0002006C0002006D0002006D0001006E000100670000005F0300
+005A060000520800004202000C370004132D000A192500101E1F0019211A00
+24211600302013003C1E11004B1E10005C1F0E006F1F0E00861D1000A51A12
+00C3171100C2180F00C2180E00C1190E00C1190D00C1190D00C0196E000100
+6E0001006E0001006E0001006F000100700001007000010070000000660300
+005E070000570A0000500D0000490E00003C0A000A2C0400161F0102201600
+08240F00122609001D28050028280101342700024225000454230006662100
+087C1F00069A200003BC1E0004BC1E0005BC1D0006BC1D0006BB1D0007BB1D
+0007BB1D720000007200000072000000720000007200000073000000700300
+00650700005C0B0000540E00004D11000047130000411500013511000A270C
+00151808001F0502002900040C2A00081927000B2623000D3320000F421D00
+10531B0012661900147B1900149A1B0012BC1B0012BC1B0013BC1A0013BC1A
+0014BD1A0014BD1A0014BD1A76010000760100007601000076010000770200
+0070060000640B00005A0F0000511200004A150000441700003F190000391A
+00012D180009211500131312001A010D012400110E2200151B1E0017281A00
+1A3516001B4314001C5413001E661200207C1300209A16001EC417001FC416
+001FC4160020C4160020C4150020C4150020C4157A0400007A0400007A0400
+007A0400006F090000620F0000581300004F17000048190000411B00003B1D
+0000361F000032200000272000061C1E000E0D1A00160118041D001D111A00
+211D16002429120026370E0028460C0029560B002B680B002C7D0C002D980D
+002BC20D002CC30C002CC30C002CC30B002DC30B002DC20A002DC20A710C00
+00710C0000710C00006E0E000061130000561800004D1B0000451D00003E1F
+000038210000332300002F2500002B260000222800021626000A0822001300
+24071500291312002D1E0D00312A09003538060038480400395903003A6A03
+003A7E02003898020039C0020039C7020039C7020039C702003AC702003AC7
+02003AC70262170000621700006217000060180000551C00004B1F00004322
+00003C24000036260000312700002C290000282B0000242D00001B2F00000F
+2E0007022B011000310A0C0035140800381E05003B2903003F360300424503
+004157030041690200427E01004198000043C4000042D4000042D4000042D4
+000042D4000042D4000042D400552000005520000055200000532100004924
+0000412600003A280000332A00002E2C0000292E000024300000203200001C
+33000014350000083500060033020C00380A09003C1306003D1C0500402604
+00453304004842040049540300496802004A7D00004B9900004BC600004ADF
+00004AE000004AE000004AE000004AE000004AE0004A2800014A2800014A28
+0001472800003F2B0000382D0000312F00002B32000025340000213600001C
+3700001839000017390000123B00000A3A00050138020D003D090B00421107
+00441A0600462305004B2F05004E3E05005051040052660200547C00005597
+000053C2000052E9000052E9000052EA000052EA000052EA000052EA003F2F
+00003F2F00003F2F00003E300000353200002E35000027380000223A00001D
+3B0000183D0000183E0000183E0000183F0000134000000C400005023F010D
+0043070C00481008004C1806004E210600522C0600563B0600584C05005B62
+03005D7A00005F9401005DBA00005BED00005BED00005BED00005BED00005B
+ED00005BED00353800003538000035380000333800002B3B0000243E00001E
+4000001942000019420000194300001A4300001A4400001A44000015460000
+0E4700040346000D004A060D00500D0A0055160700581F06005B2906005F37
+060061480600645E0300687500006A8F000068B1000066E7000066E7000066
+E7000066E6000066E6000066E6002A4100002A4100002A4100002841000021
+4400001B4600001A4700001B4800001B4800001B4900001B4A00001B4A0000
+1B4B0000174D0000104F0003054F000C0052040E00580B0B005F130700641D
+0500682705006B3305006C4205006F580300736F0000768A000076AE000074
+F7000074F7000074F7000074F7000074F7000074F700204A0000204A000020
+4A00001F4A00001C4C00001C4D00001C4E00001C4E00001C4F00001D500000
+1D5000001D5100001D51000019550000135700020859000A005B020F006209
+0C006A1008007119050077230300792E02007B3C01007C5001007F68000084
+84000085AA000083FC000082FF000082FF000082FF000083FF000083FF001D
+5200001D5200001D5200001D5200001D5300001D5400001E5500001E560000
+1E5700001E5700001E5800001E5900001E5900001A5D0000156100010C6400
+070166000E006D060C00750C09007E140500851E0300892901008A3600008C
+4900008E610000937E000097A3000091E2000091FF000091FF000091FF0000
+91FF000091FF001F5A00001F5A00001F5A00001F5A00001F5B00001F5C0000
+1F5D00001F5E00001F5F0000206000002061000020610000206200001C6600
+00176C00010F7000050674000A007A020C00840809008D0E0500961602009B
+2000009E2D00009F3F0000A3570000A8770000B0990000A7CC0000A3FB0000
+A3FB0000A3FB0000A3FB0000A4FB0020630000206300002063000020630000
+2065000021660000216700002168000021690000216A0000216A0000216B00
+00216C00001E71000019780000147F00020C850005048D000800940208009E
+070500AC0D0200B8150000C1220000C7320000CC490000D6670000DB880000
+DCAF0000CFF60000CFF60000D0F60000D0F70000D0F700226D0000226D0000
+226D0000226E0000226F000022700000227200002273000023740000237500
+00237600002377000023780000207E00001B860000178E0000129600000D9F
+000007A8000101B3000400C2030200D90A0000EA180000FA270000FF380000
+FF5D0000FF730000FF990000FFB20000FFB20000FFB20000FFB20000FFB200
+23790000237900002379000023790000237900002379000023790000237900
+002379000023790000237900002379000023790000207E00001B860000178E
+0000129600000D9E000008A7000101B2000400C1020200D7090000E9170000
+F9260000FF350000FF5A0000FF6F0000FF8F0000FFB20000FFB20000FFB200
+00FFB20000FFB2002379000023790000237900002379000023790000237900
+0023790000237900002379000023790000237900002379000023790000207E
+00001B860000178E0000129600000D9E000008A7000101B2000400C0020200
+D5080000E8150000F7250000FF330000FF560000FF6D0000FF870000FFAB00
+00FFB20000FFB20000FFB20000FFB200>
+<41001300410013004100130041001300410013004100130041001300410012
+0042001200420012004300120043001200430012004200160041001D004300
+230046002A004B00320051003C00570047005C0055005F0065005F0076005D
+008B005A00A7005D00DD006000FE006000FE006000FE006000FE006000FE00
+6000FE006100FE004100130041001300410013004100130041001200420012
+00420012004300120043001200440012004400110044001100450011004300
+150042001D004400230047002A004C00320052003B00580047005D00550060
+006400600076005E008A005C00A5005E00D7006100FF006100FF006100FF00
+6100FF006100FF006100FF006100FF00430012004300120043001200430012
+00430012004300120044001100440011004500110045001100460011004600
+1100460010004500150043001C004500230049002A004D00320053003B0059
+0047005E00540061006400610076005F008A005D00A4005E00D2006200FF00
+6200FF006200FF006200FF006200FF006200FF006200FF0044001100440011
+00440011004400110045001100450011004600110046001100460010004700
+10004700100048001000480010004700140045001C00460022004A0029004E
+00310054003B005A0046005F0054006200640062007500610089005E00A300
+5F00CE006300FE006300FE006300FE006300FE006300FE006300FE006300FE
+00460011004600110046001100460011004600100047001000470010004800
+10004800100049000F0049000F004A000F004A000F004900130047001B0048
+0022004C0029005000310055003B005B004600600054006300640064007500
+620088006000A1006000CA006400FD006400FD006400FD006400FD006400FD
+006400FD006400FD0048001000480010004800100048001000480010004900
+0F0049000F004A000F004B000F004B000E004C000E004C000E004C000E004B
+0012004A001A004A0021004D0028005200300056003A005C00460061005400
+6500630065007500640088006100A0006100C6006500FC006500FC006500FC
+006500FC006500FC006500FC006500FC004A000F004A000F004A000F004A00
+0F004B000F004B000E004C000E004C000E004D000E004E000D004E000D004E
+000D004F000D004D0012004C0019004D0020004F0027005300300057003A00
+5D0045006300540066006300670074006600880063009F006200C3006600FA
+006600FA006600F9006600F9006600F9006600F9006600F9004D000E004D00
+0E004D000E004D000E004D000E004E000D004E000D004F000D0050000D0050
+000C0051000C0051000C0052000C00500010004F00180050001F0051002700
+55002F00590039005E0045006400530068006300690074006800870064009E
+006100C1006400FF006200FD006100FF006100FF006000FF006000FF005F00
+FF004F000D004F000D004F000D004F000D0050000D0051000C0051000C0052
+000C0052000C0053000B0053000B0054000B0054000B0054000F0053001600
+53001E005400260057002E005A0039005F0045006500530065006200630073
+005F0086005B009E005900C7005B00FF005900FF005800FF005700FF005700
+FF005600FF005600FF0052000C0052000C0052000C0052000C0053000B0054
+000B0054000B0055000B0055000B0056000A0057000A0057000A0058000A00
+57000E005600150057001D005800250059002D00570037005800420059004F
+0059005F00580071005600860051009F005100C9005100FF005000FF004F00
+FF004E00FF004E00FF004D00FF004D00FF0056000A0056000A0056000A0056
+000A0056000A0057000A0057000A0058000A0059000900590009005A000900
+5A0009005B0009005B000D005A00140058001B00520023004F002B004D0033
+004D003E004E004B004E005C004E006F004C00840049009D004800C4004800
+FD004700FB004600FA004500F9004400F8004400F7004400F7005900090059
+0009005900090059000900590009005A0009005B0009005B0008005C000800
+5D0008005D0008005E0008005E0008005C000B00540012004D001900490021
+004500280442002F0643003A03430048014200580341006C03420081014000
+99003F00BA003E00E9003C00E7003B00E5003B00E4003A00E4003A00E30039
+00E3005C0008005C0008005C0008005C0008005D0008005E0008005E000700
+5F000700600007006000070061000700610006005A000500530008004A000E
+02420014073A001A0E3400201430002915310036103200440C3200540B3200
+660A32007A08320092063200B1043100D7033000D6032F00D5042E00D4042E
+00D4042D00D3042D00D3046000070060000700600007006000070061000700
+61000600620006006300060064000600640005005E00040057000300500001
+02450003043E00090935000E0F2D00141527001C1924002619220032172100
+401420004F12200060121F0072121F0089112100A60D2300CB0A2100CA0B20
+00C90C1F00C90C1E00C80C1E00C80C1D00C70D640005006400050064000500
+6400050065000500660005006600050067000400670004005C000200550001
+014B030000460500003D0300073200030F2900081521000F1A1B00171C1700
+221D13002D1B100039190E0047190C00571A0B00681A0B007D1A0C00981710
+00BF130E00BE140D00BD140C00BD150B00BC150A00BC150A00BC1569000400
+69000400690004006900040069000400690003006A000300640002005A0101
+00520400014B07000045090000400B0000380A00042A0400111D01021B1400
+081F0E00112108001B22030126220102322000033F1E0005501C0006621A00
+08751900078F1A0004B3190005B7190006B7180006B7180007B7180007B718
+0007B7186C0002006C0002006C0002006C0002006C0002006C000200620000
+005A04000051070000490A0000430D00003E0F00003911000031110004240C
+000F160800190502002300040B2300081820000B241C000E3119000F3F1600
+0F4F15001161130013741300148D150011B1160011B8160012B8150013B815
+0013B8150013B8150013B8156F0001006F0001006F0001006F0001006F0001
+0062030000590800004F0C0000470F0000411100003B130000361500003117
+00002A1700041E14000D11110015010C011E00100E1C00141A180017261400
+193310001A410E001B510D001C620C001E750D001F8D0F001DB213001DBD12
+001DBD11001EBD11001EBD10001EBD10001FBD106A0400006A0400006A0400
+006A04000062070000570C00004D100000451300003E150000381800003219
+00002E1B00002A1D0000251E00011A1D00090C1A001100180417001C101400
+201C100023280B00253408002643050027530500296404002A7605002A8D06
+0028AD090027BC0A0027BC0A0027BC0A0027BC0A0027BC0A0027BC0A5C0D00
+005C0D00005C0D00005C0D0000561000004C140000431700003C190000351C
+0000301E00002B20000027210000242300001F250000142500050621000D00
+23070E0027120B002B1D07002E280300303401003243010031530200316303
+0031750400308B05002EAB07002DBF07002DBF07002DBF07002DBF07002DBF
+07002EBF07501600005016000050160000501600004A180000411B0000391E
+0000332000002D2200002924000024260000202800001D290000172B00000D
+2B00020129010A002D0808002F120700301B05003226030036320200394002
+00385102003861030038730300378A030037AA030036C5030036C5030036C5
+030037C5030037C5030037C503441E0000441E0000441E0000441E00003F20
+000037220000302400002B27000026290000212B00001C2D0000192E000015
+2F0000123000000C300002022E000A0030070A003410070035190600382304
+003B2E0300403D0200404D0300405F0300407202004089010040AB010040D0
+010040D0010040D1010040D1010040D1010040D1013A2500003A2500003A25
+00003A250000362700002E290000282C0000232E00001D3000001932000015
+3300001634000016340000143500000E350001043300090034050B00390E08
+003B1706003D200500412B040046390400484A0300485D0300497101004A89
+00004AAC000049DE000049DE000049DE000049DE000049DE000049DE00302D
+0000302D0000302D0000302D00002C2E0000253100001F3400001A36000016
+37000017380000173800001739000017390000153A00000F3B000106390009
+003A040D003F0C090043150600441D0600482805004C3505004F460500515A
+0400527001005488000055AA000051E9000051E9000051E9000052E9000052
+E9000052E90026360000263600002636000026360000233700001C3A000018
+3B0000183C0000183D0000183D0000183E0000183E0000183F000017400000
+11410001084000080040030E00450A0B004B1307004D1B0600502506005431
+0600574106005A5505005D6D01005F85000060A500005CE400005CED00005C
+ED00005CED00005CED00005CED001D3E00001D3E00001D3E00001D3E000019
+400000194100001941000019420000194300001A4300001A4400001A450000
+1A45000019460000134800000A4800070047010F004D080C00541008005819
+06005B2206005F2E0600623D060064500500686702006B8000006C9E000068
+C9000068E8000068E8000068E8000068E8000068E9001A4600001A4600001A
+4600001A4600001A4600001B4700001B4800001B4900001B4900001B4A0000
+1B4B00001C4B00001C4C00001A4D0000155000000D5100060151000F005706
+0D005D0E0A0064160600692005006C2A04006F380400714A04007461020078
+7A00007998000077C9000078FB000078FB000078FB000078FB000078FC001C
+4D00001C4D00001C4D00001C4D00001C4E00001C4E00001C4F00001D500000
+1D5100001D5200001D5200001D5300001D5400001C55000017590000105B00
+04055D000C0061040E00680B0A0071120700781C04007D2602007F32010081
+42000082580000867200008A93000089C6000087FF000087FF000087FF0000
+87FF000087FF001E5500001E5500001E5500001E5500001E5600001E570000
+1E5800001E5900001E5900001F5A00001F5B00001F5C00001F5C00001E5E00
+00196200001366000309690009016D010D0075070B007E0D0700871504008E
+1F0200912B0000923A000094500000976A00009E8C00009DB8000097FF0000
+97FF000097FF000097FF000098FF001F5E00001F5E00001F5E00001F5E0000
+1F5F0000206000002061000020620000206300002064000020650000216500
+0021660000206800001B6E0000167300010E790005057E00090085020B008F
+070700990E0400A3150100AA200000AD2F0000AE430000B6600000BD830000
+BFA80000B1F70000B1F70000B1F70000B1F70000B2F7002169000021690000
+216900002169000021690000216B0000216C0000226D0000226E0000226F00
+00227000002271000022720000227400001D7B000019830000148B00000E93
+0001089B000301A4000600B3040400C5080100D9120000E9210000FE310000
+FF500000FF6B0000FF880000FFB20000FFB20000FFB20000FFB20000FFB200
+23750000237500002375000023750000237600002377000023780000237900
+002379000023790000237900002379000023790000227A00001E8100001A89
+000015910000109900000BA2000004AB000200B8010400CA040100E00F0000
+F01E0000FF2D0000FF4B0000FF690000FF810000FFA70000FFB20000FFB200
+00FFB20000FFB2002379000023790000237900002379000023790000237900
+00237900002379000023790000237900002379000023790000237900002379
+00001E8100001A89000015910000109900000BA2000005AB000200B7010400
+C8040100DF0E0000EE1D0000FE2C0000FF450000FF650000FF7B0000FF9F00
+00FFB20000FFB20000FFB20000FFB200>
+<41001300410013004100130041001300410013004100130041001300410013
+004100130041001300410013004100130041001300410013003F001A003F00
+20004100270047002E004C0036005200410057004E005B005D005C006E005B
+00820058009B005900C3005E00FD005E00FD005E00FD005E00FD005E00FD00
+5E00FD005E00FD004100130041001300410013004100130041001300410013
+00410013004100130041001300410013004100130041001300410013004100
+13003F001A003F0020004100270047002E004C0036005200410057004E005B
+005D005C006D005B00810058009B005800C1005E00FD005E00FD005E00FD00
+5E00FD005E00FD005E00FD005E00FD00410013004100130041001300410013
+00410013004100130041001300410013004100130041001300410013004100
+130041001300410013003F001A003F0020004100260047002E004C00360052
+00400057004D005B005C005C006D005B00810058009A005800BF005E00FD00
+5E00FD005E00FD005E00FD005E00FD005E00FD005E00FD0041001300410013
+00410013004100130041001300410013004100130041001300410013004100
+1300410013004100130041001300410013003F001A003F0020004100260047
+002E004C0036005200400058004D005B005C005D006C005C00800059009800
+5900BD005F00FD005F00FD005F00FD005F00FD005F00FD005F00FD005F00FD
+00410013004100130041001300410013004100130041001300410013004100
+13004100130041001300410013004200120042001200420013004000190040
+001F004300260048002D004D0035005300400059004D005D005B005E006C00
+5E007F005B0097005A00BA006000FE006000FE006000FE006000FE006000FE
+006000FE006000FE0041001300410013004100130041001300410013004100
+13004200120042001200420012004300120043001200440012004400110044
+0012004200180042001F004500260049002D004E00350054003F005A004C00
+5E005B0060006B005F007E005C0096005B00B8006100FE006100FF006100FF
+006100FF006100FF006100FF006100FF004300120043001200430012004300
+12004300120043001200440012004400110045001100450011004500110046
+00110046001100460011004400180043001E00470025004A002C004F003500
+55003F005B004C005F005A0061006B0061007E005E0094005C00B5006200FF
+006200FF006200FF006200FF006200FF006100FF006000FE00450011004500
+11004500110045001100450011004500110046001100460010004700100047
+001000480010004800100048001000490010004700170046001E0049002500
+4C002C005000340056003F005C004B0061005A0063006A0061007D005D0094
+005900B5005B00FE005A00FF005900FF005800FF005700FF005700FF005600
+FF004700100047001000470010004700100047001000480010004800100049
+000F0049000F004A000F004A000F004B000F004B000E004B000E004A001500
+49001D004A0024004E002B005200340057003E005A004A005C0059005B006A
+0058007D00540094005000B8005200FF005000FF004F00FF004E00FF004E00
+FF004D00FF004D00FF004A000F004A000F004A000F004A000F004A000F004A
+000F004B000F004C000E004C000E004D000E004D000E004E000D004E000D00
+4F000D004D0014004C001C004D0023004D002A004D0032004E003B00500047
+0051005700510068004F007D004B0095004800B7004800FF004700FF004600
+FE004500FE004500FE004400FE004400FE004D000E004D000E004D000E004D
+000E004D000E004E000E004E000D004F000D004F000D0050000D0050000C00
+51000C0051000C0052000C00500013004B001A00470021004500280045002F
+004500380046004400470054004600670046007C00420094004000B3003F00
+F3003E00F5003C00F4003C00F3003B00F2003B00F2003A00F10050000C0050
+000C0050000C0050000C0050000C0051000C0052000C0052000C0053000B00
+53000B0054000B0054000B0055000B0051000A004A0011004400180040001E
+023B00240739002B093B0036033D0043003C0052003B0064003B0079003900
+90003700AD003500E0003400E6003300E4003200E3003200E2003100E10031
+00E00054000B0054000B0054000B0054000B0054000B0055000B0055000B00
+56000A0057000A0057000A0058000A00550009004E0008004800070041000D
+013A0012073300180D2D001E122A0027132B00330E2D00400A2C004F072C00
+60062B0073052C0089032C00A5022B00CD012A00D5012900D3012800D20128
+00D2012700D1022700D10258000A0058000A0058000A0058000A0058000A00
+58000900590009005A0009005A0009005B000900530007004C000600440004
+003E000202370007062F000D0C2900131123001A15200024151E002F131D00
+3C101C004A0E1B005A0E1B006C0E1B00800D1C009A0B1E00BD071D00C8071C
+00C7071B00C6081A00C5081A00C5081900C5095C0008005C0008005C000800
+5C0008005C0008005D0008005D0008005E0008005A00070052000500470003
+00400001023B010003370400022D00020B250007111E000E15190016181500
+201811002B170D0036150B00421509005215080062160700751508008D140B
+00AD110B00BA100A00B9100900B8110800B8110700B7110700B71160000700
+600007006000070060000700600007006100070062000600590004004E0002
+00440101013F0300023A06000136080000330A00002705000B1A0101161200
+071A0C00101C06001A1D0201241C01022F1A00043C1800054C1600065D1400
+087014000886140006A3140006B3130006B2130007B2130007B2130008B212
+0008B212650005006500050065000500650005006500050063000400570002
+004C010002440500003F070000390A0000350C0000300E00002D100000220C
+000A140800140402001E00040B1D0008171A000B2316000E2F13000F3C1000
+104B0E00105D0D00126F0D0013840F0011A1100011B3100011B3100012B410
+0012B4100012B4100013B40F5F0002005F0002005F0002005F0002005F0002
+00570100014B050000440800003D0B0000370E0000321000002D1200002914
+0000261600001C14000810110010010C011900100D16001419120017250E00
+18310A00193E07001A4D06001B5E06001D6F06001D8308001CA00C001BB60C
+001BB60C001BB60C001BB60C001BB60C001BB60C5505000055050000550500
+0055050000550500004B090000430C00003B0F0000351200002F1400002A16
+000027180000231A0000201C0000181C00040A19000C00170411001B100E00
+1F1B0A00222605002333010023400100224F0100235E0200236E0400238206
+00219D0A001FB90C0020B90C0020B90C0020B90C0020B90C0020B90C490D00
+00490D0000490D0000490D0000490D00004110000039130000321600002D18
+0000281B0000241D0000201F00001D2100001A22000011230001051E000800
+2107080024100700261A06002725030028300100283E0100284D0100285C02
+00286C040028800600279B090025BB0B0025BB0B0025BB0B0025BB0B0025BB
+0B0025BB0B3F1500003F1500003F1500003F1500003F15000037180000301A
+00002A1D0000261F0000212100001D2300001925000015260000122700000D
+280000042500070024050800280E07002A1806002B2204002D2E02002F3B01
+002F4B01002E5A02002F6B03002E7F05002D9A06002BBE08002BBE08002BBE
+08002BBE08002BBE08002BBE08351C0000351C0000351C0000351C0000351C
+00002E1F000028210000232400001E2600001928000015290000132A000013
+2A0000132B00000F2B0000062A00050029030A002D0C07002E160600302004
+00322B030036380200374802003658020036690300367E03003498040034C2
+040034C3040034C3040034C3040034C3040034C4042C2400002C2400002C24
+00002C2400002C24000026260000202900001B2B0000162C0000142D000014
+2E0000142E0000142F0000142F000010300000082F0004002D020B00310A08
+0034130600351D0500382803003C340200404402003F5502003F6802003F7C
+01003E9801003FC601003FCE01003FCF01003FCF01003FCF01003FCF01232B
+0000232B0000232B0000232B0000232B00001D2D0000173000001531000015
+3200001532000015330000153300001534000016340000123500000A350003
+0031000D0036080A003A1107003C1A06003E24040043310400474004004852
+030048660200497C00004998000049C9000048DD000048DE000048DE000049
+DE000049DE001A3400001A3400001A3400001A3400001A3400001635000016
+36000016360000163700001738000017380000173900001739000017390000
+133B00000D3B00030238000D003C070C00410F080044180600462105004A2D
+05004E3C0500504E040052630300547A00005697000053C6000052EA000052
+EA000052EA000052EA000052EA00173A0000173A0000173A0000173A000017
+3A0000173B0000183C0000183C0000183D0000183E0000183E0000183F0000
+193F000019400000154100000F4200020440000C0043050D00490D0A004D16
+07004F1E060053290600573706005A4906005C5F0300607700006293010060
+BB00005DED00005DED00005DED00005EED00005EED00194100001941000019
+410000194100001941000019410000194200001A4300001A4400001A440000
+1A4500001A4600001A4600001A47000017480000114A00010749000A004B04
+0F00520B0B00581307005C1C06005F2606006333050065430600685904006C
+7100006E8C00006DB200006BEC00006BEC00006BEC00006BED00006CED001B
+4800001B4800001B4800001B4800001B4800001B4900001B4A00001B4A0000
+1C4B00001C4C00001C4D00001C4D00001C4E00001C4E000019510000145300
+000A5500080056020F005C080C00641009006B19060070230400722E030074
+3D0200765102007A6A00007E8600007EAE00007CFF00007CFF00007DFF0000
+7DFF00007DFF001D5000001D5000001D5000001D5000001D5000001D510000
+1D5200001D5300001D5300001D5400001E5500001E5600001E5600001E5700
+001B5A0000165D00000D6000060262000E0068050D00700C09007914060080
+1E0300842801008636000088490000896100008F7F000092A700008DFD0000
+8DFF00008DFF00008DFF00008DFF001E5900001E5900001E5900001E590000
+1E5900001F5A00001F5B00001F5C00001F5D00001F5E00001F5F0000205F00
+0020600000206100001D64000019690000116D0004087100090077010D0080
+070900890E060092150300982001009B2C00009D3E0000A0570000A5770000
+AC9D0000A2DE0000A1FD0000A1FD0000A1FD0000A1FC002063000020630000
+20630000206300002063000020640000216600002167000021680000216900
+00216A0000216B0000216B0000216C00001F7000001B770000167E00010E84
+0004068C000700930109009D060600AA0B0200B7130000C21F0000C92F0000
+CE470000D8660000DD890000DFB80000D2F80000D3F80000D3F90000D4F900
+22700000227000002270000022700000227000002271000022720000237300
+00237500002376000023770000237800002379000023790000217C00001C84
+0000188C0000139400000E9D000009A6000002B0000400BF020300D4080000
+E8150000F8260000FF350000FF5C0000FF740000FF9C0000FFB20000FFB200
+00FFB20000FFB2002379000023790000237900002379000023790000237900
+00237900002379000023790000237900002379000023790000237900002379
+0000217C00001D840000188C0000139400000E9C000009A5000002B0000400
+BE020300D2070100E7140000F7240000FF330000FF580000FF700000FF9400
+00FFB20000FFB20000FFB20000FFB200>
+<41001300410013004100130041001300410013004100130041001300410013
+00410013004100130041001300410013004100130041001300400016003E00
+1C004000230042002A00490032004F003B00550047005A0056005C0066005C
+007800590090005700B1005E00FD005E00FD005E00FD005E00FD005E00FD00
+5E00FD005E00FD004100130041001300410013004100130041001300410013
+00410013004100130041001300410013004100130041001300410013004100
+1300400015003E001C004000230042002A00490032004F003B00550047005A
+0055005C0066005C007800590090005700B0005E00FD005E00FD005E00FD00
+5E00FD005E00FD005E00FD005E00FD00410013004100130041001300410013
+00410013004100130041001300410013004100130041001300410013004100
+13004100130041001300400015003E001C004000230042002900490032004E
+003B0055004700590055005C0065005C00770059008F005700AE005E00FD00
+5E00FD005E00FD005E00FD005E00FD005E00FD005E00FD0041001300410013
+00410013004100130041001300410013004100130041001300410013004100
+130041001300410013004100130041001300400015003E001C004000230042
+002900490032004E003B0055004600590055005C0065005C00770059008E00
+5700AD005E00FD005E00FD005E00FD005E00FD005E00FD005E00FD005E00FD
+00410013004100130041001300410013004100130041001300410013004100
+1300410013004100130041001300410013004100130041001300400015003E
+001C004000230042002900490031004E003A0055004600590054005C006500
+5C00760059008D005700AB005E00FB005E00FD005E00FD005E00FD005E00FD
+005E00FD005E00FD0041001300410013004100130041001300410013004100
+13004100130041001300410013004100130041001300410013004100130041
+001300400015003E001C004000230042002900490031004E003A0054004600
+590054005C0064005C00760059008C005700AA005E00F6005E00FD005E00FD
+005E00FD005E00FD005E00FD005E00FD004100130041001300410013004100
+13004100130041001300410013004100130041001300410013004100130041
+0013004100130041001300400015003E001C00400022004200290049003100
+4E003A0054004500590053005C0064005C0075005A008B005700A8005D00EC
+005E00FF005D00FF005B00FF005A00FF005900FF005900FF00410013004100
+13004100130041001300410013004100130041001300410013004100130041
+00130041001300410013004100130041001300400015003F001C0040002200
+43002900490031004F003A00550045005A0053005C0063005A00750056008A
+005100A9005300EE005200FF005100FF005000FF004F00FF004E00FF004E00
+FF004100130041001300410013004100130041001300410013004100130041
+00130042001200420012004200120043001200430012004300120043001400
+41001B0042002200450028004A0030004E0039005100430053005100530062
+00510075004D008B004900AA004900E8004800FE004700FE004600FE004500
+FD004400FD004400FD00420012004200120042001200420012004200120043
+00120043001200440012004400110044001100450011004500110046001100
+460011004600130043001B00430021004200270044002E0046003600490041
+004A005000490061004800750045008D004100AA004000E0003E00F9003D00
+F8003C00F7003C00F7003B00F6003B00F60045001100450011004500110045
+00110045001100450011004600110046001100470010004700100047001000
+480010004800100049000F0047001200420018003E001F003D0025003D002C
+003E0034003F003E0040004E003F0060003E0074003C008C003900A8003700
+D6003500F0003400EF003300EE003300ED003200ED003200EC004800100048
+001000480010004800100048001000480010004900100049000F004A000F00
+4A000F004B000F004B000E004C000E0046000D0041000F003C00150037001B
+0333002108310028093500330335003E0034004D0033005E00320071003100
+88002F00A3002D00CB002C00E4002B00E3002A00E2002A00E1002900E00029
+00E0004B000E004B000E004B000E004B000E004B000E004B000E004C000E00
+4D000E004D000E004E000D004E000D004A000C0044000B003F000A003A000B
+00330010052D00160A29001D0E2600250F2700300B28003D0627004B042600
+5B0325006C022500810125009B012500BD002400D4002300D3002200D20021
+00D1002100D1002100D0004F000D004F000D004F000D004F000D004F000D00
+4F000D0050000D0051000C0051000C004F000B0047000A00410009003C0007
+0037000501310006032B000C092500120D200019111D0022111B002D0E1A00
+390C1800460A1700550A1600660916007909170090071800AF051900C50417
+00C4041700C4041600C3051500C3051500C20553000B0053000B0053000B00
+53000B0053000B0053000B0054000B0055000B004E000A00450008003F0006
+0038000401320002022E0001042B0102062200070C1C000D11170015131300
+1F130F0029120C00331109003F1007004D1005005D1105006F110500841007
+009F0E0800B60C0700B50C0600B40D0500B30D0500B30D0400B30D58000A00
+58000A0058000A0058000A0058000A0058000A00570009004C000700430005
+003B00030234010103300200032E0400022B06000125060005180101101000
+07150B00101705001A170201231600022D1400043912000648100007590E00
+086B0D00087F0E0007970E0006AF0E0007AF0D0007AF0D0008AF0D0008AF0D
+0008AF0D5800070058000700580007005800070058000700560007004B0005
+00400002023801000433040002300600012C090000290B0000250C00001F0C
+00041308000F0402001900050B1800081714000B2210000D2D0D000F3A0A00
+0F48080010590700116A0700127D080011950A0010AF0B0010AF0A0011AF0A
+0011AF0A0011AF0A0012AF094A0003004A0003004A0003004A0003004A0003
+00480002003F02000339050001330800002F0B00002A0D0000260F00002211
+00001F1300011A1300040E10000B000C011400100D100013190D0016240800
+172F0400183C0100184A00001859010018690300187C05001793090015B10B
+0015B10B0015B10B0015B10B0015B10B0015B10B4105000141050001410500
+0141050001410500013F06000038090000320C00002D0F0000281100002313
+0000201600001D1800001A190000151B0001091800070017040B001B100800
+1C1A06001D2404001D2E01001D3B00001C4900001C5801001C6703001C7905
+001B91090019B40C0019B50C0019B50C0019B50C0019B50C0019B50C390C00
+00390C0000390C0000390C0000390C0000370D0000301000002A1300002516
+0000211800001D1A00001A1C0000161E0000131F00000E1F0000061B000400
+1B0408001E0E08002017070021220400212C02002139000021470100215601
+002165030021780500208F08001EB30D001DB80C001DB80C001DB80C001DB8
+0C001DB80C30140000301400003014000030140000301400002E1500002817
+0000231A00001F1D00001A1F0000162100001222000011220000112300000F
+23000008210003001D020800220C080024150700251F0500262A0200263601
+0026450100265402002664030026760500268D070023B00B0023BA0B0023BA
+0B0023BA0B0023BA0B0023BA0B281B0000281B0000281B0000281B0000281B
+0000261C0000211F00001C2100001723000012250000122500001226000012
+26000012260000112700000A26000200210009002609080027120700291D05
+002B2703002C3401002D4201002C5202002D6203002D7404002C8B06002AAD
+090029BD090029BD090029BD090029BD090029BD0920230000202300002023
+000020230000202300001F2300001926000014280000122800001229000013
+29000013290000132A0000132A0000122A00000C2B000102280009002A0709
+002D1007002E1A06003024030033300200363F0100354F0200356002003572
+0300348A040033AC050032C2050032C2050032C2050033C2050033C205172A
+0000172A0000172A0000172A0000172A0000162A0000132B0000132C000014
+2C0000142D0000142D0000142E0000142E0000142E0000132F00000E300000
+042E0008002E050A00330E07003417060036210400392D03003E3B02003F4B
+02003E5D02003E7102003E8901003EAC01003ECD01003ECE01003ECE01003E
+CE01003ECE01142F0000142F0000142F0000142F0000142F0000142F000015
+30000015310000153100001532000015320000153300001533000016340000
+1534000010360000063400070033030C00380C08003B1506003D1E05004029
+04004537040048470400485B030049700100498800004AAE000049DE000049
+DE000049DE000049DE000049DE001635000016350000163500001635000016
+35000016350000163600001637000016370000173800001738000017390000
+17390000173A0000173A0000123C0000093B0006003A020D003F0A0A004412
+0700451B0600482505004D3205005042050052560400546D01005687000056
+AB000053EB000053EB000053EB000053EB000053EB00183B0000183B000018
+3B0000183B0000183B0000183C0000183C0000183D0000183E0000183F0000
+193F000019400000194000001941000019410000144300000C430005014201
+0E0047080C004C1008005019060053220600572E06005A3D06005D51050061
+6901006383000064A4000060E9000060EB000060EB000060EB000060EB0019
+43000019430000194300001943000019430000194300001A4400001A450000
+1A4500001A4600001A4700001B4700001B4800001B4800001B490000164B00
+000E4D0004034C000E0050060E00570D0A005D160700621F0500652A050068
+3805006A4A05006E620200717C0000729C00006FD0000070F2000070F20000
+70F2000070F3001B4B00001B4B00001B4B00001B4B00001B4B00001B4B0000
+1C4C00001C4D00001C4D00001C4E00001C4F00001C5000001D5000001D5100
+001D51000018550000115800030759000B005C030E00630A0B006B12070073
+1B050077260300793202007B4201007D590100817400008596000083D30000
+82FF000082FF000082FF000082FF001D5400001D5400001D5400001D540000
+1D5400001D5400001E5500001E5600001E5700001E5800001E5800001E5900
+001F5A00001F5B00001F5B00001A5F0000146400020B670008016A010E0071
+060B007A0D0800831505008A1F02008D2A00008F39000091500000946B0000
+9B8F000098C0000094FF000094FF000094FF000095FF001F5E00001F5E0000
+1F5E00001F5E00001F5E00001F5E0000205F00002060000020610000206200
+0020630000206400002065000021660000216600001C6C0000187200001077
+0004077C00090083010B008D060800970C0400A1140200A81F0000AC2D0000
+AD420000B45F0000BC850000BDAF0000B0F70000B0F70000B0F70000B0F700
+216A0000216A0000216A0000216A0000216A0000216A0000216B0000226D00
+00226E0000226F000022700000227100002272000022730000237400001F7B
+00001A830000158B0000109400000B9D000104A6000400B3010400C6050100
+DE0E0000EF1D0000FF2E0000FF4E0000FF6B0000FF8B0000FFB20000FFB200
+00FFB20000FFB2002378000023780000237800002378000023780000237800
+00237900002379000023790000237900002379000023790000237900002379
+0000237900001F7F00001B870000168F0000119700000CA0000006A9000201
+B5000400C5030200DE0C0000EE1C0000FE2C0000FF490000FF690000FF8300
+00FFB00000FFB20000FFB20000FFB200>
+<41001300410013004100130041001300410013004100130041001300410013
+00410013004100130041001300410013004100130041001300410013003F00
+19003F001F004100260046002E004C0036005200400057004E005B005E005C
+0070005A0086005800A3005C00E2005E00FD005E00FD005E00FD005E00FD00
+5E00FD005E00FD004100130041001300410013004100130041001300410013
+00410013004100130041001300410013004100130041001300410013004100
+1300410013003F0019003F001F004100260046002D004B0036005200400057
+004D005B005D005C006F005B0085005800A2005B00DB005E00FD005E00FD00
+5E00FD005E00FD005E00FD005E00FD00410013004100130041001300410013
+00410013004100130041001300410013004100130041001300410013004100
+13004100130041001300410013003F0018003F001F004100260046002D004B
+0035005100400057004D005B005D005C006F005B0084005800A1005A00D400
+5E00FD005E00FD005E00FD005E00FD005E00FD005E00FD0041001300410013
+00410013004100130041001300410013004100130041001300410013004100
+130041001300410013004100130041001300410013003F0018003F001F0041
+00260046002D004B0035005100400057004D005B005C005C006E005B008300
+5800A0005A00D0005E00FD005E00FD005E00FD005E00FD005E00FD005E00FD
+00410013004100130041001300410013004100130041001300410013004100
+1300410013004100130041001300410013004100130041001300410013003F
+0018003F001F004100250046002D004B0035005100400057004D005B005C00
+5C006E005B00820058009E005A00CD005E00FD005E00FD005E00FD005E00FD
+005E00FD005E00FD0041001300410013004100130041001300410013004100
+13004100130041001300410013004100130041001300410013004100130041
+001300410013003F0018003F001F004100250046002D004B00350051003F00
+57004C005B005C005C006D005B00820058009D005900CA005E00FD005E00FD
+005E00FD005E00FD005E00FD005E00FD004100130041001300410013004100
+13004100130041001300410013004100130041001300410013004100130041
+0013004100130041001300410013003F0018003F001F004100250045002D00
+4B00350051003F0057004C005B005B005C006C005B00810058009B005700C8
+005A00FF005900FF005700FF005600FF005500FF005400FF00410013004100
+13004100130041001300410013004100130041001300410013004100130041
+00130041001300410013004100130041001300410013003F0018003F001E00
+4100250045002C004B00350051003F0056004B0057005A0056006C00530081
+004E009D004C00CB004D00FF004C00FF004A00FE004900FE004800FD004800
+FD004100130041001300410013004100130041001300410013004100130041
+00130041001300410013004100130041001300410013004100130041001300
+3F0018003F001E004100250045002C00460033004B003D004D004B004C005A
+004B006D004900830044009E004200CA004100F9004000F8003F00F8003E00
+F7003D00F6003D00F600410013004100130041001300410013004100130041
+00130041001300410013004100130041001300410013004100130041001300
+41001300410013003F0018003D001E003C0024003C002B003E00320040003B
+004200490041005B0040006E003E0085003B00A0003800C8003600F2003500
+F1003400F1003300F0003300EF003200EF0041001300410013004100130041
+00130041001300410013004100130041001300410013004100130041001300
+4100130041001300410013003F0012003B00160037001C0035002300350029
+003600310037003B003700490036005A0035006E003300840031009F002F00
+C4002D00EB002C00EA002C00E9002B00E9002A00E8002A00E8004100130041
+00130041001300410013004100130041001300410013004200120042001200
+420012004300120043001200420011003D00100039000F0035001300310019
+022E001F052D0027052E0030022E003B002D0048002B0059002A006C002800
+810027009B002600BD002500E2002400E1002300E0002300DF002200DE0022
+00DE0044001200440012004400120044001200440012004400120044001100
+4500110045001100450011004500110040000F003B000E0037000D0033000B
+002E000F022A00150626001C092400240A24002E0624003A02230047012100
+57001F0067001E007A001E0092001D00B1001D00D4001C00D2001B00D1001B
+00D0001A00D0001A00CF004700100047001000470010004700100047001000
+4700100047001000480010004800100044000F003E000D0039000B0034000A
+00300008002C00070127000B05230011091E00180C1C00210B1A002B091800
+370716004305140051051300610412007304120088041300A2021400C30113
+00C1021200C0021100C0021000BF021000BE024B000F004B000F004B000F00
+4B000F004B000F004B000F004B000E004B000E0043000D003C000B00360009
+00310007012D0005022A000402250002031E0006071A000D0C1500140E1200
+1E0E0F00280C0B00310B09003C0B0600490B0400590C03006A0C03007D0B03
+00940A0500B2080400B1080300B0090200B0090200AF090201AF094F000D00
+4F000D004F000D004F000D004F000D004F000D004A000C0041000A003A0008
+00330006012E0004022A00020326010103210200031D0400031601010B0F00
+07100A001011050019110201221000022B0E0004360C0005450A0006550800
+0767070008780700078E080006AC080007AD080007AC070008AC070008AC07
+0008AC06440009004400090044000900440009004400090044000900400008
+0038000501300003022B00000429030003250500021F0700021D0900021B0A
+0002120800090302001500040C130008170E000A210B000C2C07000E370400
+0E4502000F5500000F6501000F7703000E8C05000CA807000CAC07000CAC07
+000CAC07000CAC07000CAC073A0003023A0003023A0003023A0003023A0003
+023A000302350002032F0100032C04000227070001220900011F0C00011B0E
+000218100002161100020D100006000D020E00100E0B001219070013230400
+132C010013370000134400001353000012630200127403001289060010A608
+000FAE08000FAE08000FAE08000FAE08000FAE083104000231040002310400
+023104000231040002310400022F0600012A090000250C0000200E00011D10
+000119130001161500011317000010180000071600020014040700160D0800
+1717070017210500172B020017360000164300001652000016610200167204
+001587070013A3090013AF0A0013AF0A0013B00A0013B00A0013B00A2B0C00
+002B0C00002B0C00002B0C00002B0C00002B0C0000280D0000231000001F13
+00011B16000017180000131A00000F1A00000E1B00000E1B0000091A000100
+16020800190B08001A1507001B1F05001B2903001B3401001A4100001A5001
+001A5F02001A7004001A85070018A20B0017B30B0017B30C0017B30C0017B3
+0C0017B30C2413000024130000241300002413000024130000241300002115
+00001D180000181A0000141C00000F1D00000F1D00000F1E00000F1E00000F
+1E00000B1D000001190007001C0907001E1208001F1C060020260300203201
+001F3F00001F4E01001F5D02001F6E04001F8307001DA00B001BB70C001CB7
+0C001CB70C001CB70C001CB70C1D1B00001D1B00001D1B00001D1B00001D1B
+00001D1B00001A1C0000151F00001020000010200000102000001021000010
+21000010210000102200000D220000031C0005001E06080021100800231A06
+0024240400252F0100253D0100244C0100255B0200256C040025810600239D
+0A0021BA0C0021BA0C0021BA0C0021BA0C0021BA0C15220000152200001522
+00001522000015220000152200001222000011230000112300001124000011
+240000112500001125000012250000122600000E2600000623000500210408
+00260D070027170600292104002A2D02002C3A01002B4901002B5902002C6A
+03002B7F05002A9B080028BC0A0028BD090028BD090028BD090028BD091226
+00001226000012260000122600001226000012260000122700001227000012
+28000012280000122800001329000013290000132A0000132A0000102A0000
+082A00040027020A002B0B08002D1407002E1E050030290300343601003546
+01003457020034680300347D03003399050031C1050031C2050032C2050032
+C2050032C205132B0000132B0000132B0000132B0000132B0000132B000013
+2B0000132C0000132C0000142D0000142D0000142D0000142E0000142E0000
+142F0000112F00000B2F0002012D010A003008090033120700351B06003726
+04003B3202003F4202003F5302003E6602003E7C01003D9801003ECB01003E
+CE01003ECE01003ECE01003ECE011430000014300000143000001430000014
+30000014300000153000001531000015310000153200001533000015330000
+163400001634000016350000133500000D3600020233000B0036060B003B0F
+07003C1806003F220500432E0400473D0400494F0400496403004A7B00004B
+9900004AD000004ADF00004AE000004AE000004AE000163600001636000016
+36000016360000163600001636000016370000163700001738000017390000
+17390000173A0000173A0000173B0000183B0000153C00000F3D0001053B00
+0A003D050D00420D090046150600481E06004C29050050380500534A050055
+600300577900005A97000056C9000055EC000055EC000055EC000055EC0018
+3D0000183D0000183D0000183D0000183D0000183D0000183E0000183E0000
+193F0000194000001941000019410000194200001942000019430000174400
+0012460001084500090045030F004B0A0B0051130700551B0600582606005C
+3306005E440600615A0400657300006790010065B9000063E8000063E80000
+64E8000064E8001A4500001A4500001A4500001A4500001A4500001A450000
+1A4600001A4700001B4700001B4800001B4900001B4900001B4A00001B4B00
+001C4B00001A4D0000154F00000B5000070151010F0057080D005E0F090064
+180600692205006C2E04006E3D040070520300746B00007889000077B50000
+76F9000076F9000076F9000076FA001C4E00001C4E00001C4E00001C4E0000
+1C4E00001C4E00001C4F00001C4F00001D5000001D5100001D5200001D5300
+001D5300001D5400001E5500001C570000175A00000F5D0005045F000D0064
+040D006B0B0A00741306007C1D030080280200823501008348000085620000
+8B8100008DAD000089FF000089FF000089FF000089FF001E5800001E580000
+1E5800001E5800001E5800001E5800001E5900001F5A00001F5B00001F5C00
+001F5D00001F5E00001F5E00001F5F0000206000001E6200001A670000136B
+00030A6F00080073010D007C060A00860D07008F150300961F0100992C0000
+9A3D00009D570000A3780000A9A200009FFA00009FFD00009FFD00009FFD00
+20640000206400002064000020640000206400002064000020650000216600
+00216700002168000021690000216A0000216B0000216C0000226D0000206F
+00001C760000177D000010840003098B000601920009009C040600A9090300
+B7110100C41D0000CD2D0000D4440000DD650000E28B0000F3E90000D8FC00
+00D9FD0000DAFD002272000022720000227200002272000022720000227200
+00227300002374000023760000237700002378000023790000237900002379
+000023790000227A00001E820000198A0000149200000F9B00000AA4000003
+AE000300BC010300D0060100E6130000F7240000FF340000FF5C0000FF7600
+00FF9F0000FFB20000FFB20000FFB200>
+<41001300410013004100130041001300410013004100130041001300410013
+00410013004100130041001300410013004100130041001300410013004000
+15003F001B004000220042002900490031004E003B00550047005A0056005C
+0068005C007B00580096005800C1005E00FD005E00FD005E00FD005E00FD00
+5E00FD005E00FD004100130041001300410013004100130041001300410013
+00410013004100130041001300410013004100130041001300410013004100
+130041001300400015003F001B004000220042002900490031004E003B0055
+0047005A0056005C0067005C007B00580095005800BF005E00FD005E00FD00
+5E00FD005E00FD005E00FD005E00FD00410013004100130041001300410013
+00410013004100130041001300410013004100130041001300410013004100
+1300410013004100130041001300410014003F001B00400022004200290049
+0031004E003A00550047005A0055005C0067005C007A00580094005800BD00
+5E00FD005E00FD005E00FD005E00FD005E00FD005E00FD0041001300410013
+00410013004100130041001300410013004100130041001300410013004100
+13004100130041001300410013004100130041001300410014003F001B0040
+00220042002900490031004E003A0055004600590055005C0066005C007900
+590093005800BA005E00FD005E00FD005E00FD005E00FD005E00FD005E00FD
+00410013004100130041001300410013004100130041001300410013004100
+13004100130041001300410013004100130041001300410013004100130041
+0014003F001B004000220042002900490031004E003A005400460059005500
+5C0066005C007900590092005800B8005E00FD005E00FD005E00FD005E00FD
+005E00FD005E00FD0041001300410013004100130041001300410013004100
+13004100130041001300410013004100130041001300410013004100130041
+00130041001300410014003F001B004000220042002800490031004E003A00
+54004600590054005C0065005C007800590091005800B5005E00FD005E00FD
+005E00FD005E00FD005E00FD005E00FE004100130041001300410013004100
+13004100130041001300410013004100130041001300410013004100130041
+001300410013004100130041001300410014003F001B004000220042002800
+490030004E00390054004500590054005C0065005C007700560090005300B6
+005600FF005400FF005300FF005200FF005100FF005000FF00410013004100
+13004100130041001300410013004100130041001300410013004100130041
+0013004100130041001300410013004100130041001300410014003F001B00
+4000210042002800480030004D003900510044005300530053006400510079
+004C0092004900B7004900FE004700FD004600FC004500FB004400FB004300
+FB004100130041001300410013004100130041001300410013004100130041
+00130041001300410013004100130041001300410013004100130041001300
+410014003F001B00400021004000280041002F004400370048004200480052
+004700650046007A00420094003F00B7003D00F6003B00F5003A00F5003900
+F4003900F4003800F400410013004100130041001300410013004100130041
+00130041001300410013004100130041001300410013004100130041001300
+4100130041001300410014003B001A00390020003800260039002D003B0036
+003D0041003D0052003B0065003A007B00360095003400B7003200EE003100
+ED003000EC002F00EC002E00EC002E00EB0041001300410013004100130041
+00130041001300410013004100130041001300410013004100130041001300
+4100130041001300410013003D001200390012003500180032001F00310025
+0131002D003200360031004200300053002E0066002C007B002B0094002900
+B5002800E6002700E6002600E5002500E5002500E4002400E4004100130041
+00130041001300410013004100130041001300410013004100130041001300
+4100130041001300410013003D0012003900110035001000310010002E0016
+002B001D02290023032A002D00290037002600440025005400230066002100
+7900200090002000AF001F00DA001E00DD001D00DC001D00DB001C00DB001C
+00DA0041001300410013004100130041001300410013004100130041001300
+4100130041001300410013003F0012003A0011003500100030000E002D000D
+002A000E002700140124001B042200230422002D00200038001E0045001B00
+5400190063001700750017008A001600A4001700CA001600D0001500CF0014
+00CE001400CD001400CC004100130041001300410013004100130041001300
+410013004100130041001300410013003B0011003600100031000E002D000D
+002A000C0027000A0024000A01200011041D0018061B00210619002B031600
+35021400400112004E0110005E010F006E010E0080010E0097000E00B6000D
+00BE000C00BC000C00BB000B00BA000B00B900430012004300120043001200
+43001200430012004300120043001200400011003A000F0034000D002F000C
+002B000A0027000901230007011E0006011B00060218000D07150015091200
+1E080E0027070B002F05090039050600460504005406020067060201770502
+018C050200A7050100AE050000AD050001AD050001AC050001AC043E000F00
+3E000F003E000F003E000F003E000F003E000F003E000F0039000D0032000B
+002D00090029000701230005021D0004031A00020317010102140101040E00
+070B0A00100C0500190B0300220A01012A0900033406000542040006500300
+06640200077401000787020006A1030006AB030006AB030006AB030006AB03
+0006AB0336000A0036000A0036000A0036000A0036000A0036000A0036000A
+00300008002B000602260004021D0002041901000317030003150500021307
+0003110800040202001100040D0C0007170800092105000B2A01000B340000
+0A4100000A5000000A6100000A7101000A840300089D040008AB040008AB04
+0008AB040008AB040008AB042D0004022D0004022D0004022D0004022D0004
+022D0004022D00040229000203200101041C0300031906000217080002140A
+0003110C00020F0E00020B100001000E0206000E0E07000E1706000E200400
+0E2902000E3300000D3F00000D4E00000D5E00000D6F02000D8204000B9A05
+000AAB05000AAB06000AAB06000AAB06000AAB062603000326030003260300
+0326030003260300032603000326030003200500021C080002190B0002150D
+0002121000020F1200010B1300000A1400000A1400000011010600110B0700
+11150700111E05001127020011310000113D0000114C0000115B0100106C02
+00107F04000F9707000DAD07000DAD07000DAD07000DAD07000DAD071F0A00
+011F0A00011F0A00011F0A00011F0A00011F0A00011F0A00011B0D00021710
+000213130001101500000B1600000B1600000B1600000C1700000B17000002
+130006001408080015120700151C06001525030015300100153C0000144A00
+0014590100146A0200147D05001395080011AF090011AF090011AF090011AF
+090011AF091912000119120001191200011912000119120001191200011912
+000116150001111700000C1800000D1900000D1900000D1900000D1A00000D
+1A00000D1A000004170004001706070018100800191A06001A2304001A2E01
+00193A0000194800001857010019670300187A05001793090015B10B0015B1
+0B0015B20B0015B20B0015B20B121A0000121A0000121A0000121A0000121A
+0000121A0000121A00000E1B00000E1B00000E1C00000E1C00000E1C00000E
+1D00000F1D00000F1D00000F1D0000071A000300190307001B0D08001D1707
+001E2105001E2C02001E3800001D4600001D5501001E6503001E7805001D90
+09001AB50C001AB60C001AB60C001AB60C001AB60C0F1E00000F1E00000F1E
+00000F1E00000F1E00000F1E00000F1E00000F1E00000F1F0000101F000010
+200000102000001020000010210000102100001021000009200002001B0108
+001F0A070021140700231E0500232902002435010023440100235301002463
+030024750500238E080020B40C0020B90C0020B90C0020B90C0020B90C1122
+00001122000011220000112200001122000011220000112200001122000011
+23000011230000112400001124000011240000112500001125000012250000
+0C25000002200008002308080026110700281B0600292603002A3201002B41
+01002A5102002B6103002B7304002A8C060028B10A0027BC0A0027BC0A0027
+BC0A0027BC0A12260000122600001226000012260000122600001226000012
+26000012270000122700001228000012280000122900001329000013290000
+132A0000132A00000E2B00000428000700290509002C0E07002D1806002F23
+0400322E0200353D0100344D0200345E020034710300338A040032AE050031
+C1050031C2050031C2050032C205132B0000132B0000132B0000132B000013
+2B0000132B0000132B0000132C0000132C0000142D0000142D0000142E0000
+142E0000142E0000142F0000142F00000F300000072F0005002D030B00320C
+080034150600361F0500392A03003E380200404902003F5B03003F7002003F
+88010040AF01003FCF01003FCF01003FCF01003FCF01153100001531000015
+31000015310000153100001531000015310000153100001532000015330000
+153300001634000016340000163500001635000016360000123700000A3600
+040034010D0039090A003D1207003E1B060041260400463304004A4404004A
+5803004B6E01004D8800004DB000004BE200004BE200004BE200004BE30017
+38000017380000173800001738000017380000173800001738000017380000
+17390000173A0000173A0000173B0000183C0000183C0000183D0000183D00
+00143E00000D3F0004023D010D0040070C0046100800491806004C22050050
+2E0500543E060056520500596B01005C8500005CAA000058ED000058ED0000
+58ED000058ED00194000001940000019400000194000001940000019400000
+19400000194000001941000019420000194300001A4300001A4400001A4400
+001A4500001A45000016470000104900020448000C004B050E00510D0A0057
+1507005B1F06005E2A060061380600644B0500686402006B7F00006CA20000
+68E8000068E9000069E9000069E9001B4800001B4800001B4800001B480000
+1B4800001B4800001B4800001B4900001B4A00001B4B00001C4C00001C4C00
+001C4D00001C4E00001C4E00001C4F00001951000013540001095500090057
+020F005E090C00661108006D1B0500712604007432030076430200785B0200
+7D7600007F9A00007DE600007DFF00007DFF00007EFF001D5200001D520000
+1D5200001D5200001D5200001D5200001D5200001D5300001D5400001E5500
+001E5600001E5700001E5800001E5800001E5900001F5A00001B5D00001661
+00010D6400070266000E006D050C00760C09007F140500861E02008A2A0100
+8C3900008D500000916C00009893000093CF000092FF000092FF000092FF00
+1F5E00001F5E00001F5E00001F5E00001F5E00001F5E00001F5E00001F5F00
+00206000002061000020620000206300002064000020650000216500002166
+00001E6A00001970000012750003097B00080181010B008B050900950B0500
+9F130200A71D0000AB2C0000AC400000B45F0000BC870000BCBB0000B0F800
+00B0F70000B0F700216C0000216C0000216C0000216C0000216C0000216C00
+00216C0000226D0000226E0000226F00002270000022710000227200002373
+00002374000023750000207B00001C830000178B0000129500000D9E000007
+A8000101B4000400C4030200DD0C0000ED1C0000FE2C0000FF4E0000FF6C00
+00FF920000FFB20000FFB20000FFB200>
+<41001300410013004100130041001300410013004100130041001300410013
+00410013004100130041001300410013004100130041001300410013004100
+13003F0018003F001E004100250046002D004B0035005200400058004E005B
+005F005C0073005A008B005700AE005E00FD005E00FD005E00FD005E00FD00
+5E00FD005E00FD004100130041001300410013004100130041001300410013
+00410013004100130041001300410013004100130041001300410013004100
+130041001300410013003F0018003F001E004100250045002D004B00350051
+00400057004E005B005F005C0072005A008A005700AC005E00FD005E00FD00
+5E00FD005E00FD005E00FD005E00FD00410013004100130041001300410013
+00410013004100130041001300410013004100130041001300410013004100
+1300410013004100130041001300410013003F0017003F001E004100250045
+002D004B0035005100400057004D005B005E005C0071005A0089005700AA00
+5E00FD005E00FD005E00FD005E00FD005E00FD005E00FD0041001300410013
+00410013004100130041001300410013004100130041001300410013004100
+13004100130041001300410013004100130041001300410013003F0017003F
+001E004100250045002C004B0035005100400057004D005B005E005C007100
+5A0088005700A9005E00FD005E00FD005E00FD005E00FD005E00FD005E00FD
+00410013004100130041001300410013004100130041001300410013004100
+13004100130041001300410013004100130041001300410013004100130041
+0013003F0017003F001E004100250045002C004B00350051003F0057004D00
+5B005D005C0070005A0087005800A7005E00FD005E00FD005E00FD005E00FD
+005E00FD005E00FD0041001300410013004100130041001300410013004100
+13004100130041001300410013004100130041001300410013004100130041
+0013004100130041001300400017003F001E004100250045002C004B003400
+51003F0057004C005B005C005C006F005A0086005800A5005E00F9005E00FD
+005E00FF005C00FF005B00FF005A00FF004100130041001300410013004100
+13004100130041001300410013004100130041001300410013004100130041
+00130041001300410013004100130041001300400017003F001E0041002500
+45002C004B00340051003F0057004C005B005C0059006E00550085005000A7
+005200F5005000FF004F00FF004D00FF004C00FF004B00FF00410013004100
+13004100130041001300410013004100130041001300410013004100130041
+00130041001300410013004100130041001300410013004100130040001700
+3F001E004000240044002C00490034004C003D004F004B004E005B004D0070
+004A0087004600A8004400EA004300FA004100F9004000F9003F00F8003E00
+F7004100130041001300410013004100130041001300410013004100130041
+00130041001300410013004100130041001300410013004100130041001300
+41001300400017003E001D003C0024003D002A003F00320041003B0043004A
+0042005C00410071003F008A003B00A9003800E0003700F3003500F2003400
+F1003400F0003300EF00410013004100130041001300410013004100130041
+00130041001300410013004100130041001300410013004100130041001300
+4100130041001300400012003B00160037001C003500220035002900360031
+0036003B003600490036005D003400710031008A002F00A9002D00D8002C00
+EA002B00E9002A00E9002900E8002900E80041001300410013004100130041
+00130041001300410013004100130041001300410013004100130041001300
+41001300410013003F0012003B001100370010003300140030001A002D0020
+022D0028012D0031002C003C002A004B0029005D0027007100250088002400
+A6002300D0002200E2002100E1002100E1002000E0002000DF004100130041
+00130041001300410013004100130041001300410013004100130041001300
+4100130041001300400012003B0011003600100032000F002F000E002C0012
+002900180226001F04250027022500320023003E0020004C001E005D001C00
+6F001B0084001A009E001A00C3001900D7001900D5001800D4001700D30017
+00D30041001300410013004100130041001300410013004100130041001300
+4100130041001300410013003C0011003700100032000F002E000E002B000D
+0028000C0025001001220017041F001E051E0027021C0032001A003E001700
+4C0015005B0013006B0011007E00110095001100B4001000C8001000C6000F
+00C5000E00C4000E00C3004100130041001300410013004100130041001300
+4100130041001300410013003F0012003900110033000F002E000E002A000D
+0027000C0024000B0021000A001E000E021B00150418001E04170027011400
+310011003B000E0048000C0057000A0068000900780008008C000800A70008
+00B6000700B5000600B4000600B3000500B2003C0012003C0012003C001200
+3C0012003C0012003C0012003C0012003B001100350010002F000E002B000D
+0027000C0023000A001F0009001C0008001900070016000B03130014041100
+1D030E0026010C002E00090037000600440004005000020064000100730001
+01850000019F000001AC000002AC000002AC000002AC000002AC0032000F00
+32000F0032000F0032000F0032000F0032000F0032000F0031000F002C000D
+0028000C0023000A001F0009001B0007001700060114000401110003010E00
+0704090011060600190403002103010029030002310100033E0000034C0000
+036100000370000003810000039A000003AB010003AB010003AB010003AB01
+0003AB012B000B002B000B002B000B002B000B002B000B002B000B002B000B
+002A000B00250009011F0007011A0005011600030212000202100101020F03
+00020D0400020101000D00030F040005160300051F02000528010005300000
+053B0000054B0000055E0000066D0000057E01000596010004AB020004AB02
+0004AB020004AB020004AB0222000601220006012200060122000601220006
+012200060122000601200006021A0003021601010213020003110400020F06
+00020C090002070D0001060E0000010D010300090C050008140500081D0300
+08260200082F0000083A00000849000008590000086A0000087B0100079103
+0006AB030006AB030006AB030006AB030006AB031801010318010103180101
+03180101031801010318010103180101031802010315040002120700030E0A
+00030B0D000207100000071000000710000007100000030F0002000D090600
+0C1306000C1C04000C2402000C2D01000C3800000B4600000B5600000B6701
+000B7902000A8E040009AB050009AB050009AB050009AB050009AB05150900
+0315090003150900031509000315090003150900031509000314090003100D
+00020C10000108120000091200000912000009120000091200000913000005
+11000200100606000F1007000F1A060010230300102C01000F3700000F4400
+000F5400000F6401000E7603000E8B05000CA906000CAC06000CAC06000CAC
+06000CAC060F1200010F1200010F1200010F1200010F1200010F1200010F12
+00010E1200010A1400000A1400000A1400000A1500000B1500000B1500000B
+1500000B160000071400020012030600130D08001317070014210500142A02
+0013350000134200001351000013610100127303001288060010A708000FAE
+08000FAE08000FAE080010AE080B1600000B1600000B1600000B1600000B16
+00000B1600000B1600000B1600000C1700000C1700000C1800000C1800000C
+1800000D1800000D1900000D1900000A1800010115010700160A0800181407
+00181E0500182803001833010018400000174F0000175F0200177004001786
+070015A40A0014B00A0014B00A0014B00A0014B00A0D1A00000D1A00000D1A
+00000D1A00000D1A00000D1A00000D1A00000D1A00000E1A00000E1B00000E
+1B00000E1B00000E1C00000E1C00000E1C00000E1D00000C1C000002180006
+001A0807001B1108001D1B06001D2503001D3101001D3E00001C4D01001C5D
+02001C6E04001C8307001AA20B0019B50C0019B50C0019B50C0019B50C0F1E
+00000F1E00000F1E00000F1E00000F1E00000F1E00000F1E00000F1E00000F
+1E00000F1F00000F1F0000101F000010200000102000001020000010210000
+0E210000051C0004001C050800200E08002218060023230400232E0200233B
+0000224A0100235A0200236B040023810600219F0A001FB90C001FB90C001F
+B90C001FB90C10220000102200001022000010220000102200001022000010
+22000011220000112200001123000011230000112400001124000011240000
+112500001125000010250000082400030020020900250B0700261507002820
+0500292B02002B3801002A4801002A5802002B6903002A7E0500299C080027
+BC0A0027BC0A0027BC0A0027BC0A1227000012270000122700001227000012
+27000012270000122700001227000012270000122800001228000012290000
+1329000013290000132A0000132A0000112A00000B2A000202280109002B08
+08002D1207002E1C0500302703003334020036430100355502003567030035
+7C0300339A040032C2050032C2050032C2050032C205132C0000132C000013
+2C0000132C0000132C0000132C0000132C0000132C0000142C0000142D0000
+142D0000142E0000142E0000142F0000142F000014300000133000000D3100
+01032F00090030060A00350F070036180600382304003C2F0300413E030041
+50030040640200417B0100409A010041D2010041D2010041D2010041D20115
+32000015320000153200001532000015320000153200001532000015320000
+15330000163400001634000016350000163500001636000016360000163700
+001537000010390000063700080037040C003C0C090040150600411F050045
+2A04004A3904004C4B04004D6103004F7A0000509A00004ED900004EE50000
+4EE500004EE600173A0000173A0000173A0000173A0000173A0000173A0000
+173A0000173A0000173B0000183B0000183C0000183D0000183D0000183E00
+00183E0000193F00001840000012410000094100070040020E00450A0B004B
+1207004E1B06005125060055330600584506005B5B04005F76000061950100
+5DC900005CED00005DED00005DED0019430000194300001943000019430000
+194300001943000019430000194300001A4400001A4400001A4500001A4600
+001A4600001B4700001B4800001B4800001A490000154C00000D4D0005014C
+000F0051070D00580F09005E18060062220500652E0500683D05006B540400
+6F6E0000728C000070BB00006FF1000070F2000070F2001C4C00001C4C0000
+1C4C00001C4C00001C4C00001C4C00001C4C00001C4D00001C4D00001C4E00
+001C4F00001D5000001D5100001D5100001D5200001D5300001D5400001857
+0000115A0004065C000C0060040E00670B0A0070130700771D04007C280200
+7D3501007F490000826300008784000088B6000085FF000086FF000086FF00
+1E5800001E5800001E5800001E5800001E5800001E5800001E5800001E5800
+001E5900001F5A00001F5B00001F5C00001F5D00001F5D00001F5E00001F5F
+00001F6000001B650000156900020C6D00070271000D0079050B00830C0700
+8D140400941E0100972B0000993C00009B570000A27A0000A6AA00009DFE00
+009DFE00009DFE002065000020650000206500002065000020650000206500
+002065000021650000216600002168000021690000216A0000216B0000216C
+0000226C0000226D0000226E00001D750000197C0000138400010B8B000503
+930008009B030700A9080300B80F0100C61A0000D22A0000E1410000E66500
+00E98C0000E2FF0000E0FF0000E1FF00>
+<41001300410013004100130041001300410013004100130041001300410013
+00410013004100130041001300410013004100130041001300410013004100
+1300410014003F001B004000210042002800490031004E003B00550047005A
+0057005C0069005B00800058009F005D00E8005E00FD005E00FD005E00FD00
+5E00FD005E00FD004100130041001300410013004100130041001300410013
+00410013004100130041001300410013004100130041001300410013004100
+13004100130041001300410014003F001B004000210042002800490031004E
+003A00550047005A0057005C0069005B007F0058009E005B00DE005E00FD00
+5E00FD005E00FD005E00FD005E00FD00410013004100130041001300410013
+00410013004100130041001300410013004100130041001300410013004100
+130041001300410013004100130041001300410014003F001A004000210042
+002800490031004E003A00550047005A0056005C0068005B007E0058009C00
+5A00D5005E00FD005E00FD005E00FD005E00FD005E00FD0041001300410013
+00410013004100130041001300410013004100130041001300410013004100
+1300410013004100130041001300410013004100130041001300410014003F
+001A004000210042002800490030004E003A00550046005A0056005C006800
+5C007D0058009B005A00D0005E00FD005E00FD005E00FD005E00FD005E00FD
+00410013004100130041001300410013004100130041001300410013004100
+13004100130041001300410013004100130041001300410013004100130041
+001300410013003F001A003F00210042002800480030004E003A0054004600
+5A0055005C0067005C007C00580099005900CC005E00FD005E00FD005E00FD
+005E00FD005E00FD0041001300410013004100130041001300410013004100
+13004100130041001300410013004100130041001300410013004100130041
+0013004100130041001300410013003F001A003F0021004200280048003000
+4E00390054004600590055005C0067005C007B00580098005800C9005B00FF
+005900FF005700FF005600FF005500FF004100130041001300410013004100
+13004100130041001300410013004100130041001300410013004100130041
+00130041001300410013004100130041001300410013003F001A003F002100
+42002800480030004D00390054004500560054005600660053007C004D0099
+004B00CC004B00FF004A00FE004800FD004700FD004600FC00410013004100
+13004100130041001300410013004100130041001300410013004100130041
+00130041001300410013004100130041001300410013004100130041001300
+3F001A003F0021004100270042002E00460037004A0043004A005400490067
+0047007E0042009B004000CA003E00F7003C00F5003B00F5003A00F5003900
+F4004100130041001300410013004100130041001300410013004100130041
+00130041001300410013004100130041001300410013004100130041001300
+41001300410013003C0019003A001F00380026003A002D003C0036003E0042
+003E0053003C0068003A00800037009C003400C8003200EE003100ED003000
+EC002F00EC002E00EB00410013004100130041001300410013004100130041
+00130041001300410013004100130041001300410013004100130041001300
+41001300410013003D0012003A0011003500170032001E003100240131002C
+003100360031004200300054002E0068002C007F002A009B002900C3002700
+E6002600E5002500E4002500E4002400E30041001300410013004100130041
+00130041001300410013004100130041001300410013004100130041001300
+41001300410013003D0012003900110034000F0031000F002E0015002A001C
+022800230429002C012800370026004400240055002100670020007C001F00
+97001E00BB001E00DD001D00DB001C00DA001B00D9001B00D8004100130041
+00130041001300410013004100130041001300410013004100130041001300
+41001300410013003E0012003900110034000F0030000E002C000D0029000D
+002600130123001A042100220421002C001E0038001C004500190055001700
+65001500780015008F001500AE001400CF001400CD001300CC001200CA0012
+00CA0041001300410013004100130041001300410013004100130041001300
+4100130041001300400012003A00110034000F0030000E002C000D0028000C
+0025000B0022000A001F0012031C0019041A00220319002C00160037001300
+4300100052000E0062000D0073000C0087000B00A1000B00BD000A00BC000A
+00BA000900B9000800B8004000120040001200400012004000120040001200
+4000120040001200400012003C0011003600100030000E002C000D0028000C
+0024000B0021000A001D0009001A0008001700100415001804120022021000
+2B000D0034000A003F0008004D0006005E0005006E0003007F000200980002
+00AE000201AD000101AD000101AD000101AC00350010003500100035001000
+350010003500100035001000350010003500100032000F002D000D0028000C
+0024000B0020000A001C0008001800070015000600130005000F000E040C00
+18030A0020010700280004002F00020039000100480000015B0000016C0000
+017C00000195000001AC000001AC000001AC000001AC000001AC002C000D00
+2C000D002C000D002C000D002C000D002C000D002C000D002C000D0029000C
+0025000B0020000A001B0008001700070014000600110004000F0003000D00
+020006000E020300150101001D000000260000002D00000037000000470000
+015A0000016B0000017B00000293000001AB000001AC000001AC000001AC00
+0001AC0024000B0024000B0024000B0024000B0024000B0024000B0024000B
+0024000B0021000A001C0008001700070013000500100004000E0002000C00
+0100060000000000000000000E000000140000001D000000250000002C0000
+003600000146000001590000016A000002790000028F000002A9000002AC00
+0002AC000002AC000002AC001A0008001A0008001A0008001A0008001A0008
+001A0008001A0008001A0008001800070013000501100003010E0102010B02
+00010204000002050000020600000206000000030C020003120200031B0100
+03240100032B00000335000003440000045400000467000004760000048B00
+0003A6010003AB010003AB010003AB010003AB011100020211000202110002
+021100020211000202110002021100020211000202100101020E0300010905
+0002040B0000040C0000040C0000040D0000040D0000050D00000009070300
+061104000619030006220200062A0100063400000641000007500000076300
+00077401000687010005A3020005AB020005AB020005AB020005AB020C0700
+020C0700020C0700020C0700020C0700020C0700020C0700020C0700020A0A
+0002050E0000050E0000060E0000060F0000060F0000060F0000060F000007
+0F0000000D0304000A0E06000A1705000A2003000A2901000A3200000A3F00
+000A4E00000A6000000A71010009840200089F040007AB040007AB040007AB
+040007AB040710000007100000071000000710000007100000071000000710
+00000710000007100000071000000810000008110000081100000811000008
+110000081200000912000001100104000E0B07000E1506000E1E04000E2702
+000E3100000E3D00000D4C00000D5C00000D6D02000D8104000B9A05000AAB
+06000AAB06000AAB06000AAB06091200000912000009120000091200000912
+000009120000091200000912000009130000091300000A1300000A1300000A
+1400000A1400000A1400000A1500000B150000031200040011080700121207
+00121C060012250300122F0100123B00001249000011590100116A0200117E
+0400109707000EAD08000EAD08000EAD08000EAD080B1600000B1600000B16
+00000B1600000B1600000B1600000B1600000B1600000B1600000B1600000C
+1700000C1700000C1700000C1800000C1800000C1800000C18000005160003
+0015050700160F08001719060017230400172D010017390000164700001656
+010016670200167B05001594080013AF0A0013B00A0013B00A0013B00A0D19
+00000D1900000D1900000D1900000D1900000D1900000D1900000D1900000D
+1A00000D1A00000E1A00000E1B00000E1B00000E1B00000E1C00000E1C0000
+0E1C0000081A000200180207001A0B08001C1607001C2005001D2A02001C36
+00001C4400001C5401001C6403001C7805001B91090018B40C0018B40C0018
+B40C0018B40C0F1D00000F1D00000F1D00000F1D00000F1D00000F1D00000F
+1D00000F1D00000F1E00000F1E00000F1F00000F1F0000101F000010200000
+1020000010200000102000000B200001021B0107001E09070020120800221D
+0600232703002334010022420100225201002262030023750500228F08001F
+B90C001FB90C001FB90C001FB90C1122000011220000112200001122000011
+22000011220000112200001122000011220000112300001123000011240000
+11240000112400001125000011250000122500000D26000004220006002205
+0800260F070027190600292404002A3002002B3E01002A4F01002B6002002B
+7304002A8C060028B40A0027BC0A0027BC0A0028BC0A122700001227000012
+27000012270000122700001227000012270000122700001227000012280000
+122800001329000013290000132A0000132A0000132A0000132B00000F2B00
+00072A00050028030A002D0C07002E15060030200400322C0200363A010037
+4B0200365D020036700300358A030034B2040034C3040034C3040034C30414
+2D0000142D0000142D0000142D0000142D0000142D0000142D0000142D0000
+142D0000142E0000142E0000142F0000142F00001430000015300000153100
+0015310000123200000A320003002F010C003309090037120600381C05003B
+270400403403004445030043590300436E02004389000045B5000044D60000
+44D6000044D700163400001634000016340000163400001634000016340000
+16340000163400001634000016350000163600001636000016370000173800
+00173800001739000017390000143A00000E3A00020238000C003B070C0040
+0F080043180600452205004A2F04004E3F050050540400526C020054870000
+54B2000051E9000051E9000051E900183D0000183D0000183D0000183D0000
+183D0000183D0000183D0000183D0000183D0000183E0000183E0000193F00
+00194000001940000019410000194200001942000017430000114500010643
+000B0045040E004B0C0A0051150700541E0600572906005B3806005E4C0600
+626602006582000065A8000062EA000062E9000062E9001A4600001A460000
+1A4600001A4600001A4600001A4600001A4600001A4600001A4700001B4800
+001B4800001B4900001B4A00001B4B00001C4B00001C4C00001C4C0000194E
+0000145100000A5200080053020F0059090C0061110800681A05006C250400
+6E32040070430400745C0200787900007A9F000078FC000078FC000079FC00
+1D5100001D5100001D5100001D5100001D5100001D5100001D5100001D5100
+001D5200001D5300001D5400001E5400001E5500001E5600001E5700001E58
+00001E5800001C5A0000175F00000F6200050464000D006A040D00720B0900
+7C140500831E0300872A0100893900008A5000008E6E0000959700008FED00
+008FFF00008FFF001F5E00001F5E00001F5E00001F5E00001F5E00001F5E00
+001F5E00001F5E00001F5F0000206000002061000020620000206300002064
+00002065000021650000216600001F6900001A6F0000147500020B7A000702
+80000B0089040900930A06009E110200A71C0000AC2A0000AC3F0000B55F00
+00BE8A0000B9CD0000B0F70000B1F700>
+] 4 { dup 0.1 lt { 1.2 mul 0.02 sub } if
+ dup 0 lt { pop 0 } if
+ } bind dup dup dup ]
+/RenderingIntent (Perceptual)
+>>
+setcolorrendering
diff --git a/crd/2300w-1200@150-l250-kx,ucr100,75-per.crd b/crd/2300w-1200@150-l250-kx,ucr100,75-per.crd
new file mode 100644
index 0000000..01770ca
--- /dev/null
+++ b/crd/2300w-1200@150-l250-kx,ucr100,75-per.crd
@@ -0,0 +1,4684 @@
+<<
+/ColorRenderingType 1
+/BlackPoint [0.000000 0.000000 0.000000]
+/WhitePoint [0.964200 1.000000 0.824900]
+% Bradford Cone Space
+/MatrixPQR [0.8951 -0.7502 0.0389 0.2664 1.7135 -0.0685 -0.1614 0.0367 1.0296 ]
+/RangePQR [ -0.5 2 -0.5 2 -0.5 2 ]
+% VonKries-like transform in Bradford Cone Space
+/TransformPQR [
+{exch pop exch 3 get mul exch pop exch 3 get div} bind
+{exch pop exch 4 get mul exch pop exch 4 get div} bind
+{exch pop exch 5 get mul exch pop exch 5 get div} bind
+]
+/EncodeLMN [
+{ 0.964200 div dup 0.008856 le {7.787 mul 16 116 div add}{1 3 div exp} ifelse } bind
+{ 1.000000 div dup 0.008856 le {7.787 mul 16 116 div add}{1 3 div exp} ifelse } bind
+{ 0.824900 div dup 0.008856 le {7.787 mul 16 116 div add}{1 3 div exp} ifelse } bind
+]
+/MatrixABC [ 0 1 0 1 -1 1 0 0 -1 ]
+/EncodeABC [
+{ 116 mul 16 sub 100 div } bind
+{ 500 mul 128 add 255 div } bind
+{ 200 mul 128 add 255 div } bind
+]
+/RenderTable [ 33 33 33 [
+<3B0600E23B0600E23B0600E23B0600E23B0600E23B0600E23B0600E23B0600
+E23B0600E23B0600E23B0600E23B0600E23B0600E23B0600E23B0600E23B06
+00E23B0600E23B0600E23B0600E23B0600E23B0600E23B0600E23B0600E23B
+0600E23B0600E23B0600E23B0600E23B0600E23B0600E23B0600E23B0600E2
+3B0600E23B0600E23B0600E23B0600E23B0600E23B0600E23B0600E23B0600
+E23B0600E23B0600E23B0600E23B0600E23B0600E23B0600E23B0600E23B06
+00E23B0600E23B0600E23B0600E23B0600E23B0600E23B0600E23B0600E23B
+0600E23B0600E23B0600E23B0600E23B0600E23B0600E23B0600E23B0600E2
+3B0600E23B0600E23B0600E23B0600E23B0600E23B0600E23B0600E23B0600
+E23B0600E23B0600E23B0600E23B0600E23B0600E23B0600E23B0600E23B06
+00E23B0600E23B0600E23B0600E23B0600E23B0600E23B0600E23B0600E23B
+0600E23B0600E23B0600E23B0600E23B0600E23B0600E23B0600E23B0600E2
+3B0600E23B0600E23B0600E23B0600E23B0600E23B0600E23B0600E23B0600
+E23B0600E23B0600E23B0600E23B0600E23B0600E23B0600E23B0600E23B06
+00E23B0600E23B0600E23B0600E23B0600E23B0600E23B0600E23B0600E23B
+0600E23B0600E23B0600E23B0600E23B0600E23B0600E23B0600E23B0600E2
+3B0600E23B0600E23B0600E23B0600E23B0600E23B0600E23B0600E23B0600
+E23B0600E23B0600E23B0600E23B0600E23B0600E23B0600E23B0600E23B06
+00E23B0600E23B0600E23B0600E23B0600E23B0600E23B0600E23B0600E23B
+0600E23B0600E23B0600E23B0600E23B0600E23B0600E23B0600E23B0600E2
+3B0600E23B0600E23B0600E23B0600E23B0600E23B0600E23B0600E23B0600
+E23B0600E23B0600E23B0600E23B0600E23B0600E23B0600E23B0600E23B06
+00E23B0600E23B0600E23B0600E23B0600E23B0600E23B0600E23B0600E23B
+0600E23B0600E23B0600E23B0600E23B0600E23B0600E23B0600E23B0600E2
+3B0600E23B0600E23B0600E23B0600E23B0600E23B0600E23B0600E23B0600
+E23B0600E23B0600E23B0600E23B0600E23B0600E23B0600E23B0600E23B06
+00E23B0600E23B0600E23B0600E23B0600E23B0600E23B0600E23B0600E23B
+0600E23B0600E23B0600E23B0600E23B0600E23B0600E23B0600E23B0600E2
+3B0600E23B0600E23B0600E23B0600E23B0600E23B0600E23B0600E23B0600
+E23B0600E23B0600E23B0600E23B0600E23B0600E23B0600E23B0600E23B06
+00E23B0600E23B0600E23B0600E23B0600E23B0600E23B0600E23B0600E23B
+0600E23B0600E23B0600E23B0600E23B0600E23B0600E23B0600E23B0600E2
+3B0600E23B0600E23B0600E23B0600E23B0600E23B0600E23B0600E23B0600
+E23B0600E23B0600E23B0600E23B0600E23B0600E23B0600E23B0600E23B06
+00E23B0600E23B0600E23B0600E23B0600E23B0600E23B0600E23B0600E23B
+0600E23B0600E23B0600E23B0600E23B0600E23B0600E23B0600E23B0600E2
+3B0600E23B0600E23B0600E23B0600E23B0600E23B0600E23B0600E23B0600
+E23B0600E23B0600E23B0600E23B0600E23B0600E23B0600E23B0600E23B06
+00E23B0600E23B0600E23B0600E23B0600E23B0600E23B0600E23B0600E23B
+0600E23B0600E23B0600E23B0600E23B0600E23B0600E23B0600E23B0600E2
+3B0600E23B0600E23B0600E23B0600E23B0600E23B0600E23B0600E23B0600
+E23B0600E23B0600E23B0600E23B0600E23B0600E23B0600E23B0600E23B06
+00E23B0600E23B0600E23B0600E23B0600E23B0600E23B0600E23B0600E23B
+0600E23B0600E23B0600E23B0600E23B0600E23B0600E23B0600E23B0600E2
+3B0600E23B0600E23B0600E23B0600E23B0600E23B0600E23B0600E23B0600
+E23B0600E23B0600E23B0600E23B0600E23B0600E23B0600E23B0600E23B06
+00E23B0600E23B0600E23B0600E23B0600E23B0600E23B0600E23B0600E23B
+0600E23B0600E23B0600E23B0600E23B0600E23B0600E23B0600E23B0600E2
+3B0600E23B0600E23B0600E23B0600E23B0600E23B0600E23B0600E23B0600
+E23B0600E23B0600E23B0600E23B0600E23B0600E23B0600E23B0600E23B06
+00E23B0600E23B0600E23B0600E23B0600E23B0600E23B0600E23B0600E23B
+0600E23B0600E23B0600E23B0600E23B0600E23B0600E23B0600E23B0600E2
+3B0600E23B0600E23B0600E23B0600E23B0600E23B0600E23B0600E23B0600
+E23B0600E23B0600E23B0600E23B0600E23B0600E23B0600E23B0600E23B06
+00E23B0600E23B0600E23B0600E23B0600E23B0600E23B0600E23B0600E23B
+0600E23B0600E23B0600E23B0600E23B0600E23B0600E23B0600E23B0600E2
+3B0600E23B0600E23B0600E23B0600E23B0600E23B0600E23B0600E23B0600
+E23B0600E23B0600E23B0600E23B0600E23B0600E23B0600E23B0600E23B06
+00E23B0600E23B0600E23B0600E23B0600E23B0600E23B0600E23B0600E23B
+0600E23B0600E23B0600E23B0600E23B0600E23B0600E23B0600E23B0600E2
+3B0600E23B0600E23B0600E23B0600E23B0600E23B0600E23B0600E23B0600
+E23B0600E23B0600E23B0600E23B0600E23B0600E23B0600E23B0600E23B06
+00E23B0600E23B0600E23B0600E23B0600E23B0600E23B0600E23B0600E23B
+0600E23B0600E23B0600E23B0600E23B0600E23B0600E23B0600E23B0600E2
+3B0600E23B0600E23B0600E23B0600E23B0600E23B0600E23B0600E23B0600
+E23B0600E23B0600E23B0600E23B0600E23B0600E23B0600E23B0600E23B06
+00E23B0600E23B0600E23B0600E23B0600E23B0600E23B0600E23B0600E23B
+0600E23B0600E23B0600E23B0600E23B0600E23B0600E23B0600E23B0600E2
+3B0600E23B0600E23B0600E23B0600E23B0600E23B0600E23B0600E23B0600
+E23B0600E23B0600E23B0600E23B0600E23B0600E23B0600E23B0600E23B06
+00E23B0600E23B0600E23B0600E23B0600E23B0600E23B0600E23B0600E23B
+0600E23B0600E23B0600E23B0600E23B0600E23B0600E23B0600E23B0600E2
+3B0600E23B0600E23B0600E23B0600E23B0600E23B0600E23B0600E23B0600
+E23B0600E23B0600E23B0600E23B0600E23B0600E23B0600E23B0600E23B06
+00E23B0600E23B0600E23B0600E23B0600E23B0600E23B0600E23B0600E23B
+0600E23B0600E23B0600E23B0600E23B0600E23B0600E23B0600E23B0600E2
+3B0600E23B0600E23B0600E23B0600E23B0600E23B0600E23B0600E23B0600
+E23B0600E23B0600E23B0600E23B0600E23B0600E23B0600E23B0600E23B06
+00E23B0600E23B0600E23B0600E23B0600E23B0600E23B0600E23B0600E23B
+0600E23B0600E23B0600E23B0600E23B0600E23B0600E23B0600E23B0600E2
+3B0600E23B0600E23B0600E23B0600E23B0600E23B0600E23B0600E23B0600
+E23B0600E23B0600E23B0600E23B0600E23B0600E23B0600E23B0600E23B06
+00E23B0600E23B0600E23B0600E23B0600E23B0600E23B0600E23B0600E23B
+0600E23B0600E23B0600E23B0600E23B0600E23B0600E23B0600E23B0600E2
+3B0600E23B0600E23B0600E23B0600E23B0600E23B0600E23B0600E23B0600
+E23B0600E23B0600E23B0600E23B0600E23B0600E23B0600E23B0600E23B06
+00E23B0600E23B0600E23B0600E23B0600E23B0600E23B0600E23B0600E23B
+0600E23B0600E23B0600E23B0600E23B0600E23B0600E23B0600E23B0600E2
+3B0600E23B0600E23B0600E23B0600E23B0600E23B0600E23B0600E23B0600
+E23B0600E23B0600E23B0600E23B0600E23B0600E23B0600E23B0600E23B06
+00E23B0600E23B0600E23B0600E23B0600E23B0600E23B0600E23B0600E23B
+0600E23B0600E23B0600E23B0600E23B0600E23B0600E23B0600E23B0600E2
+3B0600E23B0600E23B0600E23B0600E23B0600E23B0600E23B0600E23B0600
+E23B0600E23B0600E23B0600E23B0600E23B0600E23B0600E23B0600E23B06
+00E23B0600E23B0600E23B0600E23B0600E23B0600E23B0600E23B0600E23B
+0600E23B0600E23B0600E23B0600E23B0600E23B0600E23B0600E23B0600E2
+3B0600E23B0600E23B0600E23B0600E23B0600E23B0600E23B0600E23B0600
+E23B0600E23B0600E23B0600E23B0600E23B0600E23B0600E23B0600E23B06
+00E23B0600E23B0600E23B0600E23B0600E23B0600E23B0600E23B0600E23B
+0600E23B0600E23B0600E23B0600E23B0600E23B0600E23B0600E23B0600E2
+3B0600E23B0600E23B0600E23B0600E23B0600E23B0600E23B0600E23B0600
+E23B0600E23B0600E23B0600E23B0600E23B0600E23B0600E23B0600E23B06
+00E23B0600E23B0600E23B0600E23B0600E23B0600E23B0600E23B0600E23B
+0600E23B0600E23B0600E23B0600E23B0600E23B0600E23B0600E23B0600E2
+3B0600E23B0600E23B0600E23B0600E23B0600E23B0600E23B0600E23B0600
+E23B0600E23B0600E23B0600E23B0600E23B0600E23B0600E23B0600E23B06
+00E23B0600E23B0600E23B0600E23B0600E23B0600E23B0600E23B0600E23B
+0600E23B0600E23B0600E23B0600E23B0600E23B0600E23B0600E23B0600E2
+3B0600E23B0600E23B0600E23B0600E23B0600E23B0600E23B0600E23B0600
+E23B0600E23B0600E23B0600E23B0600E23B0600E23B0600E23B0600E23B06
+00E23B0600E23B0600E23B0600E23B0600E23B0600E23B0600E23B0600E23B
+0600E23B0600E23B0600E23B0600E23B0600E23B0600E23B0600E23B0600E2
+3B0600E23B0600E23B0600E23B0600E23B0600E23B0600E23B0600E23B0600
+E23B0600E23B0600E23B0600E23B0600E23B0600E23B0600E23B0600E23B06
+00E23B0600E23B0600E23B0600E23B0600E23B0600E23B0600E23B0600E23B
+0600E23B0600E23B0600E23B0600E23B0600E23B0600E23B0600E23B0600E2
+3B0600E23B0600E23B0600E23B0600E23B0600E23B0600E23B0600E23B0600
+E23B0600E23B0600E23B0600E23B0600E23B0600E23B0600E23B0600E23B06
+00E23B0600E23B0600E23B0600E23B0600E23B0600E23B0600E23B0600E23B
+0600E23B0600E23B0600E23B0600E23B0600E23B0600E23B0600E23B0600E2
+3B0600E23B0600E23B0600E23B0600E23B0600E23B0600E23B0600E23B0600
+E23B0600E23B0600E23B0600E23B0600E23B0600E23B0600E23B0600E23B06
+00E23B0600E23B0600E23B0600E23B0600E23B0600E23B0600E23B0600E23B
+0600E23B0600E23B0600E23B0600E23B0600E23B0600E23B0600E23B0600E2
+3B0600E23B0600E23B0600E23B0600E23B0600E23B0600E23B0600E23B0600
+E23B0600E23B0600E23B0600E23B0600E23B0600E23B0600E23B0600E23B06
+00E23B0600E23B0600E23B0600E23B0600E23B0600E23B0600E23B0600E23B
+0600E23B0600E23B0600E23B0600E23B0600E23B0600E23B0600E23B0600E2
+3B0600E23B0600E23B0600E23B0600E23B0600E23B0600E23B0600E23B0600
+E23B0600E23B0600E23B0600E23B0600E23B0600E23B0600E23B0600E23B06
+00E23B0600E23B0600E23B0600E23B0600E23B0600E23B0600E23B0600E23B
+0600E23B0600E23B0600E23B0600E23B0600E23B0600E23B0600E23B0600E2
+3B0600E23B0600E23B0600E23B0600E23B0600E23B0600E23B0600E23B0600
+E23B0600E23B0600E23B0600E23B0600E23B0600E23B0600E23B0600E23B06
+00E23B0600E23B0600E23B0600E23B0600E23B0600E23B0600E23B0600E23B
+0600E23B0600E23B0600E23B0600E23B0600E23B0600E23B0600E23B0600E2
+3B0600E23B0600E23B0600E23B0600E23B0600E23B0600E23B0600E23B0600
+E23B0600E23B0600E23B0600E23B0600E23B0600E23B0600E23B0600E23B06
+00E23B0600E23B0600E23B0600E23B0600E23B0600E23B0600E23B0600E23B
+0600E23B0600E23B0600E23B0600E23B0600E23B0600E23B0600E23B0600E2
+3B0600E23B0600E23B0600E23B0600E2>
+<A5580000A95D0000AF640000B56D0000BD790000C8850000E28F0004FD9906
+04FFA01300FFA21B09FF971820FF8A1139FE84164BFD59007AEA330095C00F
+08B2991A2FA5A824559CA824559CA824559CA824559CA824559CA824559CA8
+24559CA824559CA824559CA824559CA824559CA824559CA824559CA824559C
+A824559CA824559CA5580000A95D0000AF640000B56D0000BD790000C88500
+00E28F0004FD990604FFA01300FFA21B09FF971820FF8A1139FE84164BFD59
+007AEA330095C00F08B2991A2FA5A824559CA824559CA824559CA824559CA8
+24559CA824559CA824559CA824559CA824559CA824559CA824559CA824559C
+A824559CA824559CA824559CA824559CA5580000A95D0000AF640000B56D00
+00BD790000C8850000E28F0004FD990604FFA01300FFA21B09FF971820FF8A
+1139FE84164BFD59007AEA330095C00F08B2991A2FA5A824559CA824559CA8
+24559CA824559CA824559CA824559CA824559CA824559CA824559CA824559C
+A824559CA824559CA824559CA824559CA824559CA824559CA5580000A95D00
+00AF640000B56D0000BD790000C8850000E28F0004FD990604FFA01300FFA2
+1B09FF971820FF8A1139FE84164BFD59007AEA330095C00F08B2991A2FA5A8
+24559CA824559CA824559CA824559CA824559CA824559CA824559CA824559C
+A824559CA824559CA824559CA824559CA824559CA824559CA824559CA82455
+9CA5580000A95D0000AF640000B56D0000BD790000C8850000E28F0004FD99
+0604FFA01300FFA21B09FF971820FF8A1139FE84164BFD59007AEA330095C0
+0F08B2991A2FA5A824559CA824559CA824559CA824559CA824559CA824559C
+A824559CA824559CA824559CA824559CA824559CA824559CA824559CA82455
+9CA824559CA824559CA5580000A95D0000AF640000B56D0000BD790000C885
+0000E28F0004FD990604FFA01300FFA21B09FF971820FF8A1139FE84164BFD
+59007AEA330095C00F08B2991A2FA5A824559CA824559CA824559CA824559C
+A824559CA824559CA824559CA824559CA824559CA824559CA824559CA82455
+9CA824559CA824559CA824559CA824559CA5580000A95D0000AF640000B56D
+0000BD790000C8850000E28F0004FD990604FFA01300FFA21B09FF971820FF
+8A1139FE84164BFD59007AEA330095C00F08B2991A2FA5A824559CA824559C
+A824559CA824559CA824559CA824559CA824559CA824559CA824559CA82455
+9CA824559CA824559CA824559CA824559CA824559CA824559CA5580000A95D
+0000AF640000B56D0000BD790000C8850000E28F0004FD990604FFA01300FF
+A21B09FF971820FF8A1139FE84164BFD59007AEA330095C00F08B2991A2FA5
+A824559CA824559CA824559CA824559CA824559CA824559CA824559CA82455
+9CA824559CA824559CA824559CA824559CA824559CA824559CA824559CA824
+559CA5580000A95D0000AF640000B56D0000BD790000C8850000E28F0004FD
+990604FFA01300FFA21B09FF971820FF8A1139FE84164BFD59007AEA330095
+C00F08B2991A2FA5A824559CA824559CA824559CA824559CA824559CA82455
+9CA824559CA824559CA824559CA824559CA824559CA824559CA824559CA824
+559CA824559CA824559CA5580000A95D0000AF640000B56D0000BD790000C8
+850000E28F0004FD990604FFA01300FFA21B09FF971820FF8A1139FE84164B
+FD59007AEA330095C00F08B2991A2FA5A824559CA824559CA824559CA82455
+9CA824559CA824559CA824559CA824559CA824559CA824559CA824559CA824
+559CA824559CA824559CA824559CA824559CA5580000A95D0000AF640000B5
+6D0000BD790000C8850000E28F0004FD990604FFA01300FFA21B09FF971820
+FF8A1139FE84164BFD59007AEA330095C00F08B2991A2FA5A824559CA82455
+9CA824559CA824559CA824559CA824559CA824559CA824559CA824559CA824
+559CA824559CA824559CA824559CA824559CA824559CA824559CA5580000A9
+5D0000AF640000B56D0000BD790000C8850000E28F0004FD990604FFA01300
+FFA21B09FF971820FF8A1139FE84164BFD59007AEA330095C00F08B2991A2F
+A5A824559CA824559CA824559CA824559CA824559CA824559CA824559CA824
+559CA824559CA824559CA824559CA824559CA824559CA824559CA824559CA8
+24559CA5580000A95D0000AF640000B56D0000BD790000C8850000E28F0004
+FD990604FFA01300FFA21B09FF971820FF8A1139FE84164BFD59007AEA3300
+95C00F08B2991A2FA5A824559CA824559CA824559CA824559CA824559CA824
+559CA824559CA824559CA824559CA824559CA824559CA824559CA824559CA8
+24559CA824559CA824559CA5580000A95D0000AF640000B56D0000BD790000
+C8850000E28F0004FD990604FFA01300FFA21B09FF971820FF8A1139FE8416
+4BFD59007AEA330095C00F08B2991A2FA5A824559CA824559CA824559CA824
+559CA824559CA824559CA824559CA824559CA824559CA824559CA824559CA8
+24559CA824559CA824559CA824559CA824559CA5580000A95D0000AF640000
+B56D0000BD790000C8850000E28F0004FD990604FFA01300FFA21B09FF9718
+20FF8A1139FE84164BFD59007AEA330095C00F08B2991A2FA5A824559CA824
+559CA824559CA824559CA824559CA824559CA824559CA824559CA824559CA8
+24559CA824559CA824559CA824559CA824559CA824559CA824559CA4580000
+A95D0000AE640000B56E0000BC790000C7850000DF900003FC9A0603FFA112
+00FFA51B06FF9A161FFF951A2CFE830B52EA630074FB44008FD21901B18706
+17BEB2375195B2375195B2375195B2375195B2375195B2375195B2375195B2
+375195B2375195B2375195B2375195B2375195B2375195B2375195B2375195
+B2375195A4590000A95E0000AE650000B46E0000BB7A0000C5850000DC9000
+02FB9B0503FFA31000FFA81B02FF9F141DFF9A1A28FB840057D773006BFE57
+0087DA43009F3F1B01D4050C0FE8050C0FE8050C0FE8050C0FE8050C0FE805
+0C0FE8050C0FE8050C0FE8050C0FE8050C0FE8050C0FE8050C0FE8050C0FE8
+050C0FE8050C0FE8050C0FE8A4590000A85E0000AD650000B36E0000BA7A00
+00C4860000D8910001FA9D0402FFA50E00FFAB1901FFA71715FFA11925F08C
+0051F98C0061C78A0074818000915F8802AB074A0BCE074A0BCE074A0BCE07
+4A0BCE074A0BCE074A0BCE074A0BCE074A0BCE074A0BCE074A0BCE074A0BCE
+074A0BCE074A0BCE074A0BCE074A0BCE074A0BCEA4590000A85E0000AD6500
+00B26E0000B87A0000C2860000D5910000F99E0401FFA70B00FFAE1700FFB0
+1B0CFFAA1622D099014AD3AB0057C5C0006683BB008070E6008F35E700A835
+E700A835E700A835E700A835E700A835E700A835E700A835E700A835E700A8
+35E700A835E700A835E700A835E700A835E700A835E700A835E700A8A35900
+00A75E0000AC650000B16F0000B77A0000C1860000D2920000F8A00301FFA8
+0A00FFB11400FFB51C06FFBA1B19CEAE0043CFD7004CA7F0005E82F20D7149
+FE018B1BF500A51BF500A51BF500A51BF500A51BF500A51BF500A51BF500A5
+1BF500A51BF500A51BF500A51BF500A51BF500A51BF500A51BF500A51BF500
+A51BF500A5A3590000A75F0000AC660000B06F0000B67B0000BF860000D192
+0000FAA10200FFA90900FFB11400FFBC1D05FFC60628C6CE013BD0FD2A1F90
+FF045B61FF096F32FF068B07FA009C07FA009C07FA009C07FA009C07FA009C
+07FA009C07FA009C07FA009C07FA009C07FA009C07FA009C07FA009C07FA00
+9C07FA009C07FA009C07FA009CA35A0000A65F0000AB660000AF6F0000B57B
+0000BE870000D1920000FAA10200FFA90900FFB51301FFCB0F12DCDA0029D1
+FD1B1C8EF3024D77FF125945FF03711BFF008C01FF009401FF009401FF0094
+01FF009401FF009401FF009401FF009401FF009401FF009401FF009401FF00
+9401FF009401FF009401FF009401FF009401FF0094A25A0000A65F0000AA66
+0000AF700000B57B0000BE860000D1920000F9A10200FFAB0800F8BE030DE6
+D6001ACCF31417C8FF360181FF0B4653FF045E33FF05720DFF008700FF2187
+00FF218700FF218700FF218700FF218700FF218700FF218700FF218700FF21
+8700FF218700FF218700FF218700FF218700FF218700FF218700FF2187A25A
+0000A5600000AA660000AF6F0000B57B0000BE860000D0920000F9A10200E0
+AE0105D9C4000EC0E00019B8FE1810A0FF221566FF044B3FFF00611DFF0078
+04FF0D8200FF327B00FF327B00FF327B00FF327B00FF327B00FF327B00FF32
+7B00FF327B00FF327B00FF327B00FF327B00FF327B00FF327B00FF327B00FF
+327B00FF327BA25A0000A55F0000AA660000AF6F0000B57B0000BE860000D0
+920000C49E0001C3AE0006BDCA000DABEA0017A8FF180D77FF023352FF004D
+2EFF006411FF007500FF1B7A00FF397200FF397200FF397200FF397200FF39
+7200FF397200FF397200FF397200FF397200FF397200FF397200FF397200FF
+397200FF397200FF397200FF3972A25A0000A55F0000AA660000AF6F0000B5
+7B0000BE860000B7920000B1A00001B1B20006AACF000E9BED00158AFF051D
+63FF003844FF004F20FF006708FF057200FF297000FF446B00FF446B00FF44
+6B00FF446B00FF446B00FF446B00FF446B00FF446B00FF446B00FF446B00FF
+446B00FF446B00FF446B00FF446B00FF446B00FF446BA25A0000A55F0000AA
+660000AF6F0000B57B0000B1870000A8940000A7A20002A5B800069AD0000E
+8EEF00157AFF022053FF003B34FF005314FF006702FF0C6D00FF316800FF4E
+6400FF4E6400FF4E6400FF4E6400FF4E6400FF4E6400FF4E6400FF4E6400FF
+4E6400FF4E6400FF4E6400FF4E6400FF4E6400FF4E6400FF4E6400FF4E64A2
+5A0000A55F0000AA660000AF6F0000AE7B0000A5890000A09600019FA60003
+99BB00078FD3000E82F2001567FF002546FF003D25FF00570AFF006503FF1B
+6505FF3F5E00FF575C00FF575C00FF575C00FF575C00FF575C00FF575C00FF
+575C00FF575C00FF575C00FF575C00FF575C00FF575C00FF575C00FF575C00
+FF575C00FF575CA25A0000A55F0000AA660000AD700000A17D00009C8A0000
+9899000196AA000491C0000785D8000E77F8001656FF002A3AFF004019FF00
+5803FF056317FF394F1AFF534300FF5E5600FF5E5600FF5E5600FF5E5600FF
+5E5600FF5E5600FF5E5600FF5E5600FF5E5600FF5E5600FF5E5600FF5E5600
+FF5E5600FF5E5600FF5E5600FF5E56A25A0000A55F0000AA660000A0720000
+997F0000958D0000929C000190AF000388C500077EE1000D6CFC001747F900
+2F2BFF00460FFF005805FF125A15FF41493BFF702100FF604F00FF604F00FF
+604F00FF604F00FF604F00FF604F00FF604F00FF604F00FF604F00FF604F00
+FF604F00FF604F00FF604F00FF604F00FF604F00FF604FA25A0000A55F0000
+9E68000096740000918100008E8F00008C9F000188B3000383CD000678EC00
+0C5BF5001C3CF9003126FF074106FF005608FF224F1CFF4D3B20FF662F02FF
+644802FF644802FF644802FF644802FF644802FF644802FF644802FF644802
+FF644802FF644802FF644802FF644802FF644802FF644802FF644802FF6448
+A25A00009D610000936B00008E7600008B8400008892000085A3000182B800
+0280DB00036EF1000C47E8002337FC062F17FF004802FF08511BFF3E3914FF
+503A18FF65300FFF7C390FFF7C390FFF7C390FFF7C390FFF7C390FFF7C390F
+FF7C390FFF7C390FFF7C390FFF7C390FFF7C390FFF7C390FFF7C390FFF7C39
+0FFF7C390FFF7C399D5B0000916400008B6D00008778000084860000809400
+007FA700007EC1000078E0000260F100103BE3002529FE00360FFF034712FF
+243C1CFF483009FF4E3C06FF623B11FF893111FF893111FF893111FF893111
+FF893111FF893111FF893111FF893111FF893111FF893111FF893111FF8931
+11FF893111FF893111FF893111FF8931>
+<A4540000A7590000AD5F0000B3660000BB700000C57C0000D5850003EF8C00
+0BFF93090CFF941212FF8F171EFF710549FF5C0264F43B007FBE0F009AC103
+1FA3CF11509AA8026FA2A90272A2A90272A2A90272A2A90272A2A90272A2A9
+0272A2A90272A2A90272A2A90272A2A90272A2A90272A2A90272A2A90272A2
+A90272A2A90272A2A4540000A7590000AD5F0000B3660000BB700000C57C00
+00D5850003EF8C000BFF93090CFF941212FF8F171EFF710549FF5C0264F43B
+007FBE0F009AC1031FA3CF11509AA8026FA2A90272A2A90272A2A90272A2A9
+0272A2A90272A2A90272A2A90272A2A90272A2A90272A2A90272A2A90272A2
+A90272A2A90272A2A90272A2A90272A2A4540000A7590000AD5F0000B36600
+00BB700000C57C0000D5850003EF8C000BFF93090CFF941212FF8F171EFF71
+0549FF5C0264F43B007FBE0F009AC1031FA3CF11509AA8026FA2A90272A2A9
+0272A2A90272A2A90272A2A90272A2A90272A2A90272A2A90272A2A90272A2
+A90272A2A90272A2A90272A2A90272A2A90272A2A90272A2A4540000A75900
+00AD5F0000B3660000BB700000C57C0000D5850003EF8C000BFF93090CFF94
+1212FF8F171EFF710549FF5C0264F43B007FBE0F009AC1031FA3CF11509AA8
+026FA2A90272A2A90272A2A90272A2A90272A2A90272A2A90272A2A90272A2
+A90272A2A90272A2A90272A2A90272A2A90272A2A90272A2A90272A2A90272
+A2A4540000A7590000AD5F0000B3660000BB700000C57C0000D5850003EF8C
+000BFF93090CFF941212FF8F171EFF710549FF5C0264F43B007FBE0F009AC1
+031FA3CF11509AA8026FA2A90272A2A90272A2A90272A2A90272A2A90272A2
+A90272A2A90272A2A90272A2A90272A2A90272A2A90272A2A90272A2A90272
+A2A90272A2A90272A2A4540000A7590000AD5F0000B3660000BB700000C57C
+0000D5850003EF8C000BFF93090CFF941212FF8F171EFF710549FF5C0264F4
+3B007FBE0F009AC1031FA3CF11509AA8026FA2A90272A2A90272A2A90272A2
+A90272A2A90272A2A90272A2A90272A2A90272A2A90272A2A90272A2A90272
+A2A90272A2A90272A2A90272A2A90272A2A4540000A7590000AD5F0000B366
+0000BB700000C57C0000D5850003EF8C000BFF93090CFF941212FF8F171EFF
+710549FF5C0264F43B007FBE0F009AC1031FA3CF11509AA8026FA2A90272A2
+A90272A2A90272A2A90272A2A90272A2A90272A2A90272A2A90272A2A90272
+A2A90272A2A90272A2A90272A2A90272A2A90272A2A90272A2A4540000A759
+0000AD5F0000B3660000BB700000C57C0000D5850003EF8C000BFF93090CFF
+941212FF8F171EFF710549FF5C0264F43B007FBE0F009AC1031FA3CF11509A
+A8026FA2A90272A2A90272A2A90272A2A90272A2A90272A2A90272A2A90272
+A2A90272A2A90272A2A90272A2A90272A2A90272A2A90272A2A90272A2A902
+72A2A4540000A7590000AD5F0000B3660000BB700000C57C0000D5850003EF
+8C000BFF93090CFF941212FF8F171EFF710549FF5C0264F43B007FBE0F009A
+C1031FA3CF11509AA8026FA2A90272A2A90272A2A90272A2A90272A2A90272
+A2A90272A2A90272A2A90272A2A90272A2A90272A2A90272A2A90272A2A902
+72A2A90272A2A90272A2A4540000A7590000AD5F0000B3660000BB700000C5
+7C0000D5850003EF8C000BFF93090CFF941212FF8F171EFF710549FF5C0264
+F43B007FBE0F009AC1031FA3CF11509AA8026FA2A90272A2A90272A2A90272
+A2A90272A2A90272A2A90272A2A90272A2A90272A2A90272A2A90272A2A902
+72A2A90272A2A90272A2A90272A2A90272A2A4540000A7590000AD5F0000B3
+660000BB700000C57C0000D5850003EF8C000BFF93090CFF941212FF8F171E
+FF710549FF5C0264F43B007FBE0F009AC1031FA3CF11509AA8026FA2A90272
+A2A90272A2A90272A2A90272A2A90272A2A90272A2A90272A2A90272A2A902
+72A2A90272A2A90272A2A90272A2A90272A2A90272A2A90272A2A4540000A7
+590000AD5F0000B3660000BB700000C57C0000D5850003EF8C000BFF93090C
+FF941212FF8F171EFF710549FF5C0264F43B007FBE0F009AC1031FA3CF1150
+9AA8026FA2A90272A2A90272A2A90272A2A90272A2A90272A2A90272A2A902
+72A2A90272A2A90272A2A90272A2A90272A2A90272A2A90272A2A90272A2A9
+0272A2A4540000A7590000AD5F0000B3660000BB700000C57C0000D5850003
+EF8C000BFF93090CFF941212FF8F171EFF710549FF5C0264F43B007FBE0F00
+9AC1031FA3CF11509AA8026FA2A90272A2A90272A2A90272A2A90272A2A902
+72A2A90272A2A90272A2A90272A2A90272A2A90272A2A90272A2A90272A2A9
+0272A2A90272A2A90272A2A4550000A7590000AD5F0000B3660000BA700000
+C47C0000D4860003F08D000AFF940A0AFF951310FF90171DFF760843FF6305
+5FF740007DC4150098BA0018A6D2184D97A6036CA3A7036FA3A7036FA3A703
+6FA3A7036FA3A7036FA3A7036FA3A7036FA3A7036FA3A7036FA3A7036FA3A7
+036FA3A7036FA3A7036FA3A7036FA3A7036FA3A3550000A7590000AC5F0000
+B2660000B9700000C37C0000D2870002F18F0008FF980D04FF9A150AFF9417
+1BFF831134FF6D0658FF500077DB260092BC070FA8D4294291A00661A6A007
+65A6A00765A6A00765A6A00765A6A00765A6A00765A6A00765A6A00765A6A0
+0765A6A00765A6A00765A6A00765A6A00765A6A00765A6A00765A6A3550000
+A75A0000AB5F0000B1660000B8710000C27D0000D0880002F0910007FF990B
+04FF9E1705FF991916FF921A26FF760554FF660D62F53A008BBF0F03A9A21C
+269E672149AC4C1246B94C1246B94C1246B94C1246B94C1246B94C1246B94C
+1246B94C1246B94C1246B94C1246B94C1246B94C1246B94C1246B94C1246B9
+4C1246B9A3550000A65A0000AB5F0000B1670000B7710000C07D0000CE8800
+01EE920006FF9B0A03FFA21800FFA01A10FF961924FF7F044EEC771158F054
+00829C3E00A03A1B01C7030E20E0011127DA011127DA011127DA011127DA01
+1127DA011127DA011127DA011127DA011127DA011127DA011127DA011127DA
+011127DA011127DA011127DAA2550000A65A0000AA600000B0670000B67100
+00BF7D0000CC890001EA930005FF9D0902FFA31500FFA3190EFF991822FF8E
+1239E582015FAD7A00767E7500943D5F00B3174F27B81E5B37B01E5B37B01E
+5B37B01E5B37B01E5B37B01E5B37B01E5B37B01E5B37B01E5B37B01E5B37B0
+1E5B37B01E5B37B01E5B37B01E5B37B01E5B37B0A2560000A55A0000AA6000
+00AF670000B5720000BE7D0000C9890000E6940004FF9F0801FFA61300FFA9
+1A08FF9F1520FAA7182DC09E0058B5B100667FB2007E5DCE0094009507B500
+C50BB300C50BB300C50BB300C50BB300C50BB300C50BB300C50BB300C50BB3
+00C50BB300C50BB300C50BB300C50BB300C50BB300C50BB300C50BB3A25600
+00A55A0000A9600000AF680000B4720000BC7E0000C78A0000E2950002FFA1
+0601FFA81000FFAE1A03FFB91914CBB0003ABECE0442A0F500558DFF17594A
+FF027D14F7029A07FA059C07FA059C07FA059C07FA059C07FA059C07FA059C
+07FA059C07FA059C07FA059C07FA059C07FA059C07FA059C07FA059C07FA05
+9C07FA059CA2560000A55B0000A9610000AE680000B3720000BA7E0000C58A
+0000E0970001FFA40500FFAB0D00FFBD1107FCD3071CD2EA0528C7FC2D1289
+FF08505BFF096538FF087A08FF009100FF019400FF019400FF019400FF0194
+00FF019400FF019400FF019400FF019400FF019400FF019400FF019400FF01
+9400FF019400FF019400FF0194A1560000A45B0000A8610000AD690000B173
+0000B87F0000C28A0000E2980000FFA40400FDB40604F1C70112D0E0001ED2
+FF2D03A4FC221D71FF0E4E40FF00681EFF007F00FF168A00FF2C8300FF2C83
+00FF2C8300FF2C8300FF2C8300FF2C8300FF2C8300FF2C8300FF2C8300FF2C
+8300FF2C8300FF2C8300FF2C8300FF2C8300FF2C83A1570000A45B0000A761
+0000AC690000B0730000B77F0000C28A0000E1980000E8A60101D7B40008CC
+D00011B4EF001CBBFF2D007AFF033B50FF00552EFF006B10FF007C00FF287D
+00FF387800FF387800FF387800FF387800FF387800FF387800FF387800FF38
+7800FF387800FF387800FF387800FF387800FF387800FF387800FF3878A157
+0000A35C0000A7620000AC690000B0730000B77F0000C28A0000C5960000BD
+A30002BDB90008B2D60011A2F602189AFF1C1063FF004041FF00561CFF006E
+06FF077800FF327300FF427000FF427000FF427000FF427000FF427000FF42
+7000FF427000FF427000FF427000FF427000FF427000FF427000FF427000FF
+427000FF4270A1570000A35C0000A7620000AC690000B0730000B77F0000BB
+8B0000AE970000AEA60003ACBE0008A0D9001193F7021779FF022552FF0041
+30FF005A11FF006D00FF127100FF3A6A00FF4D6800FF4D6800FF4D6800FF4D
+6800FF4D6800FF4D6800FF4D6800FF4D6800FF4D6800FF4D6800FF4D6800FF
+4D6800FF4D6800FF4D6800FF4D68A1570000A35C0000A7620000AC690000B0
+730000B57F0000A98C0000A5990001A4AA00049DC1000992DC001085F80217
+65FF002A44FF004322FF005D07FF006A04FF246700FF446300FF586000FF58
+6000FF586000FF586000FF586000FF586000FF586000FF586000FF586000FF
+586000FF586000FF586000FF586000FF586000FF5860A1570000A35C0000A7
+620000AC690000B0730000A58000009F8E00009D9C00019AAE000592C4000A
+87E0001076FA001A53FF003037FF004716FF005E03FF0C6514FF3D550DFF56
+5000FF5F5900FF5F5900FF5F5900FF5F5900FF5F5900FF5F5900FF5F5900FF
+5F5900FF5F5900FF5F5900FF5F5900FF5F5900FF5F5900FF5F5900FF5F59A1
+570000A35C0000A7620000AC690000A37500009C82000098900000959F0002
+92B3000488C8000A7FE9000F67FD001D45FE003428FF004C0CFF005D10FF23
+540FFF415024FF6C3400FF655300FF655300FF655300FF655300FF655300FF
+655300FF655300FF655300FF655300FF655300FF655300FF655300FF655300
+FF655300FF6553A1570000A35C0000A7620000A26B00009977000094850000
+919300008FA300028AB8000482D0000977F2000F58F900213BFD01351CFF00
+4F03FF025B0FFF2E4D2AFF5A2F00FF594E00FF634D00FF634D00FF634D00FF
+634D00FF634D00FF634D00FF634D00FF634D00FF634D00FF634D00FF634D00
+FF634D00FF634D00FF634D00FF634DA1570000A35C0000A0630000966D0000
+917900008E8700008B96000088A7000284BE00037EDD00066CF5001046EF00
+273DFE102C12FF004E01FF0D5518FF413E2AFF622800FF5D470DFF7A3D0DFF
+7A3D0DFF7A3D0DFF7A3D0DFF7A3D0DFF7A3D0DFF7A3D0DFF7A3D0DFF7A3D0D
+FF7A3D0DFF7A3D0DFF7A3D0DFF7A3D0DFF7A3D0DFF7A3DA15700009F5C0000
+946500008D6F00008A7C0000878900008398000081AB000180C7000178E800
+0558EA00173AEC002A25FF003D0AFF034B13FF293E18FF4B3618FF5C300CFF
+723911FF8B3411FF8B3411FF8B3411FF8B3411FF8B3411FF8B3411FF8B3411
+FF8B3411FF8B3411FF8B3411FF8B3411FF8B3411FF8B3411FF8B3411FF8B34
+A1570000925F00008A67000186710000837E00007F8B00007B9B00007BB100
+007ACE00016FEC000545DC001D31ED002B1AFF003E06FF0B471BFF3B3016FF
+503001FF513D12FF832F0EFF8F300EFF8F300EFF8F300EFF8F300EFF8F300E
+FF8F300EFF8F300EFF8F300EFF8F300EFF8F300EFF8F300EFF8F300EFF8F30
+0EFF8F300EFF8F30935A000089610001826900007F7400007C800000768E00
+00719D000072B4000070CE000158DA000D39D6001E29F0002C12FF003D00FF
+10441DFF44280DFF4C3110FF682D11FF872A0DFF922B0DFF922B0DFF922B0D
+FF922B0DFF922B0DFF922B0DFF922B0DFF922B0DFF922B0DFF922B0DFF922B
+0DFF922B0DFF922B0DFF922B0DFF922B>
+<A3510000A6550000AB5A0000B1600000B8670000C2720000CF7D0002E08200
+0AF4850014FF890B17FF851220FF66024AFC4F0063E52B007DAE000496D907
+2E92EB055F91C20091938700DE968700DE968700DE968700DE968700DE9687
+00DE968700DE968700DE968700DE968700DE968700DE968700DE968700DE96
+8700DE968700DE96A3510000A6550000AB5A0000B1600000B8670000C27200
+00CF7D0002E082000AF4850014FF890B17FF851220FF66024AFC4F0063E52B
+007DAE000496D9072E92EB055F91C20091938700DE968700DE968700DE9687
+00DE968700DE968700DE968700DE968700DE968700DE968700DE968700DE96
+8700DE968700DE968700DE968700DE96A3510000A6550000AB5A0000B16000
+00B8670000C2720000CF7D0002E082000AF4850014FF890B17FF851220FF66
+024AFC4F0063E52B007DAE000496D9072E92EB055F91C20091938700DE9687
+00DE968700DE968700DE968700DE968700DE968700DE968700DE968700DE96
+8700DE968700DE968700DE968700DE968700DE968700DE96A3510000A65500
+00AB5A0000B1600000B8670000C2720000CF7D0002E082000AF4850014FF89
+0B17FF851220FF66024AFC4F0063E52B007DAE000496D9072E92EB055F91C2
+0091938700DE968700DE968700DE968700DE968700DE968700DE968700DE96
+8700DE968700DE968700DE968700DE968700DE968700DE968700DE968700DE
+96A3510000A6550000AB5A0000B1600000B8670000C2720000CF7D0002E082
+000AF4850014FF890B17FF851220FF66024AFC4F0063E52B007DAE000496D9
+072E92EB055F91C20091938700DE968700DE968700DE968700DE968700DE96
+8700DE968700DE968700DE968700DE968700DE968700DE968700DE968700DE
+968700DE968700DE96A3510000A6550000AB5A0000B1600000B8670000C272
+0000CF7D0002E082000AF4850014FF890B17FF851220FF66024AFC4F0063E5
+2B007DAE000496D9072E92EB055F91C20091938700DE968700DE968700DE96
+8700DE968700DE968700DE968700DE968700DE968700DE968700DE968700DE
+968700DE968700DE968700DE968700DE96A3510000A6550000AB5A0000B160
+0000B8670000C2720000CF7D0002E082000AF4850014FF890B17FF851220FF
+66024AFC4F0063E52B007DAE000496D9072E92EB055F91C20091938700DE96
+8700DE968700DE968700DE968700DE968700DE968700DE968700DE968700DE
+968700DE968700DE968700DE968700DE968700DE968700DE96A3510000A655
+0000AB5A0000B1600000B8670000C2720000CF7D0002E082000AF4850014FF
+890B17FF851220FF66024AFC4F0063E52B007DAE000496D9072E92EB055F91
+C20091938700DE968700DE968700DE968700DE968700DE968700DE968700DE
+968700DE968700DE968700DE968700DE968700DE968700DE968700DE968700
+DE96A3510000A6550000AB5A0000B1600000B8670000C2720000CF7D0002E0
+82000AF4850014FF890B17FF851220FF66024AFC4F0063E52B007DAE000496
+D9072E92EB055F91C20091938700DE968700DE968700DE968700DE968700DE
+968700DE968700DE968700DE968700DE968700DE968700DE968700DE968700
+DE968700DE968700DE96A3510000A6550000AB5A0000B1600000B8670000C2
+720000CF7D0002E082000AF4850014FF890B17FF851220FF66024AFC4F0063
+E52B007DAE000496D9072E92EB055F91C20091938700DE968700DE968700DE
+968700DE968700DE968700DE968700DE968700DE968700DE968700DE968700
+DE968700DE968700DE968700DE968700DE96A3510000A6550000AB5A0000B1
+600000B8670000C2720000CF7D0002E082000AF4850014FF890B17FF851220
+FF66024AFC4F0063E52B007DAE000496D9072E92EB055F91C20091938700DE
+968700DE968700DE968700DE968700DE968700DE968700DE968700DE968700
+DE968700DE968700DE968700DE968700DE968700DE968700DE96A3510000A6
+550000AB5A0000B0600000B8670000C2720000CF7D0002E082000AF4860014
+FF890B16FF851220FF660249FC4F0063E62C007DAE000396D7072D92EB065E
+91C30090938700DB968700DB968700DB968700DB968700DB968700DB968700
+DB968700DB968700DB968700DB968700DB968700DB968700DB968700DB9687
+00DB96A3510000A6550000AA5A0000B0600000B7680000C0730000CD7D0002
+DF840009F5880012FF8C0B15FF89121EFF71083EFF58015FEF370079B90C01
+93C8022199EC0D5493C3007B979200AF999200AF999200AF999200AF999200
+AF999200AF999200AF999200AF999200AF999200AF999200AF999200AF9992
+00AF999200AF999200AF99A2510000A5560000AA5B0000AF600000B6680000
+BF730000CB7E0001DD850008F58B0110FF8F0C11FF8C121BFF7C0F32FF5E01
+5BFA430075CA19018FC002179DED144994BE006D9C9E008F9D9E008F9D9E00
+8F9D9E008F9D9E008F9D9E008F9D9E008F9D9E008F9D9E008F9D9E008F9D9E
+008F9D9E008F9D9E008F9D9E008F9D9E008F9DA2520000A5560000A95B0000
+AF610000B6680000BE740000C97F0000DD870006F68D020CFF930F0CFF9013
+18FF891726FF650158FE4D0070E128008ABA040D9FDE133999B80060A26A00
+7AAD68007AAD68007AAD68007AAD68007AAD68007AAD68007AAD68007AAD68
+007AAD68007AAD68007AAD68007AAD68007AAD68007AAD68007AADA2520000
+A4560000A95B0000AE610000B5690000BD740000C87F0000DD890005F79002
+0AFF971105FF951414FF8F1822FF6C0053FF5C0764EF360085B10F03A27302
+17B5550943BC2E005AC32E015AC32E015AC32E015AC32E015AC32E015AC32E
+015AC32E015AC32E015AC32E015AC32E015AC32E015AC32E015AC32E015AC3
+2E015AC3A2520000A4560000A85B0000AE610000B4690000BC740000C68000
+00DC8A0004F9920208FF9B1201FF9A160FFF92181FFF790846FF731351E357
+007C8438009D2E1600BE040B1BD1051247CA051347CA051347CA051347CA05
+1347CA051347CA051347CA051347CA051347CA051347CA051347CA051347CA
+051347CA051347CA051347CAA2520000A4560000A85B0000AD610000B36900
+00BB750000C5800000D98B0003F8940207FF9C1001FF9F1808FF97181CFF8E
+162FE1830559937100746D6B0093305001AF033B16C1005048B6005048B600
+5048B6005048B6005048B6005048B6005048B6005048B6005048B6005048B6
+005048B6005048B6005048B6005048B6005048B6A1530000A3570000A75C00
+00AC620000B26A0000B9750000C3810000D48C0001F5960205FF9F0E01FFA5
+1901FF9F1618F8A60F2EAA97005594A3006672AF007D4CBE009400700FAE00
+903EA300903FA300903FA300903FA300903FA300903FA300903FA300903FA3
+00903FA300903FA300903FA300903FA300903FA300903FA300903FA3A15300
+00A3570000A75C0000AB620000B16A0000B7760000C1810000D08D0000F198
+0104FFA20B00FFA91403FEB80F17CCB80032A3BE024295F0005087FF1B5245
+FF05770BC9009600FD2D9000FD2D9000FD2D9000FD2D9000FD2D9000FD2D90
+00FD2D9000FD2D9000FD2D9000FD2D9000FD2D9000FD2D9000FD2D9000FD2D
+9000FD2D90A1530000A2570000A65C0000AB630000B06B0000B6760000BE82
+0000CC8D0000ED9A0102FFA60701F4B7030CE4CF0018C3EC071EC7FF320182
+FF084256FF055A31FF03710DFF008400FF318100FF318100FF318100FF3181
+00FF318100FF318100FF318100FF318100FF318100FF318100FF318100FF31
+8100FF318100FF318100FF3181A0540000A2580000A55D0000AA630000AF6B
+0000B4770000BB820000C88E0000EC9D0100D3A80004CEBE000BBDDB0016AC
+FD071AA2FF221065FF014740FF005E1CFF007504FF0D7F00FF3A7600FF3A76
+00FF3A7600FF3A7600FF3A7600FF3A7600FF3A7600FF3A7600FF3A7600FF3A
+7600FF3A7600FF3A7600FF3A7600FF3A7600FF3A76A0540000A2580000A55D
+0000A9640000AD6C0000B2770000BA830000C88E0000B99A0000B8A90004B5
+C3000AA7E200149BFF081777FF022D52FF00492DFF00610FFF007300FF1C76
+00FF496D00FF496D00FF496D00FF496D00FF496D00FF496D00FF496D00FF49
+6D00FF496D00FF496D00FF496D00FF496D00FF496D00FF496D00FF496DA055
+0000A1590000A45E0000A8640000AD6C0000B2770000BA830000AF8F0000AA
+9C0001AAAE0005A4C8000B96E5001389FF041A64FF003143FF004A1EFF0064
+05FF036F00FF296D00FF556500FF576500FF576500FF576500FF576500FF57
+6500FF576500FF576500FF576500FF576500FF576500FF576500FF576500FF
+576500FF5765A0550000A1590000A45E0000A8640000AD6C0000B2770000AA
+840000A4910000A19F00019FB3000695CA000C89E7001379FF021C52FF0036
+32FF005012FF006401FF106908FF3A5F00FF5F5E00FF605D00FF605D00FF60
+5D00FF605D00FF605D00FF605D00FF605D00FF605D00FF605D00FF605D00FF
+605D00FF605D00FF605D00FF605DA0550000A1590000A45E0000A8640000AD
+6C0000A8780000A08600009B93000099A3000296B800068ACE000C7FED0013
+65FF002244FF003A24FF005308FF00620EFF285807FF425800FF665600FF67
+5600FF675600FF675600FF675600FF675600FF675600FF675600FF675600FF
+675600FF675600FF675600FF675600FF675600FF6756A0550000A1590000A4
+5D0000A8640000A66D00009C7A0000978800009496000192A700028CBC0006
+82D4000B75F6001353FA002737FF003D17FF005400FF036018FF3F4831FF64
+2B00FF695000FF6A5000FF6A5000FF6A5000FF6A5000FF6A5000FF6A5000FF
+6A5000FF6A5000FF6A5000FF6A5000FF6A5000FF6A5000FF6A5000FF6A50A0
+550000A1590000A45D0000A4650000996F0000947C0000908A00008D990001
+8BAC000386C300057DE1000A69F9001544F5002C36FF0E350EFF005300FF13
+5817FF46412BFF692807FF714507FF724507FF724507FF724507FF724507FF
+724507FF724507FF724507FF724507FF724507FF724507FF724507FF724507
+FF724507FF7245A0550000A1590000A35E000097670000907200008D7F0000
+8A8D0000869C000184B0000281CC000376EB000855ED001C39F6002E21FF02
+4206FF045015FF313F13FF4C3D26FF6B2512FF8B3711FF8D3711FF8D3711FF
+8D3711FF8D3711FF8D3711FF8D3711FF8D3711FF8D3711FF8D3711FF8D3711
+FF8D3711FF8D3711FF8D3711FF8D37A0550000A1590000956000008D690000
+8974000086810000828F00007FA000007FB600007DDA000071FA000643E100
+2130FA003016FF00440BFF15451BFF41320CFF4D3B01FF583F0EFF92330DFF
+93330DFF93330DFF93330DFF93330DFF93330DFF93330DFF93330DFF93330D
+FF93330DFF93330DFF93330DFF93330DFF93330DFF9333A0550000955B0000
+8B630001846B0000827600007E8400007991000077A3000078BC000070D500
+0357E2001138DD002227FB00320DFF02420CFF203C1DFF4B2A08FF4F3610FF
+712F0EFF922D0EFF932D0EFF932D0EFF932D0EFF932D0EFF932D0EFF932D0E
+FF932D0EFF932D0EFF932D0EFF932D0EFF932D0EFF932D0EFF932D0EFF932D
+965600008A5D0001826500007D6D00007A790000758600006D9300006CA500
+006CBB000063D5000344D400162FDD00231FFB003307FF063E0CFF293515FF
+49290EFF5A2D15FF7C260BFF98290BFF99290BFF99290BFF99290BFF99290B
+FF99290BFF99290BFF99290BFF99290BFF99290BFF99290BFF99290BFF9929
+0BFF99290BFF99298A580001805F00007A660000756F0000717B00006A8700
+006395000062A600005EBA000053CE000739D1001728E2002417FC003303FF
+0E3B0BFF2F2F0EFF4A280DFF602812FF80220AFF9B250AFF9C250AFF9C250A
+FF9C250AFF9C250AFF9C250AFF9C250AFF9C250AFF9C250AFF9C250AFF9C25
+0AFF9C250AFF9C250AFF9C250AFF9C25>
+<A34E0000A5520000A9560000AF5B0000B6610000BF690000CA730001D87800
+0AE77B0014FD7D041DFF780C24FD5B0049ED420061D81C007BC2001089E808
+3985E4006386D6079A818500D4868100D4868100D4868100D4868100D48681
+00D4868100D4868100D4868100D4868100D4868100D4868100D4868100D486
+8100D4868100D486A34E0000A5520000A9560000AF5B0000B6610000BF6900
+00CA730001D878000AE77B0014FD7D041DFF780C24FD5B0049ED420061D81C
+007BC2001089E8083985E4006386D6079A818500D4868100D4868100D48681
+00D4868100D4868100D4868100D4868100D4868100D4868100D4868100D486
+8100D4868100D4868100D4868100D486A34E0000A5520000A9560000AF5B00
+00B6610000BF690000CA730001D878000AE77B0014FD7D041DFF780C24FD5B
+0049ED420061D81C007BC2001089E8083985E4006386D6079A818500D48681
+00D4868100D4868100D4868100D4868100D4868100D4868100D4868100D486
+8100D4868100D4868100D4868100D4868100D4868100D486A34E0000A55200
+00A9560000AF5B0000B6610000BF690000CA730001D878000AE77B0014FD7D
+041DFF780C24FD5B0049ED420061D81C007BC2001089E8083985E4006386D6
+079A818500D4868100D4868100D4868100D4868100D4868100D4868100D486
+8100D4868100D4868100D4868100D4868100D4868100D4868100D4868100D4
+86A34E0000A5520000A9560000AF5B0000B6610000BF690000CA730001D878
+000AE77B0014FD7D041DFF780C24FD5B0049ED420061D81C007BC2001089E8
+083985E4006386D6079A818500D4868100D4868100D4868100D4868100D486
+8100D4868100D4868100D4868100D4868100D4868100D4868100D4868100D4
+868100D4868100D486A34E0000A5520000A9560000AF5B0000B6610000BF69
+0000CA730001D878000AE77B0014FD7D041DFF780C24FD5B0049ED420061D8
+1C007BC2001089E8083985E4006386D6079A818500D4868100D4868100D486
+8100D4868100D4868100D4868100D4868100D4868100D4868100D4868100D4
+868100D4868100D4868100D4868100D486A34E0000A5520000A9560000AF5B
+0000B6610000BF690000CA730001D878000AE77B0014FD7D041DFF780C24FD
+5B0049ED420061D81C007BC2001089E8083985E4006386D6079A818500D486
+8100D4868100D4868100D4868100D4868100D4868100D4868100D4868100D4
+868100D4868100D4868100D4868100D4868100D4868100D486A34E0000A552
+0000A9560000AF5B0000B6610000BF690000CA730001D878000AE77B0014FD
+7D041DFF780C24FD5B0049ED420061D81C007BC2001089E8083985E4006386
+D6079A818500D4868100D4868100D4868100D4868100D4868100D4868100D4
+868100D4868100D4868100D4868100D4868100D4868100D4868100D4868100
+D486A34E0000A5520000A9560000AF5B0000B6610000BF690000CA730001D8
+78000AE77B0014FD7D041DFF780C24FD5B0049ED420061D81C007BC2001089
+E8083985E4006386D6079A818500D4868100D4868100D4868100D4868100D4
+868100D4868100D4868100D4868100D4868100D4868100D4868100D4868100
+D4868100D4868100D486A34E0000A5520000A9560000AF5B0000B6610000BF
+690000CA730001D878000AE77B0014FD7D041DFF780C24FD5B0049ED420061
+D81C007BC2001089E8083985E4006386D6079A818500D4868100D4868100D4
+868100D4868100D4868100D4868100D4868100D4868100D4868100D4868100
+D4868100D4868100D4868100D4868100D486A34E0000A5520000A9560000AE
+5B0000B5610000BE690000C9730001D8790009E77D0013FD7F031DFF7D0E21
+FF600244F648005FDC220078BD000B8BDE063188E8035E87D90492848600DA
+898100DB888100DB888100DB888100DB888100DB888100DB888100DB888100
+DB888100DB888100DB888100DB888100DB888100DB888100DB88A24F0000A5
+520000A8560000AE5B0000B4610000BD6A0000C8740001D87B0007E77F0011
+FC81021BFF81101DFF69073BFD4F005CE42B0075BF06078BD203288CEE0758
+88DD0188898700E48D8100E58C8100E58C8100E58C8100E58C8100E58C8100
+E58C8100E58C8100E58C8100E58C8100E58C8100E58C8100E58C8100E58C81
+00E58CA24F0000A4520000A8560000AD5B0000B4620000BC6A0000C7750000
+D77D0006E8810010FC83021AFF840F1BFF720D32FF550059EC360072C50F04
+89C7001F91F50C5289E0007E8D8D00DD908200F0908200F0908200F0908200
+F0908200F0908200F0908200F0908200F0908200F0908200F0908200F09082
+00F0908200F0908200F090A24F0000A4520000A8570000AD5C0000B3620000
+BB6B0000C6760000D57E0005E783000EFB850119FF870F1AFF7D1229FF5A00
+56F640006ECD180287BE001794FD114B8AE20075909700CF938200FD948200
+FD948200FD948200FD948200FD948200FD948200FD948200FD948200FD9482
+00FD948200FD948200FD948200FD948200FD94A24F0000A4520000A7570000
+AC5C0000B2620000BB6B0000C5760000D37F0004E684000DFB870017FF8A0E
+18FF861622FF600052FD49006ADB220085B8010E97ED0E3D8FB2005F9B6000
+A6A75201BAA35201BAA35201BAA35201BAA35201BAA35201BAA35201BAA352
+01BAA35201BAA35201BAA35201BAA35201BAA35201BAA35201BAA3A2500000
+A3530000A7570000AC5C0000B2620000B96B0000C3770000D2810003E58600
+0BFC8A0015FF8D0E15FF89161FFF68014DFE520165E72E00809C0E029D6600
+16AE4D003EB73A097BB5290D93AF290D93AF290D93AF290D93AF290D93AF29
+0D93AF290D93AF290D93AF290D93AF290D93AF290D93AF290D93AF290D93AF
+290D93AFA2500000A3530000A6570000AB5C0000B1630000B86C0000C17800
+00CF820002E5890009FC8E040FFF92110FFF8E161CFF770B3CFF61025EC053
+00787332009A281300B6050A19C5061B5DC12A37A49F2A37A49F2A37A49F2A
+37A49F2A37A49F2A37A49F2A37A49F2A37A49F2A37A49F2A37A49F2A37A49F
+2A37A49F2A37A49F2A37A49FA1500000A3530000A6580000AA5D0000B06300
+00B76C0000C0780000CC830001E68C0007FC940708FF991506FF951717FF90
+1728B07700598A6D007062640090254601A8023616B7005359AE00557EA500
+557EA500557EA500557EA500557EA500557EA500557EA500557EA500557EA5
+00557EA500557EA500557EA500557EA500557EA5A1500000A2540000A55800
+00AA5D0000AF640000B66D0000BE790000C9840001E58F0004FD970705FF9E
+1500FFA21711DF9D02359F9400508A9F006368AB007A32920098006812A717
+B15E951EAF75891EAF75891EAF75891EAF75891EAF75891EAF75891EAF7589
+1EAF75891EAF75891EAF75891EAF75891EAF75891EAF75891EAF7589A15000
+00A2540000A4580000A95D0000AE640000B46D0000BB790000C6850000DE90
+0003FB9B0603FDA3040DF1B20319C1B8002B99BA003E86DD004E6BFF065F34
+D8007C01A4099200D9368A00E7548700E7548700E7548700E7548700E75487
+00E7548700E7548700E7548700E7548700E7548700E7548700E7548700E754
+8700E75487A1510000A1540000A4590000A85E0000AD650000B26E0000B97A
+0000C3860000D6910001DC9D0005D2AB000BC7C40014B1E2001DB2FF1F0C7C
+FF043851FF00542CFF006A0DFC027C00FF2A7A00FF3E7500FF3E7500FF3E75
+00FF3E7500FF3E7500FF3E7500FF3E7500FF3E7500FF3E7500FF3E7500FF3E
+7500FF3E7500FF3E7500FF3E75A0510000A1550000A3590000A75E0000AC66
+0000B16F0000B67A0000BF860000BE920000B49F0001B5B20006AECF000E9E
+EF011691FF0E1763FF003B42FF00521CFF006B03FF077500FF327000FF4D6B
+00FF4D6B00FF4D6B00FF4D6B00FF4D6B00FF4D6B00FF4D6B00FF4D6B00FF4D
+6B00FF4D6B00FF4D6B00FF4D6B00FF4D6B00FF4D6BA0520000A0550000A25A
+0000A65F0000AA660000AF6F0000B57B0000B3870000A9940000A8A20002A7
+B900079BD2000E8EF1011579FF022152FF003D2FFF005710FF006A01FF176E
+00FF3C6700FF5C6300FF5C6300FF5C6300FF5C6300FF5C6300FF5C6300FF5C
+6300FF5C6300FF5C6300FF5C6300FF5C6300FF5C6300FF5C6300FF5C63A052
+0000A0560000A25A0000A55F0000AA660000AF6F0000AE7B0000A5890000A0
+9600019FA6000399BC00088ED5000E81F4011564FF002743FF003F20FF005A
+06FF03670BFF2C5E00FF475F00FF675B00FF675B00FF675B00FF675B00FF67
+5B00FF675B00FF675B00FF675B00FF675B00FF675B00FF675B00FF675B00FF
+675B00FF675BA0520000A0560000A25A0000A55F0000AA660000AC700000A0
+7D00009B8B00009899000196AB00048FC1000884DB000E75FA001752FF002C
+36FF004314FF005A02FF0D6113FF3F5033FF6F2B00FF715300FF715300FF71
+5300FF715300FF715300FF715300FF715300FF715300FF715300FF715300FF
+715300FF715300FF715300FF7153A0520000A0560000A25A0000A55F0000AA
+6600009E720000977F0000938D0000919D00018EB0000387C700077DE6000D
+67FC001943FA003128FF03470AFF00590CFF24521CFF4D3E0EFF5E4300FF6D
+4E00FF6D4E00FF6D4E00FF6D4E00FF6D4E00FF6D4E00FF6D4E00FF6D4E00FF
+6D4E00FF6D4E00FF6D4E00FF6D4E00FF6D4E00FF6D4EA0520000A0560000A2
+5A0000A55F00009B69000094740000908200008D9000008AA0000186B50003
+82D0000675F0000C52F000203DFA072E1BFF014A03FF065514FF364327FF5D
+2C04FF5C450DFF843E0DFF843E0DFF843E0DFF843E0DFF843E0DFF843E0DFF
+843E0DFF843E0DFF843E0DFF843E0DFF843E0DFF843E0DFF843E0DFF843EA0
+520000A0560000A25A000099620000906B00008C7700008984000085930000
+83A4000081BB00027FE400016BF6000D42E600252EFD023511FF004A08FF17
+4919FF46371DFF5D2E06FF673E0EFF96360EFF96360EFF96360EFF96360EFF
+96360EFF96360EFF96360EFF96360EFF96360EFF96360EFF96360EFF96360E
+FF96360EFF9636A0520000A0560000985C00008E640000886E000085790000
+828700007D9500007DA900007CC4000071DD000453E3001637E4002723FF00
+390BFF074619FF333319FF4E2F03FF503D13FF802F0DFF99300DFF99300DFF
+99300DFF99300DFF99300DFF99300DFF99300DFF99300DFF99300DFF99300D
+FF99300DFF99300DFF99300DFF9930A0520000995700008C5E000184660000
+807000007D7C0000798900007398000073AC000071C4000165DE000541D600
+1A2EE600281AFF003904FF0A431AFF3B2B14FF4F2D0DFF612F12FF842A0CFF
+9B2B0CFF9B2B0CFF9B2B0CFF9B2B0CFF9B2B0CFF9B2B0CFF9B2B0CFF9B2B0C
+FF9B2B0CFF9B2B0CFF9B2B0CFF9B2B0CFF9B2B0CFF9B2B9B5300008C590001
+826100007C68000079720000757E00006D8B0000679A000067AC000064C400
+0153D5000A36D4001B27EA002912FF013803FF153D18FF412603FF443417FF
+732310FF89260AFF9F270AFF9F270AFF9F270AFF9F270AFF9F270AFF9F270A
+FF9F270AFF9F270AFF9F270AFF9F270AFF9F270AFF9F270AFF9F270AFF9F27
+8D560000825C00007A620000746A0000707400006A800000648D00005E9B00
+005CAC000059C4000143CC00102ED6001C20EF00290AFF023601FF1C3715FF
+452303FF4C2D15FF771F0DFF8B2309FFA12409FFA12409FFA12409FFA12409
+FFA12409FFA12409FFA12409FFA12409FFA12409FFA12409FFA12409FFA124
+09FFA12409FFA12483580001795D0000726400006C6C000068770000628300
+005C8F0000589D000053AD00004DC0000438CC001128DA001C1AF4002904FF
+0A3307FF282B14FF4B1E17FF661A11FF7A1C0BFF8E1F0AFFA11F0AFFA11F0A
+FFA11F0AFFA11F0AFFA11F0AFFA11F0AFFA11F0AFFA11F0AFFA11F0AFFA11F
+0AFFA11F0AFFA11F0AFFA11F0AFFA11F>
+<A24B0000A44E0000A8520000AD560000B45B0000BC610000C7690000D36E00
+08E0710013F471001FFE69032CF3510047D834005ED10B017AC500197EF705
+427BE300687ADA0FA16EC109FD6CAE13FE66AE12FE66AE12FE66AE12FE66AE
+12FE66AE12FE66AE12FE66AE12FE66AE12FE66AE12FE66AE12FE66AE12FE66
+AE12FE66AE12FE66A24B0000A44E0000A8520000AD560000B45B0000BC6100
+00C7690000D36E0008E0710013F471001FFE69032CF3510047D834005ED10B
+017AC500197EF705427BE300687ADA0FA16EC109FD6CAE13FE66AE12FE66AE
+12FE66AE12FE66AE12FE66AE12FE66AE12FE66AE12FE66AE12FE66AE12FE66
+AE12FE66AE12FE66AE12FE66AE12FE66A24B0000A44E0000A8520000AD5600
+00B45B0000BC610000C7690000D36E0008E0710013F471001FFE69032CF351
+0047D834005ED10B017AC500197EF705427BE300687ADA0FA16EC109FD6CAE
+13FE66AE12FE66AE12FE66AE12FE66AE12FE66AE12FE66AE12FE66AE12FE66
+AE12FE66AE12FE66AE12FE66AE12FE66AE12FE66AE12FE66A24B0000A44E00
+00A8520000AD560000B45B0000BC610000C7690000D36E0008E0710013F471
+001FFE69032CF3510047D834005ED10B017AC500197EF705427BE300687ADA
+0FA16EC109FD6CAE13FE66AE12FE66AE12FE66AE12FE66AE12FE66AE12FE66
+AE12FE66AE12FE66AE12FE66AE12FE66AE12FE66AE12FE66AE12FE66AE12FE
+66A24B0000A44E0000A8520000AD560000B45B0000BC610000C7690000D36E
+0008E0710013F471001FFE69032CF3510047D834005ED10B017AC500197EF7
+05427BE300687ADA0FA16EC109FD6CAE13FE66AE12FE66AE12FE66AE12FE66
+AE12FE66AE12FE66AE12FE66AE12FE66AE12FE66AE12FE66AE12FE66AE12FE
+66AE12FE66AE12FE66A24B0000A44E0000A8520000AD560000B45B0000BC61
+0000C7690000D36E0008E0710013F471001FFE69032CF3510047D834005ED1
+0B017AC500197EF705427BE300687ADA0FA16EC109FD6CAE13FE66AE12FE66
+AE12FE66AE12FE66AE12FE66AE12FE66AE12FE66AE12FE66AE12FE66AE12FE
+66AE12FE66AE12FE66AE12FE66AE12FE66A24B0000A44E0000A8520000AD56
+0000B45B0000BC610000C7690000D36E0008E0710013F471001FFE69032CF3
+510047D834005ED10B017AC500197EF705427BE300687ADA0FA16EC109FD6C
+AE13FE66AE12FE66AE12FE66AE12FE66AE12FE66AE12FE66AE12FE66AE12FE
+66AE12FE66AE12FE66AE12FE66AE12FE66AE12FE66AE12FE66A24B0000A44E
+0000A8520000AD560000B45B0000BC610000C7690000D36E0008E0710013F4
+71001FFE69032CF3510047D834005ED10B017AC500197EF705427BE300687A
+DA0FA16EC109FD6CAE13FE66AE12FE66AE12FE66AE12FE66AE12FE66AE12FE
+66AE12FE66AE12FE66AE12FE66AE12FE66AE12FE66AE12FE66AE12FE66AE12
+FE66A24B0000A44E0000A8520000AD560000B35B0000BC610000C7690000D3
+6F0008DF720013F472001FFE6B042AF6530046DA37005ED20E0079C500177F
+F1053E7CE400657BDA0E9D70BC07F86FA911FA68A911F968A911F968A911F9
+68A911F968A911F968A911F968A911F968A911F968A911F968A911F968A911
+F968A911F968A911F968A24B0000A44F0000A7520000AD560000B35B0000BB
+620000C66A0000D2700007DE730012F274001DFF6F0627FA580043E23E005B
+D3160075C4001281E604377FE600607DDB0A9475B003EE75A00EF06D9F0EF0
+6D9F0EF06D9F0EF06D9F0EF06D9F0EF06D9F0EF06D9F0EF06D9F0EF06D9F0E
+F06D9F0EF06D9F0EF06D9F0EF06D9F0EF06DA24C0000A44F0000A7520000AC
+560000B25B0000BA620000C56A0000D1710006DD750011F176001CFF750823
+FB5E033DEC440059D61D0072C3000D83DB023081EA025B7EDC058D7AA901E3
+7A960AE773960AE773960AE773960AE773960AE773960AE773960AE773960A
+E773960AE773960AE773960AE773960AE773960AE773960AE773A24C0000A4
+4F0000A7520000AC570000B25C0000BA620000C46B0000D0720005DD760010
+F078001BFF7A0B1EFC650637F44A0057D826006FC6060A83D1012984EF0556
+80DD018580AD04D27C8E06DE798E06DE798E06DE798E06DE798E06DE798E06
+DE798E06DE798E06DE798E06DE798E06DE798E06DE798E06DE798E06DE798E
+06DE79A24C0000A44F0000A6530000AB570000B15C0000B9630000C36B0000
+CF740004DD78000EEF7A0019FF7C0A1DFD6D0A30F84F0054DB2F006CCA0B07
+82C9002287F4085181DE007E83B308C37E8502D6808502D6808502D6808502
+D6808502D6808502D6808502D6808502D6808502D6808502D6808502D68085
+02D6808502D6808502D680A24C0000A34F0000A6530000AB570000B15C0000
+B8630000C26C0000CF750003DD7A000DED7C0018FF7E091CFF760D29FC5400
+51E2380069CF110382C7001C8AFB0B4B83E1007586BC0AB6807D00D5877800
+D6897800D6897800D6897800D6897800D6897800D6897800D6897800D68978
+00D6897800D6897800D6897800D6897800D689A14C0000A34F0000A6530000
+AA580000B05D0000B7640000C16D0000CE770002DD7C000BED7E0016FF8107
+1CFF7E1023FF5B004EEB410065D71B0080BD00128DF207408BA4005F957803
+9F9C4800E6964300EA974300EA974300EA974300EA974300EA974300EA9743
+00EA974300EA974300EA974300EA974300EA974300EA974300EA97A14D0000
+A3500000A5530000AA580000AF5D0000B6640000C06E0000CC780002DC7E00
+09ED810014FF84061AFF821020FF640346F64C0061DE29007B8A0D02985F00
+17A649003BAC360370B12A13C99F2310BEA12310BEA12310BEA12310BEA123
+10BEA12310BEA12310BEA12310BEA12310BEA12310BEA12310BEA12310BEA1
+2310BEA1A14D0000A2500000A5540000A9580000AE5E0000B5650000BE6E00
+00C97A0001DA810007EE850010FF880518FF87101CFF750D34EB5E005CA64E
+0074682D0094231100AF050A1BBA051951BD2539C894213AC694213AC69421
+3AC694213AC694213AC694213AC694213AC694213AC694213AC694213AC694
+213AC694213AC694213AC694A14D0000A2500000A4540000A8590000AD5E00
+00B4650000BC6F0000C77B0000D7830005ED89000DFF8D0513FF8E1117FF8B
+0A2FA47400558269006C585B008C1E3B01A1003217AE014747A800488D9B00
+498B9A00498B9A00498B9A00498B9A00498B9A00498B9A00498B9A00498B9A
+00498B9A00498B9A00498B9A00498B9A00498B9AA14E0000A2510000A45500
+00A7590000AC5F0000B2660000BA700000C47C0000D4860003F08D000AFF94
+0B09FB9A041CC39800339691004B829B0060599300791F6B0096006215A006
+9A58960395B08A0397B1890397B1890397B1890397B1890397B1890397B189
+0397B1890397B1890397B1890397B1890397B1890397B1890397B189A14E00
+00A1510000A3550000A65A0000AB5F0000B1660000B8710000C17D0000CF88
+0001EF910006DC9A000FD7AA0018B3B200278FB0003A7AC7004E58D5006227
+B1007E0093128D00B6398500D58C7B00D78A7B00D78A7B00D78A7B00D78A7B
+00D78A7B00D78A7B00D78A7B00D78A7B00D78A7B00D78A7B00D78A7B00D78A
+7B00D78A7BA14F0000A1520000A2560000A55A0000AA600000AF670000B571
+0000BE7D0000C9890000BD940004B9A1000AB3B60011A5CF001998F6011F77
+FA00344EF2005027EC006806E0087900F32B7500FA5E6E00FD616D00FD616D
+00FD616D00FD616D00FD616D00FD616D00FD616D00FD616D00FD616D00FD61
+6D00FD616D00FD616D00FD616DA14F0000A0520000A2560000A45B0000A960
+0000AE680000B3720000BA7E0000AD8B0000A8980002A7A90005A1C1000A94
+DD001188FA031865FF002C43FF00461EFF006104FF046D00FF2B6900FF5862
+00FF5E6100FF5E6100FF5E6100FF5E6100FF5E6100FF5E6100FF5E6100FF5E
+6100FF5E6100FF5E6100FF5E6100FF5E6100FF5E61A0500000A0530000A157
+0000A45B0000A7610000AC690000B0730000A7800000A08E00009E9C00019B
+AE000593C5000A88E1001176FB011A52FF003333FF004B11FF006101FF1366
+0AFF3F5A00FF605A00FF6A5900FF6A5900FF6A5900FF6A5900FF6A5900FF6A
+5900FF6A5900FF6A5900FF6A5900FF6A5900FF6A5900FF6A5900FF6A59A050
+0000A0530000A1570000A35C0000A7620000AC690000A47500009C82000098
+90000095A0000293B4000588C9000A7EEB001064FE001F43FF003623FF0051
+07FF015F1AFF394B1EFF533F00FF685200FF755100FF755100FF755100FF75
+5100FF755100FF755100FF755100FF755100FF755100FF755100FF755100FF
+755100FF7551A0500000A0540000A1570000A35C0000A7620000A16B000098
+77000094850000909300008FA400028AB9000481D2000975F4001053F70024
+3CFF063417FF005102FF095A16FF404531FF6A2601FF654C01FF724B01FF72
+4B01FF724B01FF724B01FF724B01FF724B01FF724B01FF724B01FF724B01FF
+724B01FF724B01FF724B01FF724BA0500000A0540000A1570000A35C00009E
+630000946D0000907A00008D8700008996000087A9000283C000037DE20006
+68F6001242F0002936FF0E310CFF005008FF1D4C15FF483E30FF702011FF84
+3A10FF983810FF983810FF983810FF983810FF983810FF983810FF983810FF
+983810FF983810FF983810FF983810FF983810FF9838A0500000A0540000A1
+5700009C5D0000926600008C700000897C0000858A00008199000080AD0001
+80CB000173E6000650E4001B36F0002C1FFF004007FF074B1AFF3A3610FF4C
+3A08FF5A3A0FFF8F340CFFA1340CFFA1340CFFA1340CFFA1340CFFA1340CFF
+A1340CFFA1340CFFA1340CFFA1340CFFA1340CFFA1340CFFA1340CFFA134A0
+500000A05300009D5800008F6000008868000084720000817F00007D8C0000
+799C000079B2000077CF00016BEE00063FD9001E2DF1002D15FF004007FF14
+431DFF452C0DFF50350CFF6A330EFF902E0BFFA12E0BFFA12E0BFFA12E0BFF
+A12E0BFFA12E0BFFA12E0BFFA12E0BFFA12E0BFFA12E0BFFA12E0BFFA12E0B
+FFA12E0BFFA12EA05000009F5400008F5A0000866200007F6A00007C740000
+79810000728E00006D9F00006EB400006BCF000151D7001034D6001F25F300
+2E0CFF013E04FF1C3E1DFF4D2508FF513215FF7A270CFF962A0AFFA42A0AFF
+A42A0AFFA42A0AFFA42A0AFFA42A0AFFA42A0AFFA42A0AFFA42A0AFFA42A0A
+FFA42A0AFFA42A0AFFA42A0AFFA42AA050000090560000845D00017D640000
+776C0000747700006E8300006790000063A0000061B300005DCD000240CF00
+142DD900201DF6002F07FF073A03FF243813FF4A260BFF5B2A13FF7F230AFF
+992608FFA72608FFA72608FFA72608FFA72608FFA72608FFA72608FFA72608
+FFA72608FFA72608FFA72608FFA72608FFA72608FFA7269252000085580001
+7B5F0000746600006F6E00006A790000648500005E9300005BA2000057B300
+004DC7000636CF001526DF002116F9002E02FF0F370AFF2F2B11FF502215FF
+6C1D10FF821F0AFF9A2207FFA62207FFA62207FFA62207FFA62207FFA62207
+FFA62207FFA62207FFA62207FFA62207FFA62207FFA62207FFA62207FFA622
+865500017B5A0000726000006C67000067710000627C00005C880000579500
+0054A400004FB5000141C5000A2ED1001520E5002110FC032C01FF183013FF
+3D1E14FF591A12FF701B11FF85190AFF9B1D08FFA61D08FFA61D08FFA61D08
+FFA61D08FFA61D08FFA61D08FFA61D08FFA61D08FFA61D08FFA61D08FFA61D
+08FFA61D08FFA61D7C560000725C00006A62000065690000607400005B7F00
+00568B0000519800004DA6000046B6000238C7000A28D600151BEA002009FE
+052B00FF1E2B11FF421911FF5D1813FF741418FF890A0AFF9B1906FFA61B06
+FFA61B06FFA61B06FFA61B06FFA61B06FFA61B06FFA61B06FFA61B06FFA61B
+06FFA61B06FFA61B06FFA61B06FFA61B>
+<A1480000A34A0000A74E0000AB510000B2560000B95A0000C4600000D06500
+07DC680012EE66001EF75B002FE6440045D126005DCC000575C2001F73F800
+4673DC00696EE500B46AA900ED69A813FF58A813FF58A813FF58A813FF58A8
+13FF58A813FF58A813FF58A813FF58A813FF58A813FF58A813FF58A813FF58
+A813FF58A813FF58A1480000A34A0000A74E0000AB510000B2560000B95A00
+00C4600000D0650007DC680012EE66001EF75B002FE6440045D126005DCC00
+0575C2001F73F8004673DC00696EE500B46AA900ED69A813FF58A813FF58A8
+13FF58A813FF58A813FF58A813FF58A813FF58A813FF58A813FF58A813FF58
+A813FF58A813FF58A813FF58A813FF58A1480000A34A0000A74E0000AB5100
+00B2560000B95A0000C4600000D0650007DC680012EE66001EF75B002FE644
+0045D126005DCC000575C2001F73F8004673DC00696EE500B46AA900ED69A8
+13FF58A813FF58A813FF58A813FF58A813FF58A813FF58A813FF58A813FF58
+A813FF58A813FF58A813FF58A813FF58A813FF58A813FF58A1480000A34A00
+00A74E0000AB510000B2560000B95A0000C4600000D0650007DC680012EE66
+001EF75B002FE6440045D126005DCC000575C2001F73F8004673DC00696EE5
+00B46AA900ED69A813FF58A813FF58A813FF58A813FF58A813FF58A813FF58
+A813FF58A813FF58A813FF58A813FF58A813FF58A813FF58A813FF58A813FF
+58A1480000A34A0000A74E0000AB510000B2560000B95A0000C4600000D065
+0007DC680012EE66001EF75B002FE6440045D126005DCC000575C2001F73F8
+004673DC00696EE500B46AA900ED69A813FF58A813FF58A813FF58A813FF58
+A813FF58A813FF58A813FF58A813FF58A813FF58A813FF58A813FF58A813FF
+58A813FF58A813FF58A1480000A34A0000A74E0000AB510000B2560000B95A
+0000C4600000D0650007DC680012EE66001EF75B002FE6440045D126005DCC
+000575C2001F73F8004673DC00696EE500B46AA900ED69A813FF58A813FF58
+A813FF58A813FF58A813FF58A813FF58A813FF58A813FF58A813FF58A813FF
+58A813FF58A813FF58A813FF58A813FF58A1480000A34B0000A74E0000AB51
+0000B1560000B95B0000C4600000CF650007DC680012EE66001EF75B002EE7
+450044D127005DCC000475C2001F74F9004673DC00696FE600B36AAA00ED69
+A813FF58A813FF58A813FF58A813FF58A813FF58A813FF58A813FF58A813FF
+58A813FF58A813FF58A813FF58A813FF58A813FF58A813FF58A1480000A34B
+0000A74E0000AB520000B1560000B95B0000C3610000CF660006DB690011ED
+68001DF95E002DEC4A0043D22C005ACF000177C2001C75FB004275DF006570
+EA00AE6CAF00EB6AA912FF5BA913FF5AA913FF5AA913FF5AA913FF5AA913FF
+5AA913FF5AA913FF5AA913FF5AA913FF5AA913FF5AA913FF5AA913FF5AA913
+FF5AA1480000A34B0000A64E0000AB520000B1560000B85B0000C2610000CE
+670005DB6A0010EC6A001CFA62002BF14E0041D4310058CF060075C3001877
+EF003C77E2006272E700A26EB500E96BAB12FF5DAA13FF5CAA13FF5CAA13FF
+5CAA13FF5CAA13FF5CAA13FF5CAA13FF5CAA13FF5CAA13FF5CAA13FF5CAA13
+FF5CAA13FF5CAA13FF5CA1480000A34B0000A64F0000AA520000B0560000B8
+5C0000C2620000CE680005DA6C000FEB6C001BFB660129F452003FD9370056
+CF0D0072C3001479E5003678E6005E74E3009771BD00E86CAC12FF5FAB13FF
+5EAB13FF5EAB13FF5EAB13FF5EAB13FF5EAB13FF5EAB13FF5EAB13FF5EAB13
+FF5EAB13FF5EAB13FF5EAB13FF5EAB13FF5EA1480000A34B0000A64F0000AA
+520000B0570000B75C0000C1620000CD690004D96D000EE96D001AFC6A0225
+F656003CDF3D0054CE15006EC300117BDB00307AE9015A76E0008D73C500E5
+6DAE12FF61AC13FF60AC13FF60AC13FF60AC13FF60AC13FF60AC13FF60AC13
+FF60AC13FF60AC13FF60AC13FF60AC13FF60AC13FF60AC13FF60A1490000A3
+4C0000A64F0000AA530000B0570000B75C0000C0630000CC6A0003D86E000D
+E76F0019FC6E0323F85A003AE5420052CE1C006BC6030D7BD1002B7BEE0256
+78DD008376C905D86DB012FF64AD13FF62AD13FF62AD13FF62AD13FF62AD13
+FF62AD13FF62AD13FF62AD13FF62AD13FF62AD13FF62AD13FF62AD13FF62AD
+13FF62A1490000A34C0000A54F0000A9530000AF570000B65D0000C0640000
+CB6B0002D76F000CE6710017FA710321FB600037EB48004FCD260067CA0609
+7CC800247EF303517ADB007A79CD09CA6EB512FF66AF13FF65AF13FF65AF13
+FF65AF13FF65AF13FF65AF13FF65AF13FF65AF13FF65AF13FF65AF13FF65AF
+13FF65AF13FF65AF13FF65A1490000A24C0000A5500000A9530000AF580000
+B55D0000BF640000CA6C0001D671000BE3730016F974031FFF660033F34F00
+4CD1300064CE0A057CC6001E80FA064B7CDE00727CD30BBE727C00D27E6A00
+F2806900F2806900F2806900F2806900F2806900F2806900F2806900F28069
+00F2806900F2806900F2806900F2806900F280A14A0000A24D0000A5500000
+A8540000AE580000B45E0000BD650000C96D0001D5730009E2760014F87702
+1EFF6E042BF9560049DE3A0060D412007CC4001683C00238889000578F7800
+94964B00D58D3F00EE8C3F00EE8C3F00EE8C3F00EE8C3F00EE8C3F00EE8C3F
+00EE8C3F00EE8C3F00EE8C3F00EE8C3F00EE8C3F00EE8C3F00EE8CA14A0000
+A24D0000A4500000A8540000AD590000B35E0000BC660000C76F0001D47500
+07E2790012F77A011CFF770A23FD61043FF146005CC62800777B0B01925800
+17A0440037A4320064A82107D69F2D1AFF902C1AFF902C1AFF902C1AFF902C
+1AFF902C1AFF902C1AFF902C1AFF902C1AFF902C1AFF902C1AFF902C1AFF90
+2C1AFF90A14A0000A24D0000A4510000A7540000AC590000B25F0000BA6600
+00C5700000D2780005E27D000FF47F011AFF810E1BFF710C30C35B00579347
+00715E29008E1F0F00A8050A1BB0041546B01330DB971934D98E1934D88E19
+34D88E1934D88E1934D88E1934D88E1934D88E1934D88E1934D88E1934D88E
+1934D88E1934D88E1934D88EA14B0000A24E0000A3510000A6550000AB5A00
+00B15F0000B9670000C3720000D07C0003E180000CF4830016FE870B19DF82
+02339B7100507A6300695252008716300098003017A5004143A10145849502
+438E8F01438E8F01438E8F01438E8F01438E8F01438E8F01438E8F01438E8F
+01438E8F01438E8F01438E8F01438E8F01438E8FA14B0000A14E0000A35100
+00A5550000AA5A0000B0600000B7680000C0730000CC7E0001DE850008EB8A
+0012E293001EB09000308E8D00467993005E4E830078175A0092005B179901
+6D43910590AC851692CD731692CD731692CD731692CD731692CD731692CD73
+1692CD731692CD731692CD731692CD731692CD731692CD731692CD73A14C00
+00A14F0000A2520000A4560000A95B0000AE610000B5690000BD740000C87F
+0000D0890005C391000EBD9F0018A5A8002588A9003571B8004C4CB000641D
+9400800086168700A03F8000BA827800C9B07000C9B07000C9B07000C9B070
+00C9B07000C9B07000C9B07000C9B07000C9B07000C9B07000C9B07000C9B0
+7000C9B070A14C0000A14F0000A1520000A3570000A85B0000AD620000B36A
+0000BA750000BA810000AF8D0004AB98000BA6AA001299BE00188BD6001F69
+D4003748D5004F1FC6006901B8107600D8316F00DD5B6901F7876501F78765
+01F7876501F7876501F7876501F7876501F7876501F7876501F7876501F787
+6501F7876501F7876501F78765A14D0000A1500000A1530000A3570000A65C
+0000AB620000B06A0000AF760000A5840000A09100039CA0000697B4000A8D
+CB001080E9001664F8002642FB003E20FF005905FD066512FF38570AFF5253
+00FF6C5800FF6C5800FF6C5800FF6C5800FF6C5800FF6C5800FF6C5800FF6C
+5800FF6C5800FF6C5800FF6C5800FF6C5800FF6C58A14D0000A0500000A054
+0000A2580000A55D0000A9630000AA6C00009E790000998800009596000193
+A700038EBD000683D5000C75F7001453FC002935FF004013FF00580AFF1558
+10FF414E24FF6A3300FF745000FF745000FF745000FF745000FF745000FF74
+5000FF745000FF745000FF745000FF745000FF745000FF745000FF7450A14E
+0000A0510000A0540000A1590000A45D0000A56400009B6F0000957C000091
+8A00008E9900018CAD000386C300057DE2000A67F9001742F7002E2EFF093D
+09FF005606FF21522BFF5C2C00FF594C05FF7B4605FF7B4605FF7B4605FF7B
+4605FF7B4605FF7B4605FF7B4605FF7B4605FF7B4605FF7B4605FF7B4605FF
+7B4605FF7B46A14F0000A0510000A0550000A1590000A35E00009767000090
+7200008D7F00008A8D0000869D000184B1000281CE000375ED000950EB001E
+38F9022F1BFF004703FF075219FF3F3A22FF5E2C01FF5F430EFF9E360EFF9E
+360EFF9E360EFF9E360EFF9E360EFF9E360EFF9E360EFF9E360EFF9E360EFF
+9E360EFF9E360EFF9E360EFF9E36A14F0000A0510000A0550000A159000094
+6100008C6A00008874000085820000819000007EA100007EB800007CDC0001
+6FFD000740E100222DFE003311FF014612FF233D1BFF4A3105FF513E11FF7B
+330BFFA9320AFFAB320AFFAB320AFFAB320AFFAB320AFFAB320AFFAB320AFF
+AB320AFFAB320AFFAB320AFFAB320AFFAB320AFFAB32A14F0000A0510000A0
+550000935B00008A630001836C0000817700007D8400007792000075A40000
+77BE00006ED700034FDB001534DF002424FF003509FF044314FF2E321EFF55
+2807FF5A3611FF832C09FFAB2D08FFAE2D08FFAE2D08FFAE2D08FFAE2D08FF
+AE2D08FFAE2D08FFAE2D08FFAE2D08FFAE2D08FFAE2D08FFAE2D08FFAE2DA1
+4F0000A051000093570000885E0001806500007B6E00007879000073860000
+6A9400006AA6000069BC00005FD500053FD300182CE100251AFE003504FF0C
+3E13FF362C06FF433218FF722410FF892707FFAB2907FFAC2907FFAC2907FF
+AC2907FFAC2907FFAC2907FFAC2907FFAC2907FFAC2907FFAC2907FFAC2907
+FFAC2907FFAC29A14F000095530000885900017E6000007767000073700000
+6E7C000068880000619600005FA700005CBB00004ECC000A35D2001825E600
+2612FE003401FF153A10FF3B2805FF4A2D15FF77200DFF8B2306FFAD2605FF
+AD2605FFAD2605FFAD2605FFAD2605FFAD2605FFAD2605FFAD2605FFAD2605
+FFAD2605FFAD2605FFAD2605FFAD2699500000885500007D5B000075610000
+6F6900006A730000657E00005F8B00005998000056A8000052BC000140C900
+0E2DD400181FEB00260AFE043201FF1E3315FF471E15FF611C13FF7A1C0AFF
+8E2004FFA62203FFA72203FFA72203FFA72203FFA72203FFA72203FFA72203
+FFA72203FFA72203FFA72203FFA72203FFA72203FFA7228A5200007E570000
+745D00006D630000676B0000637600005D810000588E0000539B00004FAA00
+0048BC000336CA000E26D9001919F1002505FF0A2E02FF252B15FF4D1912FF
+661912FF7C170CFF901A06FFA81D05FFA81E05FFA81E05FFA81E05FFA81E05
+FFA81E05FFA81E05FFA81E05FFA81E05FFA81E05FFA81E05FFA81E05FFA81E
+7F540000755900006C5E000065650000606E00005C79000057840000529100
+004D9E000048AC00003EBD00052ECE000E20DF001912F5002400FF122B01FF
+292613FF521510FF681519FF810712FF930E03FFA91B03FFA91B03FFA91B03
+FFA91B03FFA91B03FFA91B03FFA91B03FFA91B03FFA91B03FFA91B03FFA91B
+03FFA91B03FFA91B765500006C5A0000646000005F6700005A710000557C00
+00508800004C94000047A0000040AF000036C2000527D2000E1BE500190AF8
+022400FF1A250CFF371712FF560F0CFF6A1313FF800A12FF930802FFA31801
+FFA41801FFA41801FFA41801FFA41801FFA41801FFA41801FFA41801FFA418
+01FFA41801FFA41801FFA41801FFA418>
+<A1440000A3470000A64A0000AA4D0000B0510000B7540000C1590000CC5D00
+06D95E0011E85A001DEC4D002EDB370043D418005DC4000C6CBE002569CF00
+4468D2006B64C3009962A900D15FAC13FF4DA412FF4CA412FF4CA412FF4CA4
+12FF4CA412FF4CA412FF4CA412FF4CA412FF4CA412FF4CA412FF4CA412FF4C
+A412FF4CA412FF4CA1440000A3470000A64A0000AA4D0000B0510000B75400
+00C1590000CC5D0006D95E0011E85A001DEC4D002EDB370043D418005DC400
+0C6CBE002569CF004468D2006B64C3009962A900D15FAC13FF4DA412FF4CA4
+12FF4CA412FF4CA412FF4CA412FF4CA412FF4CA412FF4CA412FF4CA412FF4C
+A412FF4CA412FF4CA412FF4CA412FF4CA1440000A3470000A64A0000AA4D00
+00B0510000B7540000C1590000CC5D0006D95E0011E85A001DEC4D002EDB37
+0043D418005DC4000C6CBE002569CF004468D2006B64C3009962A900D15FAC
+13FF4DA412FF4CA412FF4CA412FF4CA412FF4CA412FF4CA412FF4CA412FF4C
+A412FF4CA412FF4CA412FF4CA412FF4CA412FF4CA412FF4CA1440000A34700
+00A64A0000AA4D0000B0510000B7540000C1590000CC5D0006D95E0011E85A
+001DEC4D002EDB370043D418005DC4000C6CBE002569CF004468D2006B64C3
+009962A900D15FAC13FF4DA412FF4CA412FF4CA412FF4CA412FF4CA412FF4C
+A412FF4CA412FF4CA412FF4CA412FF4CA412FF4CA412FF4CA412FF4CA412FF
+4CA1440000A3470000A64A0000AA4D0000B0510000B7540000C1590000CC5D
+0006D95E0011E85A001DEC4D002EDB370043D418005DC4000C6CBE002569CF
+004468D2006B64C3009962A900D15FAC13FF4DA412FF4CA412FF4CA412FF4C
+A412FF4CA412FF4CA412FF4CA412FF4CA412FF4CA412FF4CA412FF4CA412FF
+4CA412FF4CA412FF4CA1450000A3470000A54A0000AA4D0000B0510000B755
+0000C0590000CB5D0005D95F0010E85C001DED50002DDE3B0042D41C005BC5
+000A6DBF00236ACE004169D4006865C5009664AB00D060AD13FF4EA513FF4D
+A513FF4DA513FF4DA513FF4DA513FF4DA513FF4DA513FF4DA513FF4DA513FF
+4DA513FF4DA513FF4DA513FF4DA513FF4DA1450000A2470000A54A0000AA4E
+0000AF510000B6550000C05A0000CB5E0004D8600010E75E001CEF53002BE2
+3F0040D3200059C700076FBF00216CCC003E6AD6006667C8009365AE00CE61
+AD12FF51A513FF4EA513FF4EA513FF4EA513FF4EA513FF4EA513FF4EA513FF
+4EA513FF4EA513FF4EA513FF4EA513FF4EA513FF4EA513FF4EA1450000A247
+0000A54A0000AA4E0000AF510000B6550000BF5A0000CA5F0004D761000FE7
+60001AF056002AE643003FD2240057C9000470C0001E6DCE003B6CD9006368
+CC009267B200CD62AC11FF53A513FF50A513FF50A513FF50A513FF50A513FF
+50A513FF50A513FF50A513FF50A513FF50A513FF50A513FF50A513FF50A513
+FF50A1450000A2470000A54B0000A94E0000AF520000B5560000BF5A0000CA
+5F0003D762000EE661001AF2590028E947003DD2280054CA04036EC0001B6F
+CC00376DDC006069CE008E68B700CC63AB0FFF56A613FF51A613FF51A613FF
+51A613FF51A613FF51A613FF51A613FF51A613FF51A613FF51A613FF51A613
+FF51A613FF51A613FF51A1460000A2480000A54B0000A94E0000AF520000B5
+560000BE5B0000C9600003D663000EE5630019F35C0027EC4A003BD32D0052
+CA0A036CC1001870CA00346FDF005D6BD0008969BB00CB64AA0EFF59A613FF
+53A613FF53A613FF53A613FF53A613FF53A613FF53A613FF53A613FF53A613
+FF53A613FF53A613FF53A613FF53A613FF53A1460000A2480000A54B0000A9
+4F0000AE520000B5560000BE5B0000C9610002D565000DE4650018F55F0025
+EF4E0039D4330050CA10026AC2001572C8003070E200596DD200836BC100CA
+65A90CFF5DA713FF55A713FF55A713FF55A713FF55A713FF55A713FF55A713
+FF55A713FF55A713FF55A713FF55A713FF55A713FF55A713FF55A1460000A2
+480000A44B0000A84F0000AE530000B4570000BD5C0000C8620002D466000C
+E2670017F5630023F2530037D839004DCA170167C4001074C6002B72E90055
+6FD4007D6DC900C867A90AFE60A713FF57A713FF57A713FF57A713FF57A713
+FF57A713FF57A713FF57A713FF57A713FF57A713FF57A713FF57A713FF57A7
+13FF57A1470000A2490000A44C0000A84F0000AD530000B3570000BC5D0000
+C7630000D367000AE0690015F3660022F7580034E040004BCB1F0063C8000B
+76C3002674F1005073D700756FD201C469A909FD64A813FF5AA813FF5AA813
+FF5AA813FF5AA813FF5AA813FF5AA813FF5AA813FF5AA813FF5AA813FF5AA8
+13FF5AA813FF5AA813FF5AA1470000A2490000A44C0000A8500000AC530000
+B3580000BB5D0000C6640000D2690009DF6C0014F26A0020FB5F0030E94700
+48CF280060CC030678C3002077F9024976DB006E72C501BB728002DA766500
+FD765F00F4785F00F4785F00F4785F00F4785F00F4785F00F4785F00F4785F
+00F4785F00F4785F00F4785F00F4785F00F478A1470000A1490000A44D0000
+A7500000AC540000B2580000BA5E0000C5650000D16B0007DD6E0012F06E00
+1DFC67032AF3500044D933005CD1080078BE00187C9C0031847E004F897100
+87904E00BC874000F7823C00F9833C00F9833C00F9833C00F9833C00F9833C
+00F9833C00F9833C00F9833C00F9833C00F9833C00F9833C00F983A1480000
+A14A0000A34D0000A6500000AB540000B1590000B95F0000C3660000CF6D00
+05DB710010ED72001BFE700723F959003FE6410057B12500736F09018D5100
+179A3F00339C320055A02001A39C230BFF8E1D09FF921D09FF921D09FF921D
+09FF921D09FF921D09FF921D09FF921D09FF921D09FF921D09FF921D09FF92
+1D09FF92A1480000A14A0000A34E0000A6510000AA550000B05A0000B76000
+00C1670000CD700003D974000DE8760018FD78071EFA700D2BAD5600528740
+006D572600881C0D00A205091AA803113EA602209CA21F32FF811F35FF801F
+35FF801F35FF801F35FF801F35FF801F35FF801F35FF801F35FF801F35FF80
+1F35FF801F35FF801F35FF80A1490000A14B0000A34E0000A5520000A95600
+00AF5A0000B6610000BF690000CA720001D878000AE77B0015ED7E0021C079
+0033936C004C725C00664C4B0082142D0192002C179E003A3D9B0040739201
+41C3830245C9810245C9810245C9810245C9810245C9810245C9810245C981
+0245C9810245C9810245C9810245C9810245C981A14A0000A14C0000A24F00
+00A4520000A8560000AD5B0000B4610000BC6A0000C7750000D77C0006D282
+0011C488001DA488002D878600426F87005D447100771250008D0054179200
+67438C006B7785227FE2652281E1642281E1642281E1642281E1642281E164
+2281E1642281E1642281E1642281E1642281E1642281E1642281E164A14A00
+00A14C0000A24F0000A3530000A7570000AC5C0000B2620000BA6B0000C377
+0000BD810006B489000FAC940018989C0024809F003369A9004C4299006516
+7F0080007B178300873D7B00A37F7513B0DF5F12B3DF5E12B3DF5E12B3DF5E
+12B3DF5E12B3DF5E12B3DF5E12B3DF5E12B3DF5E12B3DF5E12B3DF5E12B3DF
+5E12B3DF5EA14B0000A14D0000A1500000A2530000A5580000AA5D0000B063
+0000B76C0000AE7A0000A7850005A190000B9A9F00128FAE00187EBD002060
+BE00383FB9005018A9006900A1147200BB356B00C55F6501E7A95F01E7AE5D
+01E7AE5D01E7AE5D01E7AE5D01E7AE5D01E7AE5D01E7AE5D01E7AE5D01E7AE
+5D01E7AE5D01E7AE5D01E7AE5DA14C0000A14E0000A1500000A1540000A458
+0000A85D0000AE640000A67000009E7D0001998A0004959800078FA9000B85
+BC000F77D300165BDC00273EE5003E1DF0005702E30C6315FF414F00FE5257
+00FF785200FF865100FF865100FF865100FF865100FF865100FF865100FF86
+5100FF865100FF865100FF865100FF865100FF8651A14C0000A04E0000A051
+0000A1550000A3590000A75E0000A068000097730000928100008F8F00018C
+A0000288B5000382CF000776F0000D53F300213DFC073017FF004F02FF0C57
+16FF434224FF672D08FF764407FF824207FF824207FF824207FF824207FF82
+4207FF824207FF824207FF824207FF824207FF824207FF824207FF8242A14D
+0000A14F0000A0520000A0560000A25A00009B610000926B00008D7700008A
+8500008793000084A5000182BC00027FE3000369F4000F41E900272EFE0536
+0CFF004D10FF254314FF4C3B17FF643010FF90360DFFA1350DFFA1350DFFA1
+350DFFA1350DFFA1350DFFA1350DFFA1350DFFA1350DFFA1350DFFA1350DFF
+A1350DFFA135A14E0000A1500000A0520000A0560000995C00008F64000088
+6E000086790000828700007E9600007DAA00007DC6000071DF000550E10019
+35E800291FFF003C07FF0A471BFF3C310FFF503608FF65380DFF953109FFAD
+3109FFAD3109FFAD3109FFAD3109FFAD3109FFAD3109FFAD3109FFAD3109FF
+AD3109FFAD3109FFAD3109FFAD31A14E0000A1500000A0520000995700008C
+5E000185660000807000007D7C0000798900007399000073AD000071C70001
+62DD00073ED6001C2CEB002A15FF003C00FF0F451DFF472804FF4B3714FF7B
+2A0CFF982B06FFB22D06FFB22D06FFB22D06FFB22D06FFB22D06FFB22D06FF
+B22D06FFB22D06FFB22D06FFB22D06FFB22D06FFB22DA14E0000A15000009B
+5300008B5A0001826100007B68000078720000747E00006C8B0000679B0000
+66AD000063C600014FD4000D34D4001C24EF002B0EFF043901FF1C3D17FF48
+260DFF5A2B13FF80240AFF9C2703FFB12903FFB12903FFB12903FFB12903FF
+B12903FFB12903FFB12903FFB12903FFB12903FFB12903FFB12903FFB129A1
+4E00009D5000008C560000815C000079630000736A00006F75000069810000
+628E00005D9C00005AAD000056C400023FCD00122CD8001D1DF4002B07FF07
+3702FF243415FF4F210FFF642310FF83210AFF9E2301FFAD2501FFAD2501FF
+AD2501FFAD2501FFAD2501FFAD2501FFAD2501FFAD2501FFAD2501FFAD2501
+FFAD2501FFAD25A14E00008D52000081580000775E0000706400006A6D0000
+66780000608300005A910000569F000052AE000049C1000635CD001225DD00
+1E17F9002A03FF10320FFF352314FF551D14FF6F1B0FFF861C0AFF9E1E00FF
+AB2200FFAB2200FFAB2200FFAB2200FFAB2200FFAB2200FFAB2200FFAB2200
+FFAB2200FFAB2200FFAB2200FFAB228F50000082540000775A00006E5F0000
+68660000636F00005E7A0000598600005493000050A100004AB000003EC200
+082DD000121FE3001E0FFC002A00FF182D0EFF3A1E14FF5B1712FF721615FF
+8A100AFF9F1900FFAC1F00FFAC1F00FFAC1F00FFAC1F00FFAC1F00FFAC1F00
+FFAC1F00FFAC1F00FFAC1F00FFAC1F00FFAC1F00FFAC1F8352000078560000
+6E5B000067610000616900005D730000587E0000528A00004E96000049A400
+0043B3000135C5000826D5001219EA001D05FD042900FF1F270DFF3F190EFF
+5C1613FF760E1BFF8D0207FF9D1600FFAB1B00FFAB1B00FFAB1B00FFAB1B00
+FFAB1B00FFAB1B00FFAB1B00FFAB1B00FFAB1B00FFAB1B00FFAB1B00FFAB1B
+795400006F570000665C0000606300005B6B000057760000518100004D8D00
+004799000042A600003BB700012DCA000820DA001214EF001C02FD0E2403FF
+261E13FF4B0D0BFF5F130EFF760D18FF8D0007FF9B1200FFAB1800FFAB1800
+FFAB1800FFAB1800FFAB1800FFAB1800FFAB1800FFAB1800FFAB1800FFAB18
+00FFAB1800FFAB1870560000675900005F5E00005A650000556F0000517A00
+004C85000046910000419C00003AA9000033BC000126CE00091ADF00120CF2
+001D00FD161F02FF2A1A11FF4E0A0CFF620C10FF780513FF8B0007FF990D00
+FFAA1500FFAA1500FFAA1500FFAA1500FFAA1500FFAA1500FFAA1500FFAA15
+00FFAA1500FFAA1500FFAA1500FFAA15>
+<A1410000A1420000A4450000A9480000AE4B0000B54F0000BE520000C85500
+05D4540010E04D001DE23F002ED2290043CB0D015DBB001363BA002A60C900
+485EC7006B5CB701925AA700BF55A70BFF48A111FF41A111FF41A111FF41A1
+11FF41A111FF41A111FF41A111FF41A111FF41A111FF41A111FF41A111FF41
+A111FF41A111FF41A1410000A1420000A4450000A9480000AE4B0000B54F00
+00BE520000C8550005D4540010E04D001DE23F002ED2290043CB0D015DBB00
+1363BA002A60C900485EC7006B5CB701925AA700BF55A70BFF48A111FF41A1
+11FF41A111FF41A111FF41A111FF41A111FF41A111FF41A111FF41A111FF41
+A111FF41A111FF41A111FF41A111FF41A1410000A1420000A4450000A94800
+00AE4B0000B54F0000BE520000C8550005D4540010E04D001DE23F002ED229
+0043CB0D015DBB001363BA002A60C900485EC7006B5CB701925AA700BF55A7
+0BFF48A111FF41A111FF41A111FF41A111FF41A111FF41A111FF41A111FF41
+A111FF41A111FF41A111FF41A111FF41A111FF41A111FF41A1410000A14200
+00A4450000A9480000AE4C0000B54F0000BD520000C8550004D3550010E04E
+001DE340002DD32B0042CD0E005DBC001264BA002960C800475FC8006A5CB8
+01915BA800BE56A70AFF49A111FF41A111FF41A111FF41A111FF41A111FF41
+A111FF41A111FF41A111FF41A111FF41A111FF41A111FF41A111FF41A111FF
+41A1420000A1420000A4450000A8490000AE4C0000B5500000BD530000C756
+0004D356000FE050001CE443002CD62E0040CF11005CBD000F65BA002761C8
+004460CB00685DB9018E5CA900BD57A609FF4BA111FF42A111FF42A111FF42
+A111FF42A111FF42A111FF42A111FF42A111FF42A111FF42A111FF42A111FF
+42A111FF42A111FF42A1420000A1430000A4460000A8490000AE4C0000B550
+0000BD530000C7570003D357000FE052001BE545002BD932003FCF140059BE
+000D66BA002563C7004161CC00655EBA018B5DAB00BC58A508FF4DA111FF44
+A111FF44A111FF44A111FF44A111FF44A111FF44A111FF44A111FF44A111FF
+44A111FF44A111FF44A111FF44A111FF44A1420000A1430000A4460000A849
+0000AE4D0000B4500000BC540000C7570003D358000EE155001AE6480029DC
+35003DD0170057C0000B68BB002364C6003E62CD00635FBB01895FAC00BB59
+A507FE50A111FF45A111FF45A111FF45A111FF45A111FF45A111FF45A111FF
+45A111FF45A111FF45A111FF45A111FF45A111FF45A111FF45A1430000A143
+0000A4460000A8490000AD4D0000B4500000BC540000C6580002D259000DE1
+560019E84B0028DF39003CD01B0055C1000969BB002165C5003C63CF006160
+BD008660AF00BA5AA406FC52A211FF46A211FF46A211FF46A211FF46A211FF
+46A211FF46A211FF46A211FF46A211FF46A211FF46A211FF46A211FF46A211
+FF46A1430000A1440000A4470000A84A0000AD4D0000B3510000BB540000C6
+580002D25A000DE1580018E94E0027E23C003AD01F0053C3020769BC001E66
+C4003865D2005E61BF008462B300B85BA205FA54A211FF47A211FF47A211FF
+47A211FF47A211FF47A211FF47A211FF47A211FF47A211FF47A211FF47A211
+FF47A211FF47A211FF47A1430000A1440000A4470000A74A0000AD4E0000B3
+510000BB550000C5590002D15B000CE05A0017EB510025E4400038CF230050
+C6060567BD001B68C3003566D4005B63C3008063B700B75DA104F857A312FF
+49A312FF49A312FF49A312FF49A312FF49A312FF49A312FF49A312FF49A312
+FF49A312FF49A312FF49A312FF49A312FF49A1440000A1440000A4470000A7
+4A0000AC4E0000B2510000BA560000C55A0001D15D000BDF5C0016ED550023
+E7440036CE29004DCA0B0465BE00186AC2003168D8005765C7007C64BB00B5
+5EA003F65AA412FF4AA412FF4AA412FF4BA412FF4BA412FF4BA412FF4BA412
+FF4BA412FF4BA412FF4BA412FF4BA412FF4BA412FF4BA412FF4BA1440000A1
+450000A3480000A74B0000AC4F0000B1520000BA560000C45B0001D05E0009
+DE5E0014EC590022EB490034D130004ACE110263C000146CC1002D6AD80052
+67CD007865C200B360A102F15DA413FF4CA413FF4DA413FF4DA413FF4DA413
+FF4DA413FF4DA413FF4DA413FF4DA413FF4DA413FF4DA413FF4DA413FF4DA4
+13FF4DA1450000A1450000A3480000A64B0000AB4F0000B1520000B9570000
+C35C0000CF600008DC610013EC5D0020EF4F0031D8370047D4180161C4000F
+6FC000286CD8004B6AD2007267C800AD63A301ED60A513FF4FA113FF509E13
+FF519E13FF519E13FF519E13FF519E13FF519E13FF519E13FF519E13FF519E
+13FF519E13FF519E13FF51A1450000A1460000A3490000A64C0000AB4F0000
+B0530000B8580000C25D0000CD610006DB640011EB61001DF256002EE14000
+43D621005DC8000871C000226FDF00456EC900696DAC019E6F7900B8716000
+F76F5A00F3705800F2705800F2705800F2705800F2705800F2705800F27058
+00F2705800F2705800F2705800F2705800F270A1460000A1460000A3490000
+A64C0000AA500000B0540000B7580000C15E0000CC630004D9660010E96600
+1BF55D002AED4A003FD82C0057CD020273AA0017798E002E7F75004B836D00
+7D8A4E00AA823F00F67A3B00FE7B3A00FF7C3A00FF7C3A00FF7C3A00FF7C3A
+00FF7C3A00FF7C3A00FF7C3A00FF7C3A00FF7C3A00FF7C3A00FF7CA1470000
+A1470000A24A0000A54D0000A9510000AF540000B6590000BF5F0000CB6500
+03D769000DE66A0019F9650026F453003BD13B0052A222006F660700894C00
+16943B002F9530004E97230083961B01E98E1801FF8D1601FF8E1601FF8E16
+01FF8E1601FF8E1601FF8E1601FF8E1601FF8E1601FF8E1601FF8E1601FF8E
+1601FF8EA1470000A1480000A24A0000A54E0000A9510000AE550000B45A00
+00BE600000C9670000D56C000BE26E0016F76C0022E2630034A150004E7D3A
+006850240083190C009C050919A0020E379E0118749E1025F4831B2EFF7A1A
+2EFF791A2EFF791A2EFF791A2EFF791A2EFF791A2EFF791A2EFF791A2EFF79
+1A2EFF791A2EFF791A2EFF79A1480000A1480000A24B0000A44E0000A85200
+00AD560000B35B0000BB620000C6690000D36F0008DF720013D576001FB273
+00308C6600486B5400614744007D1229018D0029169700353896003C6A8E00
+3DB080003FD97A0040D97A0040D97A0040D97A0040D97A0040D97A0040D97A
+0040D97A0040D97A0040D97A0040D97A0040D97AA1490000A1490000A24C00
+00A44F0000A6520000AB570000B15C0000B9630000C36B0000D0730005C17A
+0011B480001D9B81002B807F003F6579005B3D6300720E490088004D178C00
+5A3A8700626F801B78F5670364FF6D0566FF6B0566FF6B0566FF6B0566FF6B
+0566FF6B0566FF6B0566FF6B0566FF6B0566FF6B0566FF6B0566FF6BA14900
+00A14A0000A14D0000A3500000A5530000AA580000B05D0000B7640000BF6D
+0000B2790006AA81000FA08A00198E91002378950032629D004C3A88006310
+70007D0071187E007C3B77008F74710CA4EB6023A2FA4F23A3FA4F23A3FA4F
+23A3FA4F23A3FA4F23A3FA4F23A3FA4F23A3FA4F23A3FA4F23A3FA4F23A3FA
+4F23A3FA4FA14A0000A14A0000A14D0000A2500000A4540000A8590000AD5E
+0000B2650000A6720002A07D00079988000D9195001285A1001972A9002359
+AC003939A50050119500690093176E00A5366800B0616100BCA35D08C4D052
+08C3CF5208C3CF5208C3CF5208C3CF5208C3CF5208C3CF5208C3CF5208C3CF
+5208C3CF5208C3CF5208C3CF52A14B0000A14B0000A14E0000A1510000A355
+0000A65A0000AA5F00009E6A000097760003938200058D8F0008869E000C7E
+AF00106EBE001853C2002A39C7003F16C4005600BD125F01E5335900E85752
+05FA8A4B00F9AB4C00FAAB4C00FAAB4C00FAAB4C00FAAB4C00FAAB4C00FAAB
+4C00FAAB4C00FAAB4C00FAAB4C00FAAB4C00FAAB4CA14C0000A14C0000A14F
+0000A1520000A2560000A45B000098640000906E00018D7A00018988000184
+97000381AA00047DC3000572E1000A4FE1001E36F2002F1CFF004403FF094F
+1AFF433721FF622A0EFF79380DFFA3350DFFA4340DFFA4340DFFA4340DFFA4
+340DFFA4340DFFA4340DFFA4340DFFA4340DFFA4340DFFA4340DFFA434A14D
+0000A14D0000A0500000A0530000A1570000935F00008B6700018672000083
+7F00007F8D00007B9D00007BB300007AD300016EF600053FDC00202CF70030
+11FF024311FF243B1CFF4E2D01FF513D11FF872F09FFAF3009FFAF3009FFAF
+3009FFAF3009FFAF3009FFAF3009FFAF3009FFAF3009FFAF3009FFAF3009FF
+AF3009FFAF30A14D0000A14E0000A0500000A0540000915A00008762000081
+6A00007D7400007A810000748F00006F9F000071B600006CD100024FD80012
+34D9002123F8003208FF044010FF2D3313FF4D2C14FF6E290FFF8C2A06FFB2
+2C05FFB22C05FFB22C05FFB22C05FFB22C05FFB22C05FFB22C05FFB22C05FF
+B22C05FFB22C05FFB22C05FFB22CA14E0000A14E0000A05000009156000085
+5D00017D640000786C0000757700006F8300006791000064A1000062B50000
+5CCE00033FD000162BDD00221AF9003204FF0D3B0FFF332D06FF472F16FF77
+220DFF902604FFB02803FFB12803FFB12803FFB12803FFB12803FFB12803FF
+B12803FFB12803FFB12803FFB12803FFB12803FFB128A14E0000A14E000092
+520000855800017B5F0000746600006F6E00006A790000648600005D930000
+5BA3000057B500004BC7000834D0001624E3002311FB003000FF153713FF3F
+230BFF542513FF7B1E0AFF922201FFAA2400FFB12500FFB12500FFB12500FF
+B12500FFB12500FFB12500FFB12500FFB12500FFB12500FFB12500FFB125A1
+4E0000954F0000855500017A5A0000726000006B68000067710000627C0000
+5C8900005796000053A500004EB600013FC6000B2CD300161EE900230BFD05
+2E00FF1E2F15FF481B15FF651912FF7E190AFF941D01FFA92100FFB12100FF
+B12100FFB12100FFB12100FFB12100FFB12100FFB12100FFB12100FFB12100
+FFB12100FFB121964F0000865200007B570000715C000069620000646A0000
+5F7400005A800000558C0000509900004CA7000044B7000235C9000B25D800
+1618EF002204FF0A2C00FF242914FF4E150FFF661918FF830C0CFF951601FF
+AB1D00FFB01E00FFB01E00FFB01E00FFB01E00FFB01E00FFB01E00FFB01E00
+FFB01E00FFB01E00FFB01E00FFB01E875200007C54000072580000685D0000
+626400005D6D000059780000548300004F9000004A9C000044A900003CBB00
+032DCD000C1FDE001613F4002100FF122703FF2B2112FF53110EFF691316FF
+83070EFF960F00FFA81A00FFB11B00FFB11B00FFB11B00FFB11B00FFB11B00
+FFB11B00FFB11B00FFB11B00FFB11B00FFB11B00FFB11B7C54000073550000
+69590000615F00005C66000058700000537B00004E87000049930000439F00
+003DAC000034C0000326D1000C19E4001609F7002200FF1B210DFF391210FF
+550E0CFF6B0F16FF84000EFF950901FFA91600FFB01700FFB01700FFB01700
+FFB01700FFB01700FFB01700FFB01700FFB01700FFB01700FFB01700FFB017
+725500006A560000615B00005B610000566A0000527400004D7F0000488A00
+00429600003CA2000035B100002BC500031ED5000C12E8001600F60A2000FF
+201C13FF44060DFF580A08FF6B0E12FF83000DFF930500FFA51201FFAE1201
+FFAE1201FFAE1201FFAE1201FFAE1201FFAE1201FFAE1201FFAE1201FFAE12
+01FFAE1201FFAE1269560000635800005B5D000056640000516D00004C7800
+0047830000418E00003B99000034A600002DB7000023C9000418DA000D09EB
+011700F9121A04FF271312FF48010BFF5A0604FF6B0D0DFF81000CFF910100
+FFA20F00FFAB0F00FFAB0F00FFAB0F00FFAB0F00FFAB0F00FFAB0F00FFAB0F
+00FFAB0F00FFAB0F00FFAB0F00FFAB0F>
+<9F3D0000A03E0000A13F0000A6420000AC460000B3490000BA4B0000C34D00
+03CC4A000FD540001CD531002CC71D0042BB06045AB300185AB5002E56C200
+4C55BF006C52B0008E52A300B04CA606FC419D0BFF399D0BFF399D0BFF399D
+0BFF399D0BFF399D0BFF399D0BFF399D0BFF399D0BFF399D0BFF399D0BFF39
+9D0BFF399D0BFF399F3D0000A03E0000A13F0000A6430000AC460000B24900
+00BA4C0000C34D0003CC4A000FD541001CD631002CC81E0042BB06045AB400
+185AB5002E56C2004B55C0006B52B1008E52A300AF4CA605FB419D0BFF399D
+0CFF399D0CFF399D0CFF399D0CFF399D0CFF399D0CFF399D0CFF399D0CFF39
+9D0CFF399D0CFF399D0CFF399D0CFF39A03D0000A03E0000A13F0000A64300
+00AC460000B2490000BA4C0000C34E0002CC4B000ED543001CD834002BCA20
+0041BE07025AB500165BB6002C57C1004956C1006A53B2008D53A400AF4DA5
+05F9439E0DFF399E0DFF399E0DFF399E0DFF399E0DFF399E0DFF399E0DFF39
+9E0DFF399E0DFF399E0DFF399E0DFF399E0DFF399E0DFF39A03E0000A03E00
+00A1400000A6430000AC460000B24A0000BA4C0000C34E0002CC4C000ED644
+001BD936002ACB220040C008015AB500145DB6002B58C1004757C3006854B3
+008A54A600AE4EA504F7459F0EFF399F0EFF399F0EFF399F0EFF399F0EFF39
+9F0EFF399F0EFF399F0EFF399F0EFF399F0EFF399F0EFF399F0EFF399F0EFF
+39A03E0000A03F0000A1400000A6440000AC470000B24A0000BA4D0000C24F
+0002CC4D000DD646001ADA380029CD24003EC20A005AB600135EB6002959C0
+004458C5006655B4008855A700AD4FA403F546A00FFF3AA00FFF3AA00FFF3A
+A00FFF3AA00FFF3AA00FFF3AA00FFF3AA00FFF3AA00FFF3AA00FFF3AA00FFF
+3AA00FFF3AA00FFF3AA03E0000A03F0000A1410000A6440000AB470000B24A
+0000B94D0000C2500001CC4E000CD7480019DB3A0029D027003DC40C0058B7
+00115FB600275AC0004259C6006555B5008656A800AD51A402F348A110FF3A
+A110FF3AA110FF3AA110FF3AA110FF3AA110FF3AA110FF3AA110FF3AA110FF
+3AA110FF3AA110FF3AA110FF3AA110FF3AA03F0000A03F0000A1410000A644
+0000AB480000B24B0000B94E0000C2500001CC4F000CD84A0018DC3D0028D2
+29003CC60F0056B8000F60B600255CBF00405AC7006357B6008457A900AC52
+A301F24AA210FF3CA111FF3AA111FF3AA111FF3AA111FF3AA111FF3AA111FF
+3AA111FF3AA111FF3AA111FF3AA111FF3AA111FF3AA111FF3AA03F0000A040
+0000A2410000A6450000AB480000B14B0000B94E0000C2510001CC51000BD8
+4C0017DE3F0026D52C003AC8130054B9000D61B700235DBE003D5BC9006058
+B7008158AB00AB53A200EE4CA20FFF3DA111FF3CA111FF3CA111FF3CA111FF
+3CA111FF3CA111FF3CA111FF3CA111FF3CA111FF3CA111FF3CA111FF3CA111
+FF3CA0400000A0400000A2420000A6450000AB480000B14B0000B84F0000C1
+520001CC52000AD84E0016DF430025D8300038C9170051BB000A63B700215F
+BD003A5CCA005D5AB8007E5AAD00A955A200E94EA20FFF3FA111FF3DA111FF
+3DA111FF3DA111FF3DA111FF3DA111FF3DA111FF3DA111FF3DA111FF3DA111
+FF3DA111FF3DA111FF3DA0400000A1410000A2420000A6460000AB490000B1
+4C0000B84F0000C1530001CC540009D9510015E1460024DA340036CA1B004E
+BF040862B8001E60BD00365ECC00595BBA007A5CB001A656A200E251A20EFF
+41A111FF3FA111FF3FA111FF3FA111FF3FA111FF3FA111FF3FA111FF3FA111
+FF3FA111FF3FA111FF3FA111FF3FA111FF3FA1410000A1410000A2430000A5
+460000AA490000B14D0000B8500000C1530001CB550008D8530014E34B0022
+DE390034CB21004AC4070661B9001A62BD003260CE00555DBE00765DB301A3
+58A100DB53A410FF43A111FF41A111FF41A111FF41A111FF41A111FF41A111
+FF41A111FF41A111FF41A111FF41A111FF41A111FF41A111FF41A1420000A1
+420000A2440000A5470000AA4A0000B04D0000B7510000C0540000CB570007
+D8560012E44F0020E23F0031CF270047CB0C0360BB001665BD002E62D00050
+60C300725EB702A05BA200D456A611FF45A111FF44A111FF44A111FF44A111
+FF44A111FF44A111FF44A111FF44A111FF44A111FF44A111FF44A111FF44A1
+11FF44A1420000A1430000A2440000A5470000AA4B0000AF4E0000B6520000
+BF550000CA580005D7590011E453001DE745002ED52F0043D311015FBE0011
+68BC002964CD004962CA006D60BB019A5DA500D159A112FF499813FF499515
+FF499516FF499516FF499516FF499516FF499516FF499516FF499516FF4995
+16FF499516FF499516FF49A1430000A1440000A2450000A5480000A94B0000
+AF4F0000B5520000BE570000C95A0004D65C000FE559001BEA4C002BDD3800
+40D319005AC2000B6BBD002367CB004166B700646AA000906C7700AC6B5F00
+E66A5800F7695400F66A5400F66A5400F66A5400F66A5400F66A5400F66A54
+00F66A5400F66A5400F66A5400F66A5400F66AA1440000A1440000A2460000
+A4490000A84C0000AE500000B4530000BD580000C85C0002D45E000DE35D00
+19EE540027E642003BD1240054C802056C9C00167583002D7B6F00477D6500
+6D814E009A7D4000E0763B00FF743800FF753800FF753800FF753800FF7538
+00FF753800FF753800FF753800FF753800FF753800FF753800FF75A1450000
+A1450000A2460000A4490000A84D0000AD500000B3540000BC590000C65E00
+01D261000BE1620016F15D0023EC4C0037BF36004E9520006B5E0600854700
+158E37002C8E2D0048902300708F1A00BF8A1800FF861500FF871400FF8714
+00FF871400FF871400FF871400FF871400FF871400FF871400FF871400FF87
+1400FF87A1460000A1460000A1470000A44A0000A74E0000AC510000B25500
+00BA5A0000C5600000D0640008DE660013EF630020CA5C0032994B00497534
+00634A21007D170B00960408189A020D339602135E96001AC78B1A29FF721A
+2BFF721A2BFF711A2BFF711A2BFF711A2BFF711A2BFF711A2BFF711A2BFF71
+1A2BFF711A2BFF711A2BFF71A1470000A1470000A1480000A34B0000A64E00
+00AB520000B1560000B85B0000C2620000CE680005D66B0011C570001DA76C
+002E855F0045644D005D403D007710260187002615900030338F0038618900
+399D7E093EF26F083FF26F073FF26F073FF26F073FF26F073FF26F073FF26F
+073FF26F073FF26F073FF26F073FF26F073FF26FA1470000A1480000A14900
+00A34C0000A54F0000A9530000AF570000B65D0000C0640000C36B0005B673
+0011A878001C9278002A7975003D5C6C00573759006D0B4300820047168600
+5336820059657C005FB8700059FF69005AFF69005AFF69005AFF69005AFF69
+005AFF69005AFF69005AFF69005AFF69005AFF69005AFF69005AFF69A14800
+00A1490000A14A0000A24D0000A5500000A8540000AE580000B45E0000B366
+0000A9710008A17900109581001985870023718A00335B91004E337800610B
+6400790069187900713873007F696E0793E8601E90FF4C1E92FF4B1E92FF4B
+1E92FF4B1E92FF4B1E92FF4B1E92FF4B1E92FF4B1E92FF4B1E92FF4B1E92FF
+4B1E92FF4BA1490000A14A0000A14B0000A24E0000A3510000A6550000AB5A
+0000A86100009F6B0004987500099180000D888A00147B95001A689A002651
+9C003A3294004F0B8501680087186A0096366400A0605E00A49A5918BBFF41
+17BCFF4117BCFF4117BCFF4117BCFF4117BCFF4117BCFF4117BCFF4117BCFF
+4117BCFF4117BCFF4117BCFF41A14A0000A14B0000A14C0000A14F0000A252
+0000A5560000A15C000096650002906F00048C7B0006868700097D94000D73
+A1001163AB001B4BAD002C32B0003F0FA8005500A4155B00C1325600CA584F
+04E9944717ECDD351CF2E6301CF3E6301CF3E6301CF3E6301CF3E6301CF3E6
+301CF3E6301CF3E6301CF3E6301CF3E6301CF3E630A14B0000A14B0000A14D
+0000A14F0000A15300009B580000906000008969000285740002828100027C
+8E0003739D000570B0000763C2000F45C4002131D2002F18E6004200E60C4D
+12FF3C3A09FF583B12FF8B310AFFB03106FFB23206FFB23206FFB23206FFB2
+3206FFB23206FFB23206FFB23206FFB23206FFB23206FFB23206FFB232A14C
+0000A14C0000A14D0000A0500000995500008C5C0001846400007E6D00007C
+790000778600006F9500006FA800006DBF000062D900053FD4001A2CE60027
+16FF003902FF11411DFF49250AFF563012FF842809FFA62A05FFB22B05FFB2
+2B05FFB22B05FFB22B05FFB22B05FFB22B05FFB22B05FFB22B05FFB22B05FF
+B22B05FFB22BA14D0000A14D0000A14E0000995200008A590001805F000079
+67000075700000717C00006A8800006397000062A800005EBE00004FCF000B
+34D3001A24EB00280EFF023701FF1C3A17FF4B230DFF60280FFF872407FFA9
+2602FFB12702FFB12702FFB12702FFB12702FFB12702FFB12702FFB12702FF
+B12702FFB12702FFB12702FFB127A14E0000A14E00009B4F00008A5500007F
+5B000077610000706900006C730000667F0000608B00005A98000057A90000
+53BE00013FCA000F2BD6001A1DF0002806FF073405FF272E14FF511F16FF71
+1C0CFF8A2006FFA42200FFB12400FFB12400FFB12400FFB12400FFB12400FF
+B12400FFB12400FFB12400FFB12400FFB12400FFB124A14E00009D4E00008B
+5200007F570000755D00006D630000686B0000637600005E820000588E0000
+549C00004FAB000047BD000435CC000F25DB001B17F6002702FF112F0BFF32
+2314FF581910FF731A0DFF8D1A08FFA71C00FFB22000FFB22000FFB22000FF
+B22000FFB22000FFB22000FFB22000FFB22000FFB22000FFB22000FFB220A0
+4E00008C5100007F540000755900006C5E000065650000606E00005C790000
+57850000529200004D9F000048AD00003DBF00062CCF000F1EE2001B0FFA00
+2700FF192A09FF361E10FF5A1715FF780E15FF910B04FFA61A00FFB21D00FF
+B21D00FFB21D00FFB21D00FFB21D00FFB21D00FFB21D00FFB21D00FFB21D00
+FFB21D00FFB21D8D51000080530000765500006B5A0000646000005E680000
+5A710000557D0000508800004B95000046A1000040B0000034C4000625D400
+1018E8001A04FB032700FF202313FF46100DFF5E130EFF771015FF910504FF
+A11600FFB61900FFB81900FFB81900FFB81900FFB81900FFB81900FFB81900
+FFB81900FFB81900FFB81900FFB8197F530000755500006D570000645C0000
+5D620000586B0000547500004F8000004A8C0000449800003FA5000038B500
+012CC900061ED9001012ED001A00FB0F2200FF241E13FF4B090CFF600F13FF
+7A0214FF900104FFA01206FFBB110BFFC40D0BFFC40D0BFFC40D0BFFC40D0B
+FFC40D0BFFC40D0BFFC40D0BFFC40D0BFFC40D0BFFC40D755500006C560000
+655800005D5E000058650000536E00004E79000049840000449000003E9B00
+0037A800002FBB000024CD000718DE001009F0011B00FC171C0AFF310F12FF
+500309FF620B0DFF780510FF8D0000FF9C100EFFC10612FFC80212FFC80212
+FFC80212FFC80212FFC80212FFC80212FFC80212FFC80212FFC80212FFC802
+6B560000645700005D5A000057600000526800004D720000487E0000438800
+003D930000369F00002FAD000027C000011CD0000811E2001000F1051B00FE
+1C170DFF38070FFF510106FF620A09FF77050CFF8A0003FF9B0A04FFB30A07
+FFB70707FFB70707FFB70707FFB70707FFB70707FFB70707FFB70707FFB707
+07FFB70707FFB707635800005D590000585C0000526300004D6C0000487700
+00428200003C8C0000359600002EA3000027B2000020C3000115D4000809E5
+001100F40E1500FF211209FF39060AFF520009FF660008FF770008FF880005
+FF970404FFA90504FFAB0504FFAB0504FFAB0504FFAB0504FFAB0504FFAB05
+04FFAB0504FFAB0504FFAB0504FFAB05>
+<9C3700009D3700009D380000A13B0000A73F0000AE420000B6440000BD4500
+01C241000CC835001AC827002ABB140040AE010655AD001C51B000314DBA00
+4D4BBC006B49AE008948A200A542A002DB3A9803FF349602FF339602FF3396
+02FF339602FF339602FF339602FF339602FF339602FF339602FF339602FF33
+9602FF339602FF339D3700009D3800009D390000A13C0000A73F0000AE4200
+00B6450000BD460001C342000CC937001ACA280029BD16003FAF020556AE00
+1B52B000304EBA004C4CBD006A49AF008849A200A444A001D93C9904FF3596
+03FF349603FF349603FF349603FF349603FF349603FF349603FF349603FF34
+9603FF349603FF349603FF349603FF349D3800009D3800009E390000A13C00
+00A7400000AE430000B6450000BE470001C343000BC9390019CC2A0029BE18
+003EB1020456AE001953B1002E4FBA004A4DBD00694AAF00874AA300A4459F
+01D73D9A04FF369603FF349603FF349603FF349603FF349603FF349603FF34
+9603FF349603FF349603FF349603FF349603FF349603FF349D3800009D3900
+009E3A0000A13D0000A7400000AE430000B6460000BE480001C444000BCA3A
+0019CD2C0028C01A003DB2030257AF001854B1002D50BA00484EBE00674BB0
+00854BA300A3469F01D43E9A05FF369704FF359704FF359704FF359704FF35
+9704FF359704FF359704FF359704FF359704FF359704FF359704FF359704FF
+359D3900009E3900009E3A0000A23D0000A7410000AF440000B6460000BE48
+0000C445000ACB3C0018CF2E0027C21C003CB4030157AF001655B1002C51BA
+00464EBF00664CB100844CA400A2479F01D23F9B05FF379704FF359704FF35
+9704FF359704FF359704FF359704FF359704FF359704FF359704FF359704FF
+359704FF359704FF359E3900009E3A00009E3B0000A23E0000A8410000AF44
+0000B6470000BE490000C446000ACB3E0017D0300026C41E003BB6050056B0
+001457B2002A52B9004450C100644DB200824DA500A1499F01D0409C06FF38
+9805FF369805FF369805FF369805FF369805FF369805FF369805FF369805FF
+369805FF369805FF369805FF369805FF369E3A00009E3B00009F3C0000A23E
+0000A8420000AE450000B6470000BD4A0000C5470009CC400017D1320025C7
+200039B8080054B0001258B2002853B9004151C200624EB300804EA600A04B
+9F01CD429D07FF399805FF379805FF379805FF379805FF379805FF379805FF
+379805FF379805FF379805FF379805FF379805FF379805FF379E3B00009F3C
+00009F3D0000A23F0000A8420000AE450000B6480000BD4A0000C5490008CD
+420016D3350024CA230037BC0C0052B100105AB3002655B9003E52C3005F4F
+B4007D50A7009F4C9E00CA449F08FF3A9907FF389A07FF389A07FF389A07FF
+389A07FF389A07FF389A07FF389A07FF389A07FF389A07FF389A07FF389A07
+FF389F3C00009F3D00009F3D0000A2400000A8430000AE460000B5490000BD
+4B0000C64B0007CE450015D5380023CD260035BF10004FB2000D5CB3002357
+B8003B54C4005C51B6007A51A9009E4E9F00C746A009FF3B9B09FF389B09FF
+389B09FF389B09FF389B09FF389B09FF389B09FF389B09FF389B09FF389B09
+FF389B09FF389B09FF389F3D00009F3D0000A03E0000A2400000A8440000AE
+470000B54A0000BD4C0000C64D0006CF470013D73C0021D02A0033C215004C
+B6020A5CB4002059B8003756C5005853B8007753AB009C50A000C449A20AFF
+3C9D0BFF399D0CFF399D0CFF399D0CFF399D0CFF399D0CFF399D0CFF399D0C
+FF399D0CFF399D0CFF399D0CFF399D0CFF39A03D0000A03E0000A03F0000A3
+410000A8440000AE480000B54B0000BD4D0000C64E0005CF4A0012D9410020
+D52F0031C51A0048BB04075CB5001C5BB8003358C6005356BA007355AE0099
+52A100C04BA50BFF3E9F0EFF399F0EFF399F0EFF399F0EFF399F0EFF399F0E
+FF399F0EFF399F0EFF399F0EFF399F0EFF399F0EFF399F0EFF39A03E0000A0
+3F0000A03F0000A3420000A8450000AD480000B44B0000BC4E0000C6500004
+D04E0010DA45001ED935002ECA200044C007045CB600185EB8002F5AC7004E
+58BE006F57B1009655A200BD4FA80DFF3FA111FF3AA111FF3AA111FF3AA111
+FF3AA111FF3AA111FF3AA111FF3AA111FF3AA111FF3AA111FF3AA111FF3AA1
+11FF3AA03F0000A0400000A0400000A3430000A7460000AD490000B44D0000
+BB4F0000C5520003D051000FDC4A001CDF3C002CD0260041C80B015CB90013
+61B8002A5DC600485BC4006A59B50091589D00BB558F07F54D9114FF418E15
+FF428B16FF438B16FF438B16FF438B16FF438B16FF438B16FF438B16FF438B
+16FF438B16FF438B16FF43A0400000A1410000A1410000A3440000A7470000
+AC4A0000B34E0000BB510000C4540002D054000DDD500019E2430029D72F00
+3DCA130057BC000D64B9002560B5003E62A7005E67950084697500A2675E00
+D3655500FB635200FB645000FB655000FB655000FB655000FB655000FB6550
+00FB655000FB655000FB655000FB655000FB65A1410000A1420000A1420000
+A3450000A7480000AC4B0000B24F0000BA520000C3560001CF57000BDD5500
+16E64B0025DE390038CB1D0050B403056A8F0015717C002B77690042785E00
+637A4C008A784000C8733A00FF6E3800FF6F3600FF703600FF703600FF7036
+00FF703600FF703600FF703600FF703600FF703600FF703600FF70A1420000
+A1430000A1430000A3460000A6490000AB4C0000B14F0000B8530000C25700
+00CE5A0009DC5A0014E9530021E6430033B231004A8A1D0067590500814200
+1488330029872A004289220064891A009C851800FF7E1500FF7F1300FF8013
+00FF801300FF801300FF801300FF801300FF801300FF801300FF801300FF80
+1300FF80A1440000A1440000A1450000A3470000A54A0000AA4D0000B05100
+00B7550000C0590000CC5D0006D95F0011DD5C001EBA55002F924500456D2F
+005E441F00781509009104071794010C2F90000F4F8E0017988B1725FF6D16
+26FF6D1627FF6C1627FF6C1627FF6C1627FF6C1627FF6C1627FF6C1627FF6C
+1627FF6C1627FF6C1627FF6CA1450000A1450000A1460000A2480000A54B00
+00A94E0000AF520000B5560000BF5B0000CA600003C7650010B869001C9D64
+002C7E5700415E4700583A3700700E24018200241489002C2F890033588400
+378D7C0235FB6B0337FF6A0439FF690439FF690439FF690439FF690439FF69
+0439FF690439FF690439FF690439FF690439FF69A1460000A1460000A14700
+00A2490000A44C0000A84F0000AD530000B3570000BC5D0000B7640005AC6B
+00119E70001C8A6F0029726C003B5560005232510067093D007D0042158000
+4D327D00535C780057966E0053F2640054FF630055FF630055FF630055FF63
+0055FF630055FF630055FF630055FF630055FF630055FF630055FF63A14700
+00A1470000A1480000A14A0000A34D0000A7500000AB540000B2590000A961
+0000A169000A987100118C7800197C7D0024697F0033517E004B2E6C005D08
+5B017500611774006A356F0073606A017798611885FF4B1883FF491884FF48
+1884FF481884FF481884FF481884FF481884FF481884FF481884FF481884FF
+481884FF48A1480000A1480000A1490000A14B0000A34E0000A5510000AA55
+0000A05D000097650005906E000A8978000E7F8100147189001D608E00284A
+8D003A2B86004E077A0166007E18660089366100935C5A00948C5512A8FF42
+10A2FF400FA2FF400FA2FF400FA2FF400FA2FF400FA2FF400FA2FF400FA2FF
+400FA2FF400FA2FF400FA2FF40A1490000A14A0000A14A0000A14C0000A24F
+0000A4520000995900008F61000289690005847400077D7E0009748A000E69
+940014599B001F449E002D2B9E003F099701540097175600AA325200B3554B
+00BF874412E0F33615D0FF3115D0FF3115D0FF3115D0FF3115D0FF3115D0FF
+3115D0FF3115D0FF3115D0FF3115D0FF3115D0FF31A14A0000A14B0000A14B
+0000A14D0000A1500000945600008A5D0001826400017D6E00027A79000373
+8500046A92000762A0000B54AA00163EB000232CBB003011C0004200C21148
+00E52E4500EA513E10FF912F06FFAF311CFDFF241CFEFF231CFEFF231CFEFF
+231CFEFF231CFEFF231CFEFF231CFEFF231CFEFF231CFEFF231CFEFF23A14B
+0000A14C0000A14C0000A04E000092530000865A00007D6100007768000073
+7300006E7F0000668C0000619B00005FAF000059C600043FCC00142BDA001F
+1BF7002F04FF0D3A0CFF332D04FF492F13FF7E2209FF9F2502FFB12702FFB1
+2702FFB12702FFB12702FFB12702FFB12702FFB12702FFB12702FFB12702FF
+B12702FFB127A14D0000A14D0000A14D000092510000845700007A5D000072
+6400006D6C000069770000638300005C910000589F000054B000004BC40006
+35CF001424E0002013FB002E01FF163415FF431E15FF621C10FF811E0AFF9F
+2000FFB12300FFB12300FFB12300FFB12300FFB12300FFB12300FFB12300FF
+B12300FFB12300FFB12300FFB123A14E0000A14E0000935000008454000079
+590000705F000069660000656F0000607A00005A8700005594000051A20000
+4CB200003EC400092CD200141EE700200BFE032C00FF1E2D15FF4A1811FF67
+1914FF86130AFFA01B00FFB12000FFB22000FFB22000FFB22000FFB22000FF
+B22000FFB22000FFB22000FFB22000FFB22000FFB220A14E00009350000084
+520000795600006F5B000067610000626900005D730000587E0000538A0000
+4E97000049A4000043B5000135C7000925D7001418ED001F01FF082B00FF24
+2612FF4F1411FF6A131CFF8A0207FF9E1700FFB11C00FFB41C00FFB41C00FF
+B41C00FFB41C00FFB41C00FFB41C00FFB41C00FFB41C00FFB41C00FFB41C95
+4F0000845200007954000070570000665C0000606300005B6C000057760000
+528200004D8E0000479A000042A700003AB900022CCC00091EDD001411F200
+1F00FF14240AFF321813FF550D0CFF6B1218FF890006FF9B1300FFB11909FF
+C61209FFC61209FFC61209FFC61209FFC61209FFC61209FFC61209FFC61209
+FFC61209FFC612845200007954000070560000675900005F5E00005A660000
+556F0000507A00004B86000046910000419D00003AAB000032BF000124D000
+0A18E2001408F4041F00FF1C1E0AFF37120DFF550D0CFF6D0B13FF880006FF
+990E00FFAE1515FFE00415FFE00415FFE00415FFE00415FFE00415FFE00415
+FFE00415FFE00415FFE00415FFE004785400006F560000675700005F5A0000
+59610000546900004F7300004A7E0000458900003F95000039A1000032B000
+0029C400011DD4000B11E7001400F50A1D00FF211913FF44020DFF590605FF
+6C0D0FFF850005FF970A00FFAC1012FFDB0212FFDB0212FFDB0212FFDB0212
+FFDB0212FFDB0212FFDB0212FFDB0212FFDB0212FFDB026E56000066570000
+5F580000595C0000546400004F6D00004A780000448300003E8D0000389800
+0031A500002AB5000021C7000316D8000B09EA001500F8121700FF25140FFF
+460009FF590606FF6E080BFF830007FF960501FFA70B0AFFC4030AFFC4030A
+FFC4030AFFC4030AFFC4030AFFC4030AFFC4030AFFC4030AFFC4030AFFC403
+655700005E590000595B0000545F00004E67000049710000447C00003E8600
+0037900000309C000029AA000022BA000019CA00040FDC000B02EC051400FA
+181200FF290F0BFF470009FF5C0007FF6F0007FF810007FF920102FFA20603
+FFB20403FFB20403FFB20403FFB20403FFB20403FFB20403FFB20403FFB204
+03FFB20403FFB2045D590000575B0000535D00004F620000496B0000437600
+003D800000378A00002F94000028A0000021AE00001BBD000012CD000508DF
+000C00EF0B1000FC1E0D00FF2E0B07FF490005FF5E0004FF6E0004FF7E0004
+FF8F0002FF9E0302FFAC0202FFAC0202FFAC0202FFAC0202FFAC0202FFAC02
+02FFAC0202FFAC0202FFAC0202FFAC02>
+<99300000993100009A3100009A320000A0360000A6390000AE3B0000B53D00
+00B9380009BC2C0017BA1F0027AE0E003DA5000A4CA7001E48AB003343B300
+4D41B7006A3FAE00853DA400A0399F00C8339901FF2E9400FF2B9400FF2B94
+00FF2B9400FF2B9400FF2B9400FF2B9400FF2B9400FF2B9400FF2B9400FF2B
+9400FF2B9400FF2B993000009A3100009A3200009B330000A0370000A73A00
+00AE3C0000B53D0000B9390008BD2E0017BC200027AF0F003CA500084DA800
+1D49AB003244B3004C42B7006840AF00843EA4009F3A9F00C6349A01FE2E94
+00FF2B9400FF2B9400FF2B9400FF2B9400FF2B9400FF2B9400FF2B9400FF2B
+9400FF2B9400FF2B9400FF2B9400FF2B993100009A3200009A3200009B3300
+00A1370000A73A0000AF3D0000B63E0000BA3A0008BD2F0016BD220026B111
+003BA600074DA8001C4AAC003145B3004B43B8006741AF00833FA4009E3B9E
+00C4359A01FE2F9400FF2C9400FF2C9400FF2C9400FF2C9400FF2C9400FF2C
+9400FF2C9400FF2C9400FF2C9400FF2C9400FF2C9400FF2C9A3100009A3200
+009B3300009B340000A1380000A83B0000AF3E0000B63F0000BB3B0008BE30
+0016BF230025B212003AA700054FA8001B4BAC002F46B3004944B9006642B0
+008240A4009D3C9E00C2369A01FE309400FF2D9400FF2D9400FF2D9400FF2D
+9400FF2D9400FF2D9400FF2D9400FF2D9400FF2D9400FF2D9400FF2D9400FF
+2D9A3200009A3300009B3400009C350000A2390000A83C0000B03F0000B740
+0000BC3D0007BF320015C1250024B5140039A7000450A900194CAC002E47B3
+004745B9006443B1008141A5009B3E9E00BF379B01FE319400FF2E9400FF2E
+9400FF2E9400FF2E9400FF2E9400FF2E9400FF2E9400FF2E9400FF2E9400FF
+2E9400FF2E9400FF2E9A3300009B3300009B3400009C350000A23A0000A93D
+0000B03F0000B7410000BC3E0006C0340014C2270023B7170037A8000151A9
+00174EAD002C49B3004546BA006244B2008043A6009A3F9E00BC399C01FE32
+9400FF2F9400FF2F9400FF2F9400FF2F9400FF2F9400FF2F9400FF2F9400FF
+2F9400FF2F9400FF2F9400FF2F9400FF2F9B3300009B3400009C3500009C36
+0000A33B0000A93E0000B0400000B7420000BD400006C1370013C4290022BA
+190036AB030150AA00154FAD002A4AB3004248BB006046B3007D44A6009841
+9D00B93A9C01FF349400FF309400FF309400FF309400FF309400FF309400FF
+309400FF309400FF309400FF309400FF309400FF309400FF309B3400009C35
+00009C3600009D370000A33C0000A93F0000B0410000B8430000BE420005C2
+390013C62C0021BE1C0034AF06004EAB001251AE00284CB3003F49BC005E47
+B4007B46A70097439D00B63C9D02FF359401FF319501FF319501FF319501FF
+319501FF319501FF319501FF319501FF319501FF319501FF319501FF319501
+FF319C3500009C3600009D3700009D380000A33C0000A93F0000B1420000B8
+440000BF440004C43C0012C82F0020C21F0032B30A004CAB000F53AE00254E
+B2003C4BBD005A49B6007848A80095469D00B33E9F03FF369502FF329502FF
+329502FF329502FF329502FF329502FF329502FF329502FF329502FF329502
+FF329502FF329502FF329C3700009D3700009D3800009E390000A33D0000A9
+410000B1430000B9460000C0460003C53F0010CB33001FC6230030B80F0049
+AE010C55AF002251B200384DBE00564BB700754AAA0093489E00B141A103FF
+389603FF349603FF349603FF349603FF349603FF349603FF349603FF349603
+FF349603FF349603FF349603FF349603FF349D3800009D3900009E3A00009E
+3B0000A33E0000AA420000B1450000B9470000C0480003C642000FCD37001D
+CA27002DBD140045B1020956B0001E53B3003450BE00524EB900714CAB0090
+4B9F00AF44A304FF3A9704FF359704FF359704FF359704FF359704FF359704
+FF359704FF359704FF359704FF359704FF359704FF359704FF359E3900009E
+3A00009F3B00009F3C0000A4400000AA430000B1460000B8480000C04A0002
+C846000DCF3C001BD02D002BC2190041B6040558B1001A56B4003052BF004D
+50BC006C4EAD008D4EA100AD47A505FF3C9805FF379806FF37990AFF369A0D
+FF359A0DFF359A0DFF359A0DFF359A0DFF359A0DFF359A0DFF359A0DFF359A
+0DFF359E3B00009F3C00009F3D0000A03D0000A4410000AA440000B0470000
+B84A0000C04C0001C949000CD1410019D5330029C81F003EBB060059B20015
+5AB4002B55BE004753C0006851AB0088539500A9518300D34E8813FF3D8614
+FF3D8414FF3E8315FF3E8315FF3E8315FF3E8315FF3E8315FF3E8315FF3E83
+15FF3E8315FF3E8315FF3E9F3D0000A03D0000A03E0000A03F0000A4420000
+AA450000B0480000B74B0000C04E0000C94D000AD3470017D83A0026CE2700
+39C00E0054B5000F5DB5002659A7003B5D9B0058638B007865720097635E00
+C0605A06FD575A09FF565809FF575709FF575709FF575709FF575709FF5757
+09FF575709FF575709FF575709FF575709FF57A03E0000A03F0000A03F0000
+A0400000A4430000AA470000AF4A0000B74D0000BF4F0000C9500008D34C00
+15DC410023D62F0035C618004DA10303688500156D7500297263003E735700
+5A744B007D733F00AF6F3900FF6A3600FF6A3400FF6B3300FF6B3300FF6B33
+00FF6B3300FF6B3300FF6B3300FF6B3300FF6B3300FF6B3300FF6BA03F0000
+A0400000A1410000A1410000A4440000A9480000AF4B0000B64E0000BE5100
+00C8530006D4520012DF4A001FD43B0030A82D00477F1B00635304007D3E00
+13823000278127003E8321005B821B00857F1700EB791400FF781200FF7912
+01FF781201FF781201FF781201FF781201FF781201FF781201FF781201FF78
+1201FF78A1410000A1410000A1420000A1430000A4460000A8490000AE4C00
+00B5500000BD530000C7570003D357000FCB55001CAD4E002C8A3F0041662C
+005A3F1C00731309008B0407168E010B2D8A000D4887001379870419E7740D
+1FFF6B0C20FF6B0C20FF6B0C20FF6B0C20FF6B0C20FF6B0C20FF6B0C20FF6B
+0C20FF6B0C20FF6B0C20FF6BA1420000A1430000A1430000A1440000A44700
+00A74A0000AD4E0000B3510000BB550000C5590002BB5E000FAB60001C945B
+002A7850003D584100543632006A0D21017D0022138300282B82002F4F7E00
+3480790032D46A0736FF630838FF620839FF610839FF610839FF610839FF61
+0839FF610839FF610839FF610839FF610839FF61A1440000A1440000A14500
+00A1450000A3480000A64B0000AB4F0000B1520000B8570000AC5E0006A264
+00129568001C826600286C6300394F57004D2E4A006207370077003D147900
+472D78004E54730051836B0050D361004EFF5E004FFF5D0050FF5D0050FF5D
+0050FF5D0050FF5D0050FF5D0050FF5D0050FF5D0050FF5D0050FF5DA14500
+00A1460000A1460000A1470000A3490000A54D0000AA500000AD540000A15C
+00019863000A8F690011846F00197573002463740032486D00452962005906
+550170005B166F0063326B006B5967006E855F0977EA510F76FE491077FE48
+1078FE471078FE471078FE471078FE471078FE471078FE471078FE471078FE
+471078FE47A1470000A1470000A1470000A1480000A24B0000A44E0000A452
+0000985900008F6000058868000A8170000E76780015697E001D5982002942
+7F0038267A004B0571026400761962007F345D0088575700897F500193E748
+0791FF400691FF400591FF400591FF400591FF400591FF400591FF400591FF
+400591FF400591FF400591FF40A1480000A1480000A1490000A1490000A24C
+00009F50000092560000895D0002826400047C6D00077576000A6C80000E60
+890016518E00213D90002D2591003E058B0252008E1852009A314E00A35147
+00A97E4100B2C43C00A9FF3901AAFF3801AAFF3801AAFF3801AAFF3801AAFF
+3801AAFF3801AAFF3801AAFF3801AAFF3801AAFF38A1490000A14A0000A14A
+0000A14A00009C4E00008D540000835A00007B60000176680002717200026B
+7D0004638900085994000E4A9B001A38A2002426A9003009A8014100AE1443
+00C12E3F00C84E3A05F6893300EBAA3115E2FF2415E2FF2315E3FF2315E3FF
+2315E3FF2315E3FF2315E3FF2315E3FF2315E3FF2315E3FF2315E3FF23A14B
+0000A14B0000A14B00009C4C00008C52000080570000775D0000706400006B
+6D000067780000608400005A92000155A0000349AC000D37B8001627C40020
+16D9002E00E70C370BFC312B08FF4B2812FF7F1E0AFF9E2100FFB12400FFB6
+2400FFB62400FFB62400FFB62400FFB62400FFB62400FFB62400FFB62400FF
+B62400FFB624A14C0000A14C00009D4D00008B5000007F550000755A00006C
+61000066690000627300005C7F0000578C0000529900004EA8000047BA0003
+36CA000D25DA001917F3002501FF112E0AFF322214FF5B1713FF7A150AFF97
+1A00FFAD1F00FFB21F00FFB21F00FFB21F00FFB21F00FFB21F00FFB21F00FF
+B21F00FFB21F00FFB21F00FFB21FA14D00009E4E00008B5100007F53000074
+5800006A5D0000646400005F6C00005A77000055830000509000004B9C0000
+46AA00003CBC00042DCE000D1EE000180FF7012400FF192709FF371C0EFF5C
+1615FF7D0A0BFF971300FFAD1B00FFB51B00FFB61B00FFB61B00FFB61B00FF
+B61B00FFB61B00FFB61B00FFB61B00FFB61B00FFB61BA14E00008A5100007E
+530000745500006A590000635F00005D66000059700000547B00004E870000
+4A930000449F00003EAE000034C2000425D3000E18E7001806F9052300FF20
+2113FF470D0BFF5F1312FF7D070CFF960C00FFAE180DFFCF0D0EFFCF0D0EFF
+CF0D0EFFCF0D0EFFCF0D0EFFCF0D0EFFCF0D0EFFCF0D0EFFCF0D0EFFCF0D8B
+5100007D540000735500006B560000625B00005C610000576A000052740000
+4D7F0000488B0000429600003CA3000035B300002AC700041DD8000E11EC00
+1800F90F1F00FF251B12FF4C070CFF630B12FF7E000CFF940700FFAB1414FF
+E10414FFE10414FFE10414FFE10414FFE10414FFE10414FFE10414FFE10414
+FFE10414FFE1047D5400007255000069560000635800005B5D000056640000
+516D00004C78000047840000418E00003B9A000034A700002DB9000022CB00
+0516DC000E06ED011A00FC17190CFF330B11FF500106FF620C0CFF7C020BFF
+920300FFA60F12FFDA0113FFE60113FFE60113FFE60113FFE60113FFE60113
+FFE60113FFE60113FFE60113FFE6017155000068570000615800005C590000
+56600000506800004B720000467D0000408700003A920000339E00002CAC00
+0025BE00001ACE00060FE1000E02F0081600FE1D1409FF35080CFF510007FF
+65040AFF7B000AFF900001FFA10907FFBD040FFFE6000FFFE6000FFFE6000F
+FFE6000FFFE6000FFFE6000FFFE6000FFFE6000FFFE6006757000060580000
+5A5A0000565C0000506300004B6C00004677000040810000398B0000329500
+002BA2000024B100001DC1000013D2000708E4000F00F30F1200FF210F05FF
+370708FF520007FF670006FF790006FF8C0002FF9D0503FFB10304FFBC0204
+FFBC0204FFBC0204FFBC0204FFBC0204FFBC0204FFBC0204FFBC0204FFBC02
+5E590000595B0000545D0000505F00004B670000457100003F7B0000398500
+00318E00002A99000023A600001DB4000016C400010CD4000700E6021000F6
+150D00FF260B03FF390505FF540003FF670003FF770003FF890003FF990201
+FFAA0201FFB50201FFB50201FFB50201FFB50201FFB50201FFB50201FFB502
+01FFB50201FFB502575B0000535E00004F6000004B630000456B00003F7500
+00397F0000318800002A920000239D00001CAA000015B700000FC6000206D7
+000800EA090B00F81B0900FF2A0701FF3C0202FF560001FF670000FF750001
+FF850001FF960001FFA50100FFAD0000FFAD0000FFAD0000FFAD0000FFAD00
+00FFAD0000FFAD0000FFAD0000FFAD00>
+<96290000972A0000972B0000972B0000992C00009D2E0000A3300000A93100
+00AD2D0006B0240014AD170025A10700399F000E40A100213DA7003539AE00
+4D38B0006736AB008234A6009E30A400C52B9C00F927A51EFF08A51EFF08A5
+1DFF09A51DFF09A51DFF09A51DFF09A51DFF09A51DFF09A51DFF09A51DFF09
+A51DFF09A51DFF09962A0000972B0000972B0000972C0000992D00009E2F00
+00A3310000A9320000AD2E0005B1250014AE180024A20800389F000D41A200
+203EA700343AAE004C38B1006737AC008134A6009C31A400C32C9C00F828A3
+1BFF0CA31BFF0CA31BFF0CA31AFF0CA31AFF0CA31AFF0CA31AFF0CA31AFF0C
+A31AFF0CA31AFF0CA31AFF0CA31AFF0C972A0000972B0000972C0000982C00
+00992E00009E300000A4320000AA330000AE300005B2260013B01A0023A40A
+00379F000B42A2001F3FA700323BAE004B39B2006538AD008035A6009B32A3
+00C12D9C00F728A118FF0FA118FF10A117FF10A117FF10A117FF10A117FF10
+A117FF10A117FF10A117FF10A117FF10A117FF10A117FF10972B0000972C00
+00972C0000982D0000992E00009E300000A5330000AB340000AF310005B228
+0013B11B0022A60B00369F000A43A2001E40A700313CAD00493AB2006439AE
+007E36A6009A33A300BF2E9C00F6299F14FF149F14FF149F14FF149F13FF14
+9E13FF149E13FF149E13FF149E13FF149E13FF149E13FF149E13FF149E13FF
+14972B0000972C0000982D0000982E00009A2F00009F310000A5340000AC35
+0000B0330004B32A0012B31D0021A80E0035A0000845A3001C42A7002F3DAD
+00473BB300623AAF007D38A6009834A300BC2F9D00F52A9C10FF189C0FFF19
+9C0FFF199C0FFF199C0FFF199C0FFF199C0FFF199C0FFF199C0FFF199C0FFF
+199C0FFF199C0FFF19972C0000982D0000982E0000982E00009A3000009F32
+0000A6350000AD370000B1350003B42C0011B51F0020AB100033A0000546A3
+001A43A7002D3FAD00453CB400603BB0007C39A6009636A200B8309D00F32B
+990BFF1D990AFF1E990AFF1E990AFF1E990AFF1E990AFF1E990AFF1E990AFF
+1E990AFF1E990AFF1E990AFF1E990AFF1E982D0000982E0000982F0000992F
+00009A310000A0340000A7360000AE380000B3370003B62E0010B722001FAE
+130032A2010447A4001845A8002B41AD00433EB4005E3DB1007A3BA7009437
+A200B5329D00F02D9605FF239605FF249604FF249604FF249604FF249604FF
+249604FF249604FF249604FF249604FF249604FF249604FF24982E0000992F
+000099300000993000009B320000A1350000A8380000AF3A0000B4390002B7
+31000FB924001EB2160030A4030346A5001548A8002943AD004040B6005C3E
+B200783CA8009239A100B1349E00ED2E9400FF299400FF299400FF299400FF
+299400FF299400FF299400FF299400FF299400FF299400FF299400FF299400
+FF29992F000099300000993100009A3100009C330000A2370000A83A0000B0
+3C0000B63C0001B934000EBC27001DB619002EA7060245A500124AA9002645
+AD003D42B7005940B400753EA900903CA100AD369F00EB309400FF2B9400FF
+2A9400FF2A9400FF2A9400FF2A9400FF2A9400FF2A9400FF2A9400FF2A9400
+FF2A9400FF2A9400FF2A993000009A3100009A3200009A3300009D350000A3
+390000AA3B0000B13E0000B83E0001BB37000DBF2B001BBA1C002CAC0A0143
+A7000E4DA9002348AD003944B7005542B6007240AA008E3FA100A9399F00E6
+329500FF2D9400FF2C9400FF2C9400FF2C9400FF2C9400FF2C9400FF2C9400
+FF2C9400FF2C9400FF2C9400FF2C9400FF2C9A3200009A3200009B3300009B
+3400009D360000A43B0000AB3D0000B3400000B9400001BD3B000BC12F001A
+BF21002AB20F0040A9000A4FAA00204BAE003547B7005145B8006E43AC008B
+41A200A63C9E00DD359600FF2F9400FF2E9400FF2E9400FF2E9400FF2E9400
+FF2E9400FF2E9400FF2E9400FF2E9400FF2E9400FF2E9400FF2E9B3300009B
+3400009C3500009C3600009E380000A53C0000AB3F0000B3410000BA430000
+BF3F000AC3330018C4250028B714003DAB000553AB001B4FAE00314AB7004C
+48BA006A46AE008744A200A33F9D00D3389502FF339002FF338D03FF348B04
+FF358B04FF358B04FF358B04FF358B04FF358B04FF358B04FF358B04FF358B
+04FF359B3500009C3600009C3700009D3800009F3A0000A53E0000AC410000
+B3430000BB450000C1420008C6390016CA2B0025BE19003AAE010056AD0017
+52AF002C4DB600464BBB006549A200804E8E009B4C7D00B549800CFF3D7E11
+FF3A7C12FF3A7A12FF3A7A12FF3A7A12FF3A7A12FF3A7A12FF3A7A12FF3A7A
+12FF3A7A12FF3A7A12FF3A9C3700009D3800009D3900009E3A0000A03B0000
+A53F0000AC420000B4450000BB470000C3460006C83E0014CD310023C52000
+35B5090050AE001156A90025549A0038598F00525D81006E606F008A5E5E00
+AF5C5400EA586617FF426518FF42651AFF41641AFF41641AFF41641AFF4164
+1AFF41641AFF41641AFF41641AFF41641AFF419D3900009E3A00009E3B0000
+9F3C0000A13E0000A6410000AC440000B3470000BB490000C34A0005CA4400
+12D2390020CC280031BC13004A920403637A0014696E00276D5E003A6D5200
+536E4800726D3E009B6B3F09E95E491AFF4D461AFF4E4217FF514217FF5142
+17FF514217FF514217FF514217FF514217FF514217FF514217FF519F3B0000
+9F3C00009F3D0000A03E0000A13F0000A6430000AC460000B3490000BA4C00
+00C34D0003CC4A000FD541001DC235002D9E2800447518005E4E0301793A00
+127C2D00257B25003A7D1E00557C1B0076791600BD761200FF711101FF7111
+03FF701103FF701103FF701103FF701103FF701103FF701103FF701103FF70
+1103FF70A03D0000A03E0000A03F0000A03F0000A1410000A6440000AB4800
+00B24B0000B94E0000C2500001CC4F000CBA4D001BA146002A833A003D5F29
+00563B1B006E1208008604061588000A2A84000D4381001169800015BC7702
+17FD6C0018FD6C0019FD6C0019FD6C0019FD6C0019FD6C0019FD6C0019FD6C
+0019FD6C0019FD6C0019FD6CA03F0000A0400000A1410000A1410000A24300
+00A6460000AB490000B14C0000B8500000BC540001AE57000F9F57001B8C52
+002871490039533D004F322F00650C1F01780020127D0025287B002B487800
+3174750032B4690834FE5C0935FF5B0A37FF5A0937FF5A0937FF5A0937FF5A
+0937FF5A0937FF5A0937FF5A0937FF5A0937FF5AA1410000A1420000A14200
+00A1430000A2440000A5470000A94B0000AF4E0000AE530000A3580006985C
+00118C5F001A7B5D0026665900364A5100492B44005D053200710039137300
+422A7100494E6E004C7768004DB75F004AFF58004BFF57004CFF57004CFF57
+004CFF57004CFF57004CFF57004CFF57004CFF57004CFF57004CFF57A14300
+00A1440000A1440000A1450000A2460000A4490000A84C0000A45100009957
+0002905D0009876200117C6700186E6A00225D6B003042640040255A005404
+4E016B00551669005D2F66006453630067775C0066A852076CFC48076DFD47
+086FFE46086FFE46086FFE46086FFE46086FFE46086FFE46086FFE46086FFE
+46086FFE46A1450000A1450000A1460000A1460000A1470000A34A00009C4F
+000091560000895B0004816200097968000E6F6F00146375001D537800283C
+7500362270004902690260006F195D00773259007F52540081754C0084AC47
+0187FF3D0188FF3C0188FF3C0188FF3C0188FF3C0188FF3C0188FF3C0188FF
+3C0188FF3C0188FF3C0188FF3CA1470000A1470000A1470000A1480000A149
+0000984E00008C530000835900017A5F0003746700066E6F00096578000F5A
+7F00174B8400213785002D1F85003D028103500086194D008F304900964D43
+009C733D00A2AB39009FFD35009DFF33009DFF33009EFF33009EFF33009EFF
+33009EFF33009EFF33009EFF33009EFF33009EFF33A1480000A1490000A149
+0000A1490000964C0000885100007E570000755D00006F6400016A6C000264
+7600055C800009538A00104490001C339600241F9A00300399024000A2163E
+00AD2D3A00B24B3500CD7C3200CCA62E09C9FF2706BEFF2706BFFF2706BFFF
+2706BFFF2706BFFF2706BFFF2706BFFF2706BFFF2706BFFF2706BFFF27A14A
+0000A14A0000A14A0000954C0000865000007B550000725A00006A60000065
+690000617300005B7E0001558A00034D950007409F001131A9001822B30022
+0DBE002E00C9103200DA282F00E0452A0BFC7C2106FF9C2100F6B72300F2D1
+2200F3D12200F3D12200F3D12200F3D12200F3D12200F3D12200F3D12200F3
+D12200F3D122A14B0000A14C0000944E0000855000007A5300007058000067
+5D0000616500005D6F0000587A0000538600004E93000048A1000042B10001
+35C4000825D5001218EB001D00FF072A00FF252512FF511210FF6F1115FF90
+0800FFA91A00FFB61B00FFB71B00FFB71B00FFB71B00FFB71B00FFB71B00FF
+B71B00FFB71B00FFB71B00FFB71BA14D0000944F0000845200007954000070
+560000665B00005F6200005A6A000056750000518000004C8C000046980000
+40A5000039B600012CCA00081EDB001210F0001D00FF152209FF311710FF55
+0D0DFF700D15FF900201FFA91711FFD60A12FFD80912FFD80912FFD80912FF
+D80912FFD80912FFD80912FFD80912FFD80912FFD809954F00008352000077
+5400006E560000665800005E5D000059640000546E00004F7900004A840000
+459000003F9B000038A9000030BC000123CE000817E1001207F3041D00FE1C
+1C10FF3E090DFF58090AFF700B11FF8E0000FFA41214FFDA0313FFE10313FF
+E10313FFE10313FFE10313FFE10313FFE10313FFE10313FFE10313FFE10383
+530000765500006D560000655700005E59000058600000536800004E720000
+497D0000438800003D930000379F00002FAE000027C100011CD2000910E500
+1200F40A1B00FF211712FF44010BFF590606FF70090DFF8B0000FFA20E11FF
+CC0013FFE80013FFE80013FFE80013FFE80013FFE80013FFE80013FFE80013
+FFE80013FFE800765500006B560000645700005D590000585C000053630000
+4D6C000048770000438200003C8C0000359700002EA4000027B400001FC500
+0214D6000A07E8001400F8131500FF25120DFF450009FF5C0209FF720009FF
+880002FF9D0704FFB2050DFFE0000DFFE0000DFFE0000DFFE0000DFFE0000D
+FFE0000DFFE0000DFFE0000DFFE0006A560000625800005C590000575B0000
+535F00004D67000048710000427B00003C860000348F00002D9B000026A800
+001FB8000017C800030DDA000A00EA051300FA190F00FF2A0D09FF460006FF
+5D0005FF710005FF850003FF990303FFAB0303FFBA0203FFBA0203FFBA0203
+FFBA0203FFBA0203FFBA0203FFBA0203FFBA0203FFBA02615800005A5A0000
+555C0000515F00004D620000476B0000417600003B800000348900002D9300
+00269F00001FAC000018BB000010CB000306DD000B00EF0C0D00FC1E0B00FF
+2E0805FF4B0003FF5F0002FF700002FF820003FF960101FFA60201FFB60001
+FFB60001FFB60001FFB60001FFB60001FFB60001FFB60001FFB60001FFB600
+595B0000545D0000506000004C62000047660000417000003B7A0000348300
+002C8C0000259700001EA3000017AF000011BD00000ACC000401E0020A00F0
+130800FE230700FF320301FF4B0000FF5F0000FF700000FF800001FF930000
+FFA10100FFB20000FFB20000FFB20000FFB20000FFB20000FFB20000FFB200
+00FFB20000FFB200535E00004E6100004A64000046660000416A00003B7400
+00347D00002C860000259000001E9A000017A6000010B100000BBF000103CD
+000600E2090600F1190400FE280300FF350000FF4F0000FF630000FF720000
+FF810000FF910000FF9E0000FFAD0000FFAF0000FFAF0000FFAF0000FFAF00
+00FFAF0000FFAF0000FFAF0000FFAF00>
+<9424000094240000942500009425000094260000972600009A2700009F2600
+00A3240004A71D0012A2110022980202339A0012349D002331A400362FAA00
+4D2EAB00652DA8007D2BA7009929A800C2259F00ED20A71EFF00A51DFF00A5
+1DFF00A51DFF00A51DFF00A51DFF00A51DFF00A51DFF00A51DFF00A51DFF00
+A51DFF00A51DFF009424000094250000942500009426000095260000972700
+009B2700009F270000A3250003A71E0011A4120021980201349A0011359D00
+2232A400352FAA004B2FAB00642EA9007D2CA7009829A800C025A000EC21A8
+1FFF00A51EFF00A51EFF00A51EFF00A51EFF00A51EFF00A51EFF00A51EFF00
+A51EFF00A51EFF00A51EFF00A51EFF00942500009425000094260000952600
+0095270000972700009B280000A0280000A3260003A81F0011A51300219903
+00339A0010369D002133A4003431AA004A30AC00632FA9007B2DA700972AA7
+00BE26A000EB22A820FF00A61EFF00A61EFF00A61EFF00A61EFF00A61EFF00
+A61EFF00A61EFF00A61EFF00A61EFF00A61EFF00A61EFF0094250000942600
+00952600009527000095270000982800009B290000A0290000A4270003A921
+0010A71500209B0500329B000E389D002035A4003232AA004831AD006230AA
+007A2EA700952BA700BB27A000E922A920FF00A61FFF00A61FFF00A71FFF00
+A71FFF00A71FFF00A71FFF00A71FFF00A71FFF00A71FFF00A71FFF00A71FFF
+009426000095260000952700009528000096280000982900009C290000A12A
+0000A5280003AA22000FA917001F9E0700319B000C399E001E36A4003033AA
+004732AD006031AB00792FA600942CA700B928A000E724AA22FF00A720FF00
+A720FF00A720FF00A720FF00A720FF00A720FF00A720FF00A720FF00A720FF
+00A720FF00A720FF009526000095270000952800009628000096290000982A
+00009C2A0000A12B0000A62A0002AB24000EAA19001DA00A00309B000A3B9E
+001C38A3002E35AA004533AE005E32AC007730A600922EA700B62AA000E525
+AB23FF00A821FF00A821FF00A821FF00A821FF00A821FF00A821FF00A821FF
+00A821FF00A821FF00A821FF00A821FF009527000095280000962900009629
+0000962A0000992B00009D2C0000A32D0000A72C0001AC26000DAC1B001CA3
+0C002E9C00073C9F001A3AA3002C37AA004235AE005C34AD007532A700902F
+A600B22BA100E226AD24FF00A923FF00A923FF00A923FF00A923FF00A923FF
+00A923FF00A923FF00A923FF00A923FF00A923FF00A923FF00962800009629
+000096290000972A0000972B00009A2C00009E2D0000A42F0000A92F0001AD
+29000CAE1E001BA710002C9D02053D9F00173DA3002A39AA004036AF005A36
+AE007334A7008E31A600AF2CA100DE28AE26FF00A924FF00A924FF00A924FF
+00A923FF01A923FF01A923FF01A923FF01A923FF01A923FF01A923FF01A923
+FF0196290000962A0000972B0000972B0000972C00009A2D00009F2F0000A5
+310000AB310000AF2B000AB1210019AB13002B9F03033DA0001440A300273C
+A9003D38B0005738AF007136A9008C33A500AB2EA100DB2AA91FFF0AA41CFF
+0AA41CFF0AA41CFF0AA41CFF0BA41CFF0BA41CFF0BA41CFF0BA41CFF0BA41C
+FF0BA41CFF0BA41CFF0B972A0000972B0000972C0000982D0000982D00009B
+2F0000A0310000A7330000AD340000B02E0009B3240018AE160029A206023D
+A1001142A400243FA900393BB000533AB1006E38AA008935A500A631A100D7
+2CA416FF159F14FF149F14FF149F14FF149F13FF149F13FF149F13FF149F13
+FF149F13FF149F13FF149F13FF149F13FF14972C0000982C0000982D000098
+2E0000982F00009C310000A2330000A8360000AF370000B2320008B6280016
+B31A0026A609003CA2000D46A4002142A900353DB0004F3CB3006B3AAC0086
+38A500A234A100CF2E9C08FF23990BFF1E990AFF1E990AFF1E990AFF1E990A
+FF1E990AFF1E990AFF1E990AFF1E990AFF1E990AFF1E990AFF1E982D000098
+2E0000992F000099300000993000009D330000A3360000AA380000B13A0000
+B5360006B82C0014B81F0024AC0E0039A3000849A5001D46A9003141B0004B
+3FB500673DAE00833BA5009E379A00C1339203FB2F8A05FF2D8806FF2D8707
+FF2E8507FF2F8507FF2F8507FF2F8507FF2F8507FF2F8507FF2F8507FF2F85
+07FF2F992F000099300000993100009A3100009A3200009E350000A4380000
+AB3B0000B33D0000B83B0004BB310012BD240022B3140035A400034DA70018
+4AAA002D44B0004542AD005F459B00794988008E477900A8437301E741760E
+FF36740EFF37720FFF37710FFF38710FFF38710FFF38710FFF38710FFF3871
+0FFF38710FFF38710FFF38993100009A3200009A3300009B3400009B340000
+9F380000A63B0000AD3E0000B5400000BB400003BD360010C12A001FBA1B00
+31AB070249A800124E9C0024509100355486004C577900655A6A007F585D00
+A0575400CB526216FF3C6017FF3D5E17FF3E5D17FF3E5D17FF3E5D17FF3E5D
+17FF3E5D17FF3E5D17FF3E5D17FF3E5D17FF3E9B3300009B3400009C350000
+9C3600009C370000A03A0000A73E0000AE400000B6430000BC430002C13C00
+0EC631001CC221002DAA1200468503035E7200136466002568580036684D00
+4C6944006A683C008B663700C262481CFF45441AFF484017FF4C3C14FF4E3C
+14FF4E3C14FF4E3C14FF4E3C14FF4E3C14FF4E3C14FF4E3C14FF4E9C360000
+9C3700009D3800009D3900009E390000A13C0000A7400000AE430000B64500
+00BE470001C443000CCA38001AB32F00299325003F6C160059480201743600
+12762B002375220037771C004F761A006C7317009B711201FF6A1102FF6A10
+03FF6A0F04FF6A0F04FF6A0F04FF6A0F04FF6A0F04FF6A0F04FF6A0F04FF6A
+0F04FF6A9D3800009E3900009E3A00009F3B00009F3C0000A23F0000A84200
+00AE450000B6480000BE4A0000BE49000AAC460019973F00267C3500385826
+00523719006911070080030614820009287E000C3F7B000F5F7A00149B7500
+15F3680016F2670017F3670018F3660018F3660018F3660018F3660018F366
+0018F3660018F3660018F3669F3B00009F3C00009F3D0000A03E0000A03E00
+00A3410000A8440000AE470000B54A0000B14E0001A350000E954F0019844B
+00256B4300354E38004B2E2C00600A1D0172001E1276002326740028417200
+2E6B6F0031A0670831FD560933FF550934FF540935FF540935FF540935FF54
+0935FF540935FF540935FF540935FF540935FF54A03E0000A03F0000A03F00
+00A0400000A1410000A3430000A7460000AD490000A54E00009A5300069056
+0010845700197455002460510032464B004428400059042F006B0035136C00
+3E276B0045476900486C64004BA15C0147F3520047FD500048FD500049FD50
+0049FD500049FD500049FD500049FD500049FD500049FD500049FD50A04000
+00A1410000A1420000A1420000A1430000A3450000A74800009C4D00009253
+000189570008805C000F755F0017686100215761002E3D5C003C2253005003
+4802650050156400582C61005E4D5F00616D580062954F0669FF440568FF42
+0569FF420569FF410569FF410569FF410569FF410569FF410569FF410569FF
+410569FF41A1420000A1430000A1440000A1440000A1450000A3470000964C
+00008B520000825700037A5C00087262000D696800135E6C001C4E6E002737
+6C00331D6700460162035C006918580070305400774D50007A6C48007C9342
+0082F63A0080FF380081FF370081FF370081FF370081FF370081FF370081FF
+370081FF370081FF370081FF37A1450000A1450000A1460000A1460000A147
+0000914B0000865000007D560000745B00026D610004676900085F70000E55
+770016467A0021317C002B1A7B003B0079044C00801A4800872F44008C493F
+0091693A009596360096E5310093FF2E0093FF2E0094FF2E0094FF2E0094FF
+2E0094FF2E0094FF2E0094FF2E0094FF2E0094FF2EA1470000A1470000A148
+0000A14800008F4B0000834F00007954000070590000685F0000636700015E
+700004577900094D8100113F87001B2D8B0023198E0030018F043D00981739
+00A02C3400A4473100AE6C2F00B89D2C00B0D82901A8FF2501A8FF2501A9FF
+2501A9FF2501A9FF2501A9FF2501A9FF2501A9FF2501A9FF2501A9FF25A148
+0000A1490000A14900008D4C0000814F0000775200006D570000655C000060
+6400005B6D00005678000150830004478C000A3A9400132C9D00191BA30024
+05AA012E00B7132D00C3282A00C4422500DF6F2600E8912200DAB72201D0F4
+1F01D0F51F01D1F71F01D1F71F01D1F71F01D1F71F01D1F71F01D1F71F01D1
+F71F01D1F71FA14A0000A14B00008C4E00007F500000755200006C55000063
+5A00005D610000586A0000547500004F810000498D0000439800013AA50005
+2EB5000A20C3001313D5001D00E50B2401F8242013FF4E0D0CFF691117FF8C
+0000FFA61714FFE80A14FFEB0915FFEB0815FFEB0815FFEB0815FFEB0815FF
+EB0815FFEB0815FFEB0815FFEB08A14C00008B4F00007D520000735400006A
+550000625900005B5F000056680000517200004C7E00004789000041950000
+3BA1000034B100002AC500031DD6000D10EA001700F90F1E03FF281712FF4E
+0408FF650D11FF840000FF9D1114FFD40113FFE20313FFE20313FFE20313FF
+E20313FFE20313FFE20313FFE20313FFE20313FFE2038B5000007C54000071
+55000068570000625800005B5C000055630000506C00004B77000046820000
+408D00003A98000033A600002BB7000021C9000415DB000D05EC011800FC17
+1809FF310C0FFF500005FF650A0CFF810002FF9C0B0EFFC20112FFE70012FF
+E70012FFE70012FFE70012FFE70012FFE70012FFE70012FFE70012FFE7007B
+5400007056000067570000605800005A5A0000555F0000506700004A710000
+457C00003F86000038910000319C00002AAA000023BC000019CD00050EDF00
+0D01EF081500FE1D1205FF330A0AFF510009FF690008FF800005FF970404FF
+AE050BFFD5010AFFD4010AFFD4010AFFD4010AFFD4010AFFD4010AFFD4010A
+FFD4010AFFD4016F560000655700005E590000585B0000545D00004F620000
+4A6B0000447600003E800000378A00003094000029A1000022AF00001BBF00
+0012D0000606E2000E00F30F1000FE220D03FF360807FF530005FF690004FF
+7D0004FF940102FFA80303FFB90103FFB90103FFB90103FFB90103FFB90103
+FFB90103FFB90103FFB90103FFB901645700005C590000575B0000535E0000
+4F6000004A660000447000003E7A0000378400002F8D00002898000021A500
+001AB2000013C200010BD2000600E5030D00F5160B00FE270901FF390403FF
+560002FF690002FF7A0002FF910001FFA30101FFB40001FFB40001FFB40001
+FFB40001FFB40001FFB40001FFB40001FFB40001FFB4005B5A0000555C0000
+515F00004D61000049640000436A00003D750000377E00002F870000289100
+00209C000019A8000013B500000DC4000104D4000700E70B0800F61C0700FF
+2B0400FF3B0100FF570000FF6A0000FF7A0001FF8E0000FF9F0000FFB00000
+FFB20000FFB20000FFB20000FFB20000FFB20000FFB20000FFB20000FFB200
+545D00004F6000004B63000046660000426900003D6F0000367900002F8200
+00288B000020950000199F000012AA00000CB6000006C4000300D6040500EA
+120400F7210300FF2F0000FF410000FF5C0000FF6D0000FF7C0000FF8D0000
+FF9D0000FFAA0000FFB20000FFB20000FFB20000FFB20000FFB20000FFB200
+00FFB20000FFB2004E6100004964000044670000406A00003C6D0000377300
+002F7C000028850000218E00001998000012A100000CAB000005B7000200C5
+020300DB0A0100EA180000F7250000FF300000FF4A0000FF5F0000FF6D0000
+FF7C0000FF8B0000FF9C0000FFA50000FFB20000FFB20000FFB20000FFB200
+00FFB20000FFB20000FFB20000FFB200>
+<921F0000931F00009320000093200000932100009421000096210000992000
+009C1E00029F1700109A0B001F9300052B970015299B002427A1003626A500
+4B26A6006225A4007923A5009322A800B71EA200E119A516FF02A014FF00A0
+14FF00A015FF00A015FF00A015FF00A015FF00A015FF00A015FF00A015FF00
+A015FF00A015FF00931F000093200000932000009321000093210000942200
+0096210000992000009C1F00019F18000F9B0C001F9300042C9700142A9B00
+2328A1003527A5004A27A6006126A5007824A6009222A800B61FA200E01AA6
+17FF02A015FF00A015FF00A015FF00A015FF00A015FF00A015FF00A015FF00
+A015FF00A015FF00A015FF00A015FF00932000009320000093210000932100
+009322000094220000962200009A2100009C1F0001A019000E9C0E001E9300
+022D9700132B9B002229A1003428A5004928A6006027A5007725A6009123A8
+00B420A300DE1BA618FF02A116FF00A116FF00A116FF00A116FF00A116FF00
+A116FF00A116FF00A116FF00A116FF00A116FF00A116FF0093200000932100
+0093210000932200009322000094230000972200009A2200009D200001A11A
+000D9E0F001D9401022C9700112C9A00212AA1003229A6004729A7005F28A6
+007626A6009024A800B221A300DD1CA718FF03A117FF00A117FF00A117FF00
+A117FF00A117FF00A117FF00A117FF00A117FF00A117FF00A117FF00A117FF
+00932100009321000093220000932200009423000094230000972300009A22
+00009D210001A21C000CA011001C9603012C98000F2E9A00202CA100312AA6
+00462AA8005D29A7007427A6008E25A800B122A300DB1DA819FF03A218FF00
+A218FF00A218FF00A218FF00A218FF00A218FF00A218FF00A218FF00A218FF
+00A218FF00A218FF0093210000932200009423000094230000942400009424
+0000972400009A2300009E220001A31E000BA213001B9805012B98000D309B
+001E2DA0002F2BA600442BA9005B2AA8007329A6008C27A800AE24A400DA1E
+A91AFF04A319FF00A319FF00A319FF00A319FF00A319FF00A319FF00A319FF
+00A319FF00A319FF00A319FF00A319FF009322000094230000942300009424
+00009424000094250000972500009B2400009F240001A420000AA31600199B
+08012A98000B329B001C2FA0002D2DA700412CA900592CA900712AA6008A28
+A800AC25A400D820AB1BFF05A41BFF00A41BFF00A41BFF00A41BFF00A41BFF
+00A41BFF00A41BFF00A41BFF00A41BFF00A41BFF00A41BFF00942300009424
+000094240000942500009425000095260000982600009C260000A0260000A4
+220009A51800189E0B0029980108339B0019329F002A2FA7003F2EAA00572D
+AA006F2CA7008829A800A927A500D622AC1DFF06A51CFF00A51CFF00A51CFF
+00A51CFF00A51CFF00A51CFF00A51CFF00A51CFF00A51CFF00A51CFF00A51C
+FF00942400009424000094250000942600009526000095270000982700009C
+280000A1270000A5240008A81B0016A10E0027990105359B0017359F002831
+A6003C30AB00542FAB006D2DA700862BA700A528A500D324A917FE0DA61EFF
+00A61EFF00A61EFF00A61EFF00A61EFF00A61EFF00A61EFF00A61EFF00A61E
+FF00A61EFF00A61EFF00942500009426000095260000952700009527000096
+280000992900009D290000A2290000A6260006AA1E0015A51100259A030336
+9C0013389F002534A6003932AC005131AC006A30A800842DA700A12AA600CF
+26A20DFC18A720FF00A720FF00A720FF00A720FF00A720FF00A720FF00A720
+FF00A720FF00A720FF00A720FF00A720FF0095260000952700009528000096
+28000096290000962900009A2A00009E2B0000A42C0000A8290004AC220013
+A91500239D0500379C000F3BA0002238A6003534AC004D34AE006732AA0081
+30A6009E2DA500C9289C01FA23A822FF00A822FF00A822FF00A822FF00A723
+FF00A723FF00A723FF00A723FF00A723FF00A723FF00A723FF009528000096
+28000096290000962A0000972A0000972B00009B2C0000A02E0000A62F0000
+AA2D0003AE250011AD190020A20900349D000B3FA0001E3CA5003138AC0049
+36B0006335AC007D33A20097319600B42F8C00E32D8202FF298003FF2A7E03
+FF2B7D04FF2B7C04FF2B7C04FF2B7C04FF2B7C04FF2B7C04FF2B7C04FF2B7C
+04FF2B96290000962A0000972B0000972B0000972C0000982D00009C2F0000
+A2310000A8330000AD320002B12A000FB11E001EA80F00319E000642A10019
+40A5002D3CAA00433AA000593F930070428300844076009D3E6D00C23D6C07
+FF356A08FF366908FF366709FF376709FF376709FF376709FF376709FF3767
+09FF376709FF376709FF37972B0000972C0000982D0000982D0000982E0000
+992F00009E320000A4340000AB360000B1370000B42F000CB624001BB01500
+2DA3050341A00013469100224B8800334E7E00465171005D53650075525B00
+93525300B34C5A12FF3B5D17FF365F1BFF32611EFF2F6220FF2E6220FF2E62
+20FF2E6220FF2E6220FF2E6220FF2E6220FF2E982D0000982E0000992F0000
+99300000993100009A3200009F350000A6380000AD3A0000B43B0000B73500
+0ABB2A0019B71C00299B1000407B0304576A00125E5F002361530033624900
+4763410063643A007F613500A45C481DFF3F4118FF433D15FF473912FF4A37
+11FF4C3711FF4C3711FF4C3711FF4C3711FF4C3711FF4C3711FF4C99300000
+993100009A3200009A3200009B3300009B340000A2390000A83C0000B03E00
+00B7400000BB3C0008B8320016A42B00258821003A631300544301016E3300
+116F2800216F200034711A004A711800636E1700876C1101E6661003FF640F
+04FF640E04FF640D05FF640D05FF640D05FF640D05FF640D05FF640D05FF64
+0D05FF649A3200009B3300009B3400009C3500009C3600009D370000A33C00
+00A93F0000B0410000B8430000AF430008A03F00168E390023753000345324
+004E341700640F06007A0305137C00092679000C3C75000E58730013877100
+15D2660016EC620017EC610018EC600018EC600018EC600018EC600018EC60
+0018EC600018EC600018EC609C3600009C3700009D3800009D3900009E3A00
+009E3B0000A33E0000AA420000B1450000A6490000994A000C8C4800177D44
+0022653D0032493400472B29005C091B016D001C11700021246E00253C6B00
+2B626A002F9064002ED958042EFE51032FFE51032FFE510330FE510330FE51
+0330FE510330FE510330FE510330FE510330FE519E3900009E3A00009F3B00
+009F3C00009F3D0000A03E0000A4410000A84400009C4A0000924E00058850
+000E7D5000176E4E00215A4B002F42450040253B0054042C01650032126600
+3A24640041416400456460004991580046D04F0045F8490046F8490047F849
+0047F8480047F8480047F8480047F8480047F8480047F8480047F8489F3D00
+00A03E0000A03E0000A03F0000A0400000A0400000A0440000954A00008B4F
+0001825300077955000E6F5800166259001F5159002B395500381E4D004C02
+42025F004B145E00532A5C0059485A005C6554005D874C005EBD440162FF3F
+0162FF3E0163FF3E0163FF3D0163FF3D0163FF3D0163FF3D0163FF3D0163FF
+3D0163FF3DA03F0000A0400000A1410000A1420000A14200009B4300008F49
+0000854E00007C530002745700076C5C000B636100125864001B4966002532
+640031195F0043005B045600631852006B2E4E0070494B007365450075853E
+007AC638007AFF32007BFF32007BFF32007BFF32007BFF32007BFF32007BFF
+32007BFF32007BFF32007BFF32A1420000A1430000A1440000A14400009A46
+00008C490000814D0000775200006F570001675C0003616300075A69000D50
+6F0016417100202C73002A1571003A00710647007A1A4100802E3D0084453A
+00896336008C8631008FC72E008BFF2A008CFF29008CFF29008CFF29008CFF
+29008CFF29008CFF29008CFF29008CFF29008CFF29A1450000A1450000A146
+000099470000894A00007E4C0000745000006B550000645B00005E62000059
+6A000452720009487900113A7E001A278200231283002F0087063800901832
+00962B2F009A452C00A1642B00A9902900A5C327009BFF21009BFF21009BFF
+20009BFF20009BFF20009BFF20009BFF20009BFF20009BFF20009BFF20A147
+0000A147000098490000874C00007B4E0000724F000069530000615900005B
+60000057680000527200014B7C00054284000B358B00132592001A13970025
+009D032C00A9142800B2272500B4412200BF642200CB8B2000C5B32000BBFA
+1C00B8FF1C00B9FF1B00B9FF1B00B9FF1B00B9FF1B00B9FF1B00B9FF1B00B9
+FF1B00B9FF1BA1490000984B0000854E0000795000006F5100006852000060
+570000595D000055660000507000004B7B0000458700003D910003339B0008
+27A7000D19B100160ABE001F00CB101F00DB231D01F03A1C00EF601A08F985
+0F00FBA81613FEF90A12F7FF0A12F7FF0912F7FF0912F7FF0912F7FF0912F7
+FF0912F7FF0912F7FF0912F7FF09984C0000844F0000775200006D53000065
+5500005F560000585C0000536400004E6E0000497A0000438500003D910000
+369D00002EAC000027BF00011BD000080FE4001100F40A1900FF211510FF45
+0008FF5B0709FF760409FF940309FFB80511FFE70011FFE70011FFE70011FF
+E70011FFE70011FFE70011FFE70011FFE70011FFE70082510000755400006B
+550000635700005C590000585B0000526200004D6B00004776000042800000
+3B8B0000349500002DA2000026B200001EC3000113D4000807E7001200F713
+1300FF26100BFF450009FF5F0007FF760008FF910004FFAA0409FFCD0108FF
+CC0108FFCB0108FFCB0108FFCB0108FFCB0108FFCB0108FFCB0108FFCB0174
+55000069560000615800005A5A0000565C0000525E00004C66000047700000
+417A00003B850000338E00002C99000025A700001EB6000016C600020CD700
+0900E9051100F9190E00FF2B0B07FF480005FF600004FF740004FF8D0002FF
+A50302FFB80102FFB80102FFB80102FFB80102FFB80102FFB80102FFB80102
+FFB80102FFB801685700005F580000595B0000545D0000505F00004C620000
+466A0000407500003A7F0000328800002B920000249E00001DAB000016B900
+000FC9000305DB000A00ED0C0B00FC1F0900FF2F0603FF4B0001FF600001FF
+720002FF890001FFA00101FFB30000FFB30000FFB30000FFB30000FFB30000
+FFB30000FFB30000FFB30000FFB3005E590000575B0000525E00004E610000
+4A63000046660000406F000039790000328200002B8C0000239600001CA100
+0015AD00000FBB000008C9000401DC040800EF140600FD240500FF330101FF
+4C0000FF630000FF740000FF870000FF9C0000FFAE0000FFB20000FFB20000
+FFB20000FFB20000FFB20000FFB20000FFB20000FFB200565C0000515F0000
+4C62000048650000436800003F6B000039740000327D00002A860000238F00
+001C99000015A400000EAF000008BC000101CA000500E10B0300EF1A0200FD
+280100FF350000FF540000FF690000FF760000FF880000FF9C0000FFA90000
+FFB20000FFB20000FFB20000FFB20000FFB20000FFB20000FFB20000FFB200
+4F6000004A63000045670000416A00003D6C0000396F0000327700002B8000
+00238900001C930000149C00000EA5000007B0000101BC010300CE050000E2
+100000EF1D0000FC2A0000FF370000FF550000FF690000FF740000FF850000
+FF9B0000FFA40000FFB20000FFB20000FFB20000FFB20000FFB20000FFB200
+00FFB20000FFB20048650000436800003E6B00003A6E000036710000327200
+002B7A0000238300001C8C0000159500000D9D000008A6000002B0000300BC
+010300CD050000E1100000EE1C0000FB290000FF350000FF530000FF670000
+FF720000FF830000FF960000FF9F0000FFAF0000FFB20000FFB20000FFB200
+00FFB20000FFB20000FFB20000FFB200>
+<901A0000901A0000911B0000911B0000911B0000911C0000931C0000951B00
+00971800019812000D9106001D90000922940017209800251E9D00351EA000
+4A1EA100601DA000751CA1008C1BA400AB18A100CF139F06F70A9B0CFF009B
+0CFF009B0CFF009B0CFF009B0CFF009B0CFF009B0CFF009B0CFF009B0CFF00
+9B0CFF009B0CFF00901A0000911A0000911B0000911B0000911C0000921C00
+00931C0000951B0000971900009813000C9307001C90000723940016219800
+241F9E00341EA100491FA1005F1EA100741DA1008B1CA500AB19A100CF149F
+06F80C9C0DFF009C0DFF009C0DFF009C0DFF009C0DFF009C0DFF009C0DFF00
+9C0DFF009C0DFF009C0DFF009C0DFF00911A0000911B0000911B0000911C00
+00921C0000921D0000931D0000961C0000971A00009914000B9409001B9000
+062494001422980023209E00331FA1004720A2005E1FA100731EA2008A1CA5
+00A91AA200CE159F05F80D9C0EFF009C0EFF009C0EFF009C0EFF009C0EFF00
+9C0EFF009C0EFF009C0EFF009C0EFF009C0EFF009C0EFF00911B0000911C00
+00911C0000921D0000921D0000921E0000931E0000961D0000981B00009A15
+000A960A001A9100052594001323980022219E003120A2004621A3005C20A2
+00711FA200881DA500A81BA300CD169F05F80F9C0FFF009D0FFF009D0FFF00
+9D0FFF009D0FFF009D0FFF009D0FFF009D0FFF009D0FFF009D0FFF009D0FFF
+00911C0000921C0000921D0000921D0000921E0000921E0000941E0000961D
+0000981C00009B17000A980C00199201042594001225980020239E003021A2
+004422A3005B22A2007020A200871FA600A61CA400CC179F04F7109D10FF00
+9D10FF009D10FF009D10FF009D10FF009D10FF009D10FF009D10FF009D10FF
+009D10FF009D10FF00921C0000921D0000921E0000921E0000921F0000931F
+0000941F0000971E0000991D00009C1800099A0E0018930303259500102698
+001F249E002E23A2004223A4005923A3006E21A3008620A600A41EA400CA19
+9F03F6139E11FF009E11FF009E11FF009E11FF009E11FF009E11FF009E11FF
+009E11FF009E11FF009E11FF009E11FF00921D0000921E0000921E0000931F
+0000931F00009320000094200000971F0000991E00009D1A00079C11001695
+04022595000D2898001D269D002C24A3004025A5005724A4006D23A3008421
+A600A31FA500C91A9E01F6169F13FF009F13FF009F13FF009F13FF009F13FF
+009F13FF009F13FF009F13FF009F13FF009F13FF009F13FF00921E0000921F
+0000931F000093200000932000009321000094210000972000009A1F00009D
+1C00069E1300159706012595000B2A98001B289D002A26A3003E26A5005426
+A5006B25A4008223A700A021A600C71C9E00F418A014FF00A014FF00A014FF
+00A014FF00A015FF00A015FF00A015FF00A015FF00A015FF00A015FF00A015
+FF00931F000093200000932000009321000093210000932200009522000097
+2200009B2100009E1E0005A0160013990900249500082C9800182A9D002828
+A3003B28A6005128A6006926A5008024A7009E22A700C51E9F00F219A116FF
+00A116FF00A116FF00A116FF00A116FF00A116FF00A116FF00A116FF00A116
+FF00A116FF00A116FF00932000009321000093220000932200009422000094
+23000095230000982300009B2200009F200003A21900129D0C00229500052F
+9900152D9C00252BA300382AA7004E2AA8006628A6007E26A7009B24A800C3
+209F00EF1BA319FF00A218FF00A218FF00A218FF00A218FF00A218FF00A218
+FF00A218FF00A218FF00A218FF00A218FF0093220000932200009423000094
+230000942400009424000095240000982400009C240000A0230002A41C0010
+A010002096010131990011309C00222EA300352CA8004B2CA900632BA7007B
+29A6009726A800BF23A000EC1EA51BFF00A11CFF00A01DFF009F1EFF009E1F
+FF009E1FFF009E1FFF009E1FFF009E1FFF009E1FFF009E1FFF009423000094
+2300009424000094240000942500009426000096260000992600009D260000
+A1250001A620000DA514001D9A05012F99000D349C001F31A200312FA80047
+2EAB00602DA800782C9C008D2D9300A92C8A00CE2A7D00FE277901FF267701
+FF277601FF287401FF287401FF287401FF287401FF287401FF287401FF2874
+01FF2894240000942500009425000095260000952700009527000097280000
+9A2900009F290000A3280001A824000BA819001BA00A002C9A0009389D001B
+36A1002D329F004034960054388A00683B7E007C3A730094396B00B3386500
+F2366406FF316206FF326105FF336005FF346005FF346005FF346005FF3460
+05FF346005FF346005FF349426000095270000952700009528000096290000
+96290000982A00009B2B0000A12C0000A52C0000AA280009AC1E0018A61000
+299D0305389400133F880021457F0030477600414A6B00564C60006D4C5900
+884B5100A4464E03F3426D2AFF1E6D2CFF1D6C2CFF1D6C2DFF1D6C2DFF1D6C
+2DFF1D6C2DFF1D6C2DFF1D6C2DFF1D6C2DFF1D952800009629000096290000
+972A0000972B0000972B0000992C00009D2E0000A3300000A9310000AD2D00
+06B0240015AA1700258F0E003B72030450630012575900215A4F00305C4500
+435E3E005D5E3800765C340095573506FE513F17FF3D3A14FF423611FF4532
+0EFF48320EFF48320EFF48320EFF48320EFF48320EFF48320EFF48962A0000
+972B0000972C0000982D0000982D0000982E00009A2F00009F320000A63400
+00AD360000B1330004A82D0013982600217E1E00355C11004E3E0102673000
+1069260020691E00316B1800466B16005E6916007A671300B7640E02FE5F0D
+03FE5F0B03FE5F0A03FF5F0A03FF5F0A03FF5F0A03FF5F0A03FF5F0A03FF5F
+0A03FF5F982D0000982E0000982E0000992F0000993000009A3100009C3300
+00A2360000A8390000B03B0000A23C0006953900138633001F6E2C00304E22
+00493016005F0E0600740305127600092573000C396F000D526D0012796C00
+15B5640015E75C0016E75C0017E75B0018E75A0018E75A0018E75A0018E75A
+0018E75A0018E75A0018E75A99300000993100009A3200009A3300009B3400
+009B3400009E360000A43B0000A63E00009C4300009144000A85420015763E
+00205F39002F453100432827005708190168001B116A002023670023386400
+295B64002D8360002EB756002BF74E002CF64D002DF64D002EF54D002EF54C
+002EF54C002EF54C002EF54C002EF54C002EF54C9B3300009B3400009C3500
+009C3600009D3700009D3800009F3A00009E3F0000944500008B4A0003814A
+000C764A0016684800205445002C3D40003C2237004F03290160002F125F00
+37235E003D3D5D00415D5A004582540045B34A0043F2420044F3420044F341
+0045F2410045F2410045F2410045F2410045F2410045F2410045F2419D3700
+009D3800009E3900009E3A00009F3B00009F3C0000984000008E460000854B
+00007C4E00057350000D695200145C53001D4B520028344F00341B47004701
+3E035800461457004F28560056445300585F4F00597D47005AA640005CFD39
+005DFD38005EFD38005FFD37005FFD37005FFD37005FFD37005FFD37005FFD
+37005FFD379F3B00009F3D0000A03D0000A03E0000A03F0000964200008946
+0000804B0000774F00016E5200066756000B5E5B0011535D0019435E00232D
+5D002E165800400054054F005E184B00662D47006B4444006D5F3F006F7B3A
+0072A7350074FF2E0075FF2D0075FF2D0076FF2D0076FF2D0076FF2D0076FF
+2D0076FF2D0076FF2D0076FF2DA03F0000A0400000A1410000A14100009444
+0000864700007C4A0000734E00006A520001635800035C5D00065563000D4B
+6700153C6A001F276B002810690037006B084100741A3A007A2D37007E4334
+00825E3100857B2D0088AE2B0086F9260085FF250085FF250086FF250086FF
+240086FF240086FF240086FF240086FF240086FF24A1420000A1430000A144
+000092470000844A0000794B0000704D00006751000060570000595D000054
+6500034D6C00094472001135760019227900220D7A002E007F08330088192D
+008E2B2A0091432800975E27009C8025009CB1240095F21E0093FF1D0094FF
+1D0094FF1C0094FF1C0094FF1C0094FF1C0094FF1C0094FF1C0094FF1CA145
+0000A146000090490000814C0000764D00006D4E0000665000005E55000057
+5C0000536400004D6D0001477600053D7D000B2F8300131E87001B0C8C0025
+00940628009F162400A5272100A7401E00AE5D1E00B7811E00B7A81D00AEE4
+1A00A8FF1800A9FF1700A9FF1700A9FF1700A9FF1700A9FF1700A9FF1700A9
+FF1700A9FF17A14700008F4B00007F4D0000734F00006A500000635200005D
+540000565A0000516200004C6B00004676000040800001378900052C92000A
+1F9A001110A2001A01AD021F00BA121B00C5231900CF391700D1591600DC7B
+1400E3A21308F0F60F02D3FF1102D3FF1102D4FF1002D4FF1002D4FF1002D4
+FF1002D4FF1002D4FF1002D4FF108D4C00007D4F0000715100006753000060
+5400005A56000055590000506100004A6A0000457500003F800000388B0000
+3196000029A3000021B2000216C100080AD2001000E30B1400F51F1107FF38
+0709FF560108FF6F0006FF890204FFA7050BFFE4000AFFDF000AFFDA0109FF
+D90109FFD90109FFD90109FFD90109FFD90109FFD9017B5100006F53000065
+5500005D570000585A0000535C00004F610000496A0000447500003D7F0000
+378900002F930000289F000021AD00001ABD000011CE000506E0010D00F20F
+0E00FE220C02FF370605FF560003FF6C0004FF830002FFA00302FFB70102FF
+B80002FFB80002FFB70002FFB70002FFB70002FFB70002FFB70002FFB7006D
+560000635800005B5A0000565C0000525E00004E61000049650000436F0000
+3D790000368300002E8C00002797000020A3000019B0000012BF00000AD000
+0501E4040B00F4160A00FF280801FF3A0202FF570001FF6C0001FF800001FF
+9B0100FFB20000FFB20000FFB20000FFB20000FFB20000FFB20000FFB20000
+FFB20000FFB200615800005A5A0000545D0000506000004B62000047650000
+436A00003C740000357D00002E860000269000001F9B000018A6000011B300
+000BC1000103D1000700E60C0700F51C0500FF2C0300FF3B0000FF5A0000FF
+6E0000FF810000FF980000FFAD0000FFB20000FFB20000FFB20000FFB20000
+FFB20000FFB20000FFB20000FFB200585B0000535E00004E61000049640000
+45670000406A00003C6E0000357800002E810000268A00001F940000179E00
+0010A800000AB4000003C1000300D4050400E8120200F5220100FF2F0000FF
+490000FF620000FF6F0000FF820000FF9B0000FFA80000FFB20000FFB20000
+FFB20000FFB20000FFB20000FFB20000FFB20000FFB200515F00004C620000
+47660000426900003E6C00003A6E0000357200002D7B0000268400001F8D00
+001797000010A0000009A9000002B4000300C2030100D7090000E8150000F5
+230000FF2F0000FF480000FF600000FF6E0000FF800000FF960000FFA30000
+FFB20000FFB20000FFB20000FFB20000FFB20000FFB20000FFB20000FFB200
+4A630000456700003F6B00003B6E000036700000327200002D760000267E00
+001F87000017900000109800000BA0000006A9000101B4000400C2020200D6
+090000E8150000F4220000FF2F0000FF450000FF5E0000FF6D0000FF7D0000
+FF900000FF9F0000FFAF0000FFB20000FFB20000FFB20000FFB20000FFB200
+00FFB20000FFB200426900003D6C0000386F0000337200002F7400002B7600
+00267900001F8100001989000015910000109800000BA0000006A9000101B4
+000400C1020200D5090000E7140000F3210000FF2E0000FF420000FF5C0000
+FF6C0000FF7A0000FF8B0000FF9D0000FFA80000FFB20000FFB20000FFB200
+00FFB20000FFB20000FFB20000FFB200>
+<8D1400008E1500008E1500008E1600008E1600008F1700008F170000911600
+0092130000920D00098B0201188D000B198F00171893002416970033169A00
+47169B005D159C0071149D0087139E00A1119D00C00D9A00E1099805FF0097
+04FF009704FF009704FF009704FF009704FF009704FF009704FF009704FF00
+9704FF009704FF008E1500008E1500008E1600008E1600008F1700008F1700
+008F1800009116000092140000920E00098D0401178D000A1A900016199300
+2317980032179B0046179C005C169C0070159D0086149F00A0129D00BF0E9B
+00E20A9906FF009805FF009805FF009805FF009805FF009805FF009805FF00
+9805FF009805FF009805FF009805FF008E1500008E1600008F1700008F1700
+008F1800008F180000901800009117000093150000931000088E0501178D00
+081B9000151A93002218980031179C0045189D005A179D006F169E008515A0
+009F139E00BF0F9C00E20B9907FF009806FF009806FF009806FF009806FF00
+9806FF009806FF009806FF009806FF009806FF009806FF008E1600008F1700
+008F1700008F1800008F180000901900009019000092180000931600009411
+00078F0600168D00071D9000141B9400211A990030189C0043199D0059199D
+006E179E008316A0009E149F00BF109D00E30C9A08FF009907FF009907FF00
+9907FF009907FF009907FF009907FF009907FF009907FF009907FF009907FF
+008F1700008F1800008F180000901800009019000090190000901A00009219
+00009417000095120006910800158E00061E9100131C9400201B99002E1A9D
+00421A9E00581A9E006C199F008218A1009C16A000BE119D00E30D9B09FF00
+9908FF009908FF009908FF009908FF009A08FF009A08FF009A08FF009A08FF
+009A08FF009A08FF008F1800008F1800009019000090190000901A0000901A
+0000911A0000931A00009518000096140005930A00158E01041F9100111E94
+001E1C99002D1B9D00401C9F00561B9F006B1A9F008019A1009B17A100BC13
+9E00E30F9C0BFF009A09FF009A09FF009A09FF009A09FF009A09FF009A09FF
+009A09FF009A09FF009A09FF009A09FF009019000090190000901A0000901A
+0000911A0000911B0000911B0000931B00009519000097160004950C00138F
+02032091000F2095001D1E9A002B1D9E003E1DA000541DA000691CA0007E1A
+A2009919A200BB159F00E3109D0DFF009B0BFF009B0BFF009B0BFF009B0BFF
+009B0BFF009B0BFF009B0BFF009B0BFF009B0BFF009B0BFF0090190000901A
+0000911B0000911B0000911B0000911C0000921C0000941C0000961A000098
+170003970E00129003012092000D2295001B209A00291E9F003C1EA100521F
+A100671DA0007C1CA300971AA400BA169F00E2129F0EFF009B0CFF009B0CFF
+009B0CFF009B0CFF009B0CFF009B0CFF009B0CFF009B0CFF009B0CFF009B0C
+FF00911A0000911B0000911C0000911C0000921C0000921D0000921D000094
+1D0000961C000098190002991100109205002092000A24950019229A002720
+A0003920A2004F21A200651FA1007A1EA300941CA500B718A000E114A010FF
+009C0EFF009C0EFF009C0EFF009C0EFF009C0EFF009C0EFF009C0EFF009C0E
+FF009C0EFF009C0EFF00911C0000911C0000921D0000921D0000921E000092
+1E0000921F0000951E0000971D0000991B00019B14000F9608001E92000726
+960016249A002522A0003622A3004C23A3006221A2007820A400921EA600B5
+1BA100DF16A212FF019D10FF009D10FF009D10FF009E10FF009E10FF009E10
+FF009E10FF009E10FF009E10FF009E10FF00921D0000921D0000921E000092
+1F0000931F0000932000009320000095200000981F00009A1D00009D17000D
+990C001C92000429960013279A002225A0003324A4004825A5005F24A30076
+22A4008F20A700B31DA000DB199E13FF069A17FF009819FF00971AFF00971A
+FF00961BFF00961BFF00961BFF00961BFF00961BFF00961BFF00921E000092
+1F0000931F0000932000009321000093210000932100009521000098210000
+9B1F00009F1A000A9D10001A9503022896000F2A99001F28A0003027A40045
+27A6005C269E007027950085288F009E288700BE277A00E5238F24FF008E25
+FF008921FF05831BFF0C7E16FF117E16FF117E16FF117E16FF117E16FF117E
+16FF1193200000932000009321000093210000932200009422000094230000
+96230000992200009C210000A11E0008A11400179906002897000B2E99001C
+2C9F002C2A96003C2E8D004F32830062337900743370008B336800A7326100
+D4315F03FF2C5E04FF2D5C05FF2E5C05FF2E5B06FF2E5B06FF2E5B06FF2E5B
+06FF2E5B06FF2E5B06FF2E9321000093220000942300009423000094240000
+9424000094250000962500009A2500009D240000A2210006A51900159E0C00
+25980106318B0012388000203D77002D406F003C42650050455C0066455600
+7E454F009A414900BD3C6423FF1E6424FF1E6325FF1E6325FF1E6225FF1E62
+25FF1E6225FF1E6225FF1E6225FF1E6225FF1E942300009424000094240000
+94250000942500009526000095270000972700009B2800009F280000A32500
+03A81E00129C150022840C00356B0205485D00114F53001F534A002D554200
+3F573B00575935006F5632008A522F00B74E3D16FF383712FF3D330FFF412F
+0CFF432D0AFF462D0AFF462D0AFF462D0AFF462D0AFF462D0AFF4694250000
+942600009526000095270000952800009628000096290000982A00009D2B00
+00A22B0000A62A00029C2800108D22001E761B0030560F00493A01025F2D00
+0F6324001E641C002F6516004265140058631400716113009A5F0C01FC590A
+02FD5A0902FD5A0802FD5A0702FD5A0702FD5A0702FD5A0702FD5A0702FD5A
+0702FD5A952700009628000096290000962A0000972A0000972B0000972C00
+009A2D00009F2F0000A0320000973600048C3300117E2E001D6728002D491F
+00452D14005A0D05006D0205116F0009236D000B3669000D4E6600116F6600
+149F600015E5560016E4550017E3550018E2540019E2540019E2540019E254
+0019E2540019E2540019E254972A0000972B0000972C0000982D0000982E00
+00982E0000992F00009C3100009A370000933E0000893F00087D3C00136F39
+001E5934002C402D003F2525005307180162001A1164001E22610021355E00
+26545E002B785A002EA252002AEC49002BEC48002CEC47002DEB47002DEB46
+002DEB46002DEB46002DEB46002DEB46002DEB46982D0000982E0000992F00
+00993000009A3100009A3200009A330000953A00008D410000844500017A45
+000B6F4400156142001F4D400029373C00371F34004A0327025A002C125800
+332356003A3A57003F57540042764E00439F460041E03C0041EA3B0042EB3A
+0042EB3A0043EB3A0043EB3A0043EB3A0043EB3A0043EB3A0043EB3A9A3100
+009A3200009B3300009B3400009C3500009C360000913D0000884200007F47
+0000764900046D4A000C634C0014564D001C454C00252F4900301842004301
+3A03520042144F004B274E0053404C00545A49005574430056973B0058DB33
+0058F7320059F731005AF831005AF831005AF831005AF831005AF831005AF8
+31005AF8319C3600009D3700009D3800009E3900009D3A00008F4000008443
+00007B470000724A0001694D00056151000A595400104E5700183E57002128
+56002B1251003C004F0648005A184400622C3F0066413C00685939006A7436
+006C97310070E42A006FFF29006FFF290070FF280070FF280070FF280070FF
+280070FF280070FF280070FF289E3B00009F3C00009F3D00009D3E00008D43
+000081460000774700006E4A0000664E00015F53000358580006505D000B46
+6100143763001D226300260C6100350065093B006F1B3300742B310078402E
+007C592B007F742900819B270081DD23007FFF21007FFF21007FFF210080FF
+200080FF200080FF200080FF200080FF200080FF20A03F0000A04000009C41
+00008B4600007E480000744A00006B4A0000644E00005C5200005659000050
+600002496600083F6B00102F6E00181D7100210871002D00790A2D00821928
+00872A26008A412400905A220094762100959F200091D71C008DFF19008EFF
+19008EFF19008EFF19008EFF19008EFF19008EFF19008EFF19008EFF19A142
+00009C440000894800007B4B0000714C0000684D0000614E00005B52000054
+5800004F5F000049680000426F00053776000B297B0013187F001B06830024
+008C092300961720009B271D009D3E1A00A3581A00A8771A00AD9E1900A7CD
+1800A0FF1300A0FF1300A0FF1300A0FF1300A0FF1300A0FF1300A0FF1300A0
+FF1300A0FF139C460000874A0000784D00006D4E0000654F00005E50000059
+520000535700004D5E000048670000427100003B7A0002318100062589000C
+168E00140896001B00A1071B00AD141700B5231500BA371300BD531100C473
+1000CC960F00CBC51200BEFF0F00BEFF0E00BFFF0E00BFFF0E00BFFF0E00BF
+FF0E00BFFF0E00BFFF0E00BFFF0E854C0000764F00006B500000625200005B
+53000056560000525800004C5E000047670000417100003A7B000033840000
+2B8E00002399000219A400060DAE000E01BC021300CC0F1000DA1F0D00E732
+0C00ED4D0900F16A0802F6880402FCAD060AFAFF0008F2FF0108F3FF0108F3
+FF0108F3FF0108F3FF0108F3FF0108F3FF0108F3FF01745100006853000060
+55000059570000545A00004F5D00004B6000004667000040710000397C0000
+328600002A900000239C00001CA9000015B600000EC6000204D9000900EC0C
+0A00FB1F0800FF300502FF4D0001FF640000FF780001FF950000FFB10000FF
+B20000FFB20000FFB20000FFB20000FFB20000FFB20000FFB20000FFB20066
+5500005D580000565B0000525E00004D61000049640000456700003F6E0000
+39780000318100002A8A0000229500001BA0000014AB00000EB8000007C700
+0300DA040700EE140500FC240400FF340000FF4F0000FF670000FF7B0000FF
+930000FFAB0000FFB20000FFB20000FFB20000FFB20000FFB20000FFB20000
+FFB20000FFB2005B5A0000555C0000506000004B6300004666000042690000
+3E6C000038720000317C000029850000228E00001A98000013A200000DAD00
+0006BA000200C7010400DF0B0200EE1A0100FC290000FF380000FF570000FF
+6B0000FF7B0000FF930000FFA50000FFB20000FFB20000FFB20000FFB20000
+FFB20000FFB20000FFB20000FFB200535D00004E6100004964000044680000
+3F6B00003B6E00003770000031760000297F0000228800001A910000139B00
+000CA4000004AD000200BA010300CA040100DF0E0000ED1B0000FB290000FF
+350000FF550000FF6A0000FF790000FF8E0000FFA00000FFB20000FFB20000
+FFB20000FFB20000FFB20000FFB20000FFB20000FFB2004C62000046660000
+416A00003C6D000038700000337200002F74000029790000228200001A8B00
+00139400000E9B00000AA4000004AD000200B9010300C9040100DF0E0000ED
+1B0000FA280000FF340000FF530000FF690000FF760000FF890000FF9E0000
+FFAF0000FFB20000FFB20000FFB20000FFB20000FFB20000FFB20000FFB200
+446700003F6B0000396E000034710000307300002B75000028770000227C00
+001C840000188C0000139300000E9B00000AA3000004AD000200B9010300C8
+040100DE0D0000EC1A0000F9270000FF330000FF510000FF660000FF730000
+FF860000FF9C0000FFA90000FFB20000FFB20000FFB20000FFB20000FFB200
+00FFB20000FFB2003C6D000037700000317300002C75000028770000247800
+0023780000217C00001C840000188B0000139300000E9B00000AA3000004AC
+000200B8010300C8040100DD0C0000EB190000F9260000FF320000FF4F0000
+FF640000FF710000FF820000FF990000FFA30000FFB20000FFB20000FFB200
+00FFB20000FFB20000FFB20000FFB200>
+<8A0F00008A0F00008A1000008B1000008B1100008B1100008C1100008C1100
+008D0F00008C0900068701021289000C118A0017108C00220F9000300E9400
+430D9500580D96006C0C9800820B980098099700B0069500CB039501F60093
+01FF009301FF009301FF009301FF009301FF009301FF009301FF009301FF00
+9301FF009301FF008A0F00008A1000008B1000008B1100008C1100008C1200
+008C1200008D1200008E1000008D0A00058802021289000B128B0016118D00
+211091002F0F9500420E9600570E97006B0D9800810C9900970A9800B00796
+00CB049501F5019301FF009401FF009401FF009401FF009401FF009401FF00
+9401FF009401FF009401FF009401FF008B1000008B1000008B1100008C1200
+008C1200008C1200008D1300008D1300008E1000008D0C0005890302128900
+0A148B0015128D00211191002E10950041109700560F97006A0E9900800D9A
+00970B9900B0089700CC059601F4029401FF009401FF009401FF009401FF00
+9401FF009401FF009401FF009401FF009401FF009401FF008B1100008C1100
+008C1200008C1200008D1300008D1300008D1400008D1400008F1100008E0D
+00048A0401128A0009158C0014148E00201392002D11960040119800551098
+00691099007F0F9B00960D9A00B00A9800CC069601F3039501FF009501FF00
+9501FF009501FF009501FF009501FF009501FF009501FF009501FF009501FF
+008C1200008C1200008C1300008D1300008D1400008D1400008D1400008E15
+00008F1200008F0F00038C0500118A0007168D0013158F001F1493002C1397
+003E1299005412990068119A007D109C00950E9B00AF0B9900CC079700F204
+9502FF009502FF009502FF009502FF009502FF009502FF009502FF009502FF
+009502FF009502FF008C1200008D1300008D1400008D1400008D1500008E15
+00008E1500008E15000090130000901000028D0600118A0006188D0011168F
+001E1593002B1498003D149A0052139A0067129B007C129C0093109C00AF0D
+9A00CC099800F3059603FF009603FF009603FF009603FF009603FF009603FF
+009603FF009603FF009603FF009603FF008D1300008D1400008E1500008E15
+00008E1600008E1600008F1600008F17000091140000921200018F0900108B
+0004198E00101890001C179400291598003B159B0050159B0065149C007A13
+9D0091129D00AE0F9B00CD0A9900F4079704FF009704FF009704FF009704FF
+009704FF009704FF009704FF009704FF009704FF009704FF008D1500008E15
+00008E1600008E1600008F1700008F1700008F180000901800009216000093
+130000910B000E8B00021B8E000E1A91001A1895002817990039179C004E17
+9C0063169D0078159E0090149F00AD109D00CD0C9A00F5099805FF009805FF
+009805FF009805FF009805FF009805FF009805FF009805FF009805FF009805
+FF008E1600008E1600008F1700008F1700008F1800008F1800009019000090
+1900009217000094150000930E000C8C02011C8F000C1C9100191A95002619
+9A0037199D004C199D0061189D0076179F008D16A000AB139E00CD0E9B00F5
+0A9907FF009907FF009907FF009907FF009907FF009907FF009907FF009907
+FF009907FF009907FF008F1700008F1800008F180000901900009019000090
+190000901A0000911A000093190000951700009510000B8F04001B8F00091E
+9200171D9600241B9B00341B9E00491B9F005F1A9F007319A0008B18A200A9
+159F00CC109D04F4099A09FF009A09FF009A09FF009A09FF009A09FF00990A
+FF00990AFF00990AFF00990AFF00990AFF008F180000901900009019000090
+1A0000911A0000911B0000911B0000921B0000941A00009619000097130009
+930800198F0006219300141F9600221E9C00311C9F00461DA0005C1DA00071
+1BA100881AA200A6189A00C7169000ED149213FF009114FF009015FF008F16
+FF008F17FF008E17FF008E17FF008E17FF008E17FF008E17FF00901A000090
+1A0000911B0000911B0000911C0000911C0000921D0000921D0000951C0000
+971A000099160007960C0016910204229300112296001F209C002E1FA00042
+209F00582095006A228D007D23890094248500B1237700CF20881FFF01871F
+FF028620FF028520FF028421FF028421FF028421FF028421FF028421FF0284
+21FF02911B0000911C0000911C0000921D0000921D0000921E0000921E0000
+931F0000951E0000981D00009B1900059A1000149304012394000D2597001C
+23960029248E00382886004A2C7B005C2C72006E2C6C00842D65009D2D5E00
+C12C5A01FE275801FD295701FD2A5602FD2B5503FD2A5503FD2A5503FD2A55
+03FD2A5503FD2A5503FD2A921D0000921D0000921E0000921F0000931F0000
+93200000932000009320000096200000991F00009C1C00039D150011970800
+228F00072B8300123179001E3670002A396700383B5F004A3D57005F3E5200
+773E4D00903C4800AF375010FF2A4E11FF2A4D11FF2A4C12FF2B4C12FF2B4B
+12FF2B4B12FF2B4B12FF2B4B12FF2B4B12FF2B921F0000931F000093200000
+9320000093210000932100009322000094220000972200009A2100009D2000
+01A119000E9112001E7A0A003064020541580011474E001D4B46002B4E3E00
+3B5037005152320068503000814D2C00A249350EFD39320EFF3A2E0BFF3E2B
+09FF412807FF432706FF442706FF442706FF442706FF442706FF4493210000
+93210000932200009322000094230000942400009424000094240000972400
+009B2400009A2400019223000D841F001B6D18002C510E0043360102582A00
+0F5C22001D5D1A002C5F14003F5F1100535D11006A5C11008A5A0A00E95608
+00FA550600FB550500FB550400FB560300FB560300FB560300FB560300FB56
+0300FB56942300009423000094240000942500009425000094260000952600
+009527000098270000942B00008D2F0003842E000F762A001A6025002B451D
+00402A1300550C0500660205106900092267000B3463000D4A600010685F00
+148F5B0015CC520015E14F0016E04E0017DF4E0018DF4D0018DF4D0018DF4D
+0018DF4D0018DF4D0018DF4D94250000942600009527000095270000962800
+009629000096290000972A0000903000008937000081390006763700126834
+001D5230002A3B2A003A2322004E0616015D0018115D001D215A0020345800
+234E5700297054002C924C002BC744002AE642002BE741002BE740002CE740
+002CE740002CE740002CE740002CE740002CE7409628000096290000962A00
+00972B0000972B0000972C0000962E00008C330000853B00007E410000743F
+000A693E00145A3D001E473B0026313800311C30004502250254002A125100
+30234F0038374F003C524E003E6E4800409040003FC138003FE935003FE934
+0040E9340040E9330041E9330041E9330041E9330041E9330041E933972B00
+00982C0000982D0000982E0000992F0000953200008A380000813D00007942
+0000704400046745000C5D4600135047001A3F4700212A44002C153D003E01
+36044B003E15470048274600503D430051554100526D3D00538C370053BB2F
+0054F12C0055F22B0055F22B0056F22B0056F22B0056F22B0056F22B0056F2
+2B0056F22B99300000993100009A3200009B33000095360000883D00007F40
+0000754300006D460000654800055D4C0009544F000F485100163851001E24
+5000270F4B0038004A07410055183D005E2B3800623E350064553100656D30
+00678B2D0069BB270069FF25006AFF25006AFF24006AFF24006AFF24006AFF
+24006AFF24006AFF24006AFF249B3500009C3600009D370000953C00008741
+00007B440000724500006A460000624A00005B4E0002545300044C58000941
+5B0012325C001A1E5C002309590032005F0A3400691B2D006F2A2C00733E29
+00775626007A6E25007B8C23007CBF1F0079FD1D0079FD1D007AFD1D007AFE
+1C007AFE1C007AFE1C007AFE1C007AFE1C007AFE1C9E3A00009F3C00009440
+000085440000784600006E48000066490000604A0000594E0000525400004C
+5B0001456100063A65000E2A6700161869001F0469002B00720C28007B1A23
+0080292200833F1F0089561E008D701D008E901C008DC01A0088FF150089FF
+150089FF150089FF150089FF150089FF150089FF150089FF150089FF15A03F
+00009443000082470000754900006B4A0000634B00005D4C0000574E000051
+5400004B5B0000456300003D6A0004326F000B247300121276001B017A0023
+00840B1F008E181B0093271900953C16009A5315009E6E1500A3911500A1BC
+150099FA0F0099FF0F0099FF0F0099FF0E009AFF0E009AFF0E009AFF0E009A
+FF0E009AFF0E93460000804A0000724B0000684C0000604E00005A50000054
+510000505300004A5B0000446300003D6B0000367400022B7A00071E80000D
+0E840016038C011900970A1700A2161300A8241100AB360E00AD4E0C00B26A
+0C00BB8B0B00BCB20D00B1EA0A00AEFB0900AEFB0900AEFB0900AEFB0900AE
+FB0900AEFB0900AEFB0900AEFB097E4C0000704D0000654F00005D51000057
+530000525500004D580000495B0000436300003C6C0000367500002E7E0000
+258600021B8F00060F97000C04A0001100AD070F00BB120C00C4200900CA31
+0700CA480400D3640300DA830300DEA20303EAF20102D3F90202D4F90202D4
+F90102D4F90102D4F90102D4F90102D4F90102D4F9016D500000635200005A
+540000545700004F5A00004A5D000046600000426300003C6D000035770000
+2D800000268A00001E94000017A0000010AB000107B9000501C9020800DF0D
+0500EF1D0400FD2D0100FF3F0000FF5E0000FF730000FF8B0000FFA70000FF
+B20000FFB20000FFB20000FFB20000FFB20000FFB20000FFB20000FFB20060
+55000058580000525B00004D5F000048630000436700003F6B00003C6D0000
+357700002D800000258900001E930000179D00000FA7000009B2000002BF00
+0300D2050200E7130100F5220000FF300000FF4B0000FF630000FF730000FF
+8A0000FFA10000FFB20000FFB20000FFB20000FFB20000FFB20000FFB20000
+FFB20000FFB200565C0000505F00004B63000046670000416A00003C6D0000
+386F0000347100002D7A0000258300001E8C0000169600000F9E000008A700
+0101B2000400BF020200D3080000E7130000F4220000FF2F0000FF480000FF
+610000FF710000FF860000FF9E0000FFB20000FFB20000FFB20000FFB20000
+FFB20000FFB20000FFB20000FFB2004F60000049640000436800003E6C0000
+396F000034710000307300002C750000257D00001E860000168F0000119700
+000C9E000007A7000101B2000400BF020200D2070000E6130000F3210000FF
+2E0000FF450000FF5F0000FF6F0000FF830000FF9C0000FFB00000FFB20000
+FFB20000FFB20000FFB20000FFB20000FFB20000FFB20047660000416A0000
+3B6D000036700000317300002C75000028770000257800001F7F00001B8700
+00168E0000119600000C9E000008A7000101B1000400BE020200D1070000E5
+120000F2200000FF2D0000FF420000FF5D0000FF6E0000FF800000FF9A0000
+FFA90000FFB20000FFB20000FFB20000FFB20000FFB20000FFB20000FFB200
+3E6B0000396F0000337200002D740000297600002478000023780000237800
+001F7F00001B870000168E0000119600000D9E000008A7000002B1000400BE
+020200D0060000E4120000F11F0000FE2C0000FF3E0000FF5B0000FF6C0000
+FF7D0000FF930000FFA30000FFB20000FFB20000FFB20000FFB20000FFB200
+00FFB20000FFB20036700000307300002A7600002578000023780000237800
+0023780000237800001F7F00001B870000168E0000129600000D9E000008A6
+000002B0000300BD020200CF060000E3110000F01E0000FD2B0000FF3B0000
+FF590000FF6B0000FF790000FF8D0000FF9E0000FFAF0000FFB20000FFB200
+00FFB20000FFB20000FFB20000FFB200>
+<8409000084090000850A0000860A0000860B0000860B0000870C0000870C00
+00870B0000850600038200040B84000C0A850016098600200889002D078E00
+3E05900052049000670391007C02920090019000A4019000BC009000E2008F
+00FF008F00FF008F00FF008F00FF008F00FF008F00FF008F00FF008F00FF00
+8F00FF008F00FF00850A0000850A0000860B0000860B0000870C0000870C00
+00880C0000880D0000880B0000860700028300030C84000C0B8500150A8700
+200989002C088E003D06900051059100660592007B0393008F029100A40190
+00BB009000E0008F00FF008F00FF008F00FF008F00FF008F00FF008F00FF00
+8F00FF008F00FF008F00FF008F00FF00850A0000860B0000870B0000870C00
+00880C0000880D0000880D0000890E0000890C0000870800028401020C8500
+0B0C8600140B87001F0B8A002B0A8F003C08910050069200650693007A0493
+008F039200A3029100BB019100DF009000FF009000FF009000FF009000FF00
+9000FF009000FF009000FF009000FF009000FF009000FF00860B0000870C00
+00870C0000880D0000880D0000890E0000890E00008A0E00008A0D00008809
+00028502010D8500090D8700130C88001E0C8B002A0B8F003B0992004F0893
+0064079400790694008E049300A3039200BB019200DD009000FF009100FF00
+9100FF009100FF009100FF009100FF009100FF009100FF009100FF009100FF
+00870C0000880D0000880D0000890E0000890E00008A0F00008A0F00008A0F
+00008B0E00008A0B00018602010D8600080F8800120E89001D0D8C00290C90
+003A0A93004E09930063099500780896008D069500A3049300BA029200DC00
+9100FF009100FF009100FF009100FF009100FF009100FF009100FF009100FF
+009100FF009100FF00880D0000890E0000890E00008A0F00008A0F00008A10
+00008B1000008B1000008C0F00008B0C00008703000D870007108900110F8A
+001C0E8D00280D9100380C94004D0B9400620A9600760997008C089600A205
+9400BA039300DB019200FF009200FF009200FF009200FF009200FF009200FF
+009200FF009200FF009200FF009200FF00890E00008A0F00008A0F00008A10
+00008B1000008B1100008B1100008C1100008C1000008D0E00008905000C87
+000612890010118B001B108D00270F9200370E95004B0D9600600C9600750B
+98008B0A9700A2079600BB049400DB029300FF009300FF009301FF009301FF
+009301FF009301FF009301FF009301FF009301FF009301FF008A0F00008B10
+00008B1000008B1100008C1100008C1200008C1200008C1300008D1200008E
+0F00008C08000A870004148A000E138C0019128E002611930035109600490F
+97005E0E9800730D9900890C9900A1099700BB069600DB039401FF009401FF
+009401FF009401FF009401FF009401FF009401FF009401FF009401FF009401
+FF008B1000008B1100008C1200008C1200008C1300008D1300008D1400008D
+1400008E1300008F1100008E0A0009880102158B000C158D0018148F002412
+940033119700471198005C10990071109A00870E9B00A00C9900BC089700DC
+059501FF009501FF009501FF009501FF009501FF009501FF009501FF009501
+FF009501FF009501FF008C1200008C1200008D1300008D1400008D1400008D
+1400008E1500008E1500008F15000090120000900D00078B0301158B000A17
+8E0016169000221495003113990045139A005A139A006F129B0085119C009F
+0E9B00BB0B9900DD079603FF009503FF009404FF009204FF009105FF009106
+FF009006FF009006FF009006FF009006FF008D1300008D1400008D1400008E
+1500008E1600008E1600008F1600008F170000901600009214000092100005
+8D0500148C0008198F0014189100201796002F169A0042169B0058159B006C
+149C008213990099149300B5138B00D5108B0DFF028A10FF008810FF008811
+FF018711FF018611FF018612FF018612FF018612FF018612FF018E1500008E
+1500008E1600008F1700008F1700008F1800008F1800009018000091180000
+9316000094130003910900138D01051C8F00111B92001E1997002C189B003F
+189600531B8D00641D8500751E81008A1F7F00A41F7400C01C6C00F4177A14
+FF0A7814FF0B7714FF0B7614FF0C7514FF0C7514FF0C7514FF0C7514FF0C75
+14FF0C8F1700008F1700008F1800008F1800009019000090190000901A0000
+901A0000921A00009418000095150002940C00108D01011E90000E1E93001B
+1C8D00261E850034237D004526730056256C00672667007C27610094285B00
+B3275600E8255300FA255200F9265101F9265001F9274F01FA274F01FA274F
+01FA274F01FA274F01FA27901800009019000090190000901A0000911A0000
+911B0000911B0000911C0000931C0000951A0000971800019711000E910400
+1E860007257C00112A72001C2E680027316000333459004336520059374E00
+6F384B0088364600A7324200EA32460AFF2A460BFF2A450CFF2A450DFF2945
+0DFF29450EFF29450EFF29450EFF29450EFF29901A0000911B0000911B0000
+911C0000921C0000921D0000921D0000921E0000931E0000961D0000981B00
+009716000B8810001B7208002C5E0105395200103F49001B43410028463A00
+384934004C4B2F00624A2D0079472A0095442800D5412E0BFC362A08FB3A27
+06FA3D2404F93F2203F9412203F9412203F9412203F9412203F941911C0000
+921D0000921D0000921E0000921E0000931F0000931F000093200000942000
+00971F0000912000008920000B7B1C0019661600294B0C003C330102502800
+0E5520001C5718002A5912003B590F004F570E0065560F007F550A00C35307
+00F24E0500F24F0400F24F0300F2500200F2500200F2500200F2500200F250
+0200F250921E0000931F000093200000932000009321000093210000932200
+0093220000942300008C260000852A00027C29000D6E26001959220028401B
+003A2712004F0B04005F0105106200092161000B325C000D47590010635800
+1384540015B24D0015DC480016DB470017DB470018DA460018DA460018DA46
+0018DA460018DA460018DA4693210000932100009322000094230000942300
+00942400009424000090260000882B0000823100007A3300056F310011602F
+001C4C2C002736270035202000480515015600171057001B2153001E325100
+2149510026674E00298545002AAF3F0029E03C002AE03B002AE03A002BE13A
+002BE13A002BE13A002BE13A002BE13A002BE13A9423000094240000942500
+009425000095260000952700008F2A0000852F00007E350000773B00006D3A
+000A623900145438001C413700232C33002C192C00400223034D0028134A00
+2E23470035364800394D47003B6742003D8339003CAB33003CE72F003DE72E
+003DE72E003EE72D003EE72D003EE72D003EE72D003EE72D003EE72D952600
+00952700009628000096290000962A00008E2E0000843500007B390000733D
+00006B3F0004623F000C574100134A4200183942001E263F00271338003901
+330544003B153F0044263E004C3A3B004D5039004E6736004F8232004FA92C
+0050E9250050EB250051EC250051EC250052ED250052ED250052ED250052ED
+250052ED25972A0000972B0000972C0000982D00008D330000823A0000783D
+0000703F00006842000060440004584700084F4A000D434C0013334C001A21
+4A00240C4500340046083A0051193600592931005D3B2E0060512A0061672A
+006282290064A8240063FF210064FF200064FF200065FF200065FF1F0065FF
+1F0065FF1F0065FF1F0065FF1F982F000099300000993100008D380000813E
+0000754100006C420000654300005E460000574A0001504F0002485300073C
+55000F2D5600171A5600210653002E005A0C2E00641B2900692927006D3B24
+00725221007569200075831F0076A81C0074F3190074FE180075FE180075FE
+180075FE180075FE180075FE180075FE180075FE189B3400009C3500008D3D
+00007E4200007244000069450000614600005B480000554A00004F50000048
+560000405B0004355F000C266100141462001D01620128006C0D2300741A1F
+0079281E007D3B1B0082521900876B18008785180088AC160084EB120084FF
+110084FF100084FF100085FF100085FF100085FF100085FF100085FF109E3A
+00008B4100007C4600006F470000664800005E490000584B0000534D00004E
+50000047570000405E0000396400022D6800091F6C00110E6E001A0073021F
+007E0D1B00861917008B2715008E391200924F100095681000998510009CAC
+100096E00C0093FF0A0094FF0A0094FF0A0094FF0A0094FF0A0094FF0A0094
+FF0A0094FF0A8A450000794800006C490000634B00005B4C0000554E000050
+5000004B530000465700003F5E000039660000316D0001267300071877000D
+097C001500840317008F0C130098170F009E240C00A0350900A24A0700A663
+0700AC830600B0A20500A9CF0500A5FA0500A5FA0400A5F90400A5F90400A5
+F90400A5F90400A5F90400A5F904764B0000694C0000604E00005850000052
+5200004D55000048580000445B00003F5F000038670000306F000029770000
+1F7F000313850009078C000F0095030F00A20B0B00AD150700B4210400B631
+0200B7450000C0600000C67F0000CA990000C8C60000BDF10000BDF10000BE
+F10000BEF10000BEF10000BEF10000BEF10000BEF100674F00005D51000056
+530000505600004A5A0000455D0000416100003D6400003869000030710000
+297A0000218300001A8C000011950002069C000700A8020800B8080300C811
+0100D51F0000E42D0000FC3F0000F55B0000F7710000F78A0000FBAA0000F2
+DC0000F3D90000F4D70000F4D60000F4D50000F4D50000F4D50000F4D5005B
+540000535800004D5C000048600000436400003E680000396B0000356E0000
+30730000297D0000218700001A900000129900000BA2000005AB000200B701
+0300C7040100DD0D0000EC1A0000FA280000FF360000FF570000FF6C0000FF
+7F0000FF9C0000FFB20000FFB20000FFB20000FFB20000FFB20000FFB20000
+FFB20000FFB200515D00004B62000045670000406A00003B6E000036700000
+327200002D74000029780000218100001A8A0000149200000F9A00000AA200
+0005AB000200B7010300C6040100DD0C0000EB190000FA270000FF340000FF
+550000FF6B0000FF7C0000FF990000FFAE0000FFB20000FFB20000FFB20000
+FFB20000FFB20000FFB20000FFB20049640000436800003D6C0000386F0000
+337200002E7400002976000026780000227B00001D820000198A0000149200
+000F9900000BA2000005AB000200B6000300C5030100DB0B0000EB180000F9
+260000FF330000FF530000FF690000FF790000FF920000FFA80000FFB20000
+FFB20000FFB20000FFB20000FFB20000FFB20000FFB200416A00003B6E0000
+357100002F7400002A760000267800002378000023780000227B00001E8200
+001989000014910000109900000BA1000005AA000201B6000300C5030100DA
+0B0000EA180000F8260000FF320000FF510000FF670000FF760000FF8C0000
+FFA10000FFB20000FFB20000FFB20000FFB20000FFB20000FFB20000FFB200
+386F0000327200002C75000026770000237800002378000023780000237800
+00227A00001E8200001989000015910000109900000BA1000005AA000201B5
+000300C4030100D90A0000E9170000F7250000FF310000FF4E0000FF650000
+FF730000FF870000FF9E0000FFB20000FFB20000FFB20000FFB20000FFB200
+00FFB20000FFB2002F74000029770000237800002378000023780000237800
+002378000023780000227A00001E8200001989000015910000109900000BA1
+000006AA000101B5000300C3030100D80A0000E9160000F6240000FF300000
+FF4C0000FF620000FF700000FF830000FF9B0000FFAA0000FFB20000FFB200
+00FFB20000FFB20000FFB20000FFB200>
+<7A0400007B0400007B0400007C0500007D0500007E0600007F0600007F0600
+00800700007D0400007C0005047E000C037F00150380001E02810029028600
+390089004C008A0061008B0075008C0088008B009B008A00B0008A00D0008A
+00FF008900FF008900FF008900FF008900FF008900FF008900FF008900FF00
+8900FF008900FF007B0400007C0500007D0500007E0600007E0600007F0600
+008007000081070000810700007E0400007D0004057F000C04800014038100
+1D0382002902870038008A004B008B0060008C0074008D0088008C009A008B
+00B0008B00CF008B00FF008A00FF008A00FF008A00FF008A00FF008A00FF00
+8A00FF008A00FF008A00FF008A00FF007C0500007D0500007E0600007F0600
+008007000081070000810800008208000083080000800500007D0003068000
+0B058100130481001D0483002803880037018B004A018B005F018D0073008E
+0087008D009A008C00AF008C00CE008C00FF008B00FF008B00FF008B00FF00
+8B00FF008B00FF008B00FF008B00FF008B00FF008B00FF007E0600007F0600
+00800700008107000081080000820800008308000084090000840900008106
+00007E00020781000A068200120682001C0584002704880036028C0049018C
+005E018E0072018E0087008E0099008D00AF008D00CE008D00FF008C00FF00
+8C00FF008C00FF008C00FF008C00FF008C00FF008C00FF008C00FF008C00FF
+0080070000810700008208000082080000830900008409000084090000850A
+0000850A0000830700007F000108810009088200120783001B068500260689
+0035048D0048028E005D028F0071018F0086008F0099008E00AE008E00CD00
+8E00FF008D00FF008D00FF008D00FF008D00FF008D00FF008D00FF008D00FF
+008D00FF008D00FF0081080000820800008309000084090000850A0000850A
+0000860A0000860B0000860B00008508000081010009820008098300110884
+001A08860025078A0034058E0046038F005C03900070029100850090009800
+8F00AE008F00CC008F00FF008E00FF008E00FF008E00FF008E00FF008E00FF
+008E00FF008E00FF008E00FF008E00FF008309000084090000850A0000850A
+0000860B0000860B0000870C0000870C0000880C0000870A00008303000883
+00060B84000F0A85001909870024088B0032078F00450590005A0491006F03
+92008402910098019000AD019000CA009000FF008F00FF008F00FF008F00FF
+008F00FF008F00FF008F00FF008F00FF008F00FF008F00FF00850A0000860A
+0000860B0000870C0000870C0000880C0000880D0000890D0000890E000089
+0B0000860500078400050D85000E0C8600180B8800230A8C00310990004307
+9100590692006D0593008204930097039200AD029100C9009100FE009000FF
+009000FF009000FF009000FF009000FF009000FF009000FF009000FF009000
+FF00860B0000870C0000880C0000880D0000890D0000890E0000890E00008A
+0F00008A0F00008A0D0000880700058500030E86000C0E8800170D8900220C
+8D002F0B910042099300570893006C0895008106950096049300AC039200C8
+009200FA009100FF009100FF009100FF009100FF009100FF009100FF009100
+FF009100FF009100FF00880D0000880D0000890E0000890E00008A0F00008A
+0F00008A1000008B1000008B1000008C0E00008A0A00048602020F87000A10
+8900150F8B00200E8E002E0D9200400B9400550A95006A0A96007F09970095
+079500AC049400C7019100F4008D00FF008B01FF008A02FF008902FF008903
+FF008803FF008803FF008803FF008803FF00890E00008A0F00008A0F00008B
+1000008B1000008B1100008C1100008C1200008C1200008D1000008D0C0003
+89030110880008128A0013118C001E108F002C0F94003D0E9600530D960067
+0D93007A0E8E008E108A00A50F8300BF0D7E00E70A810AFF01800BFF017F0B
+FF027D0BFF037D0BFF037C0BFF037C0BFF037C0BFF037C0BFF038A1000008B
+1000008B1100008C1100008C1200008C1200008D1300008D1300008D140000
+8E1200008F0F00018B06000F890006158B0011148D001D139100291193003A
+128C004C1684005E177D006E197900811A7600981A6F00B2186800DB146B06
+FF0F6704FE116402FE126201FD136100FD146000FD146000FD146000FD1460
+00FD148C1200008C1200008D1300008D1300008D1400008D1400008E150000
+8E1500008E16000090140000901100008F0A000C890003188C000E178C001A
+168400231A7C002F1D74003F206C004F2065006120610075225D008B235700
+A7225300D0215000F5204E00F5214D00F5224C00F5224B00F5234B00F6234B
+00F6234B00F6234B00F6238D1300008D1400008E1500008E1500008E160000
+8E1600008F1700008F1700008F1800009116000092140000920E000A8B0301
+187E000720740010246A001A286000232B59002D2D52003D2F4D0052314900
+68314700803144009E2E3F00C82D3F04FE2A3E05FE2A3D05FE2A3D06FE2A3C
+06FE2A3C07FE2A3C07FE2A3C07FE2A3C07FE2A8E1500008E1600008F170000
+8F1700008F180000901800009019000090190000901A000092190000941700
+008E1400087F0E001769060027580105324D000F384300193C3B00253F3600
+34412F0047432B005C432900714127008B3F2400B33C2807F6342505F33722
+03F1392002EF3B1E01EE3C1D00ED3D1D00ED3D1D00ED3D1D00ED3D8F180000
+8F1800009019000090190000901A0000911A0000911B0000911B0000911C00
+00931B00008A1D0000801D0009731900165E130025470B0036300102472500
+0D4D1D001A5016002852100038530C004A510B005F4F0B00774E0800AA5106
+00E7470400E6480300E6480200E5480201E4480202E3480202E3480202E348
+0202E348901A0000911A0000911B0000911C0000911C0000921D0000921D00
+00921E00008D1F0000852200007E2600017425000C66230018521F00243C18
+0035251000490A04005801050F5B0009205A000B3055000D435200105D5000
+137B4D0015A0460014D8410015D8400016D83F0017D83F0018D83E0018D93E
+0018D93E0018D93E0018D93E911C0000921D0000921D0000921E0000921F00
+00931F0000932000008B230000822700007B2C0000732E0005682D0010592B
+001A46280023322400301D1D00420413014F0016104F001A214C001D314A00
+2045490024604700277B3E00299F390028E1360028E1350029E1340029E234
+002AE233002AE233002AE233002AE233002AE233931F000093200000932000
+00932100009322000093220000882600007F2C000078300000703500006735
+00095C3400144D34001A3C32001F292F002817290039012103460026134200
+2B233F00313440003649400037603B00397A3300399C2E0039DE29003AE729
+003BE628003BE628003BE627003CE527003CE527003CE527003CE527932200
+0094230000942300009424000094250000872B00007D310000753500006D38
+0000653A00035C3B000C513C0011453D0015353D001A233A00231034003300
+30063D00381638004026360047383300494B30004A612F004B7A2C004B9B28
+004CD020004DE31F004DE41F004EE51F004EE61F004EE61E004EE61E004EE6
+1E004EE61E94250000942600009527000093280000862F00007C360000723A
+00006A3C0000633D00005B400003534200064A4600093F47000F2F4700161D
+4500200A3F002F00430933004C192F0053282B00583828005C4D23005D6223
+005E7A24005E9922005FD71B0260FF190260FF190261FF190161FF190161FF
+190161FF190161FF190161FF1996290000962A0000932D0000853500007A3B
+00006F3E0000663F00005F41000059420000534600004C4B0000444F000338
+51000B285100131750001E044D012B00550D29005E1A240063282300673820
+006C4D1B0070641B00707C1A007099180070D1140070FC130070FC130070FC
+130071FC130071FC130071FC130071FC130071FC13982E000093320000853B
+0000773F00006C410000634200005C44000056450000514700004B4C000044
+5100003C57000030590009215B0011105B001B005C032400660E1E006E1A1B
+0073271A00763817007C4D140081661300827D1200829C110081CE0E0080FF
+0C0080FF0B0080FF0B0081FF0B0081FF0B0081FF0B0081FF0B0081FF0B9537
+0000833F000074420000694400006046000059470000534900004E4B00004A
+4E0000435200003C590000345F0000286200071A65000F0A670018006C051B
+00770F16007F1A13008427100087360D008A4A0B008E620A00917B0900969C
+0A0092C908008FFF05008FFF040090FF040090FF040090FF040090FF040090
+FF040090FF048243000072460000664700005D490000564B0000504D00004B
+50000046520000425500003B5A0000336100002C670000216C00061370000D
+04740014007D061300880F0E0090190A009625070098340400994601009C5E
+0100A17A0100A7980000A3BE01009EFC01009EFC01009EFC01009EFC00009E
+FC00009EFC00009EFC00009EFC0070490000634A00005A4C0000534F00004D
+51000048550000435700003E5A00003A5D0000336300002B6A000024710000
+197700040D7C000A0183000F008D070B00980E0600A2170200A8230000AA31
+0000AB430000B15B0000B7780000BC930000BAB60000AEF50000AEF70000AE
+F70000AEF70000AEF70000AEF70000AEF70000AEF700614D00005850000051
+5300004A560000455A0000405D00003B60000036630000326600002B6C0000
+247400001C7C000013830002088B000700920109009B050500A80A0200B411
+0000BF1B0000C6290000CA3A0000D2520000D86C0000DC870000E0A40000DA
+F30000D1F60000D1F70000D2F70000D2F70000D2F70000D2F70000D2F70055
+5400004E580000485C0000426000003D64000038680000336B00002E6E0000
+2B700000247700001D80000017880000129100000D99000007A1000101AC00
+0500BB030200CE070000E3120000F2200000FF2E0000FF480000FF630000FF
+740000FF8F0000FFAA0000FFB20000FFB20000FFB20000FFB20000FFB20000
+FFB20000FFB2004C5D000046620000406700003A6C0000357000002F730000
+2B7600002777000023780000207D00001C850000178D0000129500000D9C00
+0009A5000003AF000300BC010300CE050000E3110000F11F0000FF2D0000FF
+440000FF600000FF710000FF8A0000FFA40000FFB20000FFB20000FFB20000
+FFB20000FFB20000FFB20000FFB200446800003D6C00003770000031730000
+2C75000027770000237800002378000023780000207D00001C850000178C00
+00139400000E9C000009A5000003AF000300BB010300CD050000E2100000F0
+1E0000FE2C0000FF410000FF5E0000FF6F0000FF850000FF9F0000FFB20000
+FFB20000FFB20000FFB20000FFB20000FFB20000FFB2003B6E000034710000
+2E740000287700002378000023780000237800002378000023780000207D00
+001C850000178C0000139400000E9C000009A5000003AE000300BB010300CC
+050000E1100000EF1D0000FD2B0000FF3D0000FF5C0000FF6E0000FF820000
+FF9C0000FFB20000FFB20000FFB20000FFB20000FFB20000FFB20000FFB200
+317300002A7600002578000023780000237800002378000023780000237800
+0023780000207D00001C850000188C0000139400000E9C000009A4000003AE
+000300BA010300CB050100E00F0000EE1C0000FC2A0000FF3A0000FF590000
+FF6C0000FF7E0000FF9A0000FFAC0000FFB20000FFB20000FFB20000FFB200
+00FFB20000FFB2002777000023780000237800002378000023780000237800
+00237800002378000023780000207D00001C840000188C0000139400000E9B
+000009A4000003AD000300BA010300CA050100E00E0000ED1B0000FB290000
+FF360000FF560000FF6B0000FF7A0000FF920000FFA40000FFB20000FFB200
+00FFB20000FFB20000FFB20000FFB200>
+<72000000720000007300000073000000740100007501000075010000760100
+0076020000760100007600050177000C007800140079001C007A0026007D00
+3400820045008200590083006C0085007F00850091008400A4008400BD0084
+00F1008300FF008300FF008300FF008300FF008300FF008300FF008300FF00
+8300FF008300FF007300000073000000740000007501000075010000760200
+00760200007702000078020000770200007700040178000B00790013007A00
+1B007B0026007E003300830045008300580084006C0086007F008600910085
+00A4008500BD008500F0008400FF008400FF008400FF008400FF008400FF00
+8400FF008400FF008400FF008400FF00740000007401000075010000760200
+00770200007702000078030000780300007903000078020000780004017A00
+0B007A0012007B001B007C0025007F003200840044008500580086006B0087
+007F00870091008600A4008600BD008600ED008500FF008500FF008500FF00
+8500FF008500FF008500FF008500FF008500FF008500FF0075010000760200
+0077020000770200007803000079030000790300007A0400007A0400007A03
+0000790003027B000A017C0012007C001A017D002401800031008500430086
+00570087006A0088007E00880091008700A4008700BD008700ED008600FF00
+8600FF008600FF008600FF008600FF008600FF008600FF008600FF008600FF
+00770200007702000078030000790300007A0300007A0400007B0400007B04
+00007C0500007B040000790002037C0009027D0011017D0019017E00230181
+003000860041008700560088006A0089007E00890090008800A4008800BC00
+8900EB008700FF008700FF008700FF008700FF008700FF008700FF008700FF
+008700FF008700FF0078030000790300007A0400007B0400007B0400007C05
+00007D0500007D0500007E0600007E0500007A0001047C0008037E0010027E
+0018027F00220282002F018700400088005500890069008B007D008B009000
+8A00A3008900BC008A00EB008900FF008900FF008900FF008900FF008900FF
+008900FF008900FF008900FF008900FF007A0400007B0400007C0500007D05
+00007D0500007E0600007F0600008007000080070000800600007C0201047D
+0007047F000F04800018038100210383002E0188003F008A0053008B006800
+8C007C008C008F008B00A3008A00BC008B00E9008A00FF008A00FF008A00FF
+008A00FF008A00FF008A00FF008A00FF008A00FF008A00FF007C0500007D05
+00007E0600007F060000800700008007000081080000820800008308000082
+0800007F0300037E00060680000E05810017048200200484002D038A003D01
+8C0052018C0067018D007B008E008F008D00A2008C00BB008D00E6008B00FF
+008B00FF008B00FF008B00FF008B00FF008B00FF008B00FF008B00FF008B00
+FF007E0600007F070000800700008108000082080000830800008409000084
+090000850A000084090000810500017F00040881000C078200150683001F06
+86002B058B003C038D0050028E0065028F007A008F008E008E00A1008D00BA
+008E00E3008C00FF008C00FF008D00FF008D00FF008D00FF008D00FF008D00
+FF008D00FF008D00FF00810700008208000083080000840900008409000085
+0A0000850A0000860B0000860B0000870B0000840700018101020A83000B09
+8400140885001E0887002A078C003A048F004E038F0063039000780191008D
+009000A1008B00B6008800DC008500FF008300FF008100FF008000FF008000
+FF007F00FF007F00FF007F00FF007F00FF008409000084090000850A000086
+0B0000860B0000870C0000870C0000880C0000880D0000880C000087090001
+8301010B8400090B8500120A86001D0A890028098D00380790004C058F0060
+06890072098500840B8000970B7B00AE097700CC077906FF007705FF027505
+FF027405FF037405FF037305FF047305FF047305FF047305FF04860B000086
+0B0000870C0000880C0000880D0000890D0000890E0000890E00008A0F0000
+8A0E00008A0B00008603000B8500060E8700100D88001B0C8A00260B880034
+0D820044107B0056127500671471007A156D008E156800A6146400C8106200
+FE0E6000FD0E5F00FD0F5E00FC0F5D00FC105C00FC105C00FB105C00FB105C
+00FB10880C0000880D0000890E0000890E00008A0F00008A0F00008A100000
+8B1000008B1000008C1000008C0D0000890700088600041188000E10830017
+127A00201572002B186B00371A6400471B5E005A1C5A006E1D5700831E5300
+9D1E4F00BF1D4D00F21B4B00F11C4A00F11D4800F11E4800F11E4700F11E47
+00F11F4700F11F4700F11F8A0E00008A0F00008A1000008B1000008B110000
+8B1100008C1200008C1200008C1300008D1200008E1000008D0B0006830201
+147600071B6D000F1F620018225900212551002A274B00372947004B2B4400
+612C4100782B4000932A3C00B6293A01FA273902FA273802FB283702FC2837
+02FC283603FD293603FD293603FD293603FD298B1000008B1100008C120000
+8C1200008D1300008D1300008D1400008D1400008E1500008E150000901200
+0085120005760D0013610400235200052C47000E303E001835360023383000
+313B2B00423C2700563C25006A3B230082392100A2372100E8341F00E9351D
+00E7351C00E6361B00E5361A00E4361A00E4371A00E4371A00E4378D130000
+8D1300008D1400008E1500008E1500008E1600008E1600008F1700008F1700
+008B180000821A0000791A00066B17001357110021420900302E01023F2300
+0C461B0019481400264B0E00354C0A00454B08005949080070480600954C05
+00CF420300D8410201D7400201D6400202D6400203D63F0203D63F0203D63F
+0203D63F8E1500008E1600008F1700008F1700008F1800008F180000901900
+0090190000871C00007E200000772300006D22000A5F2000154C1C00213816
+002F220E00410903005001040E5300081F52000B2E4E000D404A0010584700
+1372440015923F0014C73A0015D7390016D7380016D7380017D7370017D837
+0018D8370018D8370018D8378F1800009018000090190000901A0000901A00
+00911B0000911B0000851F00007C240000742800006C2A00036129000F5227
+00184125001F2E21002B1B1B003A041201480015104700192144001C304200
+1E42410021594000247237002791330028C8310027E02F0027E12E0028E12E
+0028E22E0028E22D0029E32D0029E32D0029E32D911A0000911B0000911C00
+00921C0000921D00008F1E00008223000079280000712D00006A3000006130
+0009552F0012482F0016382E001B272B002415250033011F033F0024133B00
+292338002E32370032443700335A330035712D003690290038C1250037E623
+0038E4230038E3220039E3220039E2210039E2210039E2210039E221921D00
+00921E0000921F0000931F00008C22000080280000772D00006E3100006734
+0000603600015736000A4C38000E40390011313900162136001F0E2F002E00
+2D063600351632003C252F0042352C0044472900465C280047722700489025
+0049BA1C0049E21A004AE319004AE419004BE419004BE419004BE519004BE5
+19004BE5199321000093210000932200008B2500007F2D0000753200006B36
+0000643800005D3A0000573C00014F3F0002474200043B43000B2B4300121A
+40001D083B002B003F0A2D00481929004D2626005236230057491E00595E1D
+005A731F005A8F1E005BBC17005BF815005BF815005CF815005CF814005CF9
+14005DF914005DF914005DF91494240000942500008A2A00007E3200007237
+0000693A0000603C0000593E0000543F00004F41000048460000404B000034
+4C0007254C0010144A001B0248022700510E2300581A1F005D261E0061351B
+00664917006B5F15006C7515006C8F14006CB910006BF80E006CF70E006CF7
+0D006CF60D006DF60D006DF60D006DF60D006DF60D962800008A2F00007D37
+0000703C0000663E00005D40000056410000514300004C450000474800003F
+4D0000375200002C5400061D55000F0C5400190057041F00610F1A00681A17
+006C2616007035130075480F007A600D007C760C007D8F0B007DB709007CFD
+06007DFD06007DFE05007DFE05007DFE05007DFE05007DFE05007DFE058A34
+00007C3D00006E3F0000634100005A430000534500004E470000494A000044
+4C00003F4F0000375400002F590000245C0005165E000D0660001600670716
+0071101100791B0D007E270A008134080084460500865C04008A7403008F90
+02008EB602008BFE01008BFF01008CFF00008CFF00008CFF00008CFF00008C
+FF00008CFF00794100006B4300006045000058470000514900004B4C000046
+4F0000405100003C540000375600002E5C0000276100001C6500050E69000C
+016D01120076080E0081110900891B04008E26010090320000924300009358
+0000977100009D8E00009CB1000096ED000096FF000096FF000096FF000096
+FF000096FF000096FF000096FF00694600005D480000554B00004E4E000048
+510000425400003D57000038590000335B00002E5E0000276400001F6A0000
+147000040774000A007B030B00850808008E0F0500961602009B2000009E2C
+00009F3C0000A2520000A66C0000AD8A0000AEAB0000A5DC0000A3FB0000A3
+FA0000A3FA0000A3FA0000A3FA0000A3FA0000A3FA005B4C0000524F00004B
+520000455600003F5A0000395D0000346000002F6200002B65000027670000
+1F6E000018750000117A0003098000070186000B0090050800990A0400A410
+0200AC190000B3250000B5340000B8490000C0630000C5820000C89D0000C3
+D30000B9F40000BAF40000BAF40000BAF40000BAF40000BAF40000BAF40050
+53000049570000425C00003C60000036640000316700002C6A0000276D0000
+246F0000227000001D770000197F0000148600000F8E000107940005019C01
+0700A8040400B7080100C7100000D41C0000E32A0000FB3A0000F9570000F9
+6F0000FA890000FEAC0000F8CD0000F9CB0000FAC90000FAC80000FBC70000
+FBC70000FBC700475D00004063000039680000336C00002D6F000028730000
+247500002377000023780000237900001F8000001A88000016900000119800
+000CA0000006A9000101B4000400C2030100D80A0000E9170000F8250000FF
+330000FF540000FF6B0000FF7F0000FF9D0000FFB20000FFB20000FFB20000
+FFB20000FFB20000FFB20000FFB2003D6B000037700000307300002A760000
+2578000023780000237800002378000023780000237900001F8000001A8800
+00168F0000119700000C9F000007A8000101B3000400C1020200D7090000E9
+160000F7240000FF320000FF510000FF690000FF7B0000FF9A0000FFB20000
+FFB20000FFB20000FFB20000FFB20000FFB20000FFB200347100002D750000
+27770000237800002378000023780000237800002378000023780000237800
+001F8000001A870000168F0000119700000C9F000007A8000101B3000400C1
+020200D5090000E8150000F6230000FF310000FF4F0000FF670000FF770000
+FF920000FFAB0000FFB20000FFB20000FFB20000FFB20000FFB20000FFB200
+2A760000237800002378000023780000237800002378000023780000237800
+0023780000237800001F8000001A870000168F0000119700000C9F000007A8
+000101B2000400C0020200D4080000E7140000F5220000FF300000FF4C0000
+FF640000FF740000FF8C0000FFA30000FFB20000FFB20000FFB20000FFB200
+00FFB20000FFB2002378000023780000237800002378000023780000237800
+00237800002378000023780000237800001F7F00001B870000168F00001197
+00000C9F000007A7000101B2000400BF020200D3080000E6130000F3210000
+FF2F0000FF470000FF610000FF700000FF860000FF9E0000FFB20000FFB200
+00FFB20000FFB20000FFB20000FFB200>
+<6B0003006B0002006C0002006C0002006D0002006D0001006E0001006E0001
+006E0001006F0001007000050070000B007100130072001A00730024007400
+300078003E007A0051007C0063007D0075007E0087007D0099007C00AD007C
+00CD007C00FB007C00FB007C00FC007C00FC007C00FC007C00FC007C00FC00
+7C00FC007C00FC006C0002006C0002006D0002006D0001006E0001006E0001
+006F0001006F00010070000100700001007100040071000B00720012007300
+1A007400230075002F0079003E007C0050007D0062007E0075007F0088007E
+0099007E00AD007D00CD007E00FD007E00FD007E00FE007E00FE007E00FE00
+7E00FE007E00FE007E00FE007E00FE006D0002006D0001006E0001006E0001
+006F0001006F00010070000100700001007100010071000000720004007200
+0A0073001100740019007500220077002E007B003D007D0050007E00620080
+00750081008800800099007F00AD007F00CD007F00FF007F00FF007F00FF00
+7F00FF007F00FF007F00FF007F00FF007F00FF007F00FF006E0001006E0001
+006F0001007000010070000100710001007100000072000000720000007200
+0000730003007400090074001100750019007600220078002D007C003C007E
+004F007F0062008100740082008800810099008000AD008000CE008000FF00
+8000FF008000FF008000FF008000FF008000FF008000FF008000FF008000FF
+006F0001007000010070000100710001007100000072000000730000007300
+00007300000074000000740002007500090076001000770018007800210079
+002C007D003B0080004E00810061008200740083008800820099008100AD00
+8100CE008100FF008100FF008100FF008100FF008100FF008100FF008100FF
+008100FF008100FF0070000100710000007200000072000000730000007400
+000074010000750100007501000076010000750001017600080077000F0078
+001700790020007A002B007F003A0081004D00820061008300740085008700
+840099008300AD008300CE008300FF008300FF008300FF008300FF008300FF
+008300FF008300FF008300FF008300FF007200000073000000730000007401
+00007501000075010000760200007702000077020000780200007601010177
+00070179000E007A0016007A001F007C002A008000390083004C0084006000
+8500730086008700850099008400AD008500CE008400FF008400FF008400FF
+008400FF008400FF008400FF008400FF008400FF008400FF00740000007401
+0000750100007602000077020000770200007803000079030000790300007A
+04000078010101790006017A000D007B0015007C001E007D00290082003800
+85004B0085005F008700720088008600870098008600AD008600CE008600FF
+008600FF008600FF008600FF008600FF008600FF008600FF008600FF008600
+FF0076020000770200007702000078030000790300007A0300007A0400007B
+0400007B0400007C0500007A0300007A0004027C000C017D0014017D001D01
+7F002801830036008700490087005E008800720089008600890098008800AD
+008800CD008700FF008700FF008600FF008500FF008400FF008400FF008300
+FF008300FF008300FF0078030000790300007A0400007B0400007B0400007C
+0500007D0500007E0600007E0600007F0600007D0400007B0003047D000A03
+7E0013037F001C0280002602840035008900470089005C008A0071008B0085
+00860095008200A8007F00C4007C00FE007A00FF007800FF007800FF007700
+FF007600FF007600FF007600FF007600FF007B0400007B0400007C0500007D
+0500007E0600007F0600008007000081070000810800008208000080060000
+7D0001067F0009058000110481001A0482002503860033018B004501850058
+02800069057C007B0677008D077300A1066F00B9046F01EB026F02FF016E02
+FF026D02FF026C02FF026C02FF026B02FF036B02FF036B02FF037E0600007F
+06000080070000810700008108000082080000830800008409000084090000
+850A0000840800007F020006800007088200100783001906830023067D002E
+0877003D0B72004E0E6C005F0F680072116500861161009B105E00B80D5E00
+EE0A5E02FC095C02FB0A5A01FA0B5900F90C5800F80D5700F80D5700F70D57
+00F70D8107000082080000830800008409000084090000850A0000850A0000
+860B0000860B0000870C0000860A0000830500048200050A83000D0A7A0015
+0D71001E1069002713620032165C003F18570052185400671A51007C1A4F00
+931A4C00B1194A00E0174800ED174600ED184500ED194400EC194400EC1A43
+00EC1A4300EC1A4300EC1A84090000850A0000860A0000860B0000870C0000
+870C0000880C0000880D0000890D0000890E0000890C0000870800027B0201
+0F6F00061665000E1A5A00161D51001F214A00272444003326400045273E00
+5B273C0070273A0089263800A8243600DA243500F4243300F5243200F52532
+00F6253100F6253100F6263000F6263000F626870B0000870C0000880D0000
+890D0000890E0000890E00008A0F00008A0F00008A1000008B100000881000
+007D1000016F0B00105A03001F4C00062542000E2A3800162F310021332B00
+2D3426003D3523005035210064341F0079331D0095321D00C32F1D00E02E1B
+00DE2E1A00DD2F1900DC2F1800DC2F1700DB301700DB301700DB30890E0000
+8A0E00008A0F00008A1000008B1000008B1100008B1100008C1200008C1200
+00841500007B1700007118000363150010510F001D3D07002B2B0103382000
+0B3E19001741120024440C003245070040450500544205016A410301864102
+00B4400200CF380201D0380202D0370203D1370203D1370104D1370104D137
+0104D1378B1000008B1100008C1200008C1200008D1300008D1300008D1400
+008C14000081190000781C0000701F0000661F0007581D00124719001D3413
+0029200D00390803004901040E4B00081E49000B2D45000D3D420010523E00
+136A3B001586370015B2340014D4320015D4310016D4310016D4300017D430
+0017D4300017D4300017D4308D1300008D1400008D1400008E1500008E1600
+008E1600008A1800007E1C0000752100006D240000662700015A26000B4D24
+00143D22001B2B1E002619180033031101410014103F0018203C001B2F3900
+1D3F38001F53360022692F0025862C0028B42C0025E02A0026E1290026E229
+0026E3280027E3280027E4280027E4280027E4288E1600008F1700008F1700
+008F18000090180000871B00007B210000722500006A290000632C00005B2D
+0005502C000E432C0012342A0017242800201323002D011E04380022133400
+272231002B312F002E412D002F542900326A27003386240036AE220034E81F
+0035E71E0035E61E0036E51D0036E51D0036E41D0037E41C0037E41C901900
+00901A0000901A0000911B0000851F00007A250000702A0000672D00006030
+00005A32000152330005483400093D35000D2E3500121E32001B0D2C002900
+2B072F0032162B00382428003C3325003F43230042572100446C2000458620
+0046AA190046E2150047E2150048E3140048E3140048E3140049E4140049E4
+140049E414911C0000921D0000921D000084230000782900006D2E00006532
+00005D34000156360000513800004B3B0000433E000038400006283E000F18
+3B001906360026003C0B270044192300482520004D331D0051451900555917
+00566E180056861A0058AB130057F20F0058F30F0058F30E0059F30E0059F3
+0E0059F20E0059F20E0059F20E932000009320000082270000762F00006B33
+0000623600005A390000533B00004E3C0000493E0000434100003B45000030
+4800032147000D1145001801430222004D0E1E00531A1A00572519005C3316
+0061451200655A100067700F0068880E0068A90B0067E7080068ED070068EB
+070068EA070068E9070068E9060068E9060068E90691240000822C00007534
+0000693800005F3A0000573D0000503F00004B41000046430000414500003B
+480000324C0000284F00031A4F000C094F00160052061A005B101500621A11
+00672510006B330D006F440A00735A0800766F05007887040079A9030078DC
+010079FA010079FB010079FB010079FC01007AFC00007AFC00007AFC008133
+000073390000673C00005C3E0000544100004E43000048450000434800003D
+4A0000384C0000324F000029540000205700031258000B035A011300610811
+006B110C00731B0700792704007B3201007D4100007E550100816C00008586
+000087A7000084E2000084FF000084FF000084FF000084FF000084FF000084
+FF000084FF00703E0000644000005A420000524500004B480000454B00003F
+4D000039500000345200002F53000029570000225B0000185F00030A62000B
+0067030E006F090A00771107007F19040084230200862E0000883C00008950
+00008B6700009182000093A200008FD200008EFF00008EFF00008EFF00008E
+FF00008EFF00008EFF00008EFF0061440000574600004F490000484D000042
+5000003B53000036550000305800002C5A0000275B0000225F00001A640000
+12690003096C00090070010D0078070A00810D070089150400901E01009329
+000094370000964A0000986100009E7D0000A39D00009DC5000099FF000099
+FF00009AFE00009AFE00009AFE00009AFE00009AFE00544B00004D4E000046
+5200003F55000038590000325C00002D5E0000286000002462000020640000
+1E6700001A6C0000147100020C760006037B000B0083040A008C090700950F
+03009E170100A3220000A62F0000A6410000AC590000B1770000B8940000B4
+BD0000AAF70000AAF70000AAF70000AAF70000AAF70000AAF70000AAF7004A
+530000435700003C5C0000355F00002F6300002966000024680000216A0000
+216B0000216C0000206F00001B750000177C00001082000308890006019000
+090098040600A4090300B10F0100BC190000C4260000C8370000CF4F0000D6
+6A0000DB870000DEA80000CFF40000CFF50000CFF50000D0F50000D0F60000
+D0F60000D0F600405E000039620000326700002C6B0000266E000022710000
+22720000227200002273000022740000217800001D7F000018880000149000
+000F9900000AA2000004AC000300B9010300CA050100E00F0000EF1D0000FE
+2C0000FF420000FF600000FF730000FF910000FFB00000FFB20000FFB20000
+FFB20000FFB20000FFB20000FFB200366B0000306F00002974000023770000
+237800002378000023780000237800002378000023780000217B00001D8300
+00198A0000149200000F9A00000AA3000004AC000200B8010300C9040100DF
+0E0000EE1C0000FD2A0000FF3E0000FF5E0000FF700000FF8A0000FFA80000
+FFB20000FFB20000FFB20000FFB20000FFB20000FFB2002C75000026770000
+23780000237800002378000023780000237800002378000023780000237800
+00217B00001D830000198A0000149200000F9A00000AA2000004AC000200B8
+010300C8040100DE0D0000ED1B0000FC290000FF3A0000FF5B0000FF6E0000
+FF850000FFA10000FFB20000FFB20000FFB20000FFB20000FFB20000FFB200
+23780000237800002378000023780000237800002378000023780000237800
+002378000023780000227B00001D820000198A0000149200000F9A00000AA2
+000005AB000200B7010300C7040100DD0D0000EC1A0000FB280000FF360000
+FF580000FF6C0000FF810000FF9D0000FFB20000FFB20000FFB20000FFB200
+00FFB20000FFB2002378000023780000237800002378000023780000237800
+0023780000237800002378000023780000227B00001D820000198A00001492
+00000F9900000BA2000005AB000200B7000300C6030100DC0C0000EB190000
+F9270000FF340000FF550000FF6B0000FF7D0000FF9A0000FFB00000FFB200
+00FFB20000FFB20000FFB20000FFB200>
+<63000600630006006400060064000500650005006600050067000400670004
+0068000400680004006800040067000B0068001200690019006A0022006A00
+2C006C003900700048007400590076006A0077007C0077008D007600A00074
+00B8007400E8007400E8007400E8007400E8007400E9007400E9007400E900
+7400E9007400E9006400050064000500650005006600050067000400670004
+00680004006900040069000400690003006A00040069000A00690011006A00
+18006B0021006C002C006E003800720048007500590076006A0078007C0078
+008E007700A0007500B8007500EC007500ED007500ED007500ED007500ED00
+7500ED007500ED007500ED007500ED00660005006600050067000400680004
+006800040069000400690003006A0003006A0003006A0003006B0003006A00
+0A006B0011006C0018006D0020006D002B006F003800730047007600590077
+0069007A007D007A008E007800A0007700B8007600EF007600F2007700F200
+7700F2007700F2007700F2007700F2007700F2007700F20068000400680004
+006900040069000300690003006A0003006A0003006B0003006B0002006B00
+02006C0003006C0009006D0010006E0017006F0020006F002A007100370075
+00470077005900790069007B007D007B008F007900A0007800B8007800F100
+7800F6007800F6007800F6007800F6007800F6007800F6007800F6007800F6
+0069000300690003006A0003006A0003006B0003006B0002006C0002006C00
+02006C0002006D0002006D0002006E0008006E000F006F00170071001F0071
+0029007300360076004600790059007A0069007D007D007D008F007B00A000
+7A00B9007A00F3007A00F8007A00F8007A00F8007A00F8007A00F8007A00F8
+007A00F8007A00F8006A0003006A0003006B0002006C0002006C0002006D00
+02006D0001006D0001006E0001006E0001006E0001006F00070070000E0071
+00160072001E007300280075003500790046007B0058007C0069007E007D00
+7E008F007C00A0007C00B9007C00F0007C00FB007C00FB007C00FB007C00FB
+007C00FB007C00FB007C00FB007C00FB006C0002006C0002006C0002006D00
+01006E0001006E0001006F0001006F0001006F000100700001007000010071
+00060072000D007200150074001D0075002700770034007B0045007C005800
+7D0069007F007C007F008F007E00A1007E00BA007E00F5007E00FE007E00FE
+007E00FE007E00FE007E00FE007E00FE007E00FE007E00FE006D0001006D00
+01006E0001006F0001006F0001007000010070000100710001007100000072
+000000720000007300050073000C007400140075001C007600260079003300
+7E0044007E0057007F00690081007C0081008F008000A1008000BA008000F4
+008000FF008000FF008000FF008000FF008000FF008000FF008000FF008000
+FF006F0001006F000100700001007100010071000000720000007200000073
+0000007300000074000000740000007400040075000B007600130077001B00
+780025007A0031007F004200800056008100680083007C0083008F008200A1
+008100BA008100F0007E00FF007C00FF007B00FE007A00FD007A00FD007900
+FD007900FD007900FD00710001007100000072000000730000007300000074
+00000074010000750100007601000076020000760200007600030177000A00
+7800110079001A007A0023007C00300081004100820055008300680081007A
+007D008B0078009B007500B2007300D6007300FD007100FD007100FD007000
+FD007000FF006F00FF006F00FF006F00FF0073000000730000007401000075
+01000076010000760200007702000078020000780300007903000079030000
+77000202790009007A0010007B0018007C0022007E002E0080003E007A004E
+0076006002720071046F0083046B0096036700AC026600CE016901FF006801
+FF006701FF006702FF006602FF006602FF006502FF006502FF007602000076
+020000770200007802000078030000790300007A0400007A0400007B040000
+7C0500007C0500007A0101027B0007027C000F017D0017017900200272002A
+046C0036076700450A6300560C6000690E5E007E0F5B00910D5800AB0A5800
+D5085A02FB055801F9075600F8085400F7095400F6095300F60A5200F50A52
+00F50A79030000790300007A0400007B0400007C0400007C0500007D050000
+7E0600007F0600007F060000800700007D0300017C0005047A000C05710013
+0968001B0C6000241059002E135300391550004A164D005F174B0073174900
+89164700A4154600CA144500E9134300E8144200E8144100E7154000E71540
+00E7163F00E7163F00E7167C0500007C0500007D0500007E0600007F060000
+80070000810700008208000082080000830800008409000080060000730201
+0B670006115D000D155200151949001D1E420025223C003023390040233800
+54233600682234007F2233009A203200C11F3200EA1E3000E91F2F00E81F2E
+00E8202D00E7202D00E7202C00E6202C00E620800700008007000081080000
+820800008309000084090000850A0000850A0000850A0000860B00007F0D00
+00750E0000670A000C5302001A470006203D000D243300152A2C001F2E2600
+2B2F2200392F1F004A2F1D005D2E1B00712E19008A2D1900AE2A1A00D72719
+00D5281700D5281600D5291500D4291500D4291400D4291400D42984090000
+84090000850A0000860A0000860B0000870C0000870C0000880C0000870D00
+007C110000741500006A1600015C13000C4B0D001938060026280103311D00
+0B371600163A1000223C09002E3E05003C3E03014E3C0302643902037D3801
+029E370201CE300202CE300203CE2F0104CE2F0104CE2F0105CE2F0105CE2F
+0105CE2F870C0000870C0000880C0000880D0000890E0000890E00008A0F00
+00841100007915000070190000691C00005F1D0003521B000E421700183011
+00241E0B00310703004100040D4300081C40000B2B3C000D3A39000F4D3500
+12633100157B2D0016A02E0013CE2B0014CE2B0015CE2B0016CE2A0016CE2A
+0017CE2A0017CF2A0017CF2A8A0E00008A0F00008A0F00008B1000008B1000
+008B11000082140000771900006D1D0000662100005F240000552300074721
+000F391F0017291B00211716002C0210013A0013103700171F33001A2D3000
+1C3C2E001E4E2B0020622600237B260026A1270023DA250024DB240024DC24
+0025DC230025DD230025DD230026DD230026DD238C1100008C1200008C1200
+008D1300008D1400007F180000741D00006B220000632500005C280000562A
+00004B2900093F29000D312700132225001C12200027011C04310020132D00
+25212900282F27002B3E24002D4F21002F641F00317C1F00349E1E0032DC1B
+0032E31A0033E1190033E0190034E0190034DF180034DF180034DF188E1500
+008E1500008E1600008D1700007E1C00007222000068260000602A0000582C
+0001522E00014D30000044310003393200082B31000E1C2E00170C28002300
+280728002F1625003523210039301E003C401C003F521A0041661900427E1A
+00439D160044D1100044E00F0045E10F0045E10F0046E20F0046E20E0046E2
+0E0046E20E8F180000901800008C1A00007C21000070260000662B00005D2E
+0001563000014F3200004A340000453600003E390000343C0002253A000B15
+3700150532002000390B210040181D0044241A00483117004D411400505412
+0052681100537F1300549E0F0055D4090055EE080055EE080055EF080056EF
+080056EF080056EF070056EF07901C00008A1E00007B2500006E2B00006430
+00005A320001533500004D37000047390000423B00003E3C0000354000002C
+4300011E4200090E400014003F031D00480E18004E19140052241200573010
+005B400D005F550A00626B070065820600669E050064C7020063EA020064EA
+020064E9010064E9010064E8010065E8010065E8017D280000792A00006C30
+00006134000058370000503900004A3C0000443E00003F4000003941000034
+4300002C470000234A0001164A000807490013004D06140056100F005D1A0A
+006124080066310600684005006B5304006E69010071800000729B000070C2
+00006FF000006FF000006FF100006FF1000070F1000070F1000070F1006E34
+00006B3500005F390000563B00004E3E000048400000414300003B45000035
+470000304900002C4A0000244E00001B5100010F53000802540210005C090C
+0063110800691905006E230400702E0400723C0300744E0300776401007B7B
+00007C9700007BC100007BFF00007BFF00007BFF00007BFF00007BFF00007B
+FF00007BFF00603C00005D3D0000534000004C430000454600003E49000037
+4B0000314D00002C4F000028500000245200001C560000145900010A5B0008
+005D010F0064070C006B0E080073170500792003007C2B02007E3700007F48
+0000815E0000857700008894000087BE000085FF000085FF000086FF000086
+FF000086FF000086FF000086FF00534300005144000049480000424B00003A
+4E0000345100002E5300002855000024570000205800001E5900001B5D0000
+166100010D6400060266000D006C050C00740B09007D130500841C03008826
+01008A3200008C4200008D58000091710000968F000096B4000091FF000091
+FF000091FF000091FF000091FF000091FF000091FF00494C0000474D00003F
+50000037540000305700002A590000255C0000205E00001F5F00001F5F0000
+206000001C64000017690000106D00050670000A0076020C007F080900880E
+05009016030096200100992C00009A3B00009D510000A06B0000A78A0000A8
+AE00009FEC00009FFD00009FFD00009FFD00009FFC00009FFC00009FFC003E
+5500003C560000345A00002D5E000027600000226300002065000020650000
+2166000021670000216800001D6C000019720000137800020B7D0006028300
+0A008C04090095090500A00F0200A9180000AF230000B2320000B4470000BB
+620000C2820000C59F0000BCDA0000B6F50000B6F50000B6F50000B6F50000
+B6F50000B6F50034600000326100002B65000024690000216B0000216C0000
+226D0000226E0000226F000022700000227000001F7600001A7D0000168500
+00118C000009930003029A000700A6030500B5070200C50D0000D4190000E3
+270000F7370000FD540000FE6D0000FF880000FFAD0000FFBD0000FFBC0000
+FFBC0000FFBB0000FFBB0000FFBB002A6D0000286E00002272000022730000
+22740000237500002377000023780000237800002378000023780000207E00
+001B860000178D0000129500000D9D000008A6000002B1000300BE020200D2
+070000E7140000F5230000FF310000FF510000FF6A0000FF7F0000FF9E0000
+FFB20000FFB20000FFB20000FFB20000FFB20000FFB2002378000023780000
+23780000237800002378000023780000237800002378000023780000237800
+0023780000207E00001C850000178D0000129500000D9D000008A6000002B0
+000300BE020200D1070000E6130000F4220000FF300000FF4E0000FF680000
+FF7A0000FF9B0000FFB20000FFB20000FFB20000FFB20000FFB20000FFB200
+23780000237800002378000023780000237800002378000023780000237800
+00237800002378000023780000207D00001C850000178D0000129500000D9D
+000009A5000002B0000300BD010200D0060000E4120000F2200000FF2E0000
+FF4A0000FF640000FF760000FF940000FFB00000FFB20000FFB20000FFB200
+00FFB20000FFB2002378000023780000237800002378000023780000237800
+002378000023780000237800002378000023780000207D00001C850000178C
+0000139400000E9C000009A5000003AF000300BC010300CE050000E3110000
+F11F0000FF2D0000FF450000FF610000FF720000FF8C0000FFA70000FFB200
+00FFB20000FFB20000FFB20000FFB200>
+<59000900590009005A0009005B0009005B0008005C0008005D0008005D0008
+005E0008005E0007005F0007005F000A005F0011005F001800600020006100
+2A0062003400650041006B0050006F0060007000700071008200700094006E
+00AA006C00CA006D00DE006D00DE006D00DE006D00DE006D00DE006D00DE00
+6D00DE006D00DE005B0009005B0009005B0008005C0008005D0008005E0008
+005E0007005F0007005F000700600007006000070060000A00600011006100
+1800610020006200290063003400670041006C005000700060007100700072
+008200710094006F00AA006E00CA006E00DE006E00DE006E00DE006E00DE00
+6E00DE006E00DE006E00DE006E00DE005D0008005D0008005D0008005E0008
+005F0007005F00070060000700600007006100060062000600620006006200
+0900620010006200170063001F006400280065003300680040006E004F0071
+0060007200700073008200720094007000AA006F00CA006F00DE006F00DE00
+6F00DE006F00DE006F00DE006F00DE006F00DE006F00DE005E0007005E0007
+005F0007006000070060000700610006006200060062000600630006006300
+0600640005006300080063000F006400160065001E0066002700660032006A
+0040006F004F00720060007300710074008200730094007200AA007100C900
+7000DE007000DE007000DE007000DE007000DE007000DE007000DE007000DE
+00600007006000070061000700620006006200060063000600640005006400
+05006500050065000500660005006500080065000E006600150067001D0067
+002600680032006C003F0070004F0073006000740071007500820075009500
+7300AA007200C9007200E2007200E2007200E2007200E2007200E2007200E2
+007200E2007200E20062000600620006006300060064000500650005006500
+050066000500670004006700040068000400680004006700070067000D0068
+00140069001C006A0025006A0031006E003E0072004F007400600076007100
+76008300760095007500AA007400C9007300E8007300E8007400E8007400E8
+007400E8007400E8007400E8007400E8006500050065000500650005006600
+05006700040068000400680004006900040069000300690003006A00030069
+0006006A000C006A0014006B001B006C0024006D00300070003D0074004E00
+760060007700710078008300770095007600AA007600CA007500EE007600EE
+007600EF007600EF007600EF007600EF007600EF007600EF00670004006700
+0400680004006800040069000300690003006A0003006A0003006B0003006B
+0002006B0002006C0005006C000B006C0013006E001A006F0023006F002F00
+72003C0076004E0078005F00790071007A008300790095007800AA007800CA
+007800F5007800F5007800F5007800F5007800F5007800F5007800F5007800
+F50069000300690003006A0003006A0003006B0003006B0002006C0002006C
+0002006C0002006D0002006D0001006E0004006E000A006F00120070001900
+7100220072002D0074003B0078004D007A005F007B0071007C0084007B0096
+007800A9007600C9007300EF007200ED007100EC007000EC007000EB006F00
+EA006F00EB006F00EC006B0002006B0002006B0002006C0002006C0002006D
+0001006D0001006E0001006E0001006F0001006F0001007000030070000900
+71001000720018007300210074002C0077003A007A004C007A005E0077006E
+0073007F00700090006C00A5006A00C1006B00F6006B00FC006A00FF006900
+FF006900FF006800FF006800FF006800FF006D0001006D0001006D0001006E
+0001006F0001006F0001007000010070000100710001007100010071000000
+720002007300080073000F00740017007500200076002B00720037006E0045
+006B005600690067026600790363008C026000A2005F00C2006300FF006200
+FF006100FF006001FF005F01FF005F01FF005E01FF005E01FF006F0001006F
+00010070000100700001007100010071000000720000007300000073000000
+7300000074000000740001007500070076000E007600160070001D00680026
+01610032045C003E075A004D095800600B5600740C5500880A53009F075200
+C1055501FB045300F9055100F7055000F6064F00F4064E00F4074E00F3074E
+00F20772000000720000007200000073000000730000007401000075010000
+75010000760200007702000077020000760100007700050170000B02670012
+055E001A095600220D50002A114B003413480044134600571445006B144400
+8013430098114200B9104100E50E4000E40F3E00E3103D00E2103D00E2113C
+00E1113C00E1113B00E1117501000075010000750100007602000077020000
+770200007803000079030000790300007A0400007A040000760400006A0201
+085F00060D55000C114A00131641001B1B3A00232035002E2133003C203100
+4E1F3000611E2F00761E2E008E1D2D00AE1B2E00DD192C00DC192B00DB1A2A
+00DB1A2900DA1B2900DA1B2800D91B2800D91B780300007803000079030000
+790300007A0400007B0400007C0500007C0500007D0500007E060000760900
+006D0C0000600900074D0200154200061B37000C202E00132627001C292200
+282A1D00362A1B0045291900572917006A291600802815009E251800CE2116
+00CE221500CE221400CD231300CD231200CD231200CD231200CD237C050000
+7C0500007C0500007D0600007E0600007F06000080070000810700007D0900
+00730D00006B1100006313000056110008460C0014340500212501032B1B00
+0A30140015330D00203507002C36030039370101493501035E320105742F00
+04912E0101C22A0103C9290103C9290104C9290105C8290105C8280005C828
+0006C828800700008007000081070000820800008309000084090000850A00
+007B0D0000701100006815000060190000591B00004C1800093E1400142D0F
+001F1C0A002B0602003900040D3B00081B37000B2933000D3830000F492C00
+115D2900157226001691270014BD260014C8250014C8250015C8250016C824
+0016C8240016C8240016C824850A0000850A0000850A0000860B0000870B00
+00870C0000791100006E160000651A00005D1D0000561F00004F210002431F
+000A351C00132618001C16140026020E013200120F2F00161E2C00192B2800
+1B3925001C4A22001E5D1F0021731F002491200023C1210022D2200023D31F
+0023D31F0024D41F0024D41E0024D41E0024D41E880D0000880D0000890D00
+00890E000085100000771500006C1A0000621E00005A210000532400004D26
+0000462600023A2600092E24000F20220017101D0021011A042A001F122600
+24202300262D1F00293B1C002B4C1A002D5F18002F7419003191190031BB17
+0030D5160031D5150031D4140032D4140032D4140032D4140032D4138B1000
+008B1000008B11000084140000751900006A1F000060230000582600005028
+00004A2A0000452B00003F2D0000352E0004282D000A1A2B00130B25001D00
+260722002D151E0032221B00362E1800393D15003C4E13003E6112003F7613
+004191110042BA0C0041DA0B0042DA0A0043DB0A0043DB090043DC090044DC
+090044DC098D1400008D14000082170000731E0000672300005E270000552A
+00014E2C0000482E0000423000003D310000373300002F3700002236000713
+330011042E001B00360B1A003C17160040221300452E1000493D0D004C4F0C
+004E630A00507909005295070053BE030051EB020052EB020052EB020052EB
+020053EB010053EB010053EB017A1E00007A1E000072220000662800005B2C
+0000522E00014B310000453300003F3500003A360000343800002F3A000026
+3D00001B3E00050C3C0010003B031700440E110049180D004D220A00522E08
+00563D0600594F05005C6502005E7B0000609501005EB800005CEC00005CEC
+00005CEC00005CEC00005CEC00005CEC00005CEC006B2A00006B2A0000642D
+0000593000015033000049360000433800003C3A0000363C0000303E00002C
+3F0000274100001E440000134500050544000F0049070E0050100900551806
+00582106005B2C06005E3A0600614B050064610300677700006990000067B0
+000064E7000065E7000065E7000065E7000065E7000065E7000065E7005E33
+00015E330001573500014E380000473B0000403D0000393F0000324100002D
+43000028450000244700001F480000174C00000D4D0005014C000E0051060D
+00580E0A005E160600621F05006529050067360500694705006D5C03007073
+0000728C000072AD000070F1000070F1000070F1000070F1000070F1000070
+F1000070F100523B0000523B00004D3D0000454000003D430000354500002F
+48000029490000244B0000204D00001C4E00001B4F0000165200000F540004
+0455000D0059050E005F0C0A00671407006D1D040071270300733303007542
+0200775602007A6D00007E8700007EAA00007CF000007CFF00007CFF00007C
+FF00007DFF00007DFF00007DFF004743000047430000424600003A49000032
+4B00002B4D000026500000215100001D5300001D5400001D5400001D550000
+18590000115C0003075E000A0061030E0068090B0070100700781904007D23
+0200802E0100823C000082500000856700008A8300008CA4000089E5000088
+FF000088FF000088FF000088FF000088FF000088FF003C4D00003C4D000037
+4E00002F51000028540000235600001E5800001E5900001E5A00001F5B0000
+1F5B00001E5C00001A610000146500020A680008016B010D0072060B007B0D
+0800841504008A1E02008E2900008F3600009149000093600000987D00009D
+A0000097CF000095FF000095FF000095FF000095FF000095FF000095FF0031
+560000315600002C580000265B00001F5E00001F5F00002060000020600000
+206100002062000020630000206400001B690000166F00010E730005047700
+0B007E030B0088080800910F0400991701009F210000A22E0000A3400000A7
+580000AC760000B3960000ACC30000A6F90000A6F90000A6F90000A6F90000
+A6F90000A7F900276100002761000023630000206500002166000021670000
+2168000021690000216A0000216B0000216B0000216D00001D730000187A00
+00128000020A870005038E00080096030700A1080400AE0E0100B9170000C2
+240000C7340000CD4C0000D5690000DA870000DDAC0000CEF40000CEF50000
+CFF50000CFF50000CFF50000CFF500216C0000216C0000216D0000226E0000
+226F0000227000002272000022730000227400002375000023750000227700
+001E7F00001A87000015900000109800000BA1000005AA000101B6000300C6
+030100DD0C0000EC1A0000FC290000FF3C0000FF5F0000FF730000FF940000
+FFB20000FFB20000FFB20000FFB20000FFB20000FFB2002376000023760000
+23770000237800002378000023780000237800002378000023780000237800
+0023780000237900001E8100001A88000015900000109800000BA0000006AA
+000101B5000300C4030100DC0B0000EB190000FA280000FF380000FF5C0000
+FF6F0000FF8C0000FFAE0000FFB20000FFB20000FFB20000FFB20000FFB200
+23780000237800002378000023780000237800002378000023780000237800
+00237800002378000023780000237900001F8000001A880000159000001098
+00000CA0000006A9000101B4000400C3030100DA0B0000EA180000F9270000
+FF350000FF580000FF6D0000FF860000FFA40000FFB20000FFB20000FFB200
+00FFB20000FFB2002378000023780000237800002378000023780000237800
+002378000023780000237800002378000023780000237900001F8000001A88
+0000168F0000119700000CA0000006A9000101B4000400C2030100D80A0000
+E9170000F8260000FF330000FF550000FF6B0000FF810000FF9E0000FFB200
+00FFB20000FFB20000FFB20000FFB200>
+<50000C0050000C0050000C0051000C0051000C0052000C0053000B0053000B
+0054000B0054000B0055000B0055000B005400110054001800540020005600
+2800580031005C003B0061004700670056006A0066006B0077006A008A0068
+009F006600BD006900F2006900F1006900F1006900F1006900F1006900F100
+6900F1006900F10052000C0052000C0052000C0052000C0053000B0054000B
+0054000B0055000B0056000A0056000A0057000A0057000A00560010005600
+170056001F0057002700590030005D003B0062004700680056006B0066006C
+0077006B00890069009F006700BC006900ED006900ED006900EC006900EC00
+6900EC006900EC006900EC006900EC0054000B0054000B0054000B0054000B
+0055000B0056000A0056000A0057000A0057000A0058000A00580009005900
+090058000F005800170058001E00590026005B0030005E003A006300470069
+0056006C0066006D0077006C0089006A009E006900BA006A00E8006A00E800
+6A00E8006A00E8006A00E7006A00E7006A00E7006A00E70055000A0055000A
+0055000A0056000A0057000A0058000A0058000A0059000900590009005A00
+09005A0009005B0009005A000F005A0016005A001D005B0025005D002F005F
+003A00650047006A0056006D0066006E0077006E008A006C009E006A00B900
+6B00E3006B00E3006B00E3006B00E3006B00E2006B00E2006B00E2006B00E2
+0058000A0058000A0058000A0058000A00590009005A0009005A0009005B00
+09005B0008005C0008005C0008005D0008005D000E005C0015005D001C005E
+0025005F002E0061003A00660047006C0056006F0066006F0077006F008A00
+6D009E006C00B8006C00DE006C00DE006C00DE006C00DE006C00DE006C00DE
+006C00DE006C00DE005A0009005A0009005A0009005A0009005B0009005C00
+08005C0008005D0008005E0008005E0008005F0007005F0007005F000D005F
+0014005F001B006000230061002D0062003900680046006D00560070006600
+7000770071008A006F009E006D00B8006D00DE006D00DE006D00DE006D00DE
+006D00DE006D00DE006D00DE006D00DE005C0008005C0008005C0008005D00
+08005D0008005E0008005F0007005F00070060000700600007006100070061
+00060061000C006100130062001A006300220063002C00650038006A004600
+6F005600710067007200780072008A0071009E006F00B7006E00DE006E00DE
+006E00DE006E00DE006E00DE006F00DE006F00DE006F00DE005E0007005E00
+07005E0007005F000700600007006100070061000600620006006200060063
+000600630006006400050063000B0063001200640019006500210066002B00
+670037006C00460070005600730067007300780074008A0073009D007100B7
+007000DE007000DE007000DE006F00DE006F00DD006E00DD006E00DD006D00
+DD006100070061000700610007006200060062000600630006006400050065
+0005006500050066000500660005006700040066000A006600100067001800
+6700200068002A00690036006E00450072005600740067007500780073008A
+006F009C006C00B5006C00F1006B00F3006A00F6006A00F9006900F9006900
+F9006800F9006800FB00640005006400050064000500650005006500050066
+00050067000400670004006800040069000400690004006900030068000900
+69000F00690017006A001F006B0029006C003500700044006F0053006D0063
+006B0074006700860064009A006100B6006500FF006300FF006200FF006100
+FF006100FF006000FF006000FF006000FF0067000400670004006700040068
+0004006800040069000400690003006A0003006A0003006B0003006B000200
+6B0002006B0007006C000E006C0015006E001D006C0027006500320060003E
+0060004C005F005D015E006F025C008201590097005700B5005C00FF005A00
+FF005900FF005800FF005700FF005700FF005700FF005600FF006900030069
+000300690003006A0003006B0003006B0002006B0002006C0002006C000200
+6D0002006D0001006D0001006E0006006F000D006C00140064001B005D0024
+0057002E035300380551004506500056084F006A094E007F084D0094054C00
+B0034E00EA024D00F5024C00F2034A00F0034900EE034900ED044800EC0448
+00EC046C0002006C0002006C0002006C0002006D0002006D0001006E000100
+6E0001006F0001006F00010070000100700001006F00040066000A015E0011
+03550018074D001F0D460027114200301440003E1240004F113F0062113E00
+77103D008E0E3D00AA0C3D00D40A3C00DF0A3B00DE0B3A00DD0B3900DC0C38
+00DC0C3800DC0C3700DB0C6E0001006E0001006E0001006F0001006F000100
+7000010071000100710000007200000072000000730000006D030000620201
+035700050A4D000B0E420012143A0019193200201E2E002B1F2C00391D2B00
+491B2A005A1A2A006D1A2900841928009F172A00C7142900D4142800D31527
+00D2152600D1152500D1152500D0162400D016710000007100000071000000
+720000007200000073000000740000007401000075010000730300006C0600
+00640900005A090003470200113C00051732000B1C2900122222001A251E00
+26261A00322516004023150051231300632412007723120091211400B61D14
+00C81C1300C71D1100C71D1100C61E1000C61E0F00C61E0F00C61E74010000
+74010000740100007501000076020000770200007702000078030000720600
+00690A0000610D00005A10000050100003410B000F3004001C220103251800
+092A1200132C0B001F2E06002A2F0200362E0001462D0003592A00066D2800
+0685270003AA250103C3230104C3230005C2230005C2230006C2230006C223
+0006C122780300007803000078030000790300007A0400007B0400007A0500
+00700A0000670E00005E1200005715000051170000471700043913000F2A0E
+001A190900240602003100040C3200081A2E000B282A000D3627000F452400
+10582200136B1F0015841F0014AA210013C1200014C1200014C11F0015C11F
+0015C11F0015C11F0015C21F7D0500007D0500007D0500007E0600007F0600
+007B0900006F0E0000641200005B160000541900004E1B0000481D00003E1C
+00053119000E2416001714130020020D012A00110F2800151C240018292000
+1A371D001B461B001D5819001F6C180022851A0022AB1C0020CB1B0021CB1B
+0022CB1A0022CB1A0022CB1A0022CB1A0023CB198308000083080000830800
+00840900007A0D00006D12000062170000591A0000511D00004A2000004421
+00003F230000362300042B22000B1E2000130F1C001B01190423001E112000
+221F1C00252B180027391500294913002B5A12002D6D12002F8613002FA712
+002ECB11002ECB11002FCB10002FCB100030CB0F0030CB0F0030CA0F870B00
+00870B0000870B0000791100006B160000601B0000571F00004F2200004824
+0000412500003C27000038280000302A0000252A00061829000F0924001800
+25071B002B1418002F201400332C1000373A0E003A4A0C003C5D0B003D700B
+003E870A003FA806003FD2050040D3040041D3040041D4030042D4030042D5
+030042D5037715000077150000771500006A1B00005E200000552400004C26
+0000452800003F2A0000392B0000342D0000302F0000293100001F33000211
+30000C032C001600330B130038160F003C200C00412C0800463A06004A4B04
+004A5E03004C7301004D8A00004DAC00004BE200004BE200004BE200004BE2
+00004BE200004BE200004BE2006720000067200000672000005D2500005228
+00004A2A0000432D00003C2E000036300000313200002C3400002836000021
+380000183A00010A38000B0038041000400D0A0044160600461F0500492A05
+004E38050050480500525C0300547101005689000056A9000053E6000052EA
+000053EA000053EA000053EA000053EA000053EA005A2A00005A2A00005A2A
+0000512C0001482F0000413100003A330000333600002D380000283A000024
+3B0000203D0000193F000010410001053F000B0041050D00460C0A004B1506
+004D1D0500502705005534060057440600595804005C6F01005F8600005FA5
+00005BDB00005BEC00005BEC00005BEC00005BEC00005BEC00005BEC004E32
+00004E3200004E320000463400003F37000037390000303C00002A3E000025
+400000204100001C4300001A44000017450000114700010746000A0047030E
+004D0B0B0053130700561B0500592506005D3106005F40060062540500666B
+01006882000069A0000065C7000065E7000065E7000065E7000065E7000065
+E7000065E700443A0000443A0000443A00003D3D0000343F00002C41000027
+440000214600001C4700001B4800001B4900001B490000184B0000134D0000
+094E0008004F020F0054090C005B1108006119060065230500672E0500693C
+05006C4F04006F650200737D0000749A000071C4000071F3000071F3000071
+F3000072F3000072F3000072F300394300003943000039430000314500002A
+480000234A00001E4C00001C4D00001C4E00001C4E00001C4F00001C4F0000
+1A520000155500000C5600070258010E005D070D00640E09006C1606007120
+0400742B030076370200784902007A5F01007E7800008196000080C400007F
+FF00007FFF00007FFF00007FFF00007FFF00007FFF002E4C00002E4C00002E
+4C0000274E0000205000001D5200001D5300001D5400001D5400001E550000
+1E5600001E5600001C590000175D00000F5F00050461000C0066040D006E0B
+0A00771306007E1C0300832601008532000087420000875800008B71000090
+9100008EBB00008CFF00008CFF00008CFF00008CFF00008CFF00008CFF0024
+55000024550000245500001E5800001E5900001E5A00001F5B00001F5B0000
+1F5C00001F5D00001F5D00001F5E00001D61000018660000116A0003086D00
+090071010D007A070A00830E06008C160300921F0100952B0000963A000098
+5000009B6A0000A28B0000A2B200009BFE00009BFE00009BFE00009BFE0000
+9BFE00009BFE001F5F00001F5F00001F5F0000206000002061000020620000
+2063000020640000206500002065000021660000216700001F6A00001A7000
+00147500010C7B00060480000A0089030A00920806009C0E0300A5160100AC
+220000AF300000B1450000B8600000BF820000C2A30000B4E90000B3F60000
+B3F60000B3F60000B3F60000B4F60021680000216800002168000021690000
+216A0000216B0000216C0000226D0000226E0000226F000022700000227100
+00207500001C7C000017840000128B00000C930002049A000500A4010600B3
+050300C50A0000D6160000E5240000F9330000FF520000FF6C0000FF880000
+FFB20000FFB50000FFB50000FFB50000FFB50000FFB4002272000022720000
+22720000227300002375000023760000237700002378000023780000237800
+002378000023780000217C00001D830000188B0000139300000E9B000009A4
+000003AE000300BB010300CD050000E3110000F2200000FF2F0000FF4E0000
+FF690000FF7F0000FFA00000FFB20000FFB20000FFB20000FFB20000FFB200
+23780000237800002378000023780000237800002378000023780000237800
+0023780000237800002378000023780000217B00001D830000188B00001493
+00000E9B00000AA3000004AD000300BA010300CC050000E2100000F11F0000
+FF2E0000FF4A0000FF660000FF7A0000FF9C0000FFB20000FFB20000FFB200
+00FFB20000FFB2002378000023780000237800002378000023780000237800
+00237800002378000023780000237800002378000023780000217B00001D83
+0000188A0000149300000F9A00000AA3000004AD000200B9010300CB050100
+E10F0000EF1E0000FE2C0000FF440000FF620000FF760000FF970000FFB200
+00FFB20000FFB20000FFB20000FFB200>
+<47001000470010004700100047001000480010004800100049000F004A000F
+004A000F004B000F004B000E004B000E004B0010004900170049001F004B00
+26004F002D0053003600590041005F004E0063005C0065006D0064007F0062
+0095006000B1006500FC006500FC006500FC006500FC006500FC006500FC00
+6500FC006500FC0049000F0049000F0049000F0049000F004A000F004A000F
+004B000F004B000E004C000E004C000E004D000E004D000E004D0010004B00
+17004B001E004D00250050002D00550036005900400060004D0064005C0066
+006D0065007F00640094006100B0006500FB006500FB006500FB006500FB00
+6500FB006600FB006600FA006600FA004A000F004A000F004A000F004B000F
+004B000E004C000E004D000E004D000E004E000D004E000D004F000D004F00
+0D004F000F004D0016004D001E004E00250051002C00560036005A00400061
+004D0065005C0067006D0067007F00650093006300AF006600F9006600F900
+6600F9006600F9006600F9006600F9006600F9006600F8004C000E004C000E
+004C000E004D000E004D000E004E000D004E000D004F000D0050000D005000
+0C0051000C0051000C0051000E004F0015004F001D005000240053002C0057
+0035005B00400062004D0066005C0068006C0068007F00660093006400AD00
+6700F4006700F7006700F7006700F7006700F6006700F6006700F6006700F6
+004E000D004E000D004E000D004F000D004F000D0050000D0051000C005100
+0C0052000C0052000C0053000B0053000B0053000D005200140052001C0053
+00230055002B00580035005C00400063004D0068005C006A006C0069007F00
+680093006600AC006700E6006800F4006800F4006800F4006800F4006800F4
+006800F4006800F40051000C0051000C0051000C0051000C0051000C005200
+0C0053000B0053000B0054000B0055000B0055000B0055000A0056000C0054
+00130054001B005500220057002B00590034005D003F0064004D0069005C00
+6B006C006B007E00690092006700AB006700D8006900F0006900F0006900F0
+006900F0006900EF006900EF006900EF0053000B0053000B0053000B005300
+0B0054000B0055000B0055000B0056000A0056000A0057000A0058000A0058
+000A0058000B005700120057001900580021005A002A005B0034005F003F00
+66004D006A005C006C006C006C007E006B0092006900AA006800D0006A00E9
+006A00E9006A00E9006A00E9006A00E9006A00E9006A00E90056000A005600
+0A0056000A0056000A0057000A0057000A0058000A0059000900590009005A
+0009005A0009005B0009005B000A005A0011005A0018005B0020005C002900
+5E00330061003F0067004D006C005C006E006D006E007E006D0092006B00A9
+006A00CC006A00E8006A00EE006900F3006900F7006900FB006800FC006800
+FD0058000900580009005800090059000900590009005A0009005B0009005B
+0008005C0008005C0008005D0008005D0008005E0009005D0010005D001700
+5E001F005F0028006000320063003E0069004C006D005C006D006C006B007D
+00670091006300A9006200D8006400FF006300FF006200FF006100FF006100
+FF006000FF006000FF005B0009005B0009005B0009005B0008005C0008005D
+0008005D0008005E0008005F0007005F000700600007006000070061000800
+60000F006000160061001D00620026006300310062003D0062004900630058
+006200690060007B005C008F005900AA005C00E6005B00FF005900FF005900
+FF005800FF005700FF005700FF005700FF005E0007005E0007005E0007005E
+0007005F000700600007006100070061000600620006006200060063000600
+630006006300070063000D006300140064001C005F00240059002E00560038
+005600440056005300560065015500780052008D004F00A9005100DD005100
+FF005000FF005000FF004F00FF004E00FF004E00FF004E00FF006100060061
+00060061000600620006006200060063000600640005006500050065000500
+6600050066000500670004006700050066000C006000130058001A00530023
+004E002B034B0033054A003F0449004E04480061064800750648008A034600
+A3014600CC014600EE004500EC014400EB014300E9014200E8014200E70141
+00E70165000500650005006500050065000500660005006700040068000400
+680004006900040069000300690003006A000300640003005C000900540010
+024B00160743001D0D3C00231338002D1539003A113900490E38005B0E3800
+6E0D3800840B38009D093800C0073700DB063600D9073500D9073400D80733
+00D7083300D7083200D7086900040069000400690004006900040069000300
+6A0003006A0003006B0003006B0002006C0002006A000200610001005A0101
+014E00040745000A0C3B001011330016172C001E1C2800281C2600351A2600
+4418250054162500661624007B15240094142600B4112600CF0F2500CE1024
+00CD102300CC102200CC112100CB112100CB116B0002006B0002006B000200
+6B0002006C0002006C0002006D0001006D0001006E000100670000005F0300
+005A060000520800004202000C370004132D000A192500101E1F0018211A00
+242116002F2013003C1E11004B1E10005C1F0E006F1F0E00861D1000A51A12
+00C3181000C2180F00C2190E00C1190D00C1190D00C1190D00C1196E000100
+6E0001006E0001006E0001006F000100700001007000010070000000660300
+005E070000570A0000500D0000490E00003C0A000A2C0400161F0102201600
+08240F00122609001D28050028280101342700024225000454230006662100
+087C1F00069A200003BC1E0004BC1E0005BC1E0006BC1D0006BC1D0007BB1D
+0007BB1D720000007200000072000000720000007200000073000000700300
+00650700005C0B0000540E00004D11000047130000411500013511000A270C
+00151808001F0502002900040C2A00081927000B2623000D3320000F421D00
+10531B0012661900147B1900149A1B0012BC1B0012BC1B0013BC1A0013BC1A
+0014BD1A0014BD1A0014BD1A76010000760100007601000076010000770200
+0070060000640B00005A0F0000511200004A150000441700003F190000391A
+00012E180009211500121312001A020D012400110E2200151B1E0017281A00
+1A3517001B4314001C5413001E661200207C1300209A16001EC417001FC417
+001FC4160020C4160020C4150020C4150021C4157A0400007A0400007A0400
+007A0400006F090000620F0000581300004F17000048190000411B00003B1D
+0000361F000032200000272000061C1E000E0D1B00160118041D001D111A00
+211D16002429120026370E0028460C002A560B002B680B002C7D0C002D980D
+002BC20D002CC30C002CC30C002CC30B002DC30B002DC20A002DC20A710C00
+00710C0000710C00006E0E000061130000561800004D1B0000451D00003E20
+000038210000332300002F2500002B260000222800021627000A0822001200
+24071500291311002D1E0D00312A09003538060039470400395903003A6A03
+003A7E02003898020039C0020039C7020039C702003AC702003AC702003AC7
+02003AC70262170000621700006217000060180000551C00004B1F00004322
+00003C24000036260000312700002C290000282B0000242D00001B2F00000F
+2E0007022B010F00310A0C0035140800381E05003B2903003F360300424503
+004157030041690200427E01004198000043C4000042D3000042D4000042D4
+000042D4000042D4000042D400552000005520000055200000532100004924
+0000412600003A280000332A00002E2C0000292E000024300000203200001C
+33000014350000083500060033020C00380A09003C1306003D1C0500402604
+00453304004842040049540300496802004B7D00004B9900004BC600004ADF
+00004ADF00004AE000004AE000004AE000004AE0004A2800004A2800004A28
+0000482800003F2B0000382D0000302F00002B32000025340000203600001C
+3700001839000017390000123B00000A3A00050139020D003D090B00421107
+00441A0600462305004B2F04004E3E05005051040052650200547C00005597
+000053C2000052E9000052E9000052E9000052E9000052E9000052E9003F2F
+00003F2F00003F2F00003E300000353200002E35000027380000223A00001D
+3C0000183D0000183E0000183E0000183F0000134000000C400004023F010D
+0043070C00480F08004C1806004E210500522C0500563A0600584C05005B62
+03005E7900005F9401005DBA00005BEC00005BEC00005BEC00005BEC00005B
+EC00005BEC00353800003538000035380000333800002B3B0000243E00001E
+4000001942000019420000194300001A4300001A4400001A44000015460000
+0E4700030346000D004A060D00500D0A0055160600581F05005B2906005F37
+060061480600645D0300687500006A8F000068B1000066E6000066E6000066
+E6000066E6000066E6000066E6002A4100002A4100002A4100002841000021
+4400001B4600001A4700001B4800001B4800001B4900001B4A00001B4A0000
+1B4B0000174D0000104F0002054F000B0052040E00580B0B005F130700641C
+0500682605006B3304006C4205006F580300736F00007689000076AE000074
+F6000074F6000074F6000074F6000074F6000074F600204A0000204A000020
+4A00001F4A00001C4C00001C4D00001C4E00001C4E00001C4F00001C500000
+1D5000001D5100001D510000195500001358000209590009005C020E006209
+0B006A1008007119050077230300792E02007B3C01007C5001007F68000084
+84000085AA000083FC000082FF000082FF000083FF000083FF000083FF001D
+5200001D5200001D5200001D5200001D5300001D5400001E5500001E560000
+1E5700001E5700001E5800001E5900001E5900001A5D0000156100010C6400
+070166000E006D060C00750C08007E140500851E0200892801008B3600008C
+4900008E610000937E000097A3000091E2000091FF000091FF000091FF0000
+91FF000091FF001F5A00001F5A00001F5A00001F5A00001F5B00001F5C0000
+1F5D00001F5E00001F5F0000206000002061000020610000206200001C6700
+00176C0000107000040674000A007A020C00840808008D0E0500961602009B
+2000009E2D0000A03F0000A3570000A9760000B0980000A7CC0000A3FA0000
+A3FA0000A3FA0000A4FA0000A4FA0020630000206300002063000020630000
+2065000021660000216700002168000021690000216A0000216A0000216B00
+00216C00001E71000019780000147F00010C850005058D000800940208009E
+070500AB0C0200B8150000C2220000C7320000CC490000D6670000DB880000
+DCAF0000CFF50000D0F50000D0F60000D0F60000D1F600226D0000226D0000
+226D0000226E0000226F000022700000227200002273000022740000237500
+00237600002377000023780000207E00001B860000168E0000119600000C9E
+000007A8000101B3000400C1020200D80A0000EA180000FA270000FF380000
+FF5D0000FF730000FF990000FFB20000FFB20000FFB20000FFB20000FFB200
+23780000237800002378000023780000237800002378000023780000237800
+002378000023780000237800002378000023780000207E00001B860000178E
+0000129600000D9E000007A7000101B2000400C0020200D6090000E9170000
+F9260000FF340000FF5A0000FF6F0000FF8F0000FFB20000FFB20000FFB200
+00FFB20000FFB2002378000023780000237800002378000023780000237800
+0023780000237800002378000023780000237800002378000023780000207E
+00001B860000178D0000129600000D9E000008A7000001B1000400BF020200
+D4080000E8150000F7250000FF330000FF560000FF6D0000FF870000FFAA00
+00FFB20000FFB20000FFB20000FFB200>
+<41001300410013004100130041001300410013004100130041001300410012
+0042001200420012004300120043001200430012004200160041001D004300
+230046002A004B00320051003C00570047005C0055005F0065005F0076005D
+008B005B00A7005E00DC006100FD006100FD006100FD006100FD006100FD00
+6100FD006100FD004100130041001300410013004100130041001200420012
+00420012004300120043001200440012004400110044001100450011004300
+150042001C004400230047002A004C00320052003B00580047005D00550060
+006400600076005E008A005C00A5005E00D7006200FE006200FE006200FE00
+6200FE006200FF006200FF006200FF00430012004300120043001200430012
+00430012004300120044001100440011004500110045001100460011004600
+1100460010004500150043001C004500230049002A004C00320053003B0059
+0047005E005400610064006100760060008A005D00A4005E00D1006300FE00
+6300FE006300FE006300FE006300FE006300FE006300FE0044001100440011
+00440011004400110045001100450011004600110046001100460010004700
+10004700100048001000480010004700140045001C00460022004A0029004E
+00310054003B005A0046005F0054006200640063007500610089005F00A300
+5F00CD006300FE006300FE006300FE006300FE006300FD006300FD006300FD
+00460011004600110046001100460011004600100047001000470010004800
+10004800100049000F0049000F004A000F004A000F004900130047001B0048
+0022004C0029005000310055003B005B004600600054006300630064007500
+630089006000A1006000C9006400FD006400FD006400FD006400FD006400FD
+006400FD006400FD0048001000480010004800100048001000480010004900
+0F0049000F004A000F004B000F004B000E004C000E004C000E004C000E004B
+0012004A001A004A0021004D0028005200300056003A005C00460061005400
+6500630066007500640088006200A0006100C6006500FC006500FC006500FC
+006500FC006500FB006500FB006500FB004A000F004A000F004A000F004A00
+0F004B000F004B000E004C000E004C000E004D000E004E000D004E000D004E
+000D004F000D004D0012004C0019004D0020004F0027005300300057003A00
+5D0045006300530066006300670074006600880064009F006200C2006600F9
+006600F9006600F9006600F9006600F9006600F9006600F9004D000E004D00
+0E004D000E004D000E004D000E004E000D004E000D004F000D0050000D0050
+000C0051000C0051000C0052000C00500010004F00180050001F0051002600
+55002F00590039005E0045006400530068006300690074006800870065009E
+006200C1006400FF006300FF006200FF006100FF006000FF006000FF006000
+FF004F000D004F000D004F000D004F000D0050000D0051000C0051000C0052
+000C0052000C0053000B0053000B0054000B0054000B0054000F0053001600
+53001E005400260057002E005A0039005F0045006500530065006200630073
+005F0086005B009E005900C7005B00FF005A00FF005900FF005800FF005700
+FF005700FF005600FF0052000C0052000C0052000C0052000C0053000B0054
+000B0054000B0055000B0055000A0056000A0057000A0057000A0058000A00
+57000E005600150057001D005800250059002D00570037005700420059004F
+005A005F00580071005600860052009F005100C9005100FF005000FF004F00
+FF004F00FF004E00FF004E00FF004D00FF0056000A0056000A0056000A0056
+000A0056000A0057000A0057000A0058000A0059000900590009005A000900
+5A0009005B0009005B000C005A00140058001B00520023004F002B004D0033
+004D003E004E004B004E005C004E006F004C00840049009D004800C3004800
+FD004700FB004600FA004500F9004400F8004400F7004400F7005900090059
+0009005900090059000900590009005A0009005B0009005B0008005C000800
+5D0008005D0008005E0008005E0008005C000B00540012004D001900490021
+004500270442002F0643003A03430048014200580341006C03420081014000
+99003F00BA003E00E9003C00E7003B00E5003B00E4003A00E4003A00E30039
+00E3005C0008005C0008005C0008005C0008005D0008005E0008005E000700
+5F000700600007006000070061000700610006005A000500530008004A000E
+02420014073A001A0E3400201430002915310036103200440C3200540B3200
+660A32007A08320092063200B1043100D7033000D6032F00D5042E00D4042E
+00D4042D00D3052D00D3056000070060000700600007006000070061000700
+61000600620006006300060064000600640005005E00040057000300500001
+02450003043D00090935000E0F2D00141527001C1924002619220032172100
+401420004F13200060121F0072121F0089112100A60E2200CB0B2100CA0B20
+00C90C1F00C90C1E00C80C1E00C80D1D00C80D640005006400050064000500
+6400050065000500660005006600050067000400670004005C000200550001
+014B030000470500003D0300073200030F2900081521000F1A1B00171C1700
+221D13002D1B100039190E0047190C00571A0B00681A0B007D1A0C00981710
+00BF130E00BE140D00BD140C00BD150B00BC150A00BC150A00BC1569000400
+69000400690004006900040069000400690003006A000300640002005A0101
+00520400014B07000045090000400B0000380A00042A0400111D01021B1400
+081F0E00112107001B22030126220102322000033F1E0005501C0006621B00
+08751900078F1A0004B3190005B7190006B7180006B7180007B7180007B718
+0008B7186C0002006C0002006C0002006C0002006C0002006C000200620000
+005A04000051070000490B0000430D00003E0F00003911000031110004240C
+000F160800190502002300040B2300081820000B241C000E3119000F3F1600
+0F4F15001161140013741300148D150011B1160011B8160012B8160013B815
+0013B8150013B8150013B9156F0001006F0001006F0001006F0001006F0001
+0062030000590800004F0C0000470F0000411100003B130000361500003117
+00002A1700041F14000D11110015010C011E00100E1C00141A180017261400
+193310001A410E001B510D001C620C001E750D001F8D0F001DB213001DBD12
+001DBD11001EBD11001EBD10001EBD10001FBD106A0400006A0400006A0400
+006A04000062070000570C00004D100000451300003E150000381800003219
+00002E1B00002A1D0000251E00011A1D00090C1A001100180417001C101400
+201C100023280B00253408002643060027530500296405002A7605002A8D07
+0028AD0A0027BC0A0027BC0A0027BC0A0027BC0A0027BC0A0027BC0A5C0D00
+005C0D00005C0D00005C0D0000561000004C140000431700003C1A0000351C
+0000301E00002B20000027210000242300001F250000142500050621000D00
+23070E0027120B002B1D07002E280300303401003243010031530200316303
+0031750400308B05002EAB07002DBF07002DBF07002DBF07002DBF07002EBF
+07002EBF07501600005016000050160000501600004A180000411B0000391E
+0000332000002D2200002924000024260000202800001D290000172B00000D
+2B00020129010A002D0808002F120700301B05003325030036320200394002
+00385002003861030038730300378A030037AA030036C5040036C5030036C5
+030037C5030037C5030037C503441E0000441E0000441E0000441E00003F20
+000037220000302400002B27000026290000212B00001C2D0000182E000015
+2F0000123000000C310002022E000900300709003410070035190600382304
+003B2E0300403D0200404D0300405F0300407202004089010040AB010040D0
+010040D0010040D1010040D1010040D1010040D1013A2500003A2500003A25
+00003A250000362700002E290000282C0000232E00001D3000001932000015
+3300001534000016340000143500000E360001043300090034050B003A0E08
+003B1706003D200500412B040046390300484A0300485D0300497101004A89
+00004AAC000049DE000049DE000049DE000049DE000049DE000049DE00302D
+0000302D0000302D0000302D00002C2E0000253100001F3400001A36000016
+37000017380000173800001739000017390000153A00000F3B000106390009
+003A040D003F0C090043150600441D0500482804004C3505004F460500515A
+0400526F01005488000055AA000051E9000051E9000052E9000052E9000052
+E9000052E90026360000263600002636000026360000233700001C3A000018
+3B0000183C0000183D0000183D0000183E0000183E0000183F000017400000
+11410000084000080040030E00450A0B004B1207004D1B0500502505005431
+0500574106005A5505005D6D01005F85000060A500005CE300005CEC00005C
+EC00005CEC00005CEC00005CEC001D3E00001D3E00001D3E00001D3E000019
+400000194100001941000019420000194300001A4300001A4400001A450000
+1A45000019460000134800000B4800070048010F004D080C00541008005819
+06005B2206005F2E0600623D060064500500686702006B8000006C9E000068
+C9000068E8000068E8000068E8000068E8000068E8001A4600001A4600001A
+4600001A4600001A4600001B4700001B4800001B4900001B4A00001B4A0000
+1B4B00001C4B00001C4C00001A4D0000155000000D5200050151000F005706
+0D005D0E0A00641606006A2004006C2A04006F370400714903007460020078
+7A00007998000077C9000078FB000078FB000078FB000078FB000078FB001C
+4D00001C4D00001C4D00001C4D00001C4E00001C4E00001C4F00001D500000
+1D5100001D5200001D5200001D5300001D5400001C55000017590000105B00
+04055D000C0061040E00680A0A0071120700781C04007D2602007F32010081
+42000082580000867200008A93000089C6000087FF000087FF000087FF0000
+87FF000087FF001E5500001E5500001E5500001E5500001E5600001E570000
+1E5800001E5900001E5900001F5A00001F5B00001F5C00001F5C00001E5E00
+0019620000136600020A690008016D010D0075070A007E0D0700871504008E
+1F0100912B0000923A000094500000976A00009E8C00009DB8000097FF0000
+97FF000097FF000097FF000098FF001F5E00001F5E00001F5E00001F5E0000
+1F5F0000206000002061000020620000206300002064000020650000216500
+0021660000206800001B6E0000167300000E790005067E00090085020A008F
+070700990D0300A3150100AA200000AD2F0000AE430000B65F0000BD830000
+BFA80000B1F70000B1F60000B1F60000B1F60000B2F6002169000021690000
+216900002169000021690000216B0000216C0000226D0000226E0000226F00
+00227000002271000022720000227400001D7B000019830000148B00000F93
+0000089B000301A4000500B3040300C5080100D9120000E9200000FE300000
+FF500000FF6B0000FF870000FFB20000FFB20000FFB20000FFB20000FFB200
+23750000237500002375000023750000237600002377000023780000237800
+002378000023780000237800002378000023780000227A00001E8100001989
+000015910000109900000BA2000005AB000200B8010300C9040100E00F0000
+F01E0000FF2D0000FF4B0000FF690000FF810000FFA70000FFB20000FFB200
+00FFB20000FFB2002378000023780000237800002378000023780000237800
+00237800002378000023780000237800002378000023780000237800002279
+00001E8100001A89000015910000109900000BA1000005AB000200B7010300
+C8040100DF0E0000EE1C0000FE2C0000FF450000FF650000FF7B0000FF9E00
+00FFB20000FFB20000FFB20000FFB200>
+<41001300410013004100130041001300410013004100130041001300410013
+004100130041001300410013004100130041001300410013003F001A003F00
+20004100270047002E004C0036005200410057004E005B005D005C006E005B
+00820058009B005900C3005E00F9005E00F9005E00F9005E00F9005E00F900
+5E00F9005E00F9004100130041001300410013004100130041001300410013
+00410013004100130041001300410013004100130041001300410013004100
+13003F001A003F0020004100260047002E004C0036005200410057004D005B
+005C005C006D005B00810058009B005900C1005E00F9005E00F9005E00F900
+5E00F9005E00F9005E00F9005E00F900410013004100130041001300410013
+00410013004100130041001300410013004100130041001300410013004100
+130041001300410013003F001A003F0020004100260047002E004C00360052
+00400057004D005B005C005C006D005B00810058009A005900BF005E00F900
+5E00F9005E00F9005E00F9005E00F9005E00F9005E00F90041001300410013
+00410013004100130041001300410013004100130041001300410013004100
+1300410013004100130041001300410013003F0019003F0020004100260047
+002E004C0036005200400058004D005B005C005D006C005C00800059009800
+5900BD005F00FA005F00FA005F00FA005F00FA005F00FA005F00FB005F00FB
+00410013004100130041001300410013004100130041001300410013004100
+13004100130041001300410013004200120042001200420013004000190040
+001F004300260048002D004D0035005300400059004D005D005B005E006C00
+5E007F005B0097005A00BA006000FC006000FC006000FC006000FC006000FC
+006000FC006000FC0041001300410013004100130041001300410013004100
+13004200120042001200420012004300120043001200440012004400110044
+0012004200180042001F004500260049002D004E00350054003F005A004C00
+5E005B0060006B005F007E005C0096005C00B7006100FE006100FE006100FE
+006100FE006100FE006100FE006100FE004300120043001200430012004300
+12004300120043001200440012004400110045001100450011004500110046
+00110046001100460011004400180043001E00470025004A002C004F003500
+55003F005B004C005F005A0061006B0061007E005E0094005D00B5006200FF
+006300FE006300FE006300FE006200FF006200FF006100FF00450011004500
+11004500110045001100450011004500110046001100460010004700100047
+001000480010004800100048001000490010004700170046001E0049002500
+4C002C005000340056003F005C004B0061005A0063006A0061007D005D0094
+005900B5005C00FF005B00FF005900FF005800FF005800FF005700FF005700
+FF004700100047001000470010004700100047001000480010004800100049
+000F0049000F004A000F004A000F004B000F004B000E004B000E004A001500
+49001D004A0024004E002B005200340057003E005A004A005C0059005B006A
+0058007D00540094005000B8005200FF005000FF004F00FF004E00FF004E00
+FF004D00FF004D00FF004A000F004A000F004A000F004A000F004A000F004A
+000F004B000E004C000E004C000E004D000E004D000E004E000D004E000D00
+4F000D004D0014004C001C004D0023004D002A004D0032004E003B00500047
+0051005700510068004F007D004B0095004900B7004800FF004700FF004600
+FE004500FE004500FE004400FE004400FE004D000E004D000E004D000E004D
+000E004D000E004E000D004E000D004F000D004F000D0050000D0050000C00
+51000C0051000C0052000C00500013004B001A00470021004500280045002F
+004500380046004400470054004600670046007C00430094004000B3003F00
+F3003E00F5003D00F4003C00F3003B00F2003B00F2003A00F10050000C0050
+000C0050000C0050000C0050000C0051000C0052000C0052000C0053000B00
+53000B0054000B0054000B0055000B0051000A004A0010004400180040001E
+023B00240739002B093B0036033D0043003C0052003B0064013B0079003900
+90003700AD003500E0003400E6003300E4003200E3003200E2003100E10031
+00E00054000B0054000B0054000B0054000B0054000B0055000B0055000B00
+56000A0057000A0057000A0058000A00550009004E0008004800070041000D
+013A0012073300180D2D001E122A0027132B00330E2C00400A2C004F082C00
+60072B0073062C0089042C00A5022B00CD012A00D5012900D3012800D20128
+00D2022700D1022700D10258000A0058000A0058000A0058000A0058000A00
+58000900590009005A0009005A0009005B000900530007004C000600440004
+003E000202370007062F000D0C2900131123001A15200024151E002F131D00
+3C101C004A0F1B005A0E1B006C0E1B00810D1C009A0B1E00BD071D00C8071C
+00C7081B00C6081A00C5081900C5091900C5095C0008005C0008005C000800
+5C0008005C0008005D0008005D0008005E0008005A00070052000500460003
+00400001023B010003370400022D00020B250007111E000E15190016181500
+201811002B170D0036150B00421509005215080062160700751608008D140B
+00AD110B00BA100A00B9100900B8110800B8110700B7110700B71160000700
+600007006000070060000700600007006100070062000600590004004E0002
+00440101013F0300023A06000136080000330A00002705000B1A0101161200
+071A0C00101C06001A1D0201241C01022F1A00043C1800054C1600065D1400
+087014000886140006A3140006B3130006B2130007B2130007B2130008B213
+0008B212650005006500050065000500650005006500050063000400570002
+004C010002440500003F070000390A0000350C0000300E00002D100000220C
+000A140800140402001E00040B1D0008171A000B2316000E2F13000F3C1000
+104B0E00105D0D00126F0D0013840F0011A1110011B3110011B4100012B410
+0012B4100012B4100013B4105F0002005F0002005F0002005F0002005F0002
+00560100014B050000440800003D0B0000370E0000321000002D1200002914
+0000261600001C14000810110010010C011900100D16001419120017250E00
+18310A00193E07001A4D06001B5E06001D6F06001D8308001CA00C001BB60C
+001BB60C001BB60C001BB60C001BB60C001BB60C5505000055050000550500
+0055050000550500004B090000430C00003B0F0000351200002F1400002A16
+000027180000231A0000201C0000181C00040A19000C00170411001B100E00
+1F1B0A00222605002333010023400100224F0100235E0200236E0400238206
+00219D0A001FB90C0020B90C0020B90C0020B90C0020B90C0020B90C490D00
+00490D0000490D0000490D0000490D00004110000039130000321600002D18
+0000281B0000241D0000201F00001D2100001A22000011230001051E000800
+2107080024100700261A06002725030028300100283E0100284D0100285C02
+00286C040028800600279B090025BB0B0025BB0B0025BB0B0025BB0B0025BB
+0B0025BB0B3F1500003F1500003F1500003F1500003F15000037180000301A
+00002A1D0000261F0000212100001D2300001925000015260000122700000D
+280000042500070024050800280E07002A1806002B2204002D2E02002F3B01
+002F4A01002E5A02002F6B03002E7F05002D9A07002BBE08002BBE08002BBE
+08002BBE08002BBE08002BBE08351C0000351C0000351C0000351C0000351C
+00002E1F000028210000232400001E2600001928000015290000132A000013
+2A0000132B00000F2B0000062A00050029030A002D0C07002E160600302004
+00322B020036380100374702003658020036690300367E03003598040034C2
+040034C3040034C3040034C3040034C4040034C4042C2400002C2400002C24
+00002C2400002C24000026260000202900001B2B0000162C0000142D000014
+2E0000142E0000142F0000142F000010300000082F0004002D020B00310A08
+0034130600351D0500382803003C340200404402003F5502003F6802003F7C
+01003E9801003FC601003FCE01003FCE01003FCF01003FCF01003FCF01232B
+0000232B0000232B0000232B0000232B00001D2E0000173000001531000015
+3200001532000015330000153300001534000016340000123500000A350003
+0032000C0036080A003A1107003C1A06003E24040043310300474003004852
+030048660200497C00004998000049C9000048DD000048DD000049DE000049
+DE000049DE001A3400001A3400001A3400001A3400001A3400001635000016
+360000163600001637000017380000173800001739000017390000173A0000
+133B00000D3B00020238000C003C070C00410F080044180600462105004A2D
+04004E3B0500504E040052630300547A00005697000053C5000052E9000052
+E9000052E9000052EA000052EA00173A0000173A0000173A0000173A000017
+3A0000173B0000183C0000183C0000183D0000183E0000183E0000183F0000
+193F000019400000154100000F4200020440000B0043050D00490D09004D15
+06004F1E050053290500573706005A4906005C5F0300607700006293010060
+BB00005DED00005DED00005DEC00005EEC00005EEC00194100001941000019
+410000194100001941000019410000194200001A4300001A4400001A440000
+1A4500001A4600001A4600001A47000017480000124A0001074A000A004C03
+0E00520B0B00581307005C1C0500602605006333050065430600685904006C
+7100006E8C00006DB200006BEB00006BEC00006BEC00006BEC00006CEC001B
+4800001B4800001B4800001B4800001B4800001B4900001B4A00001B4A0000
+1B4B00001C4C00001C4D00001C4D00001C4E00001C4E000019510000145300
+000A5500080056010F005C080C00641008006B19050070230400722E030074
+3D0200765102007A6900007E8600007EAE00007CFF00007CFF00007DFF0000
+7DFF00007DFF001D5000001D5000001D5000001D5000001D5000001D510000
+1D5200001D5300001D5300001D5400001E5500001E5600001E5600001E5700
+001B5A0000165E00000E6000060362000D0068050C00700C09007914050080
+1D0300842801008635000088480000896100008F7F000092A600008DFD0000
+8DFF00008DFF00008DFF00008DFF001E5900001E5900001E5900001E590000
+1E5900001F5A00001F5B00001F5C00001F5D00001F5E00001F5F00001F5F00
+0020600000206100001D64000018690000116E0003087100090077010C0080
+070900890D060092150200981F00009B2C00009D3E0000A0570000A5770000
+AC9D0000A2DD0000A1FC0000A1FC0000A1FC0000A1FC002063000020630000
+20630000206300002063000020640000216600002167000021680000216900
+00216A0000216B0000216B0000216C00001F7000001B770000167E00000E84
+0003078C000700930109009C060500AA0B0200B7130000C21F0000C92F0000
+CE470000D8660000DD890000E0B70000D2F70000D3F80000D4F80000D4F900
+226F0000226F0000226F0000226F0000226F00002271000022720000227300
+00237500002376000023770000237800002378000023780000217C00001C84
+0000188C0000139400000E9C000009A5000002B0000300BE020200D4080000
+E8150000F8260000FF350000FF5C0000FF740000FF9C0000FFB20000FFB200
+00FFB20000FFB2002378000023780000237800002378000023780000237800
+00237800002378000023780000237800002378000023780000237800002378
+0000217C00001C840000188C0000139400000E9C000009A5000002AF000300
+BD020200D2070000E7140000F6240000FF330000FF580000FF6F0000FF9400
+00FFB20000FFB20000FFB20000FFB200>
+<41001300410013004100130041001300410013004100130041001300410013
+00410013004100130041001300410013004100130041001300400015003E00
+1C004000230042002A00490032004F003B00550047005A0056005C0066005C
+007800590090005800B1005E00F9005E00F9005E00F9005E00F9005E00F900
+5E00F9005E00F9004100130041001300410013004100130041001300410013
+00410013004100130041001300410013004100130041001300410013004100
+1300400015003E001C004000230042002A00490032004E003B00550047005A
+0055005C0066005C007800590090005800B0005E00F9005E00F9005E00F900
+5E00F9005E00F9005E00F9005E00F900410013004100130041001300410013
+00410013004100130041001300410013004100130041001300410013004100
+13004100130041001300400015003E001C004000230042002900490032004E
+003B0055004700590055005C0065005C00770059008F005800AE005E00F900
+5E00F9005E00F9005E00F9005E00F9005E00F9005E00F90041001300410013
+00410013004100130041001300410013004100130041001300410013004100
+130041001300410013004100130041001300400015003E001C004000230042
+002900490031004E003B0055004600590055005C0065005C00770059008E00
+5800AD005E00F9005E00F9005E00F9005E00F9005E00F9005E00F9005E00F9
+00410013004100130041001300410013004100130041001300410013004100
+1300410013004100130041001300410013004100130041001300400015003E
+001C004000230042002900490031004E003A0054004600590054005C006500
+5C0076005A008D005800AB005E00F7005E00F9005E00F9005E00F9005E00F9
+005E00F9005E00F90041001300410013004100130041001300410013004100
+13004100130041001300410013004100130041001300410013004100130041
+001300400015003E001C004000230042002900490031004E003A0054004600
+590054005C0064005C0076005A008C005800A9005E00F3005E00F9005E00F9
+005E00F9005E00F9005E00F9005E00F9004100130041001300410013004100
+13004100130041001300410013004100130041001300410013004100130041
+0013004100130041001300400015003E001C00400022004200290049003100
+4E003A0054004500590053005C0064005C0075005A008B005800A8005D00EB
+005E00FC005D00FF005C00FF005B00FF005A00FF005900FF00410013004100
+13004100130041001300410013004100130041001300410013004100130041
+00130041001300410013004100130041001300400015003F001C0040002200
+43002900490031004F003A00550045005A0053005C0063005A00750056008A
+005100A9005400EE005300FF005100FF005000FF004F00FF004E00FF004E00
+FF004100130041001300410013004100130041001300410013004100130041
+00130042001200420012004200120043001200430012004300120043001400
+41001B0042002200450028004A0030004E0039005100430053005100530062
+00510075004E008B004900AA004900E8004800FE004700FE004600FE004500
+FD004400FD004400FD00420012004200120042001200420012004200120043
+00120043001200440012004400110044001100450011004500110046001100
+460011004600130043001B00430021004200270044002E0045003600490041
+004A005000490061004800750045008D004100AA004000DF003E00F9003D00
+F8003C00F7003C00F7003B00F6003B00F60045001100450011004500110045
+00110045001100450011004600110046001000470010004700100047001000
+480010004800100049000F0047001200420018003E001F003D0025003D002C
+003E0034003F003E0040004E003F0060003E0074003C008C003900A8003700
+D6003500F0003400EF003300EE003300ED003200ED003200EC004800100048
+0010004800100048001000480010004800100049000F0049000F004A000F00
+4A000F004B000F004B000E004C000E0046000D0041000F003C00150037001B
+0333002108310028093500330336003E0034004D0033005E00320071003100
+88002F00A3002D00CB002C00E4002B00E3002A00E2002A00E1002900E00029
+00E0004B000E004B000E004B000E004B000E004B000E004B000E004C000E00
+4D000E004D000E004E000D004E000D004A000C0044000B003F000A003A000B
+00330010052D00160A29001D0E2600250F2700300B28003D0727004B042600
+5B0325006C022500810125009B012500BD002400D4002300D3002200D20021
+00D1002100D1002100D0004F000D004F000D004F000D004F000D004F000D00
+4F000D0050000C0051000C0051000C004F000B0047000A00410009003C0007
+0037000501310006032B000C092500120D200019111D0022111B002D0E1A00
+390C1800460A1700550A1600660916007909170090071800AF051900C50417
+00C5041700C4041600C3051500C3051500C20553000B0053000B0053000B00
+53000B0053000B0053000B0054000B0055000B004E000A00450008003F0006
+0038000401320002022E0001042B0102062200070C1C000D11170015131300
+1F130F0029120C00331109003F1007004D1006005D1105006F110500841007
+009F0E0800B60C0700B50C0600B40D0500B30D0500B30D0400B30D58000A00
+58000A0058000A0058000A0058000A0058000A00570009004C000700430005
+003B00030234010103300200032E0400022B06000125060005180101101000
+07150B00101705001A170201231600022D1400043912000648100007590E00
+086B0E00087F0E0007970E0006AF0E0007AF0E0007AF0D0008AF0D0008AF0D
+0008AF0D5800070058000700580007005800070058000700560007004B0005
+00400002023801000433040002300600012C090000290B0000250C0000200C
+00041308000F0402001900050B1800081714000B2210000D2D0D000F3A0A00
+0F48080010590700116A0700127D080011950A0010AF0B0010AF0A0011AF0A
+0011AF0A0011AF0A0012AF0A4A0003004A0003004A0003004A0003004A0003
+00480002003F02000339050001330800002F0B00002A0D0000260F00002211
+0000201300011A1300030E10000B000C011400100D100013190D0016240800
+172F0400183C0100184A00001859010018690300187C05001793090015B10B
+0015B10B0015B10B0015B10B0015B10B0015B10B4105000141050001410500
+0141050001410500013F06000038090000320C00002D0F0000281100002314
+0000201600001D1800001A190000151B0001091800070017040B001B100800
+1D1A06001D2404001D2E01001D3B00001C4900001C5701001C6703001C7905
+001B91090019B40C0019B50C0019B50C0019B50C0019B50C0019B50C390D00
+00390D0000390D0000390D0000390D0000370D0000301000002A1300002516
+0000211800001D1A00001A1C0000161E0000131F00000E1F0000061B000400
+1B0408001E0E08002017070021220400212C02002139000021470100215601
+002165030021780500208F08001EB30D001DB80C001DB80C001DB80C001DB8
+0C001EB80C30140000301400003014000030140000301400002E1500002817
+0000231A00001F1D00001A1F0000162100001222000011220000112300000F
+23000008210003001D020800220B070024150700251F0500262A0200263601
+0026450100265402002664030026760500268D070023B00B0023BA0B0023BA
+0B0023BA0B0023BB0B0023BB0B281B0000281B0000281B0000281B0000281B
+0000261C0000211F00001C2100001723000012250000122500001226000012
+26000012260000112700000A26000100210009002609080027120700291D05
+002B2703002C3401002D4201002C5202002D6203002D7404002C8B06002AAD
+090029BD090029BD090029BD090029BD09002ABD0920230000202300002023
+000020230000202300001F2300001926000014280000122800001229000013
+29000013290000132A0000132A0000122A00000C2B000102280008002A0709
+002D1007002E1A06003024030033300200363F0100354F0200356003003572
+0300348A040033AC050032C2050032C2050032C2050033C2050033C205172A
+0000172A0000172A0000172A0000172A0000162A0000132B0000132C000014
+2C0000142D0000142D0000142E0000142E0000142E0000132F00000E300000
+042E0007002E050A00330E070034170600362104003A2D03003E3B02003F4B
+02003E5D03003E7102003E8901003EAC01003ECD01003ECE01003ECE01003E
+CE01003ECE01142F0000142F0000142F0000142F0000142F0000142F000015
+30000015310000153100001532000015320000153300001533000016340000
+1534000010360000063400070033030C00380C08003B1506003D1E05004029
+04004536030048470300485A0300496F01004A8800004AAD000049DE000049
+DE000049DE000049DE000049DE001635000016350000163500001635000016
+35000016350000163600001637000016370000173800001738000017390000
+17390000173A0000173A0000123C0000093B0006003A020D003F0A0A004412
+0700451B0600482505004D3205005042050052560400546D01005687000056
+AA000053EA000053EB000053EB000053EB000053EB00183B0000183B000018
+3B0000183B0000183B0000183C0000183C0000183D0000183E0000183F0000
+193F000019400000194000001941000019410000144300000C430005014201
+0E0047080C004C1008005018060053220600572E06005A3D06005D51050061
+6901006383000064A4000060E9000060EB000060EB000060EA000060EA0019
+43000019430000194300001943000019430000194300001A4400001A450000
+1A4500001A4600001A4700001B4700001B4800001B4800001B490000164C00
+000F4D0004034C000D0050050D00570D0A005D160600621F0500652A050068
+3805006A4A05006E620200717C0000739C00006FCF000070F1000070F10000
+70F1000070F2001B4B00001B4B00001B4B00001B4B00001B4B00001B4B0000
+1C4C00001C4D00001C4E00001C4E00001C4F00001C5000001D5000001D5100
+001D51000018550000125800020759000A005C030E00630A0B006B12070073
+1B040077260300793202007B4201007D590100817400008596000083D30000
+82FF000082FF000082FF000082FF001D5400001D5400001D5400001D540000
+1D5400001D5400001E5500001E5600001E5700001E5800001E5800001E5900
+001F5A00001F5B00001F5B00001A5F0000156400010C670007016A010D0071
+060B007A0D0800831504008A1F02008D2A00008F39000091500000946B0000
+9B8F000098C0000094FF000094FF000094FF000095FF001F5E00001F5E0000
+1F5E00001F5E00001F5E00001F5E00001F5F00002060000020610000206200
+0020630000206400002065000021660000216600001C6C0000187200001077
+0004087C00080083010B008D060800960C0400A1140100A81F0000AC2D0000
+AD420000B45F0000BC840000BDAF0000B0F70000B0F70000B0F70000B1F700
+216A0000216A0000216A0000216A0000216A0000216A0000216B0000216D00
+00226E0000226F000022700000227100002272000022730000227400001F7B
+00001A830000158B0000109400000B9D000004A6000300B3010400C5040100
+DE0E0000EF1D0000FF2E0000FF4E0000FF6B0000FF8A0000FFB20000FFB200
+00FFB20000FFB2002378000023780000237800002378000023780000237800
+00237800002378000023780000237800002378000023780000237800002378
+0000237800001F7F00001B870000168F0000119700000CA0000006A9000101
+B5000300C5030100DD0D0000EE1C0000FE2C0000FF480000FF690000FF8300
+00FFB00000FFB20000FFB20000FFB200>
+<41001300410013004100130041001300410013004100130041001300410013
+00410013004100130041001300410013004100130041001300410013003F00
+19003F001F004100260046002D004C0036005200400057004E005B005E005C
+0070005B0086005800A3005C00E2005E00F9005E00F9005E00F9005E00F900
+5E00F9005E00F9004100130041001300410013004100130041001300410013
+00410013004100130041001300410013004100130041001300410013004100
+1300410013003F0019003F001F004100260046002D004B0035005200400057
+004D005B005D005C006F005B0085005800A2005B00DA005E00F9005E00F900
+5E00F9005E00F9005E00F9005E00F900410013004100130041001300410013
+00410013004100130041001300410013004100130041001300410013004100
+13004100130041001300410013003F0018003F001F004100260046002D004B
+0035005100400057004D005B005D005C006F005B0084005800A1005B00D400
+5E00F9005E00F9005E00F9005E00F9005E00F9005E00F90041001300410013
+00410013004100130041001300410013004100130041001300410013004100
+130041001300410013004100130041001300410013003F0018003F001F0041
+00260046002D004B0035005100400057004D005B005C005C006E005B008300
+58009F005A00D0005E00F9005E00F9005E00F9005E00F9005E00F9005E00F9
+00410013004100130041001300410013004100130041001300410013004100
+1300410013004100130041001300410013004100130041001300410013003F
+0018003F001F004100250046002D004B00350051003F0057004C005B005C00
+5C006E005B00820058009E005A00CC005E00F9005E00F9005E00F9005E00F9
+005E00F9005E00F90041001300410013004100130041001300410013004100
+13004100130041001300410013004100130041001300410013004100130041
+001300410013003F0018003F001F004100250045002D004B00350051003F00
+57004C005B005B005C006D005B00820058009D005A00C9005E00F9005E00F9
+005E00F9005E00F9005E00F9005E00F9004100130041001300410013004100
+13004100130041001300410013004100130041001300410013004100130041
+0013004100130041001300410013003F0018003F001E004100250045002D00
+4B00350051003F0057004C005B005B005C006C005B00810058009B005800C8
+005B00FF005900FF005800FF005700FF005600FF005500FF00410013004100
+13004100130041001300410013004100130041001300410013004100130041
+00130041001300410013004100130041001300410013003F0018003F001E00
+4100250045002C004B00340051003F0056004B0057005A0056006C00530081
+004E009D004D00CB004D00FF004C00FF004A00FE004900FE004900FE004800
+FD004100130041001300410013004100130041001300410013004100130041
+00130041001300410013004100130041001300410013004100130041001300
+3F0018003F001E004100250045002C00460033004B003D004D004A004C005A
+004B006D004900830045009E004200CA004100F9004000F8003F00F8003E00
+F7003D00F6003D00F600410013004100130041001300410013004100130041
+00130041001300410013004100130041001300410013004100130041001300
+41001300410013003F0018003D001E003C0024003C002B003E00320040003B
+004200490041005B0040006E003E0085003B00A0003900C7003600F2003500
+F1003400F1003400F0003300EF003200EF0041001300410013004100130041
+00130041001300410013004100130041001300410013004100130041001300
+4100130041001300410013003F0012003B00160037001C0035002300350029
+003600310037003B003700480036005A0035006E003300840031009F002F00
+C4002D00EA002C00EA002C00E9002B00E9002A00E8002A00E8004100130041
+00130041001300410013004100130041001300410013004200120042001200
+420012004300120043001200420011003D00100039000F0035001300310019
+022E001F052D0027052E0030022E003B002D0048002B0059002A006C002800
+810027009B002600BD002500E2002400E1002300E0002300DF002200DE0022
+00DE0044001200440012004400120044001200440012004400120044001100
+4500110045001100450011004500110040000F003B000E0037000D0033000B
+002E000F022A00150626001C092400240A24002E0724003A02230047012100
+57001F0067001E007A001E0092001E00B1001D00D4001C00D2001B00D1001B
+00D0001A00D0001A00CF004700100047001000470010004700100047001000
+4700100047001000480010004800100044000F003E000D0039000B0034000A
+00300008002C00070127000B05230011091E00180C1C00210C1A002B091800
+370716004305140051051300610512007304120088041300A2021400C30113
+00C2021200C1021100C0021000BF021000BE034B000F004B000F004B000F00
+4B000F004B000F004B000F004B000E004B000E0043000C003C000B00360009
+00310007012D0005022A000402250002031E0006071A000D0C1500140E1200
+1E0E0F00280C0B00310B09003C0B0600490B0400590C03006A0C03007D0B03
+00940A0500B2080400B1090300B0090200B0090200AF090201AF094F000D00
+4F000D004F000D004F000D004F000D004F000D004A000C0041000A003A0008
+00330006012E0004022A00020326010103210200031D0400031601010B0F00
+07100A001011050019120201221001022B0E0004360C0005450A0006550800
+0767080008780800078E080006AC080007AD080007AD070008AC070008AC07
+0008AC07440009004400090044000900440009004400090044000900400008
+0038000501300003022B00000429030003250500021F0700021D0900021B0B
+0002120800090302001500050C130008170E000A210B000C2C07000E370400
+0E4502000F5501000F6501000F7703000E8C05000CA807000CAC07000CAC07
+000CAC07000CAC07000CAC073A0003023A0003023A0003023A0003023A0003
+023A000302350002022F0100032C04000227070001220900011F0C00011B0E
+000218100002161100020D100006000D020E00100E0B001219070013220400
+132C010013370000134400001353000012630200127403001289060010A608
+000FAE08000FAE08000FAE08000FAE08000FAE083104000231040002310400
+023104000231040002310400022F0600012A090000250C0000200E00011D10
+000119130001161500011317000010180000071600020014040700160D0800
+1717070017210500172B020017360000164300001652000016610200167204
+001587070013A30A0013B00A0013B00A0013B00A0013B00A0013B00A2B0C00
+002B0C00002B0C00002B0C00002B0C00002B0C0000280D0000231000001F13
+00011B16000017180000131A00000F1A00000E1B00000E1B0000091A000100
+16020700190B08001A1507001B1F05001B2903001B3401001A4100001A5001
+001A5F02001A7004001A85070018A20B0017B30C0017B30C0017B30C0017B3
+0C0017B30C2413000024130000241300002413000024130000241300002115
+00001D180000181A0000141C00000F1D00000F1D00000F1E00000F1E00000F
+1E00000B1D000001190007001C0907001E1208001F1C060020260300203201
+001F3F00001F4E01001F5D02001F6E04001F8307001DA00B001BB70C001CB7
+0C001CB70C001CB70C001CB70C1D1B00001D1B00001D1B00001D1B00001D1B
+00001D1B00001A1C0000151F00001020000010200000102000001021000010
+21000010210000102200000D220000031C0005001E06070021100800231A06
+0024240400252F0100253D0100244C0100255B0200256C040025810600239D
+0A0021BA0C0021BA0C0021BA0C0021BA0C0021BA0C15220000152200001522
+00001522000015220000152200001222000011230000112300001124000011
+240000112500001125000012250000122600000E2600000624000500210408
+00260D070027170600292104002A2C02002C3A01002B4901002B5902002C6A
+03002B7F05002A9B080028BD0A0028BD0A0028BD090028BD090028BD091226
+00001226000012260000122600001226000012260000122700001227000012
+28000012280000122800001329000013290000132A0000132A0000102A0000
+082A00030027020A002B0B08002D1407002E1E050031290300343601003546
+01003457020034680300347D04003399050031C2050031C2050032C2050032
+C2050032C205132B0000132B0000132B0000132B0000132B0000132B000013
+2B0000132C0000132C0000142D0000142D0000142D0000142E0000142E0000
+142F0000112F00000B2F0002012D010A003008090033110600351B06003726
+03003B3202003F4102003F5302003E6602003E7B01003D9801003ECB01003E
+CE01003ECE01003ECE01003ECE011430000014300000143000001430000014
+30000014300000153000001531000015320000153200001533000015330000
+163400001634000016350000133500000D3600010233000A0036060B003B0F
+07003C1806003F220400432E0400473D0400494F0400496303004A7B00004B
+9900004ACF00004ADF00004ADF00004AE000004AE000163600001636000016
+36000016360000163600001636000016370000163700001738000017390000
+17390000173A0000173A0000173B0000183B0000153C00000F3D0001053B00
+0A003D050D00420D090046150600481E05004C29050050380500534A050055
+600300577900005A97000056C9000055EC000055EC000055EC000055EC0018
+3D0000183D0000183D0000183D0000183D0000183D0000183E0000183E0000
+193F0000194000001941000019410000194200001942000019430000174400
+0012460000084500080045030E004B0A0B0051120700551B0500582506005C
+3306005E440600615A0400657300006790000065B9000063E8000063E80000
+64E8000064E8001A4500001A4500001A4500001A4500001A4500001A450000
+1A4600001A4700001B4700001B4800001B4900001B4A00001B4A00001B4B00
+001C4B00001A4D0000154F00000C5100060151010F0057070C005E0F090064
+180600692204006C2E04006E3D040070520300746B00007889000077B50000
+76F9000076F9000076F9000076F9001C4E00001C4E00001C4E00001C4E0000
+1C4E00001C4E00001C4F00001C5000001D5000001D5100001D5200001D5300
+001D5300001D5400001E5500001C570000175A00000F5D0004045F000C0064
+040D006B0B0A00741306007C1D030080280100823500008348000085620000
+8B8100008DAD000089FF000089FF000089FF00008AFF001E5800001E580000
+1E5800001E5800001E5800001E5800001E5900001F5A00001F5B00001F5C00
+001F5D00001F5E00001F5E00001F5F0000206000001E6200001A670000136B
+00020A6F00080073000D007C060A00860D06008F140300961F0100992B0000
+9B3D00009D570000A3780000A9A200009FFA00009FFD00009FFC00009FFC00
+20640000206400002064000020640000206400002064000020650000216600
+00216700002168000021690000216A0000216B0000216C0000216D0000206F
+00001C760000177D000011840002098B000501920009009B040600A9090300
+B7110000C41D0000CD2D0000D4440000DD650000E28B0000F3E60000D9FC00
+00DAFD0000DBFD002272000022720000227200002272000022720000227200
+00227300002274000023750000237700002378000023780000237800002378
+000023780000227A00001D820000198A0000149200000F9A00000AA3000003
+AE000300BB010300CF060000E6130000F6240000FF340000FF5C0000FF7600
+00FF9F0000FFB20000FFB20000FFB200>
+<41001300410013004100130041001300410013004100130041001300410013
+00410013004100130041001300410013004100130041001300410013004000
+15003F001B004000220042002900490031004E003B00550047005A0056005C
+0068005C007B00580096005900C1005E00F9005E00F9005E00F9005E00F900
+5E00F9005E00F9004100130041001300410013004100130041001300410013
+00410013004100130041001300410013004100130041001300410013004100
+130041001300400015003F001B004000220042002900490031004E003A0055
+0047005A0056005C0067005C007B00590095005900BF005E00F9005E00F900
+5E00F9005E00F9005E00F9005E00F900410013004100130041001300410013
+00410013004100130041001300410013004100130041001300410013004100
+1300410013004100130041001300410014003F001B00400022004200290049
+0031004E003A00550046005A0055005C0067005C007A00590094005800BC00
+5E00F9005E00F9005E00F9005E00F9005E00F9005E00F90041001300410013
+00410013004100130041001300410013004100130041001300410013004100
+13004100130041001300410013004100130041001300410014003F001B0040
+00220042002900490031004E003A0055004600590055005C0066005C007900
+590093005800BA005E00F9005E00F9005E00F9005E00F9005E00F9005E00F9
+00410013004100130041001300410013004100130041001300410013004100
+13004100130041001300410013004100130041001300410013004100130041
+0014003F001B004000220042002800490031004E003A005400460059005500
+5C0066005C007900590092005800B7005E00F9005E00F9005E00F9005E00F9
+005E00F9005E00F90041001300410013004100130041001300410013004100
+13004100130041001300410013004100130041001300410013004100130041
+00130041001300410014003F001B004000220042002800490031004E003A00
+54004500590054005C0065005C007800590091005800B5005E00F9005E00F9
+005E00F9005E00F9005E00F9005E00FB004100130041001300410013004100
+13004100130041001300410013004100130041001300410013004100130041
+001300410013004100130041001300410014003F001B004000210042002800
+480030004E00390054004500590054005C0065005C007700570090005300B6
+005700FF005500FF005300FF005200FF005100FF005000FF00410013004100
+13004100130041001300410013004100130041001300410013004100130041
+0013004100130041001300410013004100130041001300410014003F001B00
+4000210042002800480030004D003900510044005300530053006400510079
+004C0091004900B7004900FE004700FD004600FC004500FB004400FB004300
+FB004100130041001300410013004100130041001300410013004100130041
+00130041001300410013004100130041001300410013004100130041001300
+410014003F001B00400021004000280041002F004400370048004200480052
+004700650046007A00420094003F00B7003D00F6003B00F5003A00F4003900
+F4003900F4003800F400410013004100130041001300410013004100130041
+00130041001300410013004100130041001300410013004100130041001300
+4100130041001300410014003B001A00390020003800260039002D003B0036
+003D0041003D0052003B0065003A007B00370095003400B7003200EE003100
+ED003000EC002F00EC002E00EB002E00EB0041001300410013004100130041
+00130041001300410013004100130041001300410013004100130041001300
+4100130041001300410013003D001200390012003500180032001E00310025
+0131002D003200360031004200300053002E0066002C007B002B0094002A00
+B5002800E6002700E6002600E5002500E5002500E4002400E4004100130041
+00130041001300410013004100130041001300410013004100130041001300
+4100130041001300410013003D0012003900110035001000310010002E0016
+002B001D02290023032A002D00290037002700440025005400230066002100
+7900200090002000AE001F00DA001E00DD001D00DC001D00DB001C00DB001C
+00DA0041001300410013004100130041001300410013004100130041001300
+4100130041001300410013003F0012003A0011003500100030000E002D000D
+002A000E002700140224001B042200230422002D01200038001E0045001B00
+5400190063001700750017008A001700A4001700CA001600D0001500CF0015
+00CE001400CD001400CC004100130041001300410013004100130041001300
+410013004100130041001300410013003B0011003600100031000E002D000D
+002A000B0027000A0024000A01200011041D0018061B00210619002B031600
+35021400400112004E0110005E010F006E010E0080010E0097000E00B6000D
+00BE000C00BC010C00BB010B00BA010B00B901430012004300120043001200
+43001200430012004300120043001200400011003A000F0034000D002F000C
+002B000A0027000801230007011E0006011B00060218000D07150015091200
+1E080F0027070B002F05090039050600460504005406020067060201770602
+018C050200A7050100AE050000AD050001AD050001AD050001AC053E000F00
+3E000F003E000F003E000F003E000F003E000F003E000F0039000D0032000B
+002D00090029000701230005021D0004031A00020317010102140101040E00
+070B0A00100C0500190B0300220A01012A0900033406000542040006500300
+06640200077401000787020006A1030006AB030006AB030006AB030006AB03
+0006AB0336000A0036000A0036000A0036000A0036000A0036000A0036000A
+00300008002B000602260004021D0002041901000317030002150500021307
+0003110800040202001100040D0C0007170800092105000B2A01000B340000
+0A4100000A5000000A6100000A7101000A840300089E040008AB040008AB04
+0008AB040008AB040008AB042D0004022D0004022D0004022D0004022D0004
+022D0004022D00040229000203200101031C0300031906000217080002140A
+0002110C00020F0E00020B100001000E0206000E0E07000E1706000E200400
+0E2902000E3300000D3F00000D4E00000D5E00000D6F02000D8204000B9A05
+000AAB06000AAB06000AAB06000AAB06000AAB062603000326030003260300
+0326030003260300032603000326030003200500021C080002190B0002150D
+0002121000020F1200010B1300000A1400000A1400000011010600110B0700
+11150700111E05001127020011310000113D0000114C0000115B0100106C02
+00107F04000F9707000DAD07000DAD07000DAD07000DAD07000DAD071F0A00
+011F0A00011F0A00011F0A00011F0A00011F0A00011F0A00011B0D00021710
+000213130001101500000B1600000B1600000B1600000C1700000B17000002
+130006001408080015120700151C06001525030015300100153C0000144A00
+0014590100146A0300147D05001395080011AF090011AF090011AF090011AF
+090011AF091912000119120001191200011912000119120001191200011912
+000116150001111700000C1800000D1900000D1900000D1900000D1A00000D
+1A00000D1A000004170004001706070018100800191A06001A2304001A2E01
+00193A0000194800001857010019670300187A05001793090015B10B0015B2
+0B0015B20B0015B20B0015B20B121A0000121A0000121A0000121A0000121A
+0000121A0000121A00000E1B00000E1B00000E1C00000E1C00000E1C00000E
+1D00000F1D00000F1D00000F1D0000071A000300190307001B0D08001D1707
+001E2105001E2B02001E3800001D4600001D5501001E6503001E7805001D90
+09001AB60C001AB60C001AB60C001AB60C001AB60C0F1E00000F1E00000F1E
+00000F1E00000F1E00000F1E00000F1E00000F1E00000F1F0000101F000010
+200000102000001020000010210000102100001021000009200001001B0108
+001F0A070021140700231E0500232902002435010023430100235301002463
+030024750500238E080020B40C0020B90C0020B90C0020BA0C0020BA0C1122
+00001122000011220000112200001122000011220000112200001122000011
+23000011230000112400001124000011240000112500001125000012250000
+0C25000002200008002308080026110700281B0600292603002A3201002B41
+01002A5102002B6103002B7304002A8C060028B10A0027BC0A0027BC0A0027
+BC0A0027BC0A12260000122600001226000012260000122600001226000012
+26000012270000122700001228000012280000122900001329000013290000
+132A0000132A00000E2B00000428000700290509002C0E07002D1806002F22
+0400322E0200353D0100344D0200345E020034710300338A040032AE050031
+C2050031C2050032C2050032C205132B0000132B0000132B0000132B000013
+2B0000132B0000132B0000132C0000132C0000142D0000142D0000142E0000
+142E0000142E0000142F0000142F00000F300000072F0005002E030B00320C
+080034150600361F0500392A03003E380200404902003F5B03003F6F02003F
+88010040AF01003FCF01003FCF01003FCF01003FCF01153100001531000015
+31000015310000153100001531000015310000153100001532000015330000
+153300001634000016340000163500001635000016360000123700000A3600
+040034010C0039090A003D1206003E1B050041260400463304004A4304004A
+5803004B6E01004D8800004DB000004BE200004BE200004BE200004BE20017
+38000017380000173800001738000017380000173800001738000017380000
+17390000173A0000173A0000173B0000183C0000183C0000183D0000183D00
+00143F00000D3F0003023D010C0040070C00460F0800491806004C22050050
+2E0500543E060056520500596B01005C8500005CAA000058EC000058EC0000
+58EC000059EC00194000001940000019400000194000001940000019400000
+19400000194000001941000019420000194300001A4300001A4400001A4400
+001A4500001A45000016470000104900020548000C004B050E00510D0A0057
+1507005B1F05005E29060061380600644B0500686402006B7F00006CA20000
+68E8000068E8000069E8000069E8001B4900001B4900001B4900001B490000
+1B4900001B4900001B4900001B4900001B4A00001B4B00001C4C00001C4C00
+001C4D00001C4E00001C4E00001C4F00001951000013540001095500090057
+020F005E090B00661108006D1B0500712503007432030076430200785A0100
+7D7600007F9A00007DE600007DFF00007DFF00007EFF001D5200001D520000
+1D5200001D5200001D5200001D5200001D5200001D5300001D5400001E5500
+001E5600001E5700001E5800001E5800001E5900001E5A00001B5D00001661
+00000D6400060267000D006D050C00760C08007F140500861E02008A2A0000
+8C3900008D500000916C00009893000093CF000092FF000092FF000092FF00
+1F5E00001F5E00001F5E00001F5E00001F5E00001F5E00001F5E00001F5F00
+00206000002061000020620000206300002064000020650000206500002166
+00001E6A000019700000127500030A7B00070181010B008B050800940B0500
+9F130200A71D0000AC2C0000AC400000B45F0000BD870000BCBA0000B0F700
+00B0F70000B0F700216C0000216C0000216C0000216C0000216C0000216C00
+00216C0000216D0000226E0000226F00002270000022710000227200002273
+00002374000023750000207A00001B830000178B0000129500000D9E000007
+A8000101B3000400C3030100DC0C0000ED1B0000FE2C0000FF4E0000FF6C00
+00FF910000FFB20000FFB20000FFB200>
+<41001300410013004100130041001300410013004100130041001300410013
+00410013004100130041001300410013004100130041001300410013004100
+13003F0018003F001E004100250046002D004B0035005200400058004E005B
+005F005C0073005A008B005800AE005E00F9005E00F9005E00F9005E00F900
+5E00F9005E00F9004100130041001300410013004100130041001300410013
+00410013004100130041001300410013004100130041001300410013004100
+130041001300410013003F0018003F001E004100250045002D004B00350051
+00400057004E005B005F005C0072005A008A005800AC005E00F9005E00F900
+5E00F9005E00F9005E00F9005E00F900410013004100130041001300410013
+00410013004100130041001300410013004100130041001300410013004100
+1300410013004100130041001300410013003F0017003F001E004100250045
+002D004B0035005100400057004D005B005E005C0071005A0089005800AA00
+5E00F9005E00F9005E00F9005E00F9005E00F9005E00F90041001300410013
+00410013004100130041001300410013004100130041001300410013004100
+13004100130041001300410013004100130041001300410013003F0017003F
+001E004100250045002C004B00350051003F0057004D005B005D005C007100
+5A0088005800A8005E00F9005E00F9005E00F9005E00F9005E00F9005E00F9
+00410013004100130041001300410013004100130041001300410013004100
+13004100130041001300410013004100130041001300410013004100130041
+001300400017003F001E004100250045002C004B00350051003F0057004D00
+5B005D005C0070005A0087005800A7005E00F9005E00F9005E00F9005E00F9
+005E00F9005E00F90041001300410013004100130041001300410013004100
+13004100130041001300410013004100130041001300410013004100130041
+0013004100130041001300400017003F001E004100250045002C004B003400
+51003F0057004C005B005C005C006F005B0086005800A5005E00F5005E00F9
+005E00FF005D00FF005B00FF005A00FF004100130041001300410013004100
+13004100130041001300410013004100130041001300410013004100130041
+00130041001300410013004100130041001300400017003F001E0040002500
+44002C004B00340051003F0057004C005B005C0059006E00550085005000A7
+005200F5005000FF004F00FF004D00FF004C00FF004B00FF00410013004100
+13004100130041001300410013004100130041001300410013004100130041
+00130041001300410013004100130041001300410013004100130040001700
+3F001D004000240044002C00490034004C003D004F004B004E005B004D006F
+004A0087004600A8004400E9004300FA004100F9004000F9003F00F8003E00
+F7004100130041001300410013004100130041001300410013004100130041
+00130041001300410013004100130041001300410013004100130041001300
+41001300400017003E001D003C0024003D002A003F00320041003B0043004A
+0042005C00410071003F008A003B00A9003900E0003700F3003500F2003400
+F1003400F0003300EF00410013004100130041001300410013004100130041
+00130041001300410013004100130041001300410013004100130041001300
+4100130041001300400012003B00160037001C003500220035002900360031
+0036003B003700490036005D003400710031008A002F00A9002D00D8002C00
+EA002B00E9002A00E9002900E8002900E80041001300410013004100130041
+00130041001300410013004100130041001300410013004100130041001300
+41001300410013003F0012003B001100370010003300140030001A002D0020
+022D0028012D0031002C003C002A004B0029005D0027007100250088002400
+A6002300CF002200E2002100E1002100E1002000E0002000DF004100130041
+00130041001300410013004100130041001300410013004100130041001300
+4100130041001300400012003B0011003600100032000F002F000E002C0011
+002900180226001F04250027022500320023003E0020004C001E005D001C00
+6F001B0084001A009E001A00C3001900D7001900D5001800D4001700D30017
+00D30041001300410013004100130041001300410013004100130041001300
+4100130041001300410013003C0011003700100032000F002E000E002B000D
+0028000C0025000F01220017041F001E051E0027021C0032001A003E001700
+4B0015005B0013006B0011007E00110095001100B4001100C8001000C6000F
+00C5000F00C4000E00C3004100130041001300410013004100130041001300
+4100130041001300410013003F0012003900110033000F002E000E002A000D
+0027000C0024000B0021000A001E000D021B00150418001E04170027011400
+310011003B000E0048000C0057000B0068000900780008008C000800A70008
+00B7000700B5000600B4000600B3000500B2003C0011003C0011003C001100
+3C0011003C0011003C0011003C0011003B001100350010002F000E002B000D
+0027000C0023000A001F0009001C0008001900070016000B03130014051100
+1D030E0026010C002E00090037000600440004005000020064000200730001
+01850100019F010001AC010002AC000002AC000002AC000002AC0032000F00
+32000F0032000F0032000F0032000F0032000F0032000F0031000F002C000D
+0028000C0023000A001F0009001B0007001700060114000401110003010E00
+0704090011060600190403002103010029030002310100033E0000034C0000
+036100000370000003810000039A010003AB010003AB010003AB010003AB01
+0003AB012B000B002B000B002B000B002B000B002B000B002B000B002B000B
+002A000B00250009011F0007011A0005011600030212000202100101020F03
+00020D0400020101000D00030F040005160300051F02000528010005300000
+053B0000054B0000055E0000066D0000067E01000596010004AB020004AB02
+0004AB020004AB020004AB0222000601220006012200060122000601220006
+012200060122000601200006021A0003021601010213020003110400020F06
+00020C090002070D0001060E0000010D010300090C050008140500081D0300
+08260200082F0000083A00000849000008590000086A0000087B0100079103
+0006AB030006AB030006AB030006AB030006AB031801010318010103180101
+03180101031801010318010103180101031802010315040002120700030E0A
+00030B0D000207100000071000000710000007100000030F0002000D090600
+0C1306000C1B04000C2402000C2D01000C3800000B4600000B5600000B6701
+000B7902000A8F040009AB050009AB050009AB050009AB050009AB05150900
+0315090003150900031509000315090003150900031509000314090003100D
+00020C10000108120000091200000912000009120000091200000913000005
+11000200100606000F1007000F1A060010230300102C01000F3700000F4400
+000F5400000F6401000F7603000E8B05000CA906000CAC06000CAC07000CAC
+07000CAC070F1200010F1200010F1200010F1200010F1200010F1200010F12
+00010E1200010A1400000A1400000A1400000A1500000B1500000B1500000B
+1500000B160000071400020012030600130D08001317070014210500142A02
+0013350000134200001351000013610100137303001289060010A708000FAE
+08000FAE09000FAE090010AE090B1600000B1600000B1600000B1600000B16
+00000B1600000B1600000B1600000C1700000C1700000C1800000C1800000C
+1800000D1800000D1900000D1900000A1800010115010700160A0800181407
+00181E0500182803001833010018400000174F0000175F0200177004001786
+070015A40A0014B00A0014B00B0014B00B0014B00B0D1A00000D1A00000D1A
+00000D1A00000D1A00000D1A00000D1A00000D1A00000E1A00000E1B00000E
+1B00000E1B00000E1C00000E1C00000E1C00000E1D00000C1C000002180006
+001A0807001B1108001D1B06001D2503001D3101001D3E00001C4D01001C5D
+02001C6E04001C8307001AA20B0019B50C0019B50C0019B50C0019B50C0F1E
+00000F1E00000F1E00000F1E00000F1E00000F1E00000F1E00000F1E00000F
+1E00000F1F00000F1F0000101F000010200000102000001020000010210000
+0E210000051C0004001C050800200E08002218060023230400232E0200233B
+0000224A0100235A0200236B040023810600219F0A001FB90C001FB90C001F
+B90C001FB90C10220000102200001022000010220000102200001022000010
+22000011220000112200001123000011230000112400001124000011240000
+112500001125000010250000082400030020020900250B0700261507002820
+05002A2B02002B3801002A4801002A5802002B6903002B7E0500299C080027
+BC0A0027BC0A0027BC0A0027BC0A1227000012270000122700001227000012
+27000012270000122700001227000012270000122800001228000012290000
+1329000013290000132A0000132A0000112A00000B2B000202280109002B08
+08002D1207002E1C0500302703003334020036430100355502003567030035
+7C0300339A040032C2050032C2050032C2050032C205132C0000132C000013
+2C0000132C0000132C0000132C0000132C0000132C0000142C0000142D0000
+142E0000142E0000142E0000142F0000142F000014300000133000000D3100
+01032F00090030060A00350F070036180600382304003C2F0300413E020041
+50030040640300417B0100409A010041D1010041D2010041D2010041D20115
+32000015320000153200001532000015320000153200001532000015320000
+15330000163400001634000016350000163500001636000016360000163700
+001538000010390000063700080037040C003C0C090040150600411F050045
+2A04004A3904004C4B04004D6103004F7A0000519A00004ED800004EE50000
+4EE500004EE500173A0000173A0000173A0000173A0000173A0000173A0000
+173A0000173A0000173B0000183B0000183C0000183D0000183D0000183E00
+00183F0000193F00001840000012410000094100070040020E00450A0B004B
+1207004E1B05005125050055330600584506005B5B04005F76000061950100
+5DC900005CEC00005DEC00005DEC0019430000194300001943000019430000
+194300001943000019430000194300001A4400001A4400001A4500001A4600
+001A4700001B4700001B4800001B4800001A490000154C00000D4D0005014C
+000F0051070D00580F09005E18060062220500662E0500683D05006B530400
+6F6D0000728C000070BB00006FF0000070F1000070F1001C4C00001C4C0000
+1C4C00001C4C00001C4C00001C4C00001C4C00001C4D00001C4E00001C4E00
+001C4F00001D5000001D5100001D5100001D5200001D5300001D5400001857
+0000115A0003065C000B0060040E00670B0A0070130700771D04007C280200
+7E3501007F480000826300008784000088B6000085FF000086FF000086FF00
+1E5800001E5800001E5800001E5800001E5800001E5800001E5800001E5800
+001E5900001F5A00001F5B00001F5C00001F5D00001F5D00001F5E00001F5F
+00001F6000001B650000156A00010C6D00070271000D0079050B00830C0700
+8D140300941E0100972B0000993C00009C570000A27A0000A6AA00009DFD00
+009DFD00009DFD002065000020650000206500002065000020650000206500
+002065000020650000216600002168000021690000216A0000216B0000216C
+0000216C0000226D0000226E00001D750000187C0000138400010C8B000403
+930007009B030600A9080300B80E0000C61A0000D22A0000E1410000E66400
+00E98C0000E3FF0000E1FF0000E1FF00>
+<41001300410013004100130041001300410013004100130041001300410013
+00410013004100130041001300410013004100130041001300410013004100
+1300410014003F001B004000210042002800490031004E003A00550047005A
+0057005C0069005B00800058009F005D00E7005E00F9005E00F9005E00F900
+5E00F9005E00F9004100130041001300410013004100130041001300410013
+00410013004100130041001300410013004100130041001300410013004100
+13004100130041001300410014003F001B004000210042002800490031004E
+003A00550047005A0057005C0069005B007F0058009D005C00DD005E00F900
+5E00F9005E00F9005E00F9005E00F900410013004100130041001300410013
+00410013004100130041001300410013004100130041001300410013004100
+130041001300410013004100130041001300410014003F001A004000210042
+002800490031004E003A00550047005A0056005C0068005C007E0058009C00
+5B00D4005E00F9005E00F9005E00F9005E00F9005E00F90041001300410013
+00410013004100130041001300410013004100130041001300410013004100
+1300410013004100130041001300410013004100130041001300410014003F
+001A003F00210042002800480030004E003A00550046005A0056005C006800
+5C007D0058009B005A00D0005E00F9005E00F9005E00F9005E00F9005E00F9
+00410013004100130041001300410013004100130041001300410013004100
+13004100130041001300410013004100130041001300410013004100130041
+001300410013003F001A003F00210042002800480030004E00390054004600
+5A0055005C0067005C007C00580099005A00CB005E00F9005E00F9005E00F9
+005E00F9005E00F90041001300410013004100130041001300410013004100
+13004100130041001300410013004100130041001300410013004100130041
+0013004100130041001300410013003F001A003F0021004200280048003000
+4D00390054004500590055005C0067005C007B00580098005900C8005C00FF
+005A00FF005800FF005600FF005500FF004100130041001300410013004100
+13004100130041001300410013004100130041001300410013004100130041
+00130041001300410013004100130041001300410013003F001A003F002100
+42002800480030004D00390054004500560054005600660053007C004D0099
+004C00CC004C00FF004A00FE004800FD004700FD004600FC00410013004100
+13004100130041001300410013004100130041001300410013004100130041
+00130041001300410013004100130041001300410013004100130041001300
+3F001A003F0020004100270042002E00450037004A0043004A005400490067
+0047007E0043009B004000CA003E00F7003C00F5003B00F5003A00F5003A00
+F4004100130041001300410013004100130041001300410013004100130041
+00130041001300410013004100130041001300410013004100130041001300
+41001300410013003C0019003A001F00380026003A002D003C0036003E0042
+003E0053003C0068003A00800037009C003400C7003200EE003100ED003000
+EC002F00EC002E00EB00410013004100130041001300410013004100130041
+00130041001300410013004100130041001300410013004100130041001300
+41001300410013003D0012003A0011003500170032001E003000240131002C
+003100360031004200300054002E0068002C007F002A009B002900C3002700
+E6002600E5002500E4002500E4002400E30041001300410013004100130041
+00130041001300410013004100130041001300410013004100130041001300
+41001300410013003D0012003900110034000F0031000F002E0015002A001C
+022800230429002C012800370026004400240055002100670020007C001F00
+96001E00BB001E00DD001D00DB001C00DA001B00D9001B00D8004100130041
+00130041001300410013004100130041001300410013004100130041001300
+41001300410013003E0012003900110034000F0030000E002C000D0029000D
+002600130123001A042100220421002C011E0038001C004500190055001700
+65001500780015008F001500AE001500CF001400CD001300CC001200CB0012
+00CA0041001300410013004100130041001300410013004100130041001300
+4100130041001300400012003A00110034000F0030000E002C000D0028000C
+0025000B0022000A001F0011031C0019041A00220319002C00160037001300
+4300100052000E0062000D0073000C0087000B00A1000B00BD000A00BC000A
+00BA000900B9000900B8004000120040001200400012004000120040001200
+4000120040001200400012003C0011003600100030000E002C000D0028000C
+0024000B0021000A001D0009001A0008001700100415001804120022021000
+2B000D0034000A003F0008004D0006005E0005006E0003007F000200980002
+00AE000201AD000101AD000101AD000101AC00350010003500100035001000
+350010003500100035001000350010003500100032000F002D000D0028000C
+0024000B0020000A001C0008001800070015000600130005000F000E040C00
+18030A0020020700280004002F00020039000100480000015B0000016C0000
+017C00000295000001AC000001AC000001AC000001AC000001AC002C000D00
+2C000D002C000D002C000D002C000D002C000D002C000D002C000D0029000C
+0025000B0020000A001B0008001700070014000600110004000F0003000D00
+020006000E020300150101001D000000260000002D00000037000001470000
+015A0000016B0000017B00000293000001AB000001AC000001AC000001AC00
+0001AC0024000B0024000B0024000B0024000B0024000B0024000B0024000B
+0024000B0021000A001C0008001700070013000500100004000E0002000C00
+0100060000000000000000000E000000140000001D000000250000002C0000
+013600000146000001590000016A000002790000028F000002A9000002AC00
+0002AC000002AC000002AC001A0008001A0008001A0008001A0008001A0008
+001A0008001A0008001A0008001800070013000501100003010E0102010B02
+00010204000002050000020600000206000000030C020003120200031B0100
+03240100032B00000335000003440000045300000467000004760000048B00
+0003A6010003AB010003AB010003AB010003AB011100020211000202110002
+021100020211000202110002021100020211000202100101020E0300010905
+0002040B0000040C0000040C0000040D0000040D0000050D00000009070300
+061104000619030006220200062A0100063400000641000007500000076300
+00077401000687010005A3020005AB020005AB020005AB020005AB020C0700
+020C0700020C0700020C0700020C0700020C0700020C0700020C0700020A0A
+0002050E0000050E0000060E0000060F0000060F0000060F0000060F000007
+0F0000000D0304000A0E06000A1705000A2003000A2901000A3200000A3F00
+000A4E00000A6000000A71010009840300089F040007AB040007AB040007AB
+040007AB040710000007100000071000000710000007100000071000000710
+00000710000007100000071000000810000008110000081100000811000008
+110000081200000912000001100104000E0B07000E1506000E1E04000E2702
+000E3100000E3D00000D4B00000D5C00000D6D02000D8104000B9A05000AAB
+06000AAB06000AAB06000AAB06091200000912000009120000091200000912
+000009120000091200000912000009130000091300000A1300000A1300000A
+1400000A1400000A1400000A1500000B150000031200040012080700121207
+00121C060012250300122F0100123B00001249000011590100116A0200117E
+0400109707000EAD08000EAD08000EAD08000EAD080B1600000B1600000B16
+00000B1600000B1600000B1600000B1600000B1600000B1600000B1600000C
+1700000C1700000C1700000C1800000C1800000C1800000C18000006160003
+0015050700160F08001719060017230400172D020017390000164700001656
+010016670200167B05001594080013B00A0013B00A0013B00A0013B00A0D19
+00000D1900000D1900000D1900000D1900000D1900000D1900000D1900000D
+1A00000D1A00000E1A00000E1B00000E1B00000E1B00000E1C00000E1C0000
+0E1C0000081A000100180207001A0B08001C1607001D2005001D2A02001C36
+00001C4400001C5401001C6403001C7805001B91090018B40C0018B40C0018
+B40C0018B40C0F1D00000F1D00000F1D00000F1D00000F1D00000F1D00000F
+1D00000F1D00000F1E00000F1E00000F1F00000F1F0000101F000010200000
+1020000010200000102000000B200001021B0107001E09070020120700221D
+0500232703002334010022420100225201002262030023750500228F08001F
+B90D001FB90D001FB90C001FB90C1122000011220000112200001122000011
+22000011220000112200001122000011220000112300001123000011240000
+11240000112400001125000011250000122500000D26000004220006002205
+0800260F070027190600292404002A3002002B3E01002A4F01002B6002002B
+7204002A8C060028B50A0027BC0A0027BC0A0028BC0A122700001227000012
+27000012270000122700001227000012270000122700001228000012280000
+122800001329000013290000132A0000132A0000132A0000132B00000F2B00
+00072A00040028030A002D0C07002E15060030200400322C0200363A010037
+4A0200365C020036700300358A030034B2040034C3050034C3040034C30414
+2D0000142D0000142D0000142D0000142D0000142D0000142D0000142D0000
+142D0000142E0000142E0000142F0000142F00001430000015300000153100
+0015310000123200000A320003002F000C003309090037120600381C05003B
+270400403403004445030043590300436E02004389000045B5000044D60000
+44D6000044D600163400001634000016340000163400001634000016340000
+16340000163400001634000016350000163600001636000016370000173800
+00173800001739000017390000143A00000E3B00010238000C003B060C0040
+0F080043180600452205004A2F04004E3F050050530400526B020054870000
+54B2000051E8000051E9000051E900183D0000183D0000183D0000183D0000
+183D0000183D0000183D0000183D0000183D0000183E0000183E0000193F00
+00194000001940000019410000194200001942000017430000114500010644
+000A0045040E004B0C0A0051150700541E0500572906005B3806005E4C0500
+626602006582000065A8000062E9000062E9000062E9001A4600001A460000
+1A4600001A4600001A4600001A4600001A4600001A4600001A4700001B4800
+001B4800001B4900001B4A00001B4B00001B4B00001C4C00001C4C0000194E
+0000145100000A5200080053020F0059080C0061110800681A05006C250400
+6F32040070430300745C0200787900007A9F000078FC000078FC000079FC00
+1D5100001D5100001D5100001D5100001D5100001D5100001D5100001D5100
+001D5200001D5300001D5400001D5500001E5500001E5600001E5700001E58
+00001E5800001C5A0000175F00000F6200050464000C006A040D00720B0900
+7C140500831E030087290100893800008B5000008E6E0000959700008FEC00
+008FFF00008FFF001F5E00001F5E00001F5E00001F5E00001F5E00001F5E00
+001F5E00001F5E00001F5F0000206000002061000020620000206300002064
+00002065000020650000216600001F6900001A6F0000147500020C7A000603
+80000A0089040900930A05009E110200A71C0000AC2A0000AC3F0000B55F00
+00BE8A0000B9CD0000B0F70000B1F700>
+] 4 { dup 0.1 lt { 1.2 mul 0.02 sub } if
+ dup 0 lt { pop 0 } if
+ } bind dup dup dup ]
+/RenderingIntent (Perceptual)
+>>
+setcolorrendering
diff --git a/crd/2300w-1200@150-l250-kx,ucr125,75-per.crd b/crd/2300w-1200@150-l250-kx,ucr125,75-per.crd
new file mode 100644
index 0000000..562eb94
--- /dev/null
+++ b/crd/2300w-1200@150-l250-kx,ucr125,75-per.crd
@@ -0,0 +1,4684 @@
+<<
+/ColorRenderingType 1
+/BlackPoint [0.000000 0.000000 0.000000]
+/WhitePoint [0.964200 1.000000 0.824900]
+% Bradford Cone Space
+/MatrixPQR [0.8951 -0.7502 0.0389 0.2664 1.7135 -0.0685 -0.1614 0.0367 1.0296 ]
+/RangePQR [ -0.5 2 -0.5 2 -0.5 2 ]
+% VonKries-like transform in Bradford Cone Space
+/TransformPQR [
+{exch pop exch 3 get mul exch pop exch 3 get div} bind
+{exch pop exch 4 get mul exch pop exch 4 get div} bind
+{exch pop exch 5 get mul exch pop exch 5 get div} bind
+]
+/EncodeLMN [
+{ 0.964200 div dup 0.008856 le {7.787 mul 16 116 div add}{1 3 div exp} ifelse } bind
+{ 1.000000 div dup 0.008856 le {7.787 mul 16 116 div add}{1 3 div exp} ifelse } bind
+{ 0.824900 div dup 0.008856 le {7.787 mul 16 116 div add}{1 3 div exp} ifelse } bind
+]
+/MatrixABC [ 0 1 0 1 -1 1 0 0 -1 ]
+/EncodeABC [
+{ 116 mul 16 sub 100 div } bind
+{ 500 mul 128 add 255 div } bind
+{ 200 mul 128 add 255 div } bind
+]
+/RenderTable [ 33 33 33 [
+<7A3600C67A3600C67A3600C67A3600C67A3600C67A3600C67A3600C67A3600
+C67A3600C67A3600C67A3600C67A3600C67A3600C67A3600C67A3600C67A36
+00C67A3600C67A3600C67A3600C67A3600C67A3600C67A3600C67A3600C67A
+3600C67A3600C67A3600C67A3600C67A3600C67A3600C67A3600C67A3600C6
+7A3600C67A3600C67A3600C67A3600C67A3600C67A3600C67A3600C67A3600
+C67A3600C67A3600C67A3600C67A3600C67A3600C67A3600C67A3600C67A36
+00C67A3600C67A3600C67A3600C67A3600C67A3600C67A3600C67A3600C67A
+3600C67A3600C67A3600C67A3600C67A3600C67A3600C67A3600C67A3600C6
+7A3600C67A3600C67A3600C67A3600C67A3600C67A3600C67A3600C67A3600
+C67A3600C67A3600C67A3600C67A3600C67A3600C67A3600C67A3600C67A36
+00C67A3600C67A3600C67A3600C67A3600C67A3600C67A3600C67A3600C67A
+3600C67A3600C67A3600C67A3600C67A3600C67A3600C67A3600C67A3600C6
+7A3600C67A3600C67A3600C67A3600C67A3600C67A3600C67A3600C67A3600
+C67A3600C67A3600C67A3600C67A3600C67A3600C67A3600C67A3600C67A36
+00C67A3600C67A3600C67A3600C67A3600C67A3600C67A3600C67A3600C67A
+3600C67A3600C67A3600C67A3600C67A3600C67A3600C67A3600C67A3600C6
+7A3600C67A3600C67A3600C67A3600C67A3600C67A3600C67A3600C67A3600
+C67A3600C67A3600C67A3600C67A3600C67A3600C67A3600C67A3600C67A36
+00C67A3600C67A3600C67A3600C67A3600C67A3600C67A3600C67A3600C67A
+3600C67A3600C67A3600C67A3600C67A3600C67A3600C67A3600C67A3600C6
+7A3600C67A3600C67A3600C67A3600C67A3600C67A3600C67A3600C67A3600
+C67A3600C67A3600C67A3600C67A3600C67A3600C67A3600C67A3600C67A36
+00C67A3600C67A3600C67A3600C67A3600C67A3600C67A3600C67A3600C67A
+3600C67A3600C67A3600C67A3600C67A3600C67A3600C67A3600C67A3600C6
+7A3600C67A3600C67A3600C67A3600C67A3600C67A3600C67A3600C67A3600
+C67A3600C67A3600C67A3600C67A3600C67A3600C67A3600C67A3600C67A36
+00C67A3600C67A3600C67A3600C67A3600C67A3600C67A3600C67A3600C67A
+3600C67A3600C67A3600C67A3600C67A3600C67A3600C67A3600C67A3600C6
+7A3600C67A3600C67A3600C67A3600C67A3600C67A3600C67A3600C67A3600
+C67A3600C67A3600C67A3600C67A3600C67A3600C67A3600C67A3600C67A36
+00C67A3600C67A3600C67A3600C67A3600C67A3600C67A3600C67A3600C67A
+3600C67A3600C67A3600C67A3600C67A3600C67A3600C67A3600C67A3600C6
+7A3600C67A3600C67A3600C67A3600C67A3600C67A3600C67A3600C67A3600
+C67A3600C67A3600C67A3600C67A3600C67A3600C67A3600C67A3600C67A36
+00C67A3600C67A3600C67A3600C67A3600C67A3600C67A3600C67A3600C67A
+3600C67A3600C67A3600C67A3600C67A3600C67A3600C67A3600C67A3600C6
+7A3600C67A3600C67A3600C67A3600C67A3600C67A3600C67A3600C67A3600
+C67A3600C67A3600C67A3600C67A3600C67A3600C67A3600C67A3600C67A36
+00C67A3600C67A3600C67A3600C67A3600C67A3600C67A3600C67A3600C67A
+3600C67A3600C67A3600C67A3600C67A3600C67A3600C67A3600C67A3600C6
+7A3600C67A3600C67A3600C67A3600C67A3600C67A3600C67A3600C67A3600
+C67A3600C67A3600C67A3600C67A3600C67A3600C67A3600C67A3600C67A36
+00C67A3600C67A3600C67A3600C67A3600C67A3600C67A3600C67A3600C67A
+3600C67A3600C67A3600C67A3600C67A3600C67A3600C67A3600C67A3600C6
+7A3600C67A3600C67A3600C67A3600C67A3600C67A3600C67A3600C67A3600
+C67A3600C67A3600C67A3600C67A3600C67A3600C67A3600C67A3600C67A36
+00C67A3600C67A3600C67A3600C67A3600C67A3600C67A3600C67A3600C67A
+3600C67A3600C67A3600C67A3600C67A3600C67A3600C67A3600C67A3600C6
+7A3600C67A3600C67A3600C67A3600C67A3600C67A3600C67A3600C67A3600
+C67A3600C67A3600C67A3600C67A3600C67A3600C67A3600C67A3600C67A36
+00C67A3600C67A3600C67A3600C67A3600C67A3600C67A3600C67A3600C67A
+3600C67A3600C67A3600C67A3600C67A3600C67A3600C67A3600C67A3600C6
+7A3600C67A3600C67A3600C67A3600C67A3600C67A3600C67A3600C67A3600
+C67A3600C67A3600C67A3600C67A3600C67A3600C67A3600C67A3600C67A36
+00C67A3600C67A3600C67A3600C67A3600C67A3600C67A3600C67A3600C67A
+3600C67A3600C67A3600C67A3600C67A3600C67A3600C67A3600C67A3600C6
+7A3600C67A3600C67A3600C67A3600C67A3600C67A3600C67A3600C67A3600
+C67A3600C67A3600C67A3600C67A3600C67A3600C67A3600C67A3600C67A36
+00C67A3600C67A3600C67A3600C67A3600C67A3600C67A3600C67A3600C67A
+3600C67A3600C67A3600C67A3600C67A3600C67A3600C67A3600C67A3600C6
+7A3600C67A3600C67A3600C67A3600C67A3600C67A3600C67A3600C67A3600
+C67A3600C67A3600C67A3600C67A3600C67A3600C67A3600C67A3600C67A36
+00C67A3600C67A3600C67A3600C67A3600C67A3600C67A3600C67A3600C67A
+3600C67A3600C67A3600C67A3600C67A3600C67A3600C67A3600C67A3600C6
+7A3600C67A3600C67A3600C67A3600C67A3600C67A3600C67A3600C67A3600
+C67A3600C67A3600C67A3600C67A3600C67A3600C67A3600C67A3600C67A36
+00C67A3600C67A3600C67A3600C67A3600C67A3600C67A3600C67A3600C67A
+3600C67A3600C67A3600C67A3600C67A3600C67A3600C67A3600C67A3600C6
+7A3600C67A3600C67A3600C67A3600C67A3600C67A3600C67A3600C67A3600
+C67A3600C67A3600C67A3600C67A3600C67A3600C67A3600C67A3600C67A36
+00C67A3600C67A3600C67A3600C67A3600C67A3600C67A3600C67A3600C67A
+3600C67A3600C67A3600C67A3600C67A3600C67A3600C67A3600C67A3600C6
+7A3600C67A3600C67A3600C67A3600C67A3600C67A3600C67A3600C67A3600
+C67A3600C67A3600C67A3600C67A3600C67A3600C67A3600C67A3600C67A36
+00C67A3600C67A3600C67A3600C67A3600C67A3600C67A3600C67A3600C67A
+3600C67A3600C67A3600C67A3600C67A3600C67A3600C67A3600C67A3600C6
+7A3600C67A3600C67A3600C67A3600C67A3600C67A3600C67A3600C67A3600
+C67A3600C67A3600C67A3600C67A3600C67A3600C67A3600C67A3600C67A36
+00C67A3600C67A3600C67A3600C67A3600C67A3600C67A3600C67A3600C67A
+3600C67A3600C67A3600C67A3600C67A3600C67A3600C67A3600C67A3600C6
+7A3600C67A3600C67A3600C67A3600C67A3600C67A3600C67A3600C67A3600
+C67A3600C67A3600C67A3600C67A3600C67A3600C67A3600C67A3600C67A36
+00C67A3600C67A3600C67A3600C67A3600C67A3600C67A3600C67A3600C67A
+3600C67A3600C67A3600C67A3600C67A3600C67A3600C67A3600C67A3600C6
+7A3600C67A3600C67A3600C67A3600C67A3600C67A3600C67A3600C67A3600
+C67A3600C67A3600C67A3600C67A3600C67A3600C67A3600C67A3600C67A36
+00C67A3600C67A3600C67A3600C67A3600C67A3600C67A3600C67A3600C67A
+3600C67A3600C67A3600C67A3600C67A3600C67A3600C67A3600C67A3600C6
+7A3600C67A3600C67A3600C67A3600C67A3600C67A3600C67A3600C67A3600
+C67A3600C67A3600C67A3600C67A3600C67A3600C67A3600C67A3600C67A36
+00C67A3600C67A3600C67A3600C67A3600C67A3600C67A3600C67A3600C67A
+3600C67A3600C67A3600C67A3600C67A3600C67A3600C67A3600C67A3600C6
+7A3600C67A3600C67A3600C67A3600C67A3600C67A3600C67A3600C67A3600
+C67A3600C67A3600C67A3600C67A3600C67A3600C67A3600C67A3600C67A36
+00C67A3600C67A3600C67A3600C67A3600C67A3600C67A3600C67A3600C67A
+3600C67A3600C67A3600C67A3600C67A3600C67A3600C67A3600C67A3600C6
+7A3600C67A3600C67A3600C67A3600C67A3600C67A3600C67A3600C67A3600
+C67A3600C67A3600C67A3600C67A3600C67A3600C67A3600C67A3600C67A36
+00C67A3600C67A3600C67A3600C67A3600C67A3600C67A3600C67A3600C67A
+3600C67A3600C67A3600C67A3600C67A3600C67A3600C67A3600C67A3600C6
+7A3600C67A3600C67A3600C67A3600C67A3600C67A3600C67A3600C67A3600
+C67A3600C67A3600C67A3600C67A3600C67A3600C67A3600C67A3600C67A36
+00C67A3600C67A3600C67A3600C67A3600C67A3600C67A3600C67A3600C67A
+3600C67A3600C67A3600C67A3600C67A3600C67A3600C67A3600C67A3600C6
+7A3600C67A3600C67A3600C67A3600C67A3600C67A3600C67A3600C67A3600
+C67A3600C67A3600C67A3600C67A3600C67A3600C67A3600C67A3600C67A36
+00C67A3600C67A3600C67A3600C67A3600C67A3600C67A3600C67A3600C67A
+3600C67A3600C67A3600C67A3600C67A3600C67A3600C67A3600C67A3600C6
+7A3600C67A3600C67A3600C67A3600C67A3600C67A3600C67A3600C67A3600
+C67A3600C67A3600C67A3600C67A3600C67A3600C67A3600C67A3600C67A36
+00C67A3600C67A3600C67A3600C67A3600C67A3600C67A3600C67A3600C67A
+3600C67A3600C67A3600C67A3600C67A3600C67A3600C67A3600C67A3600C6
+7A3600C67A3600C67A3600C67A3600C67A3600C67A3600C67A3600C67A3600
+C67A3600C67A3600C67A3600C67A3600C67A3600C67A3600C67A3600C67A36
+00C67A3600C67A3600C67A3600C67A3600C67A3600C67A3600C67A3600C67A
+3600C67A3600C67A3600C67A3600C67A3600C67A3600C67A3600C67A3600C6
+7A3600C67A3600C67A3600C67A3600C67A3600C67A3600C67A3600C67A3600
+C67A3600C67A3600C67A3600C67A3600C67A3600C67A3600C67A3600C67A36
+00C67A3600C67A3600C67A3600C67A3600C67A3600C67A3600C67A3600C67A
+3600C67A3600C67A3600C67A3600C67A3600C67A3600C67A3600C67A3600C6
+7A3600C67A3600C67A3600C67A3600C67A3600C67A3600C67A3600C67A3600
+C67A3600C67A3600C67A3600C67A3600C67A3600C67A3600C67A3600C67A36
+00C67A3600C67A3600C67A3600C67A3600C67A3600C67A3600C67A3600C67A
+3600C67A3600C67A3600C67A3600C67A3600C67A3600C67A3600C67A3600C6
+7A3600C67A3600C67A3600C67A3600C67A3600C67A3600C67A3600C67A3600
+C67A3600C67A3600C67A3600C67A3600C67A3600C67A3600C67A3600C67A36
+00C67A3600C67A3600C67A3600C67A3600C67A3600C67A3600C67A3600C67A
+3600C67A3600C67A3600C67A3600C67A3600C67A3600C67A3600C67A3600C6
+7A3600C67A3600C67A3600C67A3600C67A3600C67A3600C67A3600C67A3600
+C67A3600C67A3600C67A3600C67A3600C67A3600C67A3600C67A3600C67A36
+00C67A3600C67A3600C67A3600C67A3600C67A3600C67A3600C67A3600C67A
+3600C67A3600C67A3600C67A3600C67A3600C67A3600C67A3600C67A3600C6
+7A3600C67A3600C67A3600C67A3600C67A3600C67A3600C67A3600C67A3600
+C67A3600C67A3600C67A3600C67A3600C67A3600C67A3600C67A3600C67A36
+00C67A3600C67A3600C67A3600C67A3600C67A3600C67A3600C67A3600C67A
+3600C67A3600C67A3600C67A3600C67A3600C67A3600C67A3600C67A3600C6
+7A3600C67A3600C67A3600C67A3600C67A3600C67A3600C67A3600C67A3600
+C67A3600C67A3600C67A3600C67A3600C67A3600C67A3600C67A3600C67A36
+00C67A3600C67A3600C67A3600C67A3600C67A3600C67A3600C67A3600C67A
+3600C67A3600C67A3600C67A3600C67A3600C67A3600C67A3600C67A3600C6
+7A3600C67A3600C67A3600C67A3600C6>
+<A5580000A95D0000AF640000B56D0000BD790000C8850000E28F0004FD9906
+04FFA01400FFA21B09FF971820FF8A1139FE84164BFD56007CF3320096DD17
+0FAB920627BCB021599CB021599CB021599CB021599CB021599CB021599CB0
+21599CB021599CB021599CB021599CB021599CB021599CB021599CB021599C
+B021599CB021599CA5580000A95D0000AF640000B56D0000BD790000C88500
+00E28F0004FD990604FFA01400FFA21B09FF971820FF8A1139FE84164BFD56
+007CF3320096DD170FAB920627BCB021599CB021599CB021599CB021599CB0
+21599CB021599CB021599CB021599CB021599CB021599CB021599CB021599C
+B021599CB021599CB021599CB021599CA5580000A95D0000AF640000B56D00
+00BD790000C8850000E28F0004FD990604FFA01400FFA21B09FF971820FF8A
+1139FE84164BFD56007CF3320096DD170FAB920627BCB021599CB021599CB0
+21599CB021599CB021599CB021599CB021599CB021599CB021599CB021599C
+B021599CB021599CB021599CB021599CB021599CB021599CA5580000A95D00
+00AF640000B56D0000BD790000C8850000E28F0004FD990604FFA01400FFA2
+1B09FF971820FF8A1139FE84164BFD56007CF3320096DD170FAB920627BCB0
+21599CB021599CB021599CB021599CB021599CB021599CB021599CB021599C
+B021599CB021599CB021599CB021599CB021599CB021599CB021599CB02159
+9CA5580000A95D0000AF640000B56D0000BD790000C8850000E28F0004FD99
+0604FFA01400FFA21B09FF971820FF8A1139FE84164BFD56007CF3320096DD
+170FAB920627BCB021599CB021599CB021599CB021599CB021599CB021599C
+B021599CB021599CB021599CB021599CB021599CB021599CB021599CB02159
+9CB021599CB021599CA5580000A95D0000AF640000B56D0000BD790000C885
+0000E28F0004FD990604FFA01400FFA21B09FF971820FF8A1139FE84164BFD
+56007CF3320096DD170FAB920627BCB021599CB021599CB021599CB021599C
+B021599CB021599CB021599CB021599CB021599CB021599CB021599CB02159
+9CB021599CB021599CB021599CB021599CA5580000A95D0000AF640000B56D
+0000BD790000C8850000E28F0004FD990604FFA01400FFA21B09FF971820FF
+8A1139FE84164BFD56007CF3320096DD170FAB920627BCB021599CB021599C
+B021599CB021599CB021599CB021599CB021599CB021599CB021599CB02159
+9CB021599CB021599CB021599CB021599CB021599CB021599CA5580000A95D
+0000AF640000B56D0000BD790000C8850000E28F0004FD990604FFA01400FF
+A21B09FF971820FF8A1139FE84164BFD56007CF3320096DD170FAB920627BC
+B021599CB021599CB021599CB021599CB021599CB021599CB021599CB02159
+9CB021599CB021599CB021599CB021599CB021599CB021599CB021599CB021
+599CA5580000A95D0000AF640000B56D0000BD790000C8850000E28F0004FD
+990604FFA01400FFA21B09FF971820FF8A1139FE84164BFD56007CF3320096
+DD170FAB920627BCB021599CB021599CB021599CB021599CB021599CB02159
+9CB021599CB021599CB021599CB021599CB021599CB021599CB021599CB021
+599CB021599CB021599CA5580000A95D0000AF640000B56D0000BD790000C8
+850000E28F0004FD990604FFA01400FFA21B09FF971820FF8A1139FE84164B
+FD56007CF3320096DD170FAB920627BCB021599CB021599CB021599CB02159
+9CB021599CB021599CB021599CB021599CB021599CB021599CB021599CB021
+599CB021599CB021599CB021599CB021599CA5580000A95D0000AF640000B5
+6D0000BD790000C8850000E28F0004FD990604FFA01400FFA21B09FF971820
+FF8A1139FE84164BFD56007CF3320096DD170FAB920627BCB021599CB02159
+9CB021599CB021599CB021599CB021599CB021599CB021599CB021599CB021
+599CB021599CB021599CB021599CB021599CB021599CB021599CA5580000A9
+5D0000AF640000B56D0000BD790000C8850000E28F0004FD990604FFA01400
+FFA21B09FF971820FF8A1139FE84164BFD56007CF3320096DD170FAB920627
+BCB021599CB021599CB021599CB021599CB021599CB021599CB021599CB021
+599CB021599CB021599CB021599CB021599CB021599CB021599CB021599CB0
+21599CA5580000A95D0000AF640000B56D0000BD790000C8850000E28F0004
+FD990604FFA01400FFA21B09FF971820FF8A1139FE84164BFD56007CF33200
+96DD170FAB920627BCB021599CB021599CB021599CB021599CB021599CB021
+599CB021599CB021599CB021599CB021599CB021599CB021599CB021599CB0
+21599CB021599CB021599CA5580000A95D0000AF640000B56D0000BD790000
+C8850000E28F0004FD990604FFA01400FFA21B09FF971820FF8A1139FE8416
+4BFD56007CF3320096DD170FAB920627BCB021599CB021599CB021599CB021
+599CB021599CB021599CB021599CB021599CB021599CB021599CB021599CB0
+21599CB021599CB021599CB021599CB021599CA5580000A95D0000AF640000
+B56D0000BD790000C8850000E28F0004FD990604FFA01400FFA21B09FF9718
+20FF8A1139FE84164BFD56007CF3320096DD170FAB920627BCB021599CB021
+599CB021599CB021599CB021599CB021599CB021599CB021599CB021599CB0
+21599CB021599CB021599CB021599CB021599CB021599CB021599CA4580000
+A95D0000AE640000B56E0000BC790000C7850000DF900003FC9A0603FFA112
+00FFA51B06FF9A161FFF951A2CFE830B53EA610075FF43008FEC280AA78C00
+17CAB0375795B0375795B0375795B0375795B0375795B0375795B0375795B0
+375795B0375795B0375795B0375795B0375795B0375795B0375795B0375795
+B0375795A4590000A95E0000AE650000B46E0000BB7A0000C5850000DB9000
+02FB9B0503FFA31000FFA91B02FF9E141EFF9B1A28FD840057D874006BFF56
+0087E64000A0541D02DB040C12F2040C12F2040C12F2040C12F2040C12F204
+0C12F2040C12F2040C12F2040C12F2040C12F2040C12F2040C12F2040C12F2
+040C12F2040C12F2040C12F2A4590000A85E0000AD650000B36E0000BA7A00
+00C4860000D8910001F99D0402FFA50E00FFAB1901FFA71716FFA11925F78D
+0051FA8D0061C78B007485820091628400AC09530CD209530CD209530CD209
+530CD209530CD209530CD209530CD209530CD209530CD209530CD209530CD2
+09530CD209530CD209530CD209530CD209530CD2A4590000A85E0000AD6500
+00B26E0000B87A0000C2860000D5910000F99E0401FFA70C00FFAE1700FFB0
+1B0CFFAA1722D09A014BD4AB0057C6C0006684B9008170E100903CF800A73C
+F800A73CF800A73CF800A73CF800A73CF800A73CF800A73CF800A73CF800A7
+3CF800A73CF800A73CF800A73CF800A73CF800A73CF800A73CF800A7A35900
+00A75E0000AC660000B16F0000B77A0000C1860000D2920000F8A00301FFA9
+0A00FFB11500FFB51D06FFBA1B19CFAE0044E0E20049A8F0005F83F10D7249
+FD018C1CFF00A51CFF00A51CFF00A51CFF00A51CFF00A51CFF00A51CFF00A5
+1CFF00A51CFF00A51CFF00A51CFF00A51CFF00A51CFF00A51CFF00A51CFF00
+A51CFF00A5A3590000A75F0000AC660000B06F0000B67B0000BF860000D192
+0000F9A10300FFA90900FFB11400FFBC1D05FFCA0E22C8D0013BA9E4004E91
+FF035C61FF097132FF068C0AFF009C0AFF009C0AFF009C0AFF009C0AFF009C
+0AFF009C0AFF009C0AFF009C0AFF009C0AFF009C0AFF009C0AFF009C0AFF00
+9C0AFF009C0AFF009C0AFF009CA35A0000A65F0000AB660000B06F0000B57B
+0000BE870000D1920000F9A10300FFA90900FFB61301FFCB0F12DCDA0029D3
+FD1B1D8FF4024E78FF125946FF03721BFF008C02FF009502FF009502FF0095
+02FF009502FF009502FF009502FF009502FF009502FF009502FF009502FF00
+9502FF009502FF009502FF009502FF009502FF0095A25A0000A65F0000AA66
+0000AF700000B57B0000BE870000D0920000F9A10200FFAC0900F8BE040DE7
+D6001BCDF31417C9FF360181FF0B4753FF045F34FF05720DFF008700FF2087
+00FF208700FF208700FF208700FF208700FF208700FF208700FF208700FF20
+8700FF208700FF208700FF208700FF208700FF208700FF208700FF2087A25A
+0000A5600000AA660000AF700000B57B0000BE870000D0920000F9A10200E1
+AE0105D9C4000EC0E0001AB9FE1810A0FF221566FF044B40FF00611EFF0079
+04FF0C8200FF327C00FF327C00FF327C00FF327C00FF327C00FF327C00FF32
+7C00FF327C00FF327C00FF327C00FF327C00FF327C00FF327C00FF327C00FF
+327C00FF327CA25A0000A5600000AA660000AF700000B57B0000BE860000D0
+920000C49E0001C3AF0006BDCB000EABEA0017A9FF190D77FF023352FF004E
+2EFF006412FF007600FF1B7B00FF397300FF397300FF397300FF397300FF39
+7300FF397300FF397300FF397300FF397300FF397300FF397300FF397300FF
+397300FF397300FF397300FF3973A25A0000A5600000AA660000AF700000B5
+7B0000BE860000B7920000B1A00001B1B30006AACF000E9BEE00168AFF051D
+63FF003844FF004F20FF006708FF057200FF287100FF436B00FF436B00FF43
+6B00FF436B00FF436B00FF436B00FF436B00FF436B00FF436B00FF436B00FF
+436B00FF436B00FF436B00FF436B00FF436B00FF436BA25A0000A55F0000AA
+660000AF6F0000B57B0000B1870000A8940000A7A20002A5B800069AD1000E
+8DEF00157AFF032053FF003B34FF005314FF006703FF0C6D00FF316900FF4D
+6400FF4D6400FF4D6400FF4D6400FF4D6400FF4D6400FF4D6400FF4D6400FF
+4D6400FF4D6400FF4D6400FF4D6400FF4D6400FF4D6400FF4D6400FF4D64A2
+5A0000A55F0000AA660000AF6F0000AE7B0000A5890000A09600019FA60003
+99BB00078FD3000E82F2001567FF002546FF003D26FF00570AFF006503FF1B
+6505FF3E5E00FF575D00FF575D00FF575D00FF575D00FF575D00FF575D00FF
+575D00FF575D00FF575D00FF575D00FF575D00FF575D00FF575D00FF575D00
+FF575D00FF575DA25A0000A55F0000AA660000AD700000A17D00009C8B0000
+9899000196AA000491C0000785D8000E77F8001656FF002A3BFF004019FF00
+5803FF046317FF394F1BFF534300FF5E5600FF5E5600FF5E5600FF5E5600FF
+5E5600FF5E5600FF5E5600FF5E5600FF5E5600FF5E5600FF5E5600FF5E5600
+FF5E5600FF5E5600FF5E5600FF5E56A25A0000A55F0000AA660000A0720000
+997F0000958D0000929C000190AF000388C500077EE1000D6BFB001847F800
+2F2BFF00460FFF005805FF125A15FF40493CFF702100FF605000FF605000FF
+605000FF605000FF605000FF605000FF605000FF605000FF605000FF605000
+FF605000FF605000FF605000FF605000FF605000FF6050A25A0000A55F0000
+9E68000096740000918100008E8F00008C9F000188B3000383CD000677EC00
+0C5AF5001D3CF8003126FF074106FF005608FF224F1CFF4D3B20FF662F02FF
+644802FF644802FF644802FF644802FF644802FF644802FF644802FF644802
+FF644802FF644802FF644802FF644802FF644802FF644802FF644802FF6448
+A25A00009D610000936B00008E7600008B8400008892000085A3000182B800
+0280DB00036DF0000D47E7002337FC062F17FF004802FF08511BFF3E3914FF
+4F3A18FF64300FFF7C390FFF7C390FFF7C390FFF7C390FFF7C390FFF7C390F
+FF7C390FFF7C390FFF7C390FFF7C390FFF7C390FFF7C390FFF7C390FFF7C39
+0FFF7C390FFF7C399D5B0000916400008B6D00008779000084860000809400
+007FA700007EC1000077E0000260F000103BE2002529FE00360FFF034712FF
+243C1CFF483009FF4E3C06FF613B11FF893111FF893111FF893111FF893111
+FF893111FF893111FF893111FF893111FF893111FF893111FF893111FF8931
+11FF893111FF893111FF893111FF8931>
+<A4550000A7590000AD5F0000B3660000BB700000C57C0000D5850003EF8C00
+0BFF93090CFF941212FF8F181EFF710549FF5C0264F73B0080C70E009AD304
+20A3C50A4CA2790078AB6B007EAF6B007EAF6B007EAF6B007EAF6B007EAF6B
+007EAF6B007EAF6B007EAF6B007EAF6B007EAF6B007EAF6B007EAF6B007EAF
+6B007EAF6B007EAFA4550000A7590000AD5F0000B3660000BB700000C57C00
+00D5850003EF8C000BFF93090CFF941212FF8F181EFF710549FF5C0264F73B
+0080C70E009AD30420A3C50A4CA2790078AB6B007EAF6B007EAF6B007EAF6B
+007EAF6B007EAF6B007EAF6B007EAF6B007EAF6B007EAF6B007EAF6B007EAF
+6B007EAF6B007EAF6B007EAF6B007EAFA4550000A7590000AD5F0000B36600
+00BB700000C57C0000D5850003EF8C000BFF93090CFF941212FF8F181EFF71
+0549FF5C0264F73B0080C70E009AD30420A3C50A4CA2790078AB6B007EAF6B
+007EAF6B007EAF6B007EAF6B007EAF6B007EAF6B007EAF6B007EAF6B007EAF
+6B007EAF6B007EAF6B007EAF6B007EAF6B007EAF6B007EAFA4550000A75900
+00AD5F0000B3660000BB700000C57C0000D5850003EF8C000BFF93090CFF94
+1212FF8F181EFF710549FF5C0264F73B0080C70E009AD30420A3C50A4CA279
+0078AB6B007EAF6B007EAF6B007EAF6B007EAF6B007EAF6B007EAF6B007EAF
+6B007EAF6B007EAF6B007EAF6B007EAF6B007EAF6B007EAF6B007EAF6B007E
+AFA4550000A7590000AD5F0000B3660000BB700000C57C0000D5850003EF8C
+000BFF93090CFF941212FF8F181EFF710549FF5C0264F73B0080C70E009AD3
+0420A3C50A4CA2790078AB6B007EAF6B007EAF6B007EAF6B007EAF6B007EAF
+6B007EAF6B007EAF6B007EAF6B007EAF6B007EAF6B007EAF6B007EAF6B007E
+AF6B007EAF6B007EAFA4550000A7590000AD5F0000B3660000BB700000C57C
+0000D5850003EF8C000BFF93090CFF941212FF8F181EFF710549FF5C0264F7
+3B0080C70E009AD30420A3C50A4CA2790078AB6B007EAF6B007EAF6B007EAF
+6B007EAF6B007EAF6B007EAF6B007EAF6B007EAF6B007EAF6B007EAF6B007E
+AF6B007EAF6B007EAF6B007EAF6B007EAFA4550000A7590000AD5F0000B366
+0000BB700000C57C0000D5850003EF8C000BFF93090CFF941212FF8F181EFF
+710549FF5C0264F73B0080C70E009AD30420A3C50A4CA2790078AB6B007EAF
+6B007EAF6B007EAF6B007EAF6B007EAF6B007EAF6B007EAF6B007EAF6B007E
+AF6B007EAF6B007EAF6B007EAF6B007EAF6B007EAF6B007EAFA4550000A759
+0000AD5F0000B3660000BB700000C57C0000D5850003EF8C000BFF93090CFF
+941212FF8F181EFF710549FF5C0264F73B0080C70E009AD30420A3C50A4CA2
+790078AB6B007EAF6B007EAF6B007EAF6B007EAF6B007EAF6B007EAF6B007E
+AF6B007EAF6B007EAF6B007EAF6B007EAF6B007EAF6B007EAF6B007EAF6B00
+7EAFA4550000A7590000AD5F0000B3660000BB700000C57C0000D5850003EF
+8C000BFF93090CFF941212FF8F181EFF710549FF5C0264F73B0080C70E009A
+D30420A3C50A4CA2790078AB6B007EAF6B007EAF6B007EAF6B007EAF6B007E
+AF6B007EAF6B007EAF6B007EAF6B007EAF6B007EAF6B007EAF6B007EAF6B00
+7EAF6B007EAF6B007EAFA4550000A7590000AD5F0000B3660000BB700000C5
+7C0000D5850003EF8C000BFF93090CFF941212FF8F181EFF710549FF5C0264
+F73B0080C70E009AD30420A3C50A4CA2790078AB6B007EAF6B007EAF6B007E
+AF6B007EAF6B007EAF6B007EAF6B007EAF6B007EAF6B007EAF6B007EAF6B00
+7EAF6B007EAF6B007EAF6B007EAF6B007EAFA4550000A7590000AD5F0000B3
+660000BB700000C57C0000D5850003EF8C000BFF93090CFF941212FF8F181E
+FF710549FF5C0264F73B0080C70E009AD30420A3C50A4CA2790078AB6B007E
+AF6B007EAF6B007EAF6B007EAF6B007EAF6B007EAF6B007EAF6B007EAF6B00
+7EAF6B007EAF6B007EAF6B007EAF6B007EAF6B007EAF6B007EAFA4550000A7
+590000AD5F0000B3660000BB700000C57C0000D5850003EF8C000BFF93090C
+FF941212FF8F181EFF710549FF5C0264F73B0080C70E009AD30420A3C50A4C
+A2790078AB6B007EAF6B007EAF6B007EAF6B007EAF6B007EAF6B007EAF6B00
+7EAF6B007EAF6B007EAF6B007EAF6B007EAF6B007EAF6B007EAF6B007EAF6B
+007EAFA4550000A7590000AD5F0000B3660000BB700000C57C0000D5850003
+EF8C000BFF93090CFF941212FF8F181EFF710549FF5C0264F73B0080C70E00
+9AD30420A3C50A4CA2790078AB6B007EAF6B007EAF6B007EAF6B007EAF6B00
+7EAF6B007EAF6B007EAF6B007EAF6B007EAF6B007EAF6B007EAF6B007EAF6B
+007EAF6B007EAF6B007EAFA4550000A7590000AD5F0000B3660000BA700000
+C47C0000D4860003EF8D000AFF940A0AFF951310FF90181DFF760844FF6305
+5FF940007ECD140098CE001BA7C80A45A3840172AA740178AE740178AE7401
+78AE740178AE740178AE740178AE740178AE740178AE740178AE740178AE74
+0178AE740178AE740178AE740178AE740178AEA3550000A7590000AC5F0000
+B2660000B9700000C37C0000D2870002F08F0008FF980D04FF9A150BFF9417
+1BFF831134FF6D0659FF4D0079E3260092D00711A8CE0933A8AC0261A79102
+68AB910268AB910268AB910268AB910268AB910268AB910268AB910268AB91
+0268AB910268AB910268AB910268AB910268AB910268AB910268ABA3550000
+A75A0000AB5F0000B1670000B8710000C27D0000D0880001EF910007FF990B
+04FF9E1705FF991916FF921B26FF770554FF630E63FC3A008CD20E05A9A700
+1CB7500044CA480549C9480549C9480549C9480549C9480549C9480549C948
+0549C9480549C9480549C9480549C9480549C9480549C9480549C9480549C9
+480549C9A3550000A65A0000AB5F0000B1670000B7710000C07D0000CD8800
+01ED920006FF9B0B03FFA21800FFA01A10FF961A24FF7F044EED761158F354
+0083AA4000A0451D02CC001027EB01152EE101152EE101152EE101152EE101
+152EE101152EE101152EE101152EE101152EE101152EE101152EE101152EE1
+01152EE101152EE101152EE1A2560000A65A0000AA600000B0670000B67100
+00BF7D0000CB890001EA930005FF9D0A02FFA41600FFA4190EFF991822FF8E
+123AE5820160B17C0076847700934F7401B6014624C9005134C5005134C500
+5134C5005134C5005134C5005134C5005134C5005134C5005134C5005134C5
+005134C5005134C5005134C5005134C5005134C5A2560000A55A0000AA6000
+00AF670000B5720000BE7E0000C9890000E6940004FF9F0801FFA61300FFA9
+1A08FF9F1520FAA7182DC19E0059B6B1006782B5007E60CF0094029808B604
+CF0FB604CF0FB604CF0FB604CF0FB604CF0FB604CF0FB604CF0FB604CF0FB6
+04CF0FB604CF0FB604CF0FB604CF0FB604CF0FB604CF0FB604CF0FB6A25600
+00A55B0000A9600000AF680000B4720000BC7E0000C78A0000E1950002FFA1
+0701FFA81000FFAF1B03FFBA1915CBB0003BC2D30045A2F600568EFF17594B
+FF027E14FA019A09FF059C09FF059C09FF059C09FF059C09FF059C09FF059C
+09FF059C09FF059C09FF059C09FF059C09FF059C09FF059C09FF059C09FF05
+9C09FF059CA2560000A45B0000A9610000AE680000B3720000BA7E0000C58A
+0000E0970001FFA40500FFAC0D00FFBE1207FCDB1512D3EA0529B9F31F2189
+FF07515BFF096539FF087A09FF009200FF019500FF019500FF019500FF0195
+00FF019500FF019500FF019500FF019500FF019500FF019500FF019500FF01
+9500FF019500FF019500FF0195A1560000A45B0000A8610000AD690000B173
+0000B87F0000C28A0000E1980000FFA50400FEB50704F2C70113D0E1001FD2
+FF2D03A5FC221D71FF0E4E41FF00681EFF008000FF118B00FF2C8400FF2C84
+00FF2C8400FF2C8400FF2C8400FF2C8400FF2C8400FF2C8400FF2C8400FF2C
+8400FF2C8400FF2C8400FF2C8400FF2C8400FF2C84A1570000A35B0000A761
+0000AC690000B0730000B77F0000C28A0000E1980000E8A60201D8B50008CD
+D10012B4EF001CBCFF2D007AFF043B50FF00562EFF006B10FF007C00FF277D
+00FF387900FF387900FF387900FF387900FF387900FF387900FF387900FF38
+7900FF387900FF387900FF387900FF387900FF387900FF387900FF3879A157
+0000A35C0000A7620000AC690000B0730000B77F0000C28A0000C5960000BD
+A30002BEB90008B2D60011A2F602189BFF1C1063FF004041FF00561DFF006F
+06FF077800FF317300FF417000FF417000FF417000FF417000FF417000FF41
+7000FF417000FF417000FF417000FF417000FF417000FF417000FF417000FF
+417000FF4170A1570000A35C0000A7620000AC690000B0730000B77F0000BB
+8B0000AE970000AEA60003ACBE0008A0DA001193F7021779FF022552FF0042
+30FF005A11FF006D01FF127200FF3A6B00FF4C6800FF4C6800FF4C6800FF4C
+6800FF4C6800FF4C6800FF4C6800FF4C6800FF4C6800FF4C6800FF4C6800FF
+4C6800FF4C6800FF4C6800FF4C68A1570000A35C0000A7620000AC690000B0
+730000B57F0000A98C0000A5990001A4AA00049DC1000992DC001085F70217
+65FF002B44FF004322FF005D07FF006B04FF246800FF446300FF576100FF57
+6100FF576100FF576100FF576100FF576100FF576100FF576100FF576100FF
+576100FF576100FF576100FF576100FF576100FF5761A1570000A35C0000A7
+620000AC690000B0730000A58000009F8E00009D9C00019AAE000592C4000A
+87E0001076FA001A53FF003037FF004716FF005E03FF0C6514FF3D550DFF56
+5000FF5F5A00FF5F5A00FF5F5A00FF5F5A00FF5F5A00FF5F5A00FF5F5A00FF
+5F5A00FF5F5A00FF5F5A00FF5F5A00FF5F5A00FF5F5A00FF5F5A00FF5F5AA1
+570000A35C0000A7620000AC690000A37500009C82000098900000959F0002
+92B3000488C8000A7FE9000F67FD001D45FE003428FF004D0CFF005D10FF23
+540FFF415024FF6C3400FF655300FF655300FF655300FF655300FF655300FF
+655300FF655300FF655300FF655300FF655300FF655300FF655300FF655300
+FF655300FF6553A1570000A35C0000A7620000A26B00009977000094850000
+919300008FA300028AB8000482D0000977F2000F57F900223BFD01351CFF00
+4F03FF015B0FFF2D4D2AFF5A2F00FF594E00FF634D00FF634D00FF634D00FF
+634D00FF634D00FF634D00FF634D00FF634D00FF634D00FF634D00FF634D00
+FF634D00FF634D00FF634D00FF634DA1570000A35C0000A0630000966D0000
+917900008E8700008B96000088A7000284BE00037EDD00076BF4001046EE00
+273DFE102C12FF004E01FF0D5518FF413E2AFF622800FF5C470DFF7A3D0DFF
+7A3D0DFF7A3D0DFF7A3D0DFF7A3D0DFF7A3D0DFF7A3D0DFF7A3D0DFF7A3D0D
+FF7A3D0DFF7A3D0DFF7A3D0DFF7A3D0DFF7A3D0DFF7A3DA15700009F5C0000
+946600008D6F00008A7C0000878900008398000081AB000180C7000178E800
+0558E900173AEB002A25FE003D0AFF034B13FF293E18FF4A3618FF5C300CFF
+723911FF8B3411FF8B3411FF8B3411FF8B3411FF8B3411FF8B3411FF8B3411
+FF8B3411FF8B3411FF8B3411FF8B3411FF8B3411FF8B3411FF8B3411FF8B34
+A1570000925F00008A67000086710000837E00007F8B00007B9B00007BB000
+007ACE00016FEC000545DB001D31ED002B1BFF003E06FF0B471BFF3B3016FF
+503001FF513D13FF822F0EFF8F300EFF8F300EFF8F300EFF8F300EFF8F300E
+FF8F300EFF8F300EFF8F300EFF8F300EFF8F300EFF8F300EFF8F300EFF8F30
+0EFF8F300EFF8F30935A000089610000826900007F7400007C800000768E00
+00719D000072B4000070CE000158DA000D39D6001E29EF002C12FF003D00FF
+10441DFF44280DFF4C3111FF672C11FF872A0DFF922B0DFF922B0DFF922B0D
+FF922B0DFF922B0DFF922B0DFF922B0DFF922B0DFF922B0DFF922B0DFF922B
+0DFF922B0DFF922B0DFF922B0DFF922B>
+<A3510000A6550000AB5A0000B1600000B8670000C2720000CF7D0002E08200
+0AF4860015FF890B17FF851320FF65024BFD4F0164E82B007EB6000496E20B
+3090FA076291C4008F947B00E4987B00E4987B00E4987B00E4987B00E4987B
+00E4987B00E4987B00E4987B00E4987B00E4987B00E4987B00E4987B00E498
+7B00E4987B00E498A3510000A6550000AB5A0000B1600000B8670000C27200
+00CF7D0002E082000AF4860015FF890B17FF851320FF65024BFD4F0164E82B
+007EB6000496E20B3090FA076291C4008F947B00E4987B00E4987B00E4987B
+00E4987B00E4987B00E4987B00E4987B00E4987B00E4987B00E4987B00E498
+7B00E4987B00E4987B00E4987B00E498A3510000A6550000AB5A0000B16000
+00B8670000C2720000CF7D0002E082000AF4860015FF890B17FF851320FF65
+024BFD4F0164E82B007EB6000496E20B3090FA076291C4008F947B00E4987B
+00E4987B00E4987B00E4987B00E4987B00E4987B00E4987B00E4987B00E498
+7B00E4987B00E4987B00E4987B00E4987B00E4987B00E498A3510000A65500
+00AB5A0000B1600000B8670000C2720000CF7D0002E082000AF4860015FF89
+0B17FF851320FF65024BFD4F0164E82B007EB6000496E20B3090FA076291C4
+008F947B00E4987B00E4987B00E4987B00E4987B00E4987B00E4987B00E498
+7B00E4987B00E4987B00E4987B00E4987B00E4987B00E4987B00E4987B00E4
+98A3510000A6550000AB5A0000B1600000B8670000C2720000CF7D0002E082
+000AF4860015FF890B17FF851320FF65024BFD4F0164E82B007EB6000496E2
+0B3090FA076291C4008F947B00E4987B00E4987B00E4987B00E4987B00E498
+7B00E4987B00E4987B00E4987B00E4987B00E4987B00E4987B00E4987B00E4
+987B00E4987B00E498A3510000A6550000AB5A0000B1600000B8670000C272
+0000CF7D0002E082000AF4860015FF890B17FF851320FF65024BFD4F0164E8
+2B007EB6000496E20B3090FA076291C4008F947B00E4987B00E4987B00E498
+7B00E4987B00E4987B00E4987B00E4987B00E4987B00E4987B00E4987B00E4
+987B00E4987B00E4987B00E4987B00E498A3510000A6550000AB5A0000B160
+0000B8670000C2720000CF7D0002E082000AF4860015FF890B17FF851320FF
+65024BFD4F0164E82B007EB6000496E20B3090FA076291C4008F947B00E498
+7B00E4987B00E4987B00E4987B00E4987B00E4987B00E4987B00E4987B00E4
+987B00E4987B00E4987B00E4987B00E4987B00E4987B00E498A3510000A655
+0000AB5A0000B1600000B8670000C2720000CF7D0002E082000AF4860015FF
+890B17FF851320FF65024BFD4F0164E82B007EB6000496E20B3090FA076291
+C4008F947B00E4987B00E4987B00E4987B00E4987B00E4987B00E4987B00E4
+987B00E4987B00E4987B00E4987B00E4987B00E4987B00E4987B00E4987B00
+E498A3510000A6550000AB5A0000B1600000B8670000C2720000CF7D0002E0
+82000AF4860015FF890B17FF851320FF65024BFD4F0164E82B007EB6000496
+E20B3090FA076291C4008F947B00E4987B00E4987B00E4987B00E4987B00E4
+987B00E4987B00E4987B00E4987B00E4987B00E4987B00E4987B00E4987B00
+E4987B00E4987B00E498A3510000A6550000AB5A0000B1600000B8670000C2
+720000CF7D0002E082000AF4860015FF890B17FF851320FF65024BFD4F0164
+E82B007EB6000496E20B3090FA076291C4008F947B00E4987B00E4987B00E4
+987B00E4987B00E4987B00E4987B00E4987B00E4987B00E4987B00E4987B00
+E4987B00E4987B00E4987B00E4987B00E498A3510000A6550000AB5A0000B1
+600000B8670000C2720000CF7D0002E082000AF4860015FF890B17FF851320
+FF65024BFD4F0164E82B007EB6000496E20B3090FA076291C4008F947B00E4
+987B00E4987B00E4987B00E4987B00E4987B00E4987B00E4987B00E4987B00
+E4987B00E4987B00E4987B00E4987B00E4987B00E4987B00E498A3510000A6
+550000AB5A0000B1600000B8680000C2730000CE7D0002E082000AF4860014
+FF890B17FF861320FF66024AFD4F0163E92C007DB5000496E10B2F90FA0761
+91C4008E947B00E2987B00E2987B00E2987B00E2987B00E2987B00E2987B00
+E2987B00E2987B00E2987B00E2987B00E2987B00E2987B00E2987B00E2987B
+00E298A3510000A6550000AA5A0000B0600000B7680000C0730000CD7D0002
+DF840009F5880012FF8C0B15FF89131EFF70083EFF58015FF1370079C00C02
+93D5032399F70F5592C50079987100BA9F7100BA9F7100BA9F7100BA9F7100
+BA9F7100BA9F7100BA9F7100BA9F7100BA9F7100BA9F7100BA9F7100BA9F71
+00BA9F7100BA9F7100BA9FA2520000A5560000AA5B0000AF600000B6680000
+BF730000CB7E0001DD850008F58B0110FF8F0C11FF8C131BFF7C0F32FF5E01
+5CFB420076D119018FCD01189DF4174993BA006D9D67009DA767009DA76700
+9DA767009DA767009DA767009DA767009DA767009DA767009DA767009DA767
+009DA767009DA767009DA767009DA767009DA7A2520000A5560000A95B0000
+AF610000B6680000BE740000C97F0000DD870006F68E020CFF930F0CFF9014
+18FF891727FF650158FF4D0070E728008BC6040DA0E8143999AF0062A46000
+86B1600086B1600086B1600086B1600086B1600086B1600086B1600086B160
+0086B1600086B1600086B1600086B1600086B1600086B1600086B1A2520000
+A5560000A95B0000AE610000B5690000BD740000C8800000DD890005F79002
+0AFF981105FF951514FF8F1822FF6D0054FF5C0764F4350086BA0F03A37A01
+17B7530245C60E0383C30D0382C30D0382C30D0382C30D0382C30D0382C30D
+0382C30D0382C30D0382C30D0382C30D0382C30D0382C30D0382C30D0382C3
+0D0382C3A2520000A4560000A85B0000AE610000B4690000BC750000C68000
+00DC8A0004F8920208FF9B1201FF9A160FFF921820FF790846FF731452E557
+007D8B3A009E311700C2040D1ED7021C4ACE031C4ACD031C4ACD031C4ACD03
+1C4ACD031C4ACD031C4ACD031C4ACD031C4ACD031C4ACD031C4ACD031C4ACD
+031C4ACD031C4ACD031C4ACDA1520000A4570000A85B0000AD620000B36A00
+00BB750000C5810000D88B0003F8940207FF9D1001FF9F1808FF97181CFF8E
+162FE284055995720074716E0093335401AF023D14C500544EB900544EB900
+544EB900544EB900544EB900544EB900544EB900544EB900544EB900544EB9
+00544EB900544EB900544EB900544EB900544EB9A1530000A3570000A75C00
+00AC620000B26A0000B9750000C3810000D48C0001F5960205FF9F0E01FFA5
+1A01FF9F1619F8A60F2EAA98005597A5006676B2017C51C6009200740EAF00
+CF3AA500CF3AA500CF3AA500CF3AA500CF3AA500CF3AA500CF3AA500CF3AA5
+00CF3AA500CF3AA500CF3AA500CF3AA500CF3AA500CF3AA500CF3AA5A15300
+00A3570000A75C0000AB620000B16A0000B7760000C1820000D08D0000F198
+0104FFA20B00FFA91503FEB81017CCB80032A3BE024395F2005188FF1C5246
+FF05780FD2009500FE2C9100FE2C9100FE2C9100FE2C9100FE2C9100FE2C91
+00FE2C9100FE2C9100FE2C9100FE2C9100FE2C9100FE2C9100FE2C9100FE2C
+9100FE2C91A1530000A2570000A65C0000AB630000B06B0000B6760000BE82
+0000CB8D0000ED9A0102FFA60701F5B8030DE5CF0018C3ED071EC7FF320183
+FF094256FF055B31FF03710EFF008400FF318100FF318100FF318100FF3181
+00FF318100FF318100FF318100FF318100FF318100FF318100FF318100FF31
+8100FF318100FF318100FF3181A0540000A2580000A55D0000AA630000AF6C
+0000B4770000BB830000C88E0000EB9D0100D4A90004CFBF000BBDDB0016AC
+FD071AA2FF231065FF024740FF005E1CFF007604FF0D7F00FF3A7600FF3A76
+00FF3A7600FF3A7600FF3A7600FF3A7600FF3A7600FF3A7600FF3A7600FF3A
+7600FF3A7600FF3A7600FF3A7600FF3A7600FF3A76A0540000A2580000A55D
+0000A9640000AD6C0000B2770000BA830000C88E0000B99A0000B9AA0004B5
+C4000BA7E200149CFF081778FF022D52FF00492DFF00620FFF007300FF1C76
+00FF496D00FF496D00FF496D00FF496D00FF496D00FF496D00FF496D00FF49
+6D00FF496D00FF496D00FF496D00FF496D00FF496D00FF496D00FF496DA055
+0000A1590000A45E0000A8640000AD6C0000B2770000BA830000AF8F0000AA
+9C0001AAAE0005A4C8000B96E500138AFF041A64FF003143FF004A1EFF0064
+05FF037000FF286D00FF556500FF576500FF576500FF576500FF576500FF57
+6500FF576500FF576500FF576500FF576500FF576500FF576500FF576500FF
+576500FF5765A0550000A1590000A45E0000A8640000AD6C0000B2770000AA
+840000A4910000A2A000029FB3000695CA000C89E7001379FF021C52FF0037
+32FF005012FF006401FF106908FF395F00FF5E5E00FF605E00FF605E00FF60
+5E00FF605E00FF605E00FF605E00FF605E00FF605E00FF605E00FF605E00FF
+605E00FF605E00FF605E00FF605EA0550000A1590000A45E0000A8640000AD
+6C0000A8780000A08600009B93000099A3000396B800068ACE000C7FED0013
+65FF002244FF003A24FF005308FF00620EFF285807FF425800FF655700FF67
+5600FF675600FF675600FF675600FF675600FF675600FF675600FF675600FF
+675600FF675600FF675600FF675600FF675600FF6756A0550000A1590000A4
+5E0000A8640000A66D00009C7A0000978800009496000192A700028CBC0006
+82D4000B75F6001353FA002837FF003D18FF005400FF036018FF3F4831FF64
+2B00FF695000FF6A5000FF6A5000FF6A5000FF6A5000FF6A5000FF6A5000FF
+6A5000FF6A5000FF6A5000FF6A5000FF6A5000FF6A5000FF6A5000FF6A50A0
+550000A1590000A45D0000A4650000996F0000947C0000908A00008D990001
+8BAC000385C200057DE0000A68F8001544F4002C36FF0E350EFF005300FF13
+5817FF46412BFF692807FF714507FF724507FF724507FF724507FF724507FF
+724507FF724507FF724507FF724507FF724507FF724507FF724507FF724507
+FF724507FF7245A0550000A1590000A35E000097670000907200008D7F0000
+8A8D0000869C000184B0000281CC000376EB000855EC001C39F5002E21FF02
+4206FF045015FF313F13FF4C3D26FF6B2612FF8B3711FF8C3711FF8C3711FF
+8C3711FF8C3711FF8C3711FF8C3711FF8C3711FF8C3711FF8C3711FF8C3711
+FF8C3711FF8C3711FF8C3711FF8C37A0550000A1590000956100008D690000
+8974000086810000828F00007FA000007EB600007DDA000071FA000643E100
+2130F9003016FF00440BFF15451BFF41320CFF4D3B01FF583F0EFF92330DFF
+93330DFF93330DFF93330DFF93330DFF93330DFF93330DFF93330DFF93330D
+FF93330DFF93330DFF93330DFF93330DFF93330DFF9333A0550000955B0000
+8B630000846B0000827600007E8400007991000077A3000078BC000070D500
+0357E2001138DD002227FB00320DFF02420CFF203C1DFF4B2A09FF4F3612FF
+702E0EFF922D0EFF932D0EFF932D0EFF932D0EFF932D0EFF932D0EFF932D0E
+FF932D0EFF932D0EFF932D0EFF932D0EFF932D0EFF932D0EFF932D0EFF932D
+965600008A5D0001826500007D6D00007A790000758600006D9300006CA500
+006BBA000063D5000344D400162FDD00231FFB003307FF063E0CFF293515FF
+49290EFF5A2D15FF7C260BFF98290BFF99290BFF99290BFF99290BFF99290B
+FF99290BFF99290BFF99290BFF99290BFF99290BFF99290BFF99290BFF9929
+0BFF99290BFF99298A580001805F00007A67000075700000717B00006A8700
+006395000062A600005EBA000053CE000739D1001728E1002417FC003303FF
+0E3B0BFF2F2F0EFF4A280DFF602812FF80220AFF99250AFF99250AFF99250A
+FF99250AFF99250AFF99250AFF99250AFF99250AFF99250AFF99250AFF9925
+0AFF99250AFF99250AFF99250AFF9925>
+<A34E0000A5520000A9560000AF5B0000B6610000BF690000CA730001D87800
+0AE77B0014FD7D041DFF780C25FD5B004AEE420062DA1C007BC500118AEB0A
+3984EB006587D8079B818300D4877F00D5877F00D5877F00D5877F00D5877F
+00D5877F00D5877F00D5877F00D5877F00D5877F00D5877F00D5877F00D587
+7F00D5877F00D587A34E0000A5520000A9560000AF5B0000B6610000BF6900
+00CA730001D878000AE77B0014FD7D041DFF780C25FD5B004AEE420062DA1C
+007BC500118AEB0A3984EB006587D8079B818300D4877F00D5877F00D5877F
+00D5877F00D5877F00D5877F00D5877F00D5877F00D5877F00D5877F00D587
+7F00D5877F00D5877F00D5877F00D587A34E0000A5520000A9560000AF5B00
+00B6610000BF690000CA730001D878000AE77B0014FD7D041DFF780C25FD5B
+004AEE420062DA1C007BC500118AEB0A3984EB006587D8079B818300D4877F
+00D5877F00D5877F00D5877F00D5877F00D5877F00D5877F00D5877F00D587
+7F00D5877F00D5877F00D5877F00D5877F00D5877F00D587A34E0000A55200
+00A9560000AF5B0000B6610000BF690000CA730001D878000AE77B0014FD7D
+041DFF780C25FD5B004AEE420062DA1C007BC500118AEB0A3984EB006587D8
+079B818300D4877F00D5877F00D5877F00D5877F00D5877F00D5877F00D587
+7F00D5877F00D5877F00D5877F00D5877F00D5877F00D5877F00D5877F00D5
+87A34E0000A5520000A9560000AF5B0000B6610000BF690000CA730001D878
+000AE77B0014FD7D041DFF780C25FD5B004AEE420062DA1C007BC500118AEB
+0A3984EB006587D8079B818300D4877F00D5877F00D5877F00D5877F00D587
+7F00D5877F00D5877F00D5877F00D5877F00D5877F00D5877F00D5877F00D5
+877F00D5877F00D587A34E0000A5520000A9560000AF5B0000B6610000BF69
+0000CA730001D878000AE77B0014FD7D041DFF780C25FD5B004AEE420062DA
+1C007BC500118AEB0A3984EB006587D8079B818300D4877F00D5877F00D587
+7F00D5877F00D5877F00D5877F00D5877F00D5877F00D5877F00D5877F00D5
+877F00D5877F00D5877F00D5877F00D587A34E0000A5520000A9560000AF5B
+0000B6610000BF690000CA730001D878000AE77B0014FD7D041DFF780C25FD
+5B004AEE420062DA1C007BC500118AEB0A3984EB006587D8079B818300D487
+7F00D5877F00D5877F00D5877F00D5877F00D5877F00D5877F00D5877F00D5
+877F00D5877F00D5877F00D5877F00D5877F00D5877F00D587A34E0000A552
+0000A9560000AF5B0000B6610000BF690000CA730001D878000AE77B0014FD
+7D041DFF780C25FD5B004AEE420062DA1C007BC500118AEB0A3984EB006587
+D8079B818300D4877F00D5877F00D5877F00D5877F00D5877F00D5877F00D5
+877F00D5877F00D5877F00D5877F00D5877F00D5877F00D5877F00D5877F00
+D587A34E0000A5520000A9560000AF5B0000B6610000BF690000CA730001D8
+78000AE77B0014FD7D041DFF780C25FD5B004AEE420062DA1C007BC500118A
+EB0A3984EB006587D8079B818300D4877F00D5877F00D5877F00D5877F00D5
+877F00D5877F00D5877F00D5877F00D5877F00D5877F00D5877F00D5877F00
+D5877F00D5877F00D587A34E0000A5520000A9560000AF5B0000B6610000BF
+690000CA730001D878000AE77B0014FD7D041DFF780C25FD5B004AEE420062
+DA1C007BC500118AEB0A3984EB006587D8079B818300D4877F00D5877F00D5
+877F00D5877F00D5877F00D5877F00D5877F00D5877F00D5877F00D5877F00
+D5877F00D5877F00D5877F00D5877F00D587A34F0000A5520000A9560000AE
+5B0000B5610000BE690000C9730001D8790009E77D0013FD7F031DFF7D0E21
+FF600245F6480060DE220079C1000B8BE3073288EE046087DC0492858400DB
+8A7F00DB897F00DB897F00DB897F00DB897F00DB897F00DB897F00DB897F00
+DB897F00DB897F00DB897F00DB897F00DB897F00DB897F00DB89A24F0000A5
+520000A8560000AE5B0000B4610000BD6A0000C8740001D77B0007E77F0011
+FC81031BFF81101DFF69073CFD4F005DE62B0075C306078BD904298CF30B5A
+87E001888A8500E48D7F00E58C7F00E58C7F00E58C7F00E58C7F00E58C7F00
+E58C7F00E58C7F00E58C7F00E58C7F00E58C7F00E58C7F00E58C7F00E58C7F
+00E58CA24F0000A4520000A8560000AD5B0000B4620000BC6A0000C7750000
+D77D0006E8810010FC83021AFF84101BFF720D32FF55005AEF360072CA0F05
+8AD0002091F8135486E6007F8E8C00DD918000F0908000F0908000F0908000
+F0908000F0908000F0908000F0908000F0908000F0908000F0908000F09080
+00F0908000F0908000F090A24F0000A4520000A8570000AD5C0000B3620000
+BC6B0000C6760000D57E0005E783000EFB850119FF870F1AFF7D1229FF5A00
+56F840006FD2180288C8001894FE1A4E86EC0076919600CF948000FE948000
+FE948000FE948000FE948000FE948000FE948000FE948000FE948000FE9480
+00FE948000FE948000FE948000FE948000FE94A24F0000A4520000A7570000
+AC5C0000B2620000BB6B0000C5770000D37F0004E684000DFB870117FF8A0F
+18FF861622FF600053FE49006BDF220085C1010F97F216408BB900639C6000
+B1A95001C5A45001C5A45001C5A45001C5A45001C5A45001C5A45001C5A450
+01C5A45001C5A45001C5A45001C5A45001C5A45001C5A45001C5A4A2500000
+A3530000A7570000AC5C0000B2630000BA6B0000C3770000D1810003E58600
+0BFC8A0015FF8D0F15FF891620FF67014EFF530165EA2E0081A10E029E6B01
+17AF500042BA290D99B5140AB2B2140AB2B2140AB2B2140AB2B2140AB2B214
+0AB2B2140AB2B2140AB2B2140AB2B2140AB2B2140AB2B2140AB2B2140AB2B2
+140AB2B2A2500000A3530000A6570000AB5C0000B1630000B86C0000C17800
+00CF820002E5890009FC8E040FFF921110FF8E161CFF770B3DFF62035EC454
+00787733009B2A1400B9060C1BC9042065C22437B0A22437B0A22437B0A224
+37B0A22437B0A22437B0A22437B0A22437B0A22437B0A22437B0A22437B0A2
+2437B0A22437B0A22437B0A2A1500000A3530000A6580000AA5D0000B06300
+00B76C0000C0780000CC830001E58C0007FC940708FF991506FF951717FF90
+1728B07700598A6E007064660090274A00A9023816B900555CAF00577EA700
+577EA700577EA700577EA700577EA700577EA700577EA700577EA700577EA7
+00577EA700577EA700577EA700577EA700577EA7A1500000A2540000A55800
+00AA5D0000AF640000B66D0000BE790000C9840001E48F0004FD970705FF9F
+1500FFA21711DF9D02359F9500508BA000636AAD007A369A0197006A11A818
+B35C961FB673881FB673881FB673881FB673881FB673881FB673881FB67388
+1FB673881FB673881FB673881FB673881FB673881FB673881FB67388A15000
+00A2540000A4580000A95D0000AE640000B46E0000BB790000C6850000DD90
+0003FB9B0603FDA4050DF4B2021AC1B8002C99BA003E87DF004E71FF0D5B36
+E0007B02A7089200DE358A00EB528800EB528800EB528800EB528800EB5288
+00EB528800EB528800EB528800EB528800EB528800EB528800EB528800EB52
+8800EB5288A1510000A1540000A4590000A85E0000AD650000B26E0000B97A
+0000C3860000D5910001DD9D0005D2AB000BC8C50014B2E2001DB3FF200C7D
+FF053951FF00542CFF006B0DFD007C00FF2A7B00FF3E7500FF3E7500FF3E75
+00FF3E7500FF3E7500FF3E7500FF3E7500FF3E7500FF3E7500FF3E7500FF3E
+7500FF3E7500FF3E7500FF3E75A0510000A1550000A3590000A75F0000AC66
+0000B16F0000B67B0000BF860000BD920000B59F0001B5B30006AECF000E9E
+EF011691FF0E1763FF003B42FF00521CFF006B03FF077500FF317000FF4C6C
+00FF4C6C00FF4C6C00FF4C6C00FF4C6C00FF4C6C00FF4C6C00FF4C6C00FF4C
+6C00FF4C6C00FF4C6C00FF4C6C00FF4C6C00FF4C6CA0520000A0550000A35A
+0000A65F0000AA660000AF700000B57B0000B3870000A9940000A8A20002A7
+B900079CD2000F8EF0011679FF022152FF003D2FFF005710FF006A01FF176E
+00FF3B6700FF5C6300FF5C6300FF5C6300FF5C6300FF5C6300FF5C6300FF5C
+6300FF5C6300FF5C6300FF5C6300FF5C6300FF5C6300FF5C6300FF5C63A052
+0000A0560000A25A0000A55F0000AA660000AF6F0000AE7B0000A5890000A0
+9700019FA7000399BC00088ED5000F81F3011664FF002743FF003F20FF005A
+06FF03670BFF2C5E00FF475F00FF675B00FF675B00FF675B00FF675B00FF67
+5B00FF675B00FF675B00FF675B00FF675B00FF675B00FF675B00FF675B00FF
+675B00FF675BA0520000A0560000A25A0000A55F0000AA660000AC700000A1
+7D00009B8B00009899000196AB00048FC1000884DB000E75F9001752FF002C
+36FF004314FF005A02FF0C6113FF3F5033FF6F2B00FF715300FF715300FF71
+5300FF715300FF715300FF715300FF715300FF715300FF715300FF715300FF
+715300FF715300FF715300FF7153A0520000A0560000A25A0000A55F0000AA
+6600009E720000977F0000938D0000919D00018EB0000487C700077DE5000D
+67FB001A43FA003128FF03470AFF00590CFF24521CFF4D3E0EFF5E4300FF6D
+4E00FF6D4E00FF6D4E00FF6D4E00FF6D4E00FF6D4E00FF6D4E00FF6D4E00FF
+6D4E00FF6D4E00FF6D4E00FF6D4E00FF6D4E00FF6D4EA0520000A0560000A2
+5A0000A55F00009B69000094750000908200008D9000008AA0000186B50003
+81D0000675EF000C52F000203DF9072E1CFF014A03FF055514FF364327FF5D
+2C04FF5C450DFF843E0DFF843E0DFF843E0DFF843E0DFF843E0DFF843E0DFF
+843E0DFF843E0DFF843E0DFF843E0DFF843E0DFF843E0DFF843E0DFF843EA0
+520000A0560000A25A000099620000906C00008C7700008984000085930000
+83A4000081BB00027FE300016BF5000D42E600252EFD023511FF004A08FF16
+4919FF46371DFF5D2E06FF663E0EFF96360EFF96360EFF96360EFF96360EFF
+96360EFF96360EFF96360EFF96360EFF96360EFF96360EFF96360EFF96360E
+FF96360EFF9636A0520000A0560000985C00008E640000886E000085790000
+828700007D9500007DA900007CC4000071DD000453E2001637E4002723FF00
+390BFF074619FF333319FF4E2F03FF503D14FF7F2F0DFF99300DFF99300DFF
+99300DFF99300DFF99300DFF99300DFF99300DFF99300DFF99300DFF99300D
+FF99300DFF99300DFF99300DFF9930A0520000995700008C5E000184660000
+807000007D7C0000798900007398000073AC000071C4000165DD000541D600
+1A2EE600281AFF003904FF0A431AFF3B2B14FF4F2C0DFF612F12FF842A0CFF
+9B2B0CFF9B2B0CFF9B2B0CFF9B2B0CFF9B2B0CFF9B2B0CFF9B2B0CFF9B2B0C
+FF9B2B0CFF9B2B0CFF9B2B0CFF9B2B0CFF9B2B0CFF9B2B9B5300008C5A0001
+836100007C68000079720000757E00006D8B0000679A000067AC000064C400
+0153D4000A36D3001B27EA002912FF013803FF153D18FF412603FF443417FF
+732310FF89260AFF9E270AFF9E270AFF9E270AFF9E270AFF9E270AFF9E270A
+FF9E270AFF9E270AFF9E270AFF9E270AFF9E270AFF9E270AFF9E270AFF9E27
+8D560000825C00007A620000746A0000707400006A800000648D00005E9B00
+005BAC000059C3000143CC00102ED6001C20EF00290AFF023601FF1C3715FF
+452303FF4C2D15FF771F0DFF8B230AFF9F230AFF9F230AFF9F230AFF9F230A
+FF9F230AFF9F230AFF9F230AFF9F230AFF9F230AFF9F230AFF9F230AFF9F23
+0AFF9F230AFF9F2383580000795D0000726400006C6C000068770000628300
+005B8F0000589D000053AC00004DC0000439CC001128DA001C1AF3002905FF
+0A3207FF282B14FF4B1E17FF661A11FF7A1C0BFF8D1F0AFFA11F0AFFA11F0A
+FFA11F0AFFA11F0AFFA11F0AFFA11F0AFFA11F0AFFA11F0AFFA11F0AFFA11F
+0AFFA11F0AFFA11F0AFFA11F0AFFA11F>
+<A24B0000A44E0000A8520000AD560000B45B0000BC610000C7690000D36F00
+08E0710014F471001FFE69032CF3510047D834005FD30B017AC700197FF706
+427BE600697AD911A16EBD07FF6EAF13FE66AE12FE66AE12FE66AE12FE66AE
+12FE66AE12FE66AE12FE66AE12FE66AE12FE66AE12FE66AE12FE66AE12FE66
+AE12FE66AE12FE66A24B0000A44E0000A8520000AD560000B45B0000BC6100
+00C7690000D36F0008E0710014F471001FFE69032CF3510047D834005FD30B
+017AC700197FF706427BE600697AD911A16EBD07FF6EAF13FE66AE12FE66AE
+12FE66AE12FE66AE12FE66AE12FE66AE12FE66AE12FE66AE12FE66AE12FE66
+AE12FE66AE12FE66AE12FE66AE12FE66A24B0000A44E0000A8520000AD5600
+00B45B0000BC610000C7690000D36F0008E0710014F471001FFE69032CF351
+0047D834005FD30B017AC700197FF706427BE600697AD911A16EBD07FF6EAF
+13FE66AE12FE66AE12FE66AE12FE66AE12FE66AE12FE66AE12FE66AE12FE66
+AE12FE66AE12FE66AE12FE66AE12FE66AE12FE66AE12FE66A24B0000A44E00
+00A8520000AD560000B45B0000BC610000C7690000D36F0008E0710014F471
+001FFE69032CF3510047D834005FD30B017AC700197FF706427BE600697AD9
+11A16EBD07FF6EAF13FE66AE12FE66AE12FE66AE12FE66AE12FE66AE12FE66
+AE12FE66AE12FE66AE12FE66AE12FE66AE12FE66AE12FE66AE12FE66AE12FE
+66A24B0000A44E0000A8520000AD560000B45B0000BC610000C7690000D36F
+0008E0710014F471001FFE69032CF3510047D834005FD30B017AC700197FF7
+06427BE600697AD911A16EBD07FF6EAF13FE66AE12FE66AE12FE66AE12FE66
+AE12FE66AE12FE66AE12FE66AE12FE66AE12FE66AE12FE66AE12FE66AE12FE
+66AE12FE66AE12FE66A24B0000A44E0000A8520000AD560000B45B0000BC61
+0000C7690000D36F0008E0710014F471001FFE69032CF3510047D834005FD3
+0B017AC700197FF706427BE600697AD911A16EBD07FF6EAF13FE66AE12FE66
+AE12FE66AE12FE66AE12FE66AE12FE66AE12FE66AE12FE66AE12FE66AE12FE
+66AE12FE66AE12FE66AE12FE66AE12FE66A24B0000A44E0000A8520000AD56
+0000B45B0000BC610000C7690000D36F0008E0710014F471001FFE69032CF3
+510047D834005FD30B017AC700197FF706427BE600697AD911A16EBD07FF6E
+AF13FE66AE12FE66AE12FE66AE12FE66AE12FE66AE12FE66AE12FE66AE12FE
+66AE12FE66AE12FE66AE12FE66AE12FE66AE12FE66AE12FE66A24B0000A44E
+0000A8520000AD560000B45B0000BC610000C7690000D36F0008E0710014F4
+71001FFE69032CF3510047D834005FD30B017AC700197FF706427BE600697A
+D911A16EBD07FF6EAF13FE66AE12FE66AE12FE66AE12FE66AE12FE66AE12FE
+66AE12FE66AE12FE66AE12FE66AE12FE66AE12FE66AE12FE66AE12FE66AE12
+FE66A24B0000A44E0000A8520000AD560000B35B0000BC610000C7690000D3
+6F0008DF720013F472001FFE6B042BF6530046DB37005ED30E0079C7001780
+F2063F7CE700667BDA0F9D70B906FB71AA11FA68A911F968A911F968A911F9
+68A911F968A911F968A911F968A911F968A911F968A911F968A911F968A911
+F968A911F968A911F968A24B0000A44F0000A7520000AD560000B35B0000BB
+620000C66A0000D2700007DE730012F274001DFF6F0627F9580044E33E005C
+D5160076C6001282E705377EEA00617EDC0B9575AF03F1769F0EF06E9F0EF0
+6E9F0EF06E9F0EF06E9F0EF06E9F0EF06E9F0EF06E9F0EF06E9F0EF06E9F0E
+F06E9F0EF06E9F0EF06E9F0EF06E9F0EF06EA24C0000A44F0000A7520000AC
+570000B25C0000BA620000C56A0000D1710006DD750011F176001CFF750823
+FB5E033DEC44005AD71D0073C5000D83DE033081EE035C7FDE068E7AA901E5
+7B960AE773950AE774950AE774950AE774950AE774950AE774950AE774950A
+E774950AE774950AE774950AE774950AE774950AE774950AE774A24C0000A4
+4F0000A7520000AC570000B25C0000BA630000C46B0000D0720005DD760010
+F078001BFF7A0B1EFC650637F44A0057DA260070C9060A83D5012984F20657
+80E1018780AD04D37C8D06DE7A8C06DE7A8C06DE7A8C06DE7A8C06DE7A8C06
+DE7A8C06DE7A8C06DE7A8C06DE7A8C06DE7A8C06DE7A8C06DE7A8C06DE7A8C
+06DE7AA24C0000A44F0000A6530000AB570000B15C0000B9630000C36B0000
+CF740004DD78000EEF7A001AFF7C0A1DFD6D0A30F84F0055DD2F006DCD0B07
+82CD002288F70A5281E3008084B308C37E8402D6818302D6818302D6818302
+D6818302D6818302D6818302D6818302D6818302D6818302D6818302D68183
+02D6818302D6818302D681A24C0000A34F0000A6530000AB570000B15C0000
+B8630000C26C0000CF750003DD7A000DEE7C0018FF7E091CFF760D29FC5400
+52E3380069D1110382CB001C8AFC0E4C82E7007887BC0AB6807B00D7887800
+D9897800D9897800D9897800D9897800D9897800D9897800D9897800D98978
+00D9897800D9897800D9897800D9897800D989A14C0000A3500000A6530000
+AA580000B05D0000B7640000C16D0000CD770002DC7C000BED7E0016FF8107
+1CFF7E1023FF5A004EEC410066DA1B0080C200138DF50B418AAB0063957A01
+A99E4A03F0964705F4974705F4974705F4974705F4974705F4974705F49747
+05F4974705F4974705F4974705F4974705F4974705F4974705F497A14D0000
+A3500000A5530000AA580000AF5D0000B6640000C06E0000CC780002DC7E00
+09ED810014FF84071AFF821020FF640346F64C0061E129007B8D0D02996200
+17A74B003DAF370477B32410D3A31E0DC3A41E0DC3A41E0DC3A41E0DC3A41E
+0DC3A41E0DC3A41E0DC3A41E0DC3A41E0DC3A41E0DC3A41E0DC3A41E0DC3A4
+1E0DC3A4A14D0000A2500000A5540000A9580000AE5E0000B5650000BE6F00
+00C97A0001DA810007EE850010FF880518FF87101CFF750D35EC5E005CA84F
+00746A2E0095241200B1050A1BBD041B58C02B39B291273AAF92273AAF9227
+3AAF92273AAF92273AAF92273AAF92273AAF92273AAF92273AAF92273AAF92
+273AAF92273AAF92273AAF92A14D0000A2510000A4540000A8590000AD5E00
+00B4650000BC6F0000C77B0000D6830005ED89000DFF8D0613FF8E1118FF8B
+0A2FA47400558269006D595D008D1E3C00A3003417B0015958A900498D9C00
+4A8B9B004A8B9B004A8B9B004A8B9B004A8B9B004A8B9B004A8B9B004A8B9B
+004A8B9B004A8B9B004A8B9B004A8B9B004A8B9BA14E0000A2510000A45500
+00A7590000AC5F0000B2660000BA700000C47C0000D4860003F08D000AFF95
+0B09FB9A041DC39700349691004B829B00605A96007A206D0096006315A107
+9D57960397AA8B0399AB8A0399AB8A0399AB8A0399AB8A0399AB8A0399AB8A
+0399AB8A0399AB8A0399AB8A0399AB8A0399AB8A0399AB8A0399AB8AA14E00
+00A1510000A3550000A65A0000AB5F0000B1670000B8710000C17D0000CE88
+0001EE910007DD9A000FD8AA0019B3B200278FB1003A7BC8004E5AD8016128
+B3007E0094118D00B9388600F5817D00F4817C00F4817C00F4817C00F4817C
+00F4817C00F4817C00F4817C00F4817C00F4817C00F4817C00F4817C00F481
+7C00F4817CA14F0000A1520000A2560000A55A0000AA600000AF670000B572
+0000BE7E0000C9890000BD940004B9A1000AB3B60012A5CF001A98F7011F77
+FB00344FF2005027EC006906E2077900F42B7500FA5E6E00FD616D00FD616D
+00FD616D00FD616D00FD616D00FD616D00FD616D00FD616D00FD616D00FD61
+6D00FD616D00FD616D00FD616DA04F0000A0520000A1560000A45B0000A961
+0000AE680000B3720000BA7E0000AD8B0000A8980002A7A90005A1C1000A95
+DD001188FA031865FF002C43FF00461EFF006104FF046D00FF2B6900FF5762
+00FF5E6200FF5E6200FF5E6200FF5E6200FF5E6200FF5E6200FF5E6200FF5E
+6200FF5E6200FF5E6200FF5E6200FF5E6200FF5E62A0500000A0530000A157
+0000A45B0000A7610000AC690000B0730000A7800000A08E00009E9C00019B
+AE000593C5000A88E1001176FB011A52FF003333FF004B11FF006101FF1366
+0AFF3F5A00FF605A00FF695900FF695900FF695900FF695900FF695900FF69
+5900FF695900FF695900FF695900FF695900FF695900FF695900FF6959A050
+0000A0530000A1570000A35C0000A7620000AC690000A47500009C83000098
+90000095A0000293B4000588C9000A7EEA001064FE001F43FF003623FF0051
+07FF005F1AFF394B1EFF533F00FF675300FF755100FF755100FF755100FF75
+5100FF755100FF755100FF755100FF755100FF755100FF755100FF755100FF
+755100FF7551A0500000A0540000A1570000A35C0000A7620000A16B000098
+77000094850000909300008FA4000289B9000481D2000975F4001052F70024
+3CFF063417FF005102FF095A16FF404531FF6A2601FF654C01FF724B01FF72
+4B01FF724B01FF724B01FF724B01FF724B01FF724B01FF724B01FF724B01FF
+724B01FF724B01FF724B01FF724BA0500000A0540000A1570000A35C00009E
+630000946E0000907A00008D8700008996000087A9000283C000037DE20006
+67F5001242EF002936FF0E310CFF005008FF1C4C15FF483F31FF702011FF83
+3A10FF983810FF983810FF983810FF983810FF983810FF983810FF983810FF
+983810FF983810FF983810FF983810FF983810FF9838A0500000A0540000A1
+5700009C5D0000926600008C700000897C0000858A00008199000080AD0001
+80CB000173E6000650E3001B36EF002C20FF004007FF074B1AFF3A3610FF4C
+3A08FF5A3A0FFF8F340CFFA1340CFFA1340CFFA1340CFFA1340CFFA1340CFF
+A1340CFFA1340CFFA1340CFFA1340CFFA1340CFFA1340CFFA1340CFFA134A0
+500000A05400009D5800008F6000008868000084720000817F00007D8C0000
+799C000079B2000077CF00016BEE00063FD9001E2DF1002D15FF004007FF14
+431DFF442C0DFF50350EFF69320EFF902E0BFFA12E0BFFA12E0BFFA12E0BFF
+A12E0BFFA12E0BFFA12E0BFFA12E0BFFA12E0BFFA12E0BFFA12E0BFFA12E0B
+FFA12E0BFFA12EA05000009F5400008F5A0000866200007F6A00007C740000
+79810000728E00006D9E00006EB400006BCF000151D7001034D6001F25F200
+2E0CFF013E04FF1C3E1DFF4D2508FF513215FF7A270CFF962A0AFFA42A0AFF
+A42A0AFFA42A0AFFA42A0AFFA42A0AFFA42A0AFFA42A0AFFA42A0AFFA42A0A
+FFA42A0AFFA42A0AFFA42A0AFFA42AA050000090560000845D00007D640000
+776C0000747700006E8300006790000063A0000061B300005CCD000240CF00
+142DD900201DF5002F07FF073A03FF243813FF4A260BFF5B2A13FF7F230AFF
+97260AFFA5250AFFA5250AFFA5250AFFA5250AFFA5250AFFA5250AFFA5250A
+FFA5250AFFA5250AFFA5250AFFA5250AFFA5250AFFA5259253000085580001
+7B5F0000746600006F6E00006A790000648500005E9300005AA2000057B300
+004DC7000636CF001526DE002016F8002E02FF0F370AFF2F2B11FF4F2215FF
+6C1D10FF811F0AFF992208FFA52208FFA52208FFA52208FFA52208FFA52208
+FFA52208FFA52208FFA52208FFA52208FFA52208FFA52208FFA52208FFA522
+865500007B5A0000726000006C67000067710000627C00005C880000579500
+0054A400004FB4000041C5000A2ED1001420E4002110FC032C01FF183013FF
+3D1E14FF591A12FF701B11FF85190AFF9B1D08FFA61D08FFA61D08FFA61D08
+FFA61D08FFA61D08FFA61D08FFA61D08FFA61D08FFA61D08FFA61D08FFA61D
+08FFA61D08FFA61D7C570000725C00006A62000065690000607400005B7F00
+00568B0000519800004DA6000046B6000238C7000A28D500151BEA002009FE
+052B00FF1E2A11FF421911FF5D1813FF741418FF890A0AFF9B1806FFA61B06
+FFA61B06FFA61B06FFA61B06FFA61B06FFA61B06FFA61B06FFA61B06FFA61B
+06FFA61B06FFA61B06FFA61B06FFA61B>
+<A1480000A34B0000A74E0000AB510000B2560000B95B0000C4600000D06500
+07DC680012EE66001EF75B002FE6450045D126005DCD000575C3001F74F801
+4673DE006A6FE800B66AAA00F16AA913FF58A813FF59A813FF59A813FF59A8
+13FF59A813FF59A813FF59A813FF59A813FF59A813FF59A813FF59A813FF59
+A813FF59A813FF59A1480000A34B0000A74E0000AB510000B2560000B95B00
+00C4600000D0650007DC680012EE66001EF75B002FE6450045D126005DCD00
+0575C3001F74F8014673DE006A6FE800B66AAA00F16AA913FF58A813FF59A8
+13FF59A813FF59A813FF59A813FF59A813FF59A813FF59A813FF59A813FF59
+A813FF59A813FF59A813FF59A813FF59A1480000A34B0000A74E0000AB5100
+00B2560000B95B0000C4600000D0650007DC680012EE66001EF75B002FE645
+0045D126005DCD000575C3001F74F8014673DE006A6FE800B66AAA00F16AA9
+13FF58A813FF59A813FF59A813FF59A813FF59A813FF59A813FF59A813FF59
+A813FF59A813FF59A813FF59A813FF59A813FF59A813FF59A1480000A34B00
+00A74E0000AB510000B2560000B95B0000C4600000D0650007DC680012EE66
+001EF75B002FE6450045D126005DCD000575C3001F74F8014673DE006A6FE8
+00B66AAA00F16AA913FF58A813FF59A813FF59A813FF59A813FF59A813FF59
+A813FF59A813FF59A813FF59A813FF59A813FF59A813FF59A813FF59A813FF
+59A1480000A34B0000A74E0000AB510000B2560000B95B0000C4600000D065
+0007DC680012EE66001EF75B002FE6450045D126005DCD000575C3001F74F8
+014673DE006A6FE800B66AAA00F16AA913FF58A813FF59A813FF59A813FF59
+A813FF59A813FF59A813FF59A813FF59A813FF59A813FF59A813FF59A813FF
+59A813FF59A813FF59A1480000A34B0000A74E0000AB510000B2560000B95B
+0000C4600000D0650007DC680012EE66001EF75B002FE6450045D126005DCD
+000575C3001F74F8014673DE006A6FE800B66AAA00F16AA913FF58A813FF59
+A813FF59A813FF59A813FF59A813FF59A813FF59A813FF59A813FF59A813FF
+59A813FF59A813FF59A813FF59A813FF59A1480000A34B0000A74E0000AB51
+0000B2560000B95B0000C4600000CF660007DC680012EE66001EF75B002EE7
+450045D227005DCD000476C3001F74F9014673DE00696FE900B66AAB00F16A
+A913FF59A813FF59A813FF59A813FF59A813FF59A813FF59A813FF59A813FF
+59A813FF59A813FF59A813FF59A813FF59A813FF59A813FF59A1480000A34B
+0000A74E0000AB520000B1560000B95B0000C3610000CF670006DB690011ED
+68001DF85E002DED4A0043D22C005AD0000177C4001C76FB014275E2006671
+EE00B06CB000EF6BAA13FF5BA913FF5BA913FF5BA913FF5BA913FF5BA913FF
+5BA913FF5BA913FF5BA913FF5BA913FF5BA913FF5BA913FF5BA913FF5BA913
+FF5BA1480000A34B0000A64E0000AB520000B1560000B85B0000C2610000CE
+670005DB6A0010EC6A001CFA62002BF14E0041D4310058D0060075C4001877
+F0013C77E5006272EA00A36EB700ED6BAC12FF5DAA13FF5DAA13FF5DAA13FF
+5DAA13FF5DAA13FF5DAA13FF5DAA13FF5DAA13FF5DAA13FF5DAA13FF5DAA13
+FF5DAA13FF5DAA13FF5DA1480000A34B0000A64F0000AA520000B0560000B8
+5C0000C2620000CE680005DA6C000FEB6C001BFB660129F452003FD9370056
+CF0D0072C4001479E6013678E9005F74E6009871BE00EC6CAD12FF5FAB13FF
+5FAB13FF5FAB13FF5FAB13FF5FAB13FF5FAB13FF5FAB13FF5FAB13FF5FAB13
+FF5FAB13FF5FAB13FF5FAB13FF5FAB13FF5FA1480000A34C0000A64F0000AA
+520000B0570000B75C0000C1630000CD690004D96D000EE96E001AFC6A0225
+F656003DDF3D0054CF15006FC500117BDD01307AEC015B76E3008E73C600E9
+6DAF12FF62AD13FF61AD13FF61AD13FF61AD13FF61AD13FF61AD13FF61AD13
+FF61AD13FF61AD13FF61AD13FF61AD13FF61AD13FF61AD13FF61A1490000A3
+4C0000A64F0000AA530000B0570000B75C0000C0630000CC6A0003D86E000D
+E76F0019FC6E0323F85A003AE5420052CE1C006BC8030D7BD4002B7CF00256
+78DF008476CA05DA6DB112FF64AE13FF63AE13FF63AE13FF63AE13FF63AE13
+FF63AE13FF63AE13FF63AE13FF63AE13FF63AE13FF63AE13FF63AE13FF63AE
+13FF63A1490000A34C0000A54F0000A9530000AF570000B65D0000C0640000
+CB6B0002D76F000CE6710017FA710321FB600037EB480050CE260068CB0609
+7CCA00247EF504517ADD007B7ACE0BCC6EB310FF68AF13FF66B013FF66B013
+FF66B013FF66B013FF66B013FF66B013FF66B013FF66B013FF66B013FF66B0
+13FF66B013FF66B013FF66A1490000A24C0000A5500000A9530000AF580000
+B55D0000BF640000CA6D0001D671000BE3730016F974031FFF660033F34F00
+4DD2300064D00A057DC9001E81FB084B7CE100737DD10FBB717B00D37F6A00
+F5806900F5816900F5816900F5816900F5816900F5816900F5816900F58169
+00F5816900F5816900F5816900F5816900F581A14A0000A24D0000A5500000
+A8540000AE580000B55E0000BD650000C96E0001D5730009E2760014F87702
+1EFF6E042CF9560049DF3A0061D612007CC6001684C4023988940059907800
+9A974A00DA8D3E00F58C3E00F58C3E00F58C3E00F58C3E00F58C3E00F58C3E
+00F58C3E00F58C3E00F58C3E00F58C3E00F58C3E00F58C3E00F58CA14A0000
+A24D0000A4500000A8540000AD590000B45E0000BC660000C76F0001D47500
+07E2790012F77B011DFF770A23FD61043FF146005DC72800777C0B01935900
+17A1450038A5320069AA2007DCA11A0AC39B190AC29B190AC29B190AC29B19
+0AC29B190AC29B190AC29B190AC29B190AC29B190AC29B190AC29B190AC29B
+190AC29BA14A0000A24D0000A4510000A7540000AC590000B25F0000BA6600
+00C5700000D2780005E27D000FF57F011AFF810E1BFF710C30C35B00579347
+00715F2A008F201000A9050A1BB2041649B31832DB951A34D48E1A34D48E1A
+34D48E1A34D48E1A34D48E1A34D48E1A34D48E1A34D48E1A34D48E1A34D48E
+1A34D48E1A34D48E1A34D48EA14B0000A24E0000A3510000A6550000AB5A00
+00B15F0000B9670000C3720000D07C0003E181000CF4830016FE870B19DE82
+02349B7100517A6300695253008817310099003017A7004244A202478A9502
+438E9001438E9001438E9001438E9001438E9001438E9001438E9001438E90
+01438E9001438E9001438E9001438E9001438E90A14B0000A14E0000A35100
+00A5550000AA5A0000B0600000B7680000C0730000CC7E0001DE850008EB8A
+0012E293001EB09000308E8D00477A93005E4F840078175B0092005B179901
+8759930592AC851693C8721693C8721693C8721693C8721693C8721693C872
+1693C8721693C8721693C8721693C8721693C8721693C8721693C872A14C00
+00A14F0000A2520000A4560000A95B0000AE610000B5690000BD740000C880
+0000D0890005C491000EBD9F0018A5A8002588A9003672B9004C4CB100641E
+95008000871688009C3E8100BB817800C9AE7100CAAD7100CAAD7100CAAD71
+00CAAD7100CAAD7100CAAD7100CAAD7100CAAD7100CAAD7100CAAD7100CAAD
+7100CAAD71A14C0000A14F0000A1520000A3570000A85C0000AD620000B36A
+0000BA750000BA810000AF8D0004AB99000BA6AA001299BE00188BD6001F69
+D4003748D500501FC7006901B80F7600D9307000DE5A6A00F4846600F48465
+00F4846500F4846500F4846500F4846500F4846500F4846500F4846500F484
+6500F4846500F4846500F48465A14D0000A1500000A1530000A3570000A65C
+0000AB630000B06B0000AF770000A5840000A09100039CA1000697B4000B8D
+CB001080E9001664F8002642FB003E20FF005905FD066512FF38570AFF5253
+00FF6B5800FF6B5800FF6B5800FF6B5800FF6B5800FF6B5800FF6B5800FF6B
+5800FF6B5800FF6B5800FF6B5800FF6B5800FF6B58A14E0000A0500000A054
+0000A2580000A55D0000A9630000AA6D00009F7A0000998800009596000193
+A700038EBD000683D5000C75F7001453FC002935FF004013FF00580AFF1559
+10FF414E25FF6A3300FF745000FF745000FF745000FF745000FF745000FF74
+5000FF745000FF745000FF745000FF745000FF745000FF745000FF7450A14E
+0000A0510000A0550000A1590000A45E0000A56400009B6F0000957C000091
+8A00008E9900018CAC000386C300057CE2000A67F9001742F6002E2EFF093D
+09FF005606FF21532CFF5C2C00FF594C05FF7B4605FF7B4605FF7B4605FF7B
+4605FF7B4605FF7B4605FF7B4605FF7B4605FF7B4605FF7B4605FF7B4605FF
+7B4605FF7B46A14F0000A0510000A0550000A1590000A35E00009767000090
+7200008D7F00008A8D0000869D000184B1000281CE000375ED000950EA001E
+38F9022F1BFF004703FF075219FF3F3B23FF5E2C01FF5F430EFF9E360EFF9E
+360EFF9E360EFF9E360EFF9E360EFF9E360EFF9E360EFF9E360EFF9E360EFF
+9E360EFF9E360EFF9E360EFF9E36A14F0000A0510000A0550000A159000094
+6100008C6A00008874000085820000819000007EA100007EB800007CDC0001
+6FFD000740E000232DFD003311FF014612FF233D1BFF4A3105FF513E11FF7B
+330BFFA9320AFFAB320AFFAB320AFFAB320AFFAB320AFFAB320AFFAB320AFF
+AB320AFFAB320AFFAB320AFFAB320AFFAB320AFFAB32A14F0000A0510000A0
+550000935B00008A630000836C0000817700007D8400007792000075A40000
+77BE00006ED600034FDA001534DE002424FF003509FF044314FF2E321EFF55
+2808FF5A3512FF832C09FFAB2D08FFAE2D08FFAE2D08FFAE2D08FFAE2D08FF
+AE2D08FFAE2D08FFAE2D08FFAE2D08FFAE2D08FFAE2D08FFAE2D08FFAE2DA1
+4F0000A051000093570000885E0001806500007B6E00007879000073860000
+6A9400006AA6000069BC00005FD400053FD200182CE100251AFE003504FF0C
+3E13FF362C06FF433218FF722410FF892708FFAA2907FFAC2907FFAC2907FF
+AC2907FFAC2907FFAC2907FFAC2907FFAC2907FFAC2907FFAC2907FFAC2907
+FFAC2907FFAC29A14F000095530000885900017E6000007767000073700000
+6E7C000068880000619600005FA700005CBB00004ECC000A35D1001825E600
+2612FE003401FF153A10FF3B2805FF4A2D15FF77200DFF8B2308FFAA2407FF
+AB2407FFAB2407FFAB2407FFAB2407FFAB2407FFAB2407FFAB2407FFAB2407
+FFAB2407FFAB2407FFAB2407FFAB2499500000885500007D5B000075620000
+6F6900006A730000657E00005F8B00005998000056A8000052BC000140C900
+0D2DD400181FEB00260AFE043101FF1E3315FF471E15FF601C12FF7A1C0AFF
+8E2004FFA62203FFA72203FFA72203FFA72203FFA72203FFA72203FFA72203
+FFA72203FFA72203FFA72203FFA72203FFA72203FFA7228A5200007E570000
+745D00006D630000676B0000637600005D810000588E0000539B00004FAA00
+0048BC000336CA000E26D8001919F0002505FF0A2E02FF252A15FF4D1912FF
+661912FF7C170CFF901A06FFA81D05FFA81E05FFA81E05FFA81E05FFA81E05
+FFA81E05FFA81E05FFA81E05FFA81E05FFA81E05FFA81E05FFA81E05FFA81E
+7F540000755900006C5E000065650000606E00005C79000057840000529100
+004D9E000048AC00003EBD00052ECE000E20DE001912F5002400FF122B01FF
+292613FF521510FF681519FF810712FF920E03FFA91B03FFA91B03FFA91B03
+FFA91B03FFA91B03FFA91B03FFA91B03FFA91B03FFA91B03FFA91B03FFA91B
+03FFA91B03FFA91B765500006C5A0000646000005F6700005A710000557C00
+00508800004C94000046A0000040AF000036C1000527D2000E1BE500180AF7
+022400FF1A240CFF371712FF560F0CFF6A1313FF800A12FF920802FFA31801
+FFA41801FFA41801FFA41801FFA41801FFA41801FFA41801FFA41801FFA418
+01FFA41801FFA41801FFA41801FFA418>
+<A1440000A3470000A64A0000AA4D0000B0510000B7550000C1590000CC5D00
+06D95E0011E85A001DEC4D002EDB370043D519005DC4000C6CBF00256AD000
+4468D4006B64C4009A63A900D35FAC13FF4EA412FF4CA412FF4CA412FF4CA4
+12FF4CA412FF4CA412FF4CA412FF4CA412FF4CA412FF4CA412FF4CA412FF4C
+A412FF4CA412FF4CA1440000A3470000A64A0000AA4D0000B0510000B75500
+00C1590000CC5D0006D95E0011E85A001DEC4D002EDB370043D519005DC400
+0C6CBF00256AD0004468D4006B64C4009A63A900D35FAC13FF4EA412FF4CA4
+12FF4CA412FF4CA412FF4CA412FF4CA412FF4CA412FF4CA412FF4CA412FF4C
+A412FF4CA412FF4CA412FF4CA412FF4CA1440000A3470000A64A0000AA4D00
+00B0510000B7550000C1590000CC5D0006D95E0011E85A001DEC4D002EDB37
+0043D519005DC4000C6CBF00256AD0004468D4006B64C4009A63A900D35FAC
+13FF4EA412FF4CA412FF4CA412FF4CA412FF4CA412FF4CA412FF4CA412FF4C
+A412FF4CA412FF4CA412FF4CA412FF4CA412FF4CA412FF4CA1440000A34700
+00A64A0000AA4D0000B0510000B7550000C1590000CC5D0006D95E0011E85A
+001DEC4D002EDB370043D519005DC4000C6CBF00256AD0004468D4006B64C4
+009A63A900D35FAC13FF4EA412FF4CA412FF4CA412FF4CA412FF4CA412FF4C
+A412FF4CA412FF4CA412FF4CA412FF4CA412FF4CA412FF4CA412FF4CA412FF
+4CA1440000A3470000A64A0000AA4D0000B0510000B7550000C1590000CC5D
+0006D95E0011E85A001DEC4D002EDB370043D519005DC4000C6CBF00256AD0
+004468D4006B64C4009A63A900D35FAC13FF4EA412FF4CA412FF4CA412FF4C
+A412FF4CA412FF4CA412FF4CA412FF4CA412FF4CA412FF4CA412FF4CA412FF
+4CA412FF4CA412FF4CA1450000A3470000A54A0000AA4D0000B0510000B755
+0000C0590000CB5D0005D95F0010E75C001DED50002DDE3B0042D41C005CC6
+000A6DBF00236BCF004169D6006965C7009764AB00D260AD13FF4FA513FF4D
+A513FF4DA513FF4DA513FF4DA513FF4DA513FF4DA513FF4DA513FF4DA513FF
+4DA513FF4DA513FF4DA513FF4DA513FF4DA1450000A2470000A54A0000AA4E
+0000B0510000B6550000C05A0000CB5E0004D8600010E75E001CEF53002BE2
+3F0040D3200059C800076FC000216CCE003E6BD8006667C9009466AE00D061
+AD12FF51A513FF4EA513FF4EA513FF4EA513FF4EA513FF4EA513FF4EA513FF
+4EA513FF4EA513FF4EA513FF4EA513FF4EA513FF4EA513FF4EA1450000A247
+0000A54A0000AA4E0000AF520000B6550000BF5A0000CA5F0004D761000FE7
+60001BF056002AE643003FD2240057CA000470C1001E6DCF003B6CDB006368
+CE009367B300CF62AD11FF54A513FF50A613FF50A613FF50A613FF50A613FF
+50A613FF50A613FF50A613FF50A613FF50A613FF50A613FF50A613FF50A613
+FF50A1460000A2480000A54B0000A94E0000AF520000B5560000BF5B0000CA
+600003D762000EE662001AF2590028E947003DD2280055CA04036FC1001B6F
+CE00376EDE00606AD0008F68B700CF63AC10FF56A613FF51A613FF52A613FF
+52A613FF52A613FF52A613FF52A613FF52A613FF52A613FF52A613FF52A613
+FF52A613FF52A613FF52A1460000A2480000A54B0000A94E0000AF520000B5
+560000BE5B0000C9600003D663000EE5630019F35C0027EC4A003BD32D0052
+CA0A036CC2001870CC00346FE1005D6BD200896ABD00CE64AC0FFF59A713FF
+53A713FF53A713FF53A713FF53A713FF53A713FF53A713FF53A713FF53A713
+FF53A713FF53A713FF53A713FF53A713FF53A1460000A2480000A54B0000A9
+4F0000AE520000B5560000BE5C0000C9610002D565000DE4650018F55F0025
+EF4E0039D4330050CA10026AC3001572CA003071E5005A6DD400846BC300CD
+65AB0DFF5CA713FF55A713FF55A713FF55A713FF55A713FF55A713FF55A713
+FF55A713FF55A713FF55A713FF55A713FF55A713FF55A713FF55A1460000A2
+480000A44B0000A84F0000AE530000B4570000BD5C0000C8620002D466000C
+E2670017F5630024F2530037D839004DCB170167C5001074C7002B73EB0055
+70D6007D6DCB00CB67AB0CFF60A813FF57A813FF58A813FF58A813FF58A813
+FF58A813FF58A813FF58A813FF58A813FF58A813FF58A813FF58A813FF58A8
+13FF58A1470000A2490000A44C0000A84F0000AD530000B3570000BC5D0000
+C7630000D368000AE0690015F3660022F7580034E040004BCB1F0063C9000B
+76C5002675F3015073D8007670D501C669AB09FF64A913FF5AA913FF5AA913
+FF5AA913FF5AA913FF5AA913FF5AA913FF5AA913FF5AA913FF5AA913FF5AA9
+13FF5AA913FF5AA913FF5AA1470000A2490000A44C0000A8500000AC530000
+B3580000BB5D0000C6640000D2690009DF6C0014F26A0020FB5F0030E94800
+48CF280060CD030678C4002078FA034A75DD006E73C705BC717F02D9766400
+FF775F00F7785F00F7785F00F7785F00F7785F00F7785F00F7785F00F7785F
+00F7785F00F7785F00F7785F00F7785F00F778A1480000A14A0000A44D0000
+A7500000AC540000B2580000BA5E0000C5650000D16B0007DD6E0012F06E00
+1DFC67032AF3500044D933005CD2080078BF00187D9F0031848000508A7100
+89914D00BF883F00FB823C00FE833C00FE833C00FE833C00FE833C00FE833C
+00FE833C00FE833C00FE833C00FE833C00FE833C00FE833C00FE83A1480000
+A14A0000A34D0000A6500000AB540000B1590000B95F0000C3660000CF6D00
+05DB710010EC72001BFE700723F959003FE7410057B22500737009018E5200
+179B3F00339D320057A12001AB9D210AF7901B07F6931B07F6931B07F6931B
+07F6931B07F6931B07F6931B07F6931B07F6931B07F6931B07F6931B07F693
+1B07F693A1490000A14B0000A34E0000A6510000AA550000B05A0000B76000
+00C1680000CD700003D974000DE8760018FD78081EFA700D2BAD5600538740
+006D572700891C0E00A305091AA903123FA80322A7A12033FF821F36FF811F
+36FF811F36FF811F36FF811F36FF811F36FF811F36FF811F36FF811F36FF81
+1F36FF811F36FF811F36FF81A1490000A14B0000A34E0000A5520000A95600
+00AF5A0000B6610000BF690000CA730001D878000AE77B0015EE7E0021BF79
+0033936C004D725C00664C4C0083142D0093002D179F003B3E9C0040749301
+41C4830245C9820245C9820245C9820245C9820245C9820245C9820245C982
+0245C9820245C9820245C9820245C9820245C982A14A0000A14C0000A24F00
+00A4520000A8560000AD5B0000B4620000BC6A0000C7750000D77D0007D282
+0011C488001EA488002D878600436F87005D447100771250008D0054179300
+6E488D006D7A86237FDD642481DD632481DD632481DD632481DD632481DD63
+2481DD632481DD632481DD632481DD632481DD632481DD632481DD63A14A00
+00A14C0000A24F0000A3530000A7570000AC5C0000B2630000BA6B0000C377
+0000BD810006B489000FAC940018989B0024809F003369AA004C4299006516
+800080007B178300873C7C00A47F7515B2DC5E14B5DC5D14B5DC5D14B5DC5D
+14B5DC5D14B5DC5D14B5DC5D14B5DC5D14B5DC5D14B5DC5D14B5DC5D14B5DC
+5D14B5DC5DA14B0000A14D0000A1500000A2530000A5580000AA5D0000B063
+0000B76C0000AE7A0000A7850005A191000B9A9F00128FAE00187EBD002160
+BE003840B9005118AA006900A1147200BB346C00C55F6500DFA16000E1A75E
+00E1A75E00E1A75E00E1A75E00E1A75E00E1A75E00E1A75E00E1A75E00E1A7
+5E00E1A75E00E1A75E00E1A75EA14C0000A14E0000A1500000A1540000A458
+0000A85E0000AE650000A67000009E7D0001998A0004959800078FA9000B85
+BC000F77D300165BDC00273EE4003E1DEF005702E30B6315FF415000FF5157
+00FF785200FF865100FF865100FF865100FF865100FF865100FF865100FF86
+5100FF865100FF865100FF865100FF865100FF8651A14C0000A04E0000A051
+0000A1550000A3590000A75E0000A068000097740000928100008F8F00018C
+A0000288B5000382CF000776F0000D53F300213DFC073017FF004F02FF0C57
+16FF434224FF672D08FF764407FF824207FF824207FF824207FF824207FF82
+4207FF824207FF824207FF824207FF824207FF824207FF824207FF8242A14D
+0000A14F0000A0520000A0560000A25A00009B610000926B00008D7700008A
+8500008793000084A5000181BC00027FE2000369F3000F41E900272EFE0536
+0CFF004D10FF254314FF4B3B17FF643010FF90360DFFA1350DFFA1350DFFA1
+350DFFA1350DFFA1350DFFA1350DFFA1350DFFA1350DFFA1350DFFA1350DFF
+A1350DFFA135A14E0000A1500000A0520000A0560000995C00008F64000088
+6E0000867A0000828700007E9600007DAA00007DC6000071DF00054FE00019
+35E800291FFF003C07FF0A471BFF3C310FFF503609FF64380DFF953109FFAD
+3109FFAD3109FFAD3109FFAD3109FFAD3109FFAD3109FFAD3109FFAD3109FF
+AD3109FFAD3109FFAD3109FFAD31A14E0000A1500000A0520000995700008C
+5F000185670000807000007D7C0000798900007398000073AD000071C60001
+62DD00073ED5001C2CEA002A15FF003C00FF0F441DFF462804FF4B3715FF7A
+290CFF972B06FFB22D06FFB22D06FFB22D06FFB22D06FFB22D06FFB22D06FF
+B22D06FFB22D06FFB22D06FFB22D06FFB22D06FFB22DA14E0000A15000009B
+5300008B5A0001826100007C68000078720000747E00006C8B0000679A0000
+66AD000063C600014FD3000D34D4001C24EF002B0EFF043901FF1C3D17FF48
+250DFF5A2B13FF80240AFF9B2703FFB12903FFB12903FFB12903FFB12903FF
+B12903FFB12903FFB12903FFB12903FFB12903FFB12903FFB12903FFB129A1
+4E00009D5000008C560000815C000079630000736A00006F75000069810000
+628E00005D9C00005AAD000056C400023FCC00112CD8001D1DF3002B07FF07
+3702FF243415FF4F210FFF642310FF83210AFF9C2301FFAD2501FFAD2501FF
+AD2501FFAD2501FFAD2501FFAD2501FFAD2501FFAD2501FFAD2501FFAD2501
+FFAD2501FFAD25A14E00008D52000081580000775E0000706500006A6D0000
+66780000608300005A900000569E000052AE000049C1000635CD001225DD00
+1E17F8002A03FF10320FFF342314FF551D14FF6F1B0FFF861C0AFF9E1E00FF
+AB2200FFAB2200FFAB2200FFAB2200FFAB2200FFAB2200FFAB2200FFAB2200
+FFAB2200FFAB2200FFAB2200FFAB228F50000082540000775A00006E5F0000
+68660000637000005E7A000059860000549300004FA100004AB000003EC200
+082DD000121FE3001D0FFB002A00FF182D0EFF391E14FF5B1712FF721615FF
+8A100AFF9E1900FFAB1F00FFAB1F00FFAB1F00FFAB1F00FFAB1F00FFAB1F00
+FFAB1F00FFAB1F00FFAB1F00FFAB1F00FFAB1F00FFAB1F8353000078560000
+6E5B000067610000616900005D730000587E0000528A00004D96000049A400
+0043B3000035C5000826D5001219E9001D05FC042900FF1F260DFF3E190EFF
+5C1613FF760E1BFF8D0207FF9C1600FFAB1B00FFAB1B00FFAB1B00FFAB1B00
+FFAB1B00FFAB1B00FFAB1B00FFAB1B00FFAB1B00FFAB1B00FFAB1B00FFAB1B
+795400006F570000665C0000606300005B6B000057760000518100004D8D00
+004799000042A600003BB700012DCA000820DA001214EE001C02FD0E2403FF
+261E13FF4A0D0BFF5F130EFF760D17FF8C0007FF9A1200FFAB1800FFAB1800
+FFAB1800FFAB1800FFAB1800FFAB1800FFAB1800FFAB1800FFAB1800FFAB18
+00FFAB1800FFAB1870560000675900005F5E00005A650000556F0000507A00
+004C85000046910000419C00003AA9000033BC000126CE00091ADF00120CF2
+001D00FD161F02FF2A1A11FF4E0A0CFF620C10FF770513FF8A0007FF990D00
+FFAA1500FFAA1500FFAA1500FFAA1500FFAA1500FFAA1500FFAA1500FFAA15
+00FFAA1500FFAA1500FFAA1500FFAA15>
+<A1410000A1420000A4450000A9480000AE4B0000B54F0000BE520000C85500
+05D4540010DF4D001DE23F002ED2290043CC0D015DBB001364BA002A60CA00
+485EC7006B5CB801935BA800C055A80BFF48A111FF41A111FF41A111FF41A1
+11FF41A111FF41A111FF41A111FF41A111FF41A111FF41A111FF41A111FF41
+A111FF41A111FF41A1410000A1420000A4450000A9480000AE4B0000B54F00
+00BE520000C8550005D4540010DF4D001DE23F002ED2290043CC0D015DBB00
+1364BA002A60CA00485EC7006B5CB801935BA800C055A80BFF48A111FF41A1
+11FF41A111FF41A111FF41A111FF41A111FF41A111FF41A111FF41A111FF41
+A111FF41A111FF41A111FF41A111FF41A1410000A1420000A4450000A94800
+00AE4B0000B54F0000BE520000C8550005D4540010DF4D001DE23F002ED229
+0043CC0D015DBB001364BA002A60CA00485EC7006B5CB801935BA800C055A8
+0BFF48A111FF41A111FF41A111FF41A111FF41A111FF41A111FF41A111FF41
+A111FF41A111FF41A111FF41A111FF41A111FF41A111FF41A1410000A14200
+00A4450000A9480000AE4C0000B54F0000BD520000C8550004D3550010E04E
+001DE341002DD32B0042CD0E005DBC001264BA002961C900475FC9006A5CB8
+01915BA800BF56A70AFF49A111FF41A111FF41A111FF41A111FF41A111FF41
+A111FF41A111FF41A111FF41A111FF41A111FF41A111FF41A111FF41A111FF
+41A1420000A1420000A4450000A8490000AE4C0000B5500000BD530000C756
+0004D356000FE050001CE443002CD62E0040CF11005CBD000F65BA002762C8
+004460CB00685DBA018E5CAA00BE57A709FF4BA111FF43A111FF43A111FF43
+A111FF43A111FF43A111FF43A111FF43A111FF43A111FF43A111FF43A111FF
+43A111FF43A111FF43A1420000A1430000A4460000A8490000AE4C0000B550
+0000BD530000C7570003D357000FE053001BE545002BD932003FCF140059BF
+000D67BB002563C7004161CD00655EBB018C5EAB00BD58A608FF4DA111FF44
+A111FF44A111FF44A111FF44A111FF44A111FF44A111FF44A111FF44A111FF
+44A111FF44A111FF44A111FF44A111FF44A1420000A1430000A4460000A849
+0000AE4D0000B4500000BC540000C7570003D358000EE155001AE6480029DC
+35003DD0170057C0000B68BB002364C7003E62CE00635FBC01895FAD00BC5A
+A507FE50A111FF45A211FF45A211FF45A211FF45A211FF45A211FF45A211FF
+45A211FF45A211FF45A211FF45A211FF45A211FF45A211FF45A1430000A143
+0000A4460000A84A0000AD4D0000B4500000BC540000C6580002D259000DE1
+570019E74B0028DF39003CD01B0055C1000969BC002165C6003C64D0006160
+BE008760B000BB5AA406FC52A211FF46A211FF46A211FF46A211FF46A211FF
+46A211FF46A211FF46A211FF46A211FF46A211FF46A211FF46A211FF46A211
+FF46A1430000A1440000A4470000A84A0000AD4D0000B3510000BC550000C6
+580002D25A000DE1580018E94E0027E13C003AD01F0053C4020769BD001E67
+C5003865D3005E62C1008462B300BA5BA305FA54A211FF47A211FF47A211FF
+48A211FF48A211FF48A211FF48A211FF48A211FF48A211FF48A211FF48A211
+FF48A211FF48A211FF48A1430000A1440000A4470000A74A0000AD4E0000B3
+510000BB550000C5590002D15B000CE05A0017EB510025E4400038CF240050
+C6060568BE001B68C4003566D6005B63C4008163B700B85DA204F857A312FF
+49A312FF49A312FF49A312FF49A312FF49A312FF49A312FF49A312FF49A312
+FF49A312FF49A312FF49A312FF49A312FF49A1440000A1440000A4470000A7
+4B0000AC4E0000B2510000BA560000C55A0001D15D000BDF5C0016ED550023
+E7440036CE29004DCA0B0466BF00186AC3003168D9005765C9007D64BD00B7
+5EA103F65AA412FF4BA412FF4BA412FF4BA412FF4BA412FF4BA412FF4BA412
+FF4BA412FF4BA412FF4BA412FF4BA412FF4BA412FF4BA412FF4BA1440000A1
+450000A3480000A74B0000AC4F0000B2520000BA560000C45B0000D05E0009
+DE5F0014EC590022EA490034D130004ACE110263C100146CC2002D6AD90052
+67CE007865C300B560A203F25DA413FF4DA413FF4DA513FF4DA513FF4DA513
+FF4DA513FF4DA513FF4DA513FF4DA513FF4DA513FF4DA513FF4DA513FF4DA5
+13FF4DA1450000A1450000A3480000A64B0000AB4F0000B1520000B9570000
+C35C0000CF600008DC610013EC5D0020EF4F0031D8380047D4180161C5000F
+6FC100286CD9004B6AD4007267CA00AF63A402EE61A513FF4FA113FF519E13
+FF529E13FF529E13FF529E13FF529E13FF529E13FF529E13FF529E13FF529E
+13FF529E13FF529E13FF52A1450000A1460000A3490000A64C0000AB500000
+B0530000B8580000C25D0000CD610006DA640011EB61001DF256002EE14000
+43D621005DC9000872C100226FE100456ECB00696EB100A56F7900BA726000
+F96F5A00F5705800F4715800F4715800F4715800F4715800F4715800F47158
+00F4715800F4715800F4715800F4715800F471A1460000A1460000A3490000
+A64D0000AA500000B0540000B7580000C15E0000CC630004D9660010E96600
+1BF55D002AED4A0040D82C0058CD020273AB0017798E002E8075004B836D00
+7E8A4E00AC833F00F77B3B00FF7B3A00FF7C3A00FF7C3A00FF7C3A00FF7C3A
+00FF7C3A00FF7C3A00FF7C3A00FF7C3A00FF7C3A00FF7C3A00FF7CA1470000
+A1470000A24A0000A54D0000A9510000AF550000B6590000BF5F0000CB6500
+03D769000DE66A0019F9650026F453003BD13B0052A222006F670700894C00
+16953B00309630004E98230188961B02EC8E1801FF8E1601FF8F1601FF8F16
+01FF8F1601FF8F1601FF8F1601FF8F1601FF8F1601FF8F1601FF8F1601FF8F
+1601FF8FA1470000A1480000A24B0000A54E0000A9510000AE550000B55A00
+00BE600000C9680000D56C000BE26E0016F76C0022E2630034A150004E7D3A
+0069502400831A0C009D050919A1020E389F0118779F1126F8831B2EFF7A1A
+2FFF7A1A2FFF7A1A2FFF7A1A2FFF7A1A2FFF7A1A2FFF7A1A2FFF7A1A2FFF7A
+1A2FFF7A1A2FFF7A1A2FFF7AA1480000A1480000A24B0000A44F0000A85200
+00AD560000B35B0000BB620000C6690000D3700008DF720013D577001FB273
+00308C6600496B5400624745007E122A018D0029169800353896003C6A8F00
+3DB081003FD97B0040D97A0040D97A0040D97A0040D97A0040D97A0040D97A
+0040D97A0040D97A0040D97A0040D97A0040D97AA1490000A1490000A24C00
+00A44F0000A7530000AB570000B15C0000B9630000C36B0000D0730005C17A
+0011B480001D9A81002B807E00406579005B3D6300720F490088004D178D00
+5A3A8800626F811C79F5660365FF6D0567FF6C0567FF6C0567FF6C0567FF6C
+0567FF6C0567FF6C0567FF6C0567FF6C0567FF6C0567FF6C0567FF6CA14900
+00A14A0000A14D0000A3500000A5530000AA580000B05D0000B7640000BF6E
+0000B2790006AA82000FA08A00198E91002378950033629D004D3B88006410
+70007D0071187E007C3B78008F74710CA5E96127A3F14D27A4F24D27A4F24D
+27A4F24D27A4F24D27A4F24D27A4F24D27A4F24D27A4F24D27A4F24D27A4F2
+4D27A4F24DA14A0000A14B0000A14D0000A2510000A4540000A8590000AD5E
+0000B2650000A6720002A07D00079988000D9195001285A1001972A9002459
+AC003939A50050119500690093176E00A5366800B1616100BDA25D08C5D052
+08C4CF5208C4CF5208C4CF5208C4CF5208C4CF5208C4CF5208C4CF5208C4CF
+5208C4CF5208C4CF5208C4CF52A14B0000A14B0000A14E0000A1510000A355
+0000A65A0000AA5F00009E6A000097760003938300058D8F0008869E000C7D
+AF00106EBE001852C1002A39C6003F16C4005600BC125F01E5325900E85753
+05FA894B00F8AA4C00FAAA4C00FAAA4C00FAAA4C00FAAA4C00FAAA4C00FAAA
+4C00FAAA4C00FAAA4C00FAAA4C00FAAA4C00FAAA4CA14C0000A14C0000A14F
+0000A1520000A2560000A45B000098640000906E00018D7A00018988000184
+97000381AA00047DC3000572E0000A4FE1001E36F2002F1CFF004403FF084F
+1AFF433721FF622A0EFF79380DFFA3350DFFA4350DFFA4350DFFA4350DFFA4
+350DFFA4350DFFA4350DFFA4350DFFA4350DFFA4350DFFA4350DFFA435A14D
+0000A14D0000A0500000A0530000A1570000935F00008B6800008672000083
+7F00007F8D00007B9D00007BB300007AD300016EF600053FDC00202CF70030
+12FF024311FF243B1CFF4E2D01FF513D11FF872F09FFAF3009FFAF3009FFAF
+3009FFAF3009FFAF3009FFAF3009FFAF3009FFAF3009FFAF3009FFAF3009FF
+AF3009FFAF30A14D0000A14E0000A0500000A0540000915A00008762000081
+6A00007E7400007A810000748F00006F9F000070B600006CD100024FD80012
+34D9002123F8003209FF044010FF2D3313FF4C2C15FF6D290FFF8C2A06FFB2
+2C05FFB22C05FFB22C05FFB22C05FFB22C05FFB22C05FFB22C05FFB22C05FF
+B22C05FFB22C05FFB22C05FFB22CA14E0000A14E0000A05000009156000085
+5D00007D640000786C0000757700006F8300006791000064A1000062B50000
+5CCE00033FD000162BDD00221AF9003204FF0D3B0FFF332D06FF462F16FF77
+220DFF8F2605FFAF2703FFB12803FFB12803FFB12803FFB12803FFB12803FF
+B12803FFB12803FFB12803FFB12803FFB12803FFB128A14E0000A14E000092
+530000855900017B5F0000746600006F6E00006A790000648600005D930000
+5AA3000057B500004BC7000834D0001624E2002311FB003000FF153713FF3F
+230BFF542513FF7B1E0AFF922201FFAA2401FFB12501FFB12501FFB12501FF
+B12501FFB12501FFB12501FFB12501FFB12501FFB12501FFB12501FFB125A1
+4E0000954F0000855500007A5A0000726000006B68000067710000627C0000
+5C8900005796000053A500004EB600013FC6000B2CD300161EE800230BFD05
+2E00FF1E2F15FF481B15FF651912FF7E190AFF941D01FFA92100FFB12100FF
+B12100FFB12100FFB12100FFB12100FFB12100FFB12100FFB12100FFB12100
+FFB12100FFB121964F0000865200007B570000715C000069620000646A0000
+5F7400005A800000558C0000509900004BA7000044B7000235C9000B25D800
+1618EE002204FE0A2C00FF242914FF4E150FFF661918FF820C0CFF951601FF
+AB1D00FFB01E00FFB01E00FFB01E00FFB01E00FFB01E00FFB01E00FFB01E00
+FFB01E00FFB01E00FFB01E00FFB01E875200007C54000072580000685D0000
+626400005D6D000059780000548300004F8F00004A9C000044A900003CBB00
+032DCD000B1FDE001612F3002100FF122703FF2B2012FF52110EFF691316FF
+83070EFF950F00FFA81A00FFB11B00FFB11B00FFB11B00FFB11B00FFB11B00
+FFB11B00FFB11B00FFB11B00FFB11B00FFB11B00FFB11B7C54000073550000
+69590000615F00005C67000058700000527B00004D87000049930000439F00
+003DAC000034C0000326D1000C19E3001609F6002200FF1B210DFF391210FF
+550E0CFF6B0F16FF84000EFF940901FFA91600FFB01700FFB01700FFB01700
+FFB01700FFB01700FFB01700FFB01700FFB01700FFB01700FFB01700FFB017
+725500006A560000615B00005B610000566A0000527400004D7F0000478A00
+00429600003CA2000035B100002BC500031ED5000C12E8001600F60A2000FF
+201B13FF44060DFF580A08FF6B0E11FF82000DFF930500FFA41201FFAE1201
+FFAE1201FFAE1201FFAE1201FFAE1201FFAE1201FFAE1201FFAE1201FFAE12
+01FFAE1201FFAE1269560000635800005B5D000056640000516D00004C7800
+0047830000418E00003B99000034A600002DB7000023C9000418D9000D09EB
+011700F9121A04FF271312FF48000BFF5A0604FF6B0D0DFF80000CFF910100
+FFA10E04FFAA0A04FFAA0A04FFAA0A04FFAA0A04FFAA0A04FFAA0A04FFAA0A
+04FFAA0A04FFAA0A04FFAA0A04FFAA0A>
+<9F3D0000A03E0000A13F0000A6430000AC460000B3490000BA4C0000C34D00
+03CC4A000FD541001CD531002CC71D0042BB06045AB400185AB6002E57C300
+4C55C0006C52B1008E52A300B04CA706FF419D0BFF399D0BFF399D0CFF399D
+0CFF399D0CFF399D0CFF399D0CFF399D0CFF399D0CFF399D0CFF399D0CFF39
+9D0CFF399D0CFF399F3D0000A03E0000A13F0000A6430000AC460000B34900
+00BA4C0000C34D0003CC4B000FD541001CD631002CC81E0042BC06045AB400
+185BB6002E57C2004B55C0006B53B1008E52A400B04CA706FF419D0CFF399D
+0CFF399D0CFF399D0CFF399D0CFF399D0CFF399D0CFF399D0CFF399D0CFF39
+9D0CFF399D0CFF399D0CFF399D0CFF39A03E0000A03E0000A1400000A64300
+00AC460000B2490000BA4C0000C34E0002CC4C000ED543001CD834002BCA20
+0041BE07025AB500165CB6002C58C2004956C2006A53B2008D53A500AF4DA7
+05FF439E0DFF399E0DFF399E0DFF399E0DFF399E0DFF399E0DFF399E0DFF39
+9E0DFF399E0DFF399E0DFF399E0DFF399E0DFF399E0DFF39A03E0000A03E00
+00A1400000A6430000AC470000B24A0000BA4D0000C34F0002CC4C000ED644
+001BD936002ACC220040C008015AB600145DB6002B59C1004757C3006854B3
+008B54A600AF4EA704FF449F0EFF399F0EFF399F0EFF399F0EFF399F0EFF39
+9F0EFF399F0EFF399F0EFF399F0EFF399F0EFF399F0EFF399F0EFF399F0EFF
+39A03E0000A03F0000A1400000A6440000AC470000B24A0000BA4D0000C24F
+0001CC4D000DD646001ADA380029CE25003EC20A005AB700135EB600295AC1
+004458C5006655B4008855A700AE50A703FF46A00FFF3AA00FFF3AA00FFF3A
+A00FFF3AA00FFF3AA00FFF3AA00FFF3AA00FFF3AA00FFF3AA00FFF3AA00FFF
+3AA00FFF3AA00FFF3AA03F0000A03F0000A1410000A6440000AB470000B24A
+0000B94D0000C2500001CC4E000CD7480019DB3A0029D027003DC40C0058B7
+00115FB600275BC0004259C7006556B5008656A800AD51A602FF48A110FF3B
+A111FF3AA111FF3AA111FF3AA111FF3AA111FF3AA111FF3AA111FF3AA111FF
+3AA111FF3AA111FF3AA111FF3AA111FF3AA03F0000A0400000A1410000A645
+0000AB480000B24B0000B94E0000C2500001CC50000CD84A0018DC3D0028D2
+29003CC60F0056B9000F60B700255CC000405AC8006357B6008457AA00AD52
+A601FF4AA210FF3CA211FF3BA211FF3BA211FF3BA211FF3BA211FF3BA211FF
+3BA211FF3BA211FF3BA211FF3BA211FF3BA211FF3BA211FF3BA03F0000A040
+0000A2410000A6450000AB480000B14B0000B94E0000C2510001CC51000BD8
+4C0017DE3F0027D52D003AC8130054BA000C61B700235DBF003D5BC9006058
+B7008159AB00AC53A500FA4CA210FF3DA211FF3CA211FF3CA211FF3CA211FF
+3CA211FF3CA211FF3CA211FF3CA211FF3CA211FF3CA211FF3CA211FF3CA211
+FF3CA0400000A1400000A2420000A6450000AB480000B14C0000B94F0000C1
+520001CC52000AD84E0016DF430025D8300038C9170051BB000A63B800215F
+BE003A5DCB005D5AB9007E5AAE00A955A400F24EA20FFF3FA111FF3DA111FF
+3EA111FF3EA111FF3EA111FF3EA111FF3EA111FF3EA111FF3EA111FF3EA111
+FF3EA111FF3EA111FF3EA0400000A1410000A2420000A6460000AB490000B1
+4C0000B84F0000C1530001CC540009D9510015E1460024DB340036CA1C004E
+C0040862B9001E61BD00365ECD00595CBB007B5CB001A757A300E951A20FFF
+42A111FF3FA111FF3FA111FF3FA111FF3FA111FF3FA111FF3FA111FF3FA111
+FF3FA111FF3FA111FF3FA111FF3FA111FF3FA1410000A1420000A2430000A6
+460000AA490000B14D0000B8500000C1540001CB550008D8530014E34B0022
+DE390034CB21004AC5070661BA001A63BD003260CF00555EBF00775DB301A4
+59A200DE54A410FF43A111FF41A111FF41A111FF41A111FF41A111FF41A111
+FF41A111FF41A111FF41A111FF41A111FF41A111FF41A111FF41A1420000A1
+420000A2440000A5470000AA4A0000B04D0000B7510000C0550000CB570007
+D8560012E34F0020E23F0031CE270047CB0C0360BB001665BD002E62D10051
+60C400725FB702A05BA200D657A711FF45A111FF44A111FF44A111FF44A111
+FF44A111FF44A111FF44A111FF44A111FF44A111FF44A111FF44A111FF44A1
+11FF44A1420000A1430000A2440000A5470000AA4B0000B04E0000B6520000
+BF560000CA590005D7590011E453001DE746002ED52F0044D311015FBF0011
+68BD002965CE004963CB006E60BC029B5EA500D259A113FF499813FF499516
+FF499516FF499516FF499516FF499516FF499516FF499516FF499516FF4995
+16FF499516FF499516FF49A1430000A1440000A2450000A5480000A94B0000
+AF4F0000B5530000BE570000C95A0003D65C000FE559001BEA4C002BDD3800
+40D319005AC3000B6BBD002367CC004166B800646BA100916C7700AD6C5F00
+E76A5800F8695400F86A5400F86B5400F86B5400F86B5400F86B5400F86B54
+00F86B5400F86B5400F86B5400F86B5400F86BA1440000A1440000A2460000
+A4490000A84C0000AE500000B4530000BD580000C85C0002D45F000DE35D00
+19EE540027E642003CD1240054C802056C9C00167584002C7B6F00477D6500
+6E824D009A7E3F00E1773B00FF753800FF763800FF763800FF763800FF7638
+00FF763800FF763800FF763800FF763800FF763800FF763800FF76A1450000
+A1450000A2460000A44A0000A84D0000AD500000B3540000BC590000C65E00
+01D262000BE1620016F15D0023EC4C0037BF36004E9520006B5F0600854700
+158F37002C8F2D004891230070901A00C28A1800FF861500FF881400FF8814
+00FF881400FF881400FF881400FF881400FF881400FF881400FF881400FF88
+1400FF88A1460000A1460000A2470000A44A0000A74E0000AC510000B25500
+00BA5A0000C5600000D0640008DD660013EF630020CA5C0032994B004A7534
+00634A21007E180B00970408189B020D339701135E97001ACA8B1A2AFF731A
+2CFF721A2CFF721A2CFF721A2CFF721A2CFF721A2CFF721A2CFF721A2CFF72
+1A2CFF721A2CFF721A2CFF72A1470000A1470000A1480000A34B0000A64F00
+00AB520000B1560000B85B0000C2620000CE680005D66B0011C570001EA76C
+002E855F0045644D005D403D00781026018800261590003033900038618A00
+3A9E7E0A3EF3700940F26F0940F26F0940F26F0940F26F0940F26F0940F26F
+0940F26F0940F26F0940F26F0940F26F0940F26FA1470000A1480000A14900
+00A34C0000A54F0000A9530000AF570000B65D0000C0640000C36C0004B673
+0011A878001C9278002A7975003D5C6B00583759006D0C4300830047168600
+5336830059657C005FBA700059FF6A005AFF69005BFF69005BFF69005BFF69
+005BFF69005BFF69005BFF69005BFF69005BFF69005BFF69005BFF69A14800
+00A1490000A14A0000A24D0000A5500000A8540000AE580000B45E0000B366
+0000A9710008A17900109581001985870024708A00335B91004F337800610C
+6400790069187900713873007F696E0794E9601F91FF4C1E92FF4B1E92FF4B
+1E92FF4B1E92FF4B1E92FF4B1E92FF4B1E92FF4B1E92FF4B1E92FF4B1E92FF
+4B1E92FF4BA1490000A14A0000A14B0000A24E0000A3510000A6550000AB5A
+0000A86100009F6B0003987600089180000D888B00147B95001A689A002751
+9C003A329400500B8501680087186A0096366400A05F5E00A59A5918BBFF41
+18BCFF4118BCFF4118BCFF4118BCFF4118BCFF4118BCFF4118BCFF4118BCFF
+4118BCFF4118BCFF4118BCFF41A14A0000A14B0000A14C0000A14F0000A252
+0000A5560000A15C000096650001906F00048C7B0006868700097D94000D73
+A1001163AB001B4BAD002C32B0003F0FA8005500A4155B00C1325600CA574F
+04E9934717ECDC351CF3E6301CF4E6301CF4E6301CF4E6301CF4E6301CF4E6
+301CF4E6301CF4E6301CF4E6301CF4E6301CF4E630A14B0000A14B0000A14D
+0000A1500000A15300009B580000906000008969000285740002828100027C
+8E0003749D000570B0000763C2000F45C4002131D2002F18E6004200E60C4D
+12FF3B3A09FF583B12FF8B310AFFB03106FFB23206FFB23206FFB23206FFB2
+3206FFB23206FFB23206FFB23206FFB23206FFB23206FFB23206FFB232A14C
+0000A14C0000A14E0000A0500000995500008C5C0001846400007E6D00007C
+790000778600006F9500006FA800006DBF000062D800053FD4001A2CE50027
+17FF003902FF11411DFF49250BFF563012FF842809FFA62A05FFB22B05FFB2
+2B05FFB22B05FFB22B05FFB22B05FFB22B05FFB22B05FFB22B05FFB22B05FF
+B22B05FFB22BA14D0000A14D0000A14E0000995200008A590001805F00007A
+67000075700000717C00006A8800006397000061A800005EBE00004FCF000B
+34D3001A24EB00280EFF023701FF1C3A17FF4B220DFF60280FFF87240AFFA6
+2502FFB02702FFB02702FFB02702FFB02702FFB02702FFB02702FFB02702FF
+B02702FFB02702FFB02702FFB027A14E0000A14E00009B4F00008A5500007F
+5B000077610000706900006C730000667F0000608B00005A98000057A90000
+53BE00013FCA000F2BD6001A1DF0002806FF073405FF272E14FF511F16FF71
+1B0CFF8A2006FFA42200FFB12400FFB12400FFB12400FFB12400FFB12400FF
+B12400FFB12400FFB12400FFB12400FFB12400FFB124A14E00009D4E00008B
+5200007F570000755D00006D630000686B0000637600005E820000588E0000
+539B00004FAB000047BD000435CB000F25DB001B17F6002702FF112F0BFF32
+2314FF581910FF721A0DFF8D1908FFA71C00FFB22000FFB22000FFB22000FF
+B22000FFB22000FFB22000FFB22000FFB22000FFB22000FFB22000FFB220A0
+4E00008C5100007F540000755900006C5E000065650000606E00005C790000
+57850000529100004D9F000047AD00003DBF00062CCF000F1EE2001B0FF900
+2700FF192A09FF361E10FF5A1715FF780E15FF900B04FFA51A00FFB21D00FF
+B21D00FFB21D00FFB21D00FFB21D00FFB21D00FFB21D00FFB21D00FFB21D00
+FFB21D00FFB21D8D51000080530000765600006B5A0000646000005E680000
+5A710000557D0000508800004B95000046A1000040B0000034C4000625D400
+1018E8001A04FB032700FF1F2313FF46100DFF5E130EFF771015FF910504FF
+A01600FFB61900FFB71900FFB71900FFB71900FFB71900FFB71900FFB71900
+FFB71900FFB71900FFB71900FFB7197F530000755500006D570000645C0000
+5D620000586B0000547500004F8000004A8C0000449800003FA5000038B500
+002CC900061ED9001012ED001A00FB0F2200FF241E13FF4B090CFF600F13FF
+7A0214FF900104FF9F1206FFBB110BFFC40D0BFFC40D0BFFC40D0BFFC40D0B
+FFC40D0BFFC40D0BFFC40D0BFFC40D0BFFC40D0BFFC40D755500006C560000
+655800005D5E000058650000536E00004E79000049840000439000003D9B00
+0037A800002FBB000024CC000718DE001009EF011B00FC171C0AFF310F12FF
+500309FF620B0DFF780510FF8D0000FF9C100FFFC00513FFC70113FFC70113
+FFC70113FFC70113FFC70113FFC70113FFC70113FFC70113FFC70113FFC701
+6B560000645700005D5A000057600000526800004D720000487E0000438800
+003D930000369F00002FAD000027C000011CD0000811E2001000F1051A00FE
+1C160DFF38070FFF510106FF620A09FF77050CFF8A0003FF9B0A08FFB1050A
+FFB5040AFFB5040AFFB5040AFFB5040AFFB5040AFFB5040AFFB5040AFFB504
+0AFFB5040AFFB504635800005D590000585C0000526300004D6C0000487700
+00428200003C8C0000359600002EA3000027B2000020C3000115D3000809E5
+001100F40E1500FF211209FF39060AFF520009FF660008FF770008FF880005
+FF970404FFA80504FFAA0504FFAA0504FFAA0504FFAA0504FFAA0504FFAA05
+04FFAA0504FFAA0504FFAA0504FFAA05>
+<9C3700009D3800009D380000A13B0000A73F0000AE420000B6440000BD4600
+01C341000CC835001AC827002ABB140040AE010655AE001C51B000314DBA00
+4D4BBC006C49AE008948A200A543A002DB3A9803FF349602FF339602FF3396
+02FF339602FF339602FF339602FF339602FF339602FF339602FF339602FF33
+9602FF339602FF339D3700009D3800009D390000A13C0000A73F0000AE4200
+00B6450000BD460001C342000CC937001ACA280029BD16003FAF020556AE00
+1A52B100304EBA004B4CBD006A4AAF008849A300A544A002D93C9904FF3596
+03FF349603FF349603FF349603FF349603FF349603FF349603FF349603FF34
+9603FF349603FF349603FF349603FF349D3800009D3900009E390000A13C00
+00A7400000AE430000B6450000BE470001C443000BC9390019CC2A0029BF18
+003EB1020456AE001953B1002E4FBA004A4DBE00694AB000874AA300A445A0
+02D73D9A04FF369603FF349703FF349703FF349703FF349703FF349703FF34
+9703FF349703FF349703FF349703FF349703FF349703FF349D3800009E3900
+009E3A0000A13D0000A7400000AF430000B6460000BE480001C444000BCA3A
+0019CE2C0028C01A003DB2030257AF001854B1002D50BA00484EBF00674BB0
+00864BA400A346A001D53E9A05FF369704FF359704FF359704FF359704FF35
+9704FF359704FF359704FF359704FF359704FF359704FF359704FF359704FF
+359D3900009E3A00009E3A0000A23D0000A7410000AF440000B6460000BE48
+0000C445000ACB3C0018CF2E0027C21C003CB4030157AF001656B2002C51BA
+00464FC000664CB100844CA400A248A001D33F9B05FF379704FF369704FF36
+9704FF369704FF369704FF369704FF369704FF369704FF369704FF369704FF
+369704FF369704FF369E3900009E3A00009F3B0000A23E0000A8410000AF44
+0000B6470000BE490000C446000ACB3E0017D0300026C41E003BB6050056B0
+001457B2002A52BA004450C100644DB200824DA500A1499F01D0419C06FF38
+9805FF369805FF369805FF369805FF369805FF369805FF369805FF369805FF
+369805FF369805FF369805FF369805FF369E3A00009E3B00009F3C0000A23E
+0000A8420000AE450000B6480000BD4A0000C5480009CC400016D1320025C7
+200039B9080054B1001258B2002853BA004151C200624EB300804FA600A04B
+9F01CE429D07FF399806FF379806FF379806FF379806FF379806FF379806FF
+379806FF379806FF379806FF379806FF379806FF379806FF379E3B00009F3C
+00009F3D0000A23F0000A8420000AE450000B6480000BD4A0000C5490008CD
+420016D3350024CA230037BC0C0052B100105AB3002655B9003E53C3005F50
+B4007D50A7009F4D9F00CC449F08FF3A9A07FF389A07FF389A07FF389A07FF
+389A07FF389A07FF389A07FF389A07FF389A07FF389A07FF389A07FF389A07
+FF389F3C00009F3D0000A03D0000A2400000A8430000AE460000B5490000BD
+4B0000C64B0007CE450015D5390023CD270035BF10004FB3000D5CB3002357
+B9003B54C4005C52B6007A51A9009F4F9F00C947A109FF3B9B09FF389B09FF
+389B09FF389B09FF389B09FF389B09FF389B09FF389B09FF389B09FF389B09
+FF389B09FF389B09FF389F3D0000A03D0000A03E0000A2400000A8440000AE
+470000B54A0000BD4C0000C64D0006CF480013D73C0021D12B0033C215004C
+B6020A5CB4002059B8003756C5005854B8007753AC009C50A000C549A30AFF
+3C9D0CFF399D0CFF399D0CFF399D0CFF399D0CFF399D0CFF399D0CFF399D0C
+FF399D0CFF399D0CFF399D0CFF399D0CFF39A03E0000A03E0000A03F0000A3
+410000A8450000AE480000B54B0000BD4D0000C64E0005CF4B0012D9410020
+D52F0031C61A0048BB04075CB5001C5BB8003358C7005356BB007355AE0099
+53A100C14CA50BFF3E9F0EFF399F0EFF399F0EFF399F0EFF399F0EFF399F0E
+FF399F0EFF399F0EFF399F0EFF399F0EFF399F0EFF399F0EFF39A03E0000A0
+3F0000A0400000A3420000A8450000AD480000B44C0000BC4E0000C6500004
+D04E0010DA45001ED935002ECA200044C107045CB600185EB8002F5AC8004F
+59BF006F57B2009655A300BE4FA80DFF40A111FF3AA111FF3AA111FF3AA111
+FF3AA111FF3AA111FF3AA111FF3AA111FF3AA111FF3AA111FF3AA111FF3AA1
+11FF3AA03F0000A0400000A1400000A3430000A8460000AD490000B44D0000
+BC500000C5520003D051000FDC4A001BDF3C002CD0260041C80B015CB90013
+61B8002A5DC600485BC4006A59B50092589D00BC559007F64D9114FF428E15
+FF428B16FF438B16FF438B16FF438B16FF438B16FF438B16FF438B16FF438B
+16FF438B16FF438B16FF43A0400000A1410000A1410000A3440000A7470000
+AC4A0000B34E0000BB510000C4540002D054000DDD500019E2430029D72F00
+3DCA130057BC000D64B9002460B6003E62A8005E679500846A7500A2675D00
+D3665500FC635200FC645000FC655000FC655000FC655000FC655000FC6550
+00FC655000FC655000FC655000FC655000FC65A1410000A1420000A1420000
+A3450000A7480000AC4B0000B24F0000BA520000C3560001CF57000BDD5500
+16E54B0025DE390038CC1D0050B403046A8F0015727C002B77690042785D00
+637B4C008A783F00C9733A00FF6F3700FF703600FF703600FF703600FF7036
+00FF703600FF703600FF703600FF703600FF703600FF703600FF70A1420000
+A1430000A1440000A3460000A6490000AB4C0000B1500000B8530000C25700
+00CE5A0009DC5A0014E9530021E6430034B231004A8A1D0068590500814200
+1489330029882A00428A220064891A009C851700FF7F1500FF801300FF8013
+00FF801300FF801300FF801300FF801300FF801300FF801300FF801300FF80
+1300FF80A1440000A1440000A1450000A3470000A54A0000AA4D0000B05100
+00B7550000C1590000CC5D0006D95F0011DD5C001EBA55002F924500466D2F
+005F441F0078150A009104071694010C2F90000F4F8E0017998B1725FF6E16
+26FF6D1628FF6C1628FF6C1628FF6C1628FF6C1628FF6C1628FF6C1628FF6C
+1628FF6C1628FF6C1628FF6CA1450000A1450000A1460000A2480000A54B00
+00A94E0000AF520000B5560000BF5B0000CA600003C7650010B869001C9D64
+002C7E5700415E4700583A3700700F2401820024148A002C2F890033578500
+378D7C0537FB6B0639FF69073BFF69073BFF69073BFF69073BFF69073BFF69
+073BFF69073BFF69073BFF69073BFF69073BFF69A1460000A1460000A14700
+00A2490000A44C0000A84F0000AD530000B3570000BC5D0000B7640005AC6C
+00119E70001C8A6F0029726C003B5460005232510068093D007D0042158000
+4D317E00535C780057966E0053F2650054FF630055FF630055FF630055FF63
+0055FF630055FF630055FF630055FF630055FF630055FF630055FF63A14700
+00A1470000A1480000A14A0000A44D0000A7500000AB540000B2590000A961
+0000A169000A987100118C7800197C7D0024697F0033517E004B2E6C005D08
+5B017500611774006A356F0073606B017798621985FF4B1883FF491884FF49
+1884FF491884FF491884FF491884FF491884FF491884FF491884FF491884FF
+491884FF49A1480000A1480000A1490000A14B0000A34E0000A5510000AA55
+0000A05D000097650005906E00098978000E7F8100147189001D608E00284A
+8D003A2B86004E077A0167007E18660089356100935B5B00948C5512A9FF42
+10A2FF4010A2FF4010A2FF4010A2FF4010A2FF4010A2FF4010A2FF4010A2FF
+4010A2FF4010A2FF4010A2FF40A1490000A14A0000A14A0000A14C0000A24F
+0000A4520000995900008F61000289690005847400077E7E0009748A000E69
+940014599B001F449E002D2B9E003F099701540097175700AA325200B3554B
+00BF874412E1F43615D0FF3115D1FF3115D1FF3115D1FF3115D1FF3115D1FF
+3115D1FF3115D1FF3115D1FF3115D1FF3115D1FF31A14A0000A14B0000A14B
+0000A14D0000A1500000945600008A5D0001826500017D6E00027A79000273
+8500046A92000762A0000B54AA00163EB000232CBB003011C0004100C11148
+00E52E4500EA513E10FF902F06FFAF311CFEFF241CFEFE241CFEFE241CFEFE
+241CFEFE241CFEFE241CFEFE241CFEFE241CFEFE241CFEFE241CFEFE24A14C
+0000A14C0000A14C0000A14E000092530000865A00007D6100007768000073
+7300006E7F0000668C0000619B00005FAF000059C600043FCB00142BD9001F
+1BF7002F04FF0D3A0CFF332D04FF492F13FF7E220AFF9C2502FFB02702FFB0
+2602FFB02602FFB02602FFB02602FFB02602FFB02602FFB02602FFB02602FF
+B02602FFB026A14D0000A14D0000A14D000092510000845700007A5D000073
+6400006D6C000069770000628300005C910000589F000054B000004BC40006
+35CE001324E0002013FB002E01FF163415FF431E15FF621C10FF811D0AFF9F
+1F00FFB12300FFB12300FFB12300FFB12300FFB12300FFB12300FFB12300FF
+B12300FFB12300FFB12300FFB123A14E0000A14E0000935000008454000079
+590000705F000069660000656F0000607A00005A8700005594000051A20000
+4BB200003EC300092CD200141EE600200BFD032C00FF1E2D15FF4A1811FF67
+1914FF85130AFF9F1B00FFB12000FFB22000FFB22000FFB22000FFB22000FF
+B22000FFB22000FFB22000FFB22000FFB22000FFB220A14E00009350000084
+520000795600006F5B000068610000626900005D730000587E0000538A0000
+4E97000049A4000043B4000135C6000925D7001418ED001F01FE082B00FF24
+2612FF4F1411FF6A131CFF8A0207FF9E1700FFB11C00FFB41C00FFB41C00FF
+B41C00FFB41C00FFB41C00FFB41C00FFB41C00FFB41C00FFB41C00FFB41C95
+4F0000845200007954000070570000665C0000606300005B6C000057760000
+528200004D8E0000479A000042A700003AB900012CCB00091EDC001411F100
+1F00FF14240AFF321813FF540D0CFF6B1218FF890006FF9B1300FFB11909FF
+C51209FFC61209FFC61209FFC61209FFC61209FFC61209FFC61209FFC61209
+FFC61209FFC612845200007954000070560000675900005F5E00005A660000
+556F0000507A00004B86000046910000409D00003AAB000032BE000124D000
+0A18E2001408F4041E00FF1C1E0AFF37120DFF550D0CFF6D0B13FF870006FF
+990E00FFAE1515FFE00415FFE00415FFE00415FFE00415FFE00415FFE00415
+FFE00415FFE00415FFE00415FFE004785400006F560000675700005F5A0000
+59610000546900004F7300004A7E0000458900003F95000039A1000032B000
+0029C400011DD4000B11E7001400F50A1D00FF201913FF44020EFF590505FF
+6C0D0FFF850005FF970A03FFAB0E12FFDA0212FFDA0212FFDA0212FFDA0212
+FFDA0212FFDA0212FFDA0212FFDA0212FFDA0212FFDA026E56000066570000
+5F580000595C0000546400004F6D00004A780000448300003E8D0000389800
+0031A500002AB5000021C7000316D8000B08E9001500F8121700FF25140FFF
+460008FF590605FF6D080BFF830007FF950504FFA6070AFFC3030AFFC3030A
+FFC3030AFFC3030AFFC3030AFFC3030AFFC3030AFFC3030AFFC3030AFFC303
+655700005E590000595B0000545F00004E67000049710000447C00003E8600
+0037900000309C000029AA000022BA000019CA00040FDB000B02EC051400FA
+181200FF290F0BFF460009FF5C0007FF6F0007FF810007FF920102FFA10603
+FFB20403FFB20403FFB20403FFB20403FFB20403FFB20403FFB20403FFB204
+03FFB20403FFB2045D590000575B0000535D00004F630000496B0000437600
+003D800000368A00002F94000028A0000021AE00001BBD000012CD000408DE
+000C00EF0B0F00FB1E0D00FF2E0B07FF490005FF5D0004FF6E0004FF7E0004
+FF8F0002FF9E0302FFAB0202FFAB0202FFAB0202FFAB0202FFAB0202FFAB02
+02FFAB0202FFAB0202FFAB0202FFAB02>
+<99300000993100009A3200009A330000A0360000A6390000AE3C0000B53D00
+00B9380009BC2D0017BA1F0027AE0E003DA5000A4CA8001E48AB003343B300
+4D41B7006A40AE00853EA400A0399F00C9339901FF2E9400FF2B9400FF2B94
+00FF2B9400FF2B9400FF2B9400FF2B9400FF2B9400FF2B9400FF2B9400FF2B
+9400FF2B9400FF2B993000009A3100009A3200009B330000A1370000A73A00
+00AE3C0000B53E0000B9390008BD2E0017BC200026AF0F003CA500084DA800
+1D49AB003244B3004C42B8006840AF00843EA4009F3A9F00C6349A01FF2E94
+00FF2B9400FF2B9400FF2B9400FF2B9400FF2B9400FF2B9400FF2B9400FF2B
+9400FF2B9400FF2B9400FF2B9400FF2B993100009A3200009A3200009B3300
+00A1380000A73A0000AF3D0000B63E0000BA3A0008BD2F0016BD220026B111
+003BA600074EA8001C4AAC003145B3004B43B8006741AF00833FA5009E3B9E
+00C4359A01FF2F9400FF2C9400FF2C9400FF2C9400FF2C9400FF2C9400FF2C
+9400FF2C9400FF2C9400FF2C9400FF2C9400FF2C9400FF2C9A3100009A3200
+009B3300009B340000A1380000A83B0000AF3E0000B73F0000BB3C0007BE31
+0016BF230025B212003AA700054FA9001B4BAC002F46B3004944B9006642B0
+008240A5009D3C9E00C2369B01FF309400FF2D9400FF2D9400FF2D9400FF2D
+9400FF2D9400FF2D9400FF2D9400FF2D9400FF2D9400FF2D9400FF2D9400FF
+2D9A3200009A3300009B3400009C350000A2390000A83C0000B03F0000B740
+0000BC3D0007BF320015C1250024B5140039A8000350A900194CAC002E47B3
+004745BA006443B1008142A5009C3E9E00BF379B01FE319400FF2E9400FF2E
+9400FF2E9400FF2E9400FF2E9400FF2E9400FF2E9400FF2E9400FF2E9400FF
+2E9400FF2E9400FF2E9A3300009B3400009B3400009C350000A23A0000A93D
+0000B03F0000B7410000BC3E0006C0340014C2270023B7170037A9000151A9
+00174EAD002C49B3004546BB006244B2008043A6009A3F9E00BC399C01FF32
+9400FF2F9400FF2F9400FF2F9400FF2F9400FF2F9400FF2F9400FF2F9400FF
+2F9400FF2F9400FF2F9400FF2F9400FF2F9B3300009B3400009C3500009C36
+0000A33B0000A93E0000B0400000B7420000BD400006C1370013C4290022BA
+190036AB030150AA00154FAD002A4AB3004248BC006046B3007E44A6009941
+9D00B93B9C01FF349400FF309400FF309400FF309400FF309400FF309400FF
+309400FF309400FF309400FF309400FF309400FF309400FF309B3400009C35
+00009C3600009D370000A33C0000A93F0000B0410000B8430000BE420005C2
+390013C62C0021BE1C0034AF06004EAB001251AE00284CB3003F49BD005E47
+B5007B46A70097439D00B63C9E02FF359401FF319501FF319501FF319501FF
+319501FF319501FF319501FF319501FF319501FF319501FF319501FF319501
+FF319C3500009C3600009D3700009D380000A33C0000A9400000B1420000B8
+440000BF440004C43C0012C82F0020C21F0032B30A004CAC000F53AE00254F
+B3003C4BBE005B49B6007848A80096469E00B43F9F03FF379502FF329502FF
+329502FF339502FF339502FF339502FF339502FF339502FF339502FF339502
+FF339502FF339502FF339C3700009D3800009D3800009E390000A33D0000AA
+410000B1430000B9460000C0460003C53F0010CB33001FC6230030B80F0049
+AE010C55AF002251B200384DBE00564BB800754AAA0094499E00B241A104FF
+389603FF349603FF349603FF349603FF349603FF349603FF349603FF349603
+FF349603FF349603FF349603FF349603FF349D3800009D3900009E3A00009E
+3B0000A33E0000AA420000B1450000B9470000C0480002C642000FCD37001D
+CA27002DBD140045B1020956B0001E54B3003450BF00524EBA00714CAC0090
+4BA000B044A305FF3A9704FF359704FF359704FF359704FF369704FF369704
+FF369704FF369704FF369704FF369704FF369704FF369704FF369E3900009E
+3A00009F3B00009F3C0000A4400000AA430000B1460000B8480000C04A0002
+C846000DCF3C001BD02D002BC2190041B6040558B1001A57B4003052BF004D
+51BC006C4FAE008D4EA100AD47A606FF3C9806FF379806FF37990AFF369A0D
+FF369A0DFF369A0DFF369A0DFF369A0DFF369A0DFF369A0DFF369A0DFF369A
+0DFF369E3B00009F3C00009F3D0000A03E0000A4410000AA440000B0470000
+B84A0000C04C0001C94A000CD1410019D5330029C81F003EBB060059B30015
+5AB4002B55BE004754C1006851AB0089549500AA518300D54E8813FF3D8614
+FF3E8415FF3E8315FF3E8315FF3E8315FF3E8315FF3E8315FF3E8315FF3E83
+15FF3E8315FF3E8315FF3E9F3D0000A03D0000A03E0000A03F0000A4420000
+AA450000B0480000B74B0000C04E0000C94D000AD3470017D83A0026CF2700
+39C00E0054B5000F5DB5002659A7003B5E9B0058638B007965720097635D00
+C1615A07FD575A09FF565809FF575709FF575709FF575709FF575709FF5757
+09FF575709FF575709FF575709FF575709FF57A03E0000A03F0000A03F0000
+A0400000A4430000AA470000B04A0000B74D0000BF500000C9510008D34C00
+14DC410023D62F0035C618004DA10303688500156E7500297363003E735700
+5A744B007D733F00AF6F3900FF6A3600FF6A3400FF6B3300FF6B3300FF6B33
+00FF6B3300FF6B3300FF6B3300FF6B3300FF6B3300FF6B3300FF6BA03F0000
+A0400000A1410000A1410000A4440000A9480000AF4B0000B64E0000BE5100
+00C8540006D4520012DF4A001FD43B0030A82D00477F1B00635304007D3E00
+13833000278227003E8320005B831B0085801700EC791400FF781100FF7912
+01FF781201FF781201FF781201FF781201FF781201FF781201FF781201FF78
+1201FF78A1410000A1410000A1420000A1430000A4460000A8490000AE4C00
+00B5500000BD530000C7570003D357000FCB55001CAD4E002D8A3F0041662C
+005A3F1D00731409008B0407168E010B2C8A000D4887001479870419E8750E
+1FFF6C0C20FF6B0C20FF6B0C20FF6B0C20FF6B0C20FF6B0C20FF6B0C20FF6B
+0C20FF6B0C20FF6B0C20FF6BA1420000A1430000A1440000A1440000A44700
+00A74A0000AD4E0000B3510000BB550000C5590002BA5E000FAB61001C945B
+002A7850003D584100543633006A0D21017D0022138300282B82002F4F7F00
+3480790033D46B0736FF630838FF620839FF620839FF620839FF620839FF62
+0839FF620839FF620839FF620839FF620839FF62A1440000A1440000A14500
+00A1450000A3480000A64C0000AB4F0000B1530000B8570000AC5E0006A264
+00119568001C826600286C6300394F57004D2E4A006207370077003D147A00
+472D78004E54740051836C0050D262004EFF5E0050FF5E0050FF5D0050FF5D
+0050FF5D0050FF5D0050FF5D0050FF5D0050FF5D0050FF5D0050FF5DA14500
+00A1460000A1460000A1470000A3490000A54D0000AA500000AD550000A15C
+00019863000A906A0011846F00197573002463740032486D00452962005906
+550170005B166F0063326B006B5967006E845F0977EA521076FE491077FE48
+1078FE471078FE471078FE471078FE471078FE471078FE471078FE471078FE
+471078FE47A1470000A1470000A1480000A1480000A24B0000A44E0000A452
+000098590000906000058968000A8170000E77780014697E001D5982002942
+7F0038267A004B0571026400761962007F345E0088565700897F500193E648
+0791FF400691FF400591FF400591FF400591FF400591FF400591FF400591FF
+400591FF400591FF400591FF40A1480000A1480000A1490000A1490000A24C
+00009F50000092560000895D0002826400047C6D00067576000A6C80000E60
+890016518E00213D90002D2590003E058B0252008E1852009A314E00A25147
+00A97E4100B2C43C00A9FF3901AAFF3801AAFF3801AAFF3801AAFF3801AAFF
+3801AAFF3801AAFF3801AAFF3801AAFF3801AAFF38A1490000A14A0000A14A
+0000A14A00009C4E00008D540000835A00007C60000176680001717200026B
+7D0004638900085994000E4A9B001A38A2002426A9003009A8014100AE1443
+00C02E3F00C84E3A05F6883300ECAA3107E8ED2A07E8EC2A07E9EC2A07E9EC
+2A07E9EC2A07E9EC2A07E9EC2A07E9EC2A07E9EC2A07E9EC2A07E9EC2AA14B
+0000A14B0000A14B00009C4C00008C52000080570000775D0000706400006B
+6D000067780000608400005A92000155A0000349AC000D37B8001627C40020
+16D9002E00E60C370AFB312B08FF4B2812FF7F1E0AFF9D2100FFB12400FFB6
+2400FFB62400FFB62400FFB62400FFB62400FFB62400FFB62400FFB62400FF
+B62400FFB624A14C0000A14C00009D4D00008B5000007F550000755B00006C
+61000066690000627300005C7F0000578C0000529900004EA8000047B90002
+36CA000D25DA001817F3002501FF112E09FF322214FF5B1713FF79150AFF96
+1A00FFAD1F00FFB21F00FFB21F00FFB21F00FFB21F00FFB21F00FFB21F00FF
+B21F00FFB21F00FFB21F00FFB21FA14D00009E4E00008B5100007F53000074
+5800006A5D0000646400005F6C00005A77000055830000509000004B9C0000
+46AA00003CBC00042DCE000D1EE000180EF7012400FF192709FF371C0EFF5C
+1615FF7D0A0BFF971300FFAD1B00FFB51B00FFB51B00FFB51B00FFB51B00FF
+B51B00FFB51B00FFB51B00FFB51B00FFB51B00FFB51BA14E00008A5100007E
+530000745500006A590000635F00005D66000058700000547B00004E870000
+49930000449F00003EAD000034C2000425D3000D18E6001806F9052300FF20
+2113FF470D0BFF5F1312FF7D070CFF960C00FFAE180DFFCE0D0EFFCF0D0EFF
+CF0D0EFFCF0D0EFFCF0D0EFFCF0D0EFFCF0D0EFFCF0D0EFFCF0D0EFFCF0D8B
+5100007D540000735500006B560000625B00005C610000576A000052740000
+4D7F0000488B0000429600003CA3000035B300002AC700041DD7000E11EB00
+1800F90F1F00FF251B12FF4C070CFF630B12FF7E000CFF940700FFAA1414FF
+E00414FFE00414FFE00414FFE00414FFE00414FFE00414FFE00414FFE00414
+FFE00414FFE0047D540000725500006A560000635800005B5D000056640000
+516D00004C78000047840000418E00003B9A000034A700002DB9000022CB00
+0516DC000E06ED011A00FC17190CFF330B11FF500106FF620C0CFF7B020BFF
+920302FFA50D12FFDA0113FFE60113FFE60113FFE60113FFE60113FFE60113
+FFE60113FFE60113FFE60113FFE6017155000068570000615800005C590000
+56600000506800004B720000467D0000408700003A920000339E00002CAC00
+0025BE00001ACE00060FE0000E02F0081600FE1D1409FF35080CFF500007FF
+65040AFF7B000AFF900003FFA10807FFBC040FFFE5000FFFE5000FFFE5000F
+FFE5000FFFE5000FFFE5000FFFE5000FFFE5000FFFE5006757000060580000
+5A5A0000565C0000506300004B6C00004677000040810000398B0000329500
+002BA2000024B100001DC1000013D1000708E4000F00F30F1200FF210F05FF
+370708FF510007FF670006FF790006FF8C0002FF9D0503FFB00304FFBB0204
+FFBB0204FFBB0204FFBB0204FFBB0204FFBB0204FFBB0204FFBB0204FFBB02
+5E590000595B0000545D0000505F00004B670000457100003F7B0000398500
+00318E00002A99000023A600001CB4000016C400010CD4000700E6021000F6
+150D00FF260B03FF390505FF540003FF670003FF760003FF880002FF990201
+FFAA0201FFB40101FFB40101FFB40101FFB40101FFB40101FFB40101FFB401
+01FFB40101FFB401575B0000535E00004F6000004B630000456B00003F7500
+00397F0000318800002A920000239D00001CAA000015B700000FC6000206D7
+000800EA090B00F71B0900FF2A0601FF3C0102FF560001FF670000FF750001
+FF850001FF950000FFA50100FFAC0000FFAC0000FFAC0000FFAC0000FFAC00
+00FFAC0000FFAC0000FFAC0000FFAC00>
+<96290000972A0000972B0000972C0000992D00009D2E0000A3300000A93100
+00AD2E0006B0240014AD170024A10700399F000E40A200213DA7003539AE00
+4D38B1006836AC008234A6009E30A400C62B9B00FA27A51EFF08A51EFF08A5
+1DFF09A51DFF09A51DFF09A51DFF09A51DFF09A51DFF09A51DFF09A51DFF09
+A51DFF09A51DFF09962A0000972B0000972B0000972C0000992D00009E2F00
+00A4310000A9320000AD2F0005B1250014AE190024A30800389F000D41A200
+203EA700343AAE004C38B1006737AC008135A6009D31A400C42C9C00F928A3
+1BFF0CA31BFF0CA31BFF0CA31AFF0CA31AFF0CA31AFF0CA31AFF0CA31AFF0C
+A31AFF0CA31AFF0CA31AFF0CA31AFF0C972A0000972B0000972C0000982C00
+00992E00009E300000A4320000AA330000AE300005B2270013B01A0023A40A
+00379F000B42A2001F3FA700323BAE004B39B2006538AD008036A6009B32A4
+00C22D9C00F828A118FF0FA118FF10A117FF10A117FF10A117FF10A117FF10
+A117FF10A117FF10A117FF10A117FF10A117FF10A117FF10972B0000972C00
+00982C0000982D0000992E00009F310000A5330000AB340000AF310005B228
+0013B11C0022A60C00369F000A43A2001D40A700313CAE00493AB2006439AE
+007F37A6009A33A300BF2E9C00F7299F14FF149F14FF149F14FF149F13FF14
+9F13FF149F13FF149F13FF149F13FF149F13FF149F13FF149F13FF149F13FF
+14972B0000972C0000982D0000982E00009A2F00009F320000A5340000AC36
+0000B0330004B32A0012B31D0021A80E0035A0000845A3001C42A7002F3DAE
+00473BB300623AAF007D38A6009834A300BC2F9D00F62A9C10FF189C10FF19
+9C0FFF199C0FFF199C0FFF199C0FFF199C0FFF199C0FFF199C0FFF199C0FFF
+199C0FFF199C0FFF19972C0000982D0000982E0000982E00009A300000A033
+0000A6350000AD370000B1350003B52C0011B51F0020AB100033A0000546A3
+001A44A7002D3FAD00453DB400603BB0007C39A6009636A300B8309D00F42C
+990BFF1D990AFF1E990AFF1E990AFF1E990AFF1E990AFF1E990AFF1E990AFF
+1E990AFF1E990AFF1E990AFF1E990AFF1E982D0000982E0000982F0000992F
+00009A310000A0340000A7370000AE380000B3370003B62E0010B722001FAE
+130032A2010447A4001745A8002B41AD00433EB5005E3DB1007A3BA7009438
+A200B5329D00F12D9605FF239605FF249604FF249604FF249604FF249604FF
+249604FF249604FF249604FF249604FF249604FF249604FF24982E0000992F
+000099300000993000009B320000A1350000A8380000AF3A0000B4390002B7
+31000FB924001EB2160030A4030346A5001548A8002943AD004040B6005C3E
+B300783CA900923AA200B1349E00ED2E9400FF299400FF299400FF299400FF
+299400FF299400FF299400FF299400FF299400FF299400FF299400FF299400
+FF29992F000099300000993100009A3200009C330000A2370000A93A0000B0
+3C0000B63C0001B934000EBC27001DB619002EA8060145A500124AA9002645
+AD003D42B7005940B400753EA900903CA100AD369F00EC309400FF2B9400FF
+2A9400FF2A9400FF2A9400FF2A9400FF2A9400FF2A9400FF2A9400FF2A9400
+FF2A9400FF2A9400FF2A993000009A3100009A3200009A3300009D350000A3
+390000AA3B0000B23E0000B83E0001BB37000DBF2B001BBA1C002CAC0A0143
+A7000E4DA9002348AD003944B7005543B6007240AB008E3FA100AA399F00E7
+329500FF2D9400FF2C9400FF2C9400FF2C9400FF2C9400FF2C9400FF2C9400
+FF2C9400FF2C9400FF2C9400FF2C9400FF2C9A3200009A3300009B3300009B
+3400009E360000A43B0000AB3E0000B3400000B9410000BD3B000BC12F001A
+BF21002AB20F0040A9000A50AA001F4BAE003547B7005145B8006E43AC008B
+42A200A63C9E00DD359600FF2F9400FF2E9400FF2E9400FF2E9400FF2E9400
+FF2E9400FF2E9400FF2E9400FF2E9400FF2E9400FF2E9400FF2E9B3300009B
+3400009C3500009C3600009E380000A53C0000AB3F0000B3410000BA430000
+BF3F000AC3340018C5260028B814003DAB010553AB001B4FAF00314AB7004C
+48BA006A46AE008745A200A33F9D00D4389502FF339002FF338D03FF348B04
+FF358B04FF358B04FF358B04FF358B04FF358B04FF358B04FF358B04FF358B
+04FF359C3500009C3600009D3700009D3800009F3A0000A53E0000AC410000
+B4430000BB450000C1420008C6390016CA2B0025BE19003AAE010056AD0017
+52AF002C4DB700464BBC006549A300814F8E009B4D7D00B649800DFF3D7E11
+FF3A7C12FF3A7A13FF3A7A13FF3B7A13FF3B7A13FF3B7A13FF3B7A13FF3B7A
+13FF3B7A13FF3B7A13FF3B9D3700009D3800009D3900009E3A0000A03C0000
+A63F0000AC430000B4450000BB470000C3460006C83E0014CE310023C52000
+35B50A0050AE001156A90025549A0038598F00515E81006E606F008B5E5E00
+AF5C5400EA586617FF426618FF42651AFF41641AFF42641AFF42641AFF4264
+1AFF42641AFF42641AFF42641AFF42641AFF429E3900009E3A00009F3B0000
+9F3C0000A13E0000A6410000AC440000B3470000BB4A0000C34A0004CA4400
+12D2390020CC280031BD13004A920403637A0014696E00276E5E003A6E5200
+536F4800726E3E009B6B3F09E95F491AFF4E461AFF4F4217FF514217FF5242
+17FF524217FF524217FF524217FF524217FF524217FF524217FF529F3B0000
+9F3C0000A03D0000A03E0000A13F0000A6430000AC460000B3490000BA4C00
+00C34D0003CC4B000FD541001DC235002D9E2900447518005E4E0301793A00
+127C2D00257B25003A7D1E00547D1A00767A1600BD761200FF721101FF7111
+03FF701103FF701103FF701103FF701103FF701103FF701103FF701103FF70
+1103FF70A03E0000A03E0000A03F0000A03F0000A1410000A6450000AB4800
+00B24B0000B94E0000C2500001CC4F000CBA4D001BA246002A833A003D5F29
+00563B1B006E1208008604061588000A2A84000D4381001169810016BC7802
+17FE6D0018FE6D0019FD6C0019FD6C0019FD6C0019FD6C0019FD6C0019FD6C
+0019FD6C0019FD6C0019FD6CA03F0000A0400000A1410000A1410000A24300
+00A6460000AB490000B14C0000B8500000BC540001AE57000F9F58001B8C52
+002871490039533D004F322F00650C1F01780020127D0025287B002B487900
+3174750032B36A0834FE5C0935FF5B0A37FF5A0937FF5A0937FF5A0937FF5A
+0937FF5A0937FF5A0937FF5A0937FF5A0937FF5AA1410000A1420000A14200
+00A1430000A2450000A5480000AA4B0000B04E0000AE530000A3590006985D
+00118C5F001A7B5E0026665900364A5100492B44005D053200710039137300
+422A7200494D6F004C7668004DB75F004AFF58004BFF57004CFF57004CFF57
+004CFF57004CFF57004CFF57004CFF57004CFF57004CFF57004CFF57A14300
+00A1440000A1440000A1450000A2460000A4490000A84C0000A45100009958
+0001905D0009876200107C6700186E6A00225D6B003042640040255A005404
+4E016B0055166A005D2F67006453630067775C0066A853076CFC49076EFD47
+086FFE46086FFE46086FFE46086FFE46086FFE46086FFE46086FFE46086FFE
+46086FFE46A1450000A1450000A1460000A1460000A1480000A34B00009C4F
+000091560000895B0004816200097968000E706F00146375001D537800283C
+7500362270004902690260006F185D00773259007F52540081754C0084AC47
+0187FF3D0188FF3C0188FF3C0188FF3C0188FF3C0188FF3C0188FF3C0188FF
+3C0188FF3C0188FF3C0188FF3CA1470000A1470000A1470000A1480000A149
+0000984E00008C530000835900017B600003746700056E6F00096578000E5A
+7F00174B8400213785002C1F85003D028103500086194D008F304900964D43
+009C733D00A2AA39009FFD35009DFF33009EFF33009EFF33009EFF33009EFF
+33009EFF33009EFF33009EFF33009EFF33009EFF33A1480000A1490000A149
+0000A1490000964C0000885100007E570000755D00006F6400006A6C000164
+7600055C810009538A00104490001C339600241F9A00300399024000A1163E
+00AC2D3A00B24B3500CD7C3200CCA62E09CAFF2706BEFF2706BFFF2706BFFF
+2706BFFF2706BFFF2706BFFF2706BFFF2706BFFF2706BFFF2706BFFF27A14A
+0000A14A0000A14B0000954C0000865000007B550000725A00006A60000065
+690000617300005B7E0000558A00024D950007409F001131A9001822B30022
+0EBE002E00C9103200DA282E00E0452A0BFC7C2206FF9C2100F6B72300F2D1
+2200F3D12200F3D12200F3D12200F3D12200F3D12200F3D12200F3D12200F3
+D12200F3D122A14B0000A14C0000944E0000855000007A5300007058000067
+5E0000616500005D6F0000587A0000538600004E93000048A1000042B10001
+35C4000725D5001218EB001D00FE072A00FF252412FF511210FF6F1115FF90
+0800FFA91A00FFB61B00FFB61B00FFB71B00FFB71B00FFB71B00FFB71B00FF
+B71B00FFB71B00FFB71B00FFB71BA14D0000944F0000845200007954000070
+560000665B00005F6200005A6A000056750000518000004C8C000046980000
+40A5000039B600012CCA00071EDB001210F0001D00FF152209FF311710FF55
+0D0DFF700D14FF900201FFA91711FFD50912FFD70812FFD70812FFD70812FF
+D70812FFD70812FFD70812FFD70812FFD70812FFD708954F00008353000077
+5400006E560000665800005E5D000059640000546E00004F7900004A840000
+459000003F9B000038A9000030BC000023CE000817E1001207F2041D00FE1C
+1C10FF3E090EFF58090AFF700B11FF8D0000FFA41214FFDA0213FFE00313FF
+E00313FFE00313FFE00313FFE00313FFE00313FFE00313FFE00313FFE00383
+530000765500006D560000655700005E59000058600000536800004E720000
+497D0000438800003D930000379F00002FAE000027C100011CD2000910E500
+1200F40A1B00FF211712FF44010BFF590606FF70090DFF8A0001FFA10D10FF
+CC0013FFE80013FFE80013FFE80013FFE80013FFE80013FFE80013FFE80013
+FFE80013FFE800765500006B560000645800005D590000585C000053630000
+4D6C000048770000438200003C8C0000359700002EA4000027B400001FC500
+0214D6000907E8001400F7131400FF25120DFF450009FF5C0209FF720009FF
+880002FF9C0704FFB2050DFFDF000DFFDF000DFFDF000DFFDF000DFFDF000D
+FFDF000DFFDF000DFFDF000DFFDF006A560000625800005C590000575B0000
+535F00004D67000048710000427B00003C860000348F00002D9B000026A800
+001FB8000017C800030DD9000A00EA051300F9190F00FF2A0D09FF460006FF
+5D0005FF700005FF840003FF990302FFAB0303FFB90203FFB90203FFB90203
+FFB90203FFB90203FFB90203FFB90203FFB90203FFB902615800005A5A0000
+555C0000515F00004D620000476B0000417600003B800000348900002D9300
+00259F00001FAC000018BB000010CB000306DC000B00EE0C0D00FC1E0B00FF
+2E0805FF4B0003FF5F0002FF6F0002FF810002FF950101FFA60201FFB50001
+FFB50001FFB50001FFB50001FFB50001FFB50001FFB50001FFB50001FFB500
+595B0000545D0000506000004C62000047660000417000003B7A0000348300
+002C8C0000259700001EA3000017AF000011BD00000ACC000401DF020A00F0
+130800FE230700FF320301FF4B0000FF5F0000FF6F0000FF800001FF920000
+FFA10000FFB20000FFB20000FFB20000FFB20000FFB20000FFB20000FFB200
+00FFB20000FFB200535E00004E6100004A64000046670000416A00003B7400
+00347D00002C860000259000001E9A000017A5000010B100000BBF000003CD
+000600E2090600F1190400FE280300FF350000FF4F0000FF630000FF720000
+FF810000FF910000FF9E0000FFAD0000FFAF0000FFAF0000FFAF0000FFAF00
+00FFAF0000FFAF0000FFAF0000FFAF00>
+<9424000094240000942500009425000095260000972600009A2700009F2700
+00A3240004A71D0012A2110022980202339A0012349D002331A400362FAA00
+4D2EAB00652DA8007E2BA7009929A800C2259F00EE20A71EFF00A51DFF00A5
+1DFF00A51DFF00A51DFF00A51DFF00A51DFF00A51DFF00A51DFF00A51DFF00
+A51DFF00A51DFF009424000094250000942500009426000095260000972700
+009B2700009F270000A3250003A81E0011A4120021980201349A0011359D00
+2232A4003530AA004B2FAC00642EA9007D2CA7009829A800C025A000ED21A8
+1FFF00A51EFF00A61EFF00A61EFF00A61EFF00A61EFF00A61EFF00A61EFF00
+A61EFF00A61EFF00A61EFF00A61EFF00942500009425000094260000952600
+0095270000972800009B280000A0280000A3260003A81F0011A51300219903
+00339A000F369D002133A4003431AA004A30AC00632FA9007B2DA700972AA7
+00BE26A000EB22A820FF00A61EFF00A61EFF00A61EFF00A61EFF00A61EFF00
+A61EFF00A61EFF00A61EFF00A61EFF00A61EFF00A61EFF0094250000942600
+00952600009527000095280000982800009C290000A0290000A4270003A921
+0010A71500209B0500329B000E389D002035A4003232AA004831AD006230AA
+007A2EA700962BA700BC27A000EA23A921FF00A71FFF00A71FFF00A71FFF00
+A71FFF00A71FFF00A71FFF00A71FFF00A71FFF00A71FFF00A71FFF00A71FFF
+009426000095260000952700009528000096280000982900009C2A0000A12A
+0000A5280002AA22000FA917001F9E0700319B000C399E001E36A4003033AA
+004732AD006031AB00792FA700942CA700B928A000E824AA22FF00A720FF00
+A720FF00A720FF00A720FF00A720FF00A720FF00A720FF00A720FF00A720FF
+00A720FF00A720FF009526000095270000952800009628000096290000982A
+00009C2B0000A22B0000A62A0002AB24000EAA19001DA00A00309B00093B9E
+001C38A3002E35AA004533AE005E33AC007730A600922EA700B62AA000E625
+AB23FF00A821FF00A821FF00A821FF00A821FF00A821FF00A821FF00A821FF
+00A821FF00A821FF00A821FF00A821FF009527000095280000962900009629
+0000962A0000992B00009D2C0000A32D0000A72C0001AC26000DAC1B001CA3
+0D002E9C00073D9F001A3BA3002C37AA004235AF005C34AD007532A700902F
+A700B32BA100E326AD24FF00A923FF00A923FF00A923FF00A923FF00A923FF
+00A923FF00A923FF00A923FF00A923FF00A923FF00A923FF00962800009629
+0000962A0000972A0000972B00009A2C00009E2D0000A42F0000A92F0001AD
+29000CAE1E001BA710002C9D02053D9F00173DA3002A39AA004037AF005A36
+AE007334A8008E31A600AF2DA100DF28AE26FF00AA24FF00A924FF00A924FF
+00A924FF01A924FF01A924FF01A924FF01A924FF01A924FF01A924FF01A924
+FF0196290000962A0000972B0000972B0000972C00009A2D00009F2F0000A5
+310000AB320000AF2B000AB1210019AB13002B9F03033DA0001440A300273C
+A9003D39B0005738B0007136A9008C33A500AB2FA100DC2AA91FFF0AA41CFF
+0AA41CFF0AA41CFF0AA41CFF0BA41CFF0BA41CFF0BA41CFF0BA41CFF0BA41C
+FF0BA41CFF0BA41CFF0B972A0000972B0000972C0000982D0000982D00009B
+2F0000A0310000A7330000AD340000B02E0009B4240018AE160029A206023D
+A1001143A400243FA900393BB100533AB1006E38AA008935A500A631A200D8
+2CA416FF159F14FF149F14FF149F14FF149F13FF149F13FF149F13FF149F13
+FF149F13FF149F13FF149F13FF149F13FF14972C0000982C0000982D000098
+2E0000992F00009C310000A2340000A9360000AF370000B2320007B6280016
+B31A0026A60A003CA2000D46A5002142A900353EB0004F3CB4006B3BAC0086
+38A500A234A100D02E9C08FF23990BFF1E990AFF1E990AFF1E990AFF1E990A
+FF1E990AFF1E990AFF1E990AFF1E990AFF1E990AFF1E990AFF1E982D000098
+2E0000992F000099300000993000009D330000A3360000AA380000B13A0000
+B5370006B82C0014B81F0024AC0E0039A3000849A6001D46AA003141B0004B
+3FB600673DAE00833BA5009E379A00C2339203FC2F8A05FF2D8806FF2E8707
+FF2E8507FF2F8507FF2F8507FF2F8507FF2F8507FF2F8507FF2F8507FF2F85
+07FF2F992F000099300000993100009A3200009A3200009E350000A5390000
+AB3B0000B33D0000B83B0004BB310012BD240022B3140035A400034DA70018
+4AAA002D45B0004542AD0060459B00794988008F477900A8447301E742760E
+FF36740EFF37720FFF37710FFF38710FFF38710FFF38710FFF38710FFF3871
+0FFF38710FFF38710FFF38993100009A3200009A3300009B3400009B340000
+A0380000A63B0000AD3E0000B5400000BB400002BE370010C12A001FBA1B00
+31AB070249A800124E9D0024509100355486004C587900655A6A007F595D00
+A0575400CB526216FF3C6017FF3D5E17FF3E5D17FF3E5D17FF3E5D17FF3E5D
+17FF3E5D17FF3E5D17FF3E5D17FF3E5D17FF3E9B3300009B3400009C350000
+9C3600009D370000A13A0000A73E0000AE400000B6430000BD430002C13D00
+0EC631001CC221002DAB1200468503035E7200136466002568580036684D00
+4C69440069693C008B663700C262481CFF46441AFF483F17FF4C3C14FF4F3C
+14FF4F3C14FF4F3C14FF4F3C14FF4F3C14FF4F3C14FF4F3C14FF4F9C360000
+9C3700009D3800009D3900009E390000A13C0000A7400000AF430000B64600
+00BE470001C443000CCA38001AB32F00299325003F6C160059480201743600
+12762B002375220036771C004F7719006B7416009B721201FF6B1102FF6A0F
+03FF6A0F04FF6A0F04FF6A0F04FF6A0F04FF6A0F04FF6A0F04FF6A0F04FF6A
+0F04FF6A9D3800009E3900009E3A00009F3B00009F3C0000A23F0000A84200
+00AE450000B6480000BE4A0000BE49000AAC460019973F00267C3500385826
+00523719006911070080030614820009287F000C3F7B000F5F7A00149B7600
+15F2690016F2680017F2670018F3660018F3660018F3660018F3660018F366
+0018F3660018F3660018F3669F3B00009F3D0000A03D0000A03E0000A03E00
+00A3410000A8440000AE470000B54A0000B14E0001A350000E954F0019844B
+00256B4300354E38004B2E2C00600A1D0173001E1277002326740028417200
+2E6A6F0031A0670832FD560933FF550934FF540935FF540935FF540935FF54
+0935FF540935FF540935FF540935FF540935FF54A03E0000A03F0000A03F00
+00A0400000A1410000A3430000A8460000AD490000A54E00009A5300069056
+000F845700197555002460510032464B004428400059042F006B0035126D00
+3E266B0045476A00486C64004BA15C0147F3520047FD500048FD500049FD50
+0049FD500049FD500049FD500049FD500049FD500049FD500049FD50A04000
+00A1410000A1420000A1420000A1430000A3450000A74800009C4D00009253
+000189580008805C000F755F0017686100215761002E3E5C003C2253005003
+4802650050156400582C61005E4D5F00616D590062954F0669FF440668FF42
+0569FF42056AFF41056AFF41056AFF41056AFF41056AFF41056AFF41056AFF
+41056AFF41A1430000A1430000A1440000A1440000A1450000A3470000964C
+00008B520000825700037A5C00077262000C696800135E6C001C4E6E002737
+6C00331D6700460162035C006918580070305400774D50007A6C49007C9342
+0082F63A0080FF380081FF370081FF370081FF370081FF370081FF370081FF
+370081FF370081FF370081FF37A1450000A1450000A1460000A1460000A147
+0000924B0000865000007D560000745B00026D620004676900085F70000E55
+770016467A0021317C002B1A7B003B0079044C00801A4800872F43008C493F
+0091693A009596360096E5310093FF2E0093FF2E0094FF2E0094FF2E0094FF
+2E0094FF2E0094FF2E0094FF2E0094FF2E0094FF2EA1470000A1470000A148
+0000A14800008F4B0000834F00007954000070590000685F0000646700015E
+700004577900094D8100113F87001A2D8B0023198E0030018F043D00981739
+00A02C3400A4473100AE6C2F00B89D2C00B0D72901A8FF2501A9FF2501A9FF
+2501A9FF2501A9FF2501A9FF2501A9FF2501A9FF2501A9FF2501A9FF25A148
+0000A1490000A14900008D4C0000814F0000775200006D570000655C000060
+6400005B6D00005678000150830004478C00093A9400132C9D00191BA30024
+05AA012E00B7132D00C3282900C4422500DF6F2600E8912200DAB72201D0F4
+1F01D0F51F01D1F71F01D1F71F01D1F71F01D1F71F01D1F71F01D1F71F01D1
+F71F01D1F71FA14A0000A14B00008C4E00007F500000755200006C55000063
+5A00005D610000586A0000547500004F810000498D0000439800013AA50005
+2EB5000A21C3001313D5001D00E50B2400F8232113FF4E0D0CFF691117FF8C
+0000FFA61714FFE70914FFEA0915FFEB0815FFEB0815FFEB0815FFEB0815FF
+EB0815FFEB0815FFEB0815FFEB08A14C00008B4F00007D520000735400006A
+550000625900005B5F000056680000517200004C7E00004789000041950000
+3BA1000034B000002AC500031DD6000C10EA001600F80F1D03FF281712FF4E
+0408FF650D10FF830000FF9D1114FFD30113FFE10313FFE10313FFE10313FF
+E10313FFE10313FFE10313FFE10313FFE10313FFE1038B5100007C54000071
+55000068570000625800005B5C000055630000506C00004B77000046820000
+408D00003A98000033A500002BB7000021C9000415DB000D05EC011800FC17
+1709FF310C0FFF500005FF650A0CFF810002FF9B0B0EFFC20112FFE70012FF
+E70012FFE70012FFE70012FFE70012FFE70012FFE70012FFE70012FFE7007B
+5400007056000067570000605800005A5A0000555F0000506700004A710000
+457C00003F86000038910000319C00002AAA000023BB000019CC00050EDF00
+0D01EF081500FE1D1205FF330A0AFF510009FF690008FF7F0005FF970404FF
+AE050AFFD4010AFFD3010AFFD3010AFFD3010AFFD3010AFFD3010AFFD3010A
+FFD3010AFFD3016F560000655700005E590000585B0000545D00004F620000
+4A6B0000447600003E800000378A00003094000029A1000022AF00001BBF00
+0012CF000606E2000E00F20F1000FE220D03FF360806FF530005FF680004FF
+7C0004FF940102FFA80302FFB80102FFB80102FFB80102FFB80102FFB80102
+FFB80102FFB80102FFB80102FFB801645700005C590000575B0000535E0000
+4F6000004A660000447000003E7A0000378400002F8D00002898000021A500
+001AB2000013C200010BD2000600E5030D00F5160B00FE270901FF390403FF
+560002FF690001FF7A0002FF910001FFA30101FFB40001FFB40001FFB40001
+FFB40001FFB40001FFB40001FFB40001FFB40001FFB4005B5A0000555C0000
+515F00004D61000049640000436A00003D750000377E00002F870000289100
+00209C000019A8000013B500000DC3000104D4000700E70B0800F61C0600FF
+2B0400FF3B0100FF570000FF6A0000FF7A0001FF8D0000FF9F0000FFB00000
+FFB20000FFB20000FFB20000FFB20000FFB20000FFB20000FFB20000FFB200
+545D00004F6000004B63000046660000426900003D6F0000367900002F8200
+00288B000020950000199F000012AA00000CB6000006C3000300D6040500EA
+120300F6210300FF2F0000FF410000FF5C0000FF6D0000FF7C0000FF8D0000
+FF9D0000FFAA0000FFB20000FFB20000FFB20000FFB20000FFB20000FFB200
+00FFB20000FFB2004E6100004964000044680000406A00003C6D0000377300
+002F7C000028850000208E00001998000012A100000BAB000005B7000200C4
+020300DA0A0100EA180000F7250000FF300000FF4A0000FF5F0000FF6D0000
+FF7C0000FF8B0000FF9C0000FFA50000FFB20000FFB20000FFB20000FFB200
+00FFB20000FFB20000FFB20000FFB200>
+<921F0000931F00009320000093200000932100009421000096210000992000
+009C1E00029F1700109A0B001F9300052B970015299B002427A1003626A500
+4B26A6006225A4007924A6009322A800B71EA200E119A516FF01A015FF00A0
+15FF00A015FF00A015FF00A015FF00A015FF00A015FF00A015FF00A015FF00
+A015FF00A015FF00931F000093200000932000009321000093210000942200
+0096210000992000009C1F00019F18000F9B0C001F9300042C9700142A9B00
+2328A1003527A5004A27A6006126A5007824A6009223A800B61FA200E01AA6
+17FF02A015FF00A015FF00A015FF00A015FF00A015FF00A015FF00A015FF00
+A015FF00A015FF00A015FF00A015FF00932000009320000093210000932100
+009322000094220000962200009A2100009D200001A019000E9C0E001E9300
+022D9700122B9B002229A1003428A6004928A7006027A5007725A6009123A8
+00B420A300DF1BA618FF02A116FF00A116FF00A116FF00A116FF00A116FF00
+A116FF00A116FF00A116FF00A116FF00A116FF00A116FF0093200000932100
+0093210000932200009322000094230000972200009A2200009D200001A11A
+000D9E0F001D9401022D9700112C9B00212AA1003229A6004729A7005F28A6
+007626A6009024A800B321A300DD1CA719FF02A117FF00A117FF00A217FF00
+A217FF00A217FF00A217FF00A217FF00A217FF00A217FF00A217FF00A217FF
+00932100009321000093220000942200009423000094230000972300009A22
+00009D210001A21C000CA011001C9603012C98000F2E9A00202CA100312AA6
+00462AA8005D29A7007427A6008E25A800B122A300DC1DA81AFF03A218FF00
+A218FF00A218FF00A218FF00A218FF00A218FF00A218FF00A218FF00A218FF
+00A218FF00A218FF0093210000932200009423000094230000942400009424
+0000972400009A2300009E220001A31E000BA213001B9905012B98000D309B
+001E2DA0002F2CA600442BA9005B2BA8007329A6008C27A800AF24A400DA1F
+A91BFF04A319FF00A319FF00A319FF00A31AFF00A31AFF00A31AFF00A31AFF
+00A31AFF00A31AFF00A31AFF00A31AFF009322000094230000942300009424
+00009424000094250000972500009B2500009F240000A420000AA31600199B
+08012A98000B329B001C30A0002D2DA700412CA900592CA900712AA6008A28
+A800AC25A400D820AB1CFF04A41BFF00A41BFF00A41BFF00A41BFF00A41BFF
+00A41BFF00A41BFF00A41BFF00A41BFF00A41BFF00A41BFF00942300009424
+000094240000942500009425000095260000982600009C260000A0260000A5
+220009A51800189E0B0029990108339B0019329F002A2FA7003F2EAA00572D
+AA006F2CA700882AA800A927A500D622AC1DFF05A51CFF00A51CFF00A51CFF
+00A51CFF00A51CFF00A51CFF00A51CFF00A51CFF00A51CFF00A51CFF00A51C
+FF00942400009425000094250000942600009526000095270000982700009D
+280000A1270000A5240007A81B0016A20E0027990105359B0017359F002831
+A7003C30AB00542FAB006D2EA800862BA700A528A500D324A917FE0DA61EFF
+00A61EFF00A61EFF00A61EFF00A61EFF00A61EFF00A61EFF00A61EFF00A61E
+FF00A61EFF00A61EFF00942500009426000095260000952700009528000096
+280000992900009D2A0000A22A0000A6260006AA1E0014A51100259A030336
+9C0013389F002535A6003932AC005131AD006A30A900842EA700A12AA600CF
+26A30DFD18A720FF00A720FF00A720FF00A720FF00A720FF00A720FF00A720
+FF00A720FF00A720FF00A720FF00A720FF0095260000952700009528000096
+28000096290000962A00009A2A00009F2B0000A42C0000A8290004AC220013
+A91500239D0500379C000F3BA0002238A6003534AC004D34AE006732AA0081
+30A6009E2DA600C9289C01FB23A822FF00A822FF00A822FF00A822FF00A723
+FF00A723FF00A723FF00A723FF00A723FF00A723FF00A723FF009528000096
+28000096290000962A0000972A0000972B00009B2C0000A02E0000A62F0000
+AA2D0003AE260011AD190020A20A00349D000B3FA0001E3CA5003138AC0049
+36B0006335AC007E33A20097319600B42F8C00E42D8202FF298003FF2A7F04
+FF2B7D04FF2B7D04FF2C7D04FF2C7D04FF2C7D04FF2C7D04FF2C7D04FF2C7D
+04FF2C96290000972A0000972B0000972C0000972C0000982D00009C2F0000
+A2310000A8330000AD320002B12A000EB11E001EA90F00319E000642A10019
+40A5002D3CAA00433AA000593F930070428300844176009D3E6D00C23D6C07
+FF356A08FF356A0AFF35690BFF35690CFF35690CFF35690CFF35690CFF3569
+0CFF35690CFF35690CFF35972B0000972C0000982D0000982E0000982E0000
+992F00009E320000A4350000AB370000B1370000B42F000CB624001BB01500
+2DA3050341A00013469100224B8800324E7E00465171005D53650075525B00
+93525300B34C5A12FF3B5D17FF365F1BFF32611FFF2F6220FF2E6220FF2E62
+20FF2E6220FF2E6220FF2E6220FF2E6220FF2E982D0000982E0000992F0000
+99300000993100009A3200009F350000A6380000AD3A0000B43B0000B73500
+0ABB2A0019B71C00299B1000407B0304576A00125E5F002361530033624900
+4764410063643A007F613500A55C481DFF3F4118FF433D15FF473912FF4A37
+11FF4C3711FF4C3711FF4C3711FF4C3711FF4C3711FF4C3711FF4C99300000
+993100009A3200009A3300009B3300009B340000A2390000A83C0000B03E00
+00B7400000BB3C0008B8320016A42B00258821003A641400544302016E3300
+11702800216F200033711A004A711800636E1600876C1101E7661003FF640F
+04FF640E04FF640D05FF640D05FF640D05FF640D05FF640D05FF640D05FF64
+0D05FF649A3200009B3400009B3500009C3600009C3600009D370000A33C00
+00A93F0000B1410000B8430000AF430008A03F00168E390023753000345324
+004E341700640F07007A0305137C00092679000C3C75000E58730013877200
+15D2660016EC620017EC610018EC610018EC600018EC600018EC600018EC60
+0018EC600018EC600018EC609C3600009C3700009D3800009D3900009E3A00
+009E3B0000A43E0000AA420000B1450000A6490000994A000C8D4800177D44
+0022653D0032493500472B29005C091B016D001C11700021246E00253C6B00
+2B626A002F9064002ED958042EFE51032FFE510330FE510330FE510330FE51
+0330FE510330FE510330FE510330FE510330FE519E3900009E3A00009F3B00
+009F3C00009F3D0000A03E0000A4410000A84500009C4A0000924E00048850
+000E7D5000176E4E00215A4B002F42450040253B0054042C01660032126600
+3A24640041416400456460004990580046D04F0045F7490046F8490047F849
+0047F8490047F8490047F8490047F8490047F8490047F8490047F8499F3D00
+00A03E0000A03E0000A03F0000A0400000A1400000A0440000954A00008B4F
+0000825300077956000E6F580015625A001F5159002A395500381E4D004C02
+42025F004B145E00532A5C005A485A005C6554005D874C005EBD440162FF3F
+0162FF3E0163FF3E0163FF3D0163FF3D0163FF3D0163FF3D0163FF3D0163FF
+3D0163FF3DA0400000A0400000A1410000A1420000A14200009B4300008F4A
+0000854F00007C530002745700066C5C000B646100125965001B4966002532
+640031195F0043005B045600631852006B2E4E0070494B007365450075853E
+007AC638007AFF33007BFF32007BFF32007BFF32007BFF32007BFF32007BFF
+32007BFF32007BFF32007BFF32A1420000A1430000A1440000A14400009A46
+00008C490000814D0000775200006F570001675C0003616300075A6A000D50
+6F0016417200202C73002A1571003900710647007A1A4100802D3D0084453A
+00896335008C8631008FC62E008CFF2A008CFF29008CFF29008CFF29008CFF
+29008CFF29008CFF29008CFF29008CFF29008CFF29A1450000A1450000A146
+000099470000894A00007E4C0000745100006B550000645B00005E62000059
+6A000352720009497900113A7E001A278200231283002F0087063800901832
+00962B2F009A452C00A1642B00A9902900A5C327009BFF21009BFF21009BFF
+20009CFF20009CFF20009CFF20009CFF20009CFF20009CFF20009CFF20A147
+0000A147000098490000874C00007B4E0000724F000069540000615900005B
+60000057680000527200014B7D00054284000B358C00122692001A13970025
+009D032C00A9142800B2272500B4412200BF642200CB8B2000C5B32000BBFA
+1C00B8FF1C00B9FF1B00B9FF1B00B9FF1B00B9FF1B00B9FF1B00B9FF1B00B9
+FF1B00B9FF1BA1490000984B0000854E0000795000006F5100006852000060
+570000595E000055660000507000004B7B0000458700003D910003339B0008
+27A7000D19B100160ABE001F00CB101F00DB231D01F03A1C00EF601908F985
+0F00FBA81613FEF80A12F7FF0912F7FF0912F8FF0912F8FF0912F8FF0912F8
+FF0912F8FF0912F8FF0912F8FF09984C0000844F0000775200006D53000065
+5500005F560000585C0000536400004E6E0000497A0000438500003D910000
+369D00002EAC000027BF00011BD000080FE3001100F30A1900FF211510FF45
+0008FF5B0709FF760409FF94030AFFB70311FFE60011FFE60011FFE60011FF
+E60011FFE60011FFE60011FFE60011FFE60011FFE60082510000755400006B
+550000635700005C590000585B0000526200004D6B00004776000042800000
+3B8B0000349500002DA2000026B200001EC3000113D4000807E7001200F713
+1300FF26100BFF450009FF5E0007FF760008FF910004FFAA0408FFCC0108FF
+CB0108FFCA0108FFCA0108FFCA0108FFCA0108FFCA0108FFCA0108FFCA0174
+55000069560000615800005A5A0000565C0000525E00004C66000047700000
+417A00003B850000338E00002C99000025A700001EB6000016C600020CD700
+0900E9051100F9190E00FF2B0B07FF480005FF600004FF740004FF8C0002FF
+A40302FFB80102FFB80102FFB80102FFB80102FFB80102FFB80102FFB80102
+FFB80102FFB801685700005F580000595B0000545D0000505F00004C620000
+466A0000407500003A7F0000328800002B920000249E00001DAB000016B900
+000FC8000205DA000A00ED0C0B00FB1F0900FF2F0603FF4B0001FF600001FF
+720001FF890001FFA00100FFB30000FFB30000FFB30000FFB30000FFB30000
+FFB30000FFB30000FFB30000FFB3005E590000575B0000525E00004E610000
+4A63000046660000406F000039790000328200002A8C0000239600001CA100
+0015AD00000FBB000008C9000301DC040800EF140600FC240500FF330101FF
+4C0000FF620000FF740000FF870000FF9C0000FFAE0000FFB20000FFB20000
+FFB20000FFB20000FFB20000FFB20000FFB20000FFB200565C0000515F0000
+4C62000047650000436800003F6B000039740000327D00002A860000238F00
+001C99000015A400000EAF000008BC000101CA000500E00B0300EF1A0200FD
+290100FF350000FF540000FF690000FF760000FF880000FF9C0000FFA90000
+FFB20000FFB20000FFB20000FFB20000FFB20000FFB20000FFB20000FFB200
+4F6000004A63000045670000416A00003D6C0000396F0000327700002A8000
+00238900001C930000149C00000DA5000007AF000101BC010300CE050000E2
+100000EF1D0000FC2A0000FF370000FF550000FF690000FF740000FF850000
+FF9B0000FFA30000FFB20000FFB20000FFB20000FFB20000FFB20000FFB200
+00FFB20000FFB20048650000436800003E6B00003A6E000036710000327300
+002B7A0000238300001C8C0000159500000D9D000008A6000002B0000300BC
+010200CD050000E1100000EE1C0000FB290000FF350000FF530000FF670000
+FF720000FF830000FF960000FF9F0000FFAF0000FFB20000FFB20000FFB200
+00FFB20000FFB20000FFB20000FFB200>
+<901A0000901A0000911B0000911B0000911B0000911C0000931C0000951B00
+00971800019812000D9106001D90000922940017209800251E9D00351EA000
+4A1EA100601DA000751CA1008C1BA400AC18A100D0149F07F80A9B0CFF009B
+0CFF009B0CFF009B0CFF009B0CFF009B0CFF009B0CFF009B0CFF009B0CFF00
+9B0CFF009B0CFF00901A0000911B0000911B0000911B0000911C0000921C00
+00931C0000951B0000971900009813000C9307001C90000723940016219800
+241F9E00341EA100491FA1005F1EA100741DA2008B1CA500AB19A200CF149F
+06F80C9C0DFF009C0DFF009C0DFF009C0DFF009C0DFF009C0DFF009C0DFF00
+9C0DFF009C0DFF009C0DFF009C0DFF00911B0000911B0000911C0000911C00
+00921C0000921D0000931D0000961C0000971A00009914000B9409001B9000
+062494001422980023209E00331FA1004720A2005E1FA100731EA2008A1DA5
+00A91AA200CE159F05F80D9C0EFF009C0EFF009C0EFF009C0EFF009C0EFF00
+9C0EFF009C0EFF009C0EFF009C0EFF009C0EFF009C0EFF00911B0000911C00
+00911C0000921D0000921D0000921E0000931E0000961D0000981B00009A15
+000A960A001A9100052594001323980022219E003120A2004621A3005C21A2
+00711FA200891EA600A81BA300CD169F05F80F9D0FFF009D0FFF009D0FFF00
+9D0FFF009D0FFF009D0FFF009D0FFF009D0FFF009D0FFF009D0FFF009D0FFF
+00911C0000921C0000921D0000921D0000921E0000921E0000941E0000961D
+0000981C00009B170009980C00199201042594001225980020239E003021A2
+004422A3005B22A2007020A300871FA600A61CA400CC189F04F8109D10FF00
+9D10FF009D10FF009D10FF009D10FF009D10FF009D10FF009D10FF009D10FF
+009D10FF009D10FF00921C0000921D0000921E0000921E0000921F0000931F
+0000941F0000971E0000991D00009C1800089A0E0018930303259500102698
+001F249E002E23A2004223A4005923A3006F21A3008620A600A51EA400CB19
+9F03F7139E11FF009E11FF009E11FF009E11FF009E11FF009E11FF009E11FF
+009E11FF009E11FF009E11FF009E11FF00921D0000921E0000921E0000931F
+0000931F00009320000094200000971F0000991E00009D1A00079C11001695
+04022595000D2898001D269E002C24A3004025A5005725A4006D23A4008421
+A600A31FA500C91A9E01F6169F13FF009F13FF009F13FF009F13FF009F13FF
+009F13FF009F13FF009F13FF009F13FF009F13FF009F13FF00921E0000931F
+0000931F000093200000932000009321000094210000972000009A1F00009E
+1C00069E1300159706012595000B2A98001A289D002A26A3003E26A6005426
+A5006B25A4008223A700A121A600C71C9E00F518A014FF00A014FF00A015FF
+00A015FF00A015FF00A015FF00A015FF00A015FF00A015FF00A015FF00A015
+FF00931F000093200000932000009321000093210000932200009522000098
+2200009B2100009E1E0005A0160013990900249500082C9800182B9D002828
+A3003B28A6005128A6006926A5008025A7009E22A700C51E9F00F31AA116FF
+00A116FF00A116FF00A116FF00A116FF00A116FF00A116FF00A116FF00A116
+FF00A116FF00A116FF00932000009321000093220000932200009423000094
+23000095230000982300009B2200009F200003A31900119D0C00229500052F
+9900152D9D00252BA300382AA7004E2AA8006628A6007E27A7009B24A800C3
+209F00F01BA319FF00A218FF00A218FF00A218FF00A218FF00A218FF00A218
+FF00A218FF00A218FF00A218FF00A218FF0093220000932200009423000094
+230000942400009424000095240000982400009C240000A0230002A41C0010
+A010002096010131990011309C00222EA300352CA8004B2CA900632BA7007B
+29A7009727A800C023A000ED1EA51BFF00A21CFF00A01DFF009F1EFF009E1F
+FF009E1FFF009E1FFF009E1FFF009E1FFF009E1FFF009E1FFF009423000094
+2300009424000094250000942500009426000096260000992600009D260000
+A1250001A620000DA514001D9A05012F99000D349C001F31A200312FA80047
+2EAB00602DA800782C9C008E2D9300AA2C8A00CF2A7D00FE277901FF267701
+FF277601FF287401FF287401FF287401FF287401FF287401FF287401FF2874
+01FF2894240000942500009425000095260000952700009527000097280000
+9A2900009F290000A3280001A824000BA819001BA00A002C9A0009389D001B
+36A1002D329F003F34960054398B00683B7F007C3A730094396B00B3386500
+F3366607FF2F6407FF316307FF316107FF326107FF326107FF326107FF3261
+07FF326107FF326107FF329426000095270000952700009628000096290000
+96290000982A00009B2B0000A12C0000A52C0000AA280009AC1E0018A61000
+299D03053894001340880021457F0030487600414A6B00564C60006D4C5900
+884B5100A5464E03F3426D2AFF1E6D2CFF1D6C2CFF1D6C2DFF1D6C2DFF1D6C
+2DFF1D6C2DFF1D6C2DFF1D6C2DFF1D6C2DFF1D952800009629000096290000
+972A0000972B0000972B0000992C00009D2E0000A3300000A9310000AD2D00
+06B0240015AA1700258F0E003A72030450630012575900215A4F00305C4500
+435E3E005D5F3800765C340096573506FE513F17FF3E3A14FF423611FF4532
+0EFF48320EFF49320EFF49320EFF49320EFF49320EFF49320EFF49972A0000
+972B0000972C0000982D0000982D0000982E00009A2F00009F320000A63500
+00AD360000B1340004A92D0013982600217F1E00355D11004E3E0102673000
+1069260020691E00316B1800466B16005D6916007A671200B7640E02FF5F0C
+03FF5F0B03FF5F0A03FF5F0A03FF5F0A03FF5F0A03FF5F0A03FF5F0A03FF5F
+0A03FF5F982D0000982E0000982F0000992F0000993000009A3100009C3300
+00A2360000A8390000B03B0000A23D0006953900138633001F6E2C00304E22
+00493016005F0E0600740305127600092573000C396F000E526D0012796C00
+15B5640015E75C0016E75C0017E75B0018E75A0018E75A0018E75A0018E75A
+0018E75A0018E75A0018E75A99300000993100009A3200009A3300009B3400
+009B3400009E370000A43B0000A73E00009C4400009144000985420015763E
+00205F39002F453100432827005708190168001B116A002023670023386400
+295B64002D8360002EB757002BF74E002CF64E002DF64D002EF54D002EF54D
+002EF54D002EF54D002EF54D002EF54D002EF54D9B3300009B3400009C3500
+009C3600009D3700009D3800009F3A00009E3F0000954600008B4A0002814A
+000C764A00166848001F5445002C3D41003C2237004F03290160002F125F00
+37235E003D3D5D00415D5A004581540045B34B0043F2420044F3420044F241
+0045F2410045F2410045F2410045F2410045F2410045F2410045F2419D3700
+009D3800009E3A00009E3B00009F3C00009F3C0000984000008E460000854B
+00007C4E00057350000D695200145C53001D4B520028344F00341B47004701
+3E035800461457004F28560056435300585F4F00597D48005AA640005CFC39
+005DFD38005EFD38005FFD37005FFD37005FFD37005FFD37005FFD37005FFD
+37005FFD379F3C00009F3D0000A03E0000A03E0000A03F0000964200008946
+0000804B0000774F00016E5200056756000B5E5B0011535D0019435E00232D
+5D002E1658003F0055054F005E184B00662D47006B4444006D5F3F006F7B3A
+0072A7350074FF2E0075FF2D0075FF2D0076FF2D0076FF2D0076FF2D0076FF
+2D0076FF2D0076FF2D0076FF2DA03F0000A0400000A1410000A14100009444
+0000864800007C4A0000734E00006A530000635800035C5D00065563000C4B
+6700153C6A001F276B002811690037006B084100741A3A007A2C37007E4334
+00825E3100857B2D0088AE2B0086F9260085FF250085FF250086FF250086FF
+240086FF240086FF240086FF240086FF240086FF24A1420000A1430000A144
+000092470000844A0000794B0000704D00006751000060570000595D000054
+6500034E6C00084472001035760019227900220D7A002E007F08330088192D
+008E2B2A0091432800975E27009C8025009CB1240095F21E0093FF1D0094FF
+1D0094FF1C0094FF1C0094FF1C0094FF1C0094FF1C0094FF1C0094FF1CA145
+0000A146000090490000814C0000764D00006D4E0000665000005E55000057
+5C0000536400004D6D0000477600053D7D000B2F8300121E88001B0C8C0025
+00940628009F162400A5272100A7401E00AE5D1E00B7811E00B7A81D00AEE3
+1A00A8FF1800A9FF1700A9FF1700A9FF1700A9FF1700A9FF1700A9FF1700A9
+FF1700A9FF17A14800008F4B00007F4D0000734F00006A500000635200005D
+540000565A0000516200004C6B00004676000040800001378900052C92000A
+1F9A001010A2001901AD021F00BA121B00C5231900CF381700D1581500DC7B
+1400E3A21307F1F61002D3FF1102D4FF1002D4FF1002D4FF1002D4FF1002D4
+FF1002D4FF1002D4FF1002D4FF108D4C00007D4F0000715100006753000060
+5400005A56000055590000506100004A6A0000457500003F800000388B0000
+3196000029A3000021B2000216C100080AD2001000E30B1400F51F1107FF38
+0709FF560108FF6F0006FF890204FFA7050BFFE4000AFFDE0009FFD90109FF
+D80109FFD80109FFD80109FFD80109FFD80109FFD8017B5100006F53000065
+5500005D570000585A0000535C00004F610000496A0000447500003D7F0000
+368900002F930000289F000021AD00001ABD000011CD000406E0000D00F20F
+0E00FE220C02FF360605FF550003FF6C0003FF830002FFA00302FFB70102FF
+B70002FFB70002FFB70002FFB70002FFB70002FFB70002FFB70002FFB7006D
+560000635800005B5A0000565C0000525E00004E61000049650000436F0000
+3D790000368300002E8C00002797000020A3000019B0000012BF00000ACF00
+0501E4040B00F4160900FF280701FF390202FF570000FF6C0001FF800001FF
+9B0100FFB20000FFB20000FFB20000FFB20000FFB20000FFB20000FFB20000
+FFB20000FFB200615800005A5A0000545D0000506000004B62000047650000
+436A00003C740000357D00002E860000269000001F9B000018A6000011B200
+000BC1000103D1000700E60C0600F51C0500FF2C0300FF3B0000FF5A0000FF
+6E0000FF810000FF980000FFAD0000FFB20000FFB20000FFB20000FFB20000
+FFB20000FFB20000FFB20000FFB200585B0000535E00004E61000049640000
+45670000406A00003C6E0000357800002E810000268A00001F940000179E00
+0010A800000AB4000003C1000300D4050300E8120200F5220100FF2F0000FF
+490000FF620000FF6F0000FF820000FF9B0000FFA80000FFB20000FFB20000
+FFB20000FFB20000FFB20000FFB20000FFB20000FFB200515F00004C620000
+47660000426900003E6C00003A6E0000357200002D7B0000268400001F8D00
+001797000010A0000009A9000002B4000300C2030100D70A0000E8150000F5
+230000FF2F0000FF480000FF600000FF6E0000FF800000FF960000FFA30000
+FFB20000FFB20000FFB20000FFB20000FFB20000FFB20000FFB20000FFB200
+4A630000456700003F6B00003B6E000036700000327200002D760000267E00
+001F87000017900000109800000BA0000006A9000101B4000300C2020100D6
+090000E8150000F5220000FF2F0000FF450000FF5E0000FF6D0000FF7D0000
+FF900000FF9F0000FFAE0000FFB20000FFB20000FFB20000FFB20000FFB200
+00FFB20000FFB200426900003D6C0000386F0000337200002F7400002B7600
+00267900001F8100001989000015900000109800000BA0000006A9000101B4
+000300C1020100D5090000E7140000F4210000FF2E0000FF420000FF5C0000
+FF6C0000FF7A0000FF8B0000FF9D0000FFA80000FFB20000FFB20000FFB200
+00FFB20000FFB20000FFB20000FFB200>
+<8D1400008E1500008E1500008E1600008E1600008F1700008F170000911600
+0092130000920D00098B0201188D000B198F00171893002417970033169B00
+47169B005D159C0071159D0087139E00A1119D00C00D9A00E2099805FF0097
+04FF009705FF009705FF009705FF009705FF009705FF009705FF009705FF00
+9705FF009705FF008E1500008E1500008E1600008F1600008F1700008F1700
+008F1800009116000092140000920E00098D0401178D000A1A900016199300
+2317980032179B0046179C005C169C0070159D0086149F00A0129D00C00E9B
+00E20A9906FF009805FF009805FF009805FF009805FF009805FF009805FF00
+9805FF009805FF009805FF009805FF008E1500008E1600008F1700008F1700
+008F1800008F180000901800009117000093150000931000088E0501178D00
+081B9000151A93002218980031189C0045189D005A179D006F169E008515A0
+009F139E00C00F9C00E30B9907FF009806FF009806FF009806FF009806FF00
+9806FF009806FF009806FF009806FF009806FF009806FF008E1600008F1700
+008F1700008F1800008F180000901900009019000092180000931600009411
+0007900600168D00071D9000141B9400211A990030199C0043199D0059199D
+006E189E008317A0009E149F00BF109D00E30C9A08FF009907FF009907FF00
+9907FF009907FF009907FF009907FF009907FF009907FF009907FF009907FF
+008F1700008F1800008F180000901800009019000090190000901A00009219
+00009417000095120006910800158E00061E9100131C9400201B99002E1A9D
+00421A9E00581A9E006C199F008218A1009D16A000BE119D00E40D9B09FF00
+9A08FF009A08FF009A08FF009A08FF009A08FF009A08FF009A08FF009A08FF
+009A08FF009A08FF008F180000901800009019000090190000901A0000901A
+0000911A0000931A00009518000096140005930A00158E01041F9100111E94
+001E1C99002D1B9D00401C9F00561C9F006B1A9F008019A2009B17A100BD13
+9E00E30F9C0BFF009A09FF009A09FF009A09FF009A09FF009A09FF009A09FF
+009A09FF009A09FF009A09FF009A09FF009019000090190000901A0000901A
+0000911B0000911B0000911B0000931B00009519000097160004950C00138F
+02032091000F2095001D1E9A002B1D9E003E1DA000541DA000691CA0007E1B
+A2009919A200BB159F00E3119D0DFF009B0BFF009B0BFF009B0BFF009B0BFF
+009B0BFF009B0BFF009B0BFF009B0BFF009B0BFF009B0BFF0090190000901A
+0000911B0000911B0000911B0000911C0000921C0000941C0000961A000098
+170003970F00129003012092000D2295001B209A00291E9F003C1FA100521F
+A100671EA0007C1CA300971BA400BA169F00E3129F0FFF009B0CFF009B0DFF
+009B0DFF009B0DFF009C0DFF009C0DFF009C0DFF009C0DFF009C0DFF009C0D
+FF00911A0000911B0000911C0000911C0000921D0000921D0000921D000094
+1D0000971C000098190002991100109205002092000A24950019229A002720
+A0003920A2004F21A200651FA1007A1EA300941CA500B819A000E214A010FF
+009C0EFF009C0EFF009C0EFF009C0EFF009C0EFF009C0EFF009C0EFF009C0E
+FF009C0EFF009C0EFF00911C0000911C0000921D0000921D0000921E000092
+1E0000921F0000951E0000971D0000991B00019B14000E9608001E92000726
+960016249A002523A0003622A3004C23A3006222A2007820A400921EA600B6
+1BA100DF16A212FF019D10FF009E10FF009E10FF009E10FF009E11FF009E11
+FF009E11FF009E11FF009E11FF009E11FF00921D0000921D0000921E000092
+1F0000931F0000932000009320000095200000981F00009A1D00009D17000D
+990C001C92000429960013279A002225A0003324A4004825A5005F24A40076
+22A4008F20A700B31DA000DB199E14FF069A17FF009819FF00971AFF00971A
+FF00961BFF00961BFF00961BFF00961BFF00961BFF00961BFF00921E000093
+1F0000931F0000932000009321000093210000932100009621000098210000
+9B1F00009F1A000A9D10001A9503022896000F2A99001F28A0003027A50045
+27A6005C269E007027950085288F009F288700BE277A00E6238F24FF008E25
+FF008921FF05831BFF0C7E16FF117E16FF117E16FF117E16FF117E16FF117E
+16FF1193200000932000009321000093220000932200009423000094230000
+96230000992200009C210000A11E0008A11400179907002897000B2E9A001C
+2C9F002C2A96003C2E8D004F32830062347900753370008C336800A8326100
+D5315F03FF2C5E04FF2D5C05FF2E5C05FF2E5B06FF2E5B06FF2E5B06FF2E5B
+06FF2E5B06FF2E5B06FF2E9321000093220000942300009423000094240000
+9424000094250000962500009A2500009D240000A2220006A51900159E0C00
+25980106318B0012388000203E77002D416F003C42650050455C0066465600
+7F454F009A414900BE3C6423FF1E6424FF1E6325FF1E6325FF1E6225FF1E62
+25FF1E6225FF1E6225FF1E6225FF1E6225FF1E942300009424000094240000
+94250000942600009526000095270000972700009B2800009F280000A32600
+03A81E00129C150022850C00356B0205485D00114F53001F534A002D554200
+3F573B00575935006F5632008A522F00B74E3D16FF383712FF3D330FFF412F
+0CFF442D0AFF462D0AFF462D0AFF462D0AFF462D0AFF462D0AFF4694250000
+942600009526000095270000952800009628000096290000992A00009D2B00
+00A22C0000A62A00029C2800108D22001E761B0030561000493A01025F2D00
+0F6324001E641C002E6516004265140058631400716113009A600C01FD590A
+02FD5A0902FD5A0802FD5A0702FD5A0702FD5A0702FD5A0702FD5A0702FD5A
+0702FD5A952700009628000096290000962A0000972A0000972B0000972C00
+009A2D00009F2F0000A0320000973600038C3300117E2E001D6728002D491F
+00442D14005A0D05006D0205116F0009236D000B3669000D4E6600116F6600
+149F600015E5560016E4550017E3550018E2540019E2540019E2540019E254
+0019E2540019E2540019E254972A0000972B0000972C0000982D0000982E00
+00982E0000992F00009C3100009A370000933E0000893F00077D3C00136F39
+001E5934002C402E003F2525005307180162001A1164001E22610021355E00
+26545E002B785B002EA252002AEC49002BEC48002CEC47002DEB47002DEB46
+002DEB46002DEB46002DEB46002DEB46002DEB46982D0000982E0000992F00
+00993000009A3100009A3200009B330000953A00008D410000844600017A45
+000B6F4400146142001E4D400029373C00371F34004A0327025A002C125800
+332356003A3957003F57540042764E00439F460041E03C0041EA3B0042EB3A
+0042EB3A0043EB3A0043EB3A0043EB3A0043EB3A0043EB3A0043EB3A9A3100
+009A3200009B3400009B3500009C3600009C360000913D0000884200007F47
+0000764900046D4B000C634C0014564D001C454C00252F4900301842004301
+3A03510042144F004B274E0053404C00545A49005574430056973C0058DB33
+0059F7320059F731005AF831005AF831005AF831005AF831005AF831005AF8
+31005AF8319C3600009D3700009D3800009E3900009D3A00008F4000008443
+00007B470000724B0000694E00056151000A5955000F4E5700183E58002128
+56002B1251003C004F0648005A184400622C3F0066413C00685939006A7436
+006C97310070E42A006FFF29006FFF290070FF280070FF280070FF280070FF
+280070FF280070FF280070FF289E3B00009F3C00009F3D00009D3E00008D43
+000081460000774700006E4A0000664E00005F53000258580005505D000B46
+6100143763001D226300260D6100350065093B006F1B3200742B310078402E
+007C592B007F742900819B270081DD23007FFF21007FFF21007FFF210080FF
+200080FF200080FF200080FF200080FF200080FF20A03F0000A04000009D41
+00008B4600007E490000744A00006B4A0000644E00005C5200005659000050
+600002496600073F6B0010306F00181D7100210871002D00790A2D00821928
+00872A26008A412400905A220094762100959F200091D71C008EFF19008EFF
+19008EFF19008EFF19008EFF19008EFF19008EFF19008EFF19008EFF19A142
+00009C440000894800007B4B0000714C0000684D0000614E00005B52000054
+5800004F5F000049680000427000053876000B297B0012187F001B06830024
+008C092300961720009B271D009D3E1A00A3581A00A8761A00AD9D1900A7CD
+1800A0FF1300A0FF1300A0FF1300A0FF1300A0FF1300A0FF1300A0FF1300A0
+FF1300A0FF139C460000874A0000784D00006D4E0000654F00005E51000059
+520000535700004D5E000048670000427100003B7A0002318200062589000C
+168F00140896001A00A1061B00AD141700B5231500BA371300BD531100C472
+1000CC960F00CBC51200BEFF0E00BEFF0E00BFFF0E00BFFF0E00BFFF0E00BF
+FF0E00BFFF0E00BFFF0E00BFFF0E854D0000764F00006B500000625200005B
+53000056560000525800004C5E000047670000417100003A7B000033840000
+2B8E00002399000219A400060DAE000D01BB021300CC0F1000D91F0D00E732
+0C00ED4C0900F06A0702F6880402FCAC060AFAFF0008F3FF0108F3FF0108F3
+FF0108F3FF0108F3FF0108F3FF0108F3FF0108F3FF01745100006853000060
+55000059570000545A00004F5D00004B6000004667000040710000397C0000
+328600002A900000239C00001CA9000015B600000EC6000204D8000900EC0C
+0A00FB1F0800FF300502FF4D0000FF630000FF780001FF940000FFB00000FF
+B20000FFB20000FFB20000FFB20000FFB20000FFB20000FFB20000FFB20066
+5500005D580000565B0000525E00004D61000049640000456700003F6E0000
+39780000318100002A8A0000229500001BA0000014AB00000EB8000007C700
+0300DA040700EE140500FB250400FF340000FF4F0000FF660000FF7A0000FF
+930000FFAB0000FFB20000FFB20000FFB20000FFB20000FFB20000FFB20000
+FFB20000FFB2005B5A0000555C0000506000004B6300004666000042690000
+3E6C000038730000317C000029850000228E00001A98000013A200000DAD00
+0006B9000200C7010400DF0C0200EE1A0100FC290000FF380000FF570000FF
+6B0000FF7B0000FF930000FFA50000FFB20000FFB20000FFB20000FFB20000
+FFB20000FFB20000FFB20000FFB200535D00004E6100004964000044680000
+3F6B00003B6E00003770000031760000297F0000228800001A910000139A00
+000CA3000004AD000200B9010300CA040000DF0E0000ED1B0000FB290000FF
+350000FF550000FF6A0000FF790000FF8E0000FFA00000FFB20000FFB20000
+FFB20000FFB20000FFB20000FFB20000FFB20000FFB2004C62000046660000
+416A00003C6D000038700000337200002F74000029790000228200001A8B00
+00139400000E9B000009A4000004AD000200B9010300C9040100DF0E0000ED
+1B0000FA280000FF340000FF530000FF690000FF760000FF890000FF9E0000
+FFAF0000FFB20000FFB20000FFB20000FFB20000FFB20000FFB20000FFB200
+446700003F6B0000396E000034710000307300002B75000027770000227C00
+001C840000188C0000139300000E9B00000AA3000004AD000200B8010300C8
+040100DE0D0000EC1A0000FA270000FF330000FF510000FF660000FF730000
+FF860000FF9C0000FFA90000FFB20000FFB20000FFB20000FFB20000FFB200
+00FFB20000FFB2003C6D000037700000317300002C75000028770000247800
+0023780000217C00001C840000188B0000139300000E9B00000AA3000004AC
+000200B8010300C7040100DD0D0000EB190000F9260000FF320000FF4F0000
+FF640000FF710000FF820000FF990000FFA30000FFB20000FFB20000FFB200
+00FFB20000FFB20000FFB20000FFB200>
+<8A0F00008A0F00008A1000008B1000008B1100008B1100008C1100008C1100
+008D0F00008C0900068701021289000C118A0017108C0022109000300E9400
+430D9600580D96006C0C9800820B980098099700B0069500CC039501F60093
+01FF009301FF009301FF009301FF009301FF009301FF009301FF009301FF00
+9301FF009301FF008A0F00008B1000008B1000008B1100008C1100008C1200
+008C1200008D1200008E1000008D0A00058802021289000B128B0016118D00
+211091002F0F9500420F9600570E97006C0D9800810C9900970A9800B00796
+00CC049501F5009401FF009401FF009401FF009401FF009401FF009401FF00
+9401FF009401FF009401FF009401FF008B1000008B1100008B1100008C1200
+008C1200008C1200008D1300008D1300008E1000008D0C0005890301128900
+0A148B0015128D00211191002E10950041109700560F97006A0E9900800D9A
+00970B9900B0099700CC059601F4029401FF009401FF009401FF009401FF00
+9401FF009401FF009401FF009401FF009401FF009401FF008B1100008C1100
+008C1200008C1200008D1300008D1300008D1400008E1400008F1100008E0D
+00048A0401128A0009158C0014148E00201392002D11960040119800551098
+0069109A007F0F9B00960D9A00B00A9800CC069601F4039501FF009501FF00
+9501FF009501FF009501FF009501FF009501FF009501FF009501FF009501FF
+008C1200008C1200008D1300008D1300008D1400008D1400008D1500008E15
+0000901200008F0F00038C0500118A0007168D0013158F001F1493002C1397
+003E1299005412990068119A007D109C00950E9B00B00B9900CD079700F304
+9502FF009502FF009502FF009502FF009602FF009602FF009602FF009602FF
+009602FF009602FF008C1200008D1300008D1400008D1400008E1500008E15
+00008E1500008F15000090130000901000028D0700118A0006188D00111690
+001E1594002B1498003D149A0052149A0067139B007C129D0093109C00AF0D
+9A00CD099800F4069603FF009603FF009603FF009603FF009603FF009603FF
+009603FF009603FF009603FF009603FF008D1300008D1400008E1500008E15
+00008E1600008E1600008F1600008F17000091150000921200018F0900108B
+0004198E00101890001C179400291598003B159B0050159B0065149C007A14
+9D0092129E00AE0F9C00CD0B9900F5079704FF009704FF009704FF009704FF
+009704FF009704FF009704FF009704FF009704FF009704FF008E1500008E15
+00008E1600008E1600008F1700008F1700008F180000901800009216000093
+130000910B000E8B00021B8E000E1A91001A1995002817990039179C004E17
+9C0063169D0078159E0090149F00AD119D00CD0C9A00F5099805FF009805FF
+009805FF009805FF009805FF009805FF009805FF009805FF009805FF009805
+FF008E1600008E1600008F1700008F1700008F180000901800009019000090
+1900009317000094150000930E000C8C02011C8F000C1C9100191B95002619
+9A0037199D004C199D0061189E0076179F008D16A000AB139E00CD0E9B00F6
+0B9907FF009907FF009907FF009907FF009907FF009907FF009907FF009907
+FF009907FF009907FF008F1700008F1800008F180000901900009019000090
+190000901A0000911A000093190000951700009510000B8F04001B8F00091E
+9200171D9600241B9B00341B9E00491B9F005F1A9F007319A0008B18A200A9
+15A000CC119D04F5099A09FF009A09FF009A09FF009A09FF009A09FF00990A
+FF00990AFF00990AFF00990AFF00990AFF0090180000901900009019000090
+1A0000911A0000911B0000911B0000921B0000941A00009619000097130009
+930800198F0006219300141F9600221E9C00311D9F00461DA0005C1DA00071
+1BA100881AA200A6189B00C7169000ED149213FF009114FF009015FF008F16
+FF008F17FF008E17FF008E17FF008E17FF008E17FF008E17FF00901A000091
+1A0000911B0000911B0000911C0000921C0000921D0000921D0000951C0000
+971A000099160007960C0016910204229300102296001F209C002E1FA00042
+209F00582095006A228D007D23890094248500B1237700D020881FFF008720
+FF018620FF018521FF018521FF018521FF018521FF018521FF018521FF0185
+21FF01911B0000911C0000921C0000921D0000921D0000921E0000921E0000
+931F0000951E0000981D00009B1900059A1000149304012394000D2597001C
+24960029248E00382986004A2C7B005C2C72006E2D6C00842D65009D2D5E00
+C22C5A01FE285801FE295701FE2A5602FE2B5503FE2B5503FE2A5503FE2A55
+03FE2A5503FE2A5503FE2A921D0000921D0000921E0000921F0000931F0000
+93200000932000009420000096200000991F00009C1C00039E150011970800
+228F00072B8300123179001E3670002A396700383B5F004A3D57005F3E5200
+773E4D00903C4800AF375011FF294F11FF2A4E12FF2A4D12FF2A4C12FF2A4C
+13FF2A4C13FF2A4C13FF2A4C13FF2A4C13FF2A921F0000931F000093200000
+9321000093210000932200009322000094220000972200009A2100009D2000
+01A119000E9212001E7A0A003064020541580010474E001D4B46002B4E3E00
+3B5037005152320068502F00814D2C00A249350EFD39320EFF3A2E0BFF3E2B
+09FF412807FF432706FF442706FF442706FF442706FF442706FF4493210000
+93210000932200009422000094230000942400009424000094240000972400
+009B2400009A2400019223000D841F001B6E18002C510E0043360102582A00
+0E5C22001D5D1A002C5F14003F5F1100535D11006A5C11008A5A0A00EA5608
+00FA540600FB550500FB550400FB560300FC560300FC560300FC560300FC56
+0300FC56942300009423000094240000942500009425000094260000952600
+009527000099270000942B00008D2F0002842E000F762A001A6025002B451D
+00402A1300550C0500660205106900092267000B3463000D4A600010685F00
+148F5B0015CC520015E14F0017E04E0017E04E0018DF4D0018DF4D0018DF4D
+0018DF4D0018DF4D0018DF4D94250000942600009527000095270000962800
+009629000096290000972A00009030000089370000813A0006763700116834
+001D5230002A3B2A003A2322004E0616015D0018105D001D215A0020345800
+244E5700297054002C924D002BC744002AE642002BE741002CE740002CE740
+002CE740002CE740002CE740002CE740002CE7409628000096290000962A00
+00972B0000972B0000972C0000962E00008C330000853B00007E410000743F
+000A693E00145B3D001D473B0026313800311C30004502250254002A125100
+31234F0038374F003C524E003F6E4800409040003FC138003FE935003FE934
+0040E9340040E9330041E9330041E9330041E9330041E9330041E933972C00
+00982D0000982E0000982E0000992F0000953200008B380000823E00007942
+0000704400046745000C5D4600135047001A3F4700212A44002B153D003E01
+37044B003E15470048274600503D430051554100526E3D00538C370053BB2F
+0054F12C0055F22B0055F22B0056F22B0056F32B0056F32B0056F32B0056F3
+2B0056F32B99300000993100009A3200009B33000095370000893D00007F41
+0000754300006D460000654900045D4C0009544F000E485100153852001E25
+5000270F4B0038004A07410055183D005E2B3800623E350064553100656D30
+00678B2D0069BB270069FF25006AFF25006AFF24006AFF24006AFF24006AFF
+24006AFF24006AFF24006AFF249B3500009C3600009D370000953C00008741
+00007C440000724500006A460000624A00005B4E0001545300044C58000941
+5B0012325C001A1E5C002309590032005F0A3400691B2D006F2A2C00733E29
+00775626007A6E25007B8C23007CBF1F0079FD1D0079FD1D007AFD1D007AFD
+1C007AFE1C007AFE1C007AFE1C007AFE1C007AFE1C9E3A00009F3C00009440
+000085440000784600006E48000066490000604A0000594E0000525400004C
+5B0000456100063A65000E2A6800161869001F0469002B00720C28007B1A23
+0080292200833F1F0089561E008D6F1D008E901C008DC01A0088FF150089FF
+150089FF150089FF150089FF140089FF140089FF140089FF140089FF14A03F
+00009443000082470000754900006B4A0000634B00005D4C0000584E000051
+5400004B5B0000456300003D6A0004326F000A247300121276001B017A0023
+00850B1F008E181B0093271900953C16009A5315009E6E1500A3911500A1BB
+150099FA0F0099FF0F0099FF0F009AFF0E009AFF0E009AFF0E009AFF0E009A
+FF0E009AFF0E93460000804A0000724B0000684C0000604E00005A50000054
+510000505300004A5B0000446300003D6B0000367400012B7A00071E80000D
+0E840015038C01190097091700A2161300A8241000AB360E00AD4E0C00B26A
+0C00BA8B0B00BCB20D00B1EA0A00AEFA0900AEFA0900AEFA0900AEFA0900AE
+FA0900AEFA0900AEFA0900AEFA097E4C0000704D0000654F00005D51000057
+530000525500004D580000495B0000436300003C6C0000357500002E7E0000
+258600021C8F00050F97000C04A0001100AD070F00BA120B00C4200900CA31
+0700CA480400D3640300DA830300DEA10302EAF10102D3F90202D4F90102D4
+F90102D4F80102D4F80102D4F80102D4F80102D4F8016D500000635200005A
+540000545700004F5A00004A5D000046600000426300003C6D000035770000
+2D800000268A00001E94000017A0000010AB000107B9000501C9020800DF0D
+0500EF1D0400FC2D0100FF3F0000FF5E0000FF730000FF8B0000FFA70000FF
+B20000FFB20000FFB20000FFB20000FFB20000FFB20000FFB20000FFB20060
+55000058580000525B00004D5F000048630000436700003F6B00003C6D0000
+357700002D800000258900001E930000169C00000FA7000009B2000002BF00
+0300D2050200E7130100F5220000FF300000FF4C0000FF630000FF730000FF
+8A0000FFA10000FFB20000FFB20000FFB20000FFB20000FFB20000FFB20000
+FFB20000FFB200565C0000505F00004B63000046670000416A00003C6D0000
+386F0000347100002D7A0000258300001E8C0000169600000F9E000008A700
+0001B2000400BF020200D3080000E7130000F4220000FF2F0000FF480000FF
+610000FF710000FF860000FF9E0000FFB20000FFB20000FFB20000FFB20000
+FFB20000FFB20000FFB20000FFB2004F60000049640000436800003E6C0000
+396F000034710000307300002C750000257D00001E860000168F0000119700
+000C9E000007A7000101B2000400BF020200D2070000E6130000F3210000FF
+2E0000FF450000FF5F0000FF6F0000FF830000FF9C0000FFB00000FFB20000
+FFB20000FFB20000FFB20000FFB20000FFB20000FFB20047660000416A0000
+3B6D000036700000317300002C75000028770000257800001F7F00001B8700
+00168E0000119600000C9E000007A7000001B1000300BE020200D1070000E5
+120000F2200000FF2D0000FF420000FF5D0000FF6E0000FF800000FF9A0000
+FFA90000FFB20000FFB20000FFB20000FFB20000FFB20000FFB20000FFB200
+3E6B0000396F0000337200002D750000297600002478000023780000237800
+001F7F00001B870000168E0000119600000C9E000008A6000002B1000300BE
+020200D0060000E4120000F11F0000FE2C0000FF3F0000FF5B0000FF6C0000
+FF7D0000FF930000FFA30000FFB20000FFB20000FFB20000FFB20000FFB200
+00FFB20000FFB20036700000307300002A7600002578000023780000237800
+0023780000237800001F7F00001B870000168E0000119600000D9E000008A6
+000002B0000300BD020200CF060000E3110000F01E0000FD2B0000FF3B0000
+FF590000FF6B0000FF790000FF8D0000FF9E0000FFAF0000FFB20000FFB200
+00FFB20000FFB20000FFB20000FFB200>
+<8409000085090000850A0000860A0000860B0000870B0000870C0000870C00
+00870B0000850600038200040B84000C0A850016098600200989002D088E00
+3E05900052049000670491007C02920090019100A4019000BC009000E2008F
+00FF008F00FF008F00FF008F00FF008F00FF008F00FF008F00FF008F00FF00
+8F00FF008F00FF00850A0000850A0000860B0000860B0000870C0000870C00
+00880C0000880D0000880B0000860700028300030C84000C0B8500150A8700
+200A89002C098F003D06900051059100660592007B0393008F029100A40190
+00BB009000E0008F00FF008F00FF008F00FF008F00FF008F00FF008F00FF00
+8F00FF008F00FF008F00FF008F00FF00850A0000860B0000870B0000870C00
+00880C0000880D0000890D0000890E0000890C0000870800028401020C8500
+0B0C8600140B87001F0B8A002B0A8F003C08910050069200650693007A0593
+008F039200A4029100BB019100DF009000FF009000FF009000FF009000FF00
+9000FF009000FF009000FF009000FF009000FF009000FF00860B0000870C00
+00880C0000880D0000890D0000890E0000890E00008A0E00008A0D00008909
+00018502010D8600090D8700130C88001E0C8B002A0B90003B0992004F0893
+0064079400790695008E059400A3039200BB019200DD009100FF009100FF00
+9100FF009100FF009100FF009100FF009100FF009100FF009100FF009100FF
+00870C0000880D0000880D0000890E0000890E00008A0F00008A0F00008A0F
+00008B0E00008A0B00018602010D8600080F8800120E89001D0D8C00290C90
+003A0B93004E09940063099500780896008D069500A3049300BB029300DC00
+9100FF009100FF009100FF009100FF009100FF009100FF009100FF009100FF
+009100FF009100FF00880D0000890E0000890E00008A0F00008A0F00008A10
+00008B1000008B1000008C0F00008B0C00008703000D870007108900110F8A
+001C0F8D00280D9100380C94004D0B9500620A9600760A97008C089600A305
+9400BB039400DB019200FF009200FF009200FF009200FF009200FF009200FF
+009200FF009200FF009200FF009200FF00890E00008A0F00008A0F00008B10
+00008B1000008B1100008B1100008C1100008D1000008D0E00008905000C87
+000512890010118B001B108E00270F9200370E95004B0D9600600C9700750C
+98008B0A9800A2079600BB059500DC029301FF009301FF009301FF009301FF
+009301FF009301FF009301FF009301FF009301FF009301FF008A0F00008B10
+00008B1000008B1100008C1100008C1200008C1200008D1300008D1200008E
+0F00008C08000A870004148A000E138C0019128E002611930035109600490F
+97005E0E9800730E9900890C9900A10A9800BC069600DC039401FF009401FF
+009401FF009401FF009401FF009401FF009401FF009401FF009401FF009401
+FF008B1000008B1100008C1200008C1200008D1300008D1300008D1400008D
+1400008E1300008F1100008E0A0009880102158B000C158D0018148F002412
+940033129700471198005C11990071109A00870F9B00A00C9900BC089700DD
+059501FF009501FF009501FF009501FF009501FF009501FF009501FF009501
+FF009501FF009501FF008C1200008C1200008D1300008D1400008D1400008E
+1500008E1500008E1500008F15000090120000900D00078B0301158B000A17
+8E0016169100221495003113990045139A005A139A006F129C0085119D009F
+0E9B00BC0B9900DD079603FF009503FF009404FF009204FF009205FF009106
+FF009106FF009106FF009106FF009106FF008D1300008D1400008D1400008E
+1500008E1600008E1600008F1600008F170000901600009214000092100005
+8D0500148C0008198F0014189100201796002F169A0042169B0058159B006C
+149C00821499009A159300B5138B00D5118B0DFF028A10FF008911FF008811
+FF008712FF008612FF018612FF018612FF018612FF018612FF018E1500008E
+1600008E1600008F1700008F1700008F1800008F1800009018000091180000
+9316000094130003910900138D01051C8F00111B92001E1997002C189B003F
+189600531C8D00641D8500751E81008A1F7F00A41F7400C01C6C00F5177B15
+FF097915FF0A7815FF0B7715FF0B7615FF0C7615FF0C7615FF0C7615FF0C76
+15FF0C8F1700008F1700008F180000901800009019000090190000901A0000
+901A0000921A00009418000095150002940D00108D01011E90000E1E93001B
+1C8D00261E850034237D004526730056256C00682667007C28610094285B00
+B3275600E9255300FA255200F9265101FA265001FA265002FA275002FA2750
+02FA275002FA275002FA27901800009019000090190000901A0000911A0000
+911B0000911B0000911C0000931C0000951A0000971800019711000E910500
+1E860007257C00112A72001C2E680027316000333459004336520059374E00
+6F384B0088364600A7324200EB32470BFF29470CFF29460DFF29460EFF2946
+0EFF28460FFF28460FFF28460FFF28460FFF28901A0000911B0000911B0000
+911C0000921C0000921D0000921D0000921E0000931E0000961D0000981B00
+009716000B8810001B7208002C5E0105395200103F49001B44410028463A00
+384934004C4B2F00624A2D0079482A0095442800D6422E0BFC362A08FB3A27
+06FA3D2404FA3F2203F9412203F9412203F9412203F9412203F941911C0000
+921D0000921D0000921E0000921E0000931F00009320000093200000942000
+00971F0000912000008920000B7B1C0019661600294C0C003C330102502800
+0E5520001C5718002A5912003B590F004F570E0065560F007F550900C35307
+00F24E0500F24F0400F24F0300F2500200F3500200F3500200F3500200F350
+0200F350921E0000931F000093200000932000009321000093210000932200
+0093220000942300008C260000852A00027C29000D6E26001959220028401B
+003A2712004F0B04005F0105106200092161000B325C000D47590010635800
+1384540015B24D0015DC480016DB470017DB470018DA460018DB460018DB46
+0018DB460018DB460018DB4693210000932100009322000094230000942300
+00942400009424000090260000882B0000823100007A3400056F320011602F
+001C4C2C002736270035202000480515015600171057001B2153001E325100
+2249510026674E00298545002AAF3F0029E03C002AE03B002AE13A002BE13A
+002BE13A002BE13A002BE13A002BE13A002BE13A9423000094240000942500
+009425000095260000952700008F2A0000852F00007E350000773B00006D3A
+000A623900145438001C413700232C33002C192C003F0223034D0028134A00
+2E23470035364800394D47003B6742003D8339003CAB33003CE72F003DE72E
+003DE72E003EE72D003EE72D003EE72D003EE72D003EE72D003EE72D952600
+00952700009628000096290000962A00008E2E0000843500007B390000733D
+00006B3F00036240000C574100124A4200183942001D273F00271339003901
+340544003B153F0044263E004C3A3B004D5039004E6736004F8232004FA92C
+0050EA250051EB250051EC250051EC250052ED250052ED250052ED250052ED
+250052ED25972A0000972B0000972C0000982D00008D330000833A0000783D
+0000703F00006842000060440004584700074F4A000C434C0012334C001A21
+4A00240C4500330046083A0051193600592931005D3B2E0060512A0061672A
+006282290064A8240063FF200064FF200064FF200065FF200065FF1F0065FF
+1F0065FF1F0065FF1F0065FF1F982F0000993000009A3100008D380000813E
+0000754100006C420000654400005E460000574A0000504F0002485300063D
+56000E2D5600171A5600200653002E005A0C2E00641B2900692927006D3B24
+00725220007569200075831F0076A81C0074F3190074FE180075FE180075FE
+180075FE180075FE180075FE180075FE180075FE189B3400009C3600008D3E
+00007E4200007244000069450000614600005B480000554B00004F50000048
+560000405C0003355F000C266100141462001D01620128006C0D2300751A1F
+0079281E007D3B1B0082521900876B18008785170088AC160085EB120084FF
+100084FF100085FF100085FF100085FF100085FF100085FF100085FF109E3B
+00008B4100007C4600006F470000664800005E490000584B0000534D00004E
+50000047570000405E0000396400022D6800091F6C00110E6E00190073021F
+007E0D1B00861917008B2715008E391200924F10009568100099850F009CAC
+100096E00C0093FF0A0094FF0A0094FF0A0094FF0A0094FF0A0094FF0A0094
+FF0A0094FF0A8A450000794800006C490000634B00005B4C0000554E000050
+5100004B530000465700003F5E000039660000316D0001267300061878000D
+097C001500840317008F0C120098170F009E240C00A0350900A24A0700A663
+0700AC830500B0A20500A9CF0500A5FA0400A5F90400A5F90400A5F90400A5
+F90400A5F90400A5F90400A5F904764B0000694C0000604E00005850000052
+5200004D55000048580000445B00003F5F0000386700003070000029770000
+1F7F000313850009078C000E0095030F00A20B0A00AD150700B4210400B631
+0100B7450000C1600000C67F0000CA990000C8C60000BDF00000BDF10000BE
+F10000BEF10000BEF10000BEF10000BEF10000BEF100674F00005D51000056
+530000505700004A5A0000455D0000416100003D6400003869000030710000
+297A000021830000198C000011950002069C000700A8020700B8080300C911
+0100D51F0000E52D0000FC3F0000F55B0000F7710000F88A0000FBA90000F2
+DB0000F3D90000F4D70000F4D50000F4D50000F4D50000F4D50000F4D5005B
+540000535800004D5C000048600000436400003E680000396B0000356E0000
+30730000297D0000218700001A900000129900000BA2000005AB000200B701
+0300C7040100DD0D0000EC1A0000FA280000FF350000FF570000FF6C0000FF
+7F0000FF9C0000FFB20000FFB20000FFB20000FFB20000FFB20000FFB20000
+FFB20000FFB200515D00004B62000045670000406A00003B6E000036700000
+327300002D74000028780000218100001A8A0000149200000F9900000AA200
+0005AB000200B7000300C6040100DD0C0000EB190000FA270000FF340000FF
+550000FF6B0000FF7C0000FF990000FFAE0000FFB20000FFB20000FFB20000
+FFB20000FFB20000FFB20000FFB20049640000436800003D6C0000386F0000
+337200002E7400002976000026780000227B00001D820000198A0000149100
+000F9900000BA1000005AB000100B6000300C5030100DB0C0000EB180000F9
+260000FF330000FF530000FF690000FF790000FF920000FFA70000FFB20000
+FFB20000FFB20000FFB20000FFB20000FFB20000FFB200416A00003B6E0000
+357100002F7400002A760000257800002378000023780000227B00001D8200
+0019890000149100000F9900000BA1000005AA000101B6000300C4030100DA
+0B0000EA180000F8260000FF320000FF510000FF670000FF760000FF8C0000
+FFA10000FFB20000FFB20000FFB20000FFB20000FFB20000FFB20000FFB200
+386F0000327200002C75000026770000237800002378000023780000237800
+00227A00001E8200001989000015910000109900000BA1000005AA000101B5
+000300C4030100D90B0000E9170000F7250000FF310000FF4F0000FF650000
+FF730000FF870000FF9E0000FFB20000FFB20000FFB20000FFB20000FFB200
+00FFB20000FFB2002F74000028760000237800002378000023780000237800
+002378000023780000227A00001E8200001989000015910000109900000BA1
+000006AA000101B5000300C3030100D80A0000E9160000F6240000FF300000
+FF4C0000FF620000FF700000FF830000FF9B0000FFAA0000FFB20000FFB200
+00FFB20000FFB20000FFB20000FFB200>
+<7A0400007B0400007C0400007C0500007D0500007E0600007F0600007F0600
+00800700007D0400007C0005047E000C037F00150380001E03810029028600
+390089004C008A0061008B0075008C0088008B009B008A00B0008A00D0008A
+00FF008900FF008900FF008A00FF008A00FF008A00FF008A00FF008A00FF00
+8A00FF008A00FF007B0400007C0500007D0500007E0600007F0600007F0600
+008007000081070000810800007E0400007D0004057F000C04800014048100
+1D0382002902870038008A004B008B0060008C0074008D0088008C009A008B
+00B0008B00CF008B00FF008A00FF008A00FF008A00FF008A00FF008A00FF00
+8A00FF008A00FF008A00FF008A00FF007C0500007D0500007E0600007F0600
+008007000081070000810800008208000083080000800500007D0003068000
+0B058100130481001D0483002803880037018B004A018C005F018D0073018E
+0087008D009A008C00AF008C00CE008C00FF008B00FF008B00FF008B00FF00
+8B00FF008B00FF008B00FF008B00FF008B00FF008B00FF007E0600007F0600
+00800700008107000082080000820800008308000084090000840900008206
+00007E00020781000A068200120682001C0584002704880036028C0049028D
+005E018E0072018F0086008E0099008D00AF008D00CE008D00FF008C00FF00
+8C00FF008C00FF008C00FF008C00FF008C00FF008C00FF008C00FF008C00FF
+0080070000810700008208000082080000830900008409000084090000850A
+0000850A0000830700007F000108810009088200120783001B068500260689
+0035048D0048028E005D028F007101900086008F0099008E00AE008E00CD00
+8E00FF008D00FF008D00FF008D00FF008D00FF008D00FF008D00FF008D00FF
+008D00FF008D00FF0082080000830800008309000084090000850A0000850A
+0000860A0000860B0000860B00008508000081010009820008098300110884
+001A08860025078A0034058E0046038F005C03900070029100850090009800
+8F00AE008F00CC008F00FF008E00FF008E00FF008E00FF008E00FF008E00FF
+008E00FF008E00FF008E00FF008E00FF008409000084090000850A0000850A
+0000860B0000860B0000870C0000870C0000880C0000870A00008303000883
+00060B84000F0A85001909870024098B0033078F00450590005A0491006F03
+92008402920098019000AD019000CA009000FF008F00FF008F00FF008F00FF
+008F00FF008F00FF008F00FF008F00FF008F00FF008F00FF00850A0000860A
+0000860B0000870C0000870C0000880C0000880D0000890D0000890E000089
+0B0000860500078400050D85000E0C8600180B8800230A8C00310990004307
+9100590692006D0693008204930097039200AD029100C9009100FE009000FF
+009000FF009000FF009000FF009000FF009000FF009000FF009000FF009000
+FF00860B0000870C0000880C0000880D0000890D0000890E0000890E00008A
+0F00008A0F00008A0D0000880700058500030E86000C0E8800170D8900220C
+8D002F0B910042099300570893006C0895008106950096059300AD039200C8
+019300FA009100FF009100FF009100FF009100FF009100FF009100FF009100
+FF009100FF009100FF00880D0000890D0000890E00008A0E00008A0F00008A
+0F00008A1000008B1000008B1000008C0E00008A0A00048702020F87000A10
+8900150F8B00200E8E002E0D9200400C9400550B95006A0A96007F09970095
+079500AC059400C8019100F4008D00FF008B01FF008A02FF008902FF008903
+FF008803FF008803FF008803FF008803FF00890E00008A0F00008A0F00008B
+1000008B1000008B1100008C1100008C1200008C1200008D1000008D0C0003
+89030110880008128A0013118C001E108F002C0F94003D0E9600530D960067
+0D93007A0E8E008E108A00A50F8400C00D7E00E70A810AFF00800BFF017F0B
+FF027E0BFF027D0BFF037C0BFF037C0BFF037C0BFF037C0BFF038B1000008B
+1000008B1100008C1200008C1200008C1300008D1300008D1300008D140000
+8F1200008F0F00018B06000F890006158B0011148D001D139100291293003A
+128C004C1684005E187D006E197900821A7600981A6F00B2186800DC146B07
+FF0F6704FE116403FE126201FE136100FE146000FE146000FE146000FE1460
+00FE148C1200008C1200008D1300008D1300008D1400008D1400008E150000
+8E1500008E16000090140000901100008F0A000C890003188D000E178C0019
+178400231A7C002F1D74003F206C004F2065006120610075225D008B235700
+A7235300D1215000F6204E00F5214D00F6224C00F6234B00F6234B00F6234B
+00F6234B00F6234B00F6238D1300008D1400008E1500008E1500008E160000
+8E1600008F1700008F1700008F1800009116000092140000920E000A8C0301
+187E000720740010246A001A286100232B59002D2D52003D2F4D0052314900
+68314700803144009E2E3F00C82D3F04FE2A3E05FE2A3D06FE2A3D06FE2A3D
+07FE2A3C07FE2A3C07FE2A3C07FE2A3C07FE2A8E1600008E1600008F170000
+8F1700008F180000901800009019000090190000901A000092190000941700
+008E1400087F0E001769060027580105324D000F384300193C3B00253F3600
+34412F0047432B005C432900714127008B3F2400B43C2907F6342505F43722
+03F1392002F03B1E01EF3C1D00EE3E1D00EE3E1D00EE3E1D00EE3E8F180000
+901800009019000090190000901A0000911A0000911B0000911B0000911C00
+00931B00008A1D0000811D0009731900165E130025470B0036300102472500
+0D4D1D001A5016002852100038530C004A510B005F4F0B00774F0800AA5106
+00E8470400E7480300E6480200E6480201E5480202E4480202E4480202E448
+0202E448901A0000911A0000911B0000911C0000911C0000921D0000921D00
+00921E00008D1F0000852300007E2600017426000B66230018521F00243C18
+0035251000490A04005801050F5B0009205A000B3055000D435200105D5000
+137B4D0015A0460014D9410016D8400016D83F0017D93F0018D93E0018D93E
+0018D93E0018D93E0018D93E921C0000921D0000921E0000921E0000921F00
+00931F0000932000008B230000822700007B2C0000732F0004682D0010592B
+001A46280023322400301D1D00420413014F0016104F001A214C001D314A00
+2045490024604700277B3E00299F390028E1360028E2350029E2340029E234
+002AE233002AE233002AE233002AE233002AE233931F000093200000932000
+00932100009322000093220000882600007F2C000078300000703500006735
+00095C3400144E34001A3C32001F292F002817290039012103460026134200
+2B233F00313440003649400037603B00397A3300399C2E0039DE29003AE729
+003BE628003BE628003BE627003CE527003CE527003CE527003CE527932200
+0094230000942300009424000094250000872B00007E310000753500006D38
+0000653B00025C3B000B523C0011453D0015353D001A233A00231034003300
+30063D00381638004026360047383300494B30004A612E004B7A2C004B9B28
+004CD020004DE31F004DE51F004EE51F004EE61F004EE71E004EE71E004EE7
+1E004EE71E94250000942600009527000093280000862F00007C360000723A
+00006A3C0000633D00005B400002534300064B4600093F48000F2F4700161D
+4500200A40002F00430933004C192F0053282B00583828005C4D23005D6223
+005E7A24005E9922005FD71B0260FF190260FF190261FF190161FF190161FF
+190161FF190161FF190161FF1996290000972A0000932D0000853500007A3B
+00006F3E0000663F00005F4100005A420000534600004C4B0000444F000238
+51000B285100131750001E044D012A00550D29005E1A240063282300673820
+006C4D1B0070641B00707C1A007099180070D1140070FC130070FC130070FC
+130071FC130071FC120071FC120071FC120071FC12982E000094320000853B
+0000773F00006C410000634300005C44000056460000514700004B4C000044
+5200003C57000030590009215B0011105B001B005C022400660E1E006E1A1B
+0073271A00773817007C4D140081661300827D1200829C110081CE0E0080FF
+0C0080FF0B0080FF0B0081FF0B0081FF0B0081FF0B0081FF0B0081FF0B9537
+0000833F000074430000694400006046000059470000534900004E4B00004A
+4E0000435300003C590000345F0000286200071A65000F0A670018006C051B
+00770F16007F1A13008527100087360D008A4A0B008E620A00917B0900969C
+0A0092C907008FFF05008FFF040090FF040090FF040090FF040090FF040090
+FF040090FF048243000072460000664700005D490000564B0000504D00004B
+50000046520000425500003B5A0000336100002C670000216C00061370000D
+04740014007D061300880F0E0090190A009625070098330400994601009C5E
+0100A17A0100A7980000A3BE01009EFC01009EFC01009EFC00009EFC00009E
+FC00009EFC00009EFC00009EFC0070490000634A00005A4C0000534F00004D
+51000048550000435800003E5A00003A5D0000336300002B6A000024710000
+1A7700040D7C000A0183000F008D070B00980E0500A2170200A8230000AA31
+0000AB430000B15B0000B7780000BC930000BAB60000AEF50000AEF70000AE
+F70000AEF70000AEF70000AEF70000AEF70000AEF700614D00005850000051
+5300004A560000455A0000405D00003B60000036630000326600002B6C0000
+247400001C7C000013840002088B000600920109009B050500A80A0200B411
+0000BF1B0000C6280000CA3A0000D3520000D86C0000DC870000E0A40000DA
+F30000D1F60000D1F70000D2F70000D2F70000D2F70000D2F70000D2F70055
+5400004E580000485C0000426000003D64000038680000336B00002E6E0000
+2B700000247700001D80000017880000129100000D99000007A1000101AC00
+0400BB030200CE070000E3120000F2200000FF2E0000FF480000FF630000FF
+740000FF8F0000FFAA0000FFB20000FFB20000FFB20000FFB20000FFB20000
+FFB20000FFB2004C5D000046620000406700003A6C0000357000002F740000
+2B7600002777000023780000207D00001C850000178D0000129500000D9C00
+0009A5000003AF000300BC010200CE050000E3110000F11F0000FF2D0000FF
+440000FF600000FF710000FF8A0000FFA40000FFB20000FFB20000FFB20000
+FFB20000FFB20000FFB20000FFB200446800003D6C00003770000031730000
+2C75000027770000237800002378000023780000207D00001C850000178C00
+00129400000D9C000009A5000003AF000300BB010300CD050000E2100000F0
+1E0000FE2C0000FF410000FF5E0000FF6F0000FF860000FF9F0000FFB20000
+FFB20000FFB20000FFB20000FFB20000FFB20000FFB2003B6E000034710000
+2E740000287700002378000023780000237800002378000023780000207D00
+001C850000178C0000139400000E9C000009A4000003AE000300BB010300CC
+050000E1100000EF1D0000FD2B0000FF3D0000FF5C0000FF6E0000FF820000
+FF9C0000FFB20000FFB20000FFB20000FFB20000FFB20000FFB20000FFB200
+317300002A7600002578000023780000237800002378000023780000237800
+0023780000207D00001C850000178C0000139400000E9C000009A4000003AE
+000200BA010300CB050000E00F0000EE1C0000FC2A0000FF3A0000FF590000
+FF6C0000FF7E0000FF9A0000FFAC0000FFB20000FFB20000FFB20000FFB200
+00FFB20000FFB2002777000023780000237800002378000023780000237800
+00237800002378000023780000207D00001C840000188C0000139400000E9B
+000009A4000003AD000200B9010300CA040000DF0E0000ED1C0000FB290000
+FF360000FF560000FF6B0000FF7A0000FF920000FFA40000FFB20000FFB200
+00FFB20000FFB20000FFB20000FFB200>
+<72000000720000007300000073000000740100007501000075010000760200
+0076020000760100007600050177000C007800140079001C007A0026007D00
+3400820045008200590083006C0085007F00850091008400A4008400BD0084
+00F1008300FF008300FF008300FF008300FF008300FF008300FF008300FF00
+8300FF008300FF007300000073000000740100007501000075010000760200
+00770200007702000078020000770200007700040178000B00790013007A00
+1B007B0026007E003300830045008300580084006C0086007F008600910085
+00A4008500BD008500F0008400FF008400FF008400FF008400FF008400FF00
+8400FF008400FF008400FF008400FF00740000007401000075010000760200
+00770200007702000078030000780300007903000078020000780004017A00
+0B007A0012007B001B007C0025007F003200840044008500580086006B0087
+007F00870091008600A4008600BD008600ED008500FF008500FF008500FF00
+8500FF008500FF008500FF008500FF008500FF008500FF0075010000760200
+0077020000770200007803000079030000790300007A0400007A0400007A03
+0000790003027B000A017C0012007C001A017D002401800031008500430086
+00570087006A0088007E00880091008700A4008700BD008800ED008600FF00
+8600FF008600FF008600FF008600FF008600FF008600FF008600FF008600FF
+00770200007702000078030000790300007A0400007A0400007B0400007C04
+00007C0500007C040000790002037C0009027D0011017D0019017E00230181
+003000860041008700560088006A0089007E00890090008800A4008800BC00
+8900EC008700FF008700FF008700FF008700FF008700FF008800FF008800FF
+008800FF008800FF0078030000790300007A0400007B0400007B0400007C05
+00007D0500007D0600007E0600007E0500007A0001047C0008037E0010027E
+0018027F00220282002F018700400089005500890069008B007D008B009000
+8A00A3008900BC008A00EB008900FF008900FF008900FF008900FF008900FF
+008900FF008900FF008900FF008900FF007A0400007B0400007C0500007D05
+00007D0600007E0600007F0600008007000080070000800600007C0201047D
+0007057F000F04800018038100210383002E0188003F008A0053008B006800
+8C007C008C008F008B00A3008A00BC008B00E9008A00FF008A00FF008A00FF
+008A00FF008A00FF008A00FF008A00FF008A00FF008A00FF007C0500007D05
+00007E0600007F060000800700008107000081080000820800008308000082
+0800007F0300037E00060680000E05810017058200200485002D038A003D01
+8C0052018C0067018D007B008E008F008D00A2008C00BB008D00E7008B00FF
+008B00FF008B00FF008B00FF008B00FF008B00FF008B00FF008B00FF008B00
+FF007E0600007F070000800700008108000082080000830800008409000084
+090000850A000085090000810500017F00040882000C078200150683001F06
+86002B058B003C038D0050028E0065028F007A008F008E008E00A2008D00BA
+008E00E3008D00FF008D00FF008D00FF008D00FF008D00FF008D00FF008D00
+FF008D00FF008D00FF00810700008208000083080000840900008509000085
+0A0000850A0000860B0000860B0000870B0000840700018101020A83000B09
+8400140885001E0887002A078C003A058F004E038F0063039000780191008D
+009000A1008B00B6008800DC008500FF008300FF008200FF008100FF008000
+FF007F00FF007F00FF007F00FF007F00FF008409000085090000850A000086
+0B0000860B0000870C0000870C0000880C0000880D0000890C000087090001
+8301010B8400090B8500120B86001D0A890028098D00380790004C058F0060
+06890072098500840B8100970B7B00AE097700CD077906FF007706FF027606
+FF027506FF037406FF037306FF047306FF047306FF047306FF04860B000086
+0B0000870C0000880C0000880D0000890D0000890E0000890E00008A0F0000
+8A0E00008A0B00008603000B8500060E8700100D88001B0C8A00260B880034
+0D820044107B0056127500671471007A156D008E156800A6146400C8116200
+FE0E6000FE0F5F00FD0F5E00FD105D00FD105C00FC105C00FC105C00FC105C
+00FC10880C0000880D0000890E0000890E00008A0F00008A0F00008A100000
+8B1000008B1000008C1000008C0E0000890700088600041188000E10830017
+127A00201572002B186B00371A6400471B5E005A1C5A006E1E5700841E5300
+9D1E4F00C01D4D00F21B4B00F21C4A00F21D4800F21E4800F21E4700F21F47
+00F21F4700F21F4700F21F8A0E00008A0F00008A1000008B1000008B110000
+8C1100008C1200008C1200008C1300008D1200008E1000008D0B0006830201
+147600071B6D000F1F620018225900212551002A274B00372947004B2B4400
+612C4100782B4000932A3C00B7293A01FA273902FB273803FB273703FC2837
+03FD283603FD283603FD283603FD283603FD288B1100008B1100008C120000
+8C1200008D1300008D1300008D1400008D1400008E1500008E150000901200
+0085120004760D0013610400235200052C47000E303E001835360023383000
+313B2B00423C2700563C25006A3B230082392100A3372100E9341F00EA351D
+00E8351C00E6361B00E6361A00E5371A00E5371A00E5371A00E5378D130000
+8D1300008D1400008E1500008E1500008E1600008E1600008F1700008F1700
+008B180000821A0000791A00066B17001357110021420900302E01023F2200
+0C461B0019481400264B0E00354C0A00454B08005949080071480500954C05
+00D0420300D8400201D7400201D7400202D7400203D73F0203D63F0203D63F
+0203D63F8E1500008E1600008F1700008F1700008F1800008F180000901900
+0090190000871C00007E200000772300006D2200095F2000154C1C00213816
+002F220F00410903005001040E5300091F52000B2E4E000D404A0010584700
+1372440015923F0014C73A0015D7390016D7380016D8380017D8370017D837
+0018D8370018D8370018D8378F1800009018000090190000901A0000911A00
+00911B0000911B0000851F00007C240000742800006C2B00036129000E5327
+00184125001F2E21002B1B1B003A041201480015104700192144001C304200
+1E42410021594000247237002792330028C8310027E02F0027E12E0028E22E
+0028E22E0028E32D0029E32D0029E32D0029E32D911A0000911B0000911C00
+00921C0000921D00008F1E00008223000079280000712D00006A3000006130
+00085530001248300016382E001B272B0024152600330120033F0024133B00
+292338002E32370032443700335A330035712D003690290038C1250037E623
+0038E5230039E4220039E3220039E3210039E2210039E2210039E221921D00
+00921E0000921F0000931F00008C22000080280000772D00006E3100006734
+000060360001573700094C38000E41390011313900162136001F0E30002E00
+2D063600351632003C252F0042352C0044472900465C280047722700489024
+0049BA1C0049E21A004AE319004AE419004BE419004BE519004BE519004BE5
+19004BE5199321000093210000932200008B2500007F2D0000753200006C36
+0000643800005D3A0000573C00004F3F0002474200043B44000A2B4300121B
+40001D083B002A003F0A2D00481929004D2626005236230057491E00595E1D
+005A731F005A901E005BBC17005BF815005BF815005CF815005CF914005CF9
+14005DF914005DF914005DF91494240000942500008A2A00007E3200007237
+0000693A0000603C0000593E0000543F00004F41000048460000404B000034
+4C0007254C0010144A001B0248022600510E2300591A1F005D261E0061351B
+00664916006B5F15006C7515006C8F14006CB910006BF80E006CF70E006CF7
+0D006CF70D006DF60D006DF60D006DF60D006DF60D962800008A2F00007D37
+0000703C0000663E00005D40000056410000514300004C450000474800003F
+4D0000375200002C5400051D55000E0D5500190057041F00610F1A00681A16
+006D2616007035130075480F007A600D007C760C007D8F0B007DB709007CFD
+06007DFD06007DFE05007DFE05007DFE05007DFE05007DFE05007DFE058B34
+00007C3D00006E3F0000634100005A430000534500004E470000494A000044
+4C00003F4F0000375400002F590000245D0005165F000D0660001600670716
+0071101100791B0D007E270A008134070084460500865C04008A7403008F90
+02008EB702008BFE01008BFF01008CFF00008CFF00008CFF00008CFF00008C
+FF00008CFF00794100006B4300006045000058470000514900004B4C000046
+4F0000405100003C540000375600002E5C0000276100001C6600040F69000C
+016D01120076080E0081110900891B04008E26010090320000924300009358
+0000977100009D8F00009CB1000096EE000096FF000096FF000096FF000096
+FF000096FF000096FF000096FF00694700005D480000554B00004E4E000048
+510000425400003D57000038590000335C00002E5E0000276400001F6B0000
+147000040874000A007B030B00850808008E0F0400961602009B2000009E2C
+00009F3C0000A2520000A66C0000AD8A0000AEAB0000A5DC0000A3FB0000A3
+FB0000A3FB0000A3FB0000A3FB0000A3FB0000A3FB005B4C0000524F00004B
+520000455600003F5A0000395D0000346000002F6200002B65000027670000
+1F6E000018750000117B0003098000070186000B0090050800990A0400A410
+0100AC190000B3250000B5340000B8490000C0630000C5820000C89D0000C3
+D30000B9F40000BAF40000BAF40000BAF40000BAF40000BAF40000BAF40050
+53000049580000425C00003C60000036640000316700002C6A0000276D0000
+236F0000227000001D770000197F0000148600000F8E000107940005019B01
+0700A8040400B7080100C7100000D41C0000E32A0000FB3A0000F9570000F9
+6F0000FA890000FEAC0000F8CD0000F9CB0000FAC90000FAC70000FBC70000
+FBC70000FBC700475D00004063000039680000336C00002D6F000028730000
+247500002377000023780000237900001F8000001A88000015900000109700
+000CA0000006A9000101B4000300C2030100D80A0000E9170000F8250000FF
+330000FF540000FF6B0000FF7F0000FF9D0000FFB20000FFB20000FFB20000
+FFB20000FFB20000FFB20000FFB2003D6B000037700000307300002A760000
+2578000023780000237800002378000023780000237900001F8000001A8800
+00168F0000119700000C9F000007A8000101B3000300C1020100D6090000E9
+160000F7240000FF320000FF510000FF690000FF7B0000FF9A0000FFB20000
+FFB20000FFB20000FFB20000FFB20000FFB20000FFB200347100002D750000
+27770000237800002378000023780000237800002378000023780000237800
+001F8000001A870000168F0000119700000C9F000007A8000101B3000300C0
+020200D5090000E8150000F6230000FF310000FF4F0000FF670000FF770000
+FF930000FFAB0000FFB20000FFB20000FFB20000FFB20000FFB20000FFB200
+2A760000237800002378000023780000237800002378000023780000237800
+0023780000237800001F8000001A870000168F0000119700000C9F000007A8
+000101B2000300C0020200D4080000E7140000F5220000FF300000FF4C0000
+FF640000FF740000FF8C0000FFA30000FFB20000FFB20000FFB20000FFB200
+00FFB20000FFB2002378000023780000237800002378000023780000237800
+00237800002378000023780000237800001F7F00001B870000168F00001197
+00000C9E000007A7000101B2000400BF020200D2080000E6130000F4210000
+FF2F0000FF470000FF610000FF700000FF860000FF9E0000FFB20000FFB200
+00FFB20000FFB20000FFB20000FFB200>
+<6B0003006B0002006C0002006C0002006D0002006D0001006E0001006E0001
+006E0001006F0001007000050070000B007100130072001A00730024007400
+300078003E007A0051007C0063007D0075007E0087007D0099007C00AD007C
+00CD007C00FB007C00FC007C00FC007C00FC007C00FC007C00FC007C00FC00
+7C00FC007C00FC006C0002006C0002006D0002006D0001006E0001006E0001
+006F0001006F00010070000100700001007100040071000B00720012007300
+1A007400230075002F0079003E007C0050007D0062007E0075007F0088007E
+0099007E00AD007D00CD007E00FD007E00FD007E00FE007E00FE007E00FE00
+7E00FE007E00FE007E00FE007E00FE006D0002006D0001006E0001006E0001
+006F0001006F00010070000100700001007100010071000000720004007200
+0A0073001100740019007500220077002E007B003D007D0050007E00620080
+00750081008800800099007F00AD007F00CD007F00FF007F00FF007F00FF00
+7F00FF007F00FF007F00FF007F00FF007F00FF007F00FF006E0001006E0001
+006F0001007000010070000100710001007100000072000000720000007200
+0000730003007400090074001100750019007600220078002D007C003C007F
+004F007F0062008100740082008800810099008000AD008000CE008000FF00
+8000FF008000FF008000FF008000FF008000FF008000FF008000FF008000FF
+006F0001007000010070000100710001007200000072000000730000007300
+00007300000074000000740002007500090076001000770018007800210079
+002C007D003B0080004E00810061008200740083008800820099008100AD00
+8100CE008100FF008100FF008100FF008100FF008100FF008100FF008100FF
+008100FF008100FF0071000100710000007200000072000000730000007400
+000074010000750100007501000076010000750001017600080077000F0078
+001700790020007A002B007F003A0081004D00820061008300740085008700
+840099008300AD008300CE008300FF008300FF008300FF008300FF008300FF
+008300FF008300FF008300FF008300FF007200000073000000730000007401
+00007501000075010000760200007702000077020000780200007601010177
+00070179000E007A0016007A001F007C002A008000390083004C0084006000
+8500730086008700850099008400AD008500CE008400FF008400FF008400FF
+008400FF008400FF008400FF008400FF008400FF008400FF00740000007501
+0000750100007602000077020000770200007803000079030000790300007A
+04000078010101790006017A000D007B0015007C001E007D00290082003800
+85004B0085005F008700720088008600870098008600AD008600CE008600FF
+008600FF008600FF008600FF008600FF008600FF008600FF008600FF008600
+FF0076020000770200007702000078030000790300007A0400007A0400007B
+0400007B0400007C0500007A0300007A0004027C000C017D0014017D001D01
+7F002801830036008700490087005E008800720089008600890098008800AD
+008800CD008700FF008700FF008600FF008500FF008400FF008400FF008300
+FF008300FF008300FF0078030000790300007A0400007B0400007B0400007C
+0500007D0500007E0600007E0600007F0600007D0400007B0003047E000A03
+7E0013037F001C0280002602840035008900470089005C008A0071008B0085
+00870095008200A8007F00C4007C00FE007A00FF007800FF007800FF007700
+FF007700FF007600FF007600FF007600FF007B0400007C0400007D0500007D
+0500007E0600007F0600008007000081070000810800008208000080060000
+7D0001067F0009058000110481001A0482002503860033018B004501850058
+02800069057C007B0677008D077300A1066F00B9046F01ED027002FF016E03
+FF016D03FF026D03FF026C03FF026B03FF036B03FF036B03FF037E0600007F
+06000080070000810700008108000082080000830900008409000084090000
+850A0000840800007F020006800007088200100783001906830023067D002E
+0878003D0B72004E0E6C005F0F690072116500861161009B105E00B80D5E00
+EE0A5E02FC095C02FB0A5A01FA0B5900F90C5800F90D5700F80D5700F80D57
+00F80D8107000082080000830800008409000085090000850A0000860A0000
+860B0000860B0000870C0000860A0000830500048200050A83000D0A7A0015
+0D71001E1069002713620032165C003F18570052195400671A51007C1B4F00
+931A4C00B1194A00E1174800EE174600ED184500ED194400ED1A4400ED1A43
+00ED1A4300ED1A4300ED1A84090000850A0000860A0000860B0000870C0000
+870C0000880D0000880D0000890D0000890E0000890C0000870800027B0201
+0F6F00061665000E1A5A00161D51001E214A00272444003326400045273E00
+5B273C0070273A0089263800A8243600DB243500F4243400F5243200F62532
+00F7253100F7253100F7263000F7263000F726870B0000870C0000880D0000
+890D0000890E00008A0E00008A0F00008A0F00008A1000008B100000881000
+007D1000016F0B00105A03001E4C00062542000E2A3800162F310021332B00
+2D3526003D3523005035210064351F0079331D0095321D00C32F1D00E02E1B
+00DE2E1A00DD2F1900DD2F1800DC2F1700DC301700DC301700DC30890E0000
+8A0E00008A0F00008A1000008B1000008B1100008B1100008C1200008C1200
+00841500007B1700007118000363150010510F001D3D07002B2B0103382000
+0B3E19001741120024440C003245070040450500544305016A410301864102
+00B4400200D0380201D0380202D1370203D1370203D1370104D2370104D237
+0104D2378B1000008B1100008C1200008C1200008D1300008D1300008D1400
+008C14000081190000781C0000701F000066200007581D00124719001C3414
+0029200D00390803004901040E4C00081E49000B2D45000D3D420010523E00
+136A3B001587370015B2340014D4320015D4310016D4310016D4300017D430
+0017D5300017D5300017D5308D1300008D1400008D1400008E1500008E1600
+008E1600008A1800007E1C0000752100006D240000662700015B26000B4D24
+00143D22001B2B1E002619180033031101410014103F0018203C001B2F3900
+1D3F38001F53360022692F0025862C0028B42C0025E02A0026E1290026E229
+0026E3280027E3280027E4280027E4280027E4288E1600008F1700008F1700
+008F18000090180000871B00007B210000722500006A290000632C00005B2D
+0005502C000E432C0012342B0017252800201323002D011E04380022133400
+272231002B312F002E412D0030542900326A27003386240036AE220034E91F
+0035E71E0035E61E0036E61D0036E51D0036E51D0037E41C0037E41C901900
+00901A0000911A0000911B0000851F00007A250000702A0000672D00006030
+00005A32000152330005483400093D36000C2E3500121E32001B0D2C002900
+2B072F0032162B00382428003D3325003F43230042572100446C2000458620
+0046AA190046E2150047E3150048E3140048E3140048E4140049E4140049E4
+140049E414911C0000921D0000921D000084230000782900006D2E00006532
+00005D34000056360000513800004B3B0000433E000038400005283E000F18
+3B001906360026003C0B270044192300482520004D331D0051451900555917
+00566E180056861A0058AB130057F20F0058F30F0058F30E0059F30E0059F3
+0E0059F30E0059F30E0059F30E932000009320000082270000762F00006B33
+0000623600005A390000533B00004E3C0000493E0000434100003B45000030
+4800032147000D1145001701430222004D0E1E00531A1A00572518005C3216
+0061451200655A100067700F0068880E0068A90B0067E8080068ED070068EC
+070068EA070068EA070068E9060068E9060068E90691240000822D00007534
+0000693800005F3B0000573D0000503F00004B41000046430000414500003B
+480000324C0000284F00021A4F000C094F00160052051A005C101500631A11
+00672510006B330D006F440A00735A0800766F05007887040079A9030078DD
+010079FA010079FB010079FC010079FC01007AFC00007AFD00007AFD008133
+000073390000673C00005C3F0000544100004E43000048450000434800003D
+4A0000384C0000324F000029540000205700021258000B045A011300610811
+006B110C00731B0700792604007B3201007D4100007E550000816C00008586
+000087A7000085E3000084FF000084FF000084FF000084FF000084FF000084
+FF000084FF00703E0000644000005A420000524500004B480000454B00003F
+4D000039500000345200002F53000029570000225B0000185F00030A62000A
+0067030E006F090A00771106007F19030084230200862E0000883C00008950
+00008B6700009182000093A200008FD200008EFF00008EFF00008EFF00008E
+FF00008EFF00008EFF00008EFF0061440000574600004F490000484D000042
+5000003B53000036550000305800002C5A0000275B0000225F00001A640000
+12690003096C00090070010D0078070A00810D070089150300901E01009329
+000095370000964A0000986100009E7D0000A39E00009DC5000099FF000099
+FF00009AFF00009AFF00009AFF00009AFF00009AFF00544B00004D4E000046
+5200003F55000038590000325C00002D5E0000286000002462000020640000
+1E6700001A6C0000147200010C760006037B000B0083030A008C090700950F
+03009E170100A3220000A62F0000A6410000AC590000B1770000B8940000B4
+BD0000AAF80000AAF80000AAF80000AAF80000AAF80000AAF80000AAF8004A
+530000435700003C5C0000355F00002F6300002966000024680000216A0000
+216B0000216C0000206F00001B750000177C00001082000208890006019000
+090098040600A4090300B00F0000BC190000C4260000C8370000CF4F0000D6
+6A0000DB870000DEA80000CFF40000CFF50000CFF50000D0F50000D0F60000
+D0F60000D0F600405E000039620000326700002C6B0000266E000022710000
+22720000227200002273000022740000217800001D7F000018880000139000
+000E9800000AA2000004AC000200B9010300CA040000E00F0000EF1D0000FE
+2C0000FF420000FF600000FF730000FF910000FFB00000FFB20000FFB20000
+FFB20000FFB20000FFB20000FFB200366B00002F6F00002974000023770000
+237800002378000023780000237800002378000023780000217B00001D8300
+00188A0000149200000F9A00000AA3000004AC000200B8010300C9040100DF
+0E0000EE1C0000FD2A0000FF3E0000FF5E0000FF700000FF8A0000FFA80000
+FFB20000FFB20000FFB20000FFB20000FFB20000FFB2002C75000026770000
+23780000237800002378000023780000237800002378000023780000237800
+00217B00001D830000198A0000149200000F9A00000AA2000004AC000200B8
+010300C8040100DE0E0000ED1B0000FC290000FF3A0000FF5B0000FF6E0000
+FF850000FFA00000FFB20000FFB20000FFB20000FFB20000FFB20000FFB200
+23780000237800002378000023780000237800002378000023780000237800
+002378000023780000227B00001D820000198A0000149200000F9A00000AA2
+000005AB000200B7010300C7040100DD0D0000EC1A0000FB280000FF360000
+FF580000FF6C0000FF810000FF9D0000FFB20000FFB20000FFB20000FFB200
+00FFB20000FFB2002378000023780000237800002378000023780000237800
+0023780000237800002378000023780000227B00001D820000198A00001492
+00000F9900000AA2000005AB000100B6000300C6030100DC0C0000EB190000
+FA270000FF340000FF550000FF6B0000FF7D0000FF9A0000FFB00000FFB200
+00FFB20000FFB20000FFB20000FFB200>
+<63000600630006006400060064000500650005006600050067000400670004
+0068000400680004006800040067000B0068001200690019006A0022006A00
+2C006C003900700048007400590076006A0077007C0077008D007600A00074
+00B9007400EA007400EA007400EA007400EA007400EA007400EA007400EA00
+7400EA007400EA006400050064000500650005006600050067000400670004
+00680004006900040069000400690003006A00040069000A00690011006A00
+18006B0021006C002C006E003800720048007500590077006A0078007C0078
+008E007700A0007500B8007500ED007500EE007500EE007500EE007500EE00
+7500EE007500EE007500EE007500EE00660005006600050067000400680004
+006800040069000400690003006A0003006A0003006A0003006B0003006A00
+0A006B0011006C0018006D0020006E002B006F003800730047007600590078
+006A007A007D007A008E007800A0007700B8007700F0007700F2007700F200
+7700F2007700F3007700F3007700F3007700F3007700F30068000400680004
+0069000400690003006A0003006A0003006A0003006B0003006B0002006C00
+02006C0003006C0009006D0010006E0017006F0020006F002A007100370075
+00470077005900790069007B007D007B008F007900A0007800B8007800F200
+7800F6007800F6007800F6007800F6007800F6007800F6007800F6007800F6
+0069000300690003006A0003006A0003006B0003006B0002006C0002006C00
+02006C0002006D0002006D0002006E0008006E000F006F00160071001F0071
+0029007300360076004600790059007A0069007D007D007D008F007B00A000
+7A00B9007A00F4007A00F8007A00F8007A00F8007A00F8007A00F8007A00F8
+007A00F8007A00F8006A0003006B0003006B0002006C0002006C0002006D00
+02006D0001006D0001006E0001006E0001006F0001006F00070070000E0071
+00160072001E007300280075003500790046007B0058007C0069007E007D00
+7E008F007C00A1007C00B9007C00F0007C00FB007C00FB007C00FB007C00FB
+007C00FB007C00FB007C00FB007C00FB006C0002006C0002006D0002006D00
+01006E0001006E0001006F0001006F0001006F000100700001007000010071
+00060072000D007200150074001D0075002700770034007B0045007C005800
+7D0069007F007C0080008F007E00A1007E00BA007E00F5007E00FE007E00FE
+007E00FE007E00FE007E00FE007E00FE007E00FE007E00FE006D0001006D00
+01006E0001006F0001006F0001007000010070000100710001007100000072
+000000720000007300050073000C007400140075001C007600260079003300
+7E0044007E0057007F00690081007C0081008F008000A1008000BA008100F5
+008000FF008000FF008000FF008000FF008000FF008000FF008000FF008000
+FF006F0001006F000100700001007100010071000000720000007200000073
+0000007300000074000000740100007400040075000B007600130077001B00
+780025007A0031007F004200800056008100680083007C0083008F008200A1
+008200BA008100F0007E00FF007C00FF007B00FF007B00FF007A00FF007900
+FF007900FE007900FE00710000007100000072000000730000007300000074
+00000074010000750100007601000076020000760200007600030177000A00
+7800110079001A007A0023007C00300081004000820055008300680081007A
+007D008B0078009B007500B2007300D6007300FD007100FD007100FD007000
+FE007000FF006F00FF006F00FF006F00FF0073000000730000007401000075
+01000076010000760200007702000078020000780300007903000079030000
+77000202790009007A0010007B0018007C0022007E002E0080003E007B004E
+0076006002720071046F0083046B0096036700AC026600CE016901FF006801
+FF006702FF006702FF006602FF006602FF006602FF006602FF007602000076
+020000770200007803000079030000790300007A0400007B0400007B040000
+7C0500007C0500007A0101027B0007027C000F017D0017017900200272002A
+046C0036076700450A6300560C6000690E5E007E0F5B00920D5800AB0A5800
+D5085A02FB055801F9075600F8085400F7095400F7095300F60A5200F60A52
+00F60A79030000790300007A0400007B0400007C0400007C0500007D050000
+7E0600007F0600007F060000800700007D0300017C0005047A000C05710013
+0968001B0C6000241059002D135300391550004A164D005F174B0073174900
+89164700A5154600CB144500E9134300E9144200E8154100E8154000E71540
+00E7163F00E7163F00E7167C0500007C0500007D0500007E0600007F060000
+80070000810700008208000082080000830900008409000080060000730201
+0B670006125D000D155200151949001D1E420025223D003023390040243800
+54233600682234007F2233009A203200C11F3200EA1E3000E91F2F00E91F2E
+00E8202D00E8202D00E7202C00E6202C00E620800700008007000081080000
+820800008309000084090000850A0000850A0000860A0000860B00007F0D00
+00750E0000670A000C5302001A470006203D000D243300152A2C001F2E2600
+2B2F2200392F1F004A2F1D005D2E1B00712E19008A2D1900AE2A1A00D82819
+00D6281700D5281600D5291500D5291500D5291400D4291400D42984090000
+84090000850A0000860B0000860B0000870C0000870C0000880C0000870D00
+007C110000741500006A1600015C13000C4B0D001938060026280103311D00
+0B371600163A1000223C09002E3E05003C3E03014E3C0302643902037D3801
+029E370201CF300202CF300203CE2F0104CE2F0104CE2F0105CE2F0105CE2F
+0105CE2F870C0000870C0000880D0000880D0000890E0000890E00008A0F00
+00841100007915000070190000691C00005F1D0003521B000E421700183011
+00241E0B00310703004100040D4300081C40000B2B3C000D3A39000F4D3500
+12633100167B2E0016A12E0013CE2B0014CE2B0015CE2B0016CF2A0016CF2A
+0017CF2A0017CF2A0017CF2A8A0E00008A0F00008A0F00008B1000008B1100
+008B11000082140000771900006D1D0000662100005F240000552300074822
+000F391F0017291B00211716002C0210013A0013103700171F33001A2D3000
+1C3C2E001E4E2B0020622600237C260026A1270023DA250024DB240024DC24
+0025DD230025DD230025DD230026DD230026DD238C1100008C1200008C1200
+008D1300008D14000080180000741D00006B220000632500005C280000562A
+00004B2900093F29000D312700132225001C12200027011C04310020132D00
+25212900282F27002B3E24002D4F21002F641F00317C1F00349E1E0032DD1B
+0032E31A0033E2190034E1190034E0190034DF180035DF180035DF188E1500
+008E1500008E1600008D1700007E1C00007222000068260000602A0000592C
+0000522E00014D30000044310003393200082B31000E1C2E00170C28002300
+280728002F1625003523210039301E003C401C003F521A0041661900427E1A
+00439D160044D1100044E10F0045E10F0045E20F0046E20F0046E20E0046E2
+0E0046E20E8F180000901800008C1A00007C21000070260000662B00005D2E
+0000563000014F3300004A340000453600003E390000343C0001253A000B16
+3700150532002000390B210040181D0044241A00483117004D411400505412
+0052681100537F1300549E0F0055D5090055EE080055EF080055EF080056EF
+080056EF080056EF070056EF07901C00008A1E00007B2500006E2B00006430
+00005A320001533500004D37000048390000423B00003E3D0000354000002C
+4300011E4200090E400014003F031D00480E18004E19140052241200573010
+005B400D005F550A00636B070065820600669F050064C7020063EB020064EA
+020064EA010064E9010065E9010065E9010065E9017D2800007A2A00006D30
+00006134000058370000503900004A3C0000443E00003F4000003942000034
+4300002C470000234A0001164A000807490013004E06140056100F005D1A0A
+006124080066310600684005006B5304006E69010071800000729B000070C2
+00006FF100006FF100006FF1000070F1000070F1000070F1000070F1006E34
+00006B3600005F390000563C00004E3E000048400000414300003B46000035
+470000304900002C4A0000244E00001C5100010F5300080255020F005C090B
+00631108006A1905006E230400702E0300723B0300744E0200776401007B7B
+00007C9800007BC100007BFF00007BFF00007BFF00007BFF00007BFF00007B
+FF00007BFF00603C00005D3D0000534000004C430000454600003E49000037
+4B0000314D00002C4F000028500000245200001C560000145900010B5B0008
+005D010E0064070C006B0E080073170500792003007C2B02007E3700007F48
+0000815E0000857700008894000087BE000085FF000085FF000086FF000086
+FF000086FF000086FF000086FF00534300005144000049480000424B00003A
+4E0000345100002E5300002855000024570000205800001E5900001B5D0000
+166100010D6400060266000D006C050C00740B09007D130500841C03008826
+01008A3200008C4200008D580000917100009690000096B4000091FF000091
+FF000091FF000091FF000091FF000091FF000091FF00494C0000474D00003F
+50000037540000305700002A590000255C0000205E00001F5F00001F5F0000
+206000001C64000017690000106D00040670000A0076020C007F080900880E
+05009016020096200000992C00009A3B00009D510000A06B0000A78A0000A8
+AE00009FED00009FFD00009FFD00009FFD00009FFD00009FFD00009FFD003E
+5500003C570000345A00002D5E000027610000226300002065000020650000
+2166000021670000216800001D6C000019720000137800020B7D0006028300
+0A008C04090095090500A00F0200A9180000AF230000B2320000B4470000BC
+620000C2820000C5A00000BCDA0000B6F50000B6F50000B6F50000B6F50000
+B6F50000B6F50034600000326100002B65000024690000216B0000216C0000
+216D0000226E0000226F000022700000227000001F7600001A7D0000168500
+00118C00000A930003029A000700A5030500B5070200C50D0000D4190000E3
+270000F7370000FD540000FE6D0000FF880000FFAD0000FFBC0000FFBC0000
+FFBB0000FFBB0000FFBB0000FFBB002A6D0000286E00002272000022730000
+22740000237500002377000023780000237800002378000023780000207E00
+001B860000178D0000129500000D9D000008A6000002B1000300BE020200D2
+070000E7140000F5230000FF310000FF510000FF6A0000FF7F0000FF9E0000
+FFB20000FFB20000FFB20000FFB20000FFB20000FFB2002378000023780000
+23780000237800002378000023780000237800002378000023780000237800
+0023780000207E00001C850000178D0000129500000D9D000008A6000002B0
+000300BD020200D1070000E6130000F4220000FF300000FF4E0000FF680000
+FF7A0000FF9B0000FFB20000FFB20000FFB20000FFB20000FFB20000FFB200
+23780000237800002378000023780000237800002378000023780000237800
+00237800002378000023780000207D00001C850000178D0000129500000D9D
+000008A5000002B0000300BD010200CF060000E4120000F3200000FF2E0000
+FF4A0000FF640000FF760000FF940000FFB00000FFB20000FFB20000FFB200
+00FFB20000FFB2002378000023780000237800002378000023780000237800
+002378000023780000237800002378000023780000207D00001C850000178C
+0000129400000D9C000009A5000003AF000300BC010200CE050000E3110000
+F11F0000FF2D0000FF450000FF610000FF720000FF8C0000FFA60000FFB200
+00FFB20000FFB20000FFB20000FFB200>
+<59000900590009005A0009005B0009005B0008005C0008005D0008005D0008
+005E0008005E0007005F0007005F000A005F0011005F001800600020006100
+2A0062003500650041006B0050006F0060007000700071008200700094006E
+00AA006C00CA006D00DF006D00DF006D00DF006D00DF006D00DF006D00DF00
+6D00DF006D00DF005B0009005B0009005B0008005C0008005D0008005E0008
+005E0007005F0007005F000700600007006000070060000A00600011006100
+1800610020006200290063003400670041006C005000700060007100700072
+008200710094006F00AA006E00CA006E00DF006E00DF006E00DF006E00DF00
+6E00DF006E00DF006E00DF006E00DF005D0008005D0008005D0008005E0008
+005F0007005F00070060000700610007006100060062000600620006006200
+0900620010006200170063001F006400280065003300680040006E004F0071
+0060007200700073008200720094007000AA006F00CA006F00E0006F00E000
+6F00E0006F00E0006F00E0006F00E0006F00E0006F00E0005F0007005F0007
+005F0007006000070060000700610006006200060062000600630006006300
+0600640005006400080064000F006400160065001E0066002700660032006A
+0040006F004F00720060007300710074008200730094007200AA007100C900
+7000E0007000E0007000E0007000E0007000E0007000E0007000E0007000E0
+00600007006000070061000700620006006200060063000600640005006400
+05006500050066000500660005006500080065000E006600150067001D0067
+002600680032006C003F0070004F0073006000750071007500820075009500
+7300AA007200C9007200E4007200E4007200E4007200E4007200E4007200E4
+007200E4007200E50063000600630006006300060064000500650005006500
+050066000500670004006700040068000400680004006700070067000D0068
+00140069001C006A0025006B0031006E003E0072004F007500600076007100
+76008300760095007500AA007400CA007400E9007400E9007400E9007400EA
+007400EA007400EA007400EA007400EA006500050065000500650005006600
+05006700040068000400680004006900040069000300690003006A0003006A
+0006006A000C006A0014006B001B006C0024006D00300070003D0074004E00
+760060007700710078008300780095007700AA007600CA007600EF007600EF
+007600EF007600F0007600F0007600F0007600F0007600F000670004006700
+0400680004006800040069000300690003006A0003006A0003006B0003006B
+0002006B0002006C0005006C000B006C0013006E001A006F0023006F002F00
+72003C0076004E0078005F00790071007A008300790095007800AA007800CB
+007800F5007800F5007800F5007800F5007800F5007800F5007800F6007800
+F60069000300690003006A0003006A0003006B0003006B0002006C0002006C
+0002006C0002006D0002006D0001006E0004006E000A006F00120070001900
+7100220072002D0075003B0078004D007A005F007B0071007C0084007B0096
+007900A9007600C9007400F1007200F0007100EF007100EE007000EE007000
+ED006F00ED006F00EE006B0002006B0002006B0002006C0002006C0002006D
+0001006D0001006E0001006E0001006F0001006F0001007000030070000900
+71001000720018007300210074002C0077003A007A004C007A005E0077006E
+0073007F00700090006C00A5006A00C1006B00F8006B00FD006A00FF006900
+FF006900FF006800FF006800FF006800FF006D0001006D0001006D0001006E
+0001006F0001006F0001007000010070000100710001007100010071000000
+720002007300080073000F00740017007500200076002B00720037006E0045
+006B005600690067036600790363008C026000A2015F00C2006300FF006200
+FF006100FF006001FF005F01FF005F01FF005F01FF005E01FF006F0001006F
+00010070000100700001007100010072000000720000007300000073000000
+7400000074010000740001007500070076000E007600160070001D00680026
+01610032045C003E075A004D095800600B5600740C5500880A53009F085200
+C2055501FB045300F9055100F7065000F6064F00F5074E00F4074E00F3074E
+00F30772000000720000007200000073000000740000007401000075010000
+75010000760200007702000077020000760100007700050170000B02670012
+055E001A095600220D50002A114B003413480044144600571445006B144400
+8013430098114200B9104100E50E4000E40F3E00E3103D00E3103D00E2113C
+00E2113C00E2113B00E1127501000075010000750100007602000077020000
+770200007803000079030000790300007A0400007A040000760400006A0201
+085F00060D55000C114A00131641001B1B3A00232035002E2133003C213100
+4E1F3000611E2F00761E2E008E1D2D00AE1B2E00DD192C00DC1A2B00DC1A2A
+00DB1A2900DA1B2900DA1B2800DA1B2800D91B780300007803000079030000
+790300007A0400007B0400007C0500007D0500007D0500007E060000760900
+006D0C0000600900074D0200154200061B37000C202E00132627001C292200
+282A1D00362A1B0045291900572917006A291600802815009E251800CE2116
+00CE221500CE221400CE231300CD231200CD231200CD231200CD237C050000
+7C0500007C0500007D0600007E0600007F07000080070000810700007D0900
+00730D00006B1100006313000056110008460C0014340500212501032B1B00
+0A30140015330D00203507002C37030039370101493501035E320105742F00
+04912E0101C22A0103CA290103C9290104C9290105C9290105C8280005C828
+0006C828810700008107000081070000820800008309000084090000850A00
+007B0D0000701200006815000060190000591B00004C1900093E1400142D0F
+001F1C0A002B0602003900040D3B00081B37000B2933000D3830000F492C00
+115D2900157226001691270014BD260014C8250014C8250015C8250016C825
+0016C8240016C8240016C824850A0000850A0000850A0000860B0000870B00
+00870C0000791100006E160000651A00005D1D0000562000004F210002431F
+000A351C00132618001C16140026020F013200120F2F00161E2C00192B2800
+1B3925001C4A22001E5D1F0021731F002491200023C1210022D3200023D31F
+0023D41F0024D41F0024D41E0024D41E0024D41E880D0000880D0000890D00
+00890E000085100000771500006C1A0000621E00005A210000532400004D26
+0000462600023B2600082E24000F20220017101D0021011A032A001F122600
+24202300262D1F00293B1C002B4C1A002D5F18002F7419003191190031BB17
+0030D6160031D5150031D4140032D4140032D4140032D4140033D4138B1000
+008B1000008B11000084140000751900006A1F000060230000582600005028
+00004A2A0000452B00003F2D0000352E0004282D000A1A2B00130B26001D00
+260722002D151E0032221B00362E1700393D15003C4E13003E6112003F7613
+004191110042BA0C0041DA0B0042DB0A0043DB0A0043DC090043DC090044DC
+090044DC098D1400008D14000082170000731E0000672300005E270000552A
+00004E2C0000482E0000423000003D310000373300002F3700002236000713
+340011042E001B00360B1A003C17160040221300452E1000493D0D004C4F0C
+004E630A00507909005295070053BE030051EB020052EB020052EB020052EB
+020053EB010053EB010053EB017A1F00007A1F000072230000662800005B2C
+0000522F00014B310000453300003F3500003A360000343800002F3A000026
+3D00001B3E00050C3C000F003B031700440E110049180D004D220A00522E08
+00563D0600594F05005C6502005E7B0000609501005EB800005CED00005CED
+00005CED00005CED00005CED00005CED00005CED006B2A00006B2A0000642D
+0000593000015033000049360000433800003C3A0000363C0000303E00002C
+3F0000274100001E440000134500050544000F0049070E0051100800551806
+00582105005B2C06005E3A0600614B050064610300677700006990000067B1
+000065E8000065E7000065E7000065E7000065E7000065E7000065E7005E33
+00015E330001573500004E380000473B0000403D0000393F0000324100002D
+44000028450000244700001F480000174C00000D4D0005014C000E0051060D
+00580E09005E160600621F05006529050068360500694705006D5C03007073
+0000728C000072AD000070F1000070F2000070F2000070F2000070F2000070
+F2000070F200523B0000523B00004D3D0000454000003D430000354500002F
+48000029490000244B0000204D00001C4E00001B4F0000165200000F540004
+0455000C0059050D005F0C0A00671307006D1D040071270300733303007542
+0200775602007A6D00007E8700007EAA00007CF000007CFF00007CFF00007C
+FF00007DFF00007DFF00007DFF004743000047430000424600003A49000032
+4B00002B4E000026500000215200001D5300001D5400001D5400001D550000
+18590000115C0003075E000A0061030E0068090B0070100700781904007E23
+0200802E0100823C000082500000856700008A8300008CA4000089E6000088
+FF000088FF000088FF000088FF000088FF000089FF003C4D00003C4D000037
+4F00002F51000028540000235600001E5800001E5900001E5A00001F5B0000
+1F5B00001E5C00001A610000146500020A680008016B010D0072060B007B0D
+0700841504008A1E02008E2900008F3600009149000093600000987D00009D
+A0000097CF000095FF000095FF000095FF000095FF000095FF000095FF0031
+560000315600002C580000265B00001F5E00001F5F00001F60000020600000
+206100002062000020630000206400001B690000166F00000E730005047700
+0A007E030B0088080700910F0400991701009F210000A22E0000A3400000A7
+580000AC770000B3960000ACC30000A6F90000A6F90000A6F90000A6F90000
+A7F90000A7F900276100002761000023630000206500002166000021670000
+2168000021690000216A0000216B0000216B0000216D00001D730000187A00
+00128000010A870005038E00080096030700A1080400AE0E0100B9170000C2
+240000C7340000CD4C0000D5690000DA870000DDAC0000CEF40000CEF50000
+CFF50000CFF50000CFF50000CFF500216C0000216C0000216D0000226E0000
+226F0000227000002272000022730000227400002275000023750000227700
+001E7F00001A87000015900000109800000BA1000005AA000101B6000300C5
+030100DD0C0000ED1A0000FC290000FF3D0000FF5F0000FF730000FF940000
+FFB20000FFB20000FFB20000FFB20000FFB20000FFB2002376000023760000
+23770000237800002378000023780000237800002378000023780000237800
+0023780000237900001E8100001A88000015900000109800000BA0000006A9
+000101B5000300C4030100DB0C0000EC190000FB280000FF380000FF5C0000
+FF6F0000FF8C0000FFAE0000FFB20000FFB20000FFB20000FFB20000FFB200
+23780000237800002378000023780000237800002378000023780000237800
+00237800002378000023780000237900001E8000001A880000159000001098
+00000BA0000006A9000101B4000300C3030100DA0B0000EB180000F9270000
+FF350000FF580000FF6D0000FF860000FFA40000FFB20000FFB20000FFB200
+00FFB20000FFB2002378000023780000237800002378000023780000237800
+002378000023780000237800002378000023780000237900001F8000001A88
+0000158F0000119700000CA0000006A9000101B4000300C2030100D80A0000
+EA170000F8260000FF330000FF550000FF6B0000FF810000FF9E0000FFB200
+00FFB20000FFB20000FFB20000FFB200>
+<50000C0050000C0050000C0051000C0051000C0052000C0053000B0053000B
+0054000B0054000B0055000B0055000B005400110054001800540020005600
+2800580031005C003B0061004800670056006A0066006B0077006A008A0068
+009F006600BD006900F2006900F2006900F2006900F2006900F2006900F100
+6900F1006900F10052000C0052000C0052000C0052000C0053000B0054000B
+0054000B0055000B0056000A0056000A0057000A0057000A00560010005600
+170056001F0057002700590030005D003B0062004700680056006B0066006C
+0077006B00890069009F006700BC006900ED006900ED006900ED006900ED00
+6900ED006900ED006900ED006900ED0054000B0054000B0054000B0054000B
+0055000B0056000A0056000A0057000A0057000A0058000A00580009005900
+090058000F005800170058001E00590026005B0030005E003A006300470069
+0056006C0066006D0077006C0089006B009E006900BB006A00E8006A00E800
+6A00E8006A00E8006A00E8006A00E8006A00E8006A00E80055000A0055000A
+0055000A0056000A0057000A0058000A0058000A0059000900590009005A00
+09005A0009005B0009005A000F005A0016005A001D005B0025005D002F005F
+003A00650047006A0056006E0066006E0077006E008A006C009E006A00B900
+6B00E3006B00E3006B00E3006B00E3006B00E3006B00E3006B00E3006B00E2
+0058000A0058000A0058000A0058000A00590009005A0009005A0009005B00
+09005B0008005C0008005C0008005D0008005D000E005C0015005D001C005E
+0025005F002E0061003A00660047006C0056006F0066006F0077006F008A00
+6D009E006C00B8006C00DF006C00DF006C00DF006C00DF006C00DF006C00DF
+006C00DF006C00DF005A0009005A0009005A0009005A0009005B0009005C00
+08005C0008005D0008005E0008005E0008005F0007005F0007005F000D005F
+0014005F001B006000230061002D0063003900680046006D00560070006700
+7100770071008A006F009E006D00B8006D00DF006D00DF006D00DF006D00DF
+006D00DF006D00DF006D00DF006D00DF005C0008005C0008005C0008005D00
+08005D0008005E0008005F0007005F00070060000700600007006100070061
+00060061000C006100130062001A006300220063002C00650038006A004600
+6F005600710067007200780072008A0071009E006F00B8006F00E0006F00E0
+006F00E0006F00E0006F00E0006F00E0006F00E0006F00E0005E0007005E00
+07005E0007005F000700600007006100070061000600620006006200060063
+000600640006006400050063000B0063001200640019006500210066002B00
+670037006C00460070005600730067007300780074008A0073009D007100B7
+007000E0007000E0007000E0007000E0006F00E0006E00E0006E00DF006E00
+DF006100070061000700610007006200060063000600630006006400050065
+0005006500050066000500660005006700040066000A006600100067001800
+6700200068002A006A0036006E00450072005600740067007600780073008A
+006F009C006C00B5006C00F2006B00F5006A00F7006A00F9006900F9006900
+F9006800F9006800FB00640005006400050064000500650005006500050066
+00050067000400680004006800040069000400690004006900030068000900
+69000F00690017006A001F006B0029006C003500700044006F0053006D0063
+006B0074006700860064009A006200B6006500FF006300FF006200FF006200
+FF006100FF006100FF006000FF006000FF0067000400670004006700040068
+0004006800040069000400690003006A0003006A0003006B0003006B000200
+6B0002006B0007006C000E006C0015006E001D006C0027006500320060003E
+0060004C005F005D015E006F025C008201590097005700B5005C00FF005A00
+FF005900FF005800FF005800FF005700FF005700FF005600FF006A0003006A
+0003006A0003006A0003006B0003006B0002006C0002006C0002006C000200
+6D0002006D0001006D0001006E0006006F000D006C00140065001B005D0024
+0057002E035300380551004506500057084F006A094E007F084D0094054C00
+B0034E00EA024D00F5024C00F3034A00F0034900EF044900EE044800ED0448
+00EC046C0002006C0002006C0002006C0002006D0002006D0001006E000100
+6E0001006F0001006F00010070000100700001006F00040066000A015E0011
+03550018074D001F0D460027114200301440003E12400050113F0062113E00
+77103D008E0E3D00AA0C3D00D40A3C00E00A3B00DE0B3A00DD0C3900DD0C38
+00DC0C3800DC0C3700DC0C6E0001006E0001006E0001006F0001006F000100
+7000010071000100710000007200000072000000730000006D030000620201
+035700050A4D000B0E420012143A0018193200201E2E002B1F2C00391D2B00
+491B2A005A1A2A006E1A290084192800A0172A00C7142900D4142800D31527
+00D2152600D2152500D1152500D1162400D016710000007100000071000000
+720000007200000073000000740000007401000075010000730300006C0600
+00640900005A090003470200113C00051732000B1C2900122222001A251E00
+26261900322516004023150051231300632412007723120091211400B61D14
+00C81C1300C71D1200C71D1100C61E1000C61E0F00C61E0F00C61E74010000
+74010000740100007501000076020000770200007702000078030000720600
+00690A0000610D00005A10000050100003410B000F3004001B220103251800
+092A1100132C0B001F2E06002A2F0201362E0001462D0003592A00066D2800
+0686270003AA250103C3230104C3230005C2230005C2230006C2230006C223
+0006C222790300007903000079030000790300007A0400007B0400007A0500
+00700A0000670E00005E1200005715000051170000471700043913000F2A0E
+001A1A0900240602003100040C3200081A2E000B282A000D3627000F452400
+11582200136B1F0016841F0014AA210013C1200014C1200014C11F0015C11F
+0015C21F0015C21F0016C21F7D0500007D0500007D0500007E0600007F0600
+007B0900006F0E0000641200005C160000541900004E1B0000481D00003E1D
+0005311A000E2416001714130020020E012A00110E2800151C240018292000
+1A371D001C461B001D5819001F6C180022851A0022AB1C0020CB1B0021CB1B
+0022CB1A0022CB1A0022CB1A0022CB1A0023CB198308000083080000830800
+00840900007A0D00006D12000062170000591B0000511D00004A2000004421
+00003F230000362300032B22000B1E2000130F1C001B01190423001E112000
+221F1C00252B180027391500294913002B5A12002D6D12002F8613002FA712
+002ECC11002ECB11002FCB10002FCB100030CB0F0030CB0F0030CB0F870C00
+00870C0000870C0000791100006B160000601B0000571F00004F2200004824
+0000412600003C27000038280000302A0000252B00061829000E0924001800
+25071B002B1418002F201400332C1000373A0E003A4B0C003C5D0B003D700B
+003E870A003FA806003FD2050040D3040041D3040041D4030042D4030042D5
+030042D5037715000077150000771500006A1B00005E200000552400004C26
+0000452800003F2A0000392B0000342D0000302F0000293100001F33000211
+30000C032C001500330B130038160F003C200B00412C0800463A06004A4B04
+004A5E03004C7301004D8A00004DAC00004BE200004BE200004BE200004BE2
+00004BE200004BE200004BE2006720000067200000672000005D2500005328
+00004A2B0000432D00003C2E000036300000313200002C3400002836000021
+380000183A00010A38000B0038041000400D0A0044160600461F05004A2A04
+004E38050050480500525C0300547101005689000056A9000053E7000052EA
+000053EA000053EA000053EA000053EA000053EA005A2A00005A2A00005A2A
+0000512C0001482F0000413100003A340000333600002D380000283A000024
+3B0000203D0000193F000010410001053F000A0041050D00460C0A004B1406
+004D1D05005027050055340500574406005A5804005C6F01005F8600005FA5
+00005BDC00005BED00005BED00005BED00005BED00005BED00005BED004E32
+00004E3200004E320000463400003F37000037390000303C00002A3E000025
+400000204100001C4300001A4400001745000011470000074600090047030E
+004D0B0B0053130700561B0500592506005D3105005F40060062540500666B
+01006882000069A0000065C7000065E7000065E7000065E7000065E7000065
+E7000065E700443A0000443A0000443A00003D3D0000343F00002C41000027
+440000214600001C4700001B4800001B4900001B490000184B0000134D0000
+094E0008004F020F0054090C005B1008006119050065230500672E0500693C
+05006C4F04006F650100737D0000749A000071C4000071F3000071F3000071
+F4000072F4000072F4000072F400394300003943000039430000314500002A
+480000234A00001E4C00001C4D00001C4E00001C4E00001C4F00001C500000
+1A520000155500000C5600060258010E005D070C00640E09006C1606007120
+0400742B030076370200784902007A5F01007E7800008196000080C400007F
+FF00007FFF00007FFF00007FFF00007FFF00007FFF002D4C00002D4C00002D
+4C0000274E0000205100001D5200001D5300001D5400001D5400001E550000
+1E5600001E5600001B590000175D00000F6000050461000C0067040D006E0B
+0900771306007E1C0300832601008532000087420000875800008B71000090
+9100008EBB00008CFF00008CFF00008CFF00008CFF00008CFF00008CFF0024
+55000024550000245500001E5800001E5900001E5A00001F5B00001F5B0000
+1F5C00001F5D00001F5E00001F5E00001D61000018660000126A0003086D00
+090071010D007A070A00830E06008C160300921F0100952B0000963A000098
+5000009B6A0000A38B0000A2B200009BFE00009BFE00009BFE00009BFE0000
+9BFE00009BFE001F5F00001F5F00001F5F00001F6000002061000020620000
+2063000020640000206500002065000021660000216700001F6A00001A7000
+00157600010D7B00050480000A0089030900920806009C0E0300A5160000AC
+220000AF300000B1450000B8600000BF820000C2A30000B4E90000B3F60000
+B3F60000B3F60000B4F60000B4F60021680000216800002168000021690000
+216A0000216B0000216C0000226D0000226E0000226F000022700000227100
+00207500001C7C000017840000128B00000C930002049A000500A4010500B3
+050200C50A0000D6160000E5240000F9330000FF520000FF6C0000FF880000
+FFB20000FFB50000FFB50000FFB50000FFB40000FFB4002272000022720000
+22720000227300002375000023760000237700002378000023780000237800
+002378000023780000217C00001D830000188B0000139300000E9B000009A4
+000003AE000200BB010300CD050000E3110000F2200000FF2F0000FF4E0000
+FF690000FF7F0000FFA00000FFB20000FFB20000FFB20000FFB20000FFB200
+23780000237800002378000023780000237800002378000023780000237800
+0023780000237800002378000023780000217B00001D830000188B00001393
+00000E9B00000AA3000004AD000200BA010300CC050000E2100000F11F0000
+FF2E0000FF4A0000FF660000FF7B0000FF9C0000FFB20000FFB20000FFB200
+00FFB20000FFB2002378000023780000237800002378000023780000237800
+00237800002378000023780000237800002378000023780000217B00001D83
+0000188A0000149200000F9A00000AA3000004AD000200B9010300CA050000
+E10F0000F01E0000FE2C0000FF440000FF620000FF760000FF970000FFB200
+00FFB20000FFB20000FFB20000FFB200>
+<47001000470010004700100047001000480010004800100049000F004A000F
+004A000F004B000F004B000E004B000E004B0010004900170049001F004B00
+26004F002D0054003600590041005F004E0063005C0065006D0064007F0062
+0095006000B2006500FC006500FC006500FC006500FC006500FC006500FC00
+6500FC006500FC0049000F0049000F0049000F0049000F004A000F004A000F
+004B000F004B000E004C000E004C000E004D000E004D000E004D0010004B00
+17004B001E004D00250050002D00550036005900400060004D0064005C0066
+006D0066007F00640094006100B0006500FB006600FB006600FB006600FB00
+6600FB006600FB006600FB006600FB004B000F004B000F004B000F004B000F
+004B000E004C000E004D000E004D000E004E000D004E000D004F000D004F00
+0D004F000F004D0016004D001E004E00250051002C00560036005A00400061
+004D0065005C0067006D0067007F00650094006300AF006600F9006600F900
+6600F9006600F9006600F9006600F9006600F9006600F9004C000E004C000E
+004C000E004D000E004D000E004E000D004F000D004F000D0050000D005000
+0C0051000C0051000C0051000E004F0015004F001D005000240053002C0057
+0035005B00400062004D0066005C0068006C0068007F00660093006400AD00
+6700F4006700F7006700F7006700F7006700F7006700F7006700F7006700F7
+004E000D004E000D004E000D004F000D004F000D0050000D0051000C005100
+0C0052000C0052000C0053000B0053000B0053000D005200140052001C0053
+00230055002B00580035005C00400063004D0068005C006A006C0069007F00
+680093006600AC006700E6006800F5006800F5006800F5006800F5006800F5
+006800F5006800F50051000C0051000C0051000C0051000C0052000C005200
+0C0053000B0053000B0054000B0055000B0055000B0056000A0056000C0055
+00130054001B005500220057002B00590034005D003F0064004D0069005C00
+6B006C006B007E006A0092006700AB006700D9006900F1006900F0006900F0
+006900F0006900F0006900F0006900F00053000B0053000B0053000B005300
+0B0054000B0055000B0055000B0056000A0057000A0057000A0058000A0058
+000A0058000B005700120057001900580021005A002A005B0034005F003F00
+66004D006A005C006C006C006D007E006B0092006900AA006800D0006A00EA
+006A00EA006A00E9006A00E9006A00E9006A00E9006A00E90056000A005600
+0A0056000A0056000A0057000A0057000A0058000A0059000900590009005A
+0009005A0009005B0009005B000A005A0011005A0018005B0020005C002900
+5E00330061003F0067004D006C005D006E006D006E007F006D0092006B00A9
+006A00CC006A00E9006A00EF006900F4006900F8006900FB006800FC006800
+FD0058000900580009005800090059000900590009005A0009005B0009005B
+0008005C0008005C0008005D0008005D0008005E0009005D0010005D001700
+5E001F005F0028006000320063003E0069004C006D005C006D006C006B007E
+00670091006300A9006300D8006400FF006300FF006200FF006100FF006100
+FF006000FF006000FF005B0009005B0009005B0009005B0008005C0008005D
+0008005E0008005E0008005F0007005F000700600007006000070061000800
+60000F006100160061001D00620026006300310062003D0062004900630059
+006200690060007B005D008F005900AA005C00E7005B00FF005A00FF005900
+FF005800FF005700FF005700FF005700FF005E0007005E0007005E0007005E
+0007005F000700600007006100070061000600620006006200060063000600
+630006006300070063000D006300140064001C005F00240059002E00560038
+005600440056005300560065015500790052008E004F00A9005100DD005200
+FF005000FF005000FF004F00FF004F00FF004E00FF004E00FF006200060062
+00060062000600620006006300060063000600640005006500050065000500
+6600050066000400670004006700050066000C006000130058001A00530023
+004E002B034B0033054A003F0449004E04480061064800750648008A034600
+A4014600CC014600EF014500ED014400EB014300EA014200E9014200E80141
+00E70265000500650005006500050065000500660005006700040068000400
+680004006900040069000300690003006A000300640003005C000900540010
+024B00160743001D0D3C00231338002D1539003A113900490E38005B0E3800
+6E0D3800840B38009D093800C1073700DB063600DA073500D9073400D80833
+00D8083300D7083200D7086900040069000400690004006900040069000300
+6A0003006A0003006B0003006B0002006C0002006A000200610001005A0101
+014E00040745000A0C3B001011330016172C001E1C2800281C2600351A2600
+4418250054162500661624007B15240094142600B5112600CF0F2500CE1024
+00CD102300CC102200CC112100CC112100CB116B0002006B0002006B000200
+6B0002006C0002006C0002006D0001006D0001006E000100670000005F0300
+005A060000520800004202000C370004132D000A192500101E1F0018211A00
+242116002F2013003C1E11004B1E10005C1F0E006F1F0E00861E1000A51A12
+00C3181000C2180F00C2190E00C1190E00C1190D00C1190D00C1196E000100
+6E0001006E0001006E0001006F000100700001007000010070000000660300
+005E070000570A0000500D0000490E00003C0A000A2C0400161F0102201600
+08240F00122609001D28050028280101342700024225000454230006672100
+087C1F00069A200003BD1E0004BC1E0005BC1E0006BC1D0006BC1D0007BC1D
+0007BC1D720000007200000072000000720000007200000073000000700300
+00650700005C0B0000540E00004D110000471300004115000135110009270C
+00151808001F0502002900040C2A00081927000B2623000D3320000F421D00
+10531B0012661900147B1900149A1B0012BC1B0012BC1B0013BC1A0014BD1A
+0014BD1A0014BD1A0014BD1A76010000760100007601000076010000770200
+0070060000640B00005A0F0000521200004A150000441700003F190000391A
+00012E180009211500121312001A020D012400110E2200151B1E0017281A00
+1A3517001B4314001C5413001E661200207C1300209A16001EC417001FC417
+001FC4160020C4160020C4150020C4150021C4157A0400007A0400007A0400
+007B0400006F0A0000620F0000581300004F17000048190000411B00003B1D
+0000361F000032200000272000061C1E000E0D1B00160118041D001D111A00
+211D16002429120026370E0028460C002A560B002B680B002D7D0C002D980D
+002BC20D002CC30C002CC30C002CC30B002DC30B002DC30A002DC30A710C00
+00710C0000710C00006E0E000061130000561800004D1B0000451E00003E20
+000038210000332300002F2500002B26000022280001162700090822001200
+24071500291311002D1E0D00312A09003538060039470400395903003A6A03
+003A7E02003898020039C0020039C7020039C702003AC702003AC702003AC8
+02003AC80262170000621700006217000060180000551C00004B1F00004322
+00003B24000036260000312700002C290000282B0000242D00001B2F00000F
+2E0007022B010F00310A0C0035140800381E05003B2903003F360300424503
+004257030041690200427E01004198000043C4000042D4000042D4000042D4
+000042D4000042D4000042D400552000005520000055200000532100004924
+0000412600003A280000332A00002E2C0000292E000024300000203200001C
+33000014350000083500050033020C00380A09003C1306003D1C0500402604
+00453304004842040049540300496802004B7D00004B9900004BC600004AE0
+00004AE000004AE000004AE000004AE000004AE0004A2800004A2800004A28
+0000482800003F2B0000382D0000302F00002B32000025340000203600001C
+3700001839000017390000123B00000A3A00050139020D003D090B00421107
+00441A0600462305004B2F04004F3E05005051040052660200547C00005597
+000053C2000052E9000052E9000052E9000052E9000052E9000052EA003F2F
+00003F2F00003F2F00003E300000353200002E35000027380000223A00001D
+3C0000183D0000183E0000183E0000183F0000134000000C400004023F010D
+0043070C00480F08004C1806004E210500522C0500563A0600584C05005B62
+03005E7900005F9400005DBA00005BED00005BED00005BED00005BED00005B
+ED00005BED00353800003538000035380000333800002B3B0000243E00001E
+4000001942000019420000194300001A4300001A4400001A44000015460000
+0E4700030346000D004A060D00500D0A0055160600581F05005C2906005F37
+060061480600645D0300687500006A8F000068B1000066E7000066E7000066
+E6000066E6000066E6000066E6002A4100002A4100002A4100002841000021
+4400001B4600001A4700001B4800001B4800001B4900001B4A00001B4A0000
+1B4B0000174D0000104F0002054F000B0052040E00580B0B005F130700651C
+0500682605006B3304006C4205006F580300736F0000768A000076AE000074
+F6000074F6000074F7000074F7000074F7000074F700204A0000204A000020
+4A00001F4A00001C4C00001C4D00001C4E00001C4E00001C4F00001C500000
+1D5000001D5100001D520000195500001358000209590009005C020E006208
+0B006A1008007219050077230300792E02007B3C01007C5001007F68000084
+84000085AA000083FC000082FF000082FF000083FF000083FF000083FF001D
+5200001D5200001D5200001D5200001D5300001D5400001E5500001E560000
+1E5700001E5700001E5800001E5900001E5900001A5D0000156100010C6400
+070166000E006D060C00750C08007E140500851E0200892800008B3600008C
+4900008E610000937E000097A3000091E2000091FF000091FF000091FF0000
+91FF000091FF001F5A00001F5A00001F5A00001F5A00001F5B00001F5C0000
+1F5D00001F5E00001F5F0000206000002061000020610000206200001C6700
+00176C0000107000040674000A007A020C00840808008D0E0500961602009B
+2000009E2D0000A03F0000A3570000A9760000B0980000A7CC0000A3FB0000
+A3FA0000A3FA0000A4FA0000A4FA0020630000206300002063000020630000
+2065000020660000216700002168000021690000216A0000216A0000216B00
+00216C00001E71000019780000147F00010C850004058D000800940208009E
+070400AB0C0100B8150000C2220000C7320000CC490000D6670000DB880000
+DCAF0000CFF50000D0F50000D0F60000D0F60000D1F600226D0000226D0000
+226D0000226E0000226F000022700000227200002273000022740000237500
+002376000023770000237800001F7E00001B860000168E0000119600000C9E
+000007A8000101B3000300C1020100D80A0000EA180000FA270000FF380000
+FF5D0000FF730000FF990000FFB20000FFB20000FFB20000FFB20000FFB200
+23780000237800002378000023780000237800002378000023780000237800
+002378000023780000237800002378000023780000207E00001B860000168E
+0000119600000C9E000007A7000001B2000400C0020200D6090000E9170000
+F9260000FF340000FF5A0000FF6F0000FF8F0000FFB20000FFB20000FFB200
+00FFB20000FFB2002378000023780000237800002378000023780000237800
+0023780000237800002378000023780000237800002378000023780000207E
+00001B860000178D0000129600000D9E000008A7000001B1000400BF020200
+D4080000E8150000F7250000FF330000FF560000FF6D0000FF870000FFAA00
+00FFB20000FFB20000FFB20000FFB200>
+<41001300410013004100130041001300410013004100130041001300410012
+0042001200420012004300120043001200430012004200160041001D004300
+230046002A004B00320051003C00570047005C0055005F0065005F0076005D
+008B005B00A7005E00DD006100FD006100FD006100FD006100FD006100FD00
+6100FD006100FD004100130041001300410013004100130041001200420012
+00420012004300120043001200440012004400110044001100450011004300
+150042001D004400230047002A004C00320052003B00580047005D00550060
+006400600076005E008A005C00A5005E00D7006200FE006200FE006200FE00
+6200FE006200FE006200FF006200FF00430012004300120043001200430012
+00430012004300120044001100440011004500110045001100460011004600
+1100460010004500150043001C004500230049002A004D00320053003B0059
+0047005E005400610064006100760060008A005D00A4005E00D1006300FF00
+6300FF006300FF006300FF006300FE006300FE006300FE0044001100440011
+00440011004400110045001100450011004600110046001100470010004700
+10004700100048001000480010004700140045001C00460022004A0029004E
+00310054003B005A0046005F0054006200640063007500610089005F00A300
+5F00CD006300FE006300FE006300FE006300FE006300FE006300FE006300FE
+00460011004600110046001100460011004600100047001000470010004800
+10004800100049000F0049000F004A000F004A000F004900130047001B0048
+0022004C0029005000310055003B005B004600600054006300630064007500
+630089006000A1006000CA006400FD006400FD006400FD006400FD006400FD
+006400FD006400FD0048001000480010004800100048001000480010004900
+0F004A000F004A000F004B000F004B000E004C000E004C000E004C000E004B
+0012004A001A004A0021004D0028005200300056003A005C00460061005400
+6500630066007500640088006200A0006100C6006500FC006500FC006500FC
+006500FC006500FC006500FC006500FC004A000F004A000F004A000F004A00
+0F004B000F004B000E004C000E004C000E004D000E004E000D004E000D004E
+000D004F000D004E0012004C0019004D0020004F0027005300300057003A00
+5D0045006300530066006300670074006600880064009F006200C2006600FA
+006600FA006600FA006600F9006600F9006600F9006600F9004D000E004D00
+0E004D000E004D000E004D000E004E000D004E000D004F000D0050000D0050
+000C0051000C0051000C0052000C00500010004F00180050001F0051002600
+55002F00590039005E0045006400530068006300690074006800870065009E
+006200C1006400FF006300FF006200FF006100FF006100FF006000FF006000
+FF004F000D004F000D004F000D004F000D0050000D0051000C0051000C0052
+000C0052000C0053000B0054000B0054000B0054000B0054000F0053001600
+53001E005400260057002E005A0039005F0045006500530065006200630073
+005F0086005B009F005900C7005B00FF005A00FF005900FF005800FF005700
+FF005700FF005600FF0052000C0052000C0052000C0052000C0053000B0054
+000B0054000B0055000B0055000A0056000A0057000A0057000A0058000A00
+57000E005600150057001D005800250059002D00570037005800420059004F
+005A005F00590071005600860052009F005100C9005200FF005000FF004F00
+FF004F00FF004E00FF004E00FF004D00FF0056000A0056000A0056000A0056
+000A0056000A0057000A0057000A0058000A0059000900590009005A000900
+5A0009005B0009005B000C005A00140058001B00520023004F002B004D0033
+004D003E004E004B004E005C004E006F004C00840049009D004800C4004800
+FD004700FC004600FB004500FA004500F9004400F8004400F8005900090059
+0009005900090059000900590009005A0009005B0009005B0008005C000800
+5D0008005D0008005E0008005E0008005C000B00540012004D001900490021
+004500270442002F0643003A03430048014200590341006C03420081014000
+99003F00BA003E00EA003D00E8003C00E6003B00E5003A00E4003A00E3003A
+00E3005C0008005C0008005C0008005C0008005D0008005E0008005E000700
+5F000700600007006000070061000700610006005A000500530008004A000E
+02420014073A001A0E3400201430002915310036103200440C3200540B3200
+660A32007A08320092063200B1043100D8033000D6042F00D5042E00D5042E
+00D4042D00D4052D00D3056000070060000700600007006000070061000700
+61000600620006006300060064000600640005005E00040057000300500001
+02450003043D00090935000E0F2D00141527001C1924002619220032172100
+401420004F13200060121F0073121F0089112100A70E2300CB0B2100CA0B20
+00CA0C1F00C90C1E00C80C1E00C80D1D00C80D640005006400050064000500
+6400050065000500660005006600050067000400670004005C000200550001
+014B030000470500003D0300073200030F2900081521000F1A1B00171C1700
+221D13002D1B100039190E0047190C00571A0B00681A0B007D1A0C00981710
+00BF130E00BE140D00BE140C00BD150B00BD150A00BC150A00BC1569000400
+69000400690004006900040069000400690003006A000300640002005A0101
+00520400014B07000045090000400B0000380A00042A0400111D01021B1400
+081F0E00112107001B22030126220102322000033F1E0005501C0006621B00
+08751900078F1A0004B3190005B7190006B7180006B7180007B7180007B718
+0007B7186C0002006C0002006C0002006C0002006C0002006C000200620000
+005A04000051080000490B0000430D00003E0F00003911000031110004240C
+000F160800190502002300040B2300081820000B241C000E3119000F3F1600
+0F4F15001161140013741300148D150011B1160012B8160012B8160013B815
+0013B9150013B9150013B9156F0001006F0001006F0001006F0001006F0001
+0062030000590800004F0C0000470F0000411100003B130000361500003117
+00002A1700041F14000D11110015010C011E00100E1C00141A180017261400
+193310001A410E001B510D001C620C001E750D001F8D0F001DB213001DBD12
+001DBD11001EBD11001EBD10001EBD10001FBD106A0400006A0400006A0400
+006A04000062070000570C00004D100000451300003E150000381800003219
+00002E1B00002A1D0000251E00011A1D00090C1A001100180417001C101400
+201C100023280B00253408002643060027530500296405002A7605002A8D07
+0028AD0A0027BC0A0027BC0A0027BC0A0027BC0A0027BC0A0027BC0A5D0D00
+005D0D00005D0D00005D0D0000561000004C140000431700003C1A0000351C
+0000301E00002B20000027220000242300001F250000142500050621000D00
+23070E0028120B002B1D06002E280300303401003243010031530200316303
+0031750400308B05002EAB07002DBF07002DBF07002DBF07002DBF07002EBF
+07002EBF07501600005016000050160000501600004A180000411B0000391E
+0000332000002D2200002924000024260000202800001D290000172B00000D
+2C00020129010A002D0808002F110700301B05003325030036310200394002
+00395002003861030038730300378A030037AA030036C5040036C5030037C5
+030037C5030037C5030037C503441E0000441E0000441E0000441E00003F20
+000037220000302400002B27000026290000212B00001C2D0000182E000015
+2F0000123000000C310001022E000900300709003410070035190600382304
+003B2E0300403D0200404D0300405F0300407202004089010040AB010040D0
+010040D1010040D1010040D1010040D1010040D1013A2600003A2600003A26
+00003A260000362700002E290000282C0000232E00001D3000001932000015
+3300001534000016340000143500000E360001043300090034050B003A0E08
+003B1706003D200500412B040046390300484A0300485D0300497101004A89
+00004BAC000049DE000049DE000049DE000049DE000049DE000049DE00302D
+0000302D0000302D0000302D00002C2E0000253100001F3400001A36000016
+37000017380000173800001739000017390000153A00000F3B000106390009
+003A040D003F0C090043150600441D0500482804004C3505004F460500515A
+0400526F01005488000055AA000051E9000051E9000052E9000052E9000052
+E9000052E90026360000263600002636000026360000233700001C3A000018
+3B0000183C0000183D0000183D0000183E0000183E0000183F000017400000
+11410000084000080040030E00450A0B004B1207004D1B0500502505005531
+0500574106005A5505005D6D01005F85000060A500005CE400005CED00005C
+ED00005CED00005CED00005CED001D3E00001D3E00001D3E00001D3E000019
+400000194100001941000019420000194300001A4300001A4400001A450000
+1A45000019460000134800000B4800060048010F004D080C00541008005819
+06005B2205005F2E0600623D060064500500686702006B8000006C9E000068
+C9000068E8000068E8000068E8000068E8000068E8001A4600001A4600001A
+4600001A4600001A4600001B4700001B4800001B4900001B4A00001B4A0000
+1B4B00001C4B00001C4C00001A4D0000155000000D5200050252000E005706
+0D005D0D0900641606006A2004006D2A04006F370400714903007460020078
+7A00007998000077C9000078FB000078FB000078FB000078FB000078FB001C
+4D00001C4D00001C4D00001C4D00001C4E00001C4E00001C4F00001D500000
+1D5100001D5200001D5200001D5300001D5400001C55000017590000105B00
+04065D000B0061040D00680A0A0071120700781B04007D2602007F32010081
+42000082580000867200008A93000089C6000087FF000087FF000087FF0000
+87FF000087FF001E5500001E5500001E5500001E5500001E5600001E570000
+1E5800001E5900001E5900001F5A00001F5B00001F5C00001F5C00001E5E00
+0019620000136700020A6A0008016D010D0075060A007F0D0700871504008E
+1F0100912A0000923A000094500000976A00009E8C00009DB8000097FF0000
+97FF000097FF000098FF000098FF001F5E00001F5E00001F5E00001F5E0000
+1F5F0000206000002061000020620000206300002064000020650000206500
+0021660000206800001B6E0000167400000F790004067E00090086020A008F
+070700990D0300A3150100AA200000AD2F0000AE430000B65F0000BD830000
+BFA80000B1F70000B1F70000B1F70000B2F70000B2F7002169000021690000
+216900002169000021690000216B0000216C0000216D0000226E0000226F00
+00227000002271000022720000217400001D7B000019830000148B00000F93
+0000089B000201A4000500B3040300C5080000D9120000E9200000FE300000
+FF500000FF6B0000FF870000FFB20000FFB20000FFB20000FFB20000FFB200
+23750000237500002375000023750000237600002377000023780000237800
+002378000023780000237800002378000023780000227A00001E8100001989
+0000159100000F9900000AA2000005AB000200B8010300C9040100E00F0000
+F01E0000FF2D0000FF4B0000FF690000FF810000FFA70000FFB20000FFB200
+00FFB20000FFB2002378000023780000237800002378000023780000237800
+00237800002378000023780000237800002378000023780000237800002279
+00001E8100001A89000015910000109900000BA1000005AB000100B7010300
+C7040100DF0E0000EE1C0000FE2C0000FF450000FF650000FF7B0000FF9E00
+00FFB20000FFB20000FFB20000FFB200>
+<41001300410013004100130041001300410013004100130041001300410013
+004100130041001300410013004100130041001300410013003F001A003F00
+20004100270047002E004C0036005200410057004E005B005D005C006E005B
+00820058009B005900C3005E00F9005E00F9005E00F9005E00F9005E00F900
+5E00F9005E00F9004100130041001300410013004100130041001300410013
+00410013004100130041001300410013004100130041001300410013004100
+13003F001A003F0020004100260047002E004C0036005200410057004D005B
+005C005C006D005B00810058009B005900C1005E00F9005E00F9005E00F900
+5E00F9005E00F9005E00F9005E00F900410013004100130041001300410013
+00410013004100130041001300410013004100130041001300410013004100
+130041001300410013003F001A003F0020004100260047002E004C00360052
+00400057004D005B005C005C006D005B00810058009A005900BF005E00F900
+5E00F9005E00F9005E00F9005E00F9005E00F9005E00F90041001300410013
+00410013004100130041001300410013004100130041001300410013004100
+1300410013004100130041001300410013003F0019003F0020004100260047
+002E004C0036005200400058004D005B005C005D006C005C00800059009800
+5900BD005F00FA005F00FA005F00FA005F00FA005F00FA005F00FA005F00FA
+00410013004100130041001300410013004100130041001300410013004100
+13004100130041001300410013004200120042001200420013004000190040
+001F004300260048002D004D0035005300400059004D005D005B005E006C00
+5E007F005B0097005A00BA006000FC006000FC006000FC006000FC006000FC
+006000FC006000FC0041001300410013004100130041001300410013004100
+13004200120042001200430012004300120043001200440012004400110044
+0012004200180042001F004500260049002D004E00350054003F005A004C00
+5E005B0060006B005F007E005D0096005C00B8006100FE006100FE006100FE
+006100FE006100FE006100FE006100FE004300120043001200430012004300
+12004300120043001200440012004400110045001100450011004500110046
+00110046001100460011004400180043001E00470025004A002C004F003500
+55003F005B004C005F005A0061006B0061007E005E0094005D00B5006300FF
+006300FF006300FF006300FF006200FF006200FF006100FF00450011004500
+11004500110045001100450011004500110046001100460010004700100047
+001000480010004800100048001000490010004700170046001E0049002500
+4C002C005000340056003F005C004B0061005A0063006A0061007D005D0094
+005900B5005C00FF005B00FF005900FF005800FF005800FF005700FF005700
+FF004700100047001000470010004700100047001000480010004800100049
+000F0049000F004A000F004A000F004B000F004B000E004B000E004A001500
+49001D004A0024004E002B005200340057003E005A004A005C0059005B006A
+0058007D00540094005000B8005200FF005100FF004F00FF004F00FF004E00
+FF004D00FF004D00FF004A000F004A000F004A000F004A000F004A000F004A
+000F004B000E004C000E004C000E004D000E004D000E004E000D004E000D00
+4F000D004D0014004C001C004D0023004D002A004D0032004E003B00500047
+0051005700510068004F007D004B0095004900B7004900FF004700FF004600
+FF004500FE004500FE004400FE004400FE004D000E004D000E004D000E004D
+000E004D000E004E000D004E000D004F000D004F000D0050000D0050000C00
+51000C0051000C0052000C00500013004B001A00470021004500280045002F
+004500380046004400470054004600670046007C00430094004000B4003F00
+F4003E00F6003D00F4003C00F3003B00F3003B00F2003B00F20050000C0050
+000C0050000C0050000C0050000C0051000C0052000C0052000C0053000B00
+53000B0054000B0054000B0055000B0051000A004A0010004400180040001E
+023B00240739002B093B0036033D0043003C0052003B0064013B0079003900
+90003700AD003500E1003400E7003300E5003200E3003200E2003100E10031
+00E10054000B0054000B0054000B0054000B0054000B0055000B0055000B00
+56000A0057000A0057000A0058000A00550009004E0008004800070041000D
+013A0012073300180D2D001E122A0027132B00330E2D00400A2C004F082C00
+60072B0073062C0089042C00A5022B00CD012A00D5012900D4012800D30128
+00D2022700D2022700D10258000A0058000A0058000A0058000A0058000A00
+58000900590009005A0009005A0009005B000900530007004C000600440004
+003E000202370007062F000D0C2900131123001A15200024151E002F131D00
+3C101C004A0F1B005A0E1B006C0E1B00810D1C009A0B1E00BE071D00C8071C
+00C7081B00C6081A00C6081A00C5091900C5095C0008005C0008005C000800
+5C0008005C0008005D0008005D0008005E0008005A00070052000500470003
+00400001023B010003370400022D00020B250007111E000E15190016181500
+201811002B170D0036150B00421509005215080062160700751608008D140B
+00AD110B00BA100A00B9100900B8110800B8110700B7110700B71160000700
+600007006000070060000700600007006100070062000600590004004E0002
+00440101013F0300023B06000136080000330A00002705000B1A0101161200
+071A0C00101C06001A1D0201241C01022F1A00043C1800054C1600065D1500
+087014000886140006A3140006B3130006B3130007B2130007B2130008B213
+0008B212650005006500050065000500650005006500050063000400570002
+004C010002440500003F070000390A0000350C0000300E00002D100000220C
+000A140800140402001E00040B1D0008171A000B2316000E2F13000F3C1000
+104B0E00105D0D00126F0D0013840F0011A1110011B4110011B4100012B410
+0012B4100012B4100013B4105F0002005F0002005F0002005F0002005F0002
+00570100014B050000440800003D0B0000370E0000321000002D1200002914
+0000261600001C14000810110010010C011900100D16001419120017250E00
+18310A00193E07001A4D06001B5E06001D6F06001D8308001CA00C001BB60C
+001BB60C001BB70C001BB70C001BB70C001BB70C5505000055050000550500
+0055050000550500004B090000430C00003B0F0000351200002F1400002A16
+000027180000231A0000201C0000181C00040A19000C00170411001B100E00
+1F1B0A00222605002333010023400100224F0100235E0200236E0400238207
+00219D0A001FB90C0020B90C0020B90C0020B90C0020B90C0020B90C490D00
+00490D0000490D0000490D0000490D00004110000039130000321600002D18
+0000281B0000241D0000201F00001D2100001A22000012230001051E000800
+2107080024100700261A06002725030028300100283E0100284D0100285C02
+00286C040028810600279C090025BB0B0025BB0B0025BB0B0025BB0B0025BB
+0B0025BB0B3F1500003F1500003F1500003F1500003F15000037180000301A
+00002A1D0000261F0000212100001D2300001925000015260000122700000D
+280000042500060024050800280E07002A1806002B2204002D2E02002F3B01
+002F4A01002E5A02002F6B03002E7F05002D9A07002BBE08002BBE08002BBE
+08002BBE08002BBE08002BBE08351C0000351C0000351C0000351C0000351C
+00002E1F000028210000232400001E2600001928000015290000132A000013
+2B0000132B00000F2B0000062A00050029030A002D0C07002E160600302004
+00332B020036380100374702003658020036690300367E03003598040034C3
+040034C3040034C4040034C4040034C4040034C4042C2400002C2400002C24
+00002C2400002C24000026260000202900001B2B0000162C0000142D000014
+2E0000142E0000142F0000142F000010300000082F0004002D020B00310A08
+0034130600351D0500382803003C340200404402003F5502003F6802003F7C
+01003E9801003FC601003FCE01003FCF01003FCF01003FCF01003FCF01232B
+0000232B0000232B0000232B0000232B00001D2E0000173000001531000015
+3200001532000015330000153300001534000016340000123500000A350003
+0032000C0036080A003A1106003C1A05003E24040043310300474003004852
+030048660200497C00004998000049C9000048DE000048DE000049DE000049
+DE000049DE001A3400001A3400001A3400001A3400001A3400001635000016
+360000163600001637000017380000173800001739000017390000173A0000
+133B00000D3B00020238000C003C070B00410F080044180600462105004A2D
+04004E3B0500504E040052630300547A00005697000053C5000052EA000052
+EA000052EA000052EA000052EA00173A0000173A0000173A0000173A000017
+3A0000173B0000183C0000183C0000183D0000183E0000183E0000183F0000
+193F000019400000154100000F4200010440000B0043050D00490D09004D15
+06004F1E050053290500573706005A4906005C5F0300607700006293010060
+BB00005DED00005DED00005EED00005EED00005EED00194100001941000019
+41000019410000194100001942000019420000194300001A4400001A440000
+1A4500001A4600001A4600001A47000017490000124A0001074A000A004C03
+0E00520B0B00581307005D1C0500602605006333050065430600685904006C
+7100006E8C00006DB200006BEC00006BEC00006BEC00006CEC00006CEC001B
+4800001B4800001B4800001B4800001B4800001B4900001B4A00001B4A0000
+1B4B00001C4C00001C4D00001C4D00001C4E00001C4E000019510000145300
+000A5500080056010F005C080C00641008006B19050070230400722E030074
+3D0200765102007A6900007E8600007EAE00007CFF00007CFF00007DFF0000
+7DFF00007DFF001D5000001D5000001D5000001D5000001D5000001D510000
+1D5200001D5300001D5300001D5400001E5500001E5600001E5600001E5700
+001B5A0000165E00000E6100050362000D0068050C00700C09007914050080
+1D0300842801008635000088480000896100008F7F000092A700008DFD0000
+8DFF00008DFF00008DFF00008DFF001E5900001E5900001E5900001E590000
+1E5900001F5A00001F5B00001F5C00001F5D00001F5E00001F5F00001F5F00
+0020600000206100001D64000018690000116E0003087100090077010C0080
+070900890D050092150200981F00009C2C00009D3E0000A0570000A6770000
+AC9D0000A2DD0000A1FC0000A1FC0000A1FC0000A1FC002063000020630000
+20630000206300002063000020650000206600002167000021680000216900
+00216A0000216B0000216B0000216C00001F7000001A770000167E00000F84
+0003078C000600930109009C060500AA0B0200B7130000C21F0000CA2F0000
+CE470000D8660000DE890000E0B70000D2F70000D3F80000D4F80000D4F900
+22700000227000002270000022700000227000002271000022720000227300
+00227500002376000023770000237800002378000023780000217C00001C84
+0000188C0000139400000D9C000008A5000002B0000300BE020200D3080000
+E8150000F8260000FF350000FF5C0000FF740000FF9C0000FFB20000FFB200
+00FFB20000FFB2002378000023780000237800002378000023780000237800
+00237800002378000023780000237800002378000023780000237800002378
+0000217C00001C840000188C0000139400000E9C000009A5000002AF000300
+BD020200D1070000E7140000F7240000FF330000FF580000FF6F0000FF9400
+00FFB20000FFB20000FFB20000FFB200>
+<41001300410013004100130041001300410013004100130041001300410013
+00410013004100130041001300410013004100130041001300400015003E00
+1C004000230042002A00490032004F003B00550047005A0056005C0066005C
+007900590090005800B1005E00F9005E00F9005E00F9005E00F9005E00F900
+5E00F9005E00F9004100130041001300410013004100130041001300410013
+00410013004100130041001300410013004100130041001300410013004100
+1300400015003E001C004000230042002A00490032004E003B00550047005A
+0055005C0066005C007800590090005800B0005E00F9005E00F9005E00F900
+5E00F9005E00F9005E00F9005E00F900410013004100130041001300410013
+00410013004100130041001300410013004100130041001300410013004100
+13004100130041001300400015003E001C004000230042002900490032004E
+003B0055004700590055005C0065005C00780059008F005800AE005E00F900
+5E00F9005E00F9005E00F9005E00F9005E00F9005E00F90041001300410013
+00410013004100130041001300410013004100130041001300410013004100
+130041001300410013004100130041001300400015003E001C004000230042
+002900490031004E003B0055004600590055005C0065005C00770059008E00
+5800AD005E00F9005E00F9005E00F9005E00F9005E00F9005E00F9005E00F9
+00410013004100130041001300410013004100130041001300410013004100
+1300410013004100130041001300410013004100130041001300400015003E
+001C004000230042002900490031004E003A0055004600590054005C006500
+5C0076005A008D005800AB005E00F7005E00F9005E00F9005E00F9005E00F9
+005E00F9005E00F90041001300410013004100130041001300410013004100
+13004100130041001300410013004100130041001300410013004100130041
+001300400015003E001C004000230042002900490031004E003A0054004600
+590054005C0064005C0076005A008C005800A9005E00F3005E00F9005E00F9
+005E00F9005E00F9005E00F9005E00F9004100130041001300410013004100
+13004100130041001300410013004100130041001300410013004100130041
+0013004100130041001300400015003E001C00400022004200290049003100
+4E003A0054004500590053005C0064005C0075005A008B005800A8005D00EB
+005E00FC005D00FF005C00FF005B00FF005A00FF005900FF00410013004100
+13004100130041001300410013004100130041001300410013004100130041
+00130041001300410013004100130041001300400015003F001C0040002200
+43002900490031004F003A00550045005A0053005C0063005A00750056008A
+005100A9005400EE005300FF005100FF005000FF004F00FF004E00FF004E00
+FF004100130041001300410013004100130041001300410013004100130041
+00130042001200420012004200120043001200430012004300120043001400
+41001B0042002200450028004A0030004E0039005100430053005100530062
+00510075004E008B004900AA004900E8004800FE004700FE004600FE004500
+FE004400FD004400FD00420012004200120042001200420012004200120043
+00120043001200440012004400110044001100450011004500110046001100
+460011004600130043001B00440021004200270044002E0046003600490041
+004A005000490061004800750045008D004200AA004000E0003E00FA003D00
+F9003C00F8003C00F7003B00F7003B00F60045001100450011004500110045
+00110045001100450011004600110046001000470010004700100048001000
+480010004800100049000F0047001200420018003E001F003D0025003D002C
+003E0034003F003E0040004E003F0060003E0074003C008C003900A8003700
+D6003500F0003400EF003300EE003300EE003200ED003200EC004800100048
+0010004800100048001000480010004800100049000F0049000F004A000F00
+4A000F004B000F004B000E004C000E0046000D0041000F003C00150037001B
+0433002108310028093500330336003E0034004D0033005E00320071003100
+88002F00A3002E00CC002C00E4002B00E3002B00E2002A00E1002A00E00029
+00E0004B000E004B000E004B000E004B000E004B000E004B000E004C000E00
+4D000E004D000E004E000D004F000D004A000C0044000B003F000A003A000B
+00330010052D00160A29001D0E2600250F2700300B28003D0727004B042600
+5B0325006C022500810125009B012500BD002400D4002300D3002200D20022
+00D1002100D1002100D0004F000D004F000D004F000D004F000D004F000D00
+4F000D0050000C0051000C0051000C004F000B0047000A00410009003C0007
+0037000501310006032B000C092500120D200019111D0022111B002D0E1A00
+390C1800460A1700550A1600660916007909170090071800AF051900C60417
+00C5041700C4051600C3051500C3051500C20553000B0053000B0053000B00
+53000B0053000B0053000B0054000B0055000B004E000A00450008003F0006
+0038000401320002022E0001042B0102062200070C1C000D11170015131300
+1F130F0029120C00331109003F1007004D1006005D1105006F110500841007
+009F0E0800B60C0700B50C0600B40D0500B40D0500B30D0400B30D58000A00
+58000A0058000A0058000A0058000A0058000A00570009004C000700430005
+003B00030234010103300200032E0400022B06000125060005180101101000
+07150B00101705001A170201231600022D1400043912000648100007590E00
+086B0E00087F0E0007970E0006AF0E0007AF0E0007AF0D0008AF0D0008AF0D
+0008AF0D5800070058000700580007005800070058000700560007004B0005
+00400002023801000434040002300600012D090000290B0000250D0000200C
+00041308000F0402001900050B1800081714000B2210000D2D0D000F3A0A00
+0F48080010590700116A0700127D080011950A0010AF0B0010AF0A0011AF0A
+0011AF0A0011AF0A0012AF0A4A0003004A0003004A0003004A0003004A0003
+00480002003F02000339050001330800002F0B00002A0D0000260F00002211
+0000201300011A1300030E10000B000C011400100D100013190D0016240800
+172F0400183C0100184A00001859010018690300187C05001793090015B10B
+0015B10B0015B10B0015B10B0015B20B0015B20B4105000141050001410500
+0141050001410500013F06000038090000320C00002D0F0000281100002314
+0000201600001D1800001A190000151B0001091800070017040B001B100800
+1D1A06001D2404001D2E01001D3B00001C4900001C5801001C6703001C7905
+001B91090019B40C0019B50C0019B50C0019B50C0019B50C0019B50C390D00
+00390D0000390D0000390D0000390D0000370D0000301000002A1300002516
+0000211800001D1A00001A1C0000161E0000131F00000E1F0000061B000300
+1B0408001E0D08002017070021220400212C02002139000021470100215601
+002165030021780500208F08001EB30D001DB80D001DB80D001DB80D001DB8
+0D001EB80D30140000301400003014000030140000301400002E1500002817
+0000231A00001F1D00001A1F0000162100001222000011220000112300000F
+23000008210003001D020800220B070024150700251F0500262A0200263601
+0026450100265402002664030026760500268D070023B00B0023BB0B0023BB
+0B0023BB0B0023BB0B0023BB0B281B0000281B0000281B0000281B0000281B
+0000261C0000211F00001C2100001723000012250000112500001226000012
+26000012260000112700000A26000100210009002609080027120700291D05
+002B2703002C3401002D4201002C5202002D6203002D7404002C8B06002AAD
+090029BD090029BD090029BD090029BD09002ABD0920230000202300002023
+000020230000202300001F2300001926000013280000122800001229000013
+29000013290000132A0000132A0000122A00000C2B000102280008002A0709
+002D1007002E1A06003024030033300200363F0100354F0200356003003572
+0300348A040033AC050032C2050032C2050033C2050033C3050033C305172A
+0000172A0000172A0000172A0000172A0000162A0000132B0000132C000013
+2C0000142D0000142D0000142E0000142E0000142E0000132F00000E300000
+042E0007002E050A00330E070034170600362104003A2D03003E3B02003F4B
+02003E5D02003E7102003E8901003EAC01003ECD01003ECE01003ECE01003E
+CE01003ECE01142F0000142F0000142F0000142F0000142F00001430000015
+30000015310000153100001532000015320000153300001533000016340000
+153400000F360000063500070033030C00380C08003B1506003D1E05004029
+04004536030048470300485A0300497001004A8800004AAE000049DE000049
+DE000049DE000049DE000049DE001635000016350000163500001635000016
+35000016350000163600001637000016370000173800001738000017390000
+17390000173A0000173B0000123C0000093B0006003A020D003F0A0A004412
+0700451B0600482505004D3205005042050052560400546D01005687000057
+AA000053EB000053EB000053EB000053EB000053EB00183C0000183C000018
+3C0000183C0000183C0000183C0000183C0000183D0000183E0000183F0000
+193F000019400000194000001941000019410000144300000C430005014201
+0E0047080C004D1008005018060053220500572E06005A3D06005D51050061
+6901006383000064A4000060E9000060EB000060EB000060EB000060EB0019
+43000019430000194300001943000019430000194300001A4400001A450000
+1A4500001A4600001A4700001B4700001B4800001B4900001B490000164C00
+000F4D0003034C000D0051050D00570D0A005D150600621F0500652A050068
+3805006A4A05006E620200717C0000739C00006FCF000070F2000070F20000
+70F2000070F2001B4B00001B4B00001B4B00001B4B00001B4B00001B4B0000
+1C4C00001C4D00001C4E00001C4E00001C4F00001C5000001D5000001D5100
+001D51000018550000125800020759000A005C030E00630A0B006B12070073
+1B040077260200793202007B4201007D590100817400008596000083D30000
+82FF000082FF000082FF000082FF001D5400001D5400001D5400001D540000
+1D5400001D5400001E5500001E5600001E5700001E5800001E5900001E5900
+001F5A00001F5B00001F5B00001A5F0000156400010C670007016A010D0071
+060B007A0D0800831504008A1E02008D2A00008F39000091500000946B0000
+9B8F000098C0000094FF000094FF000094FF000095FF001F5E00001F5E0000
+1F5E00001F5E00001F5E00001F5E00001F5F00002060000020610000206200
+0020630000206400002065000021660000216600001C6C0000187200001077
+0003087C00080083010B008D060700960C0400A1140100A81F0000AC2D0000
+AD420000B45F0000BC840000BDAF0000B0F70000B0F70000B0F70000B1F700
+216A0000216A0000216A0000216A0000216A0000216A0000216B0000216D00
+00226E0000226F000022700000227100002272000022730000227400001E7B
+00001A830000158B0000109400000B9D000004A6000300B3010400C5040100
+DE0E0000EF1D0000FF2E0000FF4E0000FF6B0000FF8A0000FFB20000FFB200
+00FFB20000FFB2002378000023780000237800002378000023780000237800
+00237800002378000023780000237800002378000023780000237800002378
+0000237800001F7F00001B870000168F0000119700000C9F000006A9000101
+B5000300C5030100DD0D0000EE1C0000FE2C0000FF480000FF690000FF8300
+00FFB00000FFB20000FFB20000FFB200>
+<41001300410013004100130041001300410013004100130041001300410013
+00410013004100130041001300410013004100130041001300410013003F00
+19003F001F004100260046002D004C0036005200400057004E005B005E005C
+0070005B0086005800A3005C00E2005E00F9005E00F9005E00F9005E00F900
+5E00F9005E00F9004100130041001300410013004100130041001300410013
+00410013004100130041001300410013004100130041001300410013004100
+1300410013003F0019003F001F004100260046002D004B0035005200400057
+004D005B005D005C006F005B0085005800A2005C00DA005E00F9005E00F900
+5E00F9005E00F9005E00F9005E00F900410013004100130041001300410013
+00410013004100130041001300410013004100130041001300410013004100
+13004100130041001300410013003F0018003F001F004100260046002D004B
+0035005100400057004D005B005D005C006F005B0084005800A1005B00D400
+5E00F9005E00F9005E00F9005E00F9005E00F9005E00F90041001300410013
+00410013004100130041001300410013004100130041001300410013004100
+130041001300410013004100130041001300410013003F0018003F001F0041
+00260046002D004B0035005100400057004D005B005C005C006E005B008300
+58009F005A00D0005E00F9005E00F9005E00F9005E00F9005E00F9005E00F9
+00410013004100130041001300410013004100130041001300410013004100
+1300410013004100130041001300410013004100130041001300410013003F
+0018003F001F004100250046002D004B00350051003F0057004D005B005C00
+5C006E005B00820058009E005A00CD005E00F9005E00F9005E00F9005E00F9
+005E00F9005E00F90041001300410013004100130041001300410013004100
+13004100130041001300410013004100130041001300410013004100130041
+001300410013003F0018003F001F004100250046002D004B00350051003F00
+57004C005B005B005C006D005B00820058009D005A00C9005E00F9005E00F9
+005E00F9005E00F9005E00F9005E00F9004100130041001300410013004100
+13004100130041001300410013004100130041001300410013004100130041
+0013004100130041001300410013003F0018003F001E004100250045002D00
+4B00350051003F0057004C005B005B005C006C005B00810058009B005800C8
+005B00FF005900FF005800FF005700FF005600FF005500FF00410013004100
+13004100130041001300410013004100130041001300410013004100130041
+00130041001300410013004100130041001300410013003F0018003F001E00
+4100250045002C004B00340051003F0056004B0057005A0056006C00530081
+004E009D004D00CB004D00FF004C00FF004B00FF004A00FE004900FE004800
+FD004100130041001300410013004100130041001300410013004100130041
+00130041001300410013004100130041001300410013004100130041001300
+3F0018003F001E004100250045002C00460033004B003D004D004A004C005A
+004B006D004900830045009E004300CA004100FA004000F9003F00F8003E00
+F7003D00F6003D00F600410013004100130041001300410013004100130041
+00130041001300410013004100130041001300410013004100130041001300
+41001300410013003F0018003D001E003C0024003C002B003E00320040003B
+004200490041005B0040006E003E0085003B00A0003900C8003600F3003500
+F2003400F1003400F0003300EF003300EF0041001300410013004100130041
+00130041001300410013004100130041001300410013004100130041001300
+4100130041001300410013003F0012003B00160037001C0035002300350029
+003600310037003B003700480036005A0035006E003300840031009F002F00
+C4002D00EB002C00EA002C00E9002B00E9002B00E9002A00E8004100130041
+00130041001300410013004100130041001300410013004200120042001200
+430012004300120043001200420011003D00100039000F0035001300310019
+022E001F052D0027052E0030022E003B002D0048002B0059002A006C002800
+810027009B002600BD002500E2002400E1002400E0002300DF002200DE0022
+00DE0044001200440012004400120044001200440012004400120044001100
+4500110045001100460011004500110040000F003B000E0037000D0033000B
+002E000F022A00150626001C092400240A24002E0724003A02230047012100
+57001F0067001E007A001E0092001E00B1001D00D4001C00D3001B00D1001B
+00D1001A00D0001A00CF004700100047001000470010004700100047001000
+4700100047001000480010004800100044000F003E000D0039000B0034000A
+00300008002C00070127000B05230011091E00180C1C00210C1A002B091800
+370716004305140051051300610512007305120088041300A2021400C30113
+00C2021200C1021100C0021000BF031000BF034B000F004B000F004B000F00
+4B000F004B000F004B000F004B000E004B000E0043000C003C000B00360009
+00310007012D0005022A000402250002031E0006071A000D0C1500140E1200
+1E0E0F00280D0B00310B09003C0B0600490B0400590C03006A0C03007D0B03
+00940A0500B3080400B1090300B0090200B0090200AF090201AF094F000D00
+4F000D004F000D004F000D004F000D004F000D004A000C0041000A003A0008
+00330006012E0004022A00020326010103210200031D0400031601010B0F00
+07100A001011050019120201221001022B0E0004360C0005450A0006550800
+0767080008790800078E080006AC080007AD080007AD070008AC070008AC07
+0008AC07440009004400090044000900440009004400090044000900400008
+0038000501300003022B00000429030003250500021F0700021D0900021B0B
+0002120800090302001500050C130008170E000A210B000C2C07000E370400
+0E4502000F5501000F6501000F7703000E8C05000CA807000CAC07000CAC07
+000CAC07000CAC07000CAC073A0003023A0003023A0003023A0003023A0003
+023A000302350002022F0100032C04000227070001220900011F0C00011B0E
+000218100002161100020D100006000D020E00100E0B001219070014220400
+132C010013370000134400001353000012630200127404001289060010A608
+000FAE08000FAE08000FAE08000FAE08000FAE083104000231040002310400
+023104000231040002310400022F0600012A090000250C0000200E00011D10
+000119130001161500011317000010180000071600020014040700160D0800
+1717070017210500172B020017360000164300001652000016610200167204
+001587070013A30A0013B00A0013B00A0013B00A0013B00A0013B00A2B0C00
+002B0C00002B0C00002B0C00002B0C00002B0C0000280D0000231000001F13
+00011B16000017180000131A00000F1A00000E1B00000E1B0000091A000100
+16020700190B08001A1507001B1F05001B2903001B3401001A4100001A5001
+001A5F02001A7004001A85070018A20B0017B30C0017B30C0017B30C0017B3
+0C0017B30C2413000024130000241300002413000024130000241300002115
+00001D180000181A0000141C00000F1D00000F1D00000F1E00000F1E00000F
+1E00000B1E000001190007001C0907001E1207001F1C060020260300203201
+001F3F00001F4E01001F5D02001F6E04001F8307001DA00B001BB70C001CB7
+0C001CB70C001CB70C001CB70C1D1B00001D1B00001D1B00001D1B00001D1B
+00001D1B00001A1C0000151F00001020000010200000102100001021000010
+21000010210000102200000D220000031C0005001E06070021100800231A06
+0024240400252F0100253D0100244C0100255B0200256C040025810600239D
+0A0021BA0C0021BA0C0021BA0C0021BA0C0021BA0C15220000152200001522
+00001522000015220000152200001222000011230000112300001124000011
+240000112500001125000012250000122600000E2600000624000500210408
+00260D070027170600292104002B2C02002C3A01002B4901002B5902002C6A
+03002B7F05002A9B080028BD0A0028BD0A0028BD090028BD090028BD091226
+00001226000012260000122600001226000012260000122700001227000012
+28000012280000122800001329000013290000132A0000132A0000102A0000
+082A00030027020A002B0B07002D1406002E1E050031290300343601003546
+01003457020034680300347D04003399050031C2050031C2050032C2050032
+C2050032C205132B0000132B0000132B0000132B0000132B0000132B000013
+2B0000132C0000132C0000142D0000142D0000142D0000142E0000142E0000
+142F0000112F00000B300002012D010A003008090033110600351B05003726
+03003B3202003F4102003F5302003E6602003F7C01003D9801003ECB01003E
+CE01003ECE01003ECE01003ECE011430000014300000143000001430000014
+30000014300000153000001531000015320000153200001533000015330000
+153400001634000016350000133500000D3600010233000A0036060B003B0F
+07003C1806003F220400432E0400473D0400494F0400496303004A7B00004B
+9900004BD000004ADF00004AE000004AE000004AE000163600001636000016
+36000016360000163600001636000016370000163700001738000017390000
+17390000173A0000173A0000173B0000173B0000153C0000103D0001053B00
+0A003D040D00420D090046150600481E05004C29050050380500534A050055
+600300577900005A97000056C9000055EC000055EC000055EC000056EC0018
+3D0000183D0000183D0000183D0000183D0000183D0000183E0000183F0000
+193F0000194000001941000019410000194200001942000019430000174400
+0012460000084500080046030E004B0A0B0051120700551B0500582505005C
+3306005E440600615A0400657300006790000065B9000063E8000063E80000
+64E8000064E8001A4500001A4500001A4500001A4500001A4500001A450000
+1A4600001A4700001B4700001B4800001B4900001B4A00001B4A00001B4B00
+001B4B00001A4D0000154F00000C5100060151010E0057070C005E0F090064
+180600692204006C2E04006E3D040070520300746B00007889000077B50000
+76F9000076F9000076F9000076F9001C4E00001C4E00001C4E00001C4E0000
+1C4E00001C4E00001C4F00001C5000001D5000001D5100001D5200001D5300
+001D5400001D5400001E5500001C570000175A00000F5D0004055F000C0064
+040D006B0B0A00741306007C1D030080280100823500008348000085620000
+8B8100008DAD000089FF000089FF000089FF00008AFF001E5800001E580000
+1E5800001E5800001E5800001E5800001E5900001F5A00001F5B00001F5C00
+001F5D00001F5E00001F5E00001F5F0000206000001E62000019670000136B
+00020A6F00080073000D007C060A00860D06008F140300961F0100992B0000
+9B3D00009E570000A3780000A9A200009FFA00009FFD00009FFD00009FFD00
+20640000206400002064000020640000206400002064000020650000216600
+00216700002168000021690000216A0000216B0000216C0000216D0000206F
+00001C760000177D000011840002098B000501920008009B040600A9090200
+B7110000C41D0000CD2D0000D4440000DD650000E28B0000F3E60000D9FC00
+00DAFD0000DBFD002272000022720000227200002272000022720000227200
+00227300002274000023760000237700002378000023780000237800002378
+000023780000227A00001D820000198A0000149200000F9A00000AA3000003
+AE000200BB010300CF060000E6130000F6240000FF340000FF5C0000FF7600
+00FF9F0000FFB20000FFB20000FFB200>
+<41001300410013004100130041001300410013004100130041001300410013
+00410013004100130041001300410013004100130041001300410013004000
+15003F001B004000220042002900490031004E003B00550047005A0056005C
+0068005C007B00590096005900C1005E00F9005E00F9005E00F9005E00F900
+5E00F9005E00F9004100130041001300410013004100130041001300410013
+00410013004100130041001300410013004100130041001300410013004100
+130041001300400015003F001B004000220042002900490031004E003A0055
+0047005A0056005C0067005C007B00590095005900BF005E00F9005E00F900
+5E00F9005E00F9005E00F9005E00F900410013004100130041001300410013
+00410013004100130041001300410013004100130041001300410013004100
+1300410013004100130041001300410014003F001B00400022004200290049
+0031004E003A00550046005A0055005C0067005C007A00590094005900BC00
+5E00F9005E00F9005E00F9005E00F9005E00F9005E00F90041001300410013
+00410013004100130041001300410013004100130041001300410013004100
+13004100130041001300410013004100130041001300410014003F001B0040
+00220042002900490031004E003A0055004600590055005C0066005C007900
+590093005800BA005E00F9005E00F9005E00F9005E00F9005E00F9005E00F9
+00410013004100130041001300410013004100130041001300410013004100
+13004100130041001300410013004100130041001300410013004100130041
+0014003F001B004000220042002800490031004E003A005400460059005500
+5C0066005C007900590092005800B7005E00F9005E00F9005E00F9005E00F9
+005E00F9005E00F90041001300410013004100130041001300410013004100
+13004100130041001300410013004100130041001300410013004100130041
+00130041001300410014003F001B004000220042002800490031004E003A00
+54004500590054005C0065005C007800590091005800B5005E00F9005E00F9
+005E00F9005E00F9005E00F9005E00FB004100130041001300410013004100
+13004100130041001300410013004100130041001300410013004100130041
+001300410013004100130041001300410014003F001B004000210042002800
+480030004E00390054004500590054005C0065005C007700570090005300B6
+005700FF005500FF005300FF005200FF005100FF005000FF00410013004100
+13004100130041001300410013004100130041001300410013004100130041
+0013004100130041001300410013004100130041001300410014003F001B00
+4000210042002800480030004D003900510044005300530053006400510079
+004C0091004900B7004900FE004700FD004600FC004500FC004400FB004300
+FB004100130041001300410013004100130041001300410013004100130041
+00130041001300410013004100130041001300410013004100130041001300
+410014003F001B00400021004000280041002F004400370048004200480052
+004700650046007A00420094003F00B7003D00F6003B00F5003A00F5003900
+F5003900F4003800F400410013004100130041001300410013004100130041
+00130041001300410013004100130041001300410013004100130041001300
+4100130041001300410014003B001A00390020003800260039002D003B0036
+003D0041003D0052003B0065003A007B00370095003400B7003200EE003100
+ED003000EC002F00EC002E00EC002E00EB0041001300410013004100130041
+00130041001300410013004100130041001300410013004100130041001300
+4100130041001300410013003D001200390012003500180032001E00310025
+0131002D003200360031004200300053002E0066002C007B002B0094002A00
+B5002800E7002700E6002600E5002600E5002500E4002400E4004100130041
+00130041001300410013004100130041001300410013004100130041001300
+4100130041001300410013003D0012003900110035001000310010002E0016
+002B001D03290023032A002D01290037002700440025005400230066002100
+7900200090002000AF001F00DA001E00DD001E00DC001D00DB001C00DB001C
+00DA0041001300410013004100130041001300410013004100130041001300
+4100130041001300410013003F0012003A0011003500100030000E002D000D
+002A000E002700140224001B042200230422002D01200038001E0045001B00
+5400190063001700750017008A001700A4001700CA001600D0001500CF0015
+00CE001400CD001400CC004100130041001300410013004100130041001300
+410013004100130041001300410013003B0011003600100031000E002D000D
+002A000B0027000A0024000A01200011041D0018061B00210619002B031600
+35021400410112004E0110005E010F006E010E0080010E0097000E00B6000D
+00BE000D00BD010C00BB010B00BA010B00BA01430012004300120043001200
+43001200430012004300120043001200400011003A000F0034000D002F000C
+002B000A0027000801230007011E0006011B00060218000D07150015091200
+1E080F0027070B002F05090039050600460504005406020067060201770602
+018C050200A7050100AE050000AD050001AD050001AD050001AD053E000F00
+3E000F003E000F003E000F003E000F003E000F003E000F0039000D0032000B
+002D00090029000701230005021D0004031A00020317010102140101040E00
+070B0A00100C0500190B0300220A01012A0900033406000542040006510300
+06640200077401000787020006A2030006AB030006AB030006AB030006AB03
+0006AB0336000A0036000A0036000A0036000A0036000A0036000A0036000A
+00300008002B000602260004021D0002041901000317030002150500021307
+0003110800040202001100040D0C0007170800092105000B2A01000B340000
+0A4100000A5000000A6100000A7101000A840300089E040008AB040008AB04
+0008AB040008AB040008AB042D0004022D0004022D0004022D0004022D0004
+022D0004022D00040229000203200101031C0300031906000217080002140A
+0002110C00020F0E00020B100001000E0206000E0E07000E1706000E200400
+0E2902000E3300000D3F00000D4E00000D5E00000D6F02000D8204000B9A05
+000AAB06000AAB06000AAB06000AAB06000AAB062603000326030003260300
+0326030003260300032603000326030003200500021C080002190B0002150D
+0002121000020F1200010B1300000A1400000A1400000011010600110B0700
+11150700111E05001127020011310100113D0000114C0000115C0100106C02
+00107F04000F9707000DAD07000DAD07000DAD07000DAD07000DAD081F0A00
+011F0A00011F0A00011F0A00011F0A00011F0A00011F0A00011B0D00021710
+000213130001101500000B1600000B1600000B1600000C1700000B17000002
+130006001408070015120700151C06001525030015300100153C0000144A00
+0014590100146A0300147D05001395080011AF090011AF090011AF090011AF
+090011AF091912000119120001191200011912000119120001191200011912
+000116150001111700000C1800000D1900000D1900000D1900000D1A00000D
+1A00000D1A000004170004001706070018100800191A06001A2304001A2E01
+00193A0000194800001857010019670300187A05001793090015B20B0015B2
+0B0015B20B0015B20B0015B20B121A0000121A0000121A0000121A0000121A
+0000121A0000121A00000E1B00000E1B00000E1C00000E1C00000E1C00000E
+1D00000F1D00000F1D00000F1D0000071A000200190307001B0D08001D1707
+001E2105001E2B02001E3800001D4600001D5501001E6503001E7805001D90
+09001AB60C001AB60C001AB60C001AB60C001AB60C0F1E00000F1E00000F1E
+00000F1E00000F1E00000F1E00000F1E00000F1E00000F1F00000F1F000010
+200000102000001020000010210000102100001021000009200001001B0108
+001F0A070021140700231E0500242902002435010023440100235301002463
+030024750500238E080020B40C0020BA0C0020BA0C0020BA0C0020BA0C1122
+00001122000011220000112200001122000011220000112200001122000011
+23000011230000112400001124000011240000112500001125000012250000
+0C25000002200008002308080026110700281B0600292603002A3201002B41
+01002A5102002B6103002B7304002A8C060028B10A0027BC0A0027BC0A0027
+BC0A0028BC0A12260000122600001226000012260000122600001226000012
+26000012270000122700001228000012280000122900001329000013290000
+132A0000132A00000E2B00000428000700290509002C0E07002D1806002F22
+0400322E0200353D0100344D0200345E020034710300338A040032AE050031
+C2050031C2050032C2050032C205132B0000132B0000132B0000132B000013
+2B0000132B0000132B0000132C0000132C0000142D0000142D0000142E0000
+142E0000142E0000142F0000142F00000F300000072F0005002E030B00320C
+080034150600361F0500392A03003E380200404902003F5B03003F6F02003F
+88010040AF01003FCF01003FCF01003FCF01003FD001153100001531000015
+31000015310000153100001531000015310000153100001532000015330000
+153300001634000016340000163500001635000016360000123700000A3700
+040034010C0039090A003D1206003E1B050041260400463304004A4304004A
+5803004B6E01004D8800004DB000004BE200004BE200004BE200004BE30017
+38000017380000173800001738000017380000173800001738000017380000
+17390000173A0000173A0000173B0000183C0000183C0000183D0000183D00
+00143F00000D3F0003023D010C0040070C00460F0800491806004C22050050
+2E0500543E050056520500596B01005C8500005CAA000058EC000058EC0000
+58ED000059ED00194000001940000019400000194000001940000019400000
+19400000194000001941000019420000194300001A4300001A4400001A4400
+001A4500001A46000016470000104900020548000B004B050E00510C0A0057
+1506005B1F05005E29060061380500644B0500686402006B7F00006CA20000
+68E8000068E9000069E9000069E9001B4900001B4900001B4900001B490000
+1B4900001B4900001B4900001B4900001B4A00001B4B00001C4C00001C4C00
+001C4D00001C4E00001C4E00001C4F00001951000013540001095600090058
+020E005E090B00661107006D1B0500722503007432030076420200785A0100
+7D7600007F9A00007DE700007DFF00007DFF00007EFF001D5200001D520000
+1D5200001D5200001D5200001D5200001D5200001D5300001D5400001E5500
+001E5600001E5700001E5800001E5800001E5900001E5A00001B5D00001661
+00000E6400060267000D006D050C00760C08007F140500861E02008A2A0000
+8C3900008E500000916C00009893000093CF000092FF000092FF000092FF00
+1F5E00001F5E00001F5E00001F5E00001F5E00001F5E00001F5E00001F5F00
+00206000002061000020620000206300002064000020650000206500002166
+00001E6A000019700000127600020A7B00070181010B008B050800950B0500
+9F120100A71D0000AC2C0000AC400000B45F0000BD870000BCBA0000B0F700
+00B0F70000B0F700216C0000216C0000216C0000216C0000216C0000216C00
+00216C0000216D0000226E0000226F00002270000022710000227200002273
+00002274000023750000207A00001B830000178B0000129500000C9E000007
+A7000101B3000300C3030100DC0C0000ED1B0000FE2C0000FF4E0000FF6C00
+00FF910000FFB20000FFB20000FFB200>
+<41001300410013004100130041001300410013004100130041001300410013
+00410013004100130041001300410013004100130041001300410013004100
+13003F0018003F001E004100250046002D004B0035005200400058004E005B
+005F005C0073005A008B005800AE005E00F9005E00F9005E00F9005E00F900
+5E00F9005E00F9004100130041001300410013004100130041001300410013
+00410013004100130041001300410013004100130041001300410013004100
+130041001300410013003F0018003F001E004100250045002D004B00350051
+00400057004E005B005F005C0072005A008A005800AC005E00F9005E00F900
+5E00F9005E00F9005E00F9005E00F900410013004100130041001300410013
+00410013004100130041001300410013004100130041001300410013004100
+1300410013004100130041001300410013003F0017003F001E004100250045
+002D004B0035005100400057004D005B005E005C0071005A0089005800AA00
+5E00F9005E00F9005E00F9005E00F9005E00F9005E00F90041001300410013
+00410013004100130041001300410013004100130041001300410013004100
+13004100130041001300410013004100130041001300410013003F0017003F
+001E004100250045002C004B00350051003F0057004D005B005D005C007100
+5A0088005800A9005E00F9005E00F9005E00F9005E00F9005E00F9005E00F9
+00410013004100130041001300410013004100130041001300410013004100
+13004100130041001300410013004100130041001300410013004100130041
+001300400017003F001E004100250045002C004B00350051003F0057004D00
+5B005D005C0070005B0087005800A7005E00F9005E00F9005E00F9005E00F9
+005E00F9005E00F90041001300410013004100130041001300410013004100
+13004100130041001300410013004100130041001300410013004100130041
+0013004100130041001300400017003F001E004100250045002C004B003400
+51003F0057004C005B005C005C006F005B0086005800A5005E00F5005E00F9
+005E00FF005D00FF005B00FF005A00FF004100130041001300410013004100
+13004100130041001300410013004100130041001300410013004100130041
+00130041001300410013004100130041001300400017003F001E0041002500
+45002C004B00340051003F0057004C005B005C0059006E00550086005000A7
+005200F5005000FF004F00FF004D00FF004C00FF004B00FF00410013004100
+13004100130041001300410013004100130041001300410013004100130041
+00130041001300410013004100130041001300410013004100130040001700
+3F001D004000240044002C00490034004C003D004F004B004E005B004D0070
+004A0087004600A8004400EA004300FB004100FA004000F9003F00F8003E00
+F8004100130041001300410013004100130041001300410013004100130041
+00130041001300410013004100130041001300410013004100130041001300
+41001300400017003E001D003C0024003D002A003F00320041003B0044004A
+0042005C00410071003F008A003B00A9003900E0003700F3003600F2003500
+F1003400F0003300EF00410013004100130041001300410013004100130041
+00130041001300410013004100130041001300410013004100130041001300
+4100130041001300400012003B00160037001C003500220035002900360031
+0036003B003700490036005D003400710032008A002F00A9002D00D8002C00
+EA002B00EA002A00E9002A00E8002900E80041001300410013004100130041
+00130041001300410013004100130041001300410013004100130041001300
+41001300410013003F0012003B001100370010003300140030001A002D0020
+022D0028012D0031002C003C002A004B0029005D0027007100250088002400
+A6002300D0002200E2002100E1002100E1002000E0002000DF004100130041
+00130041001300410013004100130041001300410013004100130041001300
+4100130041001300400012003B0011003600100032000F002F000E002C0011
+002900180226001F04250027022500320023003E0020004C001E005D001C00
+6F001B0084001A009E001A00C3001900D7001900D5001800D4001700D30017
+00D30041001300410013004100130041001300410013004100130041001300
+4100130041001300410013003C0011003700100032000F002E000E002B000D
+0028000C0025000F01220017041F001E051E0027021C0032001A003E001700
+4B0015005B0013006B0011007E00110095001100B4001100C8001000C6000F
+00C5000F00C4000E00C3004100130041001300410013004100130041001300
+4100130041001300410013003F0012003900110033000F002E000E002A000D
+0027000C0024000B0021000A001E000D021B00150418001E04170027011400
+310011003B000E0048000C0057000B0068000900780008008C000800A70008
+00B7000700B5000600B4000600B3000500B2003C0011003C0011003C001100
+3C0011003C0011003C0011003C0011003B001100350010002F000E002B000D
+0027000C0023000A001F0009001C0008001900070016000B03130014051100
+1D030E0026010C002E00090037000600440004005000020064000200730001
+01850100019F010001AC010002AC000002AC000002AC000002AC0032000F00
+32000F0032000F0032000F0032000F0032000F0032000F0031000F002C000D
+0028000C0023000A001F0009001B0007001700060114000401110003010E00
+0704090011060600190403002103010029030002310100033E0000034C0000
+036100000370000003810000039B010003AB010003AB010003AB010003AB01
+0003AB012B000B002B000B002B000B002B000B002B000B002B000B002B000B
+002A000B00250009011F0007011A0005011600030212000202100101020F03
+00020D0400020101000D00030F040005160300051F02000528010005300000
+053B0000054B0000055E0000066D0000067E01000596020004AB020004AB02
+0004AB020004AB020004AB0222000601220006012200060122000601220006
+012200060122000601200006021A0003021601010213020003110400020F06
+00020C090002070D0001060E0000010D010300090C050008140500081D0300
+08260200082F0000083A00000849000008590000086A0000087B0100079203
+0006AB030006AB030006AB030006AB030006AB031801010318010103180101
+03180101031801010318010103180101031802010315040002120700030E0A
+00030B0D000207100000071000000710000007100000030F0002000D090600
+0C1306000C1B04000C2402000C2D01000C3800000B4600000B5600000B6701
+000B7902000A8F040009AB050009AB050009AB050009AB050009AB05150900
+0215090002150900021509000215090002150900021509000214090003100D
+00020C10000108120000091200000912000009120000091200000913000005
+11000200100606000F1007000F1A060010230300102C01000F3700000F4400
+000F5400000F6401000F7603000E8C05000CA906000CAC07000CAC07000CAC
+07000CAC070F1200010F1200010F1200010F1200010F1200010F1200010F12
+00010E1200010A1400000A1400000A1400000A1500000B1500000B1500000B
+1500000B160000071400020012030600130D08001317070014210500142A02
+0013350000134200001351000013610100137303001289060010A708000FAE
+09000FAE09000FAE090010AE090B1600000B1600000B1600000B1600000B16
+00000B1600000B1600000B1600000C1700000C1700000C1800000C1800000C
+1800000D1800000D1900000D1900000A1800010115010700160A0800181407
+00181E0500182803001833010018400000174F0000175F0200177004001786
+070015A40A0014B00B0014B10B0014B10B0014B10B0D1A00000D1A00000D1A
+00000D1A00000D1A00000D1A00000D1A00000D1A00000D1A00000E1B00000E
+1B00000E1B00000E1C00000E1C00000E1C00000E1D00000C1C000002180006
+001A0807001B1108001D1B06001D2503001D3101001D3E00001C4D01001C5D
+02001C6E04001C8307001AA20B0019B50C0019B50C0019B50C0019B50C0F1E
+00000F1E00000F1E00000F1E00000F1E00000F1E00000F1E00000F1E00000F
+1E00000F1F00000F1F0000101F000010200000102000001020000010210000
+0E210000051C0004001C050800200E08002218060023230400232E0200233B
+0000224A0100235A0200236B040023810600219F0A001FB90C001FB90C001F
+B90C001FB90C10220000102200001022000010220000102200001022000010
+22000010220000112200001123000011230000112400001124000011240000
+112500001125000010250000082400030020020900250B0700261507002820
+05002A2B02002B3801002A4801002A5802002B6903002B7E0500299C080027
+BC0A0027BC0A0027BC0A0027BC0A1227000012270000122700001227000012
+27000012270000122700001227000012270000122800001228000012290000
+1329000013290000132A0000132A0000112A00000B2B000202280109002B08
+08002D1207002E1C0500302703003334020036430100355502003567030035
+7C0300339A040032C2050032C2050032C2050032C205132C0000132C000013
+2C0000132C0000132C0000132C0000132C0000132C0000142C0000142D0000
+142E0000142E0000142E0000142F0000142F000014300000133000000D3100
+01032F00090030060A00350F070036180600382304003C2F0300413E020041
+50030040640200417B0100409A010041D2010041D2010041D2010041D20115
+32000015320000153200001532000015320000153200001532000015320000
+15330000153400001634000016350000163500001636000016360000163700
+001538000010390000063700080037040C003C0C090040150600411F050045
+2A04004A3904004C4B04004D6103004F7A0000519A00004ED900004EE50000
+4EE500004EE600173A0000173A0000173A0000173A0000173A0000173A0000
+173A0000173A0000173B0000183B0000183C0000183D0000183D0000183E00
+00183F0000193F00001840000012410000094100060040020E00450A0B004B
+1207004E1B05005125050055330600584506005B5B04005F76000061950100
+5DC900005CED00005DED00005DED0019430000194300001943000019430000
+194300001943000019430000194300001A4400001A4400001A4500001A4600
+001A4700001A4700001B4800001B4800001A490000154C00000D4D0005014C
+000F0051070D00580F09005E18060062220500662E0500683D05006B530400
+6F6D0000728C000070BB00006FF1000070F1000070F1001C4C00001C4C0000
+1C4C00001C4C00001C4C00001C4C00001C4C00001C4D00001C4E00001C4E00
+001C4F00001D5000001D5100001D5100001D5200001D5300001D5400001857
+0000115A0003065C000B0060040E00670A0A0070130600771D04007C280200
+7E3501007F480000826300008784000088B6000085FF000086FF000086FF00
+1E5800001E5800001E5800001E5800001E5800001E5800001E5800001E5800
+001E5900001F5A00001F5B00001F5C00001F5D00001F5D00001F5E00001F5F
+00001F6000001B650000156A00010C6D00060271000C0079050A00830C0700
+8D140300941E0100972B0000993C00009C570000A27A0000A6AA00009DFD00
+009DFD00009DFD002065000020650000206500002065000020650000206500
+002065000020650000216600002168000021690000216A0000216B0000216C
+0000216C0000226D0000226E00001D750000187C0000138400010C8B000403
+930007009B030600A8070300B80E0000C71A0000D22A0000E1410000E66400
+00E98C0000E3FF0000E1FF0000E1FF00>
+<41001300410013004100130041001300410013004100130041001300410013
+00410013004100130041001300410013004100130041001300410013004100
+1300410014003F001B004000210042002800490031004E003A00550047005A
+0057005C0069005B00800058009F005D00E8005E00F9005E00F9005E00F900
+5E00F9005E00F9004100130041001300410013004100130041001300410013
+00410013004100130041001300410013004100130041001300410013004100
+13004100130041001300410014003F001B004000210042002800490031004E
+003A00550047005A0057005C0069005C007F0058009E005C00DD005E00F900
+5E00F9005E00F9005E00F9005E00F900410013004100130041001300410013
+00410013004100130041001300410013004100130041001300410013004100
+130041001300410013004100130041001300410014003F001A004000210042
+002800490031004E003A00550047005A0056005C0068005C007E0058009C00
+5B00D5005E00F9005E00F9005E00F9005E00F9005E00F90041001300410013
+00410013004100130041001300410013004100130041001300410013004100
+1300410013004100130041001300410013004100130041001300410014003F
+001A004000210042002800490030004E003A00550046005A0056005C006800
+5C007D0058009B005A00D0005E00F9005E00F9005E00F9005E00F9005E00F9
+00410013004100130041001300410013004100130041001300410013004100
+13004100130041001300410013004100130041001300410013004100130041
+001300410013003F001A003F00210042002800480030004E00390054004600
+5A0055005C0067005C007C00580099005A00CC005E00F9005E00F9005E00F9
+005E00F9005E00F90041001300410013004100130041001300410013004100
+13004100130041001300410013004100130041001300410013004100130041
+0013004100130041001300410013003F001A003F0021004200280048003000
+4E00390054004500590055005C0067005C007B00580098005900C8005C00FF
+005A00FF005800FF005600FF005500FF004100130041001300410013004100
+13004100130041001300410013004100130041001300410013004100130041
+00130041001300410013004100130041001300410013003F001A003F002100
+42002800480030004D00390054004500560054005600660053007C004E0099
+004C00CC004C00FF004A00FF004800FE004700FD004600FC00410013004100
+13004100130041001300410013004100130041001300410013004100130041
+00130041001300410013004100130041001300410013004100130041001300
+3F001A003F0020004100270042002E00450037004A0043004A005400490067
+0047007E0043009B004000CA003E00F7003C00F6003B00F5003A00F5003A00
+F5004100130041001300410013004100130041001300410013004100130041
+00130041001300410013004100130041001300410013004100130041001300
+41001300410013003C0019003A001F00380026003A002D003C0036003E0042
+003E0053003C0068003A00800037009C003400C8003200EE003100ED003000
+EC002F00EC002E00EC00410013004100130041001300410013004100130041
+00130041001300410013004100130041001300410013004100130041001300
+41001300410013003D0012003A0011003500170032001E003000240131002C
+003100360031004200300054002E0068002C007F002A009B002900C3002700
+E7002600E5002500E5002500E4002400E30041001300410013004100130041
+00130041001300410013004100130041001300410013004100130041001300
+41001300410013003D0012003900110034000F0031000F002E0015002A001C
+032800230429002C012800370026004400240055002200670020007C001F00
+97001F00BB001E00DD001D00DB001C00DA001B00D9001B00D8004100130041
+00130041001300410013004100130041001300410013004100130041001300
+41001300410013003E0012003900110034000F0030000E002C000D0029000D
+002600130123001A042100220421002C011E0038001C004500190055001700
+65001500780015008F001500AE001500CF001400CD001300CC001200CB0012
+00CA0041001300410013004100130041001300410013004100130041001300
+4100130041001300400012003A00110034000F0030000E002C000D0028000C
+0025000B0022000A001F0011031C0019041A00220319002C00160037001300
+4300100052000E0062000D0073000C0087000B00A1000B00BE000A00BC000A
+00BA000900B9000900B8004000120040001200400012004000120040001200
+4000120040001200400012003C0011003600100030000E002C000D0028000C
+0024000B0021000A001D0009001A0008001700100415001804120022021000
+2B000D0034000A003F0008004D0006005E0005006E0003007F000200980102
+00AE010201AD000101AD000101AD000101AC00350010003500100035001000
+350010003500100035001000350010003500100032000F002D000D0028000C
+0024000B0020000A001C0008001800070015000600130005000F000E040C00
+18030A0020020700280004002F00020039000100480000015B0000016C0000
+017C00000295000001AC000001AC000001AC000001AC000001AC002C000D00
+2C000D002C000D002C000D002C000D002C000D002C000D002C000D0029000C
+0025000B0020000A001B0008001700070014000600110004000F0003000D00
+020006000E020300150101001D000000260000002D00000037000001470000
+015A0000016B0000017B00000293000001AB000001AC000001AC000001AC00
+0001AC0024000B0024000B0024000B0024000B0024000B0024000B0024000B
+0024000B0021000A001C0008001700070013000500100004000E0002000C00
+0100060000000000000000000E000000140000001D000000250000002C0000
+013600000146000001590000016A000002790000028F000002A9000002AC00
+0002AC000002AC000002AC001A0008001A0008001A0008001A0008001A0008
+001A0008001A0008001A0008001800070013000501100003010E0102010B02
+00010204000002050000020600000206000000030C020003120200031B0100
+03240100032B00000335000003440000045400000467000004760000048B00
+0003A6010003AB010003AB010003AB010003AB011100020211000202110002
+021100020211000202110002021100020211000202100101020E0300010905
+0002040B0000040C0000040C0000040D0000040D0000050D00000009070300
+061104000619030006220200062A0100063400000641000007500000076300
+00077401000687010005A3020005AB020005AB020005AB020005AB030C0700
+020C0700020C0700020C0700020C0700020C0700020C0700020C0700020A0A
+0002050E0000050E0000060E0000060F0000060F0000060F0000060F000007
+0F0000000D0304000A0E06000A1705000A2003000A2901000A3200000A3F00
+000A4E00000A6000000A71010009840300089F040007AB040007AB040007AB
+040007AB040710000007100000071000000710000007100000071000000710
+00000710000007100000071000000810000008110000081100000811000008
+110000081200000912000001100104000E0B07000E1506000E1E04000E2702
+000E3100000E3D00000D4C00000D5C00000D6D02000D8104000B9A05000AAB
+06000AAB06000AAB06000AAB06091200000912000009120000091200000912
+000009120000091200000912000009130000091300000A1300000A1300000A
+1400000A1400000A1400000A1500000B150000031200040012080700121207
+00121C060012250300122F0100123B00001249000011590100116A0200117E
+0400109707000EAD08000EAD08000EAD08000EAD080B1600000B1600000B16
+00000B1600000B1600000B1600000B1600000B1600000B1600000B1600000C
+1700000C1700000C1700000C1800000C1800000C1800000C18000006160003
+0015050700160F08001719060017230400172D020017390000164700001656
+010016670200167B05001594080013B00A0013B00A0013B00A0013B00A0D19
+00000D1900000D1900000D1900000D1900000D1900000D1900000D1900000D
+1A00000D1A00000E1A00000E1B00000E1B00000E1B00000E1C00000E1C0000
+0E1C0000081A000100180207001A0B08001C1607001D2005001D2A02001C36
+00001C4400001C5401001C6403001C7805001B92090018B40C0018B40C0018
+B40C0018B40C0F1D00000F1D00000F1D00000F1D00000F1D00000F1D00000F
+1D00000F1D00000F1E00000F1E00000F1F00000F1F00000F1F000010200000
+1020000010200000102000000B200001021B0107001E09070020120700221D
+0500232703002334010022420100225201002262030023750500228F08001F
+B90D001FB90D001FB90D001FB90C1122000011220000112200001122000011
+22000011220000112200001122000011220000112300001123000011240000
+11240000112400001125000011250000122500000D26000004220006002205
+0800260F070027190600292404002A3001002B3E01002A4F01002B6002002B
+7304002A8C060028B50A0027BC0A0027BC0A0028BC0A122700001227000012
+27000012270000122700001227000012270000122700001228000012280000
+122800001329000013290000132A0000132A0000132A0000132B00000F2B00
+00072B00040028030A002D0C07002E15060030200400332C0200363A010037
+4A0200365C020036700300358A030034B2040034C3050034C3040034C30414
+2D0000142D0000142D0000142D0000142D0000142D0000142D0000142D0000
+142D0000142E0000142E0000142F0000142F00001430000015300000153100
+0015310000123200000B320003002F000C003309090037120600381C05003B
+270400403403004445030043590300436E02004389000045B5000044D60000
+44D6000044D700163400001634000016340000163400001634000016340000
+16340000163400001635000016350000163600001636000016370000173800
+00173800001739000017390000143A00000E3B00010238000B003B060C0041
+0F080043180600452205004A2E04004E3F050050530400526B020054870000
+54B2000051E9000051E9000051E900183D0000183D0000183D0000183D0000
+183D0000183D0000183D0000183D0000183D0000183E0000183F0000193F00
+00194000001940000019410000194200001942000016430000114500000644
+000A0045040E004B0C0A0051150700541E0500572906005C3806005E4C0500
+626602006582000065A8000062EA000062E9000062E9001A4600001A460000
+1A4600001A4600001A4600001A4600001A4600001A4600001A4700001B4800
+001B4800001B4900001B4A00001B4B00001B4B00001C4C00001C4C0000194E
+0000145100000A5200070153020E0059080C0061110800681A05006C250400
+6F32040071430300745C0200787900007A9F000078FC000078FC000079FC00
+1D5100001D5100001D5100001D5100001D5100001D5100001D5100001D5100
+001D5200001D5300001D5400001D5500001E5500001E5600001E5700001E58
+00001E5800001C5B0000175F00000F6200050464000C006A040C00720B0900
+7C130500831E020087290100893800008B5000008E6E00009597000090EC00
+008FFF00008FFF001F5E00001F5E00001F5E00001F5E00001F5E00001F5E00
+001F5E00001F5E00001F5F0000206000002061000020620000206300002064
+00002065000020650000216600001F6900001A6F0000147500010C7A000603
+80000A0089040900930A05009E110200A71C0000AC2A0000AD3F0000B55F00
+00BE8A0000B9CD0000B0F70000B1F700>
+] 4 { dup 0.1 lt { 1.2 mul 0.02 sub } if
+ dup 0 lt { pop 0 } if
+ } bind dup dup dup ]
+/RenderingIntent (Perceptual)
+>>
+setcolorrendering
diff --git a/crd/kh.crd b/crd/kh.crd
new file mode 100644
index 0000000..b760518
--- /dev/null
+++ b/crd/kh.crd
@@ -0,0 +1,4682 @@
+<<
+/ColorRenderingType 1
+/BlackPoint [0.000000 0.000000 0.000000]
+/WhitePoint [0.964200 1.000000 0.824900]
+% Bradford Cone Space
+/MatrixPQR [0.8951 -0.7502 0.0389 0.2664 1.7135 -0.0685 -0.1614 0.0367 1.0296 ]
+/RangePQR [ -0.5 2 -0.5 2 -0.5 2 ]
+% VonKries-like transform in Bradford Cone Space
+/TransformPQR [
+{exch pop exch 3 get mul exch pop exch 3 get div} bind
+{exch pop exch 4 get mul exch pop exch 4 get div} bind
+{exch pop exch 5 get mul exch pop exch 5 get div} bind
+]
+/EncodeLMN [
+{ 0.964200 div dup 0.008856 le {7.787 mul 16 116 div add}{1 3 div exp} ifelse } bind
+{ 1.000000 div dup 0.008856 le {7.787 mul 16 116 div add}{1 3 div exp} ifelse } bind
+{ 0.824900 div dup 0.008856 le {7.787 mul 16 116 div add}{1 3 div exp} ifelse } bind
+]
+/MatrixABC [ 0 1 0 1 -1 1 0 0 -1 ]
+/EncodeABC [
+{ 116 mul 16 sub 100 div } bind
+{ 500 mul 128 add 255 div } bind
+{ 200 mul 128 add 255 div } bind
+]
+/RenderTable [ 33 33 33 [
+<000000FF000000FF000000FF000000FF000000FF000000FF000000FF000000
+FF000000FF000000FF000000FF000000FF000000FF000000FF000000FF0000
+00FF000000FF000000FF000000FF000000FF000000FF000000FF000000FF00
+0000FF000000FF000000FF000000FF000000FF000000FF000000FF000000FF
+000000FF000000FF000000FF000000FF000000FF000000FF000000FF000000
+FF000000FF000000FF000000FF000000FF000000FF000000FF000000FF0000
+00FF000000FF000000FF000000FF000000FF000000FF000000FF000000FF00
+0000FF000000FF000000FF000000FF000000FF000000FF000000FF000000FF
+000000FF000000FF000000FF000000FF000000FF000000FF000000FF000000
+FF000000FF000000FF000000FF000000FF000000FF000000FF000000FF0000
+00FF000000FF000000FF000000FF000000FF000000FF000000FF000000FF00
+0000FF000000FF000000FF000000FF000000FF000000FF000000FF000000FF
+000000FF000000FF000000FF000000FF000000FF000000FF000000FF000000
+FF000000FF000000FF000000FF000000FF000000FF000000FF000000FF0000
+00FF000000FF000000FF000000FF000000FF000000FF000000FF000000FF00
+0000FF000000FF000000FF000000FF000000FF000000FF000000FF000000FF
+000000FF000000FF000000FF000000FF000000FF000000FF000000FF000000
+FF000000FF000000FF000000FF000000FF000000FF000000FF000000FF0000
+00FF000000FF000000FF000000FF000000FF000000FF000000FF000000FF00
+0000FF000000FF000000FF000000FF000000FF000000FF000000FF000000FF
+000000FF000000FF000000FF000000FF000000FF000000FF000000FF000000
+FF000000FF000000FF000000FF000000FF000000FF000000FF000000FF0000
+00FF000000FF000000FF000000FF000000FF000000FF000000FF000000FF00
+0000FF000000FF000000FF000000FF000000FF000000FF000000FF000000FF
+000000FF000000FF000000FF000000FF000000FF000000FF000000FF000000
+FF000000FF000000FF000000FF000000FF000000FF000000FF000000FF0000
+00FF000000FF000000FF000000FF000000FF000000FF000000FF000000FF00
+0000FF000000FF000000FF000000FF000000FF000000FF000000FF000000FF
+000000FF000000FF000000FF000000FF000000FF000000FF000000FF000000
+FF000000FF000000FF000000FF000000FF000000FF000000FF000000FF0000
+00FF000000FF000000FF000000FF000000FF000000FF000000FF000000FF00
+0000FF000000FF000000FF000000FF000000FF000000FF000000FF000000FF
+000000FF000000FF000000FF000000FF000000FF000000FF000000FF000000
+FF000000FF000000FF000000FF000000FF000000FF000000FF000000FF0000
+00FF000000FF000000FF000000FF000000FF000000FF000000FF000000FF00
+0000FF000000FF000000FF000000FF000000FF000000FF000000FF000000FF
+000000FF000000FF000000FF000000FF000000FF000000FF000000FF000000
+FF000000FF000000FF000000FF000000FF000000FF000000FF000000FF0000
+00FF000000FF000000FF000000FF000000FF000000FF000000FF000000FF00
+0000FF000000FF000000FF000000FF000000FF000000FF000000FF000000FF
+000000FF000000FF000000FF000000FF000000FF000000FF000000FF000000
+FF000000FF000000FF000000FF000000FF000000FF000000FF000000FF0000
+00FF000000FF000000FF000000FF000000FF000000FF000000FF000000FF00
+0000FF000000FF000000FF000000FF000000FF000000FF000000FF000000FF
+000000FF000000FF000000FF000000FF000000FF000000FF000000FF000000
+FF000000FF000000FF000000FF000000FF000000FF000000FF000000FF0000
+00FF000000FF000000FF000000FF000000FF000000FF000000FF000000FF00
+0000FF000000FF000000FF000000FF000000FF000000FF000000FF000000FF
+000000FF000000FF000000FF000000FF000000FF000000FF000000FF000000
+FF000000FF000000FF000000FF000000FF000000FF000000FF000000FF0000
+00FF000000FF000000FF000000FF000000FF000000FF000000FF000000FF00
+0000FF000000FF000000FF000000FF000000FF000000FF000000FF000000FF
+000000FF000000FF000000FF000000FF000000FF000000FF000000FF000000
+FF000000FF000000FF000000FF000000FF000000FF000000FF000000FF0000
+00FF000000FF000000FF000000FF000000FF000000FF000000FF000000FF00
+0000FF000000FF000000FF000000FF000000FF000000FF000000FF000000FF
+000000FF000000FF000000FF000000FF000000FF000000FF000000FF000000
+FF000000FF000000FF000000FF000000FF000000FF000000FF000000FF0000
+00FF000000FF000000FF000000FF000000FF000000FF000000FF000000FF00
+0000FF000000FF000000FF000000FF000000FF000000FF000000FF000000FF
+000000FF000000FF000000FF000000FF000000FF000000FF000000FF000000
+FF000000FF000000FF000000FF000000FF000000FF000000FF000000FF0000
+00FF000000FF000000FF000000FF000000FF000000FF000000FF000000FF00
+0000FF000000FF000000FF000000FF000000FF000000FF000000FF000000FF
+000000FF000000FF000000FF000000FF000000FF000000FF000000FF000000
+FF000000FF000000FF000000FF000000FF000000FF000000FF000000FF0000
+00FF000000FF000000FF000000FF000000FF000000FF000000FF000000FF00
+0000FF000000FF000000FF000000FF000000FF000000FF000000FF000000FF
+000000FF000000FF000000FF000000FF000000FF000000FF000000FF000000
+FF000000FF000000FF000000FF000000FF000000FF000000FF000000FF0000
+00FF000000FF000000FF000000FF000000FF000000FF000000FF000000FF00
+0000FF000000FF000000FF000000FF000000FF000000FF000000FF000000FF
+000000FF000000FF000000FF000000FF000000FF000000FF000000FF000000
+FF000000FF000000FF000000FF000000FF000000FF000000FF000000FF0000
+00FF000000FF000000FF000000FF000000FF000000FF000000FF000000FF00
+0000FF000000FF000000FF000000FF000000FF000000FF000000FF000000FF
+000000FF000000FF000000FF000000FF000000FF000000FF000000FF000000
+FF000000FF000000FF000000FF000000FF000000FF000000FF000000FF0000
+00FF000000FF000000FF000000FF000000FF000000FF000000FF000000FF00
+0000FF000000FF000000FF000000FF000000FF000000FF000000FF000000FF
+000000FF000000FF000000FF000000FF000000FF000000FF000000FF000000
+FF000000FF000000FF000000FF000000FF000000FF000000FF000000FF0000
+00FF000000FF000000FF000000FF000000FF000000FF000000FF000000FF00
+0000FF000000FF000000FF000000FF000000FF000000FF000000FF000000FF
+000000FF000000FF000000FF000000FF000000FF000000FF000000FF000000
+FF000000FF000000FF000000FF000000FF000000FF000000FF000000FF0000
+00FF000000FF000000FF000000FF000000FF000000FF000000FF000000FF00
+0000FF000000FF000000FF000000FF000000FF000000FF000000FF000000FF
+000000FF000000FF000000FF000000FF000000FF000000FF000000FF000000
+FF000000FF000000FF000000FF000000FF000000FF000000FF000000FF0000
+00FF000000FF000000FF000000FF000000FF000000FF000000FF000000FF00
+0000FF000000FF000000FF000000FF000000FF000000FF000000FF000000FF
+000000FF000000FF000000FF000000FF000000FF000000FF000000FF000000
+FF000000FF000000FF000000FF000000FF000000FF000000FF000000FF0000
+00FF000000FF000000FF000000FF000000FF000000FF000000FF000000FF00
+0000FF000000FF000000FF000000FF000000FF000000FF000000FF000000FF
+000000FF000000FF000000FF000000FF000000FF000000FF000000FF000000
+FF000000FF000000FF000000FF000000FF000000FF000000FF000000FF0000
+00FF000000FF000000FF000000FF000000FF000000FF000000FF000000FF00
+0000FF000000FF000000FF000000FF000000FF000000FF000000FF000000FF
+000000FF000000FF000000FF000000FF000000FF000000FF000000FF000000
+FF000000FF000000FF000000FF000000FF000000FF000000FF000000FF0000
+00FF000000FF000000FF000000FF000000FF000000FF000000FF000000FF00
+0000FF000000FF000000FF000000FF000000FF000000FF000000FF000000FF
+000000FF000000FF000000FF000000FF000000FF000000FF000000FF000000
+FF000000FF000000FF000000FF000000FF000000FF000000FF000000FF0000
+00FF000000FF000000FF000000FF000000FF000000FF000000FF000000FF00
+0000FF000000FF000000FF000000FF000000FF000000FF000000FF000000FF
+000000FF000000FF000000FF000000FF000000FF000000FF000000FF000000
+FF000000FF000000FF000000FF000000FF000000FF000000FF000000FF0000
+00FF000000FF000000FF000000FF000000FF000000FF000000FF000000FF00
+0000FF000000FF000000FF000000FF000000FF000000FF000000FF000000FF
+000000FF000000FF000000FF000000FF000000FF000000FF000000FF000000
+FF000000FF000000FF000000FF000000FF000000FF000000FF000000FF0000
+00FF000000FF000000FF000000FF000000FF000000FF000000FF000000FF00
+0000FF000000FF000000FF000000FF000000FF000000FF000000FF000000FF
+000000FF000000FF000000FF000000FF000000FF000000FF000000FF000000
+FF000000FF000000FF000000FF000000FF000000FF000000FF000000FF0000
+00FF000000FF000000FF000000FF000000FF000000FF000000FF000000FF00
+0000FF000000FF000000FF000000FF000000FF000000FF000000FF000000FF
+000000FF000000FF000000FF000000FF000000FF000000FF000000FF000000
+FF000000FF000000FF000000FF000000FF000000FF000000FF000000FF0000
+00FF000000FF000000FF000000FF000000FF000000FF000000FF000000FF00
+0000FF000000FF000000FF000000FF000000FF000000FF000000FF000000FF
+000000FF000000FF000000FF000000FF000000FF000000FF000000FF000000
+FF000000FF000000FF000000FF000000FF000000FF000000FF000000FF0000
+00FF000000FF000000FF000000FF000000FF000000FF000000FF000000FF00
+0000FF000000FF000000FF000000FF000000FF000000FF000000FF000000FF
+000000FF000000FF000000FF000000FF000000FF000000FF000000FF000000
+FF000000FF000000FF000000FF000000FF000000FF000000FF000000FF0000
+00FF000000FF000000FF000000FF000000FF000000FF000000FF000000FF00
+0000FF000000FF000000FF000000FF000000FF000000FF000000FF000000FF
+000000FF000000FF000000FF000000FF000000FF000000FF000000FF000000
+FF000000FF000000FF000000FF000000FF000000FF000000FF000000FF0000
+00FF000000FF000000FF000000FF000000FF000000FF000000FF000000FF00
+0000FF000000FF000000FF000000FF000000FF000000FF000000FF000000FF
+000000FF000000FF000000FF000000FF000000FF000000FF000000FF000000
+FF000000FF000000FF000000FF000000FF000000FF000000FF000000FF0000
+00FF000000FF000000FF000000FF000000FF000000FF000000FF000000FF00
+0000FF000000FF000000FF000000FF000000FF000000FF000000FF000000FF
+000000FF000000FF000000FF000000FF>
+<A6590000A75D0000AA620000B0680000BB6F0101CD780203E5800405F88402
+0DF7820118F07D0225E56F0039D85F004ECB4E0064BE33007D9F1B03983609
+25CB090116DE0C0037D50C0037D50C0037D50C0037D50C0037D50C0037D50C
+0037D50C0037D50C0037D50C0037D50C0037D50C0037D50C0037D50C0037D5
+0C0037D50C0037D5A6590000A75D0000AA620000B0680000BB6F0101CD7802
+03E5800405F884020DF7820118F07D0225E56F0039D85F004ECB4E0064BE33
+007D9F1B0398360925CB090116DE0C0037D50C0037D50C0037D50C0037D50C
+0037D50C0037D50C0037D50C0037D50C0037D50C0037D50C0037D50C0037D5
+0C0037D50C0037D50C0037D50C0037D5A6590000A75D0000AA620000B06800
+00BB6F0101CD780203E5800405F884020DF7820118F07D0225E56F0039D85F
+004ECB4E0064BE33007D9F1B0398360925CB090116DE0C0037D50C0037D50C
+0037D50C0037D50C0037D50C0037D50C0037D50C0037D50C0037D50C0037D5
+0C0037D50C0037D50C0037D50C0037D50C0037D50C0037D5A6590000A75D00
+00AA620000B0680000BB6F0101CD780203E5800405F884020DF7820118F07D
+0225E56F0039D85F004ECB4E0064BE33007D9F1B0398360925CB090116DE0C
+0037D50C0037D50C0037D50C0037D50C0037D50C0037D50C0037D50C0037D5
+0C0037D50C0037D50C0037D50C0037D50C0037D50C0037D50C0037D50C0037
+D5A6590000A75D0000AA620000B0680000BB6F0101CD780203E5800405F884
+020DF7820118F07D0225E56F0039D85F004ECB4E0064BE33007D9F1B039836
+0925CB090116DE0C0037D50C0037D50C0037D50C0037D50C0037D50C0037D5
+0C0037D50C0037D50C0037D50C0037D50C0037D50C0037D50C0037D50C0037
+D50C0037D50C0037D5A6590000A75D0000AA620000B0680000BB6F0101CD78
+0203E5800405F884020DF7820118F07D0225E56F0039D85F004ECB4E0064BE
+33007D9F1B0398360925CB090116DE0C0037D50C0037D50C0037D50C0037D5
+0C0037D50C0037D50C0037D50C0037D50C0037D50C0037D50C0037D50C0037
+D50C0037D50C0037D50C0037D50C0037D5A6590000A75D0000AA620000B068
+0000BB6F0101CD780203E5800405F884020DF7820118F07D0225E56F0039D8
+5F004ECB4E0064BE33007D9F1B0398360925CB090116DE0C0037D50C0037D5
+0C0037D50C0037D50C0037D50C0037D50C0037D50C0037D50C0037D50C0037
+D50C0037D50C0037D50C0037D50C0037D50C0037D50C0037D5A6590000A75D
+0000AA620000B0680000BB6F0101CD780203E5800405F884020DF7820118F0
+7D0225E56F0039D85F004ECB4E0064BE33007D9F1B0398360925CB090116DE
+0C0037D50C0037D50C0037D50C0037D50C0037D50C0037D50C0037D50C0037
+D50C0037D50C0037D50C0037D50C0037D50C0037D50C0037D50C0037D50C00
+37D5A6590000A75D0000AA620000B0680000BB6F0101CD780203E5800405F8
+84020DF7820118F07D0225E56F0039D85F004ECB4E0064BE33007D9F1B0398
+360925CB090116DE0C0037D50C0037D50C0037D50C0037D50C0037D50C0037
+D50C0037D50C0037D50C0037D50C0037D50C0037D50C0037D50C0037D50C00
+37D50C0037D50C0037D5A6590000A75D0000AA620000B0680000BB6F0101CD
+780203E5800405F884020DF7820118F07D0225E56F0039D85F004ECB4E0064
+BE33007D9F1B0398360925CB090116DE0C0037D50C0037D50C0037D50C0037
+D50C0037D50C0037D50C0037D50C0037D50C0037D50C0037D50C0037D50C00
+37D50C0037D50C0037D50C0037D50C0037D5A6590000A75D0000AA620000B0
+680000BB6F0101CD780203E5800405F884020DF7820118F07D0225E56F0039
+D85F004ECB4E0064BE33007D9F1B0398360925CB090116DE0C0037D50C0037
+D50C0037D50C0037D50C0037D50C0037D50C0037D50C0037D50C0037D50C00
+37D50C0037D50C0037D50C0037D50C0037D50C0037D50C0037D5A6590000A7
+5D0000AA620000B0680000BB6F0101CD780203E5800405F884020DF7820118
+F07D0225E56F0039D85F004ECB4E0064BE33007D9F1B0398360925CB090116
+DE0C0037D50C0037D50C0037D50C0037D50C0037D50C0037D50C0037D50C00
+37D50C0037D50C0037D50C0037D50C0037D50C0037D50C0037D50C0037D50C
+0037D5A6590000A75D0000AA620000B0680000BB6F0101CD780203E5800405
+F884020DF7820118F07D0225E56F0039D85F004ECB4E0064BE33007D9F1B03
+98360925CB090116DE0C0037D50C0037D50C0037D50C0037D50C0037D50C00
+37D50C0037D50C0037D50C0037D50C0037D50C0037D50C0037D50C0037D50C
+0037D50C0037D50C0037D5A6590000A75D0000AA620000B0680000BB6F0101
+CD780203E5800405F884020DF7820118F07D0225E56F0039D85F004ECB4E00
+64BE33007D9F1B0398360925CB090116DE0C0037D50C0037D50C0037D50C00
+37D50C0037D50C0037D50C0037D50C0037D50C0037D50C0037D50C0037D50C
+0037D50C0037D50C0037D50C0037D50C0037D5A6590000A75D0000AA620000
+B0680000BB6F0101CD780203E5800405F884020DF7820118F07D0225E56F00
+39D85F004ECB4E0064BE33007D9F1B0398360925CB090116DE0C0037D50C00
+37D50C0037D50C0037D50C0037D50C0037D50C0037D50C0037D50C0037D50C
+0037D50C0037D50C0037D50C0037D50C0037D50C0037D50C0037D5A6590000
+A75D0000AA620000B0680000BB700101CC780202E4810405F985020CF68501
+16EE7F0124E2720036D6650049C9530060BB3D00779D2200943C0E23C80000
+01EB090039D5090039D5090039D5090039D5090039D5090039D5090039D509
+0039D5090039D5090039D5090039D5090039D5090039D5090039D5090039D5
+090039D5A65A0000A75E0000A9620000AF680000BA700101CB790202E38103
+04F988020BF4860015EB810021DC780031D46C0044C65C0059B74A006FA22F
+008A411C2CC4120003DE010100F9010100F9010100F9010100F9010100F901
+0100F9010100F9010100F9010100F9010100F9010100F9010100F9010100F9
+010100F9010100F9010100F9A65A0000A75E0000A9630000AE690000B87000
+01C9790202E1820304F9890109F2880013E783001DD97C002CD273003EC367
+0051B25900659A4E007A7A4300944E2202BB020000EE020000EE020000EE02
+0000EE020000EE020000EE020000EE020000EE020000EE020000EE020000EE
+020000EE020000EE020000EE020000EE020000EEA65A0000A65E0000A96300
+00AD690000B7710001C7790102DF830203F78A0108F0890010E486001AD780
+0027CB790037C0780343AD7C0A4A917E0C5B76860D6A654B11A0020001F002
+0001F0020001F0020001F0020001F0020001F0020001F0020001F0020001F0
+020001F0020001F0020001F0020001F0020001F0020001F0020001F0A65B00
+00A65E0000A8630000AC690000B6710000C67A0101DD830202F58B0106EF8B
+000DE2880017D5830023C47F0130B1840837978D0B41769B0D565895087148
+5C0EA415300CC915300CC915300CC915300CC915300CC915300CC915300CC9
+15300CC915300CC915300CC915300CC915300CC915300CC915300CC915300C
+C915300CC9A65B0000A65F0000A8630000AC690000B5710000C47A0101DB84
+0102F38B0105EE8B000DE2880017D0850022B78804299E9209317A9F07475C
+A7065F41A302781A8F0096006D01A5006D01A5006D01A5006D01A5006D01A5
+006D01A5006D01A5006D01A5006D01A5006D01A5006D01A5006D01A5006D01
+A5006D01A5006D01A5006D01A5A65C0000A65F0000A7640000AB6A0000B472
+0000C37B0101DB840102F38B0105EE8B000DDE890017C590051AA99707238A
+AA092E65AC004E4CAF006532AD007A159E078D0181099C0181099C0181099C
+0181099C0181099C0181099C0181099C0181099C0181099C0181099C018109
+9C0181099C0181099C0181099C0181099C0181099CA65C0000A6600000A764
+0000AA6A0000B4720000C37B0101DB840102F38B0105E98D010CCF940610B6
+9F09149AB10B1D77B9043459B9005041BD006629BA027812B40E85029D1292
+029D1292029D1292029D1292029D1292029D1292029D1292029D1292029D12
+92029D1292029D1292029D1292029D1292029D1292029D1292029D1292A65D
+0000A6600000A7640000AA6A0000B3720000C37B0101DA840102F38B0105D5
+960408BC9F060DA9B10C0F8CC5091E69C5003A4EC8005236CC006623D00772
+0FC5127F00BA1A8900BA1A8900BA1A8900BA1A8900BA1A8900BA1A8900BA1A
+8900BA1A8900BA1A8900BA1A8900BA1A8900BA1A8900BA1A8900BA1A8900BA
+1A8900BA1A89A65D0000A6600000A7640000AA6A0000B3720000C37B0101DA
+840102D0920203C1A00506AFAD08099DC20D0E7CD303245FD4003B46D70052
+2FDE00641CE5086F07D6117C00DA267C00DA267C00DA267C00DA267C00DA26
+7C00DA267C00DA267C00DA267C00DA267C00DA267C00DA267C00DA267C00DA
+267C00DA267C00DA267C00DA267CA65D0000A6600000A7640000AA6A0000B3
+720000C37B0001BF870101B7960203B0A80505A3B9080893D30D0E75E20424
+57E4003A3FE8005228F9016015FB076C00F1137800F5357100F5357100F535
+7100F5357100F5357100F5357100F5357100F5357100F5357100F5357100F5
+357100F5357100F5357100F5357100F5357100F53571A65D0000A6600000A7
+640000AA6A0000B3720000B27C0000AA8A0101A59A0203A1AE040599C60908
+8BE40D0E6DF204244EF4003B38FC025020FF045E0AFF076A00FD1D6C04FF45
+6504FF456504FF456504FF456504FF456504FF456504FF456504FF456504FF
+456504FF456504FF456504FF456504FF456504FF456504FF456504FF4565A6
+5D0000A6600000A7640000AA6A0000AB720000A17E00009C8D0101989D0202
+95B2040490D1090884F20D1062FA032544FD003B2DFF064D14FF055C00FF09
+6700FF26620BFF55580BFF55580BFF55580BFF55580BFF55580BFF55580BFF
+55580BFF55580BFF55580BFF55580BFF55580BFF55580BFF55580BFF55580B
+FF55580BFF5558A65D0000A6600000A7640000A86A00009A74000095800000
+918F01018EA002028BB7040485D6090978F70C1254FC042639FF043923FF07
+4B09FF045B00FF155E02FF33590FFF644F0FFF644F0FFF644F0FFF644F0FFF
+644F0FFF644F0FFF644F0FFF644F0FFF644F0FFF644F0FFF644F0FFF644F0F
+FF644F0FFF644F0FFF644F0FFF644FA65D0000A6600000A7640000966B0000
+8F7600008B8300008891000185A2010281BA040478D7080B6BF40C134AFA05
+2532FE0A3619FF054B06FF0C5600FF1F5607FF444F0FFF6A480FFF6A480FFF
+6A480FFF6A480FFF6A480FFF6A480FFF6A480FFF6A480FFF6A480FFF6A480F
+FF6A480FFF6A480FFF6A480FFF6A480FFF6A480FFF6A48A65D0000A6600000
+966400008B6C00008678000083840000809300007CA5010277BE04056DDA08
+0B5FF20D1343F90C2328FE0B350FFE034A06FF184D02FF2B4D0BFF54450CFF
+6C430CFF6C430CFF6C430CFF6C430CFF6C430CFF6C430CFF6C430CFF6C430C
+FF6C430CFF6C430CFF6C430CFF6C430CFF6C430CFF6C430CFF6C430CFF6C43
+A65D0000985F000089650000826E00007F7A00007C8600007895000073A801
+026DC1040562DA090B54F00E133BF8102220FD0C340FFE114207FF234505FF
+39430AFF5A3F09FF6F3F09FF6F3F09FF6F3F09FF6F3F09FF6F3F09FF6F3F09
+FF6F3F09FF6F3F09FF6F3F09FF6F3F09FF6F3F09FF6F3F09FF6F3F09FF6F3F
+09FF6F3F09FF6F3F9D5C0000895F0000806600007B700000787B0000748800
+006F9700006AAB010263C4050658DB0A0C4BED111331F612211CFD12310FFF
+1D3A0AFF303B07FF473B07FF5D3B07FF713A07FF713A07FF713A07FF713A07
+FF713A07FF713A07FF713A07FF713A07FF713A07FF713A07FF713A07FF713A
+07FF713A07FF713A07FF713A07FF713A>
+<A7560000A7590000A95E0000AD630000B6690101C4700203DA790404EF7E05
+0BFC7E0316FA790423F66A0236ED57004DE6430065D7230081B10E0C968D01
+1FA775013BB1230036D019002ED419002ED419002ED419002ED419002ED419
+002ED419002ED419002ED419002ED419002ED419002ED419002ED419002ED4
+19002ED419002ED4A7560000A7590000A95E0000AD630000B6690101C47002
+03DA790404EF7E050BFC7E0316FA790423F66A0236ED57004DE6430065D723
+0081B10E0C968D011FA775013BB1230036D019002ED419002ED419002ED419
+002ED419002ED419002ED419002ED419002ED419002ED419002ED419002ED4
+19002ED419002ED419002ED419002ED4A7560000A7590000A95E0000AD6300
+00B6690101C4700203DA790404EF7E050BFC7E0316FA790423F66A0236ED57
+004DE6430065D7230081B10E0C968D011FA775013BB1230036D019002ED419
+002ED419002ED419002ED419002ED419002ED419002ED419002ED419002ED4
+19002ED419002ED419002ED419002ED419002ED419002ED4A7560000A75900
+00A95E0000AD630000B6690101C4700203DA790404EF7E050BFC7E0316FA79
+0423F66A0236ED57004DE6430065D7230081B10E0C968D011FA775013BB123
+0036D019002ED419002ED419002ED419002ED419002ED419002ED419002ED4
+19002ED419002ED419002ED419002ED419002ED419002ED419002ED419002E
+D4A7560000A7590000A95E0000AD630000B6690101C4700203DA790404EF7E
+050BFC7E0316FA790423F66A0236ED57004DE6430065D7230081B10E0C968D
+011FA775013BB1230036D019002ED419002ED419002ED419002ED419002ED4
+19002ED419002ED419002ED419002ED419002ED419002ED419002ED419002E
+D419002ED419002ED4A7560000A7590000A95E0000AD630000B6690101C470
+0203DA790404EF7E050BFC7E0316FA790423F66A0236ED57004DE6430065D7
+230081B10E0C968D011FA775013BB1230036D019002ED419002ED419002ED4
+19002ED419002ED419002ED419002ED419002ED419002ED419002ED419002E
+D419002ED419002ED419002ED419002ED4A7560000A7590000A95E0000AD63
+0000B6690101C4700203DA790404EF7E050BFC7E0316FA790423F66A0236ED
+57004DE6430065D7230081B10E0C968D011FA775013BB1230036D019002ED4
+19002ED419002ED419002ED419002ED419002ED419002ED419002ED419002E
+D419002ED419002ED419002ED419002ED419002ED419002ED4A7560000A759
+0000A95E0000AD630000B6690101C4700203DA790404EF7E050BFC7E0316FA
+790423F66A0236ED57004DE6430065D7230081B10E0C968D011FA775013BB1
+230036D019002ED419002ED419002ED419002ED419002ED419002ED419002E
+D419002ED419002ED419002ED419002ED419002ED419002ED419002ED41900
+2ED4A7560000A7590000A95E0000AD630000B6690101C4700203DA790404EF
+7E050BFC7E0316FA790423F66A0236ED57004DE6430065D7230081B10E0C96
+8D011FA775013BB1230036D019002ED419002ED419002ED419002ED419002E
+D419002ED419002ED419002ED419002ED419002ED419002ED419002ED41900
+2ED419002ED419002ED4A7560000A7590000A95E0000AD630000B6690101C4
+700203DA790404EF7E050BFC7E0316FA790423F66A0236ED57004DE6430065
+D7230081B10E0C968D011FA775013BB1230036D019002ED419002ED419002E
+D419002ED419002ED419002ED419002ED419002ED419002ED419002ED41900
+2ED419002ED419002ED419002ED419002ED4A7560000A7590000A95E0000AD
+630000B6690101C4700203DA790404EF7E050BFC7E0316FA790423F66A0236
+ED57004DE6430065D7230081B10E0C968D011FA775013BB1230036D019002E
+D419002ED419002ED419002ED419002ED419002ED419002ED419002ED41900
+2ED419002ED419002ED419002ED419002ED419002ED419002ED4A7560000A7
+590000A95E0000AD630000B6690101C4700203DA790404EF7E050BFC7E0316
+FA790423F66A0236ED57004DE6430065D7230081B10E0C968D011FA775013B
+B1230036D019002ED419002ED419002ED419002ED419002ED419002ED41900
+2ED419002ED419002ED419002ED419002ED419002ED419002ED419002ED419
+002ED4A7560000A7590000A95E0000AD630000B6690101C4700203DA790404
+EF7E050BFC7E0316FA790423F66A0236ED57004DE6430065D7230081B10E0C
+968D011FA775013BB1230036D019002ED419002ED419002ED419002ED41900
+2ED419002ED419002ED419002ED419002ED419002ED419002ED419002ED419
+002ED419002ED419002ED4A7560000A7590000A95E0000AD630000B6690101
+C4710202D9790404EF7E050BFC7F0216FB7B0422F56B0135EB58004CE24600
+64D726007FB1100B95840122AB6B013DB6220038D018002FD418002FD41800
+2FD418002FD418002FD418002FD418002FD418002FD418002FD418002FD418
+002FD418002FD418002FD418002FD418002FD4A7560000A75A0000A95E0000
+AD630000B5690101C3710202D8790404ED7F040AFC810214FD7F0320F47001
+32E75E0047DC4C0060D8300079B116059488081CA9470238C421003FCF1500
+31D4150031D4150031D4150031D4150031D4150031D4150031D4150031D415
+0031D4150031D4150031D4150031D4150031D4150031D4150031D4A7570000
+A75A0000A85E0000AC630000B46A0000C1720202D67A0304ED810309FA8301
+12FA80021EF174012FE3650043D852005BD13A0073AE1E00908C0E16A61C02
+1FD60E0332D60C0731D60C0731D60C0731D60C0731D60C0731D60C0731D60C
+0731D60C0731D60C0731D60C0731D60C0731D60C0731D60C0731D60C0731D6
+0C0731D6A7570000A65A0000A85F0000AC640000B36A0000C0720102D57B03
+03ED820307F9840111F581021CEB79012BE16A003FD4590056C846006CB030
+028584250EA24A0606C4000101EC010302E7010302E7010302E7010302E701
+0302E7010302E7010302E7010302E7010302E7010302E7010302E7010302E7
+010302E7010302E7010302E7A7570000A65B0000A85F0000AB640000B26A00
+00BF720101D37B0303EC830306FA86010FF383011AE77C0128DE70003BD061
+0050BA580163A85206727D410093422500BF041501DB011301DD011301DD01
+1301DD011301DD011301DD011301DD011301DD011301DD011301DD011301DD
+011301DD011301DD011301DD011301DD011301DDA7580000A65B0000A85F00
+00AA640000B16A0000BE730101D27C0202EA840306FB89010DEF860017E57F
+0024D8760035C7740144B67B0D489A7D0F576E7D07784A7207950C0D06DC07
+0B05DE070B05DE070B05DE070B05DE070B05DE070B05DE070B05DE070B05DE
+070B05DE070B05DE070B05DE070B05DE070B05DE070B05DE070B05DEA75800
+00A65B0000A7600000AA650000B06B0000BC730101CF7C0202E7850205F98A
+010BED880014E084001FCA830229B38708309A970E3477A30D4D51A2056C32
+9D0186077701A1006D02A5006D02A5006D02A5006D02A5006D02A5006D02A5
+006D02A5006D02A5006D02A5006D02A5006D02A5006D02A5006D02A5006D02
+A5006D02A5A7590000A65C0000A7600000A9650000AE6B0000BA740101CD7D
+0101E6870203F68B0108EA8A0010D38B0218BB92061D9C9F082679AD053A5A
+AF005741B0006E25A70184058B089600820A9C00820A9C00820A9C00820A9C
+00820A9C00820A9C00820A9C00820A9C00820A9C00820A9C00820A9C00820A
+9C00820A9C00820A9C00820A9CA7590000A65C0000A7610000A8650000AD6C
+0000B8740000CB7E0101E3870103F58C0107DD8F010EC3990611ACA60A168D
+BB0A2268B900414EBD005935BD006E1FBD097C07AA128C009E1493009E1493
+009E1493009E1493009E1493009E1493009E1493009E1493009E1493009E14
+93009E1493009E1493009E1493009E1493009E1493A75A0000A65D0000A661
+0000A8660000AC6C0000B8750000CA7E0101E3870103E3920305C99C0607B4
+A90A0C9DBC0C137ACA04295CCA004343CE005A2CCF006C1AD20D7602BB1487
+00C6228500C6228500C6228500C6228500C6228500C6228500C6228500C622
+8500C6228500C6228500C6228500C6228500C6228500C6228500C62285A85B
+0000A65E0000A6620000A8660000AC6C0000B8750000CA7E0101D2890202C4
+980304B7A70607A6B70A0A90CF0A156ED5002D53D900433BDD005A24E80168
+12E70C7300DF1D7C00E4317800E4317800E4317800E4317800E4317800E431
+7800E4317800E4317800E4317800E4317800E4317800E4317800E4317800E4
+317800E43178A85B0000A65E0000A6620000A8660000AC6C0000B8740000C1
+7E0101B68C0102AF9D0303A8B105069CC60B0987E00A1666E6002D4BEB0043
+34FA01571DFA026509F60B7000F5287002FE446B02FE446B02FE446B02FE44
+6B02FE446B02FE446B02FE446B02FE446B02FE446B02FE446B02FE446B02FE
+446B02FE446B02FE446B02FE446BA85B0000A65E0000A6610000A8660000AC
+6C0000B5750000A9810001A49001029FA103039CB8050693D50B0A7FF30B16
+5DF7002D43FA00442AFF045411FF036300FF0E6C00FF356509FF545F09FF54
+5F09FF545F09FF545F09FF545F09FF545F09FF545F09FF545F09FF545F09FF
+545F09FF545F09FF545F09FF545F09FF545F09FF545FA85B0000A65E0000A6
+610000A8660000AC6C0000A07600009B8400019693010293A5020390BE0505
+8AE10B0B74F7091851FE012D37FF044120FF075205FF046200FF196207FF45
+590FFF65530FFF65530FFF65530FFF65530FFF65530FFF65530FFF65530FFF
+65530FFF65530FFF65530FFF65530FFF65530FFF65530FFF65530FFF6553A8
+5B0000A65E0000A6610000A76600009B6D0000937900008F8600018C950101
+89A8020285C205067CE20A0D65F8091A45FE022D2FFE093E15FF055202FF0D
+5C00FF23590BFF554F10FF6E4B10FF6E4B10FF6E4B10FF6E4B10FF6E4B10FF
+6E4B10FF6E4B10FF6E4B10FF6E4B10FF6E4B10FF6E4B10FF6E4B10FF6E4B10
+FF6E4B10FF6E4BA85B0000A65E0000A66100009A6600008E6F00008A7B0000
+878800008497010180AB02027AC605066FE2090E59F60A1A3EFD092B24FE09
+3D0BFE035103FF195304FF314F0EFF63460DFF6F460DFF6F460DFF6F460DFF
+6F460DFF6F460DFF6F460DFF6F460DFF6F460DFF6F460DFF6F460DFF6F460D
+FF6F460DFF6F460DFF6F460DFF6F46A85B0000A65E00009B6100008C670000
+85710000827D00007F8A00007B99000176AE020270C9060763E20A0E50F40D
+1937FC0F291BFE083C0BFF114804FF244A07FF40450BFF66410BFF72410BFF
+72410BFF72410BFF72410BFF72410BFF72410BFF72410BFF72410BFF72410B
+FF72410BFF72410BFF72410BFF72410BFF72410BFF7241A85B0000A15E0000
+8C610000826800007D7200007A7F0000778C0000739C00016DB2020365CB06
+0758E20B0E47F210182DFB112817FD10390BFF1D4007FF314008FF4E3D08FF
+683D09FF733C09FF733C09FF733C09FF733C09FF733C09FF733C09FF733C09
+FF733C09FF733C09FF733C09FF733C09FF733C09FF733C09FF733C09FF733C
+A85B00008E5C0000816100007A69000076740000738000006F8E0000699F00
+0163B602035BCE07074EE20D0E3EF0131725FA122714FE19330BFF263907FF
+3D3906FF523906FF6B3906FF753806FF753806FF753806FF753806FF753806
+FF753806FF753806FF753806FF753806FF753806FF753806FF753806FF7538
+06FF753806FF753892590000815C000078620000726B00006F7600006C8200
+006690000060A300015ABA020351CF070745E00E0E37F015161DFA11280BFE
+163507FF2B3405FF423403FF573403FF6C3504FF763504FF763504FF763504
+FF763504FF763504FF763504FF763504FF763504FF763504FF763504FF7635
+04FF763504FF763504FF763504FF7635>
+<A7520000A7550000A8590000AC5E0000B2630001BD6A0202CE710404E67807
+07F5770613FB730520FC660531FA560448F8420660EF260977D5141887B905
+2A92A10447997E0271AA6503A1AF6503A1AF6503A1AF6503A1AF6503A1AF65
+03A1AF6503A1AF6503A1AF6503A1AF6503A1AF6503A1AF6503A1AF6503A1AF
+6503A1AF6503A1AFA7520000A7550000A8590000AC5E0000B2630001BD6A02
+02CE710404E6780707F5770613FB730520FC660531FA560448F8420660EF26
+0977D5141887B9052A92A10447997E0271AA6503A1AF6503A1AF6503A1AF65
+03A1AF6503A1AF6503A1AF6503A1AF6503A1AF6503A1AF6503A1AF6503A1AF
+6503A1AF6503A1AF6503A1AF6503A1AFA7520000A7550000A8590000AC5E00
+00B2630001BD6A0202CE710404E6780707F5770613FB730520FC660531FA56
+0448F8420660EF260977D5141887B9052A92A10447997E0271AA6503A1AF65
+03A1AF6503A1AF6503A1AF6503A1AF6503A1AF6503A1AF6503A1AF6503A1AF
+6503A1AF6503A1AF6503A1AF6503A1AF6503A1AF6503A1AFA7520000A75500
+00A8590000AC5E0000B2630001BD6A0202CE710404E6780707F5770613FB73
+0520FC660531FA560448F8420660EF260977D5141887B9052A92A10447997E
+0271AA6503A1AF6503A1AF6503A1AF6503A1AF6503A1AF6503A1AF6503A1AF
+6503A1AF6503A1AF6503A1AF6503A1AF6503A1AF6503A1AF6503A1AF6503A1
+AFA7520000A7550000A8590000AC5E0000B2630001BD6A0202CE710404E678
+0707F5770613FB730520FC660531FA560448F8420660EF260977D5141887B9
+052A92A10447997E0271AA6503A1AF6503A1AF6503A1AF6503A1AF6503A1AF
+6503A1AF6503A1AF6503A1AF6503A1AF6503A1AF6503A1AF6503A1AF6503A1
+AF6503A1AF6503A1AFA7520000A7550000A8590000AC5E0000B2630001BD6A
+0202CE710404E6780707F5770613FB730520FC660531FA560448F8420660EF
+260977D5141887B9052A92A10447997E0271AA6503A1AF6503A1AF6503A1AF
+6503A1AF6503A1AF6503A1AF6503A1AF6503A1AF6503A1AF6503A1AF6503A1
+AF6503A1AF6503A1AF6503A1AF6503A1AFA7520000A7550000A8590000AC5E
+0000B2630001BD6A0202CE710404E6780707F5770613FB730520FC660531FA
+560448F8420660EF260977D5141887B9052A92A10447997E0271AA6503A1AF
+6503A1AF6503A1AF6503A1AF6503A1AF6503A1AF6503A1AF6503A1AF6503A1
+AF6503A1AF6503A1AF6503A1AF6503A1AF6503A1AF6503A1AFA7520000A755
+0000A8590000AC5E0000B2630001BD6A0202CE710404E6780707F5770613FB
+730520FC660531FA560448F8420660EF260977D5141887B9052A92A1044799
+7E0271AA6503A1AF6503A1AF6503A1AF6503A1AF6503A1AF6503A1AF6503A1
+AF6503A1AF6503A1AF6503A1AF6503A1AF6503A1AF6503A1AF6503A1AF6503
+A1AFA7520000A7550000A8590000AC5E0000B2630001BD6A0202CE710404E6
+780707F5770613FB730520FC660531FA560448F8420660EF260977D5141887
+B9052A92A10447997E0271AA6503A1AF6503A1AF6503A1AF6503A1AF6503A1
+AF6503A1AF6503A1AF6503A1AF6503A1AF6503A1AF6503A1AF6503A1AF6503
+A1AF6503A1AF6503A1AFA7520000A7550000A8590000AC5E0000B2630001BD
+6A0202CE710404E6780707F5770613FB730520FC660531FA560448F8420660
+EF260977D5141887B9052A92A10447997E0271AA6503A1AF6503A1AF6503A1
+AF6503A1AF6503A1AF6503A1AF6503A1AF6503A1AF6503A1AF6503A1AF6503
+A1AF6503A1AF6503A1AF6503A1AF6503A1AFA7520000A7550000A8590000AC
+5E0000B2630001BD6A0202CE710404E6780707F5770613FB730520FC660531
+FA560448F8420660EF260977D5141887B9052A92A10447997E0271AA6503A1
+AF6503A1AF6503A1AF6503A1AF6503A1AF6503A1AF6503A1AF6503A1AF6503
+A1AF6503A1AF6503A1AF6503A1AF6503A1AF6503A1AF6503A1AFA7520000A7
+550000A8590000AC5E0000B2630001BD6A0202CE710404E6780707F5780612
+FB730520FC670531FA560448F8430660EF260977D5141887B9052992A10446
+997E0270AA63039FB063039FB063039FB063039FB063039FB063039FB06303
+9FB063039FB063039FB063039FB063039FB063039FB063039FB063039FB063
+039FB0A7530000A7560000A85A0000AB5E0000B2640000BC6A0102CD720304
+E5790707F67A0511FB76051EFC6B052EF7590345F347035EF32C0775D01511
+89B10420969C033C9D7A015EAD4B0178BB4A0178BB4A0178BB4A0178BB4A01
+78BB4A0178BB4A0178BB4A0178BB4A0178BB4A0178BB4A0178BB4A0178BB4A
+0178BB4A0178BB4A0178BBA7530000A7560000A85A0000AB5F0000B1640000
+BC6B0101CC720304E47A0606F67D050FFB79041DFC6F042CF75E0242EF4B02
+5BEC300472CB170A8BAB051999960131A174004FB031004FC831004FC83100
+4FC831004FC831004FC831004FC831004FC831004FC831004FC831004FC831
+004FC831004FC831004FC831004FC831004FC8A7540000A7570000A85A0000
+AA5F0000B0640000BB6B0101CB730303E37B0606F67F040EFC7B031BFD7404
+29F362013EEC4F0157EA350170C418038DA606139B8F0027A56F0042B42300
+5DC823005FC723005FC723005FC723005FC723005FC723005FC723005FC723
+005FC723005FC723005FC723005FC723005FC723005FC723005FC7A7540000
+A7570000A75B0000AA5F0000AF650000BA6B0101C9730303E17B0505F58003
+0EFD7E0319F8760327F166003BE8530054E53D006CC71D0089AD0F11975207
+28C1050108E50D0A69C60D0A69C60D0A69C60D0A69C60D0A69C60D0A69C60D
+0A69C60D0A69C60D0A69C60D0A69C60D0A69C60D0A69C60D0A69C60D0A69C6
+0D0A69C6A7540000A6570000A75B0000AA600000AF650000B96C0101C87402
+03E07C0405F381030DFA800217F87C0324EF6B0038E359004FD8460066BB39
+067CA032128F621610B7131236D1002855C5002855C5002855C5002855C500
+2855C5002855C5002855C5002855C5002855C5002855C5002855C5002855C5
+002855C5002855C5002855C5A7550000A6580000A75B0000A9600000AE6500
+00B76C0101C6750202DE7D0404F382030BFA830115F67F0222EB700034DE62
+0149C5650A56AE65116586580B8455440BAA0F1E09D300401DC700401DC700
+401DC700401DC700401DC700401DC700401DC700401DC700401DC700401DC7
+00401DC700401DC700401DC700401DC700401DC7A8550000A6580000A75C00
+00A9600000AD660000B66D0001C4750202DC7E0304F3850309F7850113F181
+011FE379022ECA7C0837B882133E9C87174B70870D6E4178069613720BAB00
+4A08C0004B08C0004B08C0004B08C0004B08C0004B08C0004B08C0004B08C0
+004B08C0004B08C0004B08C0004B08C0004B08C0004B08C0004B08C0A85600
+00A6590000A65C0000A8610000AC660000B46D0000C2760102D97F0303F187
+0208F7880110E985011ACD8B081FB6920D25A2A415277FAF134058B00B6133
+A8067E13920895008E169C008E169C008E169C008E169C008E169C008E169C
+008E169C008E169C008E169C008E169C008E169C008E169C008E169C008E16
+9C008E169CA8560000A6590000A65D0000A8610000AB670000B26E0000C076
+0101D6800202EF890205F18C020BD495070EB99F09129EB20C197CBE052E5C
+BD004A42C1006229C0037516BD118000A4169100A4169100A4169100A41691
+00A4169100A4169100A4169100A4169100A4169100A4169100A4169100A416
+9100A4169100A4169100A41691A8570000A65A0000A65E0000A7620000AA67
+0000B06E0000BD770001D3810101EB8A0104D3970406BDA20609AAB20C0D90
+C70A196BCB003450CE004C38D2006222D806700FCF117C00CE268100CE2681
+00CE268100CE268100CE268100CE268100CE268100CE268100CE268100CE26
+8100CE268100CE268100CE268100CE268100CE2681A9580000A75B0000A65E
+0000A6630000A9680000AF6F0000BC770000D2810101C58F0202BBA00405AD
+AE07089EC40C0B81D8061E62DB003548DE004C30EA015F1BF1076C06E60F79
+00F23D7400F23D7400F23D7400F23D7400F23D7400F23D7400F23D7400F23D
+7400F23D7400F23D7400F23D7400F23D7400F23D7400F23D7400F23D74AA59
+0000A75C0000A65F0000A6630000A9680000AF6F0000BC770000B4840101AD
+930202A8A50404A0BA070794D50D0B79EA071E59ED003440F2004C27FD035C
+11FF066A00FF157207FF516607FF546507FF546507FF546507FF546507FF54
+6507FF546507FF546507FF546507FF546507FF546507FF546507FF546507FF
+546507FF5465AA5A0000A75C0000A65F0000A6630000A9680000AF6F0000A7
+790000A28701019D9702029AA9030496C507068BE60D0C70F7061F4FFC0035
+37FF044A1DFF055A04FF066800FF1F660EFF62590EFF65580EFF65580EFF65
+580EFF65580EFF65580EFF65580EFF65580EFF65580EFF65580EFF65580EFF
+65580EFF65580EFF65580EFF6558AA5A0000A75C0000A65F0000A6630000A9
+680000A16F0000987B0000958A0101919901028EAE03038ACB070780ED0C0E
+62FA062042FF01352BFF074711FF055800FF0F6100FF295C12FF714E12FF72
+4E12FF724E12FF724E12FF724E12FF724E12FF724E12FF724E12FF724E12FF
+724E12FF724E12FF724E12FF724E12FF724E12FF724EAA5A0000A75C0000A6
+5F0000A66300009E680000937100008D7E00008B8C0001889C010184B10303
+7FCF070772EC0A1154F907203AFE073321FE074507FF045700FF1A5905FF3A
+520FFF72490FFF73490FFF73490FFF73490FFF73490FFF73490FFF73490FFF
+73490FFF73490FFF73490FFF73490FFF73490FFF73490FFF73490FFF7349AA
+5A0000A75C0000A65F0000A06300008F6900008973000085800000828E0000
+7F9E01017AB4030473D1070865EB0B114BF70A1F32FD0D3016FE054508FF12
+4E01FF254F09FF4B470CFF74430CFF75430CFF75430CFF75430CFF75430CFF
+75430CFF75430CFF75430CFF75430CFF75430CFF75430CFF75430CFF75430C
+FF75430CFF7543AA5A0000A75C0000A45F00008F630000856A000081750000
+7E8200007A90000076A1010170B8030468D4070959E90D1143F60F1E28FD0E
+2F12FE0D4008FF1E4504FF33450AFF563F0AFF763F0AFF773E0AFF773E0AFF
+773E0AFF773E0AFF773E0AFF773E0AFF773E0AFF773E0AFF773E0AFF773E0A
+FF773E0AFF773E0AFF773E0AFF773EAA5A0000A75C0000905E000083630000
+7D6C00007977000076830000729200006CA4010166BC03045DD508094FE90E
+113AF4121D21FC102E12FE1A390AFF2A3C08FF433B07FF5A3B08FF773908FF
+783908FF783908FF783908FF783908FF783908FF783908FF783908FF783908
+FF783908FF783908FF783908FF783908FF783908FF7839AA5A0000935A0000
+835D00007A640000756E0000727900006E8500006994000063A801015CC104
+0453D6090946E6111031F3141C19FC112E0BFE1C3708FF313705FF493704FF
+5E3605FF783606FF793606FF793606FF793606FF793606FF793606FF793606
+FF793606FF793606FF793606FF793606FF793606FF793606FF793606FF7936
+9958000084590000795E0000726600006D7000006A7B0000658700005F9800
+005AAC010153C3040449D60A093DE612102AF4161B0EFD0D3008FE213305FF
+373202FF4E3202FF613202FF793203FF7A3203FF7A3203FF7A3203FF7A3203
+FF7A3203FF7A3203FF7A3203FF7A3203FF7A3203FF7A3203FF7A3203FF7A32
+03FF7A3203FF7A328756000079580000705F00006A67000066710000627D00
+005C8A0000579B000052B101014BC7050540D50A0936E6150F20F5141C09FE
+102E07FF282D02FF3D2E01FF532D01FF652D02FF7A2E02FF7B2E02FF7B2E02
+FF7B2E02FF7B2E02FF7B2E02FF7B2E02FF7B2E02FF7B2E02FF7B2E02FF7B2E
+02FF7B2E02FF7B2E02FF7B2E02FF7B2E>
+<A74E0000A7510000A8550000AA590000AF5E0000B8630101C76A0304DA7007
+07EE72090EF66C071CF860082CF7510941F43C0B59ED25126EE417257AE00F
+4481D50C6785A9068D91A60AF18AA30BFD89A30BFD89A30BFD89A30BFD89A3
+0BFD89A30BFD89A30BFD89A30BFD89A30BFD89A30BFD89A30BFD89A30BFD89
+A30BFD89A30BFD89A74E0000A7510000A8550000AA590000AF5E0000B86301
+01C76A0304DA700707EE72090EF66C071CF860082CF7510941F43C0B59ED25
+126EE417257AE00F4481D50C6785A9068D91A60AF18AA30BFD89A30BFD89A3
+0BFD89A30BFD89A30BFD89A30BFD89A30BFD89A30BFD89A30BFD89A30BFD89
+A30BFD89A30BFD89A30BFD89A30BFD89A74E0000A7510000A8550000AA5900
+00AF5E0000B8630101C76A0304DA700707EE72090EF66C071CF860082CF751
+0941F43C0B59ED25126EE417257AE00F4481D50C6785A9068D91A60AF18AA3
+0BFD89A30BFD89A30BFD89A30BFD89A30BFD89A30BFD89A30BFD89A30BFD89
+A30BFD89A30BFD89A30BFD89A30BFD89A30BFD89A30BFD89A74E0000A75100
+00A8550000AA590000AF5E0000B8630101C76A0304DA700707EE72090EF66C
+071CF860082CF7510941F43C0B59ED25126EE417257AE00F4481D50C6785A9
+068D91A60AF18AA30BFD89A30BFD89A30BFD89A30BFD89A30BFD89A30BFD89
+A30BFD89A30BFD89A30BFD89A30BFD89A30BFD89A30BFD89A30BFD89A30BFD
+89A74E0000A7510000A8550000AA590000AF5E0000B8630101C76A0304DA70
+0707EE72090EF66C071CF860082CF7510941F43C0B59ED25126EE417257AE0
+0F4481D50C6785A9068D91A60AF18AA30BFD89A30BFD89A30BFD89A30BFD89
+A30BFD89A30BFD89A30BFD89A30BFD89A30BFD89A30BFD89A30BFD89A30BFD
+89A30BFD89A30BFD89A74E0000A7510000A8550000AA590000AF5E0000B863
+0101C76A0304DA700707EE72090EF66C071CF860082CF7510941F43C0B59ED
+25126EE417257AE00F4481D50C6785A9068D91A60AF18AA30BFD89A30BFD89
+A30BFD89A30BFD89A30BFD89A30BFD89A30BFD89A30BFD89A30BFD89A30BFD
+89A30BFD89A30BFD89A30BFD89A30BFD89A74E0000A7510000A8550000AA59
+0000AF5E0000B8630101C76A0304DA700707EE72090EF66C071CF860082CF7
+510941F43C0B59ED25126EE417257AE00F4481D50C6785A9068D91A60AF18A
+A30BFD89A30BFD89A30BFD89A30BFD89A30BFD89A30BFD89A30BFD89A30BFD
+89A30BFD89A30BFD89A30BFD89A30BFD89A30BFD89A30BFD89A74E0000A751
+0000A8550000AA590000AF5E0000B8630101C76A0304DA700707EE72090EF6
+6C071CF860082CF7510941F43C0B59ED25126EE417257AE00F4481D50C6785
+A9068D91A60AF18AA30BFD89A30BFD89A30BFD89A30BFD89A30BFD89A30BFD
+89A30BFD89A30BFD89A30BFD89A30BFD89A30BFD89A30BFD89A30BFD89A30B
+FD89A74E0000A7510000A8550000AA590000AF5E0000B8630101C76A0304DA
+700707EE72090EF66C071CF860082CF7510941F43C0B59ED25126EE417257A
+E00F4481D50C6785A9068D91A60AF18AA30BFD89A30BFD89A30BFD89A30BFD
+89A30BFD89A30BFD89A30BFD89A30BFD89A30BFD89A30BFD89A30BFD89A30B
+FD89A30BFD89A30BFD89A74E0000A7510000A8550000AA590000AF5E0000B8
+630101C76A0304DA700707EE72090EF66C071CF860082CF7510941F43C0B59
+ED25126EE417257AE00F4481D50C6785A9068D91A60AF18AA30BFD89A30BFD
+89A30BFD89A30BFD89A30BFD89A30BFD89A30BFD89A30BFD89A30BFD89A30B
+FD89A30BFD89A30BFD89A30BFD89A30BFD89A74E0000A7520000A8560000AA
+590000AF5E0000B8640101C66A0304D9700607EE74090DF76E061CF962072B
+F9520741F63F0959EF27106DE618217BDA0D3C83CF0B5D87A60680939D09E2
+919E0AF68E9E0AF68E9E0AF68E9E0AF68E9E0AF68E9E0AF68E9E0AF68E9E0A
+F68E9E0AF68E9E0AF68E9E0AF68E9E0AF68E9E0AF68E9E0AF68EA74F0000A6
+520000A8560000AA5A0000AE5E0000B7640101C56B0303D8710606EF76090C
+F770061AFA650629FA56073EF7440757F02C0E6BE6191C7CD20C3187C5094F
+8AA10571958F07CE999308E7979308E7979308E7979308E7979308E7979308
+E7979308E7979308E7979308E7979308E7979308E7979308E7979308E79793
+08E797A74F0000A7520000A7560000AA5A0000AE5F0000B7650101C46B0303
+D7720606EF78090BF8720619FB690628FB5B063CF9490655F3310C69E61B16
+7DCD0A288ABE07448D9B0463987F05B6A38406D1A08406D1A08406D1A08406
+D1A08406D1A08406D1A08406D1A08406D1A08406D1A08406D1A08406D1A084
+06D1A08406D1A08406D1A0A74F0000A7530000A7570000A95B0000AD5F0000
+B6650101C36C0203D6730506EE79080AF8740518FB6D0626FC5F053AF94D05
+52F4360A67E71D107FCB0C218BB70639919704579B6D039BAD7104B4A97104
+B4A97104B4A97104B4A97104B4A97104B4A97104B4A97104B4A97104B4A971
+04B4A97104B4A97104B4A97104B4A97104B4A9A7500000A7530000A7570000
+A95B0000AD600000B5660101C26C0203D5740505ED7A0809F9770517FB7105
+24FB630437F851044FF33B0765E61E0980C80D1B8DB1042F95910654A04D04
+D0AE3500F9AB3500F9AB3500F9AB3500F9AB3500F9AB3500F9AB3500F9AB35
+00F9AB3500F9AB3500F9AB3500F9AB3500F9AB3500F9AB3500F9ABA8510000
+A7540000A7570000A85B0000AC600000B4660101C16D0202D4750404EC7B07
+09F97A0415FB750522FB680434F756034CF1420463E422057EC71C19899912
+27A03F0954C31907D9B00E00E0B00E00E0B00E00E0B00E00E0B00E00E0B00E
+00E0B00E00E0B00E00E0B00E00E0B00E00E0B00E00E0B00E00E0B00E00E0B0
+0E00E0B0A8510000A7540000A7580000A85C0000AC600000B3660001C06E02
+02D2750404EA7C0608FA7D0313FC7A041FF86C0331F25B0147E64E055CD44B
+126BB748217E74331FA8202084B501176EBF0017F5B10017F5B10017F5B100
+17F5B10017F5B10017F5B10017F5B10017F5B10017F5B10017F5B10017F5B1
+0017F5B10017F5B10017F5B1A9520000A7550000A7580000A85C0000AB6100
+00B2670000BE6E0102D0760304E87E0507FA810210FD7F031DFA74022CEA6E
+093AD0781743BB791F5396731E6E656A21921E4E26B8003C3AC300588EB100
+588EB100588EB100588EB100588EB100588EB100588EB100588EB100588EB1
+00588EB100588EB100588EB100588EB100588EB1A9530000A7560000A65900
+00A75D0000AA610000B1680000BC6F0101CE770303E6800405F782020FF880
+021AE8800625D0891327BB911D2EA79B24387F9F215856961A792E9A228A09
+7B24A900813CA600813CA600813CA600813CA600813CA600813CA600813CA6
+00813CA600813CA600813CA600813CA600813CA600813CA600813CA6A95400
+00A7560000A6590000A75D0000A9620000AF680000BA700101CB780202E381
+0304F986020CE98B0413CE940D16B89E131BA7AF1C1F8FBF212E66C2175239
+B70F7218AB118805A0209500AA399200AA399200AA399200AA399200AA3992
+00AA399200AA399200AA399200AA399200AA399200AA399200AA399200AA39
+9200AA3992AA540000A7570000A65A0000A65E0000A9630000AE690000B870
+0001C8790102DF820203E18E0505CC9B080AB6A70B0DA2B80F1285CB0C2268
+D409394BD6075330D706671BD9117303C8188200D12B7F00D12B7F00D12B7F
+00D12B7F00D12B7F00D12B7F00D12B7F00D12B7F00D12B7F00D12B7F00D12B
+7F00D12B7F00D12B7F00D12B7FAA550000A8580000A65B0000A65F0000A863
+0000AC690000B5710000C47A0101C7860102BC950203B4A70506A5B7090993
+D00C0F74DD032656E0003D3DE4005524F3016410F10A7000EE1E7801F84271
+01F8427101F8427101F8427101F8427101F8427101F8427101F8427101F842
+7101F8427101F8427101F8427101F8427101F84271AB560000A8590000A65C
+0000A6600000A7640000AA6A0000B3720000B57C0000AD8A0101A79A0203A3
+AE04059AC609088AE30D106BF003264CF3003D35FF02521BFE036104FB0A6E
+00FE2A6B0AFF5B610AFF5B610AFF5B610AFF5B610AFF5B610AFF5B610AFF5B
+610AFF5B610AFF5B610AFF5B610AFF5B610AFF5B610AFF5B610AFF5B61AC57
+0000A95A0000A65D0000A6600000A7640000AA6A0000AB720000A17E00009C
+8D0101989D020295B304058FD3090982F40D115FFB032742FE013E29FF064F
+0EFF046000FF136603FF375F13FF735213FF735213FF735213FF735213FF73
+5213FF735213FF735213FF735213FF735213FF735213FF735213FF735213FF
+735213FF7352AD580000A95A0000A65D0000A6600000A7640000A66A000099
+74000094810000909001018DA002028AB8040484D9090975F70C1450FD0328
+36FF053B1EFF064E04FF055E00FF1E5C08FF495411FF784C11FF784C11FF78
+4C11FF784C11FF784C11FF784C11FF784C11FF784C11FF784C11FF784C11FF
+784C11FF784C11FF784C11FF784CAD580000A95A0000A65D0000A6600000A6
+640000946B00008D7600008A8300008692000183A301027FBC040576D9080B
+67F50C1446FB07262FFE0C3813FF034D04FF135502FF2A530CFF5B490EFF79
+460EFF79460EFF79460EFF79460EFF79460EFF79460EFF79460EFF79460EFF
+79460EFF79460EFF79460EFF79460EFF79460EFF7946AD580000A95A0000A6
+5D0000A660000092640000896D000084780000818500007E9400007AA60102
+74C004056ADC090C5AF20D143FFA0E2422FE0A370DFE0A4904FF1F4C06FF39
+480CFF62420BFF7B410BFF7B410BFF7B410BFF7B410BFF7B410BFF7B410BFF
+7B410BFF7B410BFF7B410BFF7B410BFF7B410BFF7B410BFF7B410BFF7B41AD
+580000A95A0000A65D0000935F000086650000806F00007C7A00007A870000
+7596000070AA010269C205065EDB0A0C50F0101436F810231BFD0C370DFF17
+4107FF2B4108FF4A3E09FF653E0AFF7D3C0AFF7D3C0AFF7D3C0AFF7D3C0AFF
+7D3C0AFF7D3C0AFF7D3C0AFF7D3C0AFF7D3C0AFF7D3C0AFF7D3C0AFF7D3C0A
+FF7D3C0AFF7D3CAD580000A95A0000965C0000855F00007D66000078700000
+757C0000728900006C99000066AE01025FC7050653DD0A0C46EE12132CF712
+2319FD17310CFF213A08FF383906FF4F3906FF683908FF7E3708FF7E3708FF
+7E3708FF7E3708FF7E3708FF7E3708FF7E3708FF7E3708FF7E3708FF7E3708
+FF7E3708FF7E3708FF7E3708FF7E37AD5800009C590000875A00007B5F0000
+74680000707200006D7E0000698B0000639C00005DB2020254C806064ADC0C
+0C3EED141225F714220EFD133308FF263505FF3E3403FF553503FF6A3505FF
+7E3405FF7E3405FF7E3405FF7E3405FF7E3405FF7E3405FF7E3405FF7E3405
+FF7E3405FF7E3405FF7E3405FF7E3405FF7E3405FF7E34A458000089570000
+7B5A0000726000006D69000069740000658000005F8E00005AA0000054B702
+024CCC060640DB0D0C37ED17111AF7112308FE153105FF2C3003FF443001FF
+5A3001FF6D3003FF7E3003FF7E3003FF7E3003FF7E3003FF7E3003FF7E3003
+FF7E3003FF7E3003FF7E3003FF7E3003FF7E3003FF7E3003FF7E3003FF7E30
+8E5500007C560000715A00006A620000656B0000617600005B820000569100
+0052A400004CBA020243CC070638DB0E0C2EEE181113F9112409FE1E2A04FF
+332B00FF4A2C00FF5E2B01FF6F2B02FF7F2B02FF7F2B02FF7F2B02FF7F2B02
+FF7F2B02FF7F2B02FF7F2B02FF7F2B02FF7F2B02FF7F2B02FF7F2B02FF7F2B
+02FF7F2B02FF7F2B7F52000072550000695B0000626200005D6C0000597700
+00538500004E9400004AA8000044BB020239C8070730DB0F0C26F0181214FA
+1B1E08FF252502FF392700FF4F2700FF622601FF712701FF802701FF802701
+FF802701FF802701FF802701FF802701FF802701FF802701FF802701FF8027
+01FF802701FF802701FF802701FF8027>
+<A6490000A64C0000A7500000AA550000AE590000B55D0001C0620303D16706
+07E36A090DEF660A18EF5C0D25EF521333EA3E164AE3281C5EE0203065DD18
+4C6BDF16746DC712A173B110E5759C0CFF739C0CFF749C0CFF749C0CFF749C
+0CFF749C0CFF749C0CFF749C0CFF749C0CFF749C0CFF749C0CFF749C0CFF74
+9C0CFF749C0CFF74A6490000A64C0000A7500000AA550000AE590000B55D00
+01C0620303D1670607E36A090DEF660A18EF5C0D25EF521333EA3E164AE328
+1C5EE0203065DD184C6BDF16746DC712A173B110E5759C0CFF739C0CFF749C
+0CFF749C0CFF749C0CFF749C0CFF749C0CFF749C0CFF749C0CFF749C0CFF74
+9C0CFF749C0CFF749C0CFF749C0CFF74A6490000A64C0000A7500000AA5500
+00AE590000B55D0001C0620303D1670607E36A090DEF660A18EF5C0D25EF52
+1333EA3E164AE3281C5EE0203065DD184C6BDF16746DC712A173B110E5759C
+0CFF739C0CFF749C0CFF749C0CFF749C0CFF749C0CFF749C0CFF749C0CFF74
+9C0CFF749C0CFF749C0CFF749C0CFF749C0CFF749C0CFF74A6490000A64C00
+00A7500000AA550000AE590000B55D0001C0620303D1670607E36A090DEF66
+0A18EF5C0D25EF521333EA3E164AE3281C5EE0203065DD184C6BDF16746DC7
+12A173B110E5759C0CFF739C0CFF749C0CFF749C0CFF749C0CFF749C0CFF74
+9C0CFF749C0CFF749C0CFF749C0CFF749C0CFF749C0CFF749C0CFF749C0CFF
+74A6490000A64C0000A7500000AA550000AE590000B55D0001C0620303D167
+0607E36A090DEF660A18EF5C0D25EF521333EA3E164AE3281C5EE0203065DD
+184C6BDF16746DC712A173B110E5759C0CFF739C0CFF749C0CFF749C0CFF74
+9C0CFF749C0CFF749C0CFF749C0CFF749C0CFF749C0CFF749C0CFF749C0CFF
+749C0CFF749C0CFF74A6490000A64C0000A7500000AA550000AE590000B55D
+0001C0620303D1670607E36A090DEF660A18EF5C0D25EF521333EA3E164AE3
+281C5EE0203065DD184C6BDF16746DC712A173B110E5759C0CFF739C0CFF74
+9C0CFF749C0CFF749C0CFF749C0CFF749C0CFF749C0CFF749C0CFF749C0CFF
+749C0CFF749C0CFF749C0CFF749C0CFF74A6490000A64C0000A7500000AA55
+0000AE590000B55D0001C0620303D1670607E36A090DEF660A18EF5C0D25EF
+521333EA3E164AE3281C5EE0203065DD184C6BDF16746DC712A173B110E575
+9C0CFF739C0CFF749C0CFF749C0CFF749C0CFF749C0CFF749C0CFF749C0CFF
+749C0CFF749C0CFF749C0CFF749C0CFF749C0CFF749C0CFF74A6490000A64C
+0000A7500000AA550000AE590000B55D0001C0620303D1670607E36A090DEF
+660A18EF5C0D25EF521333EA3E164AE3281C5EE0203065DD184C6BDF16746D
+C712A173B110E5759C0CFF739C0CFF749C0CFF749C0CFF749C0CFF749C0CFF
+749C0CFF749C0CFF749C0CFF749C0CFF749C0CFF749C0CFF749C0CFF749C0C
+FF74A6490000A64D0000A7510000AA550000AE590000B55E0001C0620203D1
+680607E36B090DEF670A18F05D0C25F0531233EC3F154AE4281B5FE1202E66
+DD184A6CE116736FC8129F74B20FE3779D0CFF759D0CFF759D0CFF759D0CFF
+759D0CFF759D0CFF759D0CFF759D0CFF759D0CFF759D0CFF759D0CFF759D0C
+FF759D0CFF759D0CFF75A6490000A64D0000A7510000AA550000AD590000B4
+5E0000BF630203D0680507E46C090CF0690917F15F0B24F2551133EE42124A
+E72A185FE3202968DE174470E5146F73CC109978B40DDE7C9F0CFF789F0CFF
+789F0CFF789F0CFF789F0CFF789F0CFF789F0CFF789F0CFF789F0CFF789F0C
+FF789F0CFF789F0CFF789F0CFF789F0CFF78A74A0000A64E0000A7520000A9
+560000AD5A0000B45E0000BE630203CF690506E46E090BF06B0916F2610B23
+F3560F33F144104AE92D165FE520256BDF153F73E6136976D00F937CB50CD8
+81A00CFF7CA00CFF7CA00CFF7CA00CFF7CA00CFF7CA00CFF7CA00CFF7CA00C
+FF7CA00CFF7CA00CFF7CA00CFF7CA00CFF7CA00CFF7CA00CFF7CA74A0000A7
+4E0000A7520000A9560000AD5A0000B35F0000BE640203CE6A0506E470090A
+F06C0915F4630A22F5580D33F3470D4BEC2F1360E720206DE0143977E71263
+7AD30E8C80B00ACD87A20CFF7FA20CFF7FA20CFF7FA20CFF7FA20CFF7FA20C
+FF7FA20CFF7FA20CFF7FA20CFF7FA20CFF7FA20CFF7FA20CFF7FA20CFF7FA2
+0CFF7FA74B0000A74F0000A7520000A9560000AC5A0000B35F0000BD640202
+CD6B0405E4710809F16E0914F5660922F75A0B32F5490B4AEF311060E9201C
+70E112347BE8105D7ECA0C7F85A807BD8DA40CFE83A40CFE83A40CFE83A40C
+FE83A40CFE83A40CFE83A40CFE83A40CFE83A40CFE83A40CFE83A40CFE83A4
+0CFE83A40CFE83A40CFE83A74C0000A74F0000A7530000A8570000AC5B0000
+B2600000BC650202CC6C0405E2720808F1700813F7680821F95C0832F74B09
+4AF2340D60EC1F1773E2122D7EE00E5183BE0A6F8A9B05AA95970AFE8C8B08
+FF908B08FF908B08FF908B08FF908B08FF908B08FF908B08FF908B08FF908B
+08FF908B08FF908B08FF908B08FF908B08FF90A84C0000A7500000A7530000
+A8570000AB5B0000B1600000BB660102CB6D0404E1730808F1730812F96C06
+20FA600730F94F0748F5390A5FEF221074E515257FD60F4685B01172917B0F
+D1A03F00FFA13C00FFA13C00FFA13C00FFA13C00FFA13C00FFA13C00FFA13C
+00FFA13C00FFA13C00FFA13C00FFA13C00FFA13C00FFA13C00FFA1A84D0000
+A7500000A7540000A8580000AB5C0000B0610000BA670102CA6E0304DF7407
+07F2760810FA71061DFB65062DFA550644F741075CEF2B0F70D6312777B025
+3F8B6A1F7A9C3719E1A41400FFA71100FFA71100FFA71100FFA71100FFA711
+00FFA71100FFA71100FFA71100FFA71100FFA71100FFA71100FFA71100FFA7
+1100FFA7A94E0000A7510000A7540000A8580000AA5C0000AF610000B96701
+01C86F0303DE760606F37A070EFA75051BFC6B062AFB5C0440ED61144ACD62
+2255B45E2D698B4B348945386B9C1E50C0B00219FFA7021BFFA7021BFFA702
+1BFFA7021BFFA7021BFFA7021BFFA7021BFFA7021BFFA7021BFFA7021BFFA7
+021BFFA7021BFFA7021BFFA7A94F0000A7520000A7550000A7590000AA5D00
+00AE620000B7680101C6700303DC770505F17C060CFB790419FD730526EB7A
+132BCF822231BE872D3C9E88345874813B75478A598B0F7A78B3004EF39F00
+51F29E0051F29E0051F29E0051F29E0051F29E0051F29E0051F29E0051F29E
+0051F29E0051F29E0051F29E0051F29E0051F29EAA500000A8530000A75600
+00A7590000A95E0000AD630000B5690101C3710202D9790404EF7E040AFC7F
+0215E4890F19CA8E1720BD9B2323ADA62F2C95A9384175AE3E5850B34C6F1F
+AB648F009CB591009EB391009EB391009EB391009EB391009EB391009EB391
+009EB391009EB391009EB391009EB391009EB391009EB391009EB391AB5100
+00A8540000A7570000A65A0000A85E0000AC630000B36A0000C1720102D57A
+0303ED810308D78B080DC4970F11B6A31517A7B21E1D97C328267FCD2C3B55
+CE29573CD3316220D23F7300CF758600D2768500D2768500D2768500D27685
+00D2768500D2768500D2768500D2768500D2768500D2768500D2768500D276
+8500D27685AB520000A9550000A7570000A65B0000A85F0000AA640000B16A
+0000BE730101D27C0202C4880405B7950608B0A8090CA2BB0F1091D115197D
+E31A2760ED193F40EE1A5521E41E680FE72A7201F6577300F7597200F75972
+00F7597200F7597200F7597200F7597200F7597200F7597200F7597200F759
+7200F7597200F7597200F75972AC530000A9560000A7590000A65C0000A760
+0000A9650000AE6B0000BA740101B0800101A88E0202A3A003049FB7060694
+D30B0A7EEF09185CF3002F41F8004727FE04580DFF056800FD186D09FF5561
+0CFF605F0CFF605F0CFF605F0CFF605F0CFF605F0CFF605F0CFF605F0CFF60
+5F0CFF605F0CFF605F0CFF605F0CFF605F0CFF605FAD540000AA570000A75A
+0000A65D0000A6610000A8660000AC6C0000A27600009C8400019893010294
+A5020391BF05058BE20B0B72F7091A4FFD003035FF04441BFF065600FF0566
+00FF236110FF675313FF765013FF765013FF765013FF765013FF765013FF76
+5013FF765013FF765013FF765013FF765013FF765013FF765013FF7650AF56
+0000AB580000A85B0000A65E0000A6610000A86600009B6D00009379000090
+8600018D95010189A9020385C405067CE40A0D62F8081B42FF02302CFE0A41
+0FFF045500FF135D02FF305710FF704B10FF7B4A10FF7B4A10FF7B4A10FF7B
+4A10FF7B4A10FF7B4A10FF7B4A10FF7B4A10FF7B4A10FF7B4A10FF7B4A10FF
+7B4A10FF7B4AB0570000AB590000A85B0000A65E0000A6610000986600008E
+6F0000897B000086880000839801017FAC02027AC805066EE50A0F56F60A1B
+3BFE0A2D1FFE074009FF0A5000FF1F5308FF444B0DFF71450DFF80450DFF80
+450DFF80450DFF80450DFF80450DFF80450DFF80450DFF80450DFF80450DFF
+80450DFF80450DFF80450DFF8045B0570000AB590000A85B0000A65E000099
+6100008A67000084710000817D00007E8A00007A9A000175B002036ECA0607
+60E30B0F4CF50E1A32FD0F2B16FE074009FF174703FF2C480BFF54410AFF74
+400CFF833E0CFF833E0CFF833E0CFF833E0CFF833E0CFF833E0CFF833E0CFF
+833E0CFF833E0CFF833E0CFF833E0CFF833E0CFF833EB0570000AC590000A8
+5B00009B5D000089610000806800007C730000797F0000768C0000719D0001
+6BB4020363CE060755E40C0F43F2111929FC112A15FE14390AFF233E07FF3D
+3D08FF583C09FF753B0BFF84390BFF84390BFF84390BFF84390BFF84390BFF
+84390BFF84390BFF84390BFF84390BFF84390BFF84390BFF84390BFF8439B0
+570000AC590000A15B00008A5C00007E610000786A00007475000071810000
+6D8F000067A1000160B8020357CF07084BE20E0F39F1131821FB12290FFE19
+3609FF2C3806FF463705FF5D3706FF773708FF843508FF843508FF843508FF
+843508FF843508FF843508FF843508FF843508FF843508FF843508FF843508
+FF843508FF8435B0570000AA5900008C5800007E5C000075620000706C0000
+6C77000069830000639200005DA5010157BD03034ED2080841E10F0F32F116
+1716FB0F2B09FE1B3406FF333303FF4B3302FF603303FF783304FF833104FF
+833104FF833104FF833104FF833104FF833104FF833104FF833104FF833104
+FF833104FF833104FF833104FF8331B0570000905600007F570000745C0000
+6D640000686D0000647900005F8500005995000055A901014FC0030344D109
+0839E1110E29F216170DFC0D2C07FF222E03FF392E01FF512E01FF642E02FF
+792F03FF832D03FF832D03FF832D03FF832D03FF832D03FF832D03FF832D03
+FF832D03FF832D03FF832D03FF832D03FF832D03FF832D9654000081540000
+745700006B5D000065650000606F00005C7A000056880000519800004DAD01
+0146C203033BCF090831E1130E22F417170EFD172507FF292801FF402A00FF
+562900FF682901FF7A2A02FF842902FF842902FF842902FF842902FF842902
+FF842902FF842902FF842902FF842902FF842902FF842902FF842902FF8429
+84510000755200006A570000635E00005D66000058700000537D00004D8B00
+004A9C000045AF01013CBF040432CF0A0928E2130F1EF61A150DFE1F2004FF
+2E2500FF452500FF5A2400FF6B2401FF7C2501FF842601FF842601FF842601
+FF842601FF842601FF842601FF842601FF842601FF842601FF842601FF8426
+01FF842601FF8426774F00006A520000625700005B5E000056670000517200
+004B7F0000468D0000429E00003CAF010133BD04042ACF0B0922E6130F19FA
+1C1509FF231F00FF342300FF4A2000FF5E2000FF6E2000FF7D2100FF842200
+FF842200FF842200FF842200FF842200FF842200FF842200FF842200FF8422
+00FF842200FF842200FF842200FF8422>
+<A5440000A5470000A64A0000A84E0000AC530000B2570000BC5B0202C95F05
+06D962090CE7600D14E8571020E54D172BE13F1E3BDA2D264DD9273D53D823
+5957D31F7558C51D9859B417D85F940CFF62940CFF62940CFF62940CFF6294
+0CFF62940CFF62940CFF62940CFF62940CFF62940CFF62940CFF62940CFF62
+940CFF62940CFF62A5440000A5470000A64A0000A84E0000AC530000B25700
+00BC5B0202C95F0506D962090CE7600D14E8571020E54D172BE13F1E3BDA2D
+264DD9273D53D8235957D31F7558C51D9859B417D85F940CFF62940CFF6294
+0CFF62940CFF62940CFF62940CFF62940CFF62940CFF62940CFF62940CFF62
+940CFF62940CFF62940CFF62940CFF62A5440000A5470000A64A0000A84E00
+00AC530000B2570000BC5B0202C95F0506D962090CE7600D14E8571020E54D
+172BE13F1E3BDA2D264DD9273D53D8235957D31F7558C51D9859B417D85F94
+0CFF62940CFF62940CFF62940CFF62940CFF62940CFF62940CFF62940CFF62
+940CFF62940CFF62940CFF62940CFF62940CFF62940CFF62A5440000A54700
+00A64A0000A84E0000AC530000B2570000BC5B0202C95F0506D962090CE760
+0D14E8571020E54D172BE13F1E3BDA2D264DD9273D53D8235957D31F7558C5
+1D9859B417D85F940CFF62940CFF62940CFF62940CFF62940CFF62940CFF62
+940CFF62940CFF62940CFF62940CFF62940CFF62940CFF62940CFF62940CFF
+62A5440000A5470000A64A0000A84E0000AC530000B2570000BC5B0202C95F
+0506D962090CE7600D14E8571020E54D172BE13F1E3BDA2D264DD9273D53D8
+235957D31F7558C51D9859B417D85F940CFF62940CFF62940CFF62940CFF62
+940CFF62940CFF62940CFF62940CFF62940CFF62940CFF62940CFF62940CFF
+62940CFF62940CFF62A5440000A5470000A64A0000A84E0000AC530000B257
+0000BC5B0202C95F0506D962090CE7600D14E8571020E54D172BE13F1E3BDA
+2D264DD9273D53D8235957D31F7558C51D9859B417D85F940CFF62940CFF62
+940CFF62940CFF62940CFF62940CFF62940CFF62940CFF62940CFF62940CFF
+62940CFF62940CFF62940CFF62940CFF62A5440000A5470000A64A0000A84F
+0000AC530000B2570000BC5B0202C95F0506D962090CE7600D14E8571020E6
+4E172BE2401E3BDA2D254DD9273C54D8235857D31F7559C51C9759B417D75F
+940CFF62940CFF63940CFF63940CFF63940CFF63940CFF63940CFF63940CFF
+63940CFF63940CFF63940CFF63940CFF63940CFF63940CFF63A5440000A547
+0000A64B0000A84F0000AC530000B2580000BB5C0202C8600506D963090BE8
+620C14E958101FE84F162BE4421D3BDB2D234FDA273956D922555AD41E725C
+C71C945CB516D262960CFD64950CFF65950CFF65950CFF65950CFF65950CFF
+65950CFF65950CFF65950CFF65950CFF65950CFF65950CFF65950CFF65950C
+FF65A6440000A5480000A64B0000A8500000AC540000B2580000BB5C0202C8
+600506D964080BE8630C13EA5A0F1FEA51152BE7441C3BDD2E2150DB273458
+DA21505CD81D6F5FCA1B905FB715CE65980DFD67960CFF67960CFF67960CFF
+67960CFF67960CFF67960CFF67960CFF67960CFF67960CFF67960CFF67960C
+FF67960CFF67960CFF67A6450000A5480000A64C0000A8500000AB540000B1
+590000BA5D0202C7610406D965080AE8640B13EB5C0E1EEB52132BE9461A3B
+DF301F50DD26305ADB1F4B5FDB1C6D62CD198C62B814CA699A0DFC69970CFF
+6A970CFF6A970CFF6A970CFF6A970CFF6A970CFF6A970CFF6A970CFF6A970C
+FF6A970CFF6A970CFF6A970CFF6A970CFF6AA6450000A5490000A64C0000A8
+510000AB550000B1590000BA5E0102C7620405D967080AE8660B12EC5E0D1E
+EC54122BEB48183CE1321D51DF262B5CDB1E4762DD1B6865D0188965BA13C6
+6C9C0DFB6C990CFF6C990CFF6C990CFF6C990CFF6C990CFF6C990CFF6C990C
+FF6C990CFF6C990CFF6C990CFF6C990CFF6C990CFF6C990CFF6CA6460000A6
+490000A64D0000A8510000AB550000B15A0000B95E0102C6630405D9680709
+E8670B11ED600C1DEE56102BED4A163CE4341B51E026275EDC1D4165DE1963
+68D4178569BC12C2709F0EFA6F9A0CFF6F9A0CFF6F9A0CFF6F9A0CFF6F9A0C
+FF6F9A0CFF6F9A0CFF6F9A0CFF6F9A0CFF6F9A0CFF6F9A0CFF6F9A0CFF6F9A
+0CFF6FA7460000A64A0000A64E0000A8520000AB560000B05A0000B95F0102
+C6640404D8690708E9690A10EF620B1CEF580E2AEF4C143BE7371851E22623
+60DD1B3B68DF185C6BD816816DBE10BD75A20EFA729C0CFF739C0CFF739C0C
+FF739C0CFF739C0CFF739C0CFF739C0CFF739C0CFF739C0CFF739C0CFF739C
+0CFF739C0CFF739C0CFF73A7470000A64B0000A64E0000A8530000AB570000
+B05B0000B8600101C5650304D66A0708E96B0A0FF0650A1BF15A0C2AF14F12
+3BEA3A1552E5261D63E01B346CE0165470DE147C72BE0FB87B930FF87A7208
+FF827108FF827108FF827108FF827108FF827108FF827108FF827108FF8271
+08FF827108FF827108FF827108FF827108FF82A8480000A74B0000A64F0000
+A8530000AA570000AF5B0000B7600101C3660304D56B0607E96E0A0DF26909
+1AF35E0A29F3510F3AEE3D1152E8251766E31B2C6FD41E4F72B21E7379851D
+B384500AF38D3C00FF973B00FF973B00FF973B00FF973B00FF973B00FF973B
+00FF973B00FF973B00FF973B00FF973B00FF973B00FF973B00FF97A8490000
+A74C0000A6500000A8540000AA580000AE5C0000B6610101C2670303D36D06
+07EA71090BF46D0819F6620927F6550B3AF4420C53E13A1C5DC4403860A237
+497683326C7F612FAA8B2D14FC961100FF9D1000FF9D1000FF9D1000FF9D10
+00FF9D1000FF9D1000FF9D1000FF9D1000FF9D1000FF9D1000FF9D1000FF9D
+1000FF9DA94A0000A74D0000A7510000A7540000A9580000AD5D0000B46201
+01C0680203D16E0506EA750909F4710717F9670725FA590738E36C2134C16B
+2E40AE663D518758456E644E637F4C5FA7821826FA970217FF9D0217FF9D02
+17FF9D0217FF9D0217FF9D0217FF9D0217FF9D0217FF9D0217FF9D0217FF9D
+0217FF9D0217FF9D0217FF9DA94B0000A84E0000A7520000A7550000A85900
+00AC5E0000B3630001BE690202CF710405E7770808F5750614F7710820E07F
+1B1FC3822526B589352D9A883D4484854E547388635D418C91731866EC8E00
+4BF093004BF093004BF093004BF093004BF093004BF093004BF093004BF093
+004BF093004BF093004BF093004BF093004BF093AA4C0000A8500000A75300
+00A7560000A85A0000AB5E0000B1640000BC6A0102CD720304E4790707EB7D
+070FD1861113BC8C181AAB9222209E9B2E288EA23F327EA3503E60A15C573C
+A77D66259CB96A0085E4850085E4850085E4850085E4850085E4850085E485
+0085E4850085E4850085E4850085E4850085E4850085E4850085E485AC4E00
+00A9510000A7540000A7570000A75B0000AA5F0000AF650000BA6B0101C973
+0303D37C0505C086080AB1900D10A79C13159AA81C1C8EB428237EBC342E68
+B8433A58C0554146C66C4C26C88C5F03C2B47803C2B47803C2B47803C2B478
+03C2B47803C2B47803C2B47803C2B47803C2B47803C2B47803C2B47803C2B4
+7803C2B478AE4F0000AA530000A8550000A6580000A75C0000A9600000AE66
+0000B66D0101BA750202AE820304A68E0507A09D080B99B00E108FC417167C
+D11E2265D923304FDC2A3F2DD331551FDF485B15F0675D05F4806705F48067
+05F4806705F4806705F4806705F4806705F4806705F4806705F4806705F480
+6705F4806705F4806705F48067AE500000AB540000A8560000A6590000A65D
+0000A8610000AB660000AB6E00009F7901019A8802029696030492AA05068D
+C6090A85E9100F63F3082247F908372EFD0D480EFE095C01FE196106FF405A
+13FF774F13FF774F13FF774F13FF774F13FF774F13FF774F13FF774F13FF77
+4F13FF774F13FF774F13FF774F13FF774F13FF774FB0520000AB550000A957
+0000A65A0000A65E0000A7620000A3680000957100008F7E00008D8C010189
+9C010186B2030381D1070873EF0B1252FA052337FE07361DFF064B05FF095A
+00FF23580BFF544E0FFF7C490FFF7C490FFF7C490FFF7C490FFF7C490FFF7C
+490FFF7C490FFF7C490FFF7C490FFF7C490FFF7C490FFF7C490FFF7C49B254
+0000AD560000AA590000A75C0000A65F0000A2630000916900008973000086
+800000838E0000809F01017BB6030473D3070965EE0C1248F80A212EFE0C33
+11FE034A05FF174F04FF334D0DFF62450DFF81430DFF81430DFF81430DFF81
+430DFF81430DFF81430DFF81430DFF81430DFF81430DFF81430DFF81430DFF
+81430DFF8143B3550000AE570000AA5A0000A75C0000A45F00008F63000085
+6A0000817600007E8200007A90000076A2010170BA030467D6080958EC0D12
+40F70F2023FD0D330FFE0F4306FF244607FF44420AFF653F0CFF873C0CFF87
+3C0CFF873C0CFF873C0CFF873C0CFF873C0CFF873C0CFF873C0CFF873C0CFF
+873C0CFF873C0CFF873C0CFF873CB4550000AE570000AA5A0000A75C00008F
+5E0000826300007C6C00007978000076840000719300006BA5010165BD0405
+5BD709094DEA0F1236F5121F1DFC11310FFF1D3A0AFF333B07FF4E3B07FF68
+3B0AFF8A370BFF8C370BFF8C370BFF8C370BFF8C370BFF8C370BFF8C370BFF
+8C370BFF8C370BFF8C370BFF8C370BFF8C370BFF8C37B4550000AE570000AA
+5A0000915A0000815D000079640000746E0000707A00006D86000067950000
+61AA01025BC2040550D8090A43E811112DF5141E15FD12300AFF213606FF3A
+3604FF543604FF6A3607FF893308FF8B3308FF8B3308FF8B3308FF8B3308FF
+8B3308FF8B3308FF8B3308FF8B3308FF8B3308FF8B3308FF8B3308FF8B33B4
+550000AF5700009557000082590000775E0000706600006C700000687B0000
+638800005D99000058AE010251C5050546D70A0A3BE8141024F5141E0AFD0F
+3306FF273103FF403101FF593102FF6C3204FF882F05FF8A2F05FF8A2F05FF
+8A2F05FF8A2F05FF8A2F05FF8A2F05FF8A2F05FF8A2F05FF8A2F05FF8A2F05
+FF8A2F05FF8A2FB45500009B56000084550000775800006E5F000068670000
+647200005F7D0000598B0000559D000050B3010248C805053DD60B0A33E816
+101BF6131F09FE172C05FF2E2C01FF472C01FF5D2C01FF702C03FF882B03FF
+8A2B03FF8A2B03FF8A2B03FF8A2B03FF8A2B03FF8A2B03FF8A2B03FF8A2B03
+FF8A2B03FF8A2B03FF8A2B03FF8A2BA354000087530000775400006D590000
+66600000606800005C73000056800000508E00004DA1000047B502023EC506
+0534D60C0A2AE9161018F8171D09FF202603FF352700FF4C2800FF622701FF
+712701FF872801FF882801FF882801FF882801FF882801FF882801FF882801
+FF882801FF882801FF882801FF882801FF882801FF88288C51000079500000
+6D530000645900005E600000596A0000547500004E8200004991000045A300
+003EB5020234C306062BD70D0B23EC161115FB1D1906FF252300FF3A2400FF
+512200FF652201FF742301FF872401FF892401FF892401FF892401FF892401
+FF892401FF892401FF892401FF892401FF892401FF892401FF892401FF8924
+7C4D00006E4F0000635300005C59000057610000516B00004C780000468500
+00419400003CA4000034B202022CC4070624DA0D0B1DF0171111FE1F1801FF
+292100FF3F1F00FF551E00FF671E00FF761F00FF882001FF8A2001FF8A2001
+FF8A2001FF8A2001FF8A2001FF8A2001FF8A2001FF8A2001FF8A2001FF8A20
+01FF8A2001FF8A206F4B0000644E00005B530000555A0000506300004A6E00
+00447A00003E8700003995000033A200002CB1020225C507071EDE0D0C17F4
+17110AFE1F1900FF2E1E00FF451B01FF581901FF6A1A00FF781C00FF881D00
+FF891D00FF891D00FF891D00FF891D00FF891D00FF891D00FF891D00FF891D
+00FF891D00FF891D00FF891D00FF891D>
+<A33F0000A3410000A4440000A6480000AA4C0000B0510000B7540102C25604
+06D058090BDD580E12E052141AD9481B24D53D232FD1302D3BD12D453FD52C
+5D3FD229773FC5259540B31DC547980FFA54900BFF55900BFF55900BFF5590
+0BFF55900BFF55900BFF55900BFF55900BFF55900BFF55900BFF55900BFF55
+900BFF55900BFF55A33F0000A3410000A4440000A6480000AA4C0000B05100
+00B7540102C2560406D058090BDD580E12E052141AD9481B24D53D232FD130
+2D3BD12D453FD52C5D3FD229773FC5259540B31DC547980FFA54900BFF5590
+0BFF55900BFF55900BFF55900BFF55900BFF55900BFF55900BFF55900BFF55
+900BFF55900BFF55900BFF55900BFF55A33F0000A3410000A4440000A64800
+00AA4C0000B0510000B7540102C2560406D058090BDD580E12E052141AD948
+1B24D53D232FD1302D3BD12D453FD52C5D3FD229773FC5259540B31DC54798
+0FFA54900BFF55900BFF55900BFF55900BFF55900BFF55900BFF55900BFF55
+900BFF55900BFF55900BFF55900BFF55900BFF55900BFF55A33F0000A34100
+00A4440000A6480000AA4C0000B0510000B7540102C2560406D058090BDD58
+0E12E052141AD9481B24D53D232FD1302D3BD12D453FD52C5D3FD229773FC5
+259540B31DC547980FFA54900BFF55900BFF55900BFF55900BFF55900BFF55
+900BFF55900BFF55900BFF55900BFF55900BFF55900BFF55900BFF55900BFF
+55A33F0000A3410000A4440000A6480000AA4C0000B0510000B7540102C256
+0406D058090BDD580E12E052141AD9481B24D53D232FD1302D3BD12D453FD5
+2C5D3FD229773FC5259540B31DC547980FFA54900BFF55900BFF55900BFF55
+900BFF55900BFF55900BFF55900BFF55900BFF55900BFF55900BFF55900BFF
+55900BFF55900BFF55A33F0000A3420000A4450000A6480000AA4D0000B051
+0000B7540101C2570405D059080ADD590D11E153131ADA491A24D73E222FD2
+302B3DD22D4340D52B5B41D3287542C6249342B51EC349990FFA55900BFF56
+900BFF56900BFF56900BFF56900BFF56900BFF56900BFF56900BFF56900BFF
+56900BFF56900BFF56900BFF56900BFF56A4400000A4420000A4450000A649
+0000AA4D0000B0510000B7550101C2580405D05A080ADE5A0D11E255131ADC
+4B1924D940212FD230293FD32D4042D62A5844D3277345C7249245B61DBF4B
+9A10F956910BFF58910BFF58910BFF58910BFF58910BFF58910BFF58910BFF
+58910BFF58910BFF58910BFF58910BFF58910BFF58910BFF58A4400000A442
+0000A4460000A6490000AA4D0000AF520000B6550101C1580305D05B080ADF
+5B0C11E3561219DD4C1824DB422030D3302740D42C3D44D62A5547D4267148
+C9239048B71DBC4E9C10F758910BFF59910BFF5A910BFF5A910BFF5A910BFF
+5A910BFF5A910BFF5A910BFF5A910BFF5A910BFF5A910BFF5A910BFF5A910B
+FF5AA4400000A4430000A5460000A64A0000A94E0000AF520000B6560101C1
+590305D05C0709DF5D0C10E3571119DF4D1724DD431F30D5312541D52C3946
+D7295249D5256F4BCA228D4BB81CB8509E11F55A920BFF5B920BFF5B920BFF
+5B920BFF5B920BFF5B920BFF5B920BFF5B920BFF5B920BFF5B920BFF5B920B
+FF5B920BFF5B920BFF5BA4410000A4430000A5470000A64A0000A94E0000AF
+530000B6560101C15A0304D05E0709DF5E0B10E4591119E14F1624DF451D30
+D7322441D62C3648D7284F4CD6246C4FCA218A4EB91CB553A011F35C920BFF
+5D920BFF5D920BFF5D920BFF5D920BFF5D920BFF5D920BFF5D920BFF5D920B
+FF5D920BFF5D920BFF5D920BFF5D920BFF5DA5410000A5440000A5470000A6
+4B0000A94F0000AE530000B5570101C05B0304D05F0608DF5F0B10E55B1018
+E3501423E2471C30DA342341D72C334BD8274C4FD7226A52CB208752BB1BB1
+56A212F25E930BFF5F930BFF5F930BFF5F930BFF5F930BFF5F930BFF5F930B
+FF5F930BFF5F930BFF5F930BFF5F930BFF5F930BFF5F930BFF5FA5420000A5
+440000A5480000A64C0000A9500000AE540000B5580101C05C0304CF600608
+DE610B0FE75C0F18E5521323E44A1B30DD372142D92B2E4ED9264853D82265
+56CD1F8356BD1BAD5AA512EF60930CFF61930CFF61930CFF61930CFF61930C
+FF61930CFF61930CFF61930CFF61930CFF61930CFF61930CFF61930CFF6193
+0CFF61A6430000A5450000A5480000A64C0000A9500000AE550000B4590001
+BF5D0203CE610608DE620A0EE85F0E17E8551123E74C1930E0391F42DB2B2A
+51D9254357D820605ACF1D7E5CBF1AA85EA913ED63940CFF64940CFF64940C
+FF64940CFF64940CFF64940CFF64940CFF64940CFF64940CFF64940CFF6494
+0CFF64940CFF64940CFF64A6430000A5460000A5490000A64D0000A9510000
+AD550000B45A0000BE5E0203CE630607DE64090EEA610C17EB580F23EA4F17
+30E43D1C42DD2A2455DC253B5BDA1E585FD41B7961B51BA2648F17EA6A6D09
+FF766306FF7B6306FF7B6306FF7B6306FF7B6306FF7B6306FF7B6306FF7B63
+06FF7B6306FF7B6306FF7B6306FF7B6306FF7BA6440000A6470000A54A0000
+A74E0000A9520000AD560000B35B0000BD5F0203CD640506DE67090CEC650B
+16ED5B0E22ED521430E9411943E02A1E58DC27335DC82F565CAC2E7462872B
+9E69691DDE743D00FF8B3A00FF8C3A00FF8C3A00FF8C3A00FF8C3A00FF8C3A
+00FF8C3A00FF8C3A00FF8C3A00FF8C3A00FF8C3A00FF8C3A00FF8CA7450000
+A6480000A64B0000A74F0000A9530000AC570000B25C0000BC610202CB6605
+06DE6A080AED690A14EF600C20F055102FEE461443D34C2845BC554248A447
+515A8A45705F7141966B4F30E8771300FF920F00FF930F00FF930F00FF930F
+00FF930F00FF930F00FF930F00FF930F00FF930F00FF930F00FF930F00FF93
+0F00FF93A8460000A7490000A64D0000A7500000A8540000AB580000B15D00
+00BB620102C9680405DD6D0809ED6D0A12F2650A1FED5F102AD6702726B66D
+3233AB724838865E4E5A72586B617265995A414DF0780414FF930316FF9203
+16FF920316FF920316FF920316FF920316FF920316FF920316FF920316FF92
+0316FF920316FF920316FF92A9480000A84A0000A74E0000A7510000A85500
+00AA590000B05E0000B9630101C7690304DB6F0707EE71090FE5750F17CC7C
+1C1AB57F2521A381312B958543358684583F7D8571436A81944D4572E66700
+32FE880035FE870035FE870035FE870035FE870035FE870035FE870035FE87
+0035FE870035FE870035FE870035FE870035FE87AA490000A94C0000A74F00
+00A7520000A7560000AA5A0000AE5F0000B7650101C46B0303D8720606D17A
+090BBC800F11AC8518179E8B201E90912C2784933C3076934F38649262435D
+998142569EB1460066F17C0069F17B0069F17B0069F17B0069F17B0069F17B
+0069F17B0069F17B0069F17B0069F17B0069F17B0069F17B0069F17BAB4B00
+00A94D0000A8500000A7540000A7570000A85B0000AC600000B4660101C16D
+0202BB760405AE800709A2880C0E9A921214909C1B1A84A4262275A7342A65
+A546335BAA5C3653B0733848B7903E08A0E36C08A1E36B08A1E36B08A1E36B
+08A1E36B08A1E36B08A1E36B08A1E36B08A1E36B08A1E36B08A1E36B08A1E3
+6B08A1E36BAD4C0000AB4F0000A9530000A7550000A6580000A85C0000AB61
+0000B2670000A9700102A07B0304998705079393070A8DA30D0F84B2161577
+BE1F1E66C2292654C436303FC1463B39CA5E3B33DA793B12DAAA5711DBB059
+11DBB05911DBB05911DBB05911DBB05911DBB05911DBB05911DBB05911DBB0
+5911DBB05911DBB05911DBB059AF4E0000AD510000A9540000A7560000A65A
+0000A75D0000A96200009E69000094740101908001028C8D0304879D040682
+B3080A79CB0F106CE0171655E51C2442EF243027F1294011EB32510EF45150
+0FFD824C0EFF8C4C0EFF8C4C0EFF8C4C0EFF8C4C0EFF8C4C0EFF8C4C0EFF8C
+4C0EFF8C4C0EFF8C4C0EFF8C4C0EFF8C4C0EFF8C4CB1500000AE520000AA55
+0000A8580000A65B0000A65F0000986300008C6C0000877800008485000080
+9400017CA7010277C104056CDE090D59F40C173DFC0C281FFE083D0AFF0D4C
+01FF244F0AFF51460CFF77430DFF82420DFF82420DFF82420DFF82420DFF82
+420DFF82420DFF82420DFF82420DFF82420DFF82420DFF82420DFF8242B352
+0000B0540000AC570000A95A0000A65D0000965F000088650000816E00007E
+7A00007B8700007796000072AB01026AC405065EDD0A0D4EF20F1633FA1027
+17FD0A3B0AFF1B4305FF334309FF593F0AFF793D0CFF883B0CFF883B0CFF88
+3B0CFF883B0CFF883B0CFF883B0CFF883B0CFF883B0CFF883B0CFF883B0CFF
+883B0CFF883BB5540000B2560000AD580000A95A0000985C0000865F00007D
+66000079710000767C0000728900006D99000067AF01025FC9050653DF0B0D
+44EF121529F9122617FD19330BFF273A07FF433A06FF5D3908FF7A380AFF8C
+360AFF8C360AFF8C360AFF8C360AFF8C360AFF8C360AFF8C360AFF8C360AFF
+8C360AFF8C360AFF8C360AFF8C36B5550000B2560000AD5800009C59000087
+5B00007B60000074680000717300006D7E0000698C0000639D00005DB40202
+54CA060649DD0D0D3BEF151420F912260BFE153607FF2D3504FF493503FF62
+3505FF7B3407FF8F3107FF8F3107FF8F3107FF8F3107FF8F3107FF8F3107FF
+8F3107FF8F3107FF8F3107FF8F3107FF8F3107FF8F31B5550000B2560000A3
+570000885700007A5A0000726100006C6A000068740000648000005E8F0000
+59A2000053B802024BCD07073FDD0E0D34EF181315F90F2708FE1B3004FF34
+3001FF4F3001FF653002FF7C3005FF922D05FF922D05FF922D05FF922D05FF
+922D05FF922D05FF922D05FF922D05FF922D05FF922D05FF922D05FF922DB5
+550000AB5600008B5400007B560000705A000069620000646B000060760000
+5A8300005592000051A600004BBC020241CC080736DD100C2CF1191210FB13
+2508FF242902FF3B2B00FF542B01FF692A01FF7D2B02FF912A02FF912A02FF
+912A02FF912A02FF912A02FF912A02FF912A02FF912A02FF912A02FF912A02
+FF912A02FF912AB5550000905200007D52000070550000675B000061630000
+5C6D000057780000518600004C95000049A9000041BC030337CA08072DDD10
+0D24F3191311FB1D1F06FF2A2500FF422600FF592500FF6C2501FF7E2601FF
+902601FF902601FF902601FF902601FF902601FF902601FF902601FF902601
+FF902601FF902601FF902601FF9026945200007F4F00007051000066550000
+5F5B000059640000546E00004F7B0000498800004598000040AA000037B903
+032ECA090825E0110D1EF61A130DFE201D01FF2F2300FF472100FF5D2100FF
+6F2100FF7F2203FF922003FF922003FF922003FF922003FF922003FF922003
+FF922003FF922003FF922003FF922003FF922003FF9220814E0000724D0000
+665000005E550000575C0000526500004D700000477D0000418B00003D9A00
+0037A900002EB8030327CC09081FE4110E18FA1B1209FE251B00FF341F00FF
+4C1C00FF601C00FF721D00FF801E04FF931C04FF931C04FF931C04FF931C04
+FF931C04FF931C04FF931C04FF931C04FF931C04FF931C04FF931C04FF931C
+734B0000674C00005D50000056560000515D00004B670000457300003F8000
+00398C0000339900002DA7000027B9040420CF090919E8110E0FFC191400FF
+231D00FF3A1B01FF4F1801FF631800FF731A00FF811B01FF901A01FF901A01
+FF901A01FF901A01FF901A01FF901A01FF901A01FF901A01FF901A01FF901A
+01FF901A01FF901A674900005D4B000056500000505700004A5F0000446900
+003D76000037810000308C00002B99000026A8010121BC04041BD30A0914EC
+110E05FC161701FF271900FF3F1702FF531401FF651400FF751600FF821702
+FF901602FF901602FF901602FF901602FF901602FF901602FF901602FF9016
+02FF901602FF901602FF901602FF9016>
+<A03B0000A13B0000A13E0000A3410000A6440000AB480000B14B0001BB4D03
+04C54E070AD04E0D10D44A1417CD401C1FC8372527C530322EC72F4A2FCC2F
+622FCB2F792EC32B912DB423B4329B10F4468C08FF488C08FF488C08FF488C
+08FF488C08FF488C08FF488C08FF488C08FF488C08FF488C08FF488C08FF48
+8C08FF488C08FF48A03B0000A13B0000A13E0000A3410000A6440000AB4800
+00B14B0001BB4D0304C54E070AD04E0D10D44A1417CD401C1FC8372527C530
+322EC72F4A2FCC2F622FCB2F792EC32B912DB423B4329B10F4468C08FF488C
+08FF488C08FF488C08FF488C08FF488C08FF488C08FF488C08FF488C08FF48
+8C08FF488C08FF488C08FF488C08FF48A03B0000A13B0000A13E0000A34100
+00A6440000AB480000B14B0001BB4D0304C54E070AD04E0D10D44A1417CD40
+1C1FC8372527C530322EC72F4A2FCC2F622FCB2F792EC32B912DB423B4329B
+10F4468C08FF488C08FF488C08FF488C08FF488C08FF488C08FF488C08FF48
+8C08FF488C08FF488C08FF488C08FF488C08FF488C08FF48A13B0000A13B00
+00A13E0000A3410000A6440000AB480000B24B0001BB4D0304C64E0709D14E
+0D0FD54B1417CE411C1FC9382427C630322EC8304A2FCC2F6130CC2F782EC4
+2B902EB423B3329C11F4468C08FF498C08FF498C08FF498C08FF498C08FF49
+8C08FF498C08FF498C08FF498C08FF498C08FF498C08FF498C08FF498C08FF
+49A13B0000A13C0000A23E0000A3410000A6450000AB490000B24C0001BB4E
+0304C64F0709D2500D0FD64C1416D0431B1FCB392427C731302FC9304830CD
+306031CD2F772FC62C902FB524B2339D12F4478D09FF4A8D09FF4A8D09FF4A
+8D09FF4A8D09FF4A8D09FF4A8D09FF4A8D09FF4A8D09FF4A8D09FF4A8D09FF
+4A8D09FF4A8D09FF4AA13C0000A13C0000A23F0000A3420000A6450000AB49
+0000B24D0001BB4F0304C6500609D3510C0FD74D1316D2451B1ECD3B2327C9
+312F30CA314731CE305E32CF307530C72D8F30B624B0359F13F4488D0AFF4B
+8D0AFF4B8D0AFF4B8D0AFF4B8D0AFF4B8D0AFF4B8D0AFF4B8D0AFF4B8D0AFF
+4B8D0AFF4B8D0AFF4B8D0AFF4B8D0AFF4BA13C0000A23D0000A23F0000A442
+0000A6460000AC4A0000B24D0001BB500304C6520609D4530C0ED84F1316D4
+461A1ECE3C2227CA322D31CC314532D0315D33D0307431C92D8E31B724AE36
+A013F3498E0AFF4C8E0AFF4C8E0AFF4C8E0AFF4C8E0AFF4C8E0AFF4C8E0AFF
+4C8E0AFF4C8E0AFF4C8E0AFF4C8E0AFF4C8E0AFF4C8E0AFF4CA23C0000A23D
+0000A2400000A4430000A7460000AC4A0000B24E0001BB510204C7530608D5
+540C0EDA501315D6481A1ED03E2227CC332C32CD314334D0305B34D12F7234
+CA2D8C33B824AC38A214F04A8E0AFF4D8E0AFF4D8E0AFF4E8E0AFF4E8E0AFF
+4E8E0AFF4E8E0AFF4E8E0AFF4E8E0AFF4E8E0AFF4E8E0AFF4E8E0AFF4E8E0A
+FF4EA23D0000A23D0000A2400000A4430000A7470000AC4B0000B24F0001BB
+520203C7540608D6550C0EDB521215D94A191DD2402127CD332A33CE313F35
+D12F5837D22E7037CC2C8B35B923A93AA414ED4B8F0AFF4F8F0AFF4F8F0AFF
+4F8F0AFF4F8F0AFF4F8F0AFF4F8F0AFF4F8F0AFF4F8F0AFF4F8F0AFF4F8F0A
+FF4F8F0AFF4F8F0AFF4FA23D0000A33E0000A3410000A4440000A7480000AC
+4C0000B2500001BB530203C7550508D6570B0EDC531215DA4C181DD4411F27
+CF352833CF313C38D12E543AD32C6D3ACD2B8838BB23A73DA515E94D8F0AFF
+518F0AFF518F0AFF518F0AFF518F0AFF518F0AFF518F0AFF518F0AFF518F0A
+FF518F0AFF518F0AFF518F0AFF518F0AFF51A33E0000A33F0000A3420000A4
+450000A7490000AC4D0000B2510001BB540203C7570507D6580B0DDD551114
+DD4E171DD7441E28D2372733D030383AD22D513DD42B6B3ECE29843CBC22A3
+41A816E54F900AFF53900AFF53900AFF54900AFF54900AFF54900AFF54900A
+FF54900AFF54900AFF54900AFF54900AFF54900AFF54900AFF54A33F0000A3
+3F0000A3420000A4460000A74A0000AC4E0000B2520001BB550202C6580507
+D55A0A0CDF571014DF50151DDA461C28D53A2534D230333DD32C4C41D52967
+42D0278041BE21A045AA17E151900BFF56900BFF56900BFF56900BFF56900B
+FF56900BFF56900BFF56900BFF56900BFF56900BFF56900BFF56900BFF5690
+0BFF56A43F0000A4400000A4430000A5470000A74B0000AC4F0000B2530000
+BA570102C6590506D55B0A0CE05A0F13E252131DDC491B28D83D2334D42F2E
+41D32B4745D6286147D1267B46C1209C49AD18DD53910BFF598F0BFF5A8D0B
+FF5A8D0BFF5A8D0BFF5A8D0BFF5A8D0BFF5A8D0BFF5A8D0BFF5A8D0BFF5A8D
+0BFF5A8D0BFF5A8D0BFF5AA4400000A5410000A4440000A5480000A74C0000
+AB500000B1540000B9580102C55B0406D55E090BE25D0D13E455121DE04B19
+28DD402134D62F2845D52A404AD7265B4DCE28774AB027964D9822D5546709
+FE6B5C05FF715904FF735904FF735904FF735904FF735904FF735904FF7359
+04FF735904FF735904FF735904FF735904FF73A5410000A5420000A5450000
+A5490000A74D0000AA510000B0550000B8590102C45C0405D560080AE4600C
+12E758101CE44F1628E2451E35D92F2449CF363F48BF3F5E45A93C734C9439
+91507B2DC35B4205FD7A3900FF803800FF803800FF803800FF803800FF8038
+00FF803800FF803800FF803800FF803800FF803800FF803800FF80A5420000
+A6430000A5460000A54A0000A74E0000AA520000B0560000B75A0101C35E03
+05D4630709E3630B11E95C0E1BE9531327E24E1D32C9573232B156463AA255
+5C4195587442834E8C4E6D42C158240DF97C1200FF891000FF891000FF8910
+00FF891000FF891000FF891000FF891000FF891000FF891000FF891000FF89
+1000FF89A6440000A7440000A6480000A64B0000A74F0000AA530000AF5800
+00B65C0101C2610304D3660708E3660A0FEC610C1ADD66181FC46D2621AA6A
+322B9A6944358661524780666E457C6B8C425A5BC659171FF4790315FF8903
+15FF890315FF890315FF890315FF890315FF890315FF890315FF890315FF89
+0315FF890315FF890315FF89A7450000A7460000A6490000A64D0000A75100
+00AA550000AE590000B55E0000BF630203D0680607E46B090CD0721112BA77
+1A18A678231F95792E28887B3F327C79533B717769406D7B863E5D79BC461A
+48F06A0031FF7E0032FF7D0032FF7D0032FF7D0032FF7D0032FF7D0032FF7D
+0032FF7D0032FF7D0032FF7D0032FF7D0032FF7DA8470000A8480000A74B00
+00A74F0000A7520000A9560000AC5A0000B35F0000BD640202CE6B0505BD73
+080AAC790E109F7E161693831F1D878729257A89392D6C874C356185623A5E
+8A7D38588EA8392068DC570057FF720058FF710058FF710058FF710058FF71
+0058FF710058FF710058FF710058FF710058FF710058FF710058FF71A94900
+00AA490000A84D0000A7500000A7530000A8570000AB5C0000B1610000B967
+0102AA700305A079060897810B0D8F8A111387921A197B9825206C9A31285B
+974131549759334F9B71324CA18E302C9BC7440884F0630985F0630985F063
+0985F0630985F0630985F0630985F0630985F0630985F0630985F0630985F0
+630985F063AB4A0000AC4B0000A94F0000A7520000A7550000A7590000AA5D
+0000AC6200009C6A010195740203907F04068A8B070A83960D0F7BA315156F
+AD1F1C5FAF282350AE372A47B14D2E43B8662C3FC17F2B2BC5A8371ABFDC4A
+1BC0DC491BC0DC491BC0DC491BC0DC491BC0DC491BC0DC491BC0DC491BC0DC
+491BC0DC491BC0DC491BC0DC49AD4D0000AE4D0000AB510000A8540000A757
+0000A75A0000A65E0000946400008C6E010188790102848503047F93040678
+A4080A6FB50E1062C3171652C91F1F44CF2B2637D63C2D22D64C381FE06638
+1CEB843914EFA94013F0A94013F0A94013F0A94013F0A94013F0A94013F0A9
+4013F0A94013F0A94013F0A94013F0A94013F0A940AF4F0000B0500000AC53
+0000A9550000A7580000A55C00008F5F000085660000807100007D7D000079
+8B0101749B01026DB1030565CB080956E20D1141F0111D26FC102E10FE133F
+07FF284209FF4E3E09FF6C3E0CFF893A0CFF893A0CFF893A0CFF893A0CFF89
+3A0CFF893A0CFF893A0CFF893A0CFF893A0CFF893A0CFF893A0CFF893AB251
+0000B2520000AE550000AA570000A75A00008E5C0000816100007A6A000076
+750000738100006F8F000069A1010162B9030359D208084CE50E1037F3121C
+1EFC132D0DFF1D3908FF353906FF533906FF6F3909FF8D3509FF8D3509FF8D
+3509FF8D3509FF8D3509FF8D3509FF8D3509FF8D3509FF8D3509FF8D3509FF
+8D3509FF8D35B4530000B4540000B0570000AB5900008F5900007F5C000076
+620000716C00006D7700006A830000649200005EA6010158BE03034ED40808
+41E410102FF3151A12FD0F3009FF213405FF3C3403FF593403FF703407FF90
+3007FF903007FF903007FF903007FF903007FF903007FF903007FF903007FF
+903007FF903007FF903007FF9030B5550000B5550000B05700009256000080
+570000755C00006D640000696E0000657900005F8600005A96000055AA0101
+4EC2030444D3090939E4130F24F3141B09FD0E3006FF282E02FF432F01FF5D
+2E01FF732F04FF8E2C04FF932C04FF932C04FF932C04FF932C04FF932C04FF
+932C04FF932C04FF932C04FF932C04FF932C04FF932CB5550000B555000096
+54000081540000745700006B5D000065650000606F00005C7B000056890000
+519900004DAF010145C304043AD10A0930E4140F1DF6151B0AFE192805FF2F
+2900FF4A2A00FF622901FF752902FF8D2902FF962902FF962902FF962902FF
+962902FF962902FF962902FF962902FF962902FF962902FF962902FF9629B5
+5500009C53000083510000745200006A570000625E00005D66000058710000
+527E00004D8C0000499D000044B001013BC0040430D10B0927E614101BF81B
+1809FF212301FF362500FF4F2400FF662401FF772501FF8C2506FF9F2006FF
+9F2006FF9F2006FF9F2006FF9F2006FF9F2006FF9F2006FF9F2006FF9F2006
+FF9F2006FF9F209F530000874F0000754F000069520000615700005B5E0000
+55670000507300004A800000458E0000419F00003AAF010131BF050428D30C
+0A20EA141015FC1C1705FF262100FF3B2100FF541F00FF692000FF792002FF
+8E200AFFA5190AFFA5190AFFA5190AFFA5190AFFA5190AFFA5190AFFA5190A
+FFA5190AFFA5190AFFA5190AFFA519874F0000784C00006A4D000060510000
+59580000535F00004E69000048760000428200003D910000379F000030AD01
+0129C0050522D60C0A1AED150F0FFE1E1600FF291F00FF411C01FF571A00FF
+6B1B00FF7A1D01FF8D1D08FFA21708FFA21708FFA21708FFA21708FFA21708
+FFA21708FFA21708FFA21708FFA21708FFA21708FFA217774C00006B4A0000
+604D000058520000525900004C610000476C00004078000039840000349100
+002E9D000028AD010223C205051CDA0C0B15F2151005FF1B1900FF2E1B01FF
+461802FF5B1601FF6D1800FF7C1900FF8C1A04FF9E1704FF9E1704FF9E1704
+FF9E1704FF9E1704FF9E1704FF9E1704FF9E1704FF9E1704FF9E1704FF9E17
+6A4A000060490000574D0000515300004B5A0000456400003F6F0000387B00
+00318600002C910000279E000022B002021DC6060616DE0D0B0BF2131201FF
+1D1800FF331701FF491401FF5D1200FF6E1400FF7E1603FF8E1409FF9F0F09
+FF9F0F09FF9F0F09FF9F0F09FF9F0F09FF9F0F09FF9F0F09FF9F0F09FF9F0F
+09FF9F0F09FF9F0F5F49000057490000504D00004B540000455D00003E6700
+0037730000307D00002A8700002592000021A001011DB3020317C9060611E1
+0E0A07F4151100FF211500FF371300FF4D1000FF5F0F00FF701100FF80120A
+FF940A10FFA30410FFA30410FFA30410FFA30410FFA30410FFA30410FFA304
+10FFA30410FFA30410FFA30410FFA304>
+<9D3600009E3600009E370000A03A0000A23C0000A63F0000AB420000B44302
+04BD440609C3420C0FC53E1315BF361B1CBB2F2523B92B3426BA2B4B26BF2B
+6126C02B7625BA298B24B224AA249D14DE338802FF3F8802FF3F8803FF3F88
+03FF3F8803FF3F8803FF3F8803FF3F8803FF3F8803FF3F8803FF3F8803FF3F
+8803FF3F8803FF3F9E3600009E3600009E380000A03A0000A23C0000A63F00
+00AC420000B4430203BD440609C3430C0EC53F1315BF371B1CBC2F2523BA2B
+3426BB2B4A26BF2B6126C02B7625BA298B24B224AA259D14DD338803FF3F88
+03FF408803FF408803FF408803FF408803FF408803FF408803FF408803FF40
+8803FF408803FF408803FF408803FF409E3600009E3700009F380000A03A00
+00A33D0000A7400000AC430000B4440203BD450608C4440B0EC7401215C138
+1B1CBD302423BB2B3327BB2B4927C02C6027C12C7526BB298A25B225A9269F
+15DD338903FF408803FF408903FF408903FF408903FF408903FF408903FF40
+8903FF408903FF408903FF408903FF408903FF408903FF409E3600009E3700
+009F380000A03B0000A33D0000A7400000AC430000B4450203BD460608C545
+0B0EC8411215C2391A1CBE322423BC2C3127BC2C4827C12C5E28C22C7427BD
+2A8A26B325A727A116DC338904FE418904FF418904FF418904FF418904FF41
+8904FF418904FF418904FF418904FF418904FF418904FF418904FF418904FF
+419E3700009F3800009F390000A13B0000A33E0000A7410000AC440000B446
+0203BD460508C6460B0EC9431214C43B1A1BC0332323BD2C3028BD2C4728C2
+2C5D28C42C7328BE2A8926B325A628A218DB338A05FE428904FF428904FF42
+8904FF428904FF428904FF428904FF428904FF428904FF428904FF428904FF
+428904FF428904FF429E3700009F3800009F390000A13C0000A33E0000A741
+0000AC440000B4460203BE470508C7470A0DCA441214C53C1A1BC1342222BE
+2D2F29BE2C4529C22D5C29C52D7129C02B8827B425A529A419DB338A05FE42
+8A05FF438A05FF438A05FF438A05FF438A05FF438A05FF438A05FF438A05FF
+438A05FF438A05FF438A05FF438A05FF439F3800009F380000A03A0000A13C
+0000A33F0000A7420000AC450000B4470203BE480507C8490A0DCB451114C7
+3E191BC2352222BF2D2D2ABF2D442AC32D5A2AC62D702AC12B8728B425A42A
+A61ADA338B06FD438A05FF438A05FF438A05FF438A05FF438A05FF438A05FF
+438A05FF438A05FF438A05FF438A05FF438A05FF438A05FF439F3800009F39
+0000A03A0000A13D0000A3400000A7420000AD460000B4480202BE4A0507C9
+4A0A0DCC471113C940191BC4372122C02E2C2AC12D422BC52E592BC72D6F2B
+C32C8629B525A22CA71BD7348C07FD448A06FF448A06FF448A06FF458A06FF
+458A06FF458A06FF458A06FF458A06FF458A06FF458A06FF458A06FF458A06
+FF459F390000A03A0000A03B0000A13D0000A4400000A7430000AD470000B4
+490102BE4B0507C94B090CCE481113CC42181AC6392022C22F2A2CC22E402C
+C62E572CC92E6D2CC62D852AB726A02DA81BD4368D08FC458B07FF468B07FF
+468B07FF468B07FF468B07FF468B07FF468B07FF468B07FF468B07FF468B07
+FF468B07FF468B07FF46A03A0000A03A0000A13C0000A13E0000A4410000A7
+440000AD480000B44B0102BF4C0406CA4D090CD04A1012CF44181AC93B1F22
+C531292BC42F3D2DC82F552ECB2F6C2EC82E842BB9279F2EA91CD0378E09FB
+478C07FF478C07FF478C07FF478C07FF478C07FF478C07FF478C07FF478C07
+FF478C07FF478C07FF478C07FF478C07FF47A03A0000A13B0000A13C0000A2
+3F0000A4420000A8450000AD490000B44C0102BF4E0406CA4F090BD24D0F12
+D2471719CC3E1E22C733282BC7303A2FC930522FCD2F6A2FCB2F822DBC289C
+30AB1CCB39900BFB488C08FF498C08FF498C08FF498C08FF498C08FF498C08
+FF498C08FF498C08FF498C08FF498C08FF498C08FF498C08FF49A13B0000A1
+3C0000A13D0000A2400000A4430000A8460000AD4A0000B44E0101BF500406
+CB51080BD4500F11D64B1619D0411D22CB36262BC9313730CC304F31D03067
+31CD2F7F2FC0299A32AC1DC73C930DFB498D09FF4A8D0AFF4B8D0AFF4B8D0A
+FF4B8D0AFF4B8D0AFF4B8D0AFF4B8D0AFF4B8D0AFF4B8D0AFF4B8D0AFF4B8D
+0AFF4BA13C0000A23D0000A23E0000A3410000A4440000A8480000AE4C0000
+B54F0101BF520405CB53080AD7530E11DB4F1518D4451C21CF3A252BCC3233
+33CE314B35D2306335D02E7B33C3299735AF1EC33F9312FB4A850BFF50810D
+FF50810DFF50810DFF50810DFF50810DFF50810DFF50810DFF50810DFF5081
+0DFF50810DFF50810DFF50A23D0000A23E0000A33F0000A3420000A5450000
+A8490000AE4E0000B5510101BF540305CC56070ADA560D10DE521417D8491A
+21D33D222BCE312D37CF304439D32E5D3AC5377834AF3392379B2EBD3B7617
+F7535B06FF645603FF685503FF685503FF685503FF685503FF685503FF6855
+03FF685503FF685503FF685503FF685503FF68A33E0000A33F0000A3400000
+A4430000A5470000A84B0000AE500000B5530101BE560304CC590709DB590C
+0FE0561216DC4C1821D8421F2CD132273BBF3D4137B2445C36A13F703D9340
+8B3E8238B0435D1CF1583800FF753600FF763500FF763500FF763500FF7635
+00FF763500FF763500FF763500FF763500FF763500FF763500FF76A33F0000
+A4400000A4420000A4450000A5480000A84C0000AD510000B4550001BD5802
+03CB5B0608DA5D0B0EE35A1016E1501521CF512126B653302BA15243339551
+57398B526E3C8150863F794FAD404729EB581300FF7F1000FF801000FF8010
+00FF801000FF801000FF801000FF801000FF801000FF801000FF801000FF80
+1000FF80A4410000A5420000A5430000A4460000A64A0000A84E0000AC5200
+00B3560000BC5A0203CA5E0507DA600A0CE65E0E15CE651A19B36624209C63
+2E298C603E32815F523B775E6840715F823F695DA940413DE3560313FF8003
+15FF800315FF800315FF800315FF800315FF800315FF800315FF800315FF80
+0315FF800315FF800315FF80A5420000A6430000A6450000A5480000A64C00
+00A8500000AB540000B1580000BB5D0202C8610506D365080BBC6C1010AB71
+18179A72211E8B712B267E713A2F716F4D38676D633C626E7E3B5D6FA23B44
+5FDD46002CFF77002EFF76002FFF76002FFF76002FFF76002FFF76002FFF76
+002FFF76002FFF76002FFF76002FFF76002FFF76A6440000A7450000A74600
+00A64A0000A64D0000A8520000AB560000B05A0000B95F0102BB650405AC6C
+07099F730C0F957814148A7C1D1B7E7F2723707E342B637D4632597B5C3755
+7D7635527F94334A7EC9340050FF6B0052FF6A0052FF6A0052FF6A0052FF6A
+0052FF6A0052FF6A0052FF6A0052FF6A0052FF6A0052FF6A0052FF6AA74600
+00A8470000A8480000A74C0000A6500000A8530000AA570000AE5C0000AB62
+01019E690304967205088E7A0A0C878210127E891918738D231F638E2D2652
+8B3B2F4C8B53314A8E6D2F4690882D4492B12C0675F65E0776F55D0776F55D
+0776F55D0776F55D0776F55D0776F55D0776F55D0776F55D0776F55D0776F5
+5D0776F55DA9480000A9490000A94B0000A84E0000A7510000A7550000A959
+0000A05E0000936401018D6E020388780406828207097B8D0D0F7296151466
+9D1D1B569E2522489D3328409F492B3EA364293AA67C2838AB9C2719A0EA42
+1AA2EB401AA3EB401AA3EB401AA3EB401AA3EB401AA3EB401AA3EB401AA3EB
+401AA3EB401AA3EB401AA3EB40AB4B0000AC4B0000AB4D0000A9510000A754
+0000A75700009B5A00008C5F000085680101807301027C7D0304778905066F
+97080A65A40E1058AE15164CB41E1C3FB82B2337BD3F2533C5582430CF7023
+2DD98B2320DBC62D1EDCCF2F1EDCCF2F1EDCCF2F1EDCCF2F1EDCCF2F1EDCCF
+2F1EDCCF2F1EDCCF2F1EDCCF2F1EDCCF2F1EDCCF2FAE4D0000AF4E0000AE50
+0000AA530000A85500009A580000885B00007E610000796B00007577000072
+8201016C90020364A204065CB6080A50C60F0F43D417163AE3241B27EC2E25
+15EE3A320AF6513909F86E390BFD92360CFF9C340CFF9C340CFF9C340CFF9C
+340CFF9C340CFF9C340CFF9C340CFF9C340CFF9C340CFF9C340CFF9C34B050
+0000B1510000B0520000AB5500009C570000865800007A5D0000736500006F
+6F00006B7B000066880000609A00005AAF010253C6050548DA0B0B3CEC1512
+20F713230AFE153406FF2F3303FF4D3302FF683305FF843106FF912F06FF91
+2F06FF912F06FF912F06FF912F06FF912F06FF912F06FF912F06FF912F06FF
+912F06FF912FB3530000B3530000B3540000A1560000875600007959000070
+5F00006A67000066720000617E00005B8C0000569E000051B4020249CA0605
+3DD90C0B33EC171116F8102408FE1D2D03FF362E01FF542D01FF6C2D03FF84
+2D03FF932C03FF932C03FF932C03FF932C03FF932C03FF932C03FF932C03FF
+932C03FF932C03FF932C03FF932CB5550000B5550000A85500008A53000079
+5400006E59000067600000626900005D74000057800000518F00004EA20000
+48B702023EC7060634D90E0B2AEE181114FA172008FF252701FF3E2900FF59
+2801FF6F2801FF842901FF962801FF962801FF962801FF962801FF962801FF
+962801FF962801FF962801FF962801FF962801FF9628B5550000AD5500008D
+5100007A5100006D530000655900005E610000596A0000547600004E830000
+4992000045A500003EB6020234C507062ADA0E0C22F0181212FC1E1C04FF2A
+2400FF442300FF5D2200FF722301FF852408FFA51D08FFA51D08FFA51D08FF
+A51D08FFA51D08FFA51D08FFA51D08FFA51D08FFA51D08FFA51D08FFA51DB3
+5500008F5000007C4D00006E4F0000635300005C59000057620000516C0000
+4C78000046860000419500003CA5000034B302022BC6070723DE0E0C1CF419
+120DFE211B00FF302100FF491E00FF601E00FF741F00FF85200FFFB7140FFF
+B7140FFFB7140FFFB7140FFFB7140FFFB7140FFFB7140FFFB7140FFFB7140F
+FFB7140FFFB714905100007D4D00006F4B0000634E00005B530000555A0000
+4F6300004A6E0000437B00003D8800003895000032A400002BB3030324C808
+071DE20F0D16F8191105FF211B00FF351D01FF4D1A01FF631900FF761B00FF
+861C0AFFB6140BFFBF130BFFBF130BFFBF130BFFBF130BFFBF130BFFBF130B
+FFBF130BFFBF130BFFBF130BFFBF137C4D00006E4A0000634A00005A4E0000
+535400004E5C000048650000427100003B7E0000358900002F9500002AA300
+0024B503031ECC080817E60F0D0BF8161501FF221A00FF3B1902FF511501FF
+651500FF791800FF861806FFB31307FFBB1207FFBB1207FFBB1207FFBB1207
+FFBB1207FFBB1207FFBB1207FFBB1207FFBB1207FFBB126E4A000063490000
+5A4A0000534F00004D560000475E0000416900003A750000337F00002D8A00
+002896000023A501011EB8040418D0080812E9100C04F9161500FF271600FF
+3F1401FF541100FF671200FF7A1401FF88140EFFB3090EFFBB080EFFBB080E
+FFBB080EFFBB080EFFBB080EFFBB080EFFBB080EFFBB080EFFBB080EFFBB08
+6149000059490000524A00004C5000004658000040620000396D0000327800
+002C820000268B0000229700001EA8010119BC040413D409080EEA120B04F9
+1C1100FF2C1200FF431000FF570E00FF690F00FF7B1007FF8D0B10FFB1020E
+FFB6030EFFB6030EFFB6030EFFB6030EFFB6030EFFB6030EFFB6030EFFB603
+0EFFB6030EFFB60358490000514900004C4B000046520000405B0000396500
+00327000002B7A000025830000218E00001D9A000019AB010213BF04050ED6
+0A080AEC150902FA200E04FF330B00FF470C00FF5A0B00FF6B0B00FF7B0C04
+FF8B090DFFAE010EFFB4000EFFB4000EFFB4000EFFB4000EFFB4000EFFB400
+0EFFB4000EFFB4000EFFB4000EFFB400>
+<9B3100009B3100009B3200009C3300009E350000A1370000A5390000AA3901
+02B1390507B7380A0DB8341114B42C191BB0272420B0253321AF254821B325
+5E21B5267220B024861FAB229F1EA41BD0218901FD378700FF368700FF3687
+00FF368700FF368700FF368700FF368700FF368700FF368700FF368700FF36
+8700FF368700FF369B3100009B3200009C3200009C3400009E360000A13700
+00A5390000AA3A0102B23A0507B8390A0DBA351113B52E191BB1282320B026
+3221B0254721B4265D21B5267121B1258520AC229E1FA51CCE218902FC3886
+00FF368600FF378600FF378600FF378600FF378600FF378600FF378600FF37
+8600FF378600FF378600FF378600FF379B3100009B3200009C3300009D3400
+009E360000A1380000A53A0000AB3B0102B23B0407B93A0A0CBB361113B62F
+191AB2292320B1263122B1264721B5265D21B6277121B2258520AD239E1FA6
+1CCC218A02FB388600FF378600FF378600FF378600FF378600FF378600FF37
+8600FF378600FF378600FF378600FF378600FF378600FF379B3200009C3200
+009C3300009D3500009F370000A2390000A63A0000AB3B0102B33C0406BA3B
+090CBC371013B730181AB32A221FB2273022B1264622B5275C22B7277021B4
+268420AE239D1FA71DCB218A02FA398600FF388600FF388600FF388600FF38
+8600FF388600FF388600FF388600FF388600FF388600FF388600FF388600FF
+389B3200009C3300009C3300009D3500009F370000A2390000A63B0000AB3C
+0102B33C0406BB3C090CBD391013B831181AB42B221FB3272F23B2274522B6
+275B22B8286F22B5268421AF249C20A81EC9218A03F83A8600FF398600FF39
+8600FF398600FF398600FF398600FF398600FF398600FF398600FF398600FF
+398600FF398600FF399C3300009C3300009D3400009D3600009F380000A23A
+0000A63C0000AC3D0102B43E0406BC3D090CBE3A1012BA331819B62C211FB4
+282E23B3284422B7285A22B9286E22B6278321B0249B20A91FC8228B04F73A
+8600FF3A8600FF3A8600FF3B8600FF3B8600FF3B8600FF3B8600FF3B8600FF
+3B8600FF3B8600FF3B8600FF3B8600FF3B9C3300009C3400009D3400009E36
+00009F380000A23A0000A63C0000AC3E0101B43F0406BD3F080BBF3B0F12BC
+351719B72E211FB5282D24B4284223B8295823BA296D22B8288222B1259A21
+AB20C6228B04F63B8600FF3C8600FF3C8600FF3C8600FF3C8600FF3C8600FF
+3C8600FF3C8600FF3C8600FF3C8600FF3C8600FF3C8600FF3C9C3400009D34
+00009D3500009E370000A0390000A33B0000A73D0000AD3F0101B5400405BE
+40080BC13D0F12BE371719B930201FB6292C24B6294123B92A5723BC2A6C23
+BA298122B2269922AD22C5228C05F53C8701FF3D8701FF3D8701FF3D8701FF
+3D8701FF3D8701FF3D8701FF3D8701FF3D8701FF3D8701FF3D8701FF3D8701
+FF3D9D3400009D3500009E3600009E380000A03A0000A33C0000A73E0000AD
+410101B6420305BF42080BC23F0F11C0391718BB311F1FB82A2A25B72A3E24
+BB2A5525BE2B6A24BC2A8024B3269723AE22C2238D06F53E8702FF3E8702FF
+3E8702FF3E8702FF3E8702FF3E8702FF3E8702FF3E8702FF3E8702FF3E8702
+FF3E8702FF3E8702FF3E9D3500009E3600009E3700009F380000A13B0000A4
+3D0000A8400000AE420001B7440305C044070AC4410E11C33C1618BE341E1F
+BA2C2925B92B3C26BC2B5226C02B6826BF2B7F25B6279525B023BF248F08F4
+3F8803FF3F8803FF408803FF408803FF408803FF408803FF408803FF408803
+FF408803FF408803FF408803FF408803FF409E3600009E3700009F3700009F
+390000A13C0000A43E0000A9410000AE440000B7450304C046070AC6440D10
+C63F1517C1371D1FBD2F2725BB2C3927BE2C5028C22C6628C22C7D26B92893
+26B124BB26910AF4408904FF418904FF418904FF418904FF418904FF418904
+FF418904FF418904FF418904FF418904FF418904FF418904FF419E3700009F
+3800009F380000A03A0000A23D0000A5400000A9430000AE460000B7470304
+C1480709C9470D0FCA421416C43A1C1EC0322625BE2D3529C02D4D29C42D64
+2AC42C7A28BC299128B224B729950CF4428A05FF438A05FF438A05FF438A05
+FF438A05FF438A05FF438A05FF438A05FF438A05FF438A05FF438A05FF438A
+05FF439F3800009F390000A03A0000A13B0000A23E0000A5410000A9440000
+AF470000B7490204C14A0609CB4A0C0FCF461316C93E1B1DC4352425C12E31
+2BC22E492CC72E612CC72D772BC02B8F2AAF27B22B9115F4407D0AFF477A0B
+FF47790CFF47790CFF47790CFF47790CFF47790CFF47790CFF47790CFF4779
+0CFF47790CFF47790CFF47A0390000A03A0000A13B0000A13D0000A23F0000
+A5430000A9460000AF490000B74C0203C24D0608CF4E0B0ED24A1215CE421A
+1DC9392225C5302D2DC62F452EC4345E2BB639742BA8388B2B9C35AB2B8525
+ED3D5603FF5D5201FF5F5001FF615001FF615001FF615001FF615001FF6150
+01FF615001FF615001FF615001FF615001FF61A03B0000A13B0000A13C0000
+A23E0000A3410000A5440000AA480000AF4C0000B74E0203C3500507D0510A
+0DD64F1114D448191CCE3E2024C5392C2BB03E422DA140583097416D328D40
+8332873FA2327C37DE393700FF6B3500FF6C3300FF6C3300FF6C3300FF6C33
+00FF6C3300FF6C3300FF6C3300FF6C3300FF6C3300FF6C3300FF6CA13C0000
+A23D0000A23D0000A2400000A3430000A6460000AA4A0000B04E0000B85101
+02C3540406D1550A0CDA541013DB4E171BBF4E2120A54B2C29944A3D308748
+50367F4A6738784A7D39734A9B386C45D43B1400FF771100FF781000FF7810
+00FF781000FF781000FF781000FF781000FF781000FF781000FF781000FF78
+1000FF78A23D0000A33E0000A33F0000A3410000A4440000A6480000AA4C00
+00B0510000B7540101C3570406D159090BD55A0E11BA5E1717A45E211E915A
+2A268257392F76554B386C55613C6555783C6256983A5951CC3E0513FD7804
+14FD780315FD770315FD770315FD770315FD770315FD770315FD770315FD77
+0315FD770315FD770315FD77A33F0000A4400000A4410000A4430000A54700
+00A64A0000A94E0000AF530000B6560101C15A0305BF5F0709AD650D0F9E68
+15158F691E1B826927247467352C676446355D645B39586474395565923652
+65C334042CFC6D012CFE6F012EFE6E012EFE6E012EFE6E012EFE6E012EFE6E
+012EFE6E012EFE6E012EFE6E012EFE6E012EFE6EA5410000A5420000A64300
+00A5450000A5480000A64C0000A9500000AE550000B4590001AC5F0304A065
+0608956B0B0E8C70131382751B19757724216775302959733F30507254344D
+736E324B748A304974B42E0A4CF45B0048FF630049FF620049FF620049FF62
+0049FF620049FF620049FF620049FF620049FF620049FF620049FF62A64300
+00A6440000A7450000A6470000A64B0000A74F0000A9530000AC5700009F5C
+0001956302048D6B05078673090B7F7A0F11768118176A83211E5A83292549
+81342C42814A2E4283672C3F84812B3E85A2291472E349056AF956056BF856
+056BF856056BF856056BF856056BF856056BF856056BF856056BF856056BF8
+56056BF856A7460000A8460000A8470000A74A0000A74D0000A7510000A855
+0000975800008C5F010185670203807104057A7A070973830C0E698B13145C
+911B1A4E92232140912E273891422837955E2735967726339994252396D130
+1B92FD381B94FD371B94FD371B94FD371B94FD371B94FD371B94FD371B94FD
+371B94FD371B94FD371B94FD37A9480000A9490000AA4A0000A94D0000A74F
+0000A753000092550000855A00007E620001796C0102757603046F81050667
+8C080A5C960E0F509D141543A21D1C37A5282230A73B232DAC55222CB46D21
+2BBA882024BDB6231ABAE32D19BBE32D19BBE32D19BBE32D19BBE32D19BBE3
+2D19BBE32D19BBE32D19BBE32D19BBE32D19BBE32DAB4B0000AC4C0000AD4D
+0000AB500000A95300009153000081560000785C0000726500006E7000006A
+7B0101638702035B96040653A5080A48B00E103BB9171631C4211C2BCE331D
+20D544231ADE5E2519E8772517EA952613EBBE2813ECBE2813ECBE2813ECBE
+2813ECBE2813ECBE2813ECBE2813ECBE2813ECBE2813ECBE2813ECBE28AF4E
+0000B04F0000B0500000AD5200009252000080530000745800006D5F000068
+690000647400005E8100005890000053A401014DBA030343CD090838E0120D
+26F316180BFD102C06FF2A2C01FF472D01FF642C02FF7D2D03FF942B03FF94
+2B03FF942B03FF942B03FF942B03FF942B03FF942B03FF942B03FF942B03FF
+942B03FF942BB2510000B2520000B35300009652000080520000735500006A
+5B0000636300005E6D00005A780000548600004E9600004BAB000043BF0303
+38CD09082EE0120E1FF517180CFE1C2404FF312700FF4D2800FF682701FF7F
+2802FF982602FF992602FF992602FF992602FF992602FF992602FF992602FF
+992602FF992602FF992602FF9926B4540000B5550000995300008250000073
+51000068550000615C00005B640000566E0000507B00004B89000046990000
+41AC000038BB03032ECD0A0925E3120F1BF81B1509FF222100FF372400FF53
+2200FF6B2201FF7F2308FFA11D0AFFA91B0AFFA91B0AFFA91B0AFFA91B0AFF
+A91B0AFFA91B0AFFA91B0AFFA91B0AFFA91B0AFFA91BB55500009B53000083
+4E0000744D0000675000005F550000585C0000536500004E710000487E0000
+428B00003E9B000037AB00002FBA040426CF0A091FE7130F15FD1C1504FF27
+1F00FF3D1F00FF571D00FF6E1E00FF801F0AFFA4170EFFBB140EFFBB140EFF
+BB140EFFBB140EFFBB140EFFBB140EFFBB140EFFBB140EFFBB140EFFBB149D
+530000834E0000744B0000674C00005E50000057560000515E00004B670000
+457300003F8000003A8D0000349A00002DA8000027BB040420D30B0A18EB13
+0F0CFE1B1600FF291D00FF431A01FF5A1800FF701A00FF811B06FF9F170BFF
+CB110BFFCB110BFFCB110BFFCB110BFFCB110BFFCB110BFFCB110BFFCB110B
+FFCB110BFFCB11834E0000734B0000674900005D4B00005650000050570000
+4A600000446A00003D77000036820000308D00002B9A000026AA010120BF05
+051AD70B0A11EF121002FF181900FF2E1801FF471602FF5D1300FF721600FF
+821705FF9E1307FFDC1007FFDC1007FFDC1007FFDC1007FFDC1007FFDC1007
+FFDC1007FFDC1007FFDC1007FFDC10734B0000664900005D490000554B0000
+4F51000049590000436300003C6E0000357900002E840000298F0000249B00
+0020AC01021BC3050614DB0B0A0BF0130F01FF1D1600FF331401FF4B1101FF
+5F1000FF731200FF84140DFFA10805FFDF0D05FFDF0D05FFDF0D05FFDF0D05
+FFDF0D05FFDF0D05FFDF0D05FFDF0D05FFDF0D05FFDF0D654900005B490000
+544900004E4C000048530000425C00003B660000347200002D7C0000278500
+00239000001F9E00001AB0020215C605060FDD0D0909F1170D00FE221201FF
+380F00FF4E0E00FF620D00FF750F03FF870D0FFFA20205FFD70905FFD70905
+FFD70905FFD70905FFD70905FFD70905FFD70905FFD70905FFD70905FFD709
+5A490000534900004D4A0000474E0000415600003B600000346A00002D7500
+00277E0000228800001E9300001AA1000015B302030FC906060ADE0E0806F3
+1A0A05FE290904FF3F0800FF510A00FF640900FF760B01FF860B09FFA10407
+FFCC0407FFCC0407FFCC0407FFCC0407FFCC0407FFCC0407FFCC0407FFCC04
+07FFCC0407FFCC04514900004B4A0000464C0000415100003B5A0000346400
+002D6E000027780000218100001D8A00001996000015A4000110B502030ACA
+060607E0100707F41F0509FE300003FF420400FF540600FF660600FF760701
+FF860706FF9F0208FFC40008FFC40008FFC40008FFC40008FFC40008FFC400
+08FFC40008FFC40008FFC40008FFC400>
+<952B0000962C0000962C0000972D0000992E00009B3000009E310000A23101
+02A8300406AD2E090BAE2A1012AA23171AA620221DA620311EA71F451DA81F
+5A1DAA206D1DA71F801CA31E961BA41CC11A8D03F92D8700FF2B8700FF2B87
+00FF2B8700FF2B8700FF2B8700FF2B8700FF2B8700FF2B8700FF2B8700FF2B
+8700FF2B8700FF2B952B0000962C0000972D0000972D0000992F00009B3000
+009F310000A3320102A8310405AD2F090BAF2B0F12AB241619A721211DA720
+301EA820451DA91F591EAB206D1DA8207F1CA41E951BA41CBF1A8D04F82D87
+00FF2C8700FF2C8700FF2C8700FF2C8700FF2C8700FF2C8700FF2C8700FF2C
+8700FF2C8700FF2C8700FF2C8700FF2C962C0000962C0000972D0000982E00
+009A2F00009C3100009F320000A3320102A9320405AE30080BB02C0F11AC25
+1619A822211DA7202F1EA820441EAA20591EAC216C1DA9207F1DA51E951CA4
+1CBE1A8E05F62D8700FF2C8700FF2C8700FF2D8700FF2D8700FF2D8700FF2D
+8700FF2D8700FF2D8700FF2D8700FF2D8700FF2D8700FF2D962C0000972D00
+00982E0000982E00009A3000009C310000A0320000A4330101A9320405AF31
+080BB12D0F11AD261619A923201DA8212E1FA921431EAB20581EAD216B1EAA
+217E1DA61F941CA51DBC1B8E06F52D8700FF2D8700FF2D8700FF2D8700FF2D
+8700FF2D8700FF2D8700FF2D8700FF2D8700FF2D8700FF2D8700FF2D8700FF
+2D972D0000972D0000982E0000992F00009A3100009D320000A0330000A434
+0101AA330305B032080AB22F0F11AE281618AA24201DA9212D1FAA21421EAB
+21571FAD226A1EAB217E1DA71F931CA51DBB1B8F07F32D8700FF2E8700FF2E
+8700FF2F8700FF2F8700FF2F8700FF2F8700FF2F8700FF2F8700FF2F8700FF
+2F8700FF2F8700FF2F972D0000982E0000992F00009A3000009B3100009D33
+0000A0340000A5350101AA340305B133070AB3300E10B0291518AC251F1DAA
+222C20AA22411FAC22561FAF22691FAD227D1EA820921DA61EB91C9008F12D
+8700FF308700FF308700FF308700FF308700FF308700FF308700FF308700FF
+308700FF308700FF308700FF308700FF30982E0000992F0000993000009A30
+00009C3200009E330000A1350000A5360101AB360304B235070AB4320E10B1
+2B1518AD261F1DAB232B20AB23401FAD22541FB023681FAF237C1EA921911D
+A71FB71C9109EF2E8700FF318700FF318700FF318700FF318700FF318700FF
+318700FF318700FF318700FF318700FF318700FF318700FF31992F00009A30
+00009A3000009B3100009C3300009E340000A1360000A5370101AC370304B3
+360709B6330D10B32D1417AF281E1DAD232A21AD243E20AE235320B1246720
+B1247B1FAB22901EA820B41D920AEC2E8700FF338700FF338700FF338700FF
+338700FF338700FF338700FF338700FF338700FF338700FF338700FF338700
+FF339A3000009A3100009B3100009B3200009C3400009F350000A2370000A6
+380001AC390204B4380609B7350D0FB6301417B12A1D1DAE242822AE253C20
+B0245120B3256620B3257A20AC238F1FA920B21D930CEA2E8700FF358700FF
+358700FF358700FF358700FF358700FF358700FF358700FF358700FF358700
+FF358700FF358700FF359B3100009B3100009B3200009C3300009D3400009F
+360000A2380000A73A0000AD3B0203B53A0609B9380C0FB8331316B42C1C1C
+B0262722B0263A21B1254F21B5266421B5267920AF248E20AB22AF1E950EE6
+2E8600FF378600FF378600FF378600FF378600FF378600FF378600FF378600
+FF378600FF378600FF378600FF378600FF379B3200009C3200009C3300009C
+3400009D350000A0370000A3390000A73C0000AE3D0203B63C0608BB3A0B0E
+BC361315B62F1B1CB3282622B2273722B3274D22B7286222B8287821B2258C
+20AD23AC1F9810E02E8600FF398600FF398600FF398600FF398600FF398600
+FF398600FF398600FF398600FF398600FF398600FF398600FF399C3300009C
+3300009D3400009D3500009E370000A0390000A43B0000A83E0000AF3F0203
+B73F0508BE3E0B0EBF3A1214BA321A1CB62B2421B5283423B5284A23BA2960
+23BB297622B5278A21B024A9209A13DB2E8600FF3C8600FF3C8501FF3C8401
+FF3C8401FF3C8401FF3C8401FF3C8401FF3C8401FF3C8401FF3C8401FF3C84
+01FF3C9C3400009D3500009D3500009E3600009F380000A13A0000A53D0000
+A93F0000B0410202B9420507C1410A0DC33E1113BE36191BBA2F2321B82A31
+25B82A4724BC2B5D25BE2B7324B4298824A528A424901BD42F7508FF417108
+FF426F08FF436E08FF436E08FF436E08FF436E08FF436E08FF436E08FF436E
+08FF436E08FF436E08FF439D3500009E3600009E3700009F3700009F3A0000
+A23C0000A53F0000AA420000B1440102BA450406C445090CC6421013C33B18
+1ABE332121BB2C2D27BB2B4227B0315927A6336D289B33822991319E298327
+CE305404FE544F01FF574D01FF594C00FF594C00FF594C00FF594C00FF594C
+00FF594C00FF594C00FF594C00FF594C00FF599E3700009F3700009F380000
+9F390000A03B0000A33E0000A6410000AB440000B1470101BB480406C44808
+0BCA460F12C9401719C3381F21B0332928A0363C2A9439512D8B3A662F833A
+7B307E3A962F7736C3313C07F95D3200FF643000FF652F00FF652F00FF652F
+00FF652F00FF652F00FF652F00FF652F00FF652F00FF652F00FF659F380000
+A0390000A03A0000A03B0000A13D0000A3400000A6430000AB460000B14A00
+01BB4B0305C54C070ACE4B0E10CA481517AE471E1E974328268941372D7C3F
+493375415F356E42743669428F356741B9341E0CF3631201FE701001FE7010
+01FE701001FE701001FE701001FE701001FE701001FE701001FE701001FE70
+1001FE70A03A0000A13B0000A13B0000A13C0000A23F0000A3420000A64500
+00AC490000B24D0001BB4F0304C6500709BF540C0FAA57151697561E1C8752
+2724784E332C6B4B4435614C59395B4C6F39584C8A37574DB3352024EE5705
+14FA6F0515FA6F0415FA6F0415FA6F0415FA6F0415FA6F0415FA6F0415FA6F
+0415FA6F0415FA6F0415FA6FA13C0000A23D0000A23D0000A33E0000A34100
+00A4440000A7480000AC4C0000B2500001BB530203AF590608A15D0B0E9460
+131487621C1A796024216B5D2F2A5D5A3E32535A52364F5B6B354C5B86344B
+5CAD30213EE84A032BFD68022CFD67022DFD67022DFD67022DFD67022DFD67
+022DFD67022DFD67022DFD67022DFD67022DFD67A33E0000A33F0000A43F00
+00A4400000A4430000A5470000A74B0000AC4F0000B1530000A1590203965E
+05088C640A0C836911117A6D19176C6D211F5D6C2A264C6A332D4369473144
+6A652F426A802D426BA12B275EDE390245FD5B0246FD5A0246FD5A0246FD5A
+0246FD5A0246FD5A0246FD5A0246FD5A0246FD5A0246FD5A0246FD5AA44000
+00A5410000A5420000A5430000A5460000A5490000A74D0000A75100009656
+00008C5D0203856405067E6B080A77720E0F6E781715617A1E1C517A252340
+782D293978412B387A5C2A397A7928387B97272974CA2D005FFF500060FF4F
+0061FF4F0061FF4F0061FF4F0061FF4F0061FF4F0061FF4F0061FF4F0061FF
+4F0061FF4FA6430000A6440000A6440000A7450000A6480000A64C0000A150
+00008F530000855901017E610203796A0405727207086B7B0C0D6181131354
+8619194687201F3887292530873B262E8A55252F8B71242F8D8C222D8FB922
+1082FD3A1083FD391084FD391084FD391084FD391084FD391084FD391084FD
+391084FD391084FD391084FD39A7450000A8460000A8470000A9480000A74B
+00009F4E00008A5000007F540000775B0001726501026D6F0303677905065F
+83080A548B0E0F489114153C951B1B309826212A993721289C4F2028A1691F
+28A7831E26A8A81E12A4F52D12A4F52D12A5F52D12A5F52D12A5F52D12A5F5
+2D12A5F52D12A5F52D12A5F52D12A5F52D12A5F52DA9490000AA4A0000AB4A
+0000AC4B0000A14E0000894E00007B510000725700006C5F00006769000062
+7301015B7F0203548B05064B97080A409F0E1033A6151629AE1F1C25B62F1C
+22BB461B24C9611A22D2781A1ED4951C16D3DF2115D4E02015D5E02015D5E0
+2015D5E02015D5E02015D5E02015D5E02015D5E02015D5E02015D5E020AC4C
+0000AD4D0000AE4E0000A54E00008A4D0000794E00006E530000675A000061
+6300005C6D000057790000508600004B96010144A704043AB408092FC30F0F
+25D419151FEA251817FB381B06F8492504F9642603FD7D280AFFA3210DFFAF
+1E0DFFAE1E0DFFAE1E0DFFAE1E0DFFAE1E0DFFAE1E0DFFAE1E0DFFAE1E0DFF
+AE1E0DFFAE1EB04F0000B1500000A85100008C4D00007A4D00006D50000064
+5600005D5E000058670000537300004D800000478F000043A100003CB20101
+33C1060529D70D0B21EE161112FD1D1B03FF2B2300FF472100FF622100FF7A
+2204FF971F0BFFAC1A0BFFAC190BFFAC190BFFAC190BFFAC190BFFAC190BFF
+AC190BFFAC190BFFAC190BFFAC19B3530000AF5400008C5000007B4C00006D
+4E0000625200005B58000055600000506900004A760000448300003F920000
+3AA1000032AF02022AC3060622DB0D0B1AF218110DFE221900FF311F00FF4C
+1C00FF651C00FF7B1E05FF971A0DFFBE130DFFBE130DFFBE130DFFBE130DFF
+BE130DFFBE130DFFBE130DFFBE130DFFBE130DFFBE13B45500008C5000007A
+4C00006D4A0000614D000059520000535900004E610000486C000041790000
+3B850000359200002F9F000029AF020223C506061CDF0D0C13F6171102FF1F
+1C00FF371B01FF501701FF681800FF7D1A02FF93190AFFCF110AFFCF110AFF
+CF110AFFCF110AFFCF110AFFCF110AFFCF110AFFCF110AFFCF110AFFCF118D
+500000794C00006B4A000061490000584D0000525300004C5B000046640000
+40700000397B0000328600002C920000279F000022B203031DC9070715E30E
+0C08F6141501FF221800FF3C1602FF541300FF6A1400FF7F1605FF941306FF
+E00F06FFE00F06FFE00F06FFE00F06FFE00F06FFE00F06FFE00F06FFE00F06
+FFE00F06FFE00F794C00006A4A00005F49000058490000514E00004B540000
+455D00003F68000037730000307E00002A8800002593000021A201011CB503
+0317CD070710E50F0B05F7181200FF281400FF401200FF571000FF6B1100FF
+81120CFF9A0804FFDF0C01FFF10E01FFF10E01FFF10E01FFF10E01FFF10E01
+FFF10E01FFF10E01FFF10E01FFF10E694A00005E4900005649000050490000
+4A4F0000445700003E610000376C00002F77000029800000248A0000209600
+001CA5010117B9030411D107070CE7120A05F71D0E02FF2D0E00FF450D00FF
+590C00FF6D0D00FF810E0BFF9A0405FFD70800FFF90B00FFF90B00FFF90B00
+FFF90B00FFF90B00FFF90B00FFF90B00FFF90B00FFF90B5D49000054490000
+4E4A0000494B0000435100003D5A0000366500002F6F000029790000238200
+001F8C00001B99000016A8010111BC03040CD2080708E8140805F8210908FF
+360501FF480900FF5C0900FF6F0900FF810A06FF990508FFCB0202FFED0602
+FFED0602FFED0602FFED0602FFED0602FFED0602FFED0602FFED0602FFED06
+534900004D4A0000474B0000434D00003D550000365E00002F690000287300
+00237C00001E8500001A8F0000169C000011AB01010CBE040407D4080606EA
+170607F9260206FF390100FF4B0500FF5F0500FF700501FF820605FF970208
+FFC40002FFE10402FFE10402FFE10402FFE10402FFE10402FFE10402FFE104
+02FFE10402FFE1044B4A0000464C0000414E00003C500000365800002F6200
+00286C0000237600001E7E00001987000015920000119E00000CAD010207BE
+040404D60C0403EB1A0304FA280102FF3B0100FF4E0200FF610200FF720202
+FF830103FF960004FFBA0003FFD30003FFD30003FFD30003FFD30003FFD300
+03FFD30003FFD30003FFD30003FFD300>
+<8F250000902600009126000091270000922800009429000097290000992900
+019D280304A126080AA3220E10A01D15189F1B201A9F1B2E1A9F1B421AA01A
+551AA11A68199F1A7B199D198E189C17AF16940CE81D8500FF218500FF2285
+00FF228500FF228500FF228500FF228500FF228500FF228500FF228500FF22
+8500FF228500FF229025000090260000912700009227000093280000952900
+00972900009A2900019E280304A226080AA4230E10A11D15189F1C201A9F1B
+2E1BA01B411AA01A551AA21B681AA01B7A199D198E189D18AE17950DE71D85
+00FF228500FF228500FF228500FF228500FF228500FF228500FF228500FF22
+8500FF228500FF228500FF228500FF22902600009126000091270000922800
+0093290000952A0000972A00009A2A00019E290304A3270809A5240E10A21E
+1418A01C1F1AA01C2D1BA01B401AA11B541AA21B671AA11B7A199E1A8D189D
+18AD17960EE61D8600FF238600FF238600FF238600FF238600FF238600FF23
+8600FF238600FF238600FF238600FF238600FF238600FF2391260000912700
+00922800009228000093290000962A0000982B00009B2B00019F2A0304A428
+0709A6250E0FA31F1417A11D1F1AA01C2C1BA11C401BA21B541BA31C671AA1
+1C791A9F1A8D199E19AC17970FE51D8600FF248600FF248600FF248600FF24
+8600FF248600FF248600FF248600FF248600FF248600FF248600FF248600FF
+2491270000922800009228000093290000942A0000962B0000992B00009B2C
+0001A02B0304A5290709A7260D0FA4201417A21E1E1BA11D2B1CA21D3F1BA2
+1C531BA41C661BA21C781AA01B8C199E19AB189810E31D8600FF258600FF25
+8600FF258600FF258600FF258600FF258600FF258600FF258600FF258600FF
+258600FF258600FF25922700009228000093290000942A0000952B0000972C
+0000992C00009C2D0000A02C0203A62B0609A8270D0FA6221316A31E1D1BA2
+1D2A1CA31D3E1BA31C521CA51D651BA41D771BA11C8B1A9F1AA9189911E21D
+8600FF268600FF268600FF268600FF268600FF268600FF268600FF268600FF
+268600FF268600FF268600FF268600FF269228000093290000942A0000942A
+0000952B0000972C00009A2D00009D2E0000A12D0203A72C0608A9290C0EA7
+231316A51F1D1BA31E291DA41E3C1CA41D501CA61D641CA51E761BA21D8A1A
+A01BA7199B13E11D8700FF278700FF278700FF278700FF278700FF278700FF
+278700FF278700FF278700FF278700FF278700FF278700FF2793290000942A
+0000952B0000952B0000962C0000982D00009B2E00009E2F0000A22F0203A8
+2E0608AB2B0C0EA9251315A6211C1BA41E271EA51F3B1CA61E4F1DA71E631C
+A71E751CA31D891BA11CA61A9C14DF1D8700FF298700FF298700FF298700FF
+298700FF298700FF298700FF298700FF298700FF298700FF298700FF298700
+FF29942A0000952B0000962C0000962C0000972D0000992F00009C3000009F
+300000A4310102AA2F0507AD2D0B0EAC271215A8221B1BA51F261EA620391D
+A71F4D1DA91F611DA91F741CA51E881CA21DA31A9E15DD1D8700FF2B8700FF
+2B8700FF2B8700FF2B8700FF2B8700FF2B8700FF2B8700FF2B8700FF2B8700
+FF2B8700FF2B8700FF2B952B0000962C0000972D0000972D0000982F00009A
+3000009D310000A0320000A5320102AB310507AF2F0B0DAE2A1214AA241A1B
+A721251FA821361EA9204B1EAB20601EAB21731DA720871CA41EA11BA017D9
+1E8800FF2E8700FF2D8700FF2D8700FF2D8700FF2D8700FF2D8700FF2D8700
+FF2D8700FF2D8700FF2D8700FF2D8700FF2D962C0000972D0000982E000099
+2F00009A3000009C3100009E330000A1340000A6340102AC340507B1320A0C
+B12D1113AD26181BAA23231FAA22341FAA21491FAD225E1FAE22721EAA2185
+1DA61F9F1CA219D51E8800FF318700FF2F8700FF2F8700FF2F8700FF2F8700
+FF2F8700FF2F8700FF2F8700FF2F8700FF2F8700FF2F8700FF2F982E000099
+2F0000992F00009A3000009B3100009D3300009F340000A2350000A7360102
+AE360406B335090CB5311012B12A181AAD26221EAC233120AC23461FAF235C
+20B124701FAD23841EA8209C1DA51CD01E8701FE348201FF338001FF347E01
+FF357E01FF357E01FF357E01FF357E01FF357E01FF357E01FF357E01FF357E
+01FF35992F00009A3000009B3100009B3200009C3300009D340000A0360000
+A3370000A8390101AF390405B638080BB8350F12B42E1719B029211EAF252E
+21AF254320B2255921B3266D20A62781219A2598219222C221730AF7386A05
+FF3D6805FF3E6505FF3F6505FF3F6505FF3F6505FF3F6505FF3F6505FF3F65
+05FF3F6505FF3F6505FF3F9B3100009B3200009C3200009C3300009C340000
+9E360000A0380000A43A0000A93B0101B13C0305B93C070ABC390E11B93316
+18B42D1F1EB2272B23AC273F22A12A5324972D6626902E7B27872C9226812A
+B9266214F23B4B00FF504900FF514800FF524800FF524800FF524800FF5248
+00FF524800FF524800FF524800FF524800FF529C3200009C3300009D340000
+9D3500009D3600009F380000A13A0000A53C0000AA3F0000B2400304BB4007
+09BF3D0D10BE381517B8311D1DA02C2526922E362888314B2A80335F2C7934
+732D74348B2C7032AF2B561EE53B2F00FF5D2D00FF5E2B00FF5E2B00FF5E2B
+00FF5E2B00FF5E2B00FF5E2B00FF5E2B00FF5E2B00FF5E2B00FF5E9D340000
+9D3500009E3600009E3600009F380000A03A0000A23C0000A63F0000AC4200
+00B4440204BD440609C4430C0FB74213159F3F1B1C8C3B24247F39312A7238
+42306A39573263396B335E3A83335B39A5314527DC3C1302FC681202FC6811
+04FC681104FC681104FC681104FC681104FC681104FC681104FC681104FC68
+1104FC689E3600009E3700009F3800009F380000A03A0000A13C0000A33F00
+00A7420000AC450000B4470203BE480507AF4D0A0E9C4E12148C4D1B1A7D4A
+23226F462D2A60423B3257414F36514265364E447E354D44A032473FDA3308
+15F7660816F6650817F6650817F6650817F6650817F6650817F6650817F665
+0817F6650817F6650817F6659F380000A0390000A03A0000A03B0000A13C00
+00A23F0000A4410000A8450000AD480000AF4C0102A251040795550A0C8957
+11127D5818187057201F62542A275251352F475146334652623243527B3143
+539B2E4152D22C052AFB5F052CFB5E062DFB5E062DFB5E062DFB5E062DFB5E
+062DFB5E062DFB5E062DFB5E062DFB5E062DFB5EA03B0000A13B0000A13C00
+00A23D0000A23E0000A3410000A5440000A8480000A44D0000965202028D57
+0507845C090B7C610F107164161564641D1D5562252442602C2A3560382D3B
+625B2C3B62762B3B6394293962C6270642FB520643FB520644FB510644FB51
+0644FB510644FB510644FB510644FB510644FB510644FB510644FB51A23D00
+00A23E0000A33E0000A33F0000A4410000A4440000A54700009C4C00008E50
+0000855602037E5C0406776307096F690D0E656E141458701B1B4A70212137
+6F27272B703228307252273272702632738C243174B723025BFE47025CFE47
+025CFE46025CFF46025CFF46025CFF46025CFF46025CFF46025CFF46025CFF
+46025CFF46A43F0000A4400000A5410000A5420000A5440000A5470000974A
+0000874D00007E52000177590202716203046B6A060863710A0C597811114D
+7C17183F7D1E1E317E26232A7F352328814C222A8269222A8384202985AA1F
+0676F83B0476FB3C0377FB3C0377FB3C0377FB3C0377FB3C0377FB3C0377FB
+3C0377FB3C0377FB3C0377FB3CA5420000A6430000A6440000A7450000A747
+000095490000834A0000784E0000715500006B5E0102666702035F70040557
+7907094E810C0E42861214368A1A1A2B8D241F258E321F2390481E2495631D
+25997D1C239A9D1B1195E7270A92F92D0A92F92C0A92F92C0A92F92C0A92F9
+2C0A92F92C0A92F92C0A92F92C0A92F92C0A92F92CA7460000A8470000A848
+0000A94900009649000082490000754B00006B51000065580000606100005B
+6B0101547602034D810506448B080A39920D102D981516239D1D1B21A42C1B
+1DA341191FAE5C1820B775181EB9901816B9CC1C10B7F12010B8F12010B8F1
+2010B8F12010B8F12010B8F12010B8F12010B8F12010B8F12010B8F120AA49
+0000AB4A0000AC4B0000974A000082480000734A0000684E0000615400005B
+5C000056650000507100004A7D0000438A01023C97040532A2080A28AD0F10
+1FBA17151BC724171AD33A1515DD511814E86A1812ED801A14EFA91710EED8
+1910EFD81810EFD81810EFD81810EFD81810EFD81810EFD81810EFD81810EF
+D81810EFD818AE4D0000AF4E0000984D0000824A000073490000674B00005E
+51000058580000526100004D6C000047790000418700003C96000036A60000
+2DB6030325CC09081EE5110E16FE1C1303FF271E00FF401D00FF5B1B00FF75
+1D02FF8E1D0DFFC0130DFFC0130DFFC1130DFFC1130DFFC1130DFFC1130DFF
+C1130DFFC1130DFFC1130DFFC113B25200009A500000824C0000734A000067
+4A00005D4E000056540000505C00004A650000447100003D7E0000378A0000
+319700002BA4000025B804041FD0090917EA120E0AFE191600FF2A1B00FF45
+1802FF5F1600FF781900FF8C1A09FFD21109FFD31109FFD31109FFD31109FF
+D31109FFD31109FFD31109FFD31109FFD31109FFD3119D530000814E000071
+4B0000654900005C4A0000544F00004E560000495E0000426800003B750000
+348000002E8B00002997000024A701011FBB040418D40A0910ED110F02FE18
+1800FF2F1701FF491401FF611200FF791503FF8F1308FFD60D05FFE30F05FF
+E30F05FFE30F05FFE30F05FFE30F05FFE30F05FFE30F05FFE30F05FFE30F81
+4E0000704A0000634900005A490000544A00004D5000004758000041620000
+3A6D0000337800002C820000278C0000229800001EAA010119BF040512D80A
+090CEF140D01FD1E1400FF341200FF4D1000FF630F00FF7A110BFF950808FF
+CE0900FFF50E00FFF50E00FFF50E00FFF50E00FFF50E00FFF50E00FFF50E00
+FFF50E00FFF50E6F4A00006249000059490000524900004C4B000046520000
+405B000039650000327000002B7B000026840000218E00001D9C000019AD01
+0213C305050EDA0C0809F0170A02FD240E04FF3B0B00FF500C00FF650B00FF
+7B0D08FF930609FFC70500FFFA0A00FFFA0A00FFFA0A00FFFA0A00FFFA0A00
+FFFA0A00FFFA0A00FFFA0A00FFFA0A6049000057490000504900004B4A0000
+464D00003F550000395F0000326A00002B740000257D0000208600001C9100
+00189F000013B002020EC5050508DB0C0806F21A0808FC2B0405FF400500FF
+540800FF680800FF7B0903FF93060AFFC00000FFFF0700FFFF0700FFFF0700
+FFFF0700FFFF0700FFFF0700FFFF0700FFFF0700FFFF07564900004F4A0000
+494B0000444C00003F50000038590000316300002B6D000025770000208000
+001B8900001794000013A200000EB3020308C6060505DD100505F41D0407FD
+2F0002FF420400FF560400FF6A0400FF7C0503FF920207FFB80000FFF80400
+FFFF0400FFFF0400FFFF0400FFFF0400FFFF0400FFFF0400FFFF0400FFFF04
+4D4A0000474B0000424D00003D4F000038530000315D00002A670000257100
+001F7A00001A820000168C0000129700000DA3000108B3020304C7080403DF
+130302F6200202FD310101FF450000FF590100FF6B0101FF7E0102FF900003
+FFAF0001FFE90100FFF10100FFF10100FFF10100FFF10100FFF10100FFF101
+00FFF10100FFF101454C0000404E00003B51000036530000315700002A6100
+00246A00001F7400001A7C000016850000118E00000D99000008A4010103B4
+030202CA0B0201E3170101F9220101FF340000FF4B0000FF5C0000FF6E0101
+FF800001FF8D0001FFA70000FFE10000FFE60000FFE60000FFE60000FFE600
+00FFE60000FFE60000FFE60000FFE600>
+<8A2000008B2100008B2100008C2200008C2200008E23000090230000922200
+0094210303971F0709991B0D0F9817131698161F1798172D1798163F169815
+51169815631698157515961488149613A2139812D6118500FF1A8300FF1983
+00FF198300FF198300FF198300FF198300FF198300FF198300FF198300FF19
+8300FF198300FF198B2100008B2100008C2200008C2200008D2300008E2300
+00902300009223000095210303981F07089A1C0D0E9817131698171E179817
+2C1799163E17991551179915631698167515971587159714A1139812D41285
+00FF1B8300FF1A8300FF1A8300FF1A8300FF1A8300FF1A8300FF1A8300FF1A
+8300FF1A8300FF1A8300FF1A8300FF1A8B2100008C2200008C2200008D2300
+008D2300008F240000912400009323000095220203992007089B1D0D0E9918
+131699171E1899172B1799173D17991650179A166217991674169815871597
+14A0149912D3128600FF1C8300FF1B8300FF1B8300FF1B8300FF1B8300FF1B
+8300FF1B8300FF1B8300FF1B8300FF1B8300FF1B8300FF1B8C2200008C2200
+008D2300008D2300008E2400008F2400009124000093240000962302039921
+06089C1E0D0E9A19121699181D1899182A189A173C179A164F179B1662179A
+177416981686159815A0149A13D2138600FF1D8400FF1B8400FF1B8400FF1B
+8400FF1B8400FF1B8400FF1B8400FF1B8400FF1B8400FF1B8400FF1B8400FF
+1B8C2200008D2300008D2300008E2400008E24000090250000922500009425
+0000972402039A2206089D1F0C0D9B1A12159B181D189A1829189B183B189B
+174E189B1761179B1773179917851698159E159A14D0138700FF1E8400FF1C
+8400FF1C8400FF1C8400FF1C8400FF1C8400FF1C8400FF1C8400FF1C8400FF
+1C8400FF1C8400FF1C8D2300008D2300008E2400008E2400008F2500009025
+00009326000095260000982502029B2306079E200C0D9D1B12159C191C189B
+1928199C193A189C184D189C1760189C1872179A17851699169D159B14CE14
+8700FF208400FF1D8400FF1E8400FF1E8400FF1E8400FF1E8400FF1E8400FF
+1E8400FF1E8400FF1E8400FF1E8400FF1E8D2300008E2400008F2400008F25
+000090250000912600009326000096270000992601029D2405079F220B0D9F
+1D11149D1A1B189C19271A9D1A39199D184C199E185F199E1971189C188417
+9A179C169C15CC148800FF218500FF1F8500FF1F8500FF1F8500FF1F8500FF
+1F8500FF1F8500FF1F8500FF1F8500FF1F8500FF1F8500FF1F8E2400008F25
+00008F25000090260000912600009227000094280000972800009A2801029E
+260506A1230B0CA01F11149F1B1A189D1A261A9E1B37199E194A199F195D19
+9F1A70189D1983189B189A179D16CA158800FF238500FF208500FF208500FF
+208500FF208500FF208500FF208500FF208500FF208500FF208500FF208500
+FF208F25000090250000902600009127000092270000932800009529000098
+2900009B2901019F270406A3250A0CA3211013A01D19199E1B241B9F1B351A
+A01A491AA01A5C1AA11B6F199F1A82189C1999179E17C8168900FF258500FF
+228500FF228500FF228500FF228500FF228500FF228500FF228500FF228500
+FF228500FF228500FF22902600009126000091270000922800009328000094
+290000962A0000992B00009C2B0101A1290406A527090BA5231012A21E1719
+A01C231CA11C331BA11C471BA21B5A1BA31C6E1AA01B81199D1A97189F18C5
+178900FF278600FF248600FF248600FF248600FF248600FF248600FF248600
+FF248600FF248600FF248600FF248600FF2491270000922800009328000093
+290000942A0000952B0000982C00009A2D00009E2D0101A22C0405A72A090B
+A8260F11A5201619A21D211CA21D311CA31D451BA41C591CA51D6C1BA21D7F
+1A9F1B9519A019C1188B01FD298600FF268600FF268600FF268600FF268600
+FF268600FF268600FF268600FF268600FF268600FF268600FF269328000093
+290000942A0000952B0000952B0000972D0000992E00009C2F00009F2F0101
+A42E0305A92C080AAB290E10A8221518A51F201CA41E2E1DA51E421CA61D57
+1CA81E6A1CA51E7D1BA21D931A9E1BBB198606F42A7C00FF2D7B00FF2E7800
+FF2F7600FF2F7600FF2F7600FF2F7600FF2F7600FF2F7600FF2F7600FF2F76
+00FF2F942A0000952B0000962C0000962C0000972D0000982E00009A300000
+9D310000A1310101A6310304AC300709AE2C0D10AB261417A8221E1CA6202B
+1EA720401DA81F541EA321671E9922791E90228E1F8A20AF1E7610E72D6301
+FF396001FF3A5F01FF3B5D01FF3C5D01FF3C5D01FF3C5D01FF3C5D01FF3C5D
+01FF3C5D01FF3C5D01FF3C962C0000972D0000972D0000982E0000992F0000
+9A3000009C3200009F330000A3340001A8340203AE330608B1300C0FB02A13
+16AC251C1CA92128209F233A2094244D228C266023852873247F2889247A26
+A8246B1DDE2B4900FF494700FF4A4500FF4B4400FF4B4400FF4B4400FF4B44
+00FF4B4400FF4B4400FF4B4400FF4B4400FF4B982E0000992F0000992F0000
+9A3000009B3100009C3200009D340000A0350000A4370000A9370203B03705
+08B5350B0EB5301215A82B1A1C93272224882931267E2B4527762B5829702D
+6B2A6C2F8229682EA0295C26CE2D2E01FE552C02FE552A02FD562902FD5629
+02FD562902FD562902FD562902FD562902FD562902FD562902FD569A300000
+9B3100009B3200009B3200009C3300009D3400009F360000A1380000A53A00
+00AB3B0102B23B0507B93A0A0DA73B11139338191A8234202275332C276830
+3B2D60314F2E59316330553279305232952F492BC0311403FA601405F95F13
+06F95F1307F85F1307F85F1307F85F1307F85F1307F85F1307F85F1307F85F
+1307F85F9B3200009C3300009C3300009D3400009D3500009E370000A03900
+00A33B0000A73D0000AD3F0101AE410406A045080C91461012824418187341
+1F1F653D27275639322F4D384533493A5C33453B7332433C8F303F39BB300C
+17F35C0C18F35C0C19F35B0C19F45B0C19F45B0C19F45B0C19F45B0C19F45B
+0C19F45B0C19F45B0C19F45B9D3400009D3500009E3600009E3600009E3700
+009F390000A13B0000A43E0000A9410000A2450101964A04068C4D080B804F
+0F10744F1616664E1C1D584B242447472C2D3E483C2F3A4A542E3C4B722E3A
+4B8D2C3B4BB8290C2CF7520B2CF8520B2DF8520B2EF8510B2EF8510B2EF851
+0B2EF8510B2EF8510B2EF8510B2EF8510B2EF8519E3700009F3700009F3800
+00A0390000A03A0000A13C0000A23E0000A5410000994600008D4A0102854F
+04057C53080A73570D0E685B14145B5A1A1B4C5920223A5727282B582E2A2D
+5B4A29345C6D28335C8826335BB0250F44F1410A41F8470A42F8460943F946
+0943F9460943F9460943F9460943F9460943F9460943F9460943F946A03900
+00A03A0000A13B0000A13C0000A23C0000A23F0000A3410000924500008648
+00007D4E0102765404056F5A060866600B0D5D6512125166181943671E1F30
+66232425682C26286A48242C6C67232C6C84222C6CA721135FEB310456FE3F
+0457FE3E0457FE3E0457FE3E0457FE3E0457FE3E0457FE3E0457FE3E0457FE
+3E0457FE3EA13C0000A23D0000A23E0000A33E0000A33F0000A34200008E44
+000080460000774B0000705201026A590304636105075B68090B516E0F1046
+72141639741B1C2B75232124772E2122794420257B6220267C7D1E267D9D1D
+1678DF260570FD340570FD340571FD340571FD340571FD340571FD340571FD
+340571FD340571FD340571FD34A33F0000A4400000A5410000A5420000A543
+00008C4300007D440000724800006A4E0000645501015E5E02035867040550
+70070847770B0D3C7D1113308018192684221D21862F1D1F88431C208A5C1B
+228E771A218E9419198CC81D0485FD2B0485FD2A0586FD2A0586FD2A0586FD
+2A0586FD2A0586FD2A0586FD2A0586FD2A0586FD2AA6430000A6440000A744
+0000A74500008C4400007B4300006F460000654B00005F520000595A000054
+6301014E6D0203467804053D81070A32870C10288C13161F911C1A1D972A19
+1A983D171B9E57161DA670161CA78A161AA7B5160DA4FA1E0CA4FA1E0CA5FA
+1E0CA5FA1E0CA5FA1E0CA5FA1E0CA5FA1E0CA5FA1E0CA5FA1E0CA5FA1EA846
+0000A8480000A94900008B4600007B4400006D450000624800005B4E000055
+560000505E00004A680000437400013C800102348A04062B93080B229C0E11
+1BA6161517B0231516B8371317BF501218CC691216D17F1214D2A2130CD1EF
+170CD2EF170CD2EF170CD2EF170CD2EF170CD2EF170CD2EF170CD2EF170CD2
+EF170CD2EF17AB4B0000AC4C00008B490000794600006C4500006147000059
+4C0000535200004D5B000048640000417100003A7D0000348900002D950102
+27A4040520B6080918CB0F0F13E11B110FF52B1205FB3F1703FF581601FF71
+1900FF891B08FFD81208FFDB1208FFDC1208FFDC1208FFDC1208FFDC1208FF
+DC1208FFDC1208FFDC1208FFDC12B04F00008B4C0000784900006A47000060
+470000584A0000515000004B580000456200003E6D00003779000031840000
+2B900000269D000021AF02021CC6060614E00D0B08F5141300FF231700FF3E
+1501FF571100FF701400FF88150AFFCC0B04FFE60F04FFE60F04FFE60F04FF
+E60F04FFE60F04FFE60F04FFE60F04FFE60F04FFE60F8C4F0000774B000069
+4900005E49000056490000504C00004A530000445C00003D66000036710000
+2F7C00002986000024910000209F00011BB2020316CA06060FE20F0A06F519
+1000FF281300FF421000FF5A0E00FF720F07FF8E0B0AFFC50600FFF60D00FF
+F60D00FFF60D00FFF60D00FFF60D00FFF60D00FFF60D00FFF60D00FFF60D76
+4B0000674900005C490000544900004E4A0000494E0000435600003C5F0000
+356A00002E750000287F0000238800001E9400001AA3010115B6030310CE06
+070AE4100904F61D0D04FF2F0A01FF470B00FF5D0A00FF740C05FF8C090BFF
+BF0200FFFB0A00FFFC0900FFFC0900FFFC0900FFFC0900FFFC0900FFFC0900
+FFFC0900FFFC09664900005A490000524900004C4A0000474B000042500000
+3C590000356400002D6E000027780000228100001D8B00001997000015A601
+0110B903030ACF070607E5130707F7230509FF370101FF4A0700FF600700FF
+740702FF8C0709FFB90000FFFF0600FFFF0600FFFF0600FFFF0600FFFF0600
+FFFF0600FFFF0600FFFF0600FFFF0659490000514900004B4A0000454C0000
+414E00003B540000345E00002D68000027720000217B00001D840000188E00
+00149A00000FA801010ABA030305D0090504E7170405F9260205FF390100FF
+4D0300FF620300FF760402FF8B0305FFB10001FFEE0300FFFF0300FFFF0300
+FFFF0300FFFF0300FFFF0300FFFF0300FFFF0300FFFF034F490000494B0000
+434D00003E4F00003A510000345800002D620000276B0000217500001C7D00
+0017860000139100000F9C00000AA9010205BB040303D20D0302E9190202FA
+270102FF3C0000FF510100FF640100FF780102FF8B0003FFA90001FFE10100
+FFFF0100FFFF0100FFFF0100FFFF0100FFFF0100FFFF0100FFFF0100FFFF01
+474B0000414E00003C50000037530000325500002D5C000027660000216F00
+001C77000017800000128900000E930000099D000105AA020102BE070201D7
+110101EE1D0101FE2A0001FF420000FF540000FF670000FF7A0000FF8A0001
+FFA20000FFDB0000FFFE0000FFFE0000FFFE0000FFFE0000FFFE0000FFFE00
+00FFFE0000FFFE003F4E00003A51000034540000305700002B5A0000266000
+00216900001B720000167A0000128200000D8B000009940000049D010101AB
+040100C30A0000DB150000F11F0000FF2C0000FF440000FF550000FF660000
+FF790000FF870000FF990000FFC60000FFEF0000FFEF0000FFEF0000FFEF00
+00FFEF0000FFEF0000FFEF0000FFEF00>
+<861C0000871D0000871D0000871D0000881E0000881E0000891E00008B1D00
+008D1B02038F19070791160C0D9112131392121E1391122A1391123A139111
+4C1391105E1291106F1290108211900F9910920EC10E8802F8158400FF1384
+00FF148400FF148400FF148400FF148400FF148400FF148400FF148400FF14
+8400FF148400FF14861D0000871D0000871D0000871E0000881E0000881F00
+008A1E00008B1D00008D1C0202901A060791170C0D9112121492131E149213
+291492123A1492114C1392115E1391116F129110811191109810920EC00E89
+02F7158400FF148400FF148400FF148400FF148400FF148400FF148400FF14
+8400FF148400FF148400FF148400FF14871D0000871D0000871E0000881E00
+00881F0000891F00008A1F00008C1E00008E1D0202901A060792170C0D9213
+111493131D14921328149213391492114B1492115D1392116E129111801292
+109710930FBE0F8903F6168400FF158400FF158400FF158400FF158400FF15
+8400FF158400FF158400FF158400FF158400FF158400FF15871D0000871E00
+00881E0000881F0000891F0000891F00008B1F00008C1F00008E1D0202911B
+060793180B0C9314111394141C14931328159313381493124A1493125D1493
+126E139211801292119611930FBC0F8903F4168400FF158400FF158400FF15
+8400FF158400FF158400FF158400FF158400FF158400FF158400FF158400FF
+15881E0000881E0000891F0000891F0000892000008A2000008B2000008D1F
+00008F1E0202921C0506941A0B0C9415111395141B15941427159414371594
+13491594125C1494126D1393127F13931195119410BB108A04F3178300FF16
+8300FF168300FF168300FF168300FF168300FF168300FF168300FF168300FF
+168300FF168300FF16881E0000891F0000891F00008A2000008A2000008B21
+00008C2100008E200000901F0102931D0506951B0B0C9516101395151A1595
+152616951536159513481595135B1595136C1494137E13941294129511B811
+8B05F1178300FF178300FF178300FF178300FF178300FF178300FF178300FF
+178300FF178300FF178300FF178300FF17891F0000892000008A2000008A20
+00008B2100008B2100008D2100008F21000091200101941F0405971C0A0B96
+1710129616191596152516961535169614471696145A1596146B1595147D14
+951393139511B6118D07EF178300FF188300FF188300FF188300FF188300FF
+188300FF188300FF188300FF188300FF188300FF188300FF188A2000008A20
+00008B2100008B2100008C2200008C2200008E220000902200009222010195
+200405981D0A0B981910129716181697162417971634169815461698155916
+97156A1597157D14961492149612B4128E08ED178300FF198300FF198300FF
+198300FF198300FF198300FF198300FF198300FF198300FF198300FF198300
+FF198B2100008B2100008C2200008C2200008D2300008D2300008F23000091
+2300009323000196210405991F090A9A1B0F11991717179817221899173217
+99164417991557179916691698167B15971590149713B213900AEB188300FF
+1A8300FF1A8300FF1A8300FF1A8300FF1A8300FF1A8300FF1A8300FF1A8300
+FF1A8300FF1A8300FF1A8B2100008C2200008D2300008D2300008E2400008E
+240000902400009225000094240001982303049B20080A9C1D0E109A181517
+9A1821189A1830189A1742189B1755189B1768179A177A1698168F159914B0
+14910AE9198400FF1C8400FF1C8400FF1C8400FF1C8400FF1C8400FF1C8400
+FF1C8400FF1C8400FF1C8400FF1C8400FF1C8D2200008D2300008E2400008E
+2400008F25000090250000912600009426000096260001992503049D220809
+9F1F0E0F9D1A14179C191F199C192D199C1940189D1854189D1867189C1879
+179A178D169A16AD15930BE71A8400FF1E8400FF1E8400FF1E8400FF1E8300
+FF1F8300FF1F8300FF1F8300FF1F8300FF1F8300FF1F8300FF1F8E2400008E
+2400008F250000902500009026000091270000932700009528000098280001
+9B2702039F250708A2220D0EA01D13169E1B1E199D1A2B1A9E1A3E199F1952
+19A01965199E1A77189A198B189318A7178A11DD1C7600FF277400FF287100
+FF297000FF296F00FF2A6F00FF2A6F00FF2A6F00FF2A6F00FF2A6F00FF2A6F
+00FF2A8F250000902600009126000091270000922800009228000094290000
+972A0000992A00009D2A0203A2280608A4250C0EA3201215A11D1C199F1C28
+1BA01C3B1AA01B4F1B961D611C8E1F721C881F851C821DA01C7A18D0205D00
+FF345B00FF355900FF365800FF365700FF375700FF375700FF375700FF3757
+00FF375700FF375700FF379126000092270000922800009329000094290000
+942A0000962B0000982C00009B2D00009F2D0102A42B0507A8280B0DA72311
+14A41F1A1AA01D251D931F351E8A20471F82215A217C226C22762380217222
+9A226C1FC6224601FF414401FE424301FE424201FE434102FE434102FE4341
+02FE434102FE434102FE434102FE434102FE439328000093290000942A0000
+952B0000962C0000962C0000982E00009A2F00009E300000A2300102A72F04
+06AB2C0A0CAC2810139B25171A88211F217E232C2475253E246C2451266626
+6427622879275F2892265B26B826350AF7442B03FC4C2904FC4D2804FC4D28
+04FB4D2804FB4D2804FB4D2804FB4D2804FB4D2804FB4D2804FB4D952B0000
+962B0000962C0000972D0000982E0000992F00009A3000009D320000A03300
+00A4330101AA330405A933080B99330E1189311618792D1D206C2C27255E29
+332A572A472B512B5C2D4D2C702D492B882D462AAC2B2211EC461508F65615
+09F655150AF555150BF555150BF555150BF555150BF555150BF555150BF555
+150BF555972D0000982E0000992F00009A3000009A3100009B3100009C3300
+009E340000A1360000A63701019F3A0305933C070A863D0D10793C14166A39
+1B1D5C3623244D322C2C45323D2F4234552F3E356B2F3B35832E3B36A62B1F
+22E33E111AF24F111BF24F111CF34E111CF34E111CF34E111CF34E111CF34E
+111CF34E111CF34E111CF34E9A3000009B3100009B3200009C3200009C3300
+009C3400009D350000A0370000A3390000963D00018B4103058244070A7745
+0D0E6A4613145D45191B4F4320223F3F272A3640352C2E43452B3644692B32
+43822A3445A426263CE22E0F2CF5460F2DF5450F2EF5450F2EF5450F2EF545
+0F2EF5450F2EF5450F2EF5450F2EF5450F2EF5459C3300009C3300009D3400
+009D3500009D3600009E3600009F3800009F3B00008F3E0000844201017C46
+0305744B07086A4E0B0D5F5111125351171943501D20324F232626502A2723
+553B262E5665252D557F242D559F222650DB250E40F63C0E41F63B0D42F63B
+0D42F63B0D42F63B0D42F63B0D42F63B0D42F63B0D42F63B0D42F63B9D3500
+009E3600009E3700009F3800009F390000A03900009B3C00008A3E00007E41
+0000764601026E4C0304675106075E560A0B555B0F11495D15173B5E1B1D2B
+5D2123226029231F643A2226655F2127657B202765991F2765D21D0854FA35
+0855FA340856FA340856FA340856FA340856FA340856FA340856FA340856FA
+340856FA349F380000A0390000A03A0000A13B0000A13C0000993C0000863D
+0000794000006F440000684A0101625102035B580506535F080A4A650C0F40
+691215336B191A266C201F1F6F2A1F1D713D1E20745A1D2275741C2275921B
+2277C51A066AFE2D066BFE2D066BFE2C066BFD2C066BFD2C066BFD2C066BFD
+2C066BFD2C066BFD2C066BFD2CA13C0000A23D0000A23D0000A33E0000983F
+0000843D0000763F00006B420000634700005D4E010157560202515E030449
+660607406E090C36740F122A771617227A1F1B1D7D2B1B1B803D1A1C825519
+1E856F181E868A171C85B317077FFC24077FFC240780FC230780FC230780FC
+230780FC230780FC230780FC230780FC230780FC23A33F0000A4400000A541
+000098410000833F0000743E0000684100005F450000594B0000535300004E
+5B0101476402023F6E04053777070A2D7D0C0F238213151C871B18198D2817
+178F3A161893521419986B13199A83131799A5131498FE141499FE131599FD
+121599FD121599FD121599FD121599FD121599FD121599FD121599FD12A643
+0000A6440000984400008142000072400000674000005D4400005649000050
+5000004B580000456100003E6C0001367702032E8004072688080C1E900E11
+1798161414A0221313A7341113AB4D1014B3641014B87B1013B999100AB7E6
+1508B8F81608B8F81608B8F81608B8F81608B8F81608B8F81608B8F81608B8
+F81608B8F816A9480000994800008045000070430000644200005C42000054
+4700004E4E000048560000435F00003C6A0000347500002D800101278A0203
+219605071AA3090C14B2100F10C21B0F0FD02B0E0DDA430D0DE55B0D0CEC72
+0E0BEF8B1009EFCC0F05EDF11005EDF11005EDF11005EDF11005EDF11005ED
+F11005EDF11005EDF11005EDF1109B4B0000804800006F4500006245000059
+450000534600004C4C000047540000415D00003A690000327500002C7F0000
+268A0000229600001DA7010118BC040412D509090CED140B02FC1F1200FF35
+1100FF500E00FF680E02FF850E0DFFB90400FFF70D00FFF70D00FFF70D00FF
+F70D00FFF70D00FFF70D00FFF70D00FFF70D00FFF70D804B00006D48000060
+48000057480000514900004C4A0000465100003F5A000039640000316F0000
+2A79000025820000208D00001C9A000017AB010212BF04050CD70A0809EF17
+0904FC250B04FF3D0800FF530A00FF6B0A00FF840C0DFFB60000FFFC0900FF
+FD0900FFFD0900FFFD0900FFFD0900FFFD0900FFFD0900FFFD0900FFFD096C
+4A00005F490000554900004F4A0000494B0000454C00003E540000385E0000
+306800002A730000247C00001F8500001B900000179D000012AE01020CC204
+0507D90B0706F11A0609FC2D0104FF410400FF560600FF6D0600FF840709FF
+B00000FFFC0500FFFF0500FFFF0500FFFF0500FFFF0500FFFF0500FFFF0500
+FFFF0500FFFF055D490000544900004D4A0000474B0000424D00003E4F0000
+3758000030620000296C0000247600001E7F00001A8800001593000011A000
+000CAF020207C2050404DB0F0404F21D0405FC2F0101FF430200FF590300FF
+6E0302FF850205FFAA0002FFE80200FFFF0200FFFF0200FFFF0200FFFF0200
+FFFF0200FFFF0200FFFF0200FFFF02524900004B4A0000454C0000404E0000
+3B50000036530000305C000029660000237000001E79000019810000158B00
+00109500000CA1000107B0020203C3080302DD130202F5200202FE310001FF
+480000FF5C0100FF710102FF860002FFA20001FFDE0000FFFF0100FFFF0100
+FFFF0100FFFF0100FFFF0100FFFF0100FFFF0100FFFF01494B0000434D0000
+3D4F000038520000335500002F57000029600000236A00001E730000197B00
+00148400000F8D00000B97000006A2010102B1040201C90C0101E3170100F8
+230100FF360000FF4D0000FF5F0000FF730000FF850000FF9C0000FFD70000
+FFFF0000FFFF0000FFFF0000FFFF0000FFFF0000FFFF0000FFFF0000FFFF00
+414E00003B50000036540000315600002C590000285C0000236400001D6D00
+0018750000137D00000F8600000A8E00000597000102A3030000B5080000CD
+0F0000E6190000F9240000FF370000FF4D0000FF5D0000FF710000FF820000
+FF930000FFBF0000FFF40000FFFF0000FFFF0000FFFF0000FFFF0000FFFF00
+00FFFF0000FFFF0039510000335500002E580000295B0000265D0000235F00
+001D67000018700000137700000E7F000009870000068E00000297000101A2
+030000B4070000CC0E0000E5180000F8230000FF350000FF4B0000FF5C0000
+FF6E0000FF800000FF8E0000FFAD0000FFE50000FFFB0000FFFB0000FFFB00
+00FFFB0000FFFB0000FFFB0000FFFB00>
+<83180000841800008419000084190000841A0000851A0000851A0000851800
+00861602028714050689110B0B8A0E12108B0F1D108B0E28108B0E37108B0D
+48108A0C590F8A0C6A0E8A0B7B0D8B0B900C8C0AAF0B8C07E20B8400FF0E84
+00FF0E8400FF0E8400FF0E8400FF0E8400FF0E8400FF0E8400FF0E8400FF0E
+8400FF0E8400FF0E841800008419000084190000841A0000851A0000851A00
+00861A000086190000861701018815050689120B0B8A0E11118C0F1D108C0F
+27108C0E36108B0D47108B0C590F8B0C690E8B0C7B0D8B0B8F0C8D0AAF0B8C
+08E20B8400FF0E8400FF0E8400FF0E8400FF0E8400FF0E8400FF0E8400FF0E
+8400FF0E8400FF0E8400FF0E8400FF0E8419000084190000841A0000851A00
+00851A0000851B0000861B00008619000087180101891505068A130B0B8B0F
+11118D0F1C118C0F27118C0E35118C0E46108C0D58108B0D690F8B0C7A0E8C
+0C8F0D8D0BAE0B8D08E20B8400FF0F8400FF0F8400FF0F8400FF0F8400FF0F
+8400FF0F8400FF0F8400FF0F8400FF0F8400FF0F8400FF0F84190000851A00
+00851A0000851B0000851B0000861B0000861B0000871A0000881801018916
+05058B130A0B8C0F10118E101B118D1026118D0F34118D0E46118C0D57108C
+0D680F8C0D7A0E8D0C8E0D8E0BAD0C8E09E10C8400FF108400FF108400FF10
+8400FF108400FF108400FF108400FF108400FF108400FF108400FF108400FF
+10851A0000851A0000851B0000851B0000861C0000861C0000871C0000871B
+0000881901018A1705058C140A0A8D100F118F101A128E1025118E1033118E
+0F45118D0E56118D0E67108D0D790F8E0D8D0E8E0CAB0D8E09E00C8400FF10
+8400FF108400FF108400FF118400FF118400FF118400FF118400FF118400FF
+118400FF118400FF11851A0000851B0000861B0000861C0000861C0000861C
+0000871C0000881C0000891A01018C1804058E15090A8E110F118F1119128F
+1124128F1032128F0F44128E0F56128E0E67118E0E78108E0E8C0F8F0DAA0D
+900BDF0D8400FF118400FF118400FF118400FF118400FF118400FF118400FF
+118400FF118400FF118400FF118400FF11851B0000861C0000861C0000861C
+0000871D0000871D0000881D0000891C00008A1B01018D1A04048F17090A8F
+130F1090121813901223139011311390104313900F54128F0F66118F0F7710
+8F0F8B0F900EA80E910CDD0D8400FF128400FF128400FF128400FF128400FF
+128400FF128400FF128400FF128400FF128400FF128400FF12861C0000861C
+0000871D0000871D0000871E0000881E0000881E00008A1D00008B1D00008E
+1B04049018080991140E109112171391122214911230139111411391105313
+911065129110761190108A10910FA60F930DDB0D8400FF138400FF138400FF
+148400FF148400FF148400FF148400FF148400FF148400FF148400FF148400
+FF14871D0000871D0000871E0000881E0000881E0000891F0000891F00008B
+1F00008C1E00008F1C0303911A080993160E0F931315149313211492132E14
+93124014921152149211631392117512911188119210A410940ED90E8400FF
+158400FF158400FF158400FF158400FF158400FF158400FF158400FF158400
+FF158400FF158400FF15871E0000881E0000881E0000891F0000891F00008A
+2000008B2000008C2000008E1F0000901E0303931B070894180D0E94141414
+94141F1594142C1594133E15941250149412621494127413931287129311A2
+11950FD60F8400FF168300FF168300FF168300FF168300FF168300FF168300
+FF168300FF168300FF168300FF168300FF16881E0000891F0000891F00008A
+2000008A2000008B2100008C2100008D2100008F200000921F0203941D0608
+971A0C0D9515121596151E1696152A1696153C1596144E1596136115951473
+14941386139412A0129610D3108500FF188000FF187E00FF197D00FF1A7C00
+FF1B7B00FF1B7B00FF1B7B00FF1B7B00FF1B7B00FF1B7B00FF1B892000008A
+2000008B2100008B2100008C2200008C2200008D2200008F22000091220000
+93210202961F0507991D0C0D9817111498161C179716281798163A1698154D
+1698155F16971571158F1683158A169A158815C6147404FB216D00FF236B00
+FF236A00FF246800FF246800FF246800FF246800FF246800FF246800FF2468
+00FF248B2100008B2100008C2200008D2200008D2300008E2300008F240000
+902400009324000095230102992105069B1F0B0C9B1A11139A181A17991726
+189A183717941749188B185A1A851B6C197F1B7E1A7B1A951A7819BC19690F
+F8215700FF2E5600FF2F5400FF305300FF305300FF315300FF315300FF3153
+00FF315300FF315300FF318C2200008D2300008E2300008E2400008F240000
+8F250000902500009226000095260000972601019B2404059E220A0B9E1E10
+129D1A18189419221B8A1B301C811C411D781C531E721D651F6D1E771F6A1E
+8F1F671EB21E5B17EF234505FB374305FB384205FA384106FA384006FA3840
+06FA384006FA384006FA384006FA384006FA388E2400008F2400008F250000
+902600009126000091270000922800009428000097290000992901019D2703
+05A125080AA0220F118F2115187E1D1C1F751E27216C20382263204A225E21
+5D245A227024572387235422A6235020E2222E09F63F2C09F63F2B09F6402A
+09F5402A09F5402A09F5402A09F5402A09F5402A09F5402A09F54090260000
+9126000091270000922800009328000093290000942A0000962B0000992C00
+009C2C0001A02B03049A2C07098D2D0D0F7F2A13166F271A1D622623225523
+2C274F243F284A26542A4627682A41267E2A3E259A293D24D026190CF34819
+0DF348190EF247190FF247190FF247190FF247190FF247190FF247190FF247
+190FF2479228000093290000942A0000952A0000952B0000962C0000972D00
+00992E00009B2F00009F30000092320203883406097D350C0E703412146132
+181B532F1F22442B26293D2B362C3A2E4C2C3830632B35307A2B322F952932
+2FC926151CF142151DF142151DF141151EF041151EF041151EF041151EF041
+151EF041151EF041151EF041952B0000962C0000972C0000972D0000982E00
+00992F00009A3000009C320000993300008B35000081380204783B06096D3C
+0B0D613D1012553D1619483C1D20393824272F392F292A3C41282F3F60272E
+3F79272D3F95242C3EC422122CF03B122DF03B122DF03A122EF03A122EF03A
+122EF03A122EF03A122EF03A122EF03A122EF03A982E0000992F00009A3000
+009B3100009B3100009B3200009C33000094350000863700007B3A0001733E
+02046A41050861450A0C56470F114B4914173D481A1E2E4721232449292420
+4D372326505A2329507721274F9120274DBD1F113FF1321040F1321040F131
+1041F2311041F2311041F2311041F2311041F2311041F2311041F2319B3100
+009B3200009C3300009C3400009D3400009D3500009035000081370000763A
+00006D3E0101664302035E480506564D080A4D520D0F425412153455181B26
+551F201E5827201C5C361F205F551E2360731E225F8D1D225EB71B0D52F52B
+0D53F52B0D53F52B0D54F52A0D54F52A0D54F52A0D54F52A0D54F52A0D54F5
+2A0D54F52A9D3400009D3500009E3600009E3700009F3800008E3700007E37
+0000723A0000683E0000604201015A480203544F04054C550709445C0B0D39
+6010132D62171922631E1D1C67281C1A6A3A1C1B6D521B1E6E6D1A1E6F8719
+1E6FAE170966F8250966F8250966F7250967F7250967F7250967F7250967F7
+250967F7250967F7250967F7259F3800009F390000A03A0000A03B00008D3A
+00007C3900006F390000653D00005C41000056470000504E01024B56030343
+5E05073A65080B306A0E11266E15161E721D191975291817783A18187B4F17
+1A7D67161A7E8214197DA2140979E71E0679FB200679FB200679FB200679FB
+200679FB200679FB200679FB200679FB200679FB20A13C0000A23D0000A23D
+00008C3D00007A3B00006D3B0000623C000059400000534500004D4C000048
+540001415C02023A660305316E060927740B0F1F791213197E1A1616832715
+1486381414894D12168D6411158F7C11148E9811198FD70A168FFD0C168FFD
+0C1690FD0B1690FD0B1690FD0B1690FD0B1690FD0B1690FD0B1690FD0BA440
+0000A44100008B400000783E00006A3D0000603D0000573F0000514400004B
+4A0000455200003F5B000038650001306F020329770507217E080C1A850E11
+148C16131193221110983310109D490E11A2600D11A6750D0FA68F0D0DA5C3
+0E0DA5F90F0DA5F90F0DA6F90F0DA6F90F0DA6F90F0DA6F90F0DA6F90F0DA6
+F90F0DA6F90FA74400008B43000076400000684000005D400000554100004F
+43000049490000445100003E5A0000376400002F6E00002978010122810304
+1C8A06081594090D109F100F0DAB1C0D0CB52B0C0BBD410A0CC458090CCB6E
+090BCE880A0BCFB50A06CEF80C06CEF80C06CEF80C06CFF80C06CFF80C06CF
+F80C06CFF80C06CFF80C06CFF80C8B47000075430000664200005B43000053
+4300004D45000048480000424F00003C590000356300002E6E000028780000
+228200001D8D0101199A020313AB04060DBF080909D5130906EA200A04FA32
+0A00FF4B0B00FF630A00FF7C0B0AFFA90300FEFD0900FEFD0900FFFD0800FF
+FE0800FFFE0800FFFE0800FFFE0800FFFE0800FFFE08744600006445000059
+460000514700004B480000464A0000414F00003B580000346200002D6D0000
+27770000218000001D8900001895000014A300000FB6020309CC070606E313
+0607F6230407FF380100FF4D0600FF640600FF7C0707FFA40100FFFA0500FF
+FF0500FFFF0500FFFF0500FFFF0500FFFF0500FFFF0500FFFF0500FFFF0563
+4900005849000050490000494B0000444C00003F4E00003A530000335C0000
+2C66000026700000217A00001C830000178D0000139800000EA6010109B703
+0305CD090504E5160404F9250103FF390100FF500200FF660201FF7E0204FF
+A00002FFE60100FFFF0200FFFF0200FFFF0200FFFF0200FFFF0200FFFF0200
+FFFF0200FFFF02564900004E4A0000474B0000424D00003D50000038520000
+335700002C610000266A0000207400001B7C000016850000128F00000E9A00
+0009A7010103B7040302CF0D0202E8190201FB270101FF3E0000FF540100FF
+690101FF800002FF990001FFDE0000FFFF0100FFFF0100FFFF0100FFFF0100
+FFFF0100FFFF0100FFFF0100FFFF014C4A0000454C00003F4E00003A510000
+35540000305700002C5B000025650000206E00001B760000167F0000118800
+000D910000089B000104A8020101BC070101D5110100ED1D0000FF2A0000FF
+440000FF570000FF6B0000FF800000FF930000FFD30000FFFF0000FFFF0000
+FFFF0000FFFF0000FFFF0000FFFF0000FFFF0000FFFF00444C00003D4F0000
+37530000325600002D580000295B0000255F0000206800001A710000157900
+00108100000C89000007920000029B010100A8040000BF0A0000D7130000EE
+1E0000FF2A0000FF430000FF550000FF680000FF7D0000FF8E0000FFBB0000
+FFF30000FFFF0000FFFF0000FFFF0000FFFF0000FFFF0000FFFF0000FFFF00
+3B500000355400002F5700002A5A0000265D0000235F0000206300001A6B00
+0015730000107B00000B820000088A000005920000019B010100A8040000BE
+0A0000D5130000ED1D0000FF290000FF410000FF540000FF660000FF7B0000
+FF8A0000FFAB0000FFE40000FFFF0000FFFF0000FFFF0000FFFF0000FFFF00
+00FFFF0000FFFF00335500002D590000285C0000245F0000206100001D6200
+001A650000156D0000117400000E7B00000B8200000889000005910000029B
+010100A7040000BD090000D4120000EC1C0000FF270000FF3F0000FF520000
+FF630000FF770000FF870000FF9E0000FFD50000FFFF0000FFFF0000FFFF00
+00FFFF0000FFFF0000FFFF0000FFFF00>
+<7F140000801400008014000081150000811500008116000082160000811400
+0080120101800F0405810C0A09820A120C840B1C0C850B260C850A330D8509
+440C8508540B8508640A850775098507870886069F078705C7068501FD0784
+00FF088400FF088400FF088400FF088400FF088400FF088400FF088400FF08
+8400FF088400FF088014000080140000811500008115000082160000821600
+0082170000821500008113010181100404820D0909830B110D850B1B0D850B
+250D860A320D8609430D8509540C8508640B8508740A8608870986079F0788
+06C6068501FD088400FF098400FF098400FF098400FF098400FF098400FF09
+8400FF098400FF098400FF098400FF09801500008115000081160000821600
+00821600008217000083170000821500008213010182110404830E0909830B
+100D860C1B0D860B250D860B320D860A420D8609530C8609630B8608740A86
+08860987079F088806C6078601FD098400FF098400FF098400FF098400FF0A
+8400FF0A8400FF0A8400FF0A8400FF0A8400FF0A8400FF0A81150000811600
+00821600008217000082170000831700008318000083160000821401018312
+0304840F0809840C0F0E870C1A0E870C240E870B310E870B410E870A520D87
+09630C8709730B8709860A88089E098907C5078602FC098400FF0A8400FF0A
+8400FF0A8400FF0A8400FF0A8400FF0A8400FF0A8400FF0A8400FF0A8400FF
+0A821600008216000082170000831700008317000083180000831800008317
+0000831501018413030485100809850D0F0E870D190E880D230E880C300E88
+0B400E880A510E870A620C870A730C8809850A89099D098A07C5088601FD0B
+8400FF0B8400FF0B8400FF0B8400FF0B8400FF0B8400FF0B8400FF0B8400FF
+0B8400FF0B8400FF0B82170000821700008317000083180000831800008418
+00008419000084180000841600008514030386110809860E0E0E880D180F89
+0D220F890D2F0F890C3F0F890B500E880B610D880A720C890A840B8A099C0A
+8B08C4098601FD0C8400FF0C8400FF0C8400FF0C8400FF0C8400FF0C8400FF
+0C8400FF0C8400FF0C8400FF0C8400FF0C8317000083180000831800008418
+00008419000084190000841A00008519000085170000861503038712070888
+0F0E0D890E17108B0E210F8A0E2D0F8A0D3E0F8A0C4F0F890B600E890B710D
+8A0B830C8B0A9C0B8C09C3098601FE0E8400FF0D8400FF0D8400FF0D8400FF
+0D8400FF0D8400FF0D8400FF0D8400FF0D8400FF0D8400FF0D831800008418
+00008419000084190000841A0000851A0000851A0000851A00008618000087
+1603038813070889100D0D8B0E16108C0F20108B0E2C108B0D3D108B0D4E10
+8B0C5F0F8A0C700E8B0B830D8C0B9B0C8D0AC20A8600FE0F8400FF0E8400FF
+0E8400FF0E8400FF0E8400FF0E8400FF0E8400FF0E8400FF0E8400FF0E8400
+FF0E8419000084190000841A0000851A0000851B0000851B0000861B000086
+1B000087190000881702028A1507078B120C0D8C0F14118E101F118D0F2B11
+8D0E3B118C0D4D118C0D5E108C0D6F0F8C0C820E8D0C9A0D8E0BC10B8700FE
+118400FF0F8400FF0F8400FF0F8400FF0F8400FF0F8400FF0F8400FF0F8400
+FF0F8400FF0F8400FF0F841A0000851A0000851B0000851B0000861B000086
+1C0000861C0000871C0000881B0000891902028B1706078D130C0D8E101312
+8F111E128E1029128E0F39128E0F4B118E0E5D118D0E6E108D0D800F8E0D98
+0E8F0CBF0C8801FA128400FF118400FF118400FF118400FF118400FF118400
+FF118400FF118400FF118400FF118400FF11851B0000861B0000861C000086
+1C0000861C0000871D0000871D0000881D0000891C00008B1B02028D180606
+8F150B0C8F11111391121C129011271390113713901049128F0F5B128F0F6D
+118F0F7F108F0E960F900DBC0E8303F5147B00FF157900FF167800FF177600
+FF177500FF177500FF177500FF177500FF177500FF177500FF17861C000086
+1C0000871D0000871D0000871E0000881E0000881E0000891E00008B1E0000
+8C1C01018F1B050591180A0B9113101293131A139213261492123513921147
+1391115A138C126A1387137B13831390138013B112770BE9186800FF1F6600
+FF1F6400FF206300FF206200FF216200FF216200FF216200FF216200FF2162
+00FF21871D0000871E0000881E0000881E0000891F0000891F00008A200000
+8B2000008C1F00008E1F0101911D0405931A090A94160F1194141814941424
+15941433148A144316821554177C1664177717761773178A177117AA176D16
+E0175401FE285301FD295201FD295102FC295002FC295002FC295002FC2950
+02FC295002FC295002FC29881E0000891F0000891F00008A2000008A200000
+8B2100008B2100008D2100008E21000090210001931F0304961D080997190E
+10961616158A161F1980182C1A79183C1B70194C1B6A195E1C641A6F1C621B
+841C5F1BA11C5D1BD31B4508F72D4309F62D4209F62D4109F52D410AF52D41
+0AF52D410AF52D410AF52D410AF52D410AF52D8A2000008A2000008B210000
+8B2100008C2200008D2200008D2300008F2300009023000092230001952203
+03981F0708931E0D0F851C13167419191C6B1A241F621B321F5C1C4320561D
+5621521E68214F1E7D214B1E97214A1EC21F310EF031300EF0322F0EF0322E
+0EF0322D0FF0322D0FF0322D0FF0322D0FF0322D0FF0322D0FF0328C220000
+8C2200008D2300008D2300008E2400008F2400008F25000091250000932600
+0095260000982502038D26060882260C0E752411146622171B59201F1F4D1F
+28244820382644224D27402261283B22752836208C273420B1241F12EF381F
+13EE381F14EE371F15EE371F15EE371F15EE371F15EE371F15EE371F15EE37
+1F15EE378E2300008E2400008F250000902500009026000091270000912700
+009328000095290000922A0000872B01037D2D0508732E0A0D662D1013582C
+15194C2A1C1F3E2723263627312934294529322B5B292F2C72282C2A89272B
+2AAD24181EEC36181FEC35181FEB351820EB341820EB341820EB341820EB34
+1820EB341820EB341820EB3490260000912600009227000092280000932900
+0094290000942A0000962B00008D2D0000822F0000783102036F3305086435
+090C59360E114D36131741361A1E333221252B332D2727363D252A3A57242A
+3A7124283A89222738AA20142BEB31142CEB30142DEB30142DEB30142EEB2F
+142EEB2F142EEB2F142EEB2F142EEB2F142EEB2F9329000094290000952A00
+00952B0000962C0000972D0000982E00008A2E00007D310000733300016A36
+020361390507583C080B4E3F0D0F444112153741181C2A401F21224228221F
+473521214A4F20244B6E1F234A861E2248A61D163FE626133EED29133FED28
+133FED28133FED28133FED28133FED28133FED28133FED28133FED28962C00
+00972D0000982E0000992F00009A3000009B310000862F0000793100006F34
+0000653800015D3C0203564004064E44070946490B0E3B4C10142F4D171A23
+4D1D1E1D51261E1A56341D1B594B1C205A6B1B1F5A831A1E58A3191552E21F
+1050F1231051F1221051F1221051F1221051F1221051F1221051F1221051F1
+221051F1229A3000009B3100009B3200009C3300009B330000843200007632
+00006B35000062380000593C0000534101024C470304464D06073D530A0C33
+570F11285915171E5A1C1B195F26191762371917664B191A6865181A687E17
+1A689E151666DA170C61F31F0C62F31F0C62F31E0C62F31E0C62F31E0C62F3
+1E0C62F31E0C62F31E0C62F31E9C3400009D3500009D3500009A3600008235
+000073350000683500005F380000563C0000504100004A470101444E02033D
+560406345C080A2A610D0F216413141A681C17176D27161470371614734A15
+1676611416777912157795121576C8120973F71A0974F71A0974F71A0974F7
+190974F7190974F7190974F7190974F7190974F7199F3800009F3900009A3A
+00008138000071370000653800005C390000543B00004E4000004846000042
+4D00003C560101345E03042B660609236B0B0E1B70111216751A14137B2613
+117E35121181481012845E0F1286740F11868E0F1085B60E0E86F7100E86F7
+0F0F86F70F0F87F70F0F87F70F0F87F70F0F87F70F0F87F70F0F87F70FA13C
+00009B3D0000803B00006F3A0000633B0000593B0000523C00004C3F000046
+450000404D00003A550000335E00012B670203246F05071D76090C167B0E10
+118217110E89220F0D8D300E0D91450C0E955B0B0D986F0B0C99870B0C98AC
+0B0E98F40A0E98F40A0E98F30A0D99F30A0D99F30A0D99F30A0D99F30A0D99
+F30A0D99F30A9D4100007F3E00006D3D0000603D0000573E00004F3F00004A
+400000454400003F4C000039550000325F00002B680000247101021E790305
+1881060911890A0D0D92120D0A9B1D0B09A32A0909A93E0809AE550709B369
+0708B5810708B4A30709B6F30709B6F30709B6F30709B6F30609B6F30609B6
+F30609B6F30609B6F30609B6F3067F4100006B4000005E400000544100004D
+42000048430000434500003E4B000038540000315F00002A69000024720000
+1F7B000119840202148F03050D9A050908A80A0907B8150705C9220605D534
+0504DF4B0403E6610403EB790505F29A0301E8ED0600E7FF0600E7FF0600E7
+FF0500E7FF0500E7FF0500E7FF0500E7FF0500E7FF056A4300005C43000053
+4400004C45000046480000414A00003C4D000037540000305F000029690000
+237300001E7D00001987000015910000109E00000BAD010206C0050404D90E
+0403F11D0303FC2F0101FF450100FF5D0200FF750103FF940002FFDF0100FF
+FF0200FFFF0200FFFF0200FFFF0200FFFF0200FFFF0200FFFF0200FFFF025B
+460000514800004A4A0000444C00003F4F00003A510000355400002F5B0000
+28650000236E00001D78000018800000148900000F9400000B9F000106AD02
+0202C2080302DD120201F4200101FF320000FF4B0000FF600100FF780101FF
+8F0001FFD80000FFFF0100FFFF0100FFFF0100FFFF0100FFFF0100FFFF0100
+FFFF0100FFFF0150490000484B0000424D00003C5000003753000032560000
+2D580000285F0000226900001D720000187A0000138300000E8C00000A9500
+0005A0010101AE040101C80C0100E2170000F8230000FF370000FF4F0000FF
+620000FF790000FF8C0000FFC70000FFFF0000FFFF0000FFFF0000FFFF0000
+FFFF0000FFFF0000FFFF0000FFFF00464C0000404E00003951000034550000
+2F5800002A5A0000275D0000226300001C6C000017740000127C00000E8400
+00098C00000495000101A0020000B1070000C90D0000E2170000F7220000FF
+350000FF4D0000FF5F0000FF760000FF890000FFB30000FFF60000FFFF0000
+FFFF0000FFFF0000FFFF0000FFFF0000FFFF0000FFFF003E4F000037530000
+315600002C590000275C0000245F0000216100001C660000176E0000127600
+000D7E00000A850000078D00000395000101A0020000B0060000C80D0000E1
+170000F6220000FF330000FF4B0000FF5D0000FF730000FF860000FFA40000
+FFE60000FFFF0000FFFF0000FFFF0000FFFF0000FFFF0000FFFF0000FFFF00
+355400002E580000295B0000255E0000216000001E6200001B640000176900
+0013700000107700000D7E00000A850000078C000003950001019F020100AF
+060000C70C0000DF160000F4210000FF320000FF4A0000FF5B0000FF6F0000
+FF830000FF990000FFD80000FFFF0000FFFF0000FFFF0000FFFF0000FFFF00
+00FFFF0000FFFF002C590000275D0000226000001E6200001B640000186500
+00176500001669000013700000107700000D7D00000A850000078C00000394
+0001019F020100AE060000C60C0000DE160000F3200000FF300000FF480000
+FF590000FF6C0000FF800000FF900000FFBC0000FFF20000FFFF0000FFFF00
+00FFFF0000FFFF0000FFFF0000FFFF00>
+<7B0F00007B0F00007C1000007C1000007D1000007D1100007D1100007D1100
+007B0E0000790B02037A0909077B0711097D081B097E0725097F0730098006
+400980064F0880055F077F046E067F047F05800392048103AF038402EB0283
+00FF048300FF048300FF048300FF048300FF048300FF048300FF048300FF04
+8300FF048300FF047B0F00007C1000007C1000007D1100007D1100007D1100
+007E1200007E1100007C0F00007A0C02037B0908077B08100A7E081A097F08
+240A7F07300A80063F0981064F0880055E0780056E0680047E058004920482
+03AF038502EA038300FF048300FF048300FF048300FF048300FF048300FF04
+8300FF048300FF048300FF048300FF047C1000007C1000007D1100007D1100
+007E1200007E1200007E1200007E1200007C1000007B0D02037B0A08077C08
+0F0A7E081A0A7F08230A80072F0A81073E0A81064E0981065E0881056D0781
+057E06810492058203AF048503E8038300FF048300FF048300FF048300FF04
+8300FF048300FF048300FF048300FF048300FF048300FF047D1000007D1100
+007D1100007E1200007E1200007F1300007F1300007F1300007D1000007C0D
+02027C0A07077D080E0A7F09190A8009230A81082E0B82073D0A82074D0982
+065D0881056D0782057E06820492058304AE048603E7038400FF058400FF05
+8400FF058400FF058400FF058400FF058400FF058400FF058400FF058400FF
+057D1100007E1200007E1200007F1300007F1300007F130000801400008014
+00007E1100007D0E02027D0B06077E090E0B8009180B8109220B82082D0B83
+083C0B83074C0A82075D0982066C0882067D07830591068404AE048603E604
+8400FF058400FF058400FF058400FF058400FF058400FF058400FF058400FF
+058400FF058400FF057E1200007E1200007F1300007F130000801400008014
+000080150000801400007F1200007E0F02027F0C06077F0A0D0B810A170B83
+0A210B83092C0C84083B0B83084C0B83075C0A83076C0983067D0884069006
+8505AD058603E4058400FF068400FF068400FF068400FF078400FF078400FF
+078400FF078400FF078400FF078400FF077F1300007F130000801400008014
+0000801500008115000081150000811500008013000080110101800D050780
+0B0C0B820A160C840A200C840A2B0C85093A0C85084B0C84085B0B84076B0A
+84077C08850790078606AD068603E2078400FF088400FF088400FF088400FF
+088400FF088400FF088400FF088400FF088400FF088400FF08801400008014
+00008115000081150000811600008216000082160000821600008214000081
+120101810F0506820C0C0A840B140D850B1F0D850B2A0D860A380D8609490C
+85095A0C85086A0A85087B0986078F088707AC078602E0098400FF098400FF
+098400FF098400FF098400FF098400FF098400FF098400FF098400FF098400
+FF098115000081150000811600008216000082170000821700008317000083
+170000821500008213010183100506840E0B0A850C130E870C1E0E870C280E
+870B370E870A480D870A580D8609690B87097A0A87088E098808AC088804DF
+098400FF0A8400FF0A8400FF0A8400FF0A8400FF0A8400FF0A8400FF0A8400
+FF0A8400FF0A8400FF0A821600008216000082170000831700008318000083
+1800008318000084180000841700008315010184120505860F0A0A860D110F
+890D1C0F880D270F890C350F890B460E880B570E880A680D880A790C89098D
+0A8A09AB098A06DF098400FF0C8400FF0C8400FF0C8400FF0C8400FF0C8400
+FF0C8400FF0C8400FF0C8400FF0C8400FF0C82170000831700008318000083
+180000841900008419000084190000851A0000851800008516010186140405
+8811090A880E10108A0E1B108A0E250F8A0D33108A0C440F8A0C560F890B67
+0E8A0B780D890B8C0C860BA80B8309D90C7600FF127400FF127200FF137100
+FF137000FF146F00FF146F00FF146F00FF146F00FF146F00FF148318000084
+1900008419000084190000851A0000851A0000851B0000851B0000861A0000
+86180000881604048A1309098A0F0F0F8C0F19118C0F24108C0F31108C0E42
+108A0D5310830E63107F0F73107B1086107910A10F7610CF0F6300FF1B6100
+FE1B6001FE1C5F01FE1C5E01FE1D5D01FE1D5D01FE1D5D01FE1D5D01FE1D5D
+01FE1D84190000851A0000851A0000851B0000851B0000861C0000861C0000
+861C0000871B0000881A00008A1803038C1508098D120E0F8E1017128F1022
+1289112E1282113D147A114D1574125D156E136E156B13811569149A156614
+C6145203FA225104F9225004F8224F05F8224F05F8224E05F7234E05F7234E
+05F7234E05F7234E05F723851B0000861B0000861C0000861C0000861D0000
+871D0000871D0000871E0000891D00008A1C00008C1A03038E18070890140D
+0E8D12141382131D16771427177015361868164618621657195D16671A5917
+7B1A5717931A5517BA194309F126410AF026400AEF263F0BEF263E0BEF263E
+0BEF263E0BEF263E0BEF263E0BEF263E0BEF26861C0000871D0000871D0000
+871E0000881E0000881E0000891F0000891F00008B1F00008C1E00008E1D02
+02911B0607881B0C0D7B1811146B16171A6217211C5A182D1C55193C1D501A
+4E1E4C1B611F481B741F441A8A1F421AAA1D3310E7272F0FEA292E0FEA292D
+10EA292D10E9292C10E9292C10E9292C10E9292C10E9292C10E929871E0000
+881E0000891F0000891F00008A2000008A2000008B2100008B2100008D2100
+008E2100008C2002028321050779210A0C6C1F0F125D1E1519521D1D1D461B
+2521411D32233D1E4524391F5925341E6C252F1C81252E1C9E222517DC2923
+16E92B2216E92A2217E82A2217E82A2217E82A2217E82A2217E82A2217E82A
+2217E82A892000008A2000008B2100008B2100008C2200008C2200008D2300
+008D2300008F230000872400007D250102742605076A27090C5E270E115126
+131745241A1D3822202431232C262E253E262C2753262B286A252827802426
+269B222223D5241B20E7291B20E7291B21E7291B21E6291B21E6291B21E629
+1B21E6291B21E6291B21E6298C2200008C2200008D2300008E2300008E2400
+008F2500008F2500009026000084270000792900006F2B0103662C04075C2E
+080B512F0D0F473012153B30181B2E2D1F22272E2924243039232534502126
+3769202536801F23349A1E2032D21F172DE626172EE625172EE625172FE625
+172FE625172FE625172FE625172FE625172FE6258E2400008F250000902500
+009026000091270000922700008E28000081280000752B00006B2D00006230
+0102593304065035070947370B0E3D391014313A161A263A1D1F203C261F1D
+41331E1E444A1D2045651C20457D1B1F43971B1E42CB19153CE921153DE920
+153EE920153EE920153EE920153EE920153EE920153EE920153EE920912700
+009228000093290000942A0000942A00008E2B00007E2B0000722C0000672F
+00005E320000563601024E390305473D06083F410A0D35440E122945151820
+461C1C1B4A251B194F321A195348191B5461191B547A181A5394171B52C516
+144EEF1A144EEF1A154FEF1A154FEF19154FEF19154FEF19154FEF19154FEF
+19154FEF19952B0000962C0000972D0000982E00008D2D00007B2D00006F2F
+0000653000005B330000533700004C3B0101464003043F450506374B080A2D
+4E0D10235014151B531B1817582517155B3417155F471616625E1517627514
+166290131762BD12115EF216115FF116115FF116115FF116115FF116115FF1
+16115FF116115FF116115FF116992F00009A3000009B3100008C3000007930
+00006C3100006132000059330000513700004A3B0000444000003E47020237
+4E04052E54070926580C0E1D5B121317601A141465261312683414116C4613
+126F5B121270701012708A101270B10F0F6FF4120F70F4120F70F4110F70F4
+110F71F4110F71F4110F71F4110F71F4110F71F4119C3300009D3400008C34
+000077340000693400005E350000553600004F370000483B0000424100003C
+470000364F01012E570303265E05081F630A0C18671010136D191110722410
+0E7632100E79450F0E7C580D0E7E6C0C0D7F840C0D7EA50C0E7FEF0C0D7FEE
+0C0D7FEE0B0D7FED0B0D80ED0B0D80ED0B0D80ED0B0D80ED0B0D80ED0B9F38
+00008C38000076370000673700005B380000533900004C390000473B000041
+4000003B470000355000002E5800002760020320670507196D090B12730E0F
+0E7A170E0C80220D0A842F0C0A87410A0A8B55090A8E6908098F7F08098E9E
+08098EE108098FE808098FE808098FE808098FE708098FE708098FE708098F
+E708098FE7088C3B0000743A0000653A0000593B0000503C00004A3D000044
+3E0000404000003A470000345000002D59000027620000216A01021A720405
+147807090E7F0C0C0A87140B088F1E0907952A07069A3C06069E500506A264
+0405A4790405A2960506A3CF0406A5E20406A5E20405A5E20405A5E20405A5
+E20405A5E20405A5E20405A5E204733D0000633D0000573E00004E3F000048
+400000424200003D45000039470000335000002C5A000026630000206C0000
+1B740101157D02040F8404060A8D070806990E0704A5170503B0230302B834
+0202BE490201C45D0101C9730102CC8F0202C9C40202CAF00201CBF00201CB
+F00201CBF00201CBF00201CBF00201CBF00201CBF00261400000554100004C
+42000046440000404700003B4A0000364D0000325000002C5A000025640000
+206E00001B77000016800000118900010C940102069F020403B0060302C80E
+0201E21B0101FA280101FF410000FF570000FF6F0101FF890001FFC80000FF
+FF0000FFFF0000FFFF0000FFFF0000FFFF0000FFFF0000FFFF0000FFFF0053
+4400004B460000444900003E4C000039500000345400002F5700002B5A0000
+256400001F6D00001A750000157E0000108600000C8F00000799000103A503
+0101B9080100D3110000ED1D0000FF2B0000FF450000FF590000FF6F0000FF
+860000FFB60000FFFF0000FFFF0000FFFF0000FFFF0000FFFF0000FFFF0000
+FFFF0000FFFF004A4B0000424D00003C50000036530000315700002C590000
+285C0000245E00001F6700001970000014780000108000000B880000069000
+000299010100A6040000BB090000D3120000EC1C0000FF290000FF430000FF
+570000FF6D0000FF830000FFA70000FFF70000FFFF0000FFFF0000FFFF0000
+FFFF0000FFFF0000FFFF0000FFFF00404E00003A510000335500002D580000
+295B0000255E0000216000001F620000196A0000147200000F7900000C8100
+0009880000059000000299000100A5040000BA090000D2110000EB1C0000FF
+280000FF410000FF550000FF6A0000FF800000FF9B0000FFE70000FFFF0000
+FFFF0000FFFF0000FFFF0000FFFF0000FFFF0000FFFF003753000031560000
+2B5A0000265D0000226000001F6200001C63000019650000156C0000127200
+000F7900000C80000009880000068F00000298000100A5030000B8090000D1
+110000EA1B0000FF260000FF3F0000FF530000FF670000FF7E0000FF910000
+FFDA0000FFFF0000FFFF0000FFFF0000FFFF0000FFFF0000FFFF0000FFFF00
+2E580000285C0000235F00001F6100001C6300001965000017650000176500
+00156B0000127200000F7900000C80000009880000068F00000298000100A4
+030000B7080000D0100000E81A0000FD260000FF3C0000FF510000FF640000
+FF7B0000FF8C0000FFBC0000FFF80000FFFF0000FFFF0000FFFF0000FFFF00
+00FFFF0000FFFF00265D0000216000001D6300001965000017650000176500
+001765000017650000156B0000127200000F7900000C80000009870000068F
+00000298000100A4030000B6080000CE100000E71A0000FC250000FF3A0000
+FF500000FF620000FF770000FF880000FFA80000FFE50000FFFF0000FFFF00
+00FFFF0000FFFF0000FFFF0000FFFF00>
+<740A0000750A0000750B0000760B0000770B0000770C0000780C0000780C00
+00770B000074070202730508057404110675041A067704230678042E067A03
+3C057B034A047B0259037B0268037A0177017A0188017B009E007E00CC0081
+00FF018100FF018100FF018100FF018100FF018100FF018100FF018100FF01
+8100FF018100FF01750A0000760B0000760B0000770C0000780C0000780C00
+00790D0000790D0000770B0000750802027405070574051006760519067805
+230679042D067B043B067C034A057C0359047C0267037B0277027B0187017C
+019E017F01CC018100FF018100FF018100FF018100FF018100FF018100FF01
+8100FF018100FF018100FF018100FF01760B0000770B0000770C0000780C00
+00780D0000790D00007A0D00007A0E0000780C000076090102740606057505
+0F0777051907790522077A042C077B043A067C0449057D0358057C0367047C
+0277027C0187027C019E017F01CB018100FF018100FF018100FF018100FF01
+8100FF018100FF018100FF018100FF018100FF018100FF01770C0000780C00
+00780D0000790D00007A0D00007A0E00007A0E00007B0E0000790D0000770A
+01027507060576060E07780618077A0621077B052B077C0439077D0448067D
+0458057D0367047D0276037C0287027D019E028001C9018100FF028200FF02
+8200FF028200FF028200FF028200FF028200FF028200FF028200FF028200FF
+02780C0000790D0000790D00007A0E00007B0E00007B0F00007B0F00007C0F
+00007A0E0000780B01017707050577060D08790617087B0620087C062A087D
+0538087E0548077E0457067E0466057D0376047D0287037E029D028102C802
+8200FF028200FF028200FF028200FF028200FF028200FF028200FF028200FF
+028200FF028200FF02790D00007A0E00007B0E00007B0F00007B0F00007C0F
+00007C1000007C1000007B0F0000790C01017808040578070C087A0716087C
+071F087D0629087E0637087F0547077F0556077F0465067E0475047E038703
+7F029D038102C7028200FF038200FF038200FF038200FF038200FF038200FF
+038200FF038200FF038200FF038200FF037B0E00007B0F00007B0F00007C10
+00007C1000007D1000007D1100007D1100007D1000007B0D0101790A04057A
+080B087B0715097D071E097E0728097F0636097F0646088005550780056506
+7F0475057F04860480039D038202C6038300FF048300FF048300FF048300FF
+048300FF048300FF048300FF048300FF048300FF048300FF047B0F00007C10
+00007C1000007D1100007D1100007D1100007E1200007E1200007E1100007C
+0E01017B0B04057B090B087C08130A7F081D0A7F08270A8007350A81064509
+8106540881056407800574068104860581049C048303C5038300FF048300FF
+048300FF048300FF048300FF048300FF048300FF048300FF048300FF048300
+FF047C1000007D1100007D1100007E1200007E1200007E1300007F1300007F
+1300007F1200007D1001017C0C03047D0A0A087E09120B80091C0A8109260B
+8208330B8207430A8207530982066308820573078205850683049C058403C3
+048400FE058400FF058400FF058400FF058400FF058400FF058400FF058400
+FF058400FF058400FF057D1100007E1200007E1200007F1300007F13000080
+1400008014000080140000801300007F1101017E0E03047F0B08087F09100B
+820A1B0B8209250B8309310B8308410B8307520A8307620983067208830684
+0784059C068604C2058501FE068300FF068100FF078000FF087F00FF087E00
+FF097E00FF097E00FF097E00FF097E00FF097F1300007F1300008014000080
+14000080150000811500008115000081160000811500008013010180100303
+800D0708810A0F0C840B190C840B230C850A2F0C85093F0C8508500B840861
+0A84077109810882097E0898097C08BC087503F80C6F00FF0F6E00FF0F6C00
+FF106B00FF116A00FE116A00FE116A00FE116A00FE116A00FE118014000080
+15000081150000811600008216000082160000821700008317000083160000
+8214000082120202830F0708830C0E0C850C170D860C220D860B2D0D870A3E
+0D810B4D0E7C0C5D0E770C6C0E730D7D0E700E930D6E0DB60D6507F2125E02
+FC175D02FB175B02FA185B03FA185A03FA185A03FA185A03FA185A03FA185A
+03FA1881160000821600008217000082170000831700008318000083180000
+8418000084180000841600008414020285110607860F0D0C870D150F890D20
+0F800E2A10790E3812720F47126C0F5712660F66136310781360118D125E11
+AF125B0FEB144F06F61C4F07F61C4E07F51C4D08F41C4C08F41C4C08F41C4C
+08F41C4C08F41C4C08F41C8317000083170000831800008318000084190000
+84190000841A0000851A0000851A000085180000861602028714060689110C
+0B820F121177101B146D11251568133216601340165B135016561360175214
+72184F1487174D14A5164E15E116400BEC1F3E0CEB1F3D0CEA1F3D0CEA1F3C
+0CEA1F3C0CEA1F3C0CEA1F3C0CEA1F3C0CEA1F841800008419000084190000
+851A0000851A0000851B0000851B0000861B0000861B0000871A0000881901
+01871705067D170B0B71140F126213151759141F1953162A1A4E16371A4917
+471B4618591C41176B1D3D177F1D3A16991B3916CA1A2F10E3212E11E3202E
+11E3202D11E3202D12E3202D12E3202D12E3202D12E3202D12E320851A0000
+851B0000851B0000861C0000861C0000861C0000871D0000871D0000881D00
+00891C0000821C0101791D05056F1C090A621B0D10551A13164B1A1B1A4119
+231E3B1A2E20361B3E22331C51222F1B63232A1A772328199020291ABA1E25
+18E3202519E2202419E2202419E2202319E1202319E1202319E1202319E120
+2319E120861C0000861C0000871D0000871D0000881E0000881E0000881F00
+00891F00008A1F00007F200000752101016C2104056122070A55220C0F4A22
+11153F21181B321F1E212B1F28232821382427234C23272562222524782122
+238E1F2223B81E1D20E0211C21E0211C21E0211C21DF211C22DF201C22DF20
+1C22DF201C22DF201C22DF20871E0000881E0000891F0000891F00008A2000
+008A2000008B210000872100007D23000072240000682501015E2603055428
+07094A290B0E402A1013342A161929281C2023292721212C3520212F491E23
+33621D2132781D1F318E1C1E30B41B192CE11E192DE11E192DE11E192EE11E
+192EE11D192EE11D192EE11D192EE11D192EE11D8A2000008B2100008B2100
+008C2200008D2200008D23000085240000792500006F270000642800005A2A
+0101512C0305492F060840310A0D36330E122B33141822331B1D1E36251D1C
+3B321B1C3F451A1D405E191C4075191B3F8B181A3DAF17163BE41A163BE419
+163CE419163CE419163CE419163DE419163DE419163DE419163DE4198D2300
+008D2300008E2400008F2500009025000084260000762700006B290000612A
+0000582D00004F3001014833030440360507383A080B2E3C0D10253E13161C
+3F1A1A1944241917493018174D4317174E5A16184F7115174E8815174CAB14
+174BEB13174CEB13174CEB13174CEB12174DEB12174DEB12174DEB12174DEB
+12174DEB129026000091260000922700009228000083280000732A0000682B
+00005E2C0000552E00004D310000463501013F390203383E04053043070927
+460B0E1F481214184C1A16155124151355311512584314135B5713135C6D12
+135C8511135BA710145AEC10145AEC10145AEB10135BEB0F135BEB0F135BEB
+0F135BEB0F135BEB0F135BEB0F942A0000952B0000962C0000812B0000712D
+0000652E00005B2F0000523000004B320000443600003E3B00003841010131
+470304294C060821500A0D1952101214581912125E24110F6131120E644211
+0F68550F0F6A690E0F6A800D0E699F0D0F69E10C0F6AEA0C0F6AE90C0F6AE9
+0C0F6AE90C0F6AE90C0F6AE90C0F6AE90C0F6AE90C992F00009A3000007F2E
+00006F30000062310000573200004F33000049340000433600003D3B000037
+4200003049000029500203225605071B5A0A0B145E100F1064190F0E6A230E
+0B6E300E0B71400D0B75530B0B77660A0A787B0A0A77970A0A77CB090A78E1
+090A78E1090A78E0090A78E0090A78E0090A78E0090A78E0090A78E0099C34
+00007F3200006D3300005F340000543500004C36000046370000413900003C
+3C000036430000304A000029520000235902021C6004071565080A0F6A0E0D
+0C71180C0977220B087B2D0A077F3D08078250070785630606867706068691
+060685BD060686DB060686DB060686DA060686DA050686DA050686DA050686
+DA050686DA057F3600006B3600005D370000523800004A390000443B00003F
+3D00003A3F0000354300002F4B000029540000235C00001D640102166A0405
+107007080B760D0A087E160906851F07048A2A05048E390403914C0302955E
+020297720202968B020296B3020398D7020298D6020298D6020299D6020299
+D6020299D6020299D6020299D602693900005A3A0000503B0000483D000042
+3F00003C41000038440000334700002E4C000028550000225E00001D660000
+176E0102117503040B7C060606830A07048D110502971A03019F250201A534
+0101AB480100B05C0000B66F0001B6890101B4AF0001B7E20000B7E20000B7
+E20000B7E20000B7E20000B7E20000B7E20000B7E200593E00004E3F000046
+410000404300003A460000354A0000314D00002C50000028560000225F0000
+1C68000017710000127901010D8101020789020303920603019F0B0100B213
+0000C51D0000D42B0000DF3F0000EA540000F4690000F7820000FBA60000E9
+FF0000E9FF0000E9FF0000EAFF0000EAFF0000EAFF0000EAFF0000EAFF004D
+430000454500003E490000384D0000335000002D54000029580000265B0000
+226000001C6A000017730000127B00000D830000088B000004930001019E02
+0100AD060000C60C0000E0160000F6220000FF360000FF4E0000FF630000FF
+7D0000FF990000FFF40000FFFF0000FFFF0000FFFF0000FFFF0000FFFF0000
+FFFF0000FFFF00444A00003D4F000036530000305700002A5A0000265D0000
+235F00001F6100001C650000166D0000117500000E7C00000B830000078B00
+0004930000019E020100AC050000C50B0000DE160000F5210000FF340000FF
+4D0000FF610000FF7A0000FF900000FFE40000FFFF0000FFFF0000FFFF0000
+FFFF0000FFFF0000FFFF0000FFFF003A510000335500002D590000285C0000
+235F0000206100001C6300001964000016670000136E0000117500000E7C00
+000B830000088B000004930000019D020100AC050000C40B0000DD150000F3
+200000FF320000FF4B0000FF5E0000FF760000FF8C0000FFD10000FFFF0000
+FFFF0000FFFF0000FFFF0000FFFF0000FFFF0000FFFF00315600002A5A0000
+255E0000216100001D63000019640000176500001765000017670000146E00
+00117500000E7C00000B830000088A000004930000019D010100AB050000C3
+0B0000DB150000F2200000FF300000FF490000FF5C0000FF730000FF880000
+FFB60000FFFF0000FFFF0000FFFF0000FFFF0000FFFF0000FFFF0000FFFF00
+285C0000235F00001E6200001A640000176500001765000017650000176500
+0017670000146E0000117500000E7C00000B830000088A000004920000019C
+010100AA050000C10A0000D9140000F01F0000FF2E0000FF480000FF5A0000
+FF6F0000FF840000FFA40000FFED0000FFFF0000FFFF0000FFFF0000FFFF00
+00FFFF0000FFFF00206100001C630000186500001765000017650000176500
+00176500001765000017670000146E0000117500000E7B00000B830000088A
+000004920000019C010100A9040000C00A0000D8140000EF1E0000FF2C0000
+FF450000FF580000FF6C0000FF810000FF970000FFDC0000FFFF0000FFFF00
+00FFFF0000FFFF0000FFFF0000FFFF00>
+<6D0500006E0500006E0500006F060000700600007007000071070000710700
+00710800006D0401016C0307036C0310046D0319046F02220371022C037301
+39027501460277015402770163017601720176008200770095007800B6007C
+00F9007D00FC007D00FC007D00FC007D00FC007D00FC007D00FC007D00FC00
+7D00FC007D00FC006E0500006F0600006F0600007007000070070000710700
+007108000072080000720800006E0501016D0306036D030F046E0318047003
+210472022B0474023803760146027701530277016201770171017600810077
+0094007900B4007D00F8007D00FC007D00FC007D00FC007D00FC007D00FC00
+7D00FC007D00FC007D00FC007D00FC006F0600007006000070070000710700
+007108000072080000720800007309000073090000700601016E0405036E03
+0E046F0318047103210473022A047502370377024503780253027801620277
+01710177008100780093007900B3007D00F6007E00FD007E00FD007E00FD00
+7E00FD007E00FD007E00FD007E00FD007E00FD007E00FD0070070000710700
+007108000072080000730900007309000074090000740A0000740A00007107
+01016F0405036F030D05700317057203200474032A04760236047702440379
+025203790161027801700178008000780092007A00B1007E00F4007F00FD00
+7F00FD007F00FD007F00FE007F00FE007F00FE007F00FE007F00FE007F00FE
+007108000072080000730900007309000074090000740A0000750A0000750A
+0000760B0000720800007004040470040C057204160573041F057503290577
+033504780243047A0252037A02600279016F0178007F00790091007B00B000
+7F00F2007F00FE007F00FE007F00FE007F00FE007F00FE007F00FE007F00FE
+007F00FE007F00FE00730800007309000074090000740A0000750A0000760B
+0000760B0000770B0000770C0000740900007105030472040B057304150675
+041E057604280578033405790342047B0251037B025F037A016E0179007E00
+790090007B00AE008000F0008000FF008000FF008000FF008000FF008000FF
+008000FF008000FF008000FF008000FF0074090000750A0000750A0000760B
+0000760B0000770C0000780C0000780C0000780D0000760A00007306030473
+050A067405140676041D0678042706790333067A0341057C0350047C025F03
+7B026E027A017E017B0190017C00AD008000EE018100FF018100FF018100FF
+018100FF018100FF018100FF018100FF018100FF018100FF01750B0000760B
+0000770C0000770C0000780C0000790D0000790D00007A0D00007A0E000077
+0B000075070203750609067605130777051C07790526077A0431077C044006
+7D044F057D035E047C026D037B027D027C018F017D01AD018101EE018100FF
+018100FF018100FF018100FF018100FF018100FF018100FF018100FF018100
+FF01770C0000780C0000780D0000790D00007A0E00007A0E00007B0E00007B
+0F00007B0F0000790C000077090203760708067706110879061B087A062408
+7C0530087D053F077E044E067E045D057D036C047D027D037D028F027E02AC
+028201EB018200FF028200FF028200FF028200FF028200FF028200FF028200
+FF028200FF028200FF02790D00007A0D00007A0E00007B0E00007B0F00007B
+0F00007C1000007C1000007C1000007A0E0000780B02027808070679070F08
+7B0719087C0723087D062E097E053D087F054C077F045C067E046B057E037C
+047E038F038002AB028002E4027D00FD047B00FC057A00FB057900FB057800
+FB067700FB067700FB067700FB067700FB067B0E00007B0F00007B0F00007C
+1000007C1000007D1100007D1100007D1100007E1200007C0F00007A0C0202
+7A0906067A070E097D0818097E0821097F072C0980063B0980064B0880055B
+077C056A077906790775068C067306A6067206DA066A01FA0B6901F90B6702
+F90B6702F80C6602F80C6502F80C6502F80C6502F80C6502F80C7C1000007C
+1000007D1100007D1100007E1200007E1200007E1200007F1300007F130000
+7E1100007D0E01017C0B05067D090C097E09160A8009200A81082A0A800739
+0B7908470C7309560C6F09650C6B0A740C680B880B650BA30A640BD40A5B04
+F6125904F5125804F5135704F4135705F4135605F4135605F4135605F41356
+05F4137D1100007E1200007E1200007F1300007F1300007F14000080140000
+8014000080150000801300007F1001017E0D05057F0A0B0A8009140B7F0A1E
+0C770B270E700C33106A0D4210640D50105F0D5F115B0D6F11580E8210560E
+9C0F550FCB0F4E09F4154D0AF4154C0AF3154B0AF2154B0AF2154A0BF2154A
+0BF2154A0BF2154A0BF2157F1300007F130000801400008014000081150000
+811500008116000082160000821600008115000081120101810F0405810D0A
+09760C100F6C0D1911640F22135F102D1459113B13541149144F1159154B11
+6A1648117D15461195144612BF13410FED163F0FEC163E0FEB163D0FEB163D
+0FEA163C0FE9173C0FE9173C0FE9173C0FE917801500008115000081160000
+82160000821700008317000083170000831800008318000083170000831501
+017D1404047313080966110C105A11141452121D174C132618471432184214
+40193F15521A3B15631B3714761B34148C193313AE182F12DF192F12DF192E
+13DF192E13DF192E13DF192D13DF182D13DF182D13DF182D13DF1882160000
+82170000831700008318000083180000841900008419000084190000851A00
+00851900007A19010171190303661807085A180B0F4E171114451719183B17
+201C34172A1E3018381F2D194A2029185C2126186E202417851E2417A51C24
+18DA1A2418D91A2318D91A2319D91A2319D81A2219D81A2219D81A2219D81A
+2219D81A831800008419000084190000841A0000851A0000851B0000851B00
+00861B0000821C0000781D00006E1D0000641D0203591E06084E1E0B0D431E
+1013381E16192C1C1B1F261C2521241E33212320452023225A1F22226F1E1E
+20841D1E20A21B1D20D91B1D20D91A1D21D91A1D21D91A1D21D91A1D22D91A
+1D22D91A1D22D91A1D22D91A851A0000851B0000861B0000861C0000861C00
+00871D0000871D0000801E0000762000006C20000061210000572202044D23
+06084324090D39250E122E25131724241A1D1F25231F1E27311D1E2B431C1F
+2E591A1E2F6F1A1C2E84191A2CA018192BDB18192CDB18192CDB18192DDA18
+182DDA18182DDA18182DDA18182DDA18182DDA18861C0000871D0000871D00
+00881E0000881F0000891F00007E20000073220000692300005E2400005425
+00004B27020342290507392B080C302D0D10262D12161E2E191B1B31231A19
+362F19193941181A3B5717193B6C16173B811616399C151638D7151639DD14
+1639DD14163ADD14163ADD13163ADD13163ADD13163ADD13163ADD13891F00
+00891F00008A2000008A2100008B2100007C2300006F240000652500005B26
+000052280000492A0000412D0203393004063133070A29360B0E203711141A
+391917173E231616432F1515464014154854131549691313487E1213479911
+1446CF101346DF101346DE101346DE101347DE101347DE101347DE101347DE
+101347DE108C2200008C2200008D2300008A240000792500006C2700006128
+0000572900004F290000472C0000402F000039330102323803042A3C060823
+3F0A0D1B40101216451913134B2212114E2E1211523F11115452101056660F
+0F567B0E0F56960D1054C60D1054DE0D1054DE0D1054DE0D1055DE0C1055DD
+0C1055DD0C1055DD0C1055DD0C8F250000902600008A26000077280000692A
+00005D2B0000542C00004C2D0000452E00003F31000039360000323B01012B
+400203244505071D48090B154A0E10115018100F57230E0D592E0F0C5D3E0E
+0C60500D0B63630C0B64770B0B63900A0B62BB0A0C62DA0A0C62DA0A0C62DA
+090B62DA090B63D9090B63D9090B63D9090B63D909932900008C2A0000762B
+0000672D00005A2E0000502F000049300000433100003E3300003837000031
+3D00002B430000254901021E4E04061752080A11560F0D0D5D180D0B63220C
+09662E0B08693C0A086C4D09077060070771730707718A070771AF070770D4
+060770D4060771D4060771D4060771D3060771D3060771D3060771D3068C2D
+0000742E000064300000573100004D32000046330000403500003B37000037
+390000313E00002B450000254C00001F53010218580406115D08090C620E0B
+09691809076F220806732C0705763A0604794B04037D5C03037F6F03037F86
+03037EA703037ED003037ED003037FCF03037FCF03037FCF03037FCF03037F
+CF03037FCF037332000062330000553400004B360000443700003E39000039
+3B0000343E0000304000002B470000254F00001F560000195D010213620405
+0C670708086E0F0805761806047D200402812A030285380201894901018D5A
+0101906D01018E8401018DA401018FD001018FD000008FD000008FD000008F
+D000008FD000008FD000008FD000603700005338000049390000423B00003C
+3D000036400000324300002D4600002A490000245000001F59000019600000
+136701020D6D030408740805047B0E0502841502018C1D0100932700009834
+00009C450000A0570000A5690000A5800000A2A00000A5D60000A5D80000A5
+D80000A5D80000A5D80000A5D80000A5D80000A5D800513B0000483D000040
+3F00003A420000344600002F4A00002B4D000027510000235400001F5A0000
+19630000146A00000E71010108780203048004030287090200910E01009E14
+0000AA1D0000B4290000BB3B0000C34F0000CC630000D07A0000D1970000CB
+D40000CCEC0000CCED0000CCED0000CDED0000CDED0000CDED0000CDED0046
+4100003F44000038480000324D00002C5100002855000024580000205B0000
+1D5E000019640000136D00000F7400000C7C000009830001058B0101029501
+0100A1040000B5090000CF110000EA1B0000FF280000FF430000FF580000FF
+710000FF8A0000FFDC0000FFFF0000FFFF0000FFFF0000FFFF0000FFFF0000
+FFFF0000FFFF003D4A0000364F00002F5400002A590000255D000021600000
+1E6200001A64000018650000156A0000127100000F7800000D7F00000A8600
+00068E00000397000101A3030000B5080000CF100000E81A0000FF260000FF
+400000FF560000FF6D0000FF860000FFC00000FFFF0000FFFF0000FFFF0000
+FFFF0000FFFF0000FFFF0000FFFF00345500002D590000275D000022600000
+1E6200001B640000176500001765000017650000156A0000127100000F7800
+000D7F00000A860000068E00000396000101A2030000B4070000CD0F0000E7
+1A0000FD250000FF3E0000FF540000FF6A0000FF820000FFAB0000FFFF0000
+FFFF0000FFFF0000FFFF0000FFFF0000FFFF0000FFFF002A5A0000245E0000
+206100001B6300001865000017650000176500001765000017650000156A00
+0012700000107700000D7E00000A860000068D00000396000101A1030000B3
+070000CC0F0000E6190000FB250000FF3B0000FF520000FF670000FF7F0000
+FF9C0000FFF10000FFFF0000FFFF0000FFFF0000FFFF0000FFFF0000FFFF00
+226000001D6200001965000017650000176500001765000017650000176500
+00176500001669000013700000107700000D7E00000A860000078D00000396
+000101A1030000B2070000CB0E0000E5180000F9240000FF390000FF500000
+FF640000FF7C0000FF910000FFDE0000FFFF0000FFFF0000FFFF0000FFFF00
+00FFFF0000FFFF001B64000017650000176500001765000017650000176500
+001765000017650000176500001669000013700000107700000D7E00000A85
+0000078D00000395000101A0020000B1070000C90D0000E3180000F8230000
+FF360000FF4E0000FF610000FF780000FF8B0000FFC10000FFFF0000FFFF00
+00FFFF0000FFFF0000FFFF0000FFFF00>
+<62020000630200006402000065030000650300006603000067030000680300
+0068040000670201016501060165010F0265011802670121016A002A016D00
+36006F00420071004F0072005E0072006D0072007D0072008E007300A60076
+00DB007800F6007800F6007800F6007800F6007800F6007800F6007800F600
+7800F6007800F6006302000064020000650300006603000067030000680300
+0068040000690400006A040000680301016601060266010E02660117026801
+20016B0029016D0035007000420072004F0073005D0073006C0072007C0073
+008D007400A5007700DA007900F8007900F8007900F8007900F8007900F800
+7900F8007900F8007900F8007900F800650300006603000067030000680300
+0068040000690400006A0400006B0400006B0400006A030101670105026701
+0D0268011702690120026C0129016E0034007000410072004E0073005C0073
+006B0073007B0074008C007400A4007700D8007900F9007900F9007A00F900
+7A00F9007A00F9007A00F9007A00F9007A00F9007A00F90067030000680300
+0069040000690400006A0400006B0400006C0500006C0500006D0500006C04
+01016801040268020D02690216026A011F026D0128026F0133017100400173
+004D0174005C0074006B0074007B0074008C007500A3007800D6007A00F900
+7A00F9007A00F9007A00F9007A00F9007A00F9007A00F9007A00F9007A00F9
+0068040000690400006A0400006B0400006C0500006D0500006E0500006E05
+00006F0600006E050000690203026A020C036A0215036B021E026E01270270
+01320272013F0174014D0175015B0175006A0074007A0075008B007600A200
+7900D5007B00FA007B00FA007B00FA007B00FA007B00FA007B00FA007B00FA
+007B00FA007B00FA006A0400006B0500006C0500006D0500006E0500006F06
+00006F06000070060000700700006F0600006B0202026B020B036B0214036D
+021D036F0226037101310273013E0275014C0176015A017600690175007900
+76008A007700A1007A00D2007C00FB007C00FB007C00FB007C00FB007C00FB
+007C00FB007C00FB007C00FB007C00FB006D0500006E0500006F0600006F06
+00007006000070070000710700007108000072080000710700006D0402026C
+030A036D0313046E031C04710225037302300374013D0276014B0277015901
+7701680176007800760089007800A0007A00D0007D00FC007D00FC007D00FC
+007D00FC007D00FC007D00FC007D00FC007D00FC007D00FC006F0600006F06
+00007007000071070000710800007208000072080000730900007309000073
+0800006F0502026E0408036E03110470031B047203240474022F0476023C03
+77024A027801580278016701770077017700880078009E007B00CE007E00FD
+007E00FD007E00FD007E00FD007E00FD007E00FD007E00FD007E00FD007E00
+FD00700700007107000072080000720800007309000074090000740A000075
+0A0000750A0000740A00007106010270040704700410057204190574032305
+75032D0577023B04790249037902570379016602780176017800860079009D
+007C00CB007F00FE007F00FE007F00FE007F00FE007F00FE007F00FE007F00
+FE007F00FE007F00FE00720800007309000074090000740A0000750A000075
+0B0000760B0000760B0000770C0000760B0000730801017105060472040E06
+740418067504210577032C06790339057A0348047B0256037A026502790175
+0179008500770099007600BF007701F7017501F6017301F5017201F4017101
+F3017001F3027001F3027001F3027001F302740A0000750A0000760B000076
+0B0000770C0000770C0000780C0000790D0000790D0000780C000075090101
+7306040574050D06760517067705200679042A067A0437067B0346057A0355
+0575046305710471056E0482056A0497046804BB046502F0056403EF066203
+EF066103EF066103EF076004EF076004EF076004EF076004EF07760B000077
+0C0000780C0000780D0000790D00007A0D00007A0E00007B0E00007B0F0000
+7B0E0000780B00007607030476060B067706150779061E077B052807770634
+097106420A6B07500A67075E0A63076D0A60087F095D0894095B08B8085705
+EF0C5606EF0C5506EE0D5406EE0D5306EE0D5306EE0D5306EE0D5306EE0D53
+06EE0D790D0000790D00007A0E00007B0E00007B0F00007B0F00007C100000
+7C1000007C1000007C1000007A0D0000780A030479080A077A07130975081C
+0A6D09250C670B300D620C3D0E5C0B4A0E570B580F540B680F510B7A0F4E0C
+8F0E4D0CB20D4B0AED10490AEC10490AEC10480BEC10480BEB0F470BEB0F47
+0BEB0F470BEB0F470BEB0F7B0E00007B0F00007C0F00007C1000007D100000
+7D1100007D1100007E1200007E1200007E1200007C0F00007B0C0203770A08
+076B090E0D620B170F5C0D2010570F2A11520F36124D0F4312480F5213450F
+6214420F74133F0F89123E0FA8113F0FE7113D0FE5113C0FE4113B0FE3113A
+0FE2113A0FE211390FE112390FE112390FE1127C1000007D1100007D110000
+7E1200007E1200007F1300007F1300007F14000080140000801400007E1100
+00741002026A1006075D0E0B0E520E12124B101B144611241541122E163B12
+3B1738124B1835135C1831126D192E1181182D119C162D11D4152C11D6152B
+12D5152A12D5162A12D4162912D4162912D4162912D4162912D4167E120000
+7F1300007F1300008014000080140000811500008115000081160000821600
+007E16000073160000681501025D15050752140A0D471410123E1517163515
+1E192E15271B2A15331D2716431D2516541E2216661E20157B1C2015951A21
+16C6182016CF182016CE181F16CE181F17CE181F17CE181F17CE181F17CE18
+1F17CE18801400008115000081160000821600008217000082170000831700
+00831800007B180000731A0000671900005C190102521A0506471B090C3C1B
+0E11321B14172719191C2119221E1F1B2E1E1F1D3F1D1F1F521C1E20671B1C
+1F7A1A1A1E93191B1EC0181B1FD0171A1FD0171A1FD0171A20D0171A20D017
+1A20D0171A20D0171A20D01782170000831700008318000083180000841900
+008419000084190000791B00006F1C0000661D00005A1D0000501E0102461F
+05063C20080B32210C10292112152020171B1C21211C1B242D1A1A273E191B
+2A51181B2C6717182A7A17172991161728BC151729D214172AD214172AD214
+172AD214172AD214162BD214162BD214162BD2148419000084190000851A00
+00851A0000851B0000821B0000771D00006C1E0000621F0000592000004E21
+0000452202023C2404063326070A2A270B0F222810141A281719182C211817
+312D1617343D1516364F14163763141437771313368E121335B5121335D211
+1335D2111335D2111336D2111336D2111336D2111336D2111336D211851B00
+00861C0000861C0000871D0000821E000075200000692100005E2200005422
+00004D230000432500003B280102332B03052C2E060824300A0D1C310F1216
+33171515382114143D2D1313403C1212424E1111436110104375100F438C0F
+1041B10E1041D20E1041D20D0F41D20D0F41D20D0F42D20D0F42D20D0F42D2
+0D0F42D20D871E0000881E0000891F00008120000072220000652300005924
+00005025000049260000422700003A2A0000332E01012C320203253605061E
+38090B17390E10123E1711114421100F482C100F4B3B0F0E4E4D0D0D505F0D
+0C51720C0C50890B0C4EAA0A0C4DD10A0C4ED10A0C4ED10A0C4ED10A0C4ED0
+0A0C4ED0090C4ED0090C4ED0098B2100008B210000802300006F2500006126
+0000562700004D280000452900003F2B00003A2C0000333100002C36000026
+3A0102203E04051841080A11420D0F0E49170E0D50210C0B532C0D0A563A0B
+09594A0A085C5C09085E6F08085D8508085CA307085BCD07085BCD07085BCC
+07085BCC07085CCC06085CCC06085CCC06085CCC068F2400007F2500006D28
+00005E290000532A0000492B0000422D00003C2E000037300000333300002D
+380000273E0000214301011A470405134A07090D4E0E0C0B55170A095B2109
+075F2B09066138080564480604685905046A6C04046B8104046B9C050469C8
+040469C8040469C704046AC704046AC703046AC703046AC703046AC7037F29
+00006B2B00005C2C0000502E0000472F0000403100003A3300003535000031
+3700002D3A000027400000214700001B4C0101145104050E550808095A0E09
+0762180705682106036B2A05026D3603027146020176570101796A0101797E
+01017897010177C3010177C4010178C4010078C3000078C3000078C3000078
+C3000078C300692E0000593000004D320000443300003D3500003837000032
+3A00002E3C00002A3F000027420000214900001B500000155601020F5B0405
+085F080706671006046F1A040275210200792900007C360000804500008355
+000086670000867B00008495000084BF000084CA000085CA000085CA000085
+CA000085CA000085CA000085CA00573400004B350000433700003C39000036
+3C0000303F00002C4300002846000024480000214C00001B530000165A0000
+106001020A650404056B090403721004027A170201811D0100862500008A30
+00008E4000009251000095630000977700009592000095BC000095D2000096
+D2000096D2000096D2000096D2000096D2000096D2004A390000413B00003A
+3E0000344200002E460000294A0000254D0000215000001E5300001B550000
+165D0000106300000D690101096F020305760503037D0A0301850F02008E15
+0000971D00009E280000A4370000A9490000AE5D0000B3710000B38B0000B0
+B50000B2DF0000B3DF0000B3DF0000B3DF0000B3DF0000B3DF0000B3DF0040
+40000038440000324800002C4D000027510000225500001F5800001B5B0000
+185D0000175E000014650000116C00000E7301010A7A010107800102038803
+0201920601009E0A0000B0110000C31B0000D3270000E03B0000EA520000F5
+670000F8820000FBAD0000EBFF0000EBFF0000EBFF0000ECFF0000ECFF0000
+ECFF0000ECFF00374A0000304F00002955000024590000205D00001C600000
+18620000176400001765000017660000146C0000117300000E7A00000B8100
+000889000005910000019B010100A8040000C00A0000D9140000F2200000FF
+310000FF4C0000FF610000FF7C0000FF9D0000FFFF0000FFFF0000FFFF0000
+FFFF0000FFFF0000FFFF0000FFFF002D580000275D0000226000001D630000
+196500001765000017650000176500001765000017650000146C0000117300
+000E7A00000C8100000889000005910000029A010100A7040000BE0A0000D8
+140000F01F0000FF2F0000FF4A0000FF5E0000FF790000FF910000FFEF0000
+FFFF0000FFFF0000FFFF0000FFFF0000FFFF0000FFFF00245E00001F620000
+1A640000176500001765000017650000176500001765000017650000176500
+00146C0000117300000F7A00000C8100000888000005900000029A010100A7
+040000BD090000D6130000EF1E0000FF2D0000FF480000FF5C0000FF740000
+FF8C0000FFDD0000FFFF0000FFFF0000FFFF0000FFFF0000FFFF0000FFFF00
+1D630000186500001765000017650000176500001765000017650000176500
+001765000017650000146C0000117300000F7A00000C810000098800000590
+00000299010100A6040000BB090000D4120000ED1D0000FF2B0000FF460000
+FF590000FF700000FF870000FFBE0000FFFF0000FFFF0000FFFF0000FFFF00
+00FFFF0000FFFF001765000017650000176500001765000017650000176500
+0017650000176500001765000017650000156C0000127300000F7900000C81
+000009880000059000000299000100A5040000BA090000D3120000EB1C0000
+FF290000FF430000FF570000FF6C0000FF830000FFA60000FFF70000FFFF00
+00FFFF0000FFFF0000FFFF0000FFFF00>
+<590002005A0002005A0002005B0001005B0001005C0001005C0001005D0001
+005E0001005E0101005E0006005D000E005E0016005F001F00620028006500
+320068003F006A004B006D0059006E0067006D0077006D0087006E009B006F
+00BF007200E9007200E9007200E9007200E9007200E9007200E9007200E900
+7200E9007200E9005A0002005B0002005B0001005C0001005C0001005D0001
+005E0001005E0101005F010100600101005F0005005F000D015F0016016000
+1E00630027006600320068003E006B004B006E0058006E0067006E0076006E
+0086006E009A007000BE007300EB007300EB007300EB007300EB007300EB00
+7300EB007300EB007300EB007300EB005B0001005C0001005D0001005D0001
+005E0101005F01010060010100600101006101000061020000600004016000
+0C016001150161001E01640027006700310069003D006C004A006F0057006F
+0066006F0076006F0086006F0099007100BE007400ED007400ED007400ED00
+7400ED007400ED007400ED007400ED007400ED007400ED005D0001005D0001
+005E0101005F01010060010100610101006102000062020000630200006302
+00006101030161010C016101140162011D0165002601680030006B003C006D
+0049006F005700700065006F0075006F008500700099007200BD007500EF00
+7500EF007500EF007500EF007500F0007500F0007500F0007500F0007500F0
+005E0101005F01010060010100610100006202000063020000630200006402
+000065030000650300006301020162010B016301140164011C016600250169
+002F006C003C006E0048007000560071006500700074007000850071009800
+7300BC007600F2007600F2007600F2007600F2007600F2007600F2007600F2
+007600F2007600F20060010100610200006202000063020000640200006503
+0000650300006603000067030000670300006401010164010A016401130265
+011B01670124016A002E016D003B006F004800710055007200640071007400
+71008400720097007400BA007700F5007700F5007700F5007700F5007700F5
+007700F5007700F5007700F5007700F5006302000063020000640200006503
+000066030000670300006803000068040000690400006A0400006602010166
+0109026601120267011B02690123016C002D016E003A007000470072005400
+730063007200730072008300730096007500B9007900F8007900F8007900F8
+007900F8007900F8007900F8007900F8007900F8007900F800650300006603
+0000670300006803000069040000690400006A0400006B0400006C0500006C
+05000069020101670108026801100269011A026A0122026D012C0170003900
+7200460074005300740062007300720073008200740095007600B7007A00F9
+007A00F9007A00F9007A00F9007A00F9007A00F9007A00F9007A00F9007A00
+F90068030000690400006A0400006A0400006B0400006C0500006D0500006E
+0500006E0500006F0600006C0401016902060269020F036A0218036C022102
+6F012B02710137017301440175015201750161017500700074008100750094
+007700B5007B00FA007B00FA007A00F8007900F7007800F7007700F6007700
+F5007600F5007600F5006A0400006B0400006C0500006D0500006E0500006F
+0600006F0600007006000070070000710700006E0501016B0305036B020E03
+6C0217036E022003700229037301350274014302760151027601600176006F
+0172007E006F008F006D00AB006E00EA006B01EB016901EA016801E8016701
+E7016601E6016601E5016501E5016501E5016D0500006E0500006F06000070
+06000070070000710700007108000072080000720800007309000071070000
+6D0303036E030C046E03150470031F0472022804740234037602420372024E
+036E035C046A036A046603790363038B036002A6035E02DB025C02E2035B03
+E2035A03E2035A03E2035903E2045903E2045903E2045903E2047007000071
+0700007108000072080000730800007309000074090000740A0000750A0000
+750A0000730800007005020370040A047104140572041D05730326056D0430
+0768053D0863064A085F0657085B06660859067608560689075306A3075206
+D9065106E6075006E6074F07E6074F07E6074E07E5074E07E5084E07E5084E
+07E508720800007309000074090000740A0000750A0000750B0000760B0000
+770B0000770C0000780C0000760A00007307020372050905720412066A061A
+086407220A5F092C0B5B0B390C550A450C5009520D4D09610E4A09720D4809
+850C46099F0B4609D10B450AE40B440AE30B430AE20B430AE10B420AE10B42
+0AE10B420AE00B420AE00B750A0000750B0000760B0000770C0000770C0000
+780C0000790D0000790D00007A0E00007A0E0000780C0000760902026D0706
+0662070C0B5909150D540B1E0E4F0D270F4B0E3210450D3D10420D4C113F0D
+5C123C0D6C11390D7F11380D980F380DC40F370DD90E360DD80F350DD70F34
+0DD60F340DD60F330DD60F330DD50F330DD50F770C0000780C0000790D0000
+7A0D00007A0E00007B0E00007B0F00007B0F00007C0F00007C100000780F00
+006C0E0101610D0406550C090C4C0D1010450E19123F1021133A102A143510
+3615321145162F1155162B10661729107816280F8F15280FB513270FCD1326
+0FCC132610CB142510CA142510CA142410CA142410CA142410CA147A0E0000
+7B0E00007B0F00007C1000007C1000007D1000007D1100007D1100007E1200
+00771300006D13000061120101561204054B12080B41120E11381315142F12
+1B172912241925132E1B22133D1B20144D1C1E145F1C1D14721A1C1488191D
+14AB171D14C6161C14C5161C15C5161B15C5161B15C5161B15C5161B15C516
+1B15C5167C1000007D1100007D1100007E1200007E1200007F1300007F1300
+007F140000741500006B16000061160000551601014B1704054117080A3618
+0C102C1712152316171A1D161F1C1C182A1B1B1A391A1B1C4B191A1D5E1818
+1D7118171C8617171CA716171CC615171CC615171DC614171DC614171DC614
+171EC614171EC614171EC6147E1200007F1300007F14000080140000801500
+00811500007D16000072170000681800005F190000541A00004A1A0101401B
+0405361C070A2D1D0B0F241D10141C1C1519181E1E1A17212A181723391617
+264B1517275E1515277014142785141326A4121426C8121426C7111427C711
+1327C7111327C7111327C7111327C7111327C7118115000081160000821600
+0082170000831700007B1800006F1A0000651B00005A1C0000511C0000491D
+00003F1E0101362003052D22060926230A0D1E230E131724151615281F1515
+2C2A13142F391213314A1212325C1111336E11103283101031A10F1031C80E
+1031C70E0F31C70E0F32C70E0F32C70E0F32C70E0F32C70E0F32C70E831800
+00831800008419000084190000791A00006D1C0000601D0000561E00004D1F
+0000462000003E210000352301012E26020427290507202B090B192B0D1013
+2E151312331F1112382B10113A390F0F3C490E0E3D5A0D0D3E6C0D0C3E810C
+0C3D9C0B0C3BC70B0C3CC70B0C3CC60B0C3CC60A0C3CC60A0B3DC60A0B3DC6
+0A0B3DC60A851A0000851B0000861B0000781D00006A1F00005D2000005221
+000049210000422300003C240000352600002E2A0000282D0102213104051A
+32070A13330C0E0F38150F0E3D1F0E0D41290D0C45380C0B47480A0A49580A
+094B6A09094A7E08084998070947C4070847C4070848C3070848C3070848C3
+070848C3070848C3070848C307871D0000871E000077200000682200005A22
+00004E230000462400003E26000039280000342900002F2D00002831000022
+3501011C380304153A07090E3C0C0D0B42150B0A491F0A094C290A084F3609
+07514507065556060557680505577B05055692040554BC040554C0040455BF
+040455BF040455BF040455BF040455BF040455BF0487200000752200006524
+0000562500004B260000422800003B2A0000362C0000312E00002D30000029
+340000233900001D3D0000164103040F4206080A470D09084E160806541F07
+0557290604593405035B420302605302016466020165780101648D020163AF
+010162BA010162B9010163B9010163B9010163B9010163B9010163B9017226
+00006227000053290000482A0000402C0000392E0000333000002F3300002B
+35000027380000233C00001D41000017460000114903040A4D070706530E07
+055B180503602003016329020065330100684100006C520000706300007176
+0000718A00006FAB00006EBD00006EBD00006FBD00006FBD00006FBD00006F
+BD00006FBD005F2B0000512C0000462E00003E30000037330000313600002C
+380000283B0000253E0000214000001D440000184A0000124F01010B520304
+06570805045F100403651803026B1F02016F27010071310000743E0000784E
+00007C6000007D7200007B8800007BA900007AC400007AC400007BC400007B
+C400007BC400007BC400007BC4004E310000443200003C350000353800002F
+3B00002A3E000026410000224400001F4700001C490000184E000012530000
+0D580101095C03030561060504670E04036F160302751C02017B2301007E2D
+0000813A0000854A0000895C00008B6E00008986000088A7000089CC000089
+CC000089CC000089CC000089CC000089CC000089CC00423600003A39000033
+3D00002D41000028450000234900001F4C00001C4F00001951000016530000
+15560000125B00000E6101010B660202076B04040472090403791003018116
+0100881D00008E26000093330000974400009A5600009F6900009F8100009D
+A400009FD600009FD600009FD600009FD600009FD600009FD600009FD60039
+3F0000324300002B480000264C0000215000001D5400001956000017590000
+17590000175A0000165D0000136300000F6A00010C70010108760202047D04
+0302850802018E0D01009A130000A71C0000B1270000B9380000C14D0000C9
+610000CE790000CE9A0000CAE80000CAEB0000CBEB0000CBEC0000CBEC0000
+CBEC0000CBEC00304A000029500000235400001F5800001A5C0000175F0000
+175F000017600000176100001762000016650000136C0000107300000D7B00
+000A830000078B00000394000101A0020100B1070000CA0E0000E6190000FC
+250000FF3F0000FF560000FF6F0000FF8B0000FFE70000FFFF0000FFFF0000
+FFFF0000FFFF0000FFFF0000FFFF0027580000215D00001C61000018640000
+17650000176500001765000017650000176500001765000016680000136F00
+00107600000D7D00000A840000078C000004940001019F020100B0060000C9
+0D0000E4180000FA240000FF3C0000FF540000FF6C0000FF860000FFD20000
+FFFF0000FFFF0000FFFF0000FFFF0000FFFF0000FFFF001F6200001A640000
+17650000176500001765000017650000176500001765000017650000176500
+0016680000136E0000107500000D7C00000A840000078B000004940001019F
+020100AE060000C80D0000E2170000F8230000FF390000FF520000FF680000
+FF820000FFB30000FFFF0000FFFF0000FFFF0000FFFF0000FFFF0000FFFF00
+17650000176500001765000017650000176500001765000017650000176500
+00176500001765000016680000136E0000107500000E7C00000B840000078B
+000004930001019E020100AD060000C60C0000E0170000F6220000FF360000
+FF4F0000FF640000FF7E0000FF9F0000FFFF0000FFFF0000FFFF0000FFFF00
+00FFFF0000FFFF001765000017650000176500001765000017650000176500
+001765000017650000176500001765000016670000136E0000117500000E7C
+00000B830000088B000004930000019D020100AC050000C50B0000DE160000
+F4210000FF330000FF4D0000FF610000FF7B0000FF910000FFE60000FFFF00
+00FFFF0000FFFF0000FFFF0000FFFF00>
+<53000600530006005300060054000500540005005500050055000500560004
+0056000400560004005700050056000C005600140058001C005A0025005D00
+2F0060003A0063004700660054006800620069007100680080006800910069
+00AB006B00DA006B00DA006B00DA006B00DA006B00DA006B00DA006B00DA00
+6B00DA006B00DA005400050054000500540005005500050055000400560004
+00560004005700040057000400580003005800040057000C00570014005900
+1C005B0024005E002E0061003A006400460067005400690062006900700069
+008000690091006900AA006C00DD006C00DD006C00DD006C00DD006C00DD00
+6C00DD006C00DD006C00DD006C00DD00550005005500050056000400560004
+00570004005700040058000300580003005800030059000300590003005900
+0B00590013005A001C005C0024005F002E006200390065004600680053006A
+0061006A0070006A007F006A0090006B00AA006D00DE006E00E0006E00E000
+6E00E0006E00E0006E00E0006E00E0006E00E0006E00E00056000400560004
+005700040057000300580003005800030059000300590002005A0002005A00
+02005A0003005A000A005A0013005B001B005D00240060002D006300390066
+004500690052006B0060006B006F006B007F006B0090006C00A9006E00DE00
+6F00E3006F00E3006F00E3006F00E3006F00E3006F00E3006F00E3006F00E3
+0057000300580003005800030059000300590002005A0002005A0002005B00
+02005B0001005B0001005C0002005C000A005B0012005C001B005F00230061
+002C0064003800670045006A0052006C0060006C006E006C007E006C008F00
+6D00A9006F00DD007000E5007000E5007000E6007000E6007000E6007000E6
+007000E6007000E60059000300590003005A0002005A0002005B0002005B00
+01005C0001005C0001005D0001005D0001005D0001005D0009005D0011005E
+001A006000220063002B0066003700680044006B0051006D005F006D006E00
+6D007E006D008F006E00A7007000DC007100E8007100E8007100E8007100E8
+007200E8007200E8007200E8007200E8005A0002005A0002005B0001005C00
+01005C0001005D0001005E0001005E0101005F01010060010100600101005F
+0008005F0010015F0019016100210064002B0067003600690043006C005000
+6E005E006E006D006E007D006E008E006F00A7007100DC007300EB007300EB
+007300EB007300EB007300EB007300EB007300EB007300EB005C0001005C00
+01005D0001005E0001005F0101005F01010060010100610100006102000062
+020000620201006101060160010F01610118016300200166002A0168003500
+6B0042006D004F006F005D006F006C006F007C0070008D007000A6007300DB
+007400EE007400EE007400EF007400EF007500EF007500EF007500EF007500
+EF005E0101005F010100600101006001010061020000620200006302000064
+0200006402000065030000650300006201050162010E016301170164011F01
+670029016A0034006C0040006F004E0070005C0071006B0070007B0071008C
+007100A5007400D9007200ED007000EC006F00EA006E00E9006D00E9006C00
+E8006C00E8006C00E800610200006102000062020000630200006402000065
+03000066030000670300006703000068030000680300006501040165010C02
+6501150266011E01690027016C0032006E003F0070004C0072005A006F0068
+006B0077006800870065009D006400C6006200DE006000DC005E00DA005D00
+D9005D00D9005C00D8005C00D8005C00D80064020000650300006603000066
+0300006703000068040000690400006A0400006A0400006B0400006C040000
+6701020267010B026701140269011D026B0126016E0031016D003D01690149
+0266025602620263025F0272025B028202580197015601B9015401D4015301
+D4015201D4025101D3025101D3025002D3025002D3025002D3026803000068
+030000690400006A0400006B0400006C0500006C0500006D0500006E050000
+6F0500006F0600006A020202690209026A0212036B021C036802240464032D
+06600539075B054507570551075404600752056F074F0580064C0595054B04
+B9054A04D6054904D6054804D6054705D6054705D6054605D5064605D50646
+05D5066B0400006B0500006D0500006E0500006E0500006F06000070060000
+700700007107000071070000710800006D0401016C03070368031005600418
+075A06200856082909530A340A4D093F0B49084C0B46075B0C44086B0C4108
+7C0B3F0892093F07B4093F08D6083E08D5093D08D4093C08D4093C08D3093B
+08D3093B08D3093B08D3096F0600006F060000700600007007000071070000
+7208000072080000730900007309000074090000740A00006F070101640605
+0459060B095107130B4C091B0C470B240D420C2D0E3E0B380E3B0B460F380B
+5510350B6510330B760F310B8B0E310BAB0D320BCE0C300BCD0D2F0BCC0D2E
+0BCC0D2E0BCB0D2D0BCB0D2D0BCA0D2D0BCA0D720800007208000072080000
+7309000074090000740A0000750A0000760B0000760B0000770B0000710D00
+00640B0000590B03044E0A070A450B0F0E3E0C1710380D1F11330E27122F0E
+31132B0E3F14290F4E14270F5F14240E6F14230E8413230DA112240DC41123
+0EC311220EC312210EC212210EC212210EC212200EC112200EC112740A0000
+750A0000750B0000760B0000770C0000770C0000780C0000790D0000780D00
+006F0F0000661000005A1000004F0F0304451007093A100C0F321013122910
+19152410211720102A181E1138191C12471A1A12571A1912691918127E1719
+129A151912BE141912BD141813BD141813BD141813BD141813BC141713BC14
+1713BC14780C0000780C0000790D0000790D00007A0E00007B0E00007B0F00
+00761000006C110000621300005A1400004F140000451402033A1506093015
+0A0E271510131F13141819141C191816271917183418171A4517171B561615
+1B6815141B7C15141A9613141ABD12141ABD12141BBD12131BBD12131BBD12
+131CBD12131CBD11131CBD117B0F00007B0F00007B0F00007C1000007C1000
+007D11000074120000691400005F150000561600004E170000441700003A18
+020330190508281A090D201A0E1218191317151B1C17141E27151421341414
+224413132456121224671210247B11102394101123BE0F1124BE0F1024BE0E
+1024BD0E1024BD0E1025BD0E1025BD0E1025BD0E7D1100007D1100007E1200
+007E1200007F13000072150000671600005C170000521800004A190000431A
+0000391B0000301C0203281E05072220090C1A200C111420131412241D1312
+282711112B3410102C440F0F2E540F0E2F660E0D2E790E0C2E900C0D2DBA0C
+0D2DBD0C0C2EBD0B0C2EBC0B0C2EBC0B0C2EBC0B0C2EBC0B0C2EBC0B801400
+008014000080150000801500007217000065190000581A00004E1B0000461C
+00003F1D0000391E00003020000029220102232504061C26070A15270C0E10
+2913100F2E1D0F0E32270E0D35340D0C37430C0B38530B0A39640A093A770A
+09388D090937B2080937BB080837BA080837BA080838BA080838BA070838BA
+070838BA0782170000821700007F180000701A0000611B0000541C00004A1D
+0000421E00003B20000035210000302300002A260000242900011E2C030417
+2D0608102E0B0D0D33140C0B371D0B0A3B260A093E33090941420807435207
+0645630705457506054489050541AA040541B7040541B7040442B6040442B6
+040442B6040442B6040442B604831A00007F1A00006E1C00005E1E0000511F
+0000472000003E21000037230000322500002E2700002A290000252D00001F
+30000018330203113406070B360B0B093C140907421D080645260705473106
+044A4004034D5004025061030251720201508502014EA001014DB201014EB1
+01014EB101014EB101014EB101014EB001014EB001711F00006C1F00005C21
+00004E220000442300003B250000342700002F2900002B2C0000282E000025
+3000001F34000019380000133A02030B3C050707400C0805471505044D1E04
+025026030151300201523C0100574D00005B5F00005D7100005C8300005A9C
+000059B3000059B3000059B3000059B3000059B3000059B3000059B3005D23
+0000592400004B2500004127000039290000322C00002D2E00002931000025
+340000223600001F3800001A3C0000143F00000D42020307450606044C0E04
+0352160302571E02015A2502015B2E01005C3A0000604A0000655C0000676E
+000067810000669A010064B8000064B8000064B8000064B8000064B8000064
+B8000064B8004C280000492900003F2B0000372E0000303100002B34000027
+370000233900001F3C00001C3E0000193F0000144400000E4801010A4A0203
+064E060504540D05035B150302611C030165240201662C0100683800006B47
+000070590000736B0000737E00007298010070BE000070BE000070BE000071
+BE000071BE000071BE000071BE003F2F00003D2F0000353200002F36000029
+3A0000243D0000204000001D420000194500001647000015480000134C0000
+0F5000010B53020207570504055C0B0504641304026A1B0301702102007329
+000076350000794400007D55000080670000807C00007E9700007EC600007E
+C600007EC600007EC600007EC600007EC600007EC60036370000343800002D
+3C000027400000224300001E4700001A4A0000174D0000164E0000164E0000
+164F000014530000105800000C5D01020861040305660804046E0F04027517
+03017C1D01008125000085300000893F00008C50000090620000917700008F
+9400008FC5000090D0000090D0000090D0000090D0000090D0000090D0002D
+4100002B42000025470000204B00001C4F0000185200001653000017540000
+175500001756000017560000145B0000116100000E6701010A6C0202067204
+03037A090402810F02008A140000931C00009A270000A0350000A5480000AA
+5C0000AF710000AE8D0000ADBF0000AFDC0000AFDD0000AFDD0000AFDD0000
+AFDD0000AFDD00254E0000234F00001E5300001957000017590000175B0000
+175B0000175C0000175D0000175E0000175E000015640000126A00000F7100
+000B780101087F01020487020201900502009C080000AE0F0000C1180000D6
+240000E3370000ED4F0000F8650000FA820000FCBA0000EFFF0000F0FF0000
+F0FF0000F0FF0000F1FF0000F1FF001D5B00001C5C0000175F000017610000
+17620000176300001764000017650000176500001765000017650000156A00
+00127100000F7800000C7F000009870000068F00000298000100A5030000BA
+090000D4120000EE1D0000FF2D0000FF490000FF5F0000FF7C0000FFA50000
+FFFF0000FFFF0000FFFF0000FFFF0000FFFF0000FFFF001765000017650000
+17650000176500001765000017650000176500001765000017650000176500
+0017650000156A0000127100000F7800000C7F000009870000068E00000297
+000100A4030000B8080000D2110000EC1C0000FF2B0000FF470000FF5C0000
+FF780000FF950000FFFF0000FFFF0000FFFF0000FFFF0000FFFF0000FFFF00
+17650000176500001765000017650000176500001765000017650000176500
+00176500001765000017650000156A0000127100000F7800000C7F00000986
+0000068E00000297000101A3030000B7080000D0110000EA1C0000FF280000
+FF440000FF5A0000FF730000FF8D0000FFE70000FFFF0000FFFF0000FFFF00
+00FFFF0000FFFF001765000017650000176500001765000017650000176500
+001765000017650000176500001765000017650000156A0000127100000F78
+00000D7F00000A860000068E00000397000101A2030000B5080000CF100000
+E91B0000FF260000FF410000FF570000FF6E0000FF870000FFCC0000FFFF00
+00FFFF0000FFFF0000FFFF0000FFFF00>
+<4C0009004C0009004D0009004D0008004E0008004E0008004E0008004F0008
+004F000800500008005000070050000B005000130050001A00530022005500
+2B00580036005A0042005F004F0062005D0064006B0063007A0062008A0062
+009E006300BE006300CA006300CA006300CA006300CA006300CA006300CA00
+6300CA006300CA004D0008004D0008004E0008004E0008004F0008004F0008
+00500008005000070050000700510007005100070051000B00510012005100
+1A005300210056002A00590035005C00410060004E0063005C0065006B0064
+007A006300890063009D006400BE006500CC006500CC006500CC006500CC00
+6500CD006500CD006500CD006500CD004F0008004F0008004F0008004F0008
+00500007005000070051000700510007005200070052000600520006005200
+0A0052001200520019005400210057002A005A0035005D00410061004E0064
+005C0065006A00650079006400890064009D006500BF006600CF006600CF00
+6600CF006600CF006600CF006600CF006600CF006600CF0050000700500007
+00500007005100070051000700520007005200060052000600530006005300
+06005400060054000900530011005400190056002000590029005B0034005E
+00400062004D0065005B0066006900660079006500880065009D006600BF00
+6700D2006700D2006800D2006800D2006800D3006800D3006800D3006800D3
+00510007005100070051000700520006005200060053000600530006005400
+0500540005005500050055000500550008005500100055001800570020005A
+0029005D0033005F00400063004D0066005A00670069006700780067008800
+67009C006800BF006900D6006900D6006900D6006900D6006900D6006900D6
+006900D6006900D60053000600530006005300060053000600540005005400
+050055000500550005005600040056000400560004005700080056000F0057
+00170058001F005B0028005E00330061003F0064004C006700590068006800
+680078006800870068009B006900BE006B00DA006B00DA006B00DA006B00DA
+006B00DA006B00DA006B00DA006B00DA005400050054000500540005005500
+05005600040056000400560004005700040057000300580003005800030058
+00070058000F00580017005A001F005D0028005F00320062003E0065004B00
+690059006A006700690077006900870069009B006A00BE006D00DE006D00DE
+006D00DE006D00DE006D00DE006D00DE006D00DE006D00DE00560004005600
+04005600040057000400570003005800030058000300590003005900020059
+0002005A0002005A0006005A000E005A0016005B001E005E00270061003100
+64003E0067004A006A0058006B0066006B0076006A0086006B009A006C00BE
+006F00E2006F00E2006F00E2006F00E3006F00E3006F00E3006F00E3006F00
+E30058000300580003005800030059000300590002005A0002005A0002005B
+0002005B0001005B0001005C0001005C0004005C000D005C0015005D001D00
+600026006300300066003D00680049006B0057006C0065006C0075006C0085
+006A0098006900BA006700DD006500DC006400DC006300DB006200DB006100
+DA006000D9006000D9005A0002005A0002005A0002005B0002005B0001005C
+0001005C0001005D0001005D0001005E0001005E0101005E0003005E000B00
+5E0014005F001C006200250065002F0067003B006A0048006B005500680062
+006400700060007F005D0092005B00AF005900D3005700D2005600D1005500
+D1005500D0005400CF005400CF005300CF005C0001005C0001005C0001005D
+0001005E0001005E0101005F01010060010100610101006101000062020000
+6000010160010A016001120161011B016300240166002E00630038015F0143
+025C0150025A015D0257016C0254017B0251018D014F00A6014D00CB014C01
+CB014B01CB014A01CB014A01CA014901CA014901CA014901C9015F0101005F
+0101005F010100600101006101000062020000630200006302000064020000
+650300006503000064010101630108016301110163011A015E0221035A0329
+045705340652053F064F044B064C0459064B0369064803790545038A044403
+A5044303CA034203CA034103CA034003CA034003C9043F03C9043F03C9043F
+03C90462020000620200006302000064020000650300006503000066030000
+6703000068030000680400006904000067030101650106025E020E03560316
+0551051D064D0725084A082F0945073909420745093F06540A3D06640A3B06
+7409390687083806A0073805C9063706C9063606C8073506C8073506C70734
+06C7073406C7073406C7076603000066030000670300006803000069040000
+690400006A0400006B0400006C0500006D0500006D050000670501015B0403
+02510409074A0611094408190A3F09200B3A09280C370A320D340A3F0D310A
+4E0D2F0A5E0E2D0A6E0D2B09810C2B099A0B2C09C40A2B09C30B2A09C20B29
+09C20B2909C10B2809C10B2809C10B2809C10B6A0400006A0400006B040000
+6C0500006D0500006E0500006F0600006F0600007006000070070000670900
+005D09000052090202470806093F090D0C370A140E310C1C0F2C0C2310280C
+2C11260C3912240D4812220D5813200C68131F0C7A121F0C9210200BBB0F1F
+0CBB0F1E0CBA101D0CBA101D0CBA101D0CB9101C0CB9101C0CB9106F060000
+6F0600006F06000070060000700700007107000072080000720800006E0A00
+00640B00005C0D0000530E0000490D01023E0E0508340E0A0D2C0E1011240E
+16131F0E1E151C0E2716190F33171810411716105118151162171511751515
+118B131610B1121511B6121511B5121511B5121411B5121411B5121412B512
+1412B5127208000072080000720800007309000074090000740A0000750A00
+006C0C0000620E0000590F000051110000491100003E120102341205082B13
+090D23120E111B11121616121A17151424161416301514183F1413194F1312
+19601311197212101889111118AB101118B4101019B40F1019B40F1019B40F
+1019B40F101AB40F101AB40F750A0000750A0000760B0000770B0000770C00
+00770C00006B0F000060100000561200004E130000471400003F1500003415
+01022B1704072417080C1D170C101517111512191A14111B2413111E301110
+203F1010214F0F0F225F0F0D22710F0D21860E0D21A70C0D21B40C0D21B40C
+0D22B40C0D22B40C0D22B40B0D22B40B0C22B40B790D0000790D00007A0D00
+007A0E0000770F0000691100005D130000531400004A150000421600003B17
+0000341800002B1A0102241B04061E1D070A171D0B0F111D11120F201B100E
+24240E0E26300D0D283F0D0C2A4E0C0B2B5E0B0A2B6F0B092A840A092AA109
+092AB309092AB209092AB208092AB208092AB208092BB208092BB1087C1000
+007C1000007C10000076120000681400005B1500004F170000461800003E19
+0000371A0000311B00002B1D0000251F01011F2103041923060812230A0D0D
+25120E0C291B0C0B2C240B0A2F300A09313E0908334D0807345D0806356D07
+0634810605339B050532AF050532AF050532AF050533AE050533AE050533AE
+050533AE047F1300007F1300007514000066160000581800004C190000431A
+00003A1C0000331D00002E1F00002A20000026220000202500001A28010213
+2905070D29090B0A2E120A08321B080735240806382F06053A3D05043C4C04
+043E5B0403406C03023F7E02023C9502023BAA01013BAA01013CAA01013CA9
+01013CA901013CA901013CA9016E1800006E18000065190000551A0000491C
+00003F1D0000371F0000302000002B2200002824000025260000212900001B
+2C0000152E01020E2F040608310A0806371206043C1B05033E230402402D03
+02433A020145490101485A0100496B0000497C00004691000044AB000044AB
+000044AB000044AB000044AB000045AB000045AB005B1D00005B1D0000521D
+0000461E00003C200000342200002E2500002927000026290000222C00001F
+2E00001C300000163300000F35010109360505053A0B050341140302451B02
+0247230201482B02014A3701014D4701005058010052690000527B0000508F
+00004EAF00004EAF00004EAF00004EAF00004EAF00004EAF00004EAF004A21
+00004A2100004322000039240000322600002C290000272C0000232F000020
+3100001D3300001A35000016370000103A00000B3B0102063C040504410B05
+03481203024D1A020250210201512902015235010054430000595500005D67
+00005D7900005C8D000059B3000059B3000059B300005AB300005AB300005A
+B300005AB3003C2700003C27000037280000302B00002A2F00002532000021
+3500001D3700001A390000173B0000143C0000133D0000104000000C420101
+0744030505490905044F110402561903025A2002015C2801015D3201005F40
+0000645100006864000069760000688C000066B2000066B9000066B9000066
+B9000066B9000066B9000066B900322F0000322F00002E3100002834000023
+3800001F3B00001B3D0000173F000015410000154200001543000014440000
+114800000D4B0101094D03040652080504580F04035F170302651F02016826
+01006A3001006C3D0000714E000075600000767300007589000074AF000073
+C0000074C0000074C0000074C0000074C0000074C0002A3800002A38000027
+3A0000213E00001D4100001844000015470000154800001548000015490000
+164A0000154B0000125000000E5401010A580303065C060504620D04036A15
+0402701C020175230100792C00007C3900007F4A0000845B0000856F000084
+87000083AC000083C9000083C9000083C9000083C9000084C9000084C90022
+430000224300001F4500001A490000164D0000164E0000164F0000164F0000
+16500000165100001651000016530000135800000F5D00010B630202086804
+04056E090403751003027D160200841D01008A2500008E3200009243000096
+5500009B6900009A82000098A900009AD400009AD400009AD400009AD40000
+9AD400009AD4001B4F00001B4F000018510000165400001755000017560000
+17570000175700001758000017590000175A0000175B000014620000106800
+000D6E010109750202057B030303830703018C0C010097110000A4190000AF
+250000B7350000BF4A0000C8600000CD790000CC9F0000C9EA0000CAEB0000
+CAEB0000CAEB0000CBEB0000CBEC00175B0000175B0000175B0000175C0000
+175D0000175E0000175F000017600000176100001762000017630000176400
+00146B0000117300000E7A00000B820000088A000004920000019D020100AC
+050000C60B0000E1170000F8230000FF3B0000FF540000FF6F0000FF8D0000
+FFFB0000FFFF0000FFFF0000FFFF0000FFFF0000FFFF001763000017630000
+17640000176500001765000017650000176500001765000017650000176500
+001765000017660000146D0000117400000E7B00000B820000088A00000592
+0000019C010100AB050000C40B0000DE160000F6220000FF380000FF520000
+FF6B0000FF870000FFE30000FFFF0000FFFF0000FFFF0000FFFF0000FFFF00
+17650000176500001765000017650000176500001765000017650000176500
+0017650000176500001765000017660000146C0000117300000E7A00000B82
+00000889000005910000019B010100A9050000C20B0000DC150000F4210000
+FF350000FF4F0000FF670000FF820000FFC20000FFFF0000FFFF0000FFFF00
+00FFFF0000FFFF001765000017650000176500001765000017650000176500
+00176500001765000017650000176500001765000017660000146C00001173
+00000E7A00000B8100000889000005910000019B010100A8040000C00A0000
+DA140000F2200000FF320000FF4D0000FF630000FF7E0000FFA60000FFFF00
+00FFFF0000FFFF0000FFFF0000FFFF00>
+<46000B0046000B0046000B0046000B0047000B0047000B0048000A0048000A
+0049000A0049000A0049000A0049000A0049001000490017004B001E004E00
+26005000300053003C00570049005B0057005D0066005E0075005D0083005C
+0094005C00AC005D00BF005D00BF005D00BF005D00BF005D00BF005D00BF00
+5D00BF005D00BF0047000B0047000B0047000B0048000B0048000A0048000A
+0049000A0049000A004A000A004A000A004A000A004B0009004A0010004A00
+16004C001E004F0026005100300054003C00580049005C0057005E0065005F
+0074005E0083005D0094005D00AC005E00C1005E00C1005E00C1005E00C100
+5E00C1005E00C1005E00C1005E00C10048000A0048000A0048000A0049000A
+0049000A004A000A004A000A004A0009004B0009004B0009004C0009004C00
+09004B000F004C0016004D001D005000250053002F0055003B00590048005D
+0056005F006400600073005F0082005E0093005E00AC005F00C2005F00C200
+5F00C2005F00C2005F00C2005F00C3005F00C3005F00C3004A000A004A000A
+004A000A004A000A004B0009004B0009004B0009004C0009004C0009004D00
+09004D0009004D0008004D000F004D0016004E001D005100250054002F0056
+003B005A0048005E0056006000640061007300600082005F0093006000AB00
+6000C4006000C4006000C4006000C4006000C4006000C4006000C4006000C4
+004B0009004B0009004B0009004B0009004C0009004C0009004D0009004D00
+08004E0008004E0008004E0008004F0008004E000E004E00160050001D0052
+00250055002F0058003B005B0047005F005500620063006200720062008100
+610092006100AB006200C6006200C7006200C7006200C7006200C7006200C7
+006200C7006200C7004C0009004C0009004C0009004D0009004D0008004E00
+08004E0008004F0008004F0008004F000800500007005000070050000E0050
+00150051001D005400250057002E0059003A005C0047006000540063006200
+6300710063008100620091006300AB006300CA006300CA006400CA006400CA
+006400CA006400CA006400CA006400CA004E0008004E0008004E0008004E00
+08004F0008004F000800500007005000070051000700510007005100070052
+00070051000D005100140053001C005500240058002E005B0039005E004600
+61005300640062006500700064008000640091006400AB006500CE006500CE
+006500CE006500CE006500CE006500CE006500CE006600CE00500007005000
+07005000070050000700510007005100070052000700520006005200060053
+000600530006005400060053000C005300140054001B00570024005A002D00
+5C0039005F00450063005300650061006600700066007F00650090006600AA
+006700D2006700D2006700D2006600D2006500D2006500D1006400D0006300
+D0005200070052000700520007005200060053000600530006005300060054
+0005005400050055000500550005005500040055000B005500130056001B00
+580023005B002C005E00380061004400640052006700600068006F0065007E
+0062008E005F00A6005D00CF005B00CE005A00CF005900CE005800CE005800
+CD005700CD005700CD00530006005300060053000600540005005400050055
+00050055000400560004005600040057000400570004005800030057000A00
+5700120058001A005A0022005D002C00600037006300440061004F005F005C
+005C006A00590079005600890053009F005100CA005000CA004F00CA004E00
+C9004D00C8004C00C8004C00C8004C00C70056000400560004005600040056
+00040057000400570004005800030058000300590003005900030059000200
+5A0002005A000900590011005A0019005C0021005D002A005901330156013E
+0253014A0251015702500166014D0175014A018501480099004600C0004500
+C2004400C2004300C1004300C1004200C1004200C0004100C0005800030058
+000300580003005800030059000300590002005A0002005B0002005B000100
+5B0001005C0001005C0001005C0007005C0010005900170154011E02510325
+034E042F044A043905470445054403520543036205410372043F0382033D02
+97033C01BB023B01C1023A02C1023902C0023902C0023802C0023802C00238
+02C0025A0002005A0002005A0002005B0002005B0001005C0001005D000100
+5D0001005E0101005F0101005F010100600101005D00050055010C024E0313
+0449041A0544052106410629073C06330839063F0837054D0836055D083405
+6C0832057E07310593063104B6053104C0053004BF052F04BF052E05BE052E
+05BE052E05BE052D05BE065D0001005D0001005D0001005E0101005F010100
+6001010061010100610200006202000063020000630200005C030000530302
+014A03070643050E083D06160937071D0A3308240B2F082D0B2D083A0B2A08
+470C2809570C2708660C2608780B25078D0A2607AE092607BB092507BA0924
+07BA092407B9092307B9092307B90A2307B90A610200006102000061020000
+620200006302000064020000650300006603000066030000630400005B0600
+00550700004B0701014107040738080B0A3109120C2B09190D260A200F230A
+2910210A34101F0B42111D0B51111B0B60111A0A71101A0A860F1B0AA40E1B
+0AB40D1A0AB30D1A0AB30E190AB20E190AB20E180AB20E180AB20E66030000
+66030000660300006703000068030000690400006A0400006A040000620600
+005A080000520A00004C0B0000420C0101380C04062F0C080C270C0E0F200C
+14111B0C1C13180D2414160E2F14140E3C15120F4B15120F5B14110F6C1312
+0F8011120F9C10120FAE0F120FAE0F1110AE0F1110AD0F1110AD0F1010AD0F
+1010AD0F6B0400006B0400006B0400006C0500006D0500006E0500006D0600
+0061080000580B0000500C0000490E0000420F0000381001012F1003062611
+070B1F100C0F180F1114131019141112221411142C1311163A11101749100F
+1859100E186A100D177E0F0D17980E0D16AD0D0D17AC0D0D17AC0D0D17AC0D
+0D18AC0C0C18AC0C0C18AC0C6F0600006F0600006F06000070070000710700
+006C090000600B0000560D00004D0F0000451000003E120000371300002E13
+0001271403052015070A19150B0E121510130F1719120E1922100E1B2C0F0D
+1D390D0D1E480D0C1F580C0B1F680C0A1F7B0B0A1F950A0A1FAC090A1FAB09
+0A1FAB09091FAB09091FAB090920AB090920AB097309000073090000730900
+00740A00006B0C00005E0E0000531000004A110000411300003A1400003315
+00002D16000027170101211903051B1A0609131A090D0E1B0F100C1D190E0B
+20220C0A232C0B0A24390A0926480908275709072767080627790706279007
+0626A9060626A8060627A8060627A8060527A8050527A7050527A705770C00
+00770C0000770C00006B0E00005D10000051120000471400003E1500003516
+00002F1800002A190000261A0000211C00001C1E0203162005070E20080B0B
+22100B0925180A08282109072B2C07062D3906052E47050430550504316504
+03317604032F8B03022DA402022EA402022EA302022EA302022EA302022EA3
+02022EA2026911000069110000691100005B1300004E150000431600003A18
+0000321900002B1B0000271C0000241E0000212000001D2200001724010110
+2504050A26080907291007062D18060430210503322B040235380202364501
+013854010139640101397401003788000034A3000034A3000034A3000034A3
+000034A3000034A3000034A3005816000058160000581600004C1700004019
+0000371A00002F1C0000291E00002520000022220000202400001D26000018
+280000112A01010B2B0305062D090604321104023619030237200202392902
+013B3501013C4301013F52010140630101407301003E8700003BA500003BA7
+00003BA700003BA700003BA700003BA700003BA700481A0000481A0000481A
+00003E1C0000341E00002D2000002822000024250000202700001D2900001A
+2B0000172C0000122E00000C300101073103040433090503371004023C1803
+023E1F02023F27020141320101434101014650010048620000497300004785
+000044A3000044AB000044AB000044AB000044AB000044AB000044AB003A1F
+00003A1F00003A1F0000312100002B24000026270000222A00001E2C00001A
+2E0000173000001431000012320000103400000C3501010836030305380705
+043D0F040243170302461E020247250201493002014B3D01014E4E01005260
+000053710000528400004FA100004EAF00004EAF00004EAF00004EAF00004F
+AF00004FAF002F2600002F2600002F26000029290000242D0000203000001C
+3200001834000014360000133700001337000013380000113900000D3B0001
+093D0203053F060504440D04034B150302501D020152240201532D0101543A
+0100584A00005C5D00005E6F00005E8200005C9D01005BB400005BB400005B
+B400005BB400005BB400005BB400282F0000282F0000282F0000233200001E
+35000019380000153A0000143B0000143C0000143D0000143D0000143E0000
+124000000F4300000A45020206470505044D0C0503541403025A1B03015D23
+02015F2B01006037000064470000685900006B6C00006B8000006A9B010068
+BA000069BA000069BA000069BA000069BA000069BA00203900002039000020
+3900001C3C0000173E00001440000015410000154200001543000015440000
+154400001545000013470000104B00000C4F01020852040405570905045E12
+0403651A03016A2102016D2901006F34000072430000775500007A6800007A
+7D0000799A000078C2000078C2000078C2000078C2000078C3000078C30019
+430000194300001943000015460000154700001548000015490000164A0000
+164B0000164C0000164C0000164D000014500000115500000D590101095E03
+030562070504690E040371160301771D02007D240100802F0000843E000087
+4F00008B6200008C7800008A9800008ACD00008BCD00008BCD00008BCD0000
+8BCD00008BCD00164E0000164E0000164E0000164F00001650000016510000
+16510000165200001653000017540000175500001756000015590000125F00
+000E6401010B6A02020770040304770804027E0E030187140100901C000097
+2600009C340000A2460000A65B0000AC710000AA900000AACE0000ACDB0000
+ACDB0000ACDB0000ACDB0000ACDB0017560000175600001756000017570000
+17590000175A0000175B0000175C0000175D0000175D0000175E0000175F00
+0016620000136900000F7000000C770101097F010105860102028F0302009B
+070100AC0C0000C2150000D9200000ED310000F64C0000FC640000FE830000
+FED30000F7FF0000F7FF0000F8FF0000F8FF0000F8FF001760000017600000
+17600000176100001762000017630000176400001765000017650000176500
+00176500001765000016680000136F0000107600000D7D00000A850000078D
+00000396000101A1030000B4080000CF100000EA1B0000FF290000FF470000
+FF5E0000FF7D0000FFB20000FFFF0000FFFF0000FFFF0000FFFF0000FFFF00
+17650000176500001765000017650000176500001765000017650000176500
+001765000017650000176500001765000016680000136F0000107600000D7D
+00000A850000078C00000395000101A1020000B3070000CD0F0000E81A0000
+FF270000FF440000FF5B0000FF780000FF9C0000FFFF0000FFFF0000FFFF00
+00FFFF0000FFFF001765000017650000176500001765000017650000176500
+0017650000176500001765000017650000176500001765000016680000136F
+0000107600000D7D00000A840000078C00000395000101A0020000B1070000
+CB0E0000E6190000FD260000FF400000FF580000FF720000FF8F0000FFF900
+00FFFF0000FFFF0000FFFF0000FFFF00>
+<3F000C003F000C003F000C003F000C0040000C0040000C0041000C0041000C
+0041000C0042000C0042000C0042000C0043000E004200140044001A004600
+210049002A004B0036004F004300540052005700610058006F0057007E0056
+008D0056009F005700B6005700B7005700B7005700B7005700B7005700B700
+5700B7005700B70040000C0040000C0040000C0041000C0041000C0041000C
+0042000C0042000C0043000C0043000C0043000C0044000C0044000D004400
+140045001A00470021004A002A004C00360050004300540051005800600059
+006F0059007D0057008C0057009F005800B8005800B8005800B8005800B800
+5800B8005800B8005800B8005800B80042000C0042000C0042000C0042000C
+0042000C0043000C0043000C0044000C0044000C0045000B0045000B004500
+0B0045000D004500140046001A00480021004B002A004D0035005100420055
+00510059005F005A006E005A007D0059008C0058009F005900B9005900B900
+5900BA005900BA005900BA005900BA005900BA005900BA0043000C0043000C
+0043000C0043000C0044000C0044000B0045000B0045000B0046000B004600
+0B0046000B0047000B0047000D004600130047001A004A0021004C002A004F
+00350052004200560050005A005F005C006D005B007C005A008B0059009E00
+5A00BB005A00BB005A00BB005A00BB005A00BB005A00BB005A00BB005A00BB
+0045000B0045000B0045000B0045000B0045000B0046000B0046000B004700
+0B0047000B0047000B0048000A0048000A0048000C0048001300490019004B
+0021004E002A00500035005300410058004F005B005E005D006C005C007B00
+5B008B005B009E005B00BB005C00BD005C00BD005C00BD005C00BD005C00BD
+005C00BD005C00BD0046000B0046000B0046000B0046000B0047000B004700
+0B0048000A0048000A0049000A0049000A0049000A004A000A004A000C0049
+0012004A0019004C0020004F002900510034005500410059004F005C005D00
+5E006C005E007B005D008A005C009E005D00BB005D00BF005D00BF005D00C0
+005D00C0005D00C0005D00C0005D00C00048000A0048000A0048000A004800
+0A0049000A0049000A0049000A004A000A004A000A004B0009004B0009004B
+0009004B000B004B0012004C0019004E002000510029005300340056004000
+5A004E005E005C0060006B005F007A005E0089005E009E005E00BB005F00C2
+005F00C2005F00C2005F00C2005F00C2005F00C2005F00C2004A000A004A00
+0A004A000A004A000A004A000A004B0009004B0009004C0009004C0009004C
+0009004D0009004D0008004D000A004D0011004D0018004F00200052002900
+55003400570040005C004D005F005B0061006A0061007900600089005F009D
+006000BC005E00C3005D00C3005C00C3005B00C3005A00C3005900C2005900
+C2004C0009004C0009004C0009004C0009004C0009004D0009004D0008004E
+0008004E0008004E0008004F0008004F0008004F0009004F0011004F001800
+51002000540028005700330059003F005D004C0061005A00610068005D0077
+005A008600560098005400B7005300C4005100C4005000C3004F00C3004F00
+C3004E00C3004E00C2004D0008004D0008004D0008004E0008004E0008004F
+0008004F000800500008005000070050000700510007005100070051000800
+510010005100170053001F00560028005800320058003D0057004900550056
+0054006400520073004F0082004B0094004900B2004800C3004700C3004600
+C2004500C2004500C1004400C1004400C10050000800500008005000080050
+00070050000700510007005100070052000700520006005300060053000600
+530006005300070053000F005300160055001E00520025004F012D014C0237
+024A014302490150014801600146016F0143007E00410090003F00AD003E00
+BF003D00BF003C00BE003C00BE003B00BE003B00BE003B00BE005200060052
+00060052000600520006005300060053000600540006005400050054000500
+5500050055000500560004005600060055000E00500014014B011A02470220
+0244032803400332043E033E043C024A043B025B0439026B0337027B033602
+8D023501A8013401BC013401BB013301BB013201BB013201BB013101BB0131
+01BB0154000500540005005400050054000500550005005600040056000400
+5600040057000400570003005800030058000300530003004D010A01460210
+03400316043C041D053704240634052D0632053906300546062E0455072C04
+65062B0475062B0388042B03A3032B03B9032A03B8032903B8032903B70428
+03B7042803B7042803B7045700040057000400570004005700040058000300
+5800030059000300590002005A0002005A00020058000100510101004C0201
+00440205043C040C0635051307300619082C0621092906290A2607340A2407
+410A2307500A21075F0A20066F0A2006830821059C072105B4072005B30720
+05B3071F06B3071F06B2081F06B2081E06B2085A0002005A0002005A000200
+5A0002005B0002005B0001005C0001005C0001005D00010056010000500300
+004B050000450600003B060305320608092B070F0B2508160C22081D0D1F08
+260E1C09300F1A093C0F180A4B0F170A5A0F16096A0F15097C0E1608940C17
+08AD0B1608AD0B1608AC0C1509AC0C1509AB0C1509AB0C1409AB0C5D000100
+5D0001005D0001005D0001005E0101005F010100600101005F010000560300
+004F05000049070000430900003C0A0000320A0204290A060A220A0C0D1C0A
+1210180A1A11140B2212120C2B12100D37120F0E45120F0E55110E0F65110E
+0E77100E0E8E0E0F0DA80D0E0EA70D0E0EA70D0D0EA70D0D0EA70D0D0FA60D
+0D0FA60D6202000062020000620200006202000063020000640200005F0300
+00550600004E080000460A0000400B0000390D0000330E0000290E0204220E
+06091C0E0A0D150D0F11100F17120F1120110E1229100D14350F0D15440E0C
+16530D0B16630D0A16740C0A158A0B0A15A50B0A15A50A0A15A50A0916A50A
+0916A40A0916A40A0916A40A67030000670300006703000067030000680400
+005F060000550800004C0A0000440C00003C0E0000350F00002F1000002911
+0000221202041C1305081613090C0F130E100D15170F0B171F0E0B19290C0A
+1B350B0A1C430A091D520A081D6109071D7209071D8708071CA307071DA307
+061DA207061DA206061DA206061EA206061EA2066D0500006D0500006D0500
+006D05000060080000540B00004A0D0000410F000038100000311200002B13
+000026140000231500001D170203171705071118080B0B190E0D0A1B160B09
+1D1F0A0720290807213507062343060524500604245F050424700503248304
+03239E0303239E0303249E0303249E0303249D0303249D0302249D03620A00
+00620A0000620A00005F0B0000520D0000471000003D110000341300002D14
+00002715000024170000211800001E1A0000191C0101121D03050C1D070908
+1F0E090721160705241E060426280503283503022A4202022B4F02012C5D01
+012C6D01012B80010129980101289C0101289C0101289C0101289C0101299C
+0101299C0154100000541000005410000051100000451200003A1400003115
+00002A17000025180000211A00001F1C00001C1D0000191F0000142100000D
+2203040722070605250E0503291603022B1E03022D2702012E340101304001
+01314E0101325C0101326C0101317F01012E9701012D9F01012D9F01012D9F
+01012D9F01012D9F01012D9F01451400004514000045140000431500003716
+00002E180000281A0000231C0000201E00001D2000001A2200001723000015
+2400000E2600000727020305280704032B0E04032E1603022F1D0302312502
+0233310201353E0101364C0101375B0101386B0101377E01003495000033A3
+000033A3000033A3000033A3000033A3000033A30037190000371900003719
+0000341900002C1B0000261E0000222000001E2200001B2400001826000014
+27000012290000112900000D2A0000082B0203052C0604042F0D0403331503
+02361C030237240202392E02013B3B01013D4A01013F5A0101406A01003F7C
+00003C9400003AA600003AA600003AA600003AA600003AA600003AA6002C1E
+00002C1E00002C1E00002A1F000025220000212500001C2700001829000015
+2B0000112C0000112D0000112D0000122E00000E2F00000A30010205310505
+04350B0403391303023D1B02023E220202402B020142380101444701014758
+010049690000487B00004592000044AB000044AB000044AB000044AB000044
+AB000044AB00252600002526000025260000242700001F2A00001A2D000016
+2F00001230000012310000123200001232000012330000123300000F350000
+0B36010106370404043B0A0503401204024519020247210201492902014A35
+01014D4401005155000054670000547A0000529000004FAF00004FAF000050
+AF000050AF000050B0000050B0001E2F00001E2F00001E2F00001D30000018
+32000013340000133500001336000013370000133700001338000013380000
+13390000103B00000C3D0101073E03040542080504481004034E180302531F
+02015427020155320100573F00005C5100006065000061780000608E00005D
+B500005DB500005DB500005DB500005DB500005EB500173800001738000017
+38000016380000143A0000143B0000143C0000143D0000143D0000143E0000
+143F0000143F000014400000114300000E46010109480203054C070504520E
+0403591603025E1E020162260201632F0100643C00006A4D00006E61000070
+7400006F8B00006DB700006DBC00006DBC00006DBC00006DBC00006DBC0014
+40000014400000144000001440000015410000154200001543000015440000
+1545000015460000154700001547000015480000124C00000F5000010B5402
+0207570504055D0C0504651404026B1C030170230100732B0000763800007A
+4900007F5B0000807000007F8900007EB400007EC600007EC600007EC60000
+7EC600007EC60015490000154900001549000015490000164A0000164B0000
+164C0000164D0000164E0000164F0000164F00001650000016510000145600
+00105B00000C60010208650403056A080403720F040279160201811D010086
+2500008B3100008F42000093550000976900009684000094B0000096D20000
+96D2000096D2000096D2000096D30016520000165200001652000016520000
+16530000175400001755000017560000175700001758000017590000175A00
+00175B000014600000116600000E6D01010A730102067A030303810603018A
+0B020094100000A2170000AE230000B7330000BF480000C95F0000CE7A0000
+CCA50000CAEB0000CBEC0000CBEC0000CCEC0000CCEC00175C0000175C0000
+175C0000175C0000175D0000175E0000176000001760000017610000176200
+00176300001764000017650000156B0000127200000F7900000C8000000988
+000005900000029A010100A8040000C00A0000DB150000F5210000FF380000
+FF530000FF6F0000FF900000FFFF0000FFFF0000FFFF0000FFFF0000FFFF00
+17650000176500001765000017650000176500001765000017650000176500
+001765000017650000176500001765000017650000156B0000127200000F79
+00000C80000009880000059000000299010100A7040000BE0A0000D9140000
+F3200000FF340000FF500000FF6A0000FF890000FFF60000FFFF0000FFFF00
+00FFFF0000FFFF001765000017650000176500001765000017650000176500
+0017650000176500001765000017650000176500001765000017650000156A
+0000127100000F7800000C80000009870000068F00000299000100A6040000
+BC090000D7130000F01F0000FF310000FF4D0000FF660000FF840000FFDC00
+00FFFF0000FFFF0000FFFF0000FFFF00>
+<3A000D003A000D003A000D003A000D003A000D003A000D003A000D003A000D
+003A000D003B000D003B000D003B000D003B000D003C0011003C0017003F00
+1D00410025004400300048003D004C004B0050005B0052006A005200780051
+008700500097005000AB005100B1005100B1005100B1005100B1005100B100
+5100B1005100B1003A000D003A000D003A000D003A000D003A000D003A000D
+003B000D003B000D003C000D003C000D003C000D003D000D003D000D003D00
+11003E00170040001D004300250045002F0049003D004D004B0051005A0053
+0069005300780052008600510096005100AB005200B2005200B2005200B200
+5200B2005200B2005200B2005200B2003B000D003B000D003B000D003B000D
+003B000D003C000D003C000D003D000D003D000D003D000D003E000D003E00
+0D003E000D003E0011003F00170041001D004400250046002F0049003C004E
+004A0052005900540068005400770053008600520096005200AB005300B300
+5300B3005300B3005300B3005300B3005300B3005300B3003C000D003C000D
+003C000D003C000D003D000D003D000D003E000D003E000D003E000D003F00
+0C003F000C0040000C0040000C00400011004000170042001D004500250047
+002F004B003C004F004A005300590055006800550076005400850053009500
+5400AA005400B4005400B4005400B4005400B4005500B4005500B4005500B4
+003E000D003E000D003E000D003E000D003E000D003F000C003F000C004000
+0C0040000C0040000C0041000C0041000C0041000C00410010004200160044
+001D004600250049002E004C003B0050004900540058005700670057007600
+56008500550095005500AA005600B6005600B6005600B6005600B6005600B6
+005600B6005600B60040000C0040000C0040000C0040000C0040000C004100
+0C0041000C0041000C0042000C0042000C0043000C0043000C0043000C0043
+0010004300160045001D00480024004A002E004D003B005100490055005700
+580066005800750058008400560094005600A9005700B7005700B7005700B7
+005700B7005700B7005700B7005700B70042000C0042000C0042000C004200
+0C0042000C0042000C0043000C0043000C0044000C0044000C0044000B0045
+000B0045000B00450010004500160047001C00490024004C002E004F003A00
+5300480057005600590065005A00740059008300580094005800AA005900B9
+005900B9005900B9005900B9005900B9005900B9005900B90043000C004300
+0C0043000C0043000C0044000C0044000C0045000B0045000B0046000B0046
+000B0046000B0047000B0047000B0047000F004700160048001C004B002400
+4D002E0050003A0054004700580055005B0064005B0073005B008200590093
+005700AA005500BC005400BC005200BC005100BC005100BB005000BB005000
+BB0046000B0046000B0046000B0046000B0046000B0046000B0047000B0047
+000B0048000B0048000A0048000A0049000A0049000A0049000E0049001500
+4A001C004D0024004F002D0052003900550046005800540057006200550071
+00520080004E0090004C00A8004B00BF004900BE004800BE004700BE004700
+BE004600BE004600BE0048000B0048000B0048000B0048000B0048000A0048
+000A0049000A0049000A004A000A004A000A004A000A004B0009004B000900
+4B000E004B0015004C001C004E00230051002D004E0036004D0042004C004F
+004B005E004A006D0047007C0044008C004200A4004100C0004000C0003F00
+BF003E00BF003D00BF003D00BF003D00BF004A000A004A000A004A000A004A
+000A004A000A004A0009004B0009004B0009004C0009004C0009004D000900
+4D0009004D0008004D000D004D0014004C001B004900200046012601420130
+0141013C01400148013F0058013E0069013C007800390088003800A0003800
+BE003700BE003600BE003500BE003500BE003400BE003400BD004C0009004C
+0009004C0009004C0009004C0009004D0009004D0008004E0008004E000800
+4E0008004F0008004F000800500008004E000C0048001100420117013E011C
+023B01220237022B0334023703330244033202530231016302300173022E01
+84012E009B012E00B9002D00B9002D00B8002C00B8002B00B8002B00B7002B
+00B7004E0008004E0008004E0008004E0008004F0008004F00080050000700
+50000700510007005100070051000700520007004B000500450007013F020D
+023902130334031904300320052C0428052A0433052804400526044E052503
+5E0525036D0525037F03250296022601B4022502B4022402B3022302B30223
+02B3022302B2022202B2025100070051000700510007005100070051000700
+52000600520006005300060053000600540005004F00040049010300450102
+003B020303340309052E040F062A04160726051E0823052609210530091F06
+3C091D064A091C0659091B0568081B057A071C048F061D04AF051C04AE051B
+04AD061B04AD061A04AD061A04AC061A04AC06540005005400050054000500
+5400050054000500550005005500050056000400550004004D000200480201
+00400300013B040000330502032B05060725060C092106140A1D061B0C1A07
+230D18072C0D1508380E1408450D1309540D1208630D1108740C1207880B13
+06A7091207A7091207A60A1107A60A1107A50A1107A50A1007A50A57000400
+570004005700040057000400570004005800030058000300530002004C0201
+00450300003F05000039070000340800002C090102240805071E080A0B1908
+100D1509180F110A20100F0B29100D0C330F0C0D400F0C0D4F0E0B0D5F0E0B
+0D6F0D0B0D830C0B0C9E0B0B0CA10A0B0DA10A0A0DA00A0A0DA00A0A0DA00A
+0A0DA00A5A0002005A0002005A0002005A0002005A0002005B000100520100
+004B030000440600003D08000036090000300B00002B0C0000250D01021E0C
+0407180C090B120C0E0F0E0D160F0C0F1E0E0B11260D0A12310C0A143E0B09
+144D0A08145C0A08146D0A07147F090713980807149E0807149D0707149D07
+06149D0706159D0706159D075E0101005E0101005E0101005E0101005D0100
+00520300004A060000420800003A0A0000330C00002C0D0000270F00002310
+00001F100102191104061311080A0D110D0E0A13150D09151D0B0817260907
+183108071A3E07061A4C07051B5A06051B6A06041B7C05041A9304041B9A04
+041B9A04031B9904031B9904031B9903031C99035904000059040000590400
+00590400005306000049090000400B0000370D00002F0E0000291000002411
+0000211200001E1300001A140102141503050E16060909160C0A0719140906
+1B1C07051D2506041E310403203E0403204B03022158020121680201217901
+01208D010120970101209701012097010120970101209701012097014E0A00
+004E0A00004E0A00004E0A0000480B00003E0D0000340F00002C1100002612
+0000221400001E1500001B17000019180000151900010F1B0203091B050706
+1C0C06041E130503201B03022325020124310201253D010125490101255701
+012666010125780101248C0101239901012399010123990101249901012499
+0101249901410F0000410F0000410F0000410F00003B100000311200002913
+000024150000201700001C180000191A0000171B0000141D0000101E00000A
+1F0102051F050404210C030323130303241A030226240201282F0201293C01
+012A4801012A5501012B6501012A760101288B0101279C0101279C0101279C
+0101279C0101279C0101279C01331300003313000033130000331300002E14
+000026160000221800001E1A00001A1C0000171E0000141F0000122000000F
+2100000D220000092201010522040404240B040327120303281903022A2203
+022C2D02012E3901012F4601013054010131640101307501012E8A01012C9F
+01012C9F01012C9F01012C9F01012C9F01012C9F0128180000281800002818
+00002818000025190000201C00001C1E00001920000015220000122300000F
+24000010250000102500000E2500000A2601010626040404280A04032C1103
+032E19030230200302322A0201333601013544010136530101376301013774
+01003588000032A2000032A2000032A2000032A2000032A2000032A200221E
+0000221E0000221E0000221E00001F2000001B220000172400001326000010
+270000102800001028000011290000112900000F2A00000B2B0101072B0304
+052D0805033110040234180302361F030238270202393301013B4101013D50
+01013F6101013F7301003D8700003AA600003AA600003AA600003AA600003A
+A600003AA6001C2600001C2600001C2600001C260000192700001429000011
+2B0000112B0000112C0000112D0000112D0000112D0000122E0000102F0000
+0C300000083102030532070504370E04023C1603023E1E02023F2502024130
+0201433E0101464E010049600100497200004885000044A7000044AB000044
+AB000045AB000045AB000045AB00152E0000152E0000152E0000152E000012
+2F000012300000123000001231000012310000123200001233000012330000
+13340000113500000E3600000937020205390505043E0C040344140302481C
+02024A2302014B2D02014D3A0101504B0100545D0000567000005584000052
+A4000051B0000052B0000052B0000052B0000052B000133400001334000013
+34000013340000133500001336000013360000133700001338000013380000
+13390000133A0000143A0000133B00000F3E00000B4001020641040604460A
+05034D130402531A030156220201582B0101593601005C4600006159000064
+6D00006481000062A0000061B7000061B7000061B7000061B7000061B70014
+3B0000143B0000143B0000143B0000143C0000143D0000143E0000143E0000
+143F00001440000014410000154100001542000014430000104700000D4A01
+01084D03040552090504581104035F1903026420020167280100693300006C
+4200007154000074680000747E0000749D000072BF000072BF000072BF0000
+72BF000072BF00154400001544000015440000154400001544000015450000
+15460000154700001548000015490000164A0000164A0000164B0000154D00
+00125200000E5601010A5A0303065E060504650D04036D160302731D020178
+2401007C2E00007F3D0000834F000087620000887A0000869C000086CB0000
+86CB000086CB000087CB000087CB00164D0000164D0000164D0000164D0000
+164E0000164F00001650000016510000165200001653000016530000175400
+001755000016570000135D00000F6200010C680202086D030304740704037C
+0D0301841301008D1B0000942400009A3200009F450000A45A0000A9710000
+A7940000A9DA0000A9DA0000AADA0000AADA0000AADA001757000017570000
+17570000175700001758000017590000175A0000175B0000175C0000175D00
+00175E0000175F0000176000001761000014680000106F00000D7700000A7E
+010106860101038F0202019A050100AB090000C4110000DF1D0000FA2B0000
+FF490000FF620000FF840000FFEB0000FEFF0000FEFF0000FFFF0000FFFF00
+17620000176200001762000017620000176300001764000017650000176500
+00176500001765000017650000176500001765000017660000146D00001174
+00000E7B00000B830000088B000004930001019E020100B0060000CA0E0000
+E7190000FF270000FF450000FF5E0000FF7E0000FFCD0000FFFF0000FFFF00
+00FFFF0000FFFF001765000017650000176500001765000017650000176500
+00176500001765000017650000176500001765000017650000176500001766
+0000146D0000117400000E7B00000B830000088A000004930000019E020100
+AE060000C80D0000E5180000FC250000FF410000FF5A0000FF790000FFA800
+00FFFF0000FFFF0000FFFF0000FFFF00>
+<3A000D003A000D003A000D003A000D003A000D003A000D003A000D003A000D
+003A000D003A000D003A000D003A000D003A000D003A000E003A0014003B00
+1A003E0020004000290043003600480044004C0053004E0064004F0072004E
+0081004D0090004D00A2004E00AE004E00AE004E00AE004E00AE004E00AE00
+4E00AE004E00AE003A000D003A000D003A000D003A000D003A000D003A000D
+003A000D003A000D003A000D003A000D003A000D003A000D003A000D003A00
+0E003A0014003B001A003E0020004000290043003600480044004C0053004E
+0063004F0072004E0081004D008F004D00A1004E00AE004E00AE004E00AE00
+4E00AE004E00AE004E00AE004E00AE003A000D003A000D003A000D003A000D
+003A000D003A000D003A000D003A000D003A000D003A000D003A000D003A00
+0D003A000D003A000E003A0014003B001A003E002000400029004300360047
+0043004C0053004E0063004F0072004E0080004D008F004D00A0004E00AE00
+4E00AE004E00AE004E00AE004E00AE004E00AE004E00AE003A000D003A000D
+003A000D003A000D003A000D003A000D003A000D003A000D003A000D003A00
+0D003A000D003A000D003A000D003A000E003A0014003B001A003E00200040
+00290043003600480043004C0052004F006200500071004F0080004E008E00
+4E00A0004F00AF004F00AF004F00AF004F00AF004F00AF004F00AF004F00AF
+003A000D003A000D003A000D003A000D003A000D003A000D003A000D003A00
+0D003A000D003A000D003A000D003A000D003A000D003B000E003B0013003C
+0019003F0020004200290045003500490043004D0052005000620051007000
+50007F004F008E004F00A0005000B0005000B0005000B0005000B0005000B0
+005000B0005000B0003A000D003A000D003A000D003A000D003A000D003A00
+0D003A000D003A000D003B000D003B000D003C000D003C000D003C000D003C
+000D003C0013003E0019004000200043002800460035004A0042004E005100
+520061005300700052007F0051008E0050009F005100B1005100B1005100B2
+005200B2005200B2005200B2005200B2003B000D003B000D003B000D003B00
+0D003B000D003B000D003C000D003C000D003D000D003D000D003D000D003E
+000D003E000D003E000D003E0013003F00190042001F004500280047003400
+4B004100500050005300600054006F0054007E0053008D0052009F005300B3
+005300B3005300B3005300B3005300B3005200B3005100B4003D000D003D00
+0D003D000D003D000D003D000D003D000D003E000D003E000D003F000C003F
+000C003F000C0040000C0040000C0040000C00400013004100190044001F00
+46002800490033004D00410051004F0055005F0056006E0054007D0051008B
+004E009E004C00B7004B00B8004A00B8004900B7004800B7004700B7004700
+B8003F000C003F000C003F000C003F000C003F000C003F000C0040000C0040
+000C0041000C0041000C0042000C0042000C0042000C0043000C0042001200
+4300190045001F00480028004A0033004E0040004E004D004E005C004D006B
+004A007A004700890044009C004300BB004100BB004000BC004000BC003F00
+BC003E00BC003E00BC0041000C0041000C0041000C0041000C0041000C0042
+000C0042000C0043000C0043000C0043000C0044000C0044000C0045000B00
+45000B00440012004500180047001F004700260044002F0043003A00430047
+004300570042006800400077003D0086003A009B003A00BF003900BF003800
+BF003700BF003700BF003600BF003600BF0044000C0044000C0044000C0044
+000C0044000C0044000C0045000B0045000B0045000B0046000B0046000B00
+47000B0047000B0047000B0047001100430017003F001B003C00210039002A
+01370035013700420036005100350062003400720032008300310098003100
+BD003000BF003000BF002F00BF002F00BF002E00BF002E00BF0046000B0046
+000B0046000B0046000B0046000B0047000B0047000B0047000B0048000A00
+48000A0049000A0049000A0049000A00460009003F000E003A011301360119
+0132011F022F0127022D0132022B013E022A014C0129015C0128016C012801
+7E01270093002900B5002800BA002700B9002700B9002600B8002600B80026
+00B80049000A0049000A0049000A0049000A0049000A0049000A0049000A00
+4A000A004A000A004B0009004B00090049000800430007003E00050037010A
+0131020F032C02160329031D042603250425032F0423033B04210249041F02
+57041E0266041F0278031F018B012001AA012001B1011F01B1011F01B0011E
+01B0011E01AF011E01AF014B0009004B0009004B0009004B0009004B000900
+4C0009004C0009004D0009004D0009004D00080046000600410004003C0003
+01330102012D02070328030D052403130621041B071F0423071D042C071A04
+3707180545071705530716046207160472061703850518029F031802A80317
+02A8041603A7041603A7041603A6041503A6044E0008004E0008004E000800
+4E0008004E0008004E0008004F0008004F0008004C00060044000400400002
+0135010101300200012C0400002504040520040A071C0511091905190A1605
+210B14062A0C1107340C1007400B0F074E0C0E075D0C0D076C0B0D067F090F
+0596080F05A1070E05A0070D05A0080D069F080D069F080D069F0851000700
+5100070051000700510007005100070051000700520006004A000400440102
+003A020101340300012F0500002A06000026070000200703051A0708091507
+0F0B1107170D0E081F0D0C0A260D0A0B300D0A0B3C0C090C4A0B090D590B08
+0C680A080C7A09080B8F08080B9B08070B9B08070B9B08070C9A08070C9A07
+070C9A07540005005400050054000500540005005400050053000400490102
+004102010139040001330600002D07000028090000240A0000210B00001B0B
+0304150A07090F0A0C0C0B0C140D090D1C0C080F240A07112E0907123A0806
+12480706135607051365070512760604128A05041297050412960504139604
+04139604041396040313950450000200500002005000020050000200500002
+00490201003F04000038060000300800002A0A0000250B0000210D00001E0E
+00001B0F0000160F0304100F06080A0F0B0B0811130A06131B080515230704
+162D0504173A04031847040318540402186303021873020119860201199201
+01199201011992010119920101199201011992014704000047040000470400
+0047040000470400003F060000360900002E0B0000270C0000220E00001F0F
+00001B1000001911000016130000111402030B14050606150A080516120603
+181A04021A2203011C2E02011C3A01011D4602011D5302011C6102011C7201
+011C8401011C9401011C9401011C9401011C9401011C9401011C94013D0900
+003D0900003D0900003D0900003D090000330B00002B0D0000250F00002010
+00001C120000191300001715000014160000121700000C1801010618040403
+1A0A03031B1103021C1803021D2102011F2C02011F38020120440201205102
+0120600201207001011F8301011F9601011F9601011F9601011F9601011F96
+01011F9601300E0000300E0000300E0000300E0000300E0000281000002212
+00001E1300001A1500001717000014180000121900000F1A00000D1B000009
+1C0101051B0303031D0904031E1003031F170302201F0302222A0201233701
+012443010124500201245E0201246F01012382010122980101229801012298
+01012298010122980101229801251300002513000025130000251300002513
+0000211400001C16000019180000151A0000121C00000F1D00000D1E00000D
+1E00000E1E00000A1E0000061E0303041F080403220F030322160302241E03
+02262802012735010128410101294E0101295D0101296D010128810101269B
+0101269B0101269B0101269B0101269B0101269B011E1800001E1800001E18
+00001E1800001E1800001B1A0000171C0000131E0000101F00000E2000000E
+2000000E2100000E2100000F2100000C220000072102030522070403250E03
+0327150302281D03022B2602012C3201012E3F01012E4C01012F5B0101306C
+01012E7F01012C9901012B9E01012B9E01012B9E01012B9E01012C9E01191E
+0000191E0000191E0000191E0000191E000015200000112200000F2300000F
+2300000F2400000F2400000F24000010250000102500000D26000008260202
+0527060404290C04032D1403022E1C030230240202322F0201343C0101354A
+010136590101376A0101367E01003298000032A2000032A2000032A2000032
+A2000032A20013240000132400001324000013240000132400001026000010
+26000010270000102700001028000010280000112900001129000011290000
+0E2A00000A2B0102062C0504042F0B040333130302351B030237220202392B
+02013B3901013D4701013F580101406901003F7C00003C9600003AA600003B
+A600003BA700003BA700003BA700112A0000112A0000112A0000112A000011
+2A0000112B0000112B0000112C0000112C0000112D0000112D0000122E0000
+122E0000122F00000F3000000B310101073204040435090503391104023E19
+030240200202412802014335010146440101495501004B6800004A7B000048
+94000046AC000046AC000046AC000046AC000046AC00123000001230000012
+30000012300000123000001230000012310000123200001232000012330000
+13340000133400001335000013350000103700000C380101083A0204053C08
+0504420F0402481703024B1F02014D2602014E310101503F01005551000058
+650000597900005791000055B2000055B2000055B2000055B2000055B20013
+36000013360000133600001336000013360000133700001338000013390000
+13390000143A0000143B0000143B0000143C0000143D0000123F00000E4100
+010A43020305460605044C0D040353150302591D02015B2502015D2E01005E
+3B0000634D00006861000069750000688E000066B9000066B9000066B90000
+66B9000066B900143E0000143E0000143E0000143E0000143E0000143F0000
+14400000144100001542000015430000154400001544000015450000154600
+0013480000104C00000C5002020753040405590A050460130402671B03016C
+2202006E2B010071370000754800007A5B00007C7100007A8B000079C00000
+79C3000079C3000079C300007AC30015480000154800001548000015480000
+1548000015490000164A0000164B0000164C0000164D0000164E0000164E00
+00164F00001650000014530000115800000D5D01010962030305670704046E
+0E0402761603017D1C010083240000883000008C41000090540000946A0000
+9287000092BC000093D1000093D1000093D1000093D1001652000016520000
+16520000165200001652000016530000175400001755000017560000175700
+001758000017590000175A0000175B0000155F0000126500000F6B01010B72
+010107790203038004030288090200930E0000A1160000AE210000B8300000
+C1460000CB5E0000D27C0000CEB00000CDED0000CDEE0000CEEE0000CEEE00
+175E0000175E0000175E0000175E0000175E0000175F000017600000176100
+00176200001763000017640000176500001765000017650000166900001370
+0000107700000D7E00000A860000068E00000297000100A5030000BB090000
+D7130000F2200000FF350000FF530000FF700000FF9A0000FFFF0000FFFF00
+00FFFF0000FFFF001765000017650000176500001765000017650000176500
+00176500001765000017650000176500001765000017650000176500001765
+00001669000013700000107700000D7E00000A860000068E00000297000100
+A4030000B9090000D4120000EF1E0000FF310000FF4F0000FF6B0000FF8D00
+00FFFF0000FFFF0000FFFF0000FFFF00>
+<3A000D003A000D003A000D003A000D003A000D003A000D003A000D003A000D
+003A000D003A000D003A000D003A000D003A000D003A000D003A0010003A00
+16003C001C003F00240042002F0045003D004A004B004D005C004F006B004F
+007B004D008A004D009B004E00AE004E00AE004E00AE004E00AE004E00AE00
+4E00AE004E00AE003A000D003A000D003A000D003A000D003A000D003A000D
+003A000D003A000D003A000D003A000D003A000D003A000D003A000D003A00
+0D003A0010003A0016003C001C003F00240042002F0045003C004A004B004D
+005B004F006B004F007A004D0089004D009A004E00AE004E00AE004E00AE00
+4E00AE004E00AE004E00AE004E00AE003A000D003A000D003A000D003A000D
+003A000D003A000D003A000D003A000D003A000D003A000D003A000D003A00
+0D003A000D003A000D003A0010003A0016003C001C003F00240042002E0045
+003C0049004B004D005B004F006B004F007A004D0089004D009A004E00AE00
+4E00AE004E00AE004E00AE004E00AE004E00AE004E00AE003A000D003A000D
+003A000D003A000D003A000D003A000D003A000D003A000D003A000D003A00
+0D003A000D003A000D003A000D003A000D003A0010003A0016003C001C003F
+00240041002E0045003C0049004A004D005A004F006A004F007A004D008900
+4D0099004E00AE004E00AE004E00AE004E00AE004E00AE004E00AE004E00AE
+003A000D003A000D003A000D003A000D003A000D003A000D003A000D003A00
+0D003A000D003A000D003A000D003A000D003A000D003A000D003A0010003A
+0016003C001C003F00230041002E0045003C0049004A004D005A004F006A00
+4F0079004D0088004D0098004D00AD004E00AE004E00AE004E00AE004E00AE
+004E00AE004E00AE003A000D003A000D003A000D003A000D003A000D003A00
+0D003A000D003A000D003A000D003A000D003A000D003A000D003A000D003A
+000D003A0010003A0016003C001C003F00230041002E0045003B0049004A00
+4D005A004F0069004F0079004E0087004D0097004D00AC004E00AE004E00AE
+004E00AE004E00AE004E00AE004E00AE003A000D003A000D003A000D003A00
+0D003A000D003A000D003A000D003A000D003A000D003A000D003A000D003A
+000D003A000D003A000D003A0010003A0016003C001C003F00230041002E00
+45003B00490049004D0059004F0069004F0078004E0087004D0097004D00AB
+004D00AE004C00AF004A00AF004900B0004900B0004800B1003A000D003A00
+0D003A000D003A000D003A000D003A000D003A000D003A000D003A000D003A
+000D003A000D003A000D003A000D003A000D003A0010003A0016003C001C00
+3F00230042002D0045003B004A0049004E0058004F0068004C007700490085
+00460096004400B0004200B6004100B7004000B8004000B8003F00B9003F00
+B9003A000D003A000D003A000D003A000D003A000D003A000D003A000D003A
+000D003A000D003A000D003B000D003B000D003B000D003C000D003C001000
+3C0016003E001C004100230044002D00440039004500460045005400440065
+00420074003F0083003C0095003B00B3003A00BD003900BE003800BF003800
+BF003700BF003700C0003B000D003B000D003B000D003B000D003B000D003B
+000D003B000D003C000D003C000D003D000D003D000D003D000D003E000D00
+3E000D003E000F003E00150040001C003D0021003A00280039003400390041
+0039004F00380061003700710035008100330094003300B4003300C2003200
+C2003100C2003000C2003000C2003000C2003D000D003D000D003D000D003D
+000D003D000D003D000D003E000D003E000D003F000C003F000C003F000C00
+40000C0040000C0040000C003F000E003A0013003600180033001E00300025
+002F0030002E003C002D004B002C005B002B006B002A007D002A0091002B00
+B0002B00C1002A00C1002900C1002900C1002900C0002800C00040000C0040
+000C0040000C0040000C0040000C0040000C0040000C0041000C0041000C00
+42000C0042000C0042000C0043000C003D000A0037000B00320010002E0015
+012A011C012801240127012D01250139012300470022005500210065002100
+760022008B002300A9002300BC002300BB002200BB002100BA002100BA0021
+00B90042000C0042000C0042000C0042000C0042000C0043000C0043000C00
+44000C0044000C0044000B0045000B0040000A003A000800340006002E0007
+0029010D012601130223021A032102220320022B031E0236031B0243021A02
+52021901610219017102190184011B009E011B00B1001B00B0001A00AF001A
+00AF001900AE001900AE0045000B0045000B0045000B0045000B0045000B00
+45000B0046000B0046000B0047000B0045000A003E00080037000600310004
+002B0003012601040222020A031F0211041C0319051A03210618032A061603
+33061403400613034E0612035C0611036C0511027D04120293031301A60213
+02A5021202A4021202A3021102A3031102A20348000A0048000A0048000A00
+48000A0048000A0048000A0049000A0049000A00430008003B000600340004
+002D0102012801020125020101210302031C03080519041007150418081304
+2009100527090E05300A0C063C090B0649090A0657090A066608090576080A
+048A060B049C050A049B060A049B0609049A0609049A0609049A064B000900
+4B0009004B0009004B0009004B0009004B0009004A000800410006003A0004
+01300102012A0201012603010023040000200500001C060102170506061205
+0D090F06150A0B071D0B0908240A08092D0A070A3809060B4508060B530805
+0B6207050A7107050A840605099605050A9605040A9505040A9505040A9505
+040B94044B0007004B0007004B0007004B0007004B00070049000600400004
+00350102012E0201012904000024050000210600001E0800001B0900001809
+0102120905060C080A0A080A130A070C1A09060D2208050F2A060410360504
+1043040310500403105F0402106E0302108002021091020111900201119001
+011190010111900101128F0142010201420102014201020142010201420102
+0140010201340201012D04000027060000230800001F0900001C0A0000190C
+0000170D0000130D01020D0D0406080E0908060F1107041119050312200402
+142A03011536020115420101154F0201155D0101156C0101147E0101149001
+01149001011490010114900101149001011490013504000135040001350400
+013504000135040001330500002C07000026090000210A00001D0C00001A0D
+0000170E000014100000121100000F12010108120304041308050314100302
+15170201161F0201172902011834010118410201184D0201185B0201176B01
+01177C010117910101179101011791010117910101179101011792012C0900
+002C0900002C0900002C0900002C0900002A0A0000240B00001F0D00001B0F
+00001710000014110000121300000F1400000D1500000A1600000516020203
+16070303170E030218150302181D02011A2702011B3301011B3F02011B4C02
+011B5A02011B6901011B7B01011A9001011A9301011A9301011A9301011B93
+01011B9301230E0000230E0000230E0000230E0000230E0000220E00001D10
+00001911000015130000121500000F1600000C1700000B1800000B1800000B
+1800000618020203180604031A0D03021A1403021B1C03021D2602011E3202
+011E3E01011F4A02011F5802011F6701011E7A01011E8F01011E9501011E95
+01011E9501011E9501011E95011C1200001C1200001C1200001C1200001C12
+00001B1300001715000013170000101800000D1900000C1A00000C1A00000C
+1A00000C1B00000C1B0000081B0101041B0504031D0B03031D1203021F1A03
+022024020122300201223C010123490201235602012366010122780101228E
+01012198010121980101219801012198010121980116180000161800001618
+0000161800001618000015180000111A00000E1C00000D1C00000D1D00000D
+1D00000D1D00000D1D00000D1E00000D1E0000091E0101051E040404200A04
+03211203032219030224220202262E0201273A010128470101285501012864
+010128760101268C0101259B0101269B0101269B0101269B0101269B01101D
+0000101D0000101D0000101D0000101D00000F1E00000E1F00000E1F00000E
+1F00000E2000000E2000000E2000000E2100000E2100000E2100000A220000
+0521030404230904032610030327180302292003022B2B02012D3801012E45
+01012E5301012F6301012F7501012D8B01012B9E01012B9E01012B9E01012B
+9E01012B9E010F2200000F2200000F2200000F2200000F2200000F2200000F
+2200000F2300000F2300000F2300000F2400000F2400000F24000010250000
+0F2500000B2600000726030404280804032B0F03032E1703022F1F03023128
+020133340101344201013651010137610101377301003489000032A2000032
+A2000032A2000032A2000032A2001026000010260000102600001026000010
+26000010260000102600001027000010270000102800001028000011290000
+11290000112A0000112A00000D2B0000082C0203052D070504310E04033516
+0302371D0302382502023A3002013C3F01013F4E010141600101417201003F
+8800003CA700003CA700003CA700003CA700003CA700112B0000112B000011
+2B0000112B0000112B0000112B0000112C0000112D0000112D0000122E0000
+122E0000122F0000122F000012300000123000000E3200000A330102053405
+0504380C04033D140302411C020242230202442C0201463A0101494B01004C
+5D01004D7000004C86000049AC000049AD000049AD000049AD000049AD0012
+31000012310000123100001231000012310000123200001232000012330000
+133400001334000013350000133600001336000013370000133700000F3A00
+000B3B0101063C030504410A0503471204024D1A020250210201512A020152
+360100554600005A5A00005D6E00005D8300005AA8000059B300005AB30000
+5AB400005AB400133900001339000013390000133900001339000013390000
+143A0000143B0000143C0000143D0000143D0000143E0000143F0000143F00
+0014400000114300000D46010108480304054C080504531004035A1803025F
+2002016228010063320100664100006B5500006F6900006F8000006EA30000
+6CBC00006DBC00006DBC00006DBC0015420000154200001542000015420000
+15420000154200001543000015440000154500001546000015470000154800
+001549000015490000164A0000124E00000F5300010B570203065B05040561
+0C040369150402701D030175240100782E00007C3C0000804E000084630000
+847B000082A1000082C9000083C9000083C9000083C900164D0000164D0000
+164D0000164D0000164D0000164D0000164E0000164F000016500000165100
+001652000016530000165400001754000017550000145B0000106000000C66
+0102096C030305720604037A0C0301821302008B1A00009323000098310000
+9E440000A35A0000A8730000A59B0000A8D90000A8D90000A8D90000A9D900
+175800001758000017580000175800001758000017590000175A0000175B00
+00175C0000175D0000175E0000175F00001760000017600000176100001468
+0000116F00000E7700000B7E00000886000104900101019B020100AC060000
+C80D0000E6190000FF270000FF470000FF620000FF860000FFFF0000FFFF00
+00FFFF0000FFFF001765000017650000176500001765000017650000176500
+00176500001765000017650000176500001765000017650000176500001765
+000017650000156B0000127200000F7A00000C810000088900000591000001
+9C010100AB050000C60C0000E3180000FD250000FF430000FF5E0000FF8000
+00FFE70000FFFF0000FFFF0000FFFF00>
+<3A000D003A000D003A000D003A000D003A000D003A000D003A000D003A000D
+003A000D003A000D003A000D003A000D003A000D003A000D003A000D003A00
+13003B0019003D001F004000280043003500470043004C0053004E0064004F
+0074004E0084004D0094004D00A9004E00AE004E00AE004E00AE004E00AE00
+4E00AE004E00AE003A000D003A000D003A000D003A000D003A000D003A000D
+003A000D003A000D003A000D003A000D003A000D003A000D003A000D003A00
+0D003A000D003A0013003B0019003D001F004000280043003500470043004C
+0053004E0064004F0073004E0083004D0093004D00A8004E00AE004E00AE00
+4E00AE004E00AE004E00AE004E00AE003A000D003A000D003A000D003A000D
+003A000D003A000D003A000D003A000D003A000D003A000D003A000D003A00
+0D003A000D003A000D003A000D003A0013003B0019003D001F004000280043
+003500470043004C0053004E0064004F0073004E0083004D0093004D00A700
+4E00AE004E00AE004E00AE004E00AE004E00AE004E00AE003A000D003A000D
+003A000D003A000D003A000D003A000D003A000D003A000D003A000D003A00
+0D003A000D003A000D003A000D003A000D003A000D003A0013003B0019003D
+001F004000280043003500470043004B0052004E0063004F0073004E008200
+4D0092004D00A6004E00AE004E00AE004E00AE004E00AE004E00AE004E00AE
+003A000D003A000D003A000D003A000D003A000D003A000D003A000D003A00
+0D003A000D003A000D003A000D003A000D003A000D003A000D003A000D003A
+0013003B0019003D001F004000280043003400470042004B0052004E006300
+4F0072004E0082004D0091004D00A5004E00AE004E00AE004E00AE004E00AE
+004E00AE004E00AE003A000D003A000D003A000D003A000D003A000D003A00
+0D003A000D003A000D003A000D003A000D003A000D003A000D003A000D003A
+000D003A000D003A0013003B0019003D001F00400027004300340047004200
+4B0051004E0062004F0072004E0081004D0091004D00A4004E00AE004E00AE
+004E00AE004E00AE004E00AE004E00AE003A000D003A000D003A000D003A00
+0D003A000D003A000D003A000D003A000D003A000D003A000D003A000D003A
+000D003A000D003A000D003A000D003A0012003B0018003D001F0040002700
+43003400470042004B0051004E0062004F0071004E0081004D0090004B00A4
+004A00B0004800B1004700B2004600B2004500B3004400B3003A000D003A00
+0D003A000D003A000D003A000D003A000D003A000D003A000D003A000D003A
+000D003A000D003A000D003A000D003A000D003A000D003A0012003A001800
+3D001F004000270043003300470041004B0050004A0061004800700045007F
+0041008F003F00A6003E00B8003C00B9003C00BA003B00BB003A00BC003A00
+BC003A000D003A000D003A000D003A000D003A000D003A000D003A000D003A
+000D003A000D003A000D003A000D003A000D003A000D003A000D003A000D00
+3A0012003A0018003D001E003F0027003D0031003D003E003E004C003D005E
+003C006E0039007D0036008E003500A9003500C1003400C1003300C2003200
+C2003200C2003100C3003A000D003A000D003A000D003A000D003A000D003A
+000D003A000D003A000D003A000D003A000D003A000D003A000D003A000D00
+3A000D003A000D003A0012003800170035001D003200240031002E0031003B
+003000490030005A002E006A002D007B002C008E002C00AA002D00C5002C00
+C5002B00C5002B00C5002A00C5002A00C5003A000D003A000D003A000D003A
+000D003A000D003A000D003A000D003A000D003A000D003A000D003A000D00
+3A000D003A000D003A000D0037000C00320010002E0015002B001B00290022
+0028002B00270037002500460024005600230065002300770023008B002400
+A7002600C4002500C3002400C3002400C3002300C3002300C3003A000D003A
+000D003A000D003A000D003A000D003A000D003A000D003A000D003A000D00
+3B000D003B000D003C000D0039000C0034000A002F0009002A000D00270012
+00240019002200210122002A00200034001E0042001C0051001B0061001B00
+71001B0085001D00A0001F00BE001E00BD001D00BC001D00BB001C00BB001C
+00BA003C000D003C000D003C000D003C000D003C000D003C000D003C000D00
+3D000D003D000D003E000D003D000C0037000A00310009002B000700270006
+0024000A01210111011E0119021C0121021B0129021A01320117013F011501
+4D0214015C0114016B0114007D00150094001700B1001600B0001600AF0015
+00AE001500AD001400AD003F000C003F000C003F000C003F000C003F000C00
+3F000C003F000C0040000C0040000C003B000B00340009002E000700280006
+0024000500210004011E0108021B0110031802170316021F04150227041302
+300410023C040F0249040E0257040D0266030D0276030E0189020F01A2010E
+01A1010E01A0010D01A0010D019F010D019F0142000C0042000C0042000C00
+42000C0042000C0042000C0042000C0041000B003A000900310007002A0005
+0026000400210103011E0102021C0102021902060315020E05120316051003
+1E060D0325070B042D07090438070804440707055206070461060604700506
+03800507039904070398040603970406039704050397040503970445000B00
+45000B0045000B0045000B0045000B0045000B0040000A00370007002E0005
+0028000300230102011F0102021D0201011A03010118040101140404040F04
+0B070C04140809051B080706220705072A07040834060409410503094E0503
+095D0403096B0402097B030208900302089102020991020209900201099002
+010990013B0006003B0006003B0006003B0006003B0006003B000600360005
+002C00030126010201210201011E0301011B05010119060000160700001408
+0001100703040906070906081108050A1906030B2005020C2803020D320201
+0E3F02010E4B01010E5901010E6801010D7801010D8B01010D8E01010D8E01
+010D8E01010D8E01010D8E012E0102012E0102012E0102012E0102012E0102
+012E0102012A02020125030101200400001D0600001A070000170800001409
+0001120A01010F0B00010B0C0303050C0806030D1004020F1703010F1E0201
+1027010111310101113D0101114A01011057010110660101107601010F8901
+010F8F01010F8F0101108F0101108F0101108F012604000026040000260400
+00260400002604000026040000240500001F0700001B080000180A0000150B
+0001120C00010F0E00010D0F00000B100000051001020310060302110E0302
+11150201121D02011326010114300101143C01011348010113560101136501
+01137501011388010113900101139001011390010113900101139001200800
+0020080000200800002008000020080000200800001E090000190B0000160C
+0001120E00010F1000000D1100000A12000009130000091300000713010103
+13050303130C030214130302141B020115240201162E0101163A0101164602
+01165402011663010116740101168701011691010116910101169101011691
+01011691011A0D00001A0D00001A0D00001A0D00001A0D00001A0D0000180E
+000014100000101100000D1300000A1400000A1400000A1500000A1500000A
+150000081501010415040303160A0302161103021719020218220201192C02
+011A3801011A4502011A5202011A6102011972010119850101199301011993
+01011993010119930101199301141200001412000014120000141200001412
+000014120000121300000E1500000B1600000B1600000B1700000B1700000B
+1700000B1700000B18000009180101051703030318090303191003021A1703
+021B2002011D2B02011D3701011E4302011E5102011E5F02011D7001011D84
+01011D9501011D9501011D9501011D9501011D95010E1700000E1700000E17
+00000E1700000E1700000E1700000C1800000C1800000C1900000C1900000C
+1900000C1A00000C1A00000C1A00000C1A00000A1A0001061A0303031B0804
+031C0E03031D1603021F1E0302202902012135020122420101224F0201225D
+0201226E010121830101219701012197010121970101219701012197010C1B
+00000C1B00000C1B00000C1B00000C1B00000C1B00000C1B00000D1B00000D
+1C00000D1C00000D1C00000D1D00000D1D00000D1D00000D1D00000B1E0000
+071D0203041E060403200D030321140302231C030225270201263302012740
+0101274D0101285C0101286D010127810101259A0101259A0101259A010125
+9A0101259A010E1E00000E1E00000E1E00000E1E00000E1E00000E1E00000E
+1E00000E1F00000E1F00000E1F00000E2000000E2000000E2000000E210000
+0F2100000D210000082101020522060404240C040327130303281B03022A24
+02012C3102012D3D01012E4B01012F5A01012F6B01012E8001012B9C01012B
+9E01012B9E01012B9E01012B9E010F2200000F2200000F2200000F2200000F
+2200000F2200000F2200000F2300000F2300000F2400000F2400000F240000
+1025000010250000102500000E2600000A2701010627040404290B04032D12
+03022F1A030231220202332C02013439010136480101375801013869010137
+7E0100339A000033A3000033A3000033A3000033A300102700001027000010
+27000010270000102700001027000010270000102800001028000011290000
+11290000112A0000112A0000112A0000112B00000F2C00000B2D0101072E03
+0404300905033410030237180302392002023B2902013D3501013F44010141
+55010143680100427C00003F9800003EA800003EA800003EA800003EA80011
+2D0000112D0000112D0000112D0000112D0000112D0000112D0000122E0000
+122E0000122F00001230000012300000123100001231000012320000113300
+000D3400010835020305370705043C0E040242160302451E02024626020148
+3101014A4001014E52010051660000517A00004E9500004DAE00004DAE0000
+4DAE00004DAE00133400001334000013340000133400001334000013340000
+13340000133500001336000013360000133700001338000013380000133900
+00133A0000123B00000E3D00000A3F02020541050604460C05034E14030253
+1C020155240201572E0100583B01005D4D0000626200006377000062920100
+5FB600005FB600005FB6000060B600143C0000143C0000143C0000143C0000
+143C0000143C0000143D0000143E0000143F00001440000014400000144100
+0015420000154300001543000014450000104900000C4C0102084F04040554
+0905045B120403621A0301672202016A2A01006C37000070480000755C0000
+77720000768F000074C0000075C0000075C0000075C1001547000015470000
+154700001547000015470000154700001547000015490000164A0000164B00
+00164C0000164C0000164D0000164E0000164F000015510000125600000E5B
+01010A5F030306640604046B0D0403731503017B1C010081240000852F0000
+894000008D540000916B00008F8A000090CE000090D0000090D0000090D000
+16530000165300001653000016530000165300001653000016530000175500
+0017560000175700001758000017590000175A0000175A0000175B0000165D
+000013640000106A00000C71010108780202047F03030288070200920C0100
+A1130000AF1E0000BB2D0000C5440000D15E0000D87E0000D1C50000D2F100
+00D2F20000D3F2001760000017600000176000001760000017600000176000
+00176000001762000017630000176400001765000017650000176500001765
+00001765000017670000136E0000107500000D7D00000A840000078C000003
+95000101A2030000B7080000D3120000EF1E0000FF330000FF520000FF7300
+00FFAC0000FFFF0000FFFF0000FFFF00>
+<3A000D003A000D003A000D003A000D003A000D003A000D003A000D003A000D
+003A000D003A000D003A000D003A000D003A000D003A000D003A000D003A00
+10003A0016003C001C003F00230041002E0045003C004A004B004D005C004F
+006D004E007D004D008D004D00A1004E00AE004E00AE004E00AE004E00AE00
+4E00AE004E00AE003A000D003A000D003A000D003A000D003A000D003A000D
+003A000D003A000D003A000D003A000D003A000D003A000D003A000D003A00
+0D003A000D003A000F003A0015003C001C003F00230041002E0045003C0049
+004B004D005C004F006C004E007D004D008D004D00A0004E00AE004E00AE00
+4E00AE004E00AE004E00AE004E00AE003A000D003A000D003A000D003A000D
+003A000D003A000D003A000D003A000D003A000D003A000D003A000D003A00
+0D003A000D003A000D003A000D003A000F003A0015003C001C003F00230041
+002D0045003C0049004A004D005B004F006C004E007C004D008C004D009F00
+4E00AE004E00AE004E00AE004E00AE004E00AE004E00AE003A000D003A000D
+003A000D003A000D003A000D003A000D003A000D003A000D003A000D003A00
+0D003A000D003A000D003A000D003A000D003A000D003A000F003A0015003C
+001B003F00230041002D0045003B0049004A004D005B004F006B004E007C00
+4D008B004D009F004E00AE004E00AE004E00AE004E00AE004E00AE004E00AE
+003A000D003A000D003A000D003A000D003A000D003A000D003A000D003A00
+0D003A000D003A000D003A000D003A000D003A000D003A000D003A000D003A
+000F003A0015003C001B003E00220041002D0045003B0049004A004D005A00
+4F006B004F007B004D008B004D009E004E00AE004E00AE004E00AE004E00AE
+004E00AE004E00AE003A000D003A000D003A000D003A000D003A000D003A00
+0D003A000D003A000D003A000D003A000D003A000D003A000D003A000D003A
+000D003A000D003A000F003A0015003C001B003E00220041002D0044003B00
+490049004D005A004F006A004F007A004D008A004D009D004E00AE004E00AE
+004E00AE004E00AE004E00AE004D00AE003A000D003A000D003A000D003A00
+0D003A000D003A000D003A000D003A000D003A000D003A000D003A000D003A
+000D003A000D003A000D003A000D003A000F003A0015003B001B003E002200
+41002C0044003A00490049004D0059004F006A004E007A004A00890047009C
+004600B2004400B3004300B4004200B5004100B6004000B6003A000D003A00
+0D003A000D003A000D003A000D003A000D003A000D003A000D003A000D003A
+000D003A000D003A000D003A000D003A000D003A000D003A000F003A001500
+3B001B003E00220041002C0044003A00450047004600570044006800420078
+003E0088003C009E003A00BC003900BD003800BE003700BE003700BF003600
+BF003A000D003A000D003A000D003A000D003A000D003A000D003A000D003A
+000D003A000D003A000D003A000D003A000D003A000D003A000D003A000D00
+3A000F003A0015003B001B003A002100380029003700360038004300380053
+0037006500340075003300870032009F003100C3003000C3003000C4002F00
+C4002F00C5002E00C5003A000D003A000D003A000D003A000D003A000D003A
+000D003A000D003A000D003A000D003A000D003A000D003A000D003A000D00
+3A000D003A000D003A000F0035001300310018002E001F002C0027002C0032
+002B0040002A00510029006100280072002700850028009E002900C5002900
+C5002800C5002700C5002700C5002600C5003A000D003A000D003A000D003A
+000D003A000D003A000D003A000D003A000D003A000D003A000D003A000D00
+3A000D003A000D003A000D0034000C002F000C002A0010002800160025001E
+00240026002300300021003E001F004E001E005E001E006F001E0083001F00
+9B002200C3002100C3002000C2002000C2001F00C2001F00C1003A000D003A
+000D003A000D003A000D003A000D003A000D003A000D003A000D003A000D00
+3A000D003A000D003A000D0035000C002E000A002A0009002600090023000F
+00200016001E001E001E0026001D002F001A003C0018004B0017005B001600
+6B0016007E00170095001A00B9001900BC001900BC001800BB001800BA0017
+00BA003A000D003A000D003A000D003A000D003A000D003A000D003A000D00
+3A000D003A000D003A000D0036000C002F000A002A00090025000800220008
+001F0008001D000F001A00170018001F001700270016002F0013003B001100
+4900100057000F0067000F00770010008B001200AB001200B0001100AF0011
+00AE001000AD001000AC003A000D003A000D003A000D003A000D003A000D00
+3A000D003A000D003A000D003A000D0031000B002B00090026000800220007
+001F0006001C0006001A00060117000E011501160113011E01110126010F01
+2E020D0138020C0145010A0152010901610209017002090180010A0099010A
+009F000A009E0009009D0009009C0009009C003C000D003C000D003C000D00
+3C000D003C000D003C000D003C000D0038000C002F00090029000800240007
+00200006001D0005001A000401180103011601040112010C020F0214030D01
+1C030A02230408022A04060234040503400405034D0304035B0303036A0303
+03760303028F02030295020302950203029402020294020203940235000A00
+35000A0035000A0035000A0035000A0035000A0035000A002D000800270006
+00220005001E0004011A010301180103011602020114020201120302010C02
+0804090312050603190504042004030527040206310302063D020107490201
+07570100076500000773000007860000068F0000068F0000068F0000068F00
+00068F002A0006002A0006002A0006002A0006002A0006002A0006002A0006
+00250004001F0103011B010202190202011603010114040101120401011005
+01010D06010105040407040610050207170301091E02000A2500000A2F0000
+0A3B00000A4700000A5500000A6300000972000009830000088E0000088E00
+00088E0000088E0000098E0022010301220103012201030122010301220103
+0122010301220103011D0102021A0301011804010115050101120601010F07
+01010D0801010A090001080A0001030A0603020B0E02010B1502010B1C0101
+0C2401000D2D00010D3901010D4501010D5301000C6101000C7000000B8101
+010B8E01010B8E01010B8E01010B8E01010B8E011D0401011D0401011D0401
+011D0401011D0401011D0401011D0401011A05000116060001130801011009
+01010D0A01010A0C0000070D0000070D0000060E0000020D0403020D0C0302
+0D1402010E1B02010E2201010F2C01010F3701010F4301010F5101010F5F01
+010E6E01010E8001010E8E01010E8E01010E8E01010E8E01010E8E01180800
+0018080000180800001808000018080000180800001808000014090001110A
+01010E0C00010A0E0000080F0000080F0000080F0000081000000810000003
+0F0203020F0A0302101203011019020111210101122A010112350101124101
+01124F0101125D0101126D0101117F0101118F0101118F0101118F0101118F
+0101118F01120C0001120C0001120C0001120C0001120C0001120C0001120C
+00010F0E00010B0F0000081100000811000009110000091100000912000009
+120000091200000412020203120803021210030213170201131F0201152801
+011534010115400101154D0201155B0101156B0101147D0101149001011590
+010115900101159001011590010C1100000C1100000C1100000C1100000C11
+00000C1100000C1100000913000009130000091300000A1300000A1400000A
+1400000A1400000A1400000A140000061402020315060303150D0302161503
+02161D02011826020118320101193E0201194B02011959020118690101187C
+0101189201011892010118920101189201011892010A1500000A1500000A15
+00000A1500000A1500000A1500000A1500000A1500000A1500000B1600000B
+1600000B1600000B1700000B1700000B1700000B1700000717010104170504
+03180C0302191303021A1B03021B2402011C3002011D3D01011D4902011D57
+02011D6701011C7A01011C9101011C9401011C9401011C9401011C94010B18
+00000B1800000B1800000B1800000B1800000B1800000B1800000B1800000B
+1800000C1900000C1900000C1900000C1900000C1A00000C1A00000C1A0000
+081A0101041A0404031B0A03031C1103021D1903021F220201202E0201213B
+02012148020121550201226502012178010120900101209701012097010120
+9701012097010C1B00000C1B00000C1B00000C1B00000C1B00000C1B00000C
+1B00000D1B00000D1B00000D1C00000D1C00000D1C00000D1D00000D1D0000
+0D1D00000D1D00000A1E0000051D0304041F09040321100303221703022320
+0302252C02012638010127450101285301012863010127760101268E010125
+9A0101259A0101259A0101259A010E1E00000E1E00000E1E00000E1E00000E
+1E00000E1E00000E1E00000E1F00000E1F00000E2000000E2000000E200000
+0E2100000E2100000F2100000F2100000B220000072202030423080403260F
+030327160302291F03022B2902012D3501012E4301012F5101013062010130
+7501012D8D01012C9E01012C9E01012C9E01012C9E010F2300000F2300000F
+2300000F2300000F2300000F2300000F2300000F2300000F2300000F240000
+0F24000010250000102500001026000010260000102600000D270000082802
+0205280604042C0D04032F150302311D03023325020234310201363F010138
+4E01013960010139730100368A000034A3000034A3000034A3000034A30010
+28000010280000102800001028000010280000102800001028000010280000
+11290000112A0000112A0000112B0000112B0000112C0000112C0000112C00
+000E2E00000A2F01020630050404330B0403371303023B1B02023C2302023E
+2D0201403B0101434B0101455E0100467100004488000041A9000041A90000
+41A9000041AA00122F0000122F0000122F0000122F0000122F0000122F0000
+122F0000122F00001230000012310000123100001232000012320000123300
+001334000013340000103600000C37010107380304043C0905034111040247
+1902024A2102014B2902014D36010150470100545A0000566F000055860000
+52B0000052B0000052B1000052B10013370000133700001337000013370000
+133700001337000013370000133800001338000013390000143A0000143B00
+00143B0000143C0000143D0000143D0000114000000E420101094402030547
+0705044E0E0403551703025A1F02015D2701015E3201006041000066550000
+696B00006982000067AE000067B9000067B9000067B9001441000014410000
+14410000144100001441000014410000144100001542000015430000154400
+00154500001545000015460000154700001548000015480000134C00000F50
+00010B54020207580504055E0B0504651404026C1C030171230100752D0000
+783C00007C4E000081640000807E00007FA900007FC700007FC700007FC700
+164D0000164D0000164D0000164D0000164D0000164D0000164D0000164E00
+00164F00001650000016510000165200001653000016530000175400001755
+000014590000115F00000D650101096A02030671050403780B030280120200
+8918000092210000982F00009D420000A25A0000A8740000A4A30000A7D900
+00A8D90000A8D900175A0000175A0000175A0000175A0000175A0000175A00
+00175A0000175B0000175C0000175D0000175E0000175F0000176000001761
+0000176200001763000015670000126F00000F7700000C7F00000987000005
+900000029A010100A9040000C50B0000E3180000FE260000FF470000FF6400
+00FF8B0000FFFF0000FFFF0000FFFF00>
+<3A000D003A000D003A000D003A000D003A000D003A000D003A000D003A000D
+003A000D003A000D003A000D003A000D003A000D003A000D003A000D003A00
+0D003A0012003A0018003D001F004000280043003500470043004C0054004E
+0065004F0076004E0087004D0099004E00AE004E00AE004E00AE004E00AE00
+4E00AE004E00AE003A000D003A000D003A000D003A000D003A000D003A000D
+003A000D003A000D003A000D003A000D003A000D003A000D003A000D003A00
+0D003A000D003A000D003A0012003A0018003D001E00400027004300340047
+0043004C0053004E0065004F0075004E0086004D0099004E00AE004E00AE00
+4E00AE004E00AE004E00AE004E00AE003A000D003A000D003A000D003A000D
+003A000D003A000D003A000D003A000D003A000D003A000D003A000D003A00
+0D003A000D003A000D003A000D003A000D003A0012003A0018003D001E0040
+00270043003400470043004C0053004E0064004F0075004E0085004D009800
+4E00AE004E00AE004E00AE004E00AE004E00AE004E00AE003A000D003A000D
+003A000D003A000D003A000D003A000D003A000D003A000D003A000D003A00
+0D003A000D003A000D003A000D003A000D003A000D003A000D003A0012003A
+0018003D001E004000270043003400470042004C0053004E0064004F007400
+4E0085004D0097004E00AE004E00AE004E00AE004E00AE004E00AE004E00AE
+003A000D003A000D003A000D003A000D003A000D003A000D003A000D003A00
+0D003A000D003A000D003A000D003A000D003A000D003A000D003A000D003A
+000D003A0012003A0018003D001E004000270043003400470042004B005200
+4E0064004F0074004E0084004D0096004E00AE004E00AE004E00AE004E00AE
+004E00AE004E00AE003A000D003A000D003A000D003A000D003A000D003A00
+0D003A000D003A000D003A000D003A000D003A000D003A000D003A000D003A
+000D003A000D003A000D003A0012003A0018003D001E004000270042003300
+470042004B0052004E0063004F0073004E0084004D0095004D00AD004E00AE
+004D00AE004B00AF004A00B0004900B0003A000D003A000D003A000D003A00
+0D003A000D003A000D003A000D003A000D003A000D003A000D003A000D003A
+000D003A000D003A000D003A000D003A000D003A0012003A0018003D001E00
+4000260042003300470041004B0051004E0063004B00720048008200440094
+004200B2004000B6003F00B7003E00B8003D00B9003C00BA003A000D003A00
+0D003A000D003A000D003A000D003A000D003A000D003A000D003A000D003A
+000D003A000D003A000D003A000D003A000D003A000D003A000D003A001200
+3A0018003D001E00400026004000310040003E0040004D00400060003E0070
+003B008000380094003700B8003600C0003500C0003400C1003300C2003300
+C2003A000D003A000D003A000D003A000D003A000D003A000D003A000D003A
+000D003A000D003A000D003A000D003A000D003A000D003A000D003A000D00
+3A000D003A0011003900170036001C003300230032002E0032003B0032004A
+0031005C002F006D002E007F002D0095002E00B9002D00C5002C00C5002B00
+C5002B00C5002A00C5003A000D003A000D003A000D003A000D003A000D003A
+000D003A000D003A000D003A000D003A000D003A000D003A000D003A000D00
+3A000D003A000D0037000D0032000F002E0014002B001A002800220028002B
+002700380025004700240058002200680022007C00230093002500B6002500
+C5002400C4002300C4002300C4002200C4003A000D003A000D003A000D003A
+000D003A000D003A000D003A000D003A000D003A000D003A000D003A000D00
+3A000D003A000D0037000D0031000B002C000A0028000C002500120022001A
+002100220020002A001F0036001C0045001A00550019006500190078001A00
+8E001D00B1001D00C0001C00C0001C00BF001B00BE001B00BE003A000D003A
+000D003A000D003A000D003A000D003A000D003A000D003A000D003A000D00
+3A000D003A000D0038000D0031000B002B000900270008002300080020000B
+001E0012001B001A001A0022001A002A001700350015004300130052001200
+620012007300130087001400A5001500B8001400B6001400B5001300B40013
+00B3003A000D003A000D003A000D003A000D003A000D003A000D003A000D00
+3A000D003A000D003A000D0033000B002C000A0027000800230008001F0007
+001D0007001A000B001800120016001B001400230013002A00110035000F00
+41000D004F000C005E000B006D000C007F000D0097000D00A9000D00A7000C
+00A6000C00A5000B00A4003A000D003A000D003A000D003A000D003A000D00
+3A000D003A000D003A000D0036000C002E000A0028000900230008001F0007
+001C000700190006001700050015000A001200120110001B000E0022000C00
+2A000A00330009003F0007004B0006005A00050068000500770006008B0006
+009A0006009A0005009900050099000500980033000B0033000B0033000B00
+33000B0033000B0033000B0033000B0032000B002A000900240008001F0007
+001C00070019000600160005001400050012000400100009000D0012010B00
+1B0008002100060027000400310103003C0002014901020157000101650001
+01720001018200000193000001930000019300000193000001930027000800
+27000800270008002700080027000800270008002700080026000800210007
+001C000700190006001600050014000400120004000F0103000D0102000A01
+0601070111020402180202021E010102240100032D0100043A000004450000
+045300000462000004700000037E0000039100000391000003910000039100
+00039100200006002000060020000600200006002000060020000600200006
+001F0006001B0005001700040115010300120103000F0202000D0201000B03
+0100080301000202020301040F020105150100051C000005230000062B0000
+063800000643000006510000065F0000066E0000057C000005900000059000
+0005900000059000000590001A0103011A0103011A0103011A0103011A0103
+011A0103011A010301190103011601020113020201100301010D0401010B05
+01010705000105070000030800000207040101070D020107140101071B0100
+08220000082A00000835000008410000084E0000085C0000086B0000077B00
+00078F0000078E0000078E0000078E0000078E001503010115030101150301
+011503010115030101150301011503010115030101110401010E0501010B07
+010108080000040A0000050A0000050A0000050A0000030A030102090B0201
+091202010A1901010A2001000B2800000B3300000B3F00000B4C01000B5A00
+000B6900000A790000098E0100098E0100098E0100098E01000A8E01100601
+011006010110060101100601011006010110060101100601010F0701010C08
+0101080A0000050B0000060C0000060C0000060C0000060C0000060C000004
+0C0101020C0803020C1002010C1702010D1F01010E2701010E3101010E3D01
+010E4A01010E5801010D6701000D7801010C8C01010C8E01010C8E01010C8E
+01010C8E010A0B00000A0B00000A0B00000A0B00000A0B00000A0B00000A0B
+0000090C0000070D0000070E0000070E0000070E0000070E0000070E000007
+0F0000070F0000050F0101020E0603020F0E03020F1502010F1D0201102501
+01112F0101113B010111480101115601011065010110760101108A0101108F
+0101108F0101108F0101108F01080F0000080F0000080F0000080F0000080F
+0000080F0000080F0000080F00000810000008100000081000000810000008
+110000081100000811000009110000071101010311040303110C0302121303
+02121B020113230101142D0101143901011446010114540101146301011474
+01011388010113900101139001011490010114900109120000091200000912
+00000912000009120000091200000912000009120000091200000913000009
+13000009130000091300000A1300000A1400000A1400000814010104140302
+0314090302151103021518020116210201172B020118370101184402011852
+02011861020117720101178701011892010118920101189201011892010A15
+00000A1500000A1500000A1500000A1500000A1500000A1500000A1500000A
+1500000A1500000A1600000B1600000B1600000B1600000B1600000B170000
+0A170000051702020317080303180F0302191603021A1E02011B2902011C36
+01011C4202011C5002011C5F02011C7001011C8501011C9401011C9401011C
+9401011C94010B1800000B1800000B1800000B1800000B1800000B1800000B
+1800000B1800000B1800000B1800000C1900000C1900000C1900000C190000
+0C1A00000C1A00000B1A0000071A0202041A0604031C0D03031D1403021E1C
+03021F2702012134020121400201214E0201215C0201216E01012183010120
+97010120970101209701012097010C1B00000C1B00000C1B00000C1B00000C
+1B00000C1B00000C1B00000C1B00000D1B00000D1C00000D1C00000D1C0000
+0D1D00000D1D00000D1D00000D1E00000C1E0000081E0102041E050403200C
+030321130302231B03022424020126310201273E0101284B0101285A010128
+6C010127820101259A0101259A0101259A0101269B010E1F00000E1F00000E
+1F00000E1F00000E1F00000E1F00000E1F00000E1F00000E1F00000E200000
+0E2000000E2100000E2100000F2100000F2100000F2200000E2200000A2300
+010522040404240A040327110303291903022B2203022D2E02012E3B01012F
+48010131580101316A0101308001012D9F01012D9F01012D9F01012D9F010F
+2400000F2400000F2400000F2400000F2400000F2400000F2400000F240000
+0F240000102500001025000010260000102600001026000010270000102700
+000F2800000B29000007290304042B0805032E100302321803023320030235
+29020137360101394501013B5601013C6801013B7E0100379E000036A40000
+36A5000037A500112A0000112A0000112A0000112A0000112A0000112A0000
+112A0000112A0000112A0000112B0000112C0000112C0000112D0000112D00
+00122E0000122E0000112F00000D300000093102030532060504370E04023C
+1603023F1E0202402502014231020144410101485301004A670000497C0000
+469B000045AB000045AB000045AB0012310000123100001231000012310000
+12310000123100001231000012310000123200001233000013340000133400
+0013350000133600001336000013370000133700000F3A00000B3B0102063C
+040504410B0503481303024E1C020150230201512D0101523B0100574D0000
+5C6300005D7900005B97010059B3000059B3000059B300143B0000143B0000
+143B0000143B0000143B0000143B0000143B0000143B0000143C0000143D00
+00143D0000143E0000143F0000144000001440000014410000144200001146
+00000D490101084B03040550080504571104035E19030263210201662A0100
+673600006C480000715D0000737400007293000070BE000070BE000071BE00
+15460000154600001546000015460000154600001546000015460000154600
+001548000015490000164A0000164B0000164B0000164C0000164D0000164E
+0000164F0000135400000F5901010B5D02020762050404690B040371140301
+791B02007E230100832E0000874000008B5400008F6C00008D8F00008DCE00
+008ECF00008ECF001654000016540000165400001654000016540000165400
+0016540000175400001755000017560000175700001758000017590000175A
+0000175B0000175C0000175D000014630000106A00000D7101010978010205
+7F02030288060201920A0100A1110000B21B0000C12A0000CC420000DA5D00
+00E3810000D9F10000DAF70000DBF800>
+<3A000D003A000D003A000D003A000D003A000D003A000D003A000D003A000D
+003A000D003A000D003A000D003A000D003A000D003A000D003A000D003A00
+0D003A000F003A0015003B001B003E00220041002D0045003C004A004C004D
+005D004F006F004E0080004D0092004D00AA004E00AE004E00AE004E00AE00
+4E00AE004E00AE003A000D003A000D003A000D003A000D003A000D003A000D
+003A000D003A000D003A000D003A000D003A000D003A000D003A000D003A00
+0D003A000D003A000D003A000F003A0015003B001B003E00220041002D0045
+003C004A004B004D005D004F006E004E007F004D0091004D00A9004E00AE00
+4E00AE004E00AE004E00AE004E00AE003A000D003A000D003A000D003A000D
+003A000D003A000D003A000D003A000D003A000D003A000D003A000D003A00
+0D003A000D003A000D003A000D003A000D003A000F003A0015003B001B003E
+00220041002D0045003B0049004B004D005C004F006E004E007F004D009000
+4D00A7004E00AE004E00AE004E00AE004E00AE004E00AE003A000D003A000D
+003A000D003A000D003A000D003A000D003A000D003A000D003A000D003A00
+0D003A000D003A000D003A000D003A000D003A000D003A000D003A000E003A
+0015003B001B003E00220041002C0045003B0049004A004D005C004F006D00
+4E007E004D008F004D00A6004E00AE004E00AE004E00AE004E00AE004E00AE
+003A000D003A000D003A000D003A000D003A000D003A000D003A000D003A00
+0D003A000D003A000D003A000D003A000D003A000D003A000D003A000D003A
+000D003A000E003A0014003B001B003E00220041002C0044003B0049004A00
+4D005B004F006C004E007E004D008F004D00A5004E00AE004E00AE004E00AE
+004E00AE004E00AE003A000D003A000D003A000D003A000D003A000D003A00
+0D003A000D003A000D003A000D003A000D003A000D003A000D003A000D003A
+000D003A000D003A000D003A000E003A0014003B001A003E00210041002C00
+44003A00490049004D005B004F006C004E007D004D008E004C00A4004A00B0
+004800B1004700B2004600B2004400B3003A000D003A000D003A000D003A00
+0D003A000D003A000D003A000D003A000D003A000D003A000D003A000D003A
+000D003A000D003A000D003A000D003A000D003A000E003A0014003B001A00
+3E00210041002C0044003A00490049004900590048006B0045007B0041008C
+003E00A7003C00B9003B00BB003A00BC003900BD003900BE003A000D003A00
+0D003A000D003A000D003A000D003A000D003A000D003A000D003A000D003A
+000D003A000D003A000D003A000D003A000D003A000D003A000D003A000E00
+3A0014003B001A003D0021003A002900390036003A0044003A005500390067
+003600790034008C003300AA003200C2003100C3003000C3003000C4002F00
+C4003A000D003A000D003A000D003A000D003A000D003A000D003A000D003A
+000D003A000D003A000D003A000D003A000D003A000D003A000D003A000D00
+3A000D003A000E0036001300320018002F001E002D0027002C0032002C0041
+002B005200290063002800760028008B002900AA002A00C5002900C5002800
+C5002700C5002700C5003A000D003A000D003A000D003A000D003A000D003A
+000D003A000D003A000D003A000D003A000D003A000D003A000D003A000D00
+3A000D003A000D0035000C002F000B002B000F002800160025001D00240026
+002300300021003E001F004F001E005F001E0072001E0088002000A7002100
+C3002000C2001F00C2001F00C1001E00C1003A000D003A000D003A000D003A
+000D003A000D003A000D003A000D003A000D003A000D003A000D003A000D00
+3A000D003A000D0034000C002E000A00290009002500080022000E00200015
+001E001E001D0026001C002F0019003C0017004C0016005C0015006E001500
+820017009F001900BC001800BB001700BA001700B9001600B9003A000D003A
+000D003A000D003A000D003A000D003A000D003A000D003A000D003A000D00
+3A000D003A000D0035000C002E000A002900090024000800210007001E0007
+001C000E001900160017001E001600260015002F0012003B0010004A000F00
+59000E0069000E007B000F0093001100AF001000AE000F00AC000F00AB000E
+00AB003A000D003A000D003A000D003A000D003A000D003A000D003A000D00
+3A000D003A000D0038000D0030000B002900090024000800200007001D0007
+001A0006001800060016000E001300160011001F00100026000E002E000C00
+3A000A004700090055000800640008007400080087000900A00008009E0008
+009D0007009C0007009B0037000D0037000D0037000D0037000D0037000D00
+37000D0037000D0037000D0033000B002B00090025000800200007001D0007
+001A00060017000500150005001300040010000D010E0016000B001E000900
+250007002C000500380004004300030051010301600002016F0003017E0002
+009600020195000101950001019400010194002A0009002A0009002A000900
+2A0009002A0009002A0009002A0009002A00090027000800210007001D0007
+0019000600170005001400050012000400100004000E0003000A000D010800
+160005001C010300220002012900010137000002410000024F0000025E0000
+026D0000017900000193000001930000019300000193000001930020000700
+200007002000070020000700200007002000070020000700200007001E0007
+001A0006001700050014000500110004000F0003000C0003000A0002000800
+010004000D000201140000011B000001210000012800000236000002400000
+024E0000025D0000026C000002770000019200000193000001930000019300
+00019300190006001900060019000600190006001900060019000600190006
+00190006001700060014000500110004000E0003000B000200090001000500
+0100020000000000000000010D000001140000011B00000120000002280000
+0235000002400000024D0000025C0000026B00000276000001900000019300
+00019300000193000001920013000400130004001300040013000400130004
+00130004001300040013000400120004000E0003000B000200080101000401
+00000102000001020000010200000102000001030B01000312010003190000
+041F00000427000004320000053E0000054B00000459000004680000047400
+00048C00000391000003910000039100000391000E0202000E0202000E0202
+000E0202000E0202000E0202000E0202000E0202000C020200090301000503
+00000204000002050000020500000205000002060000030600000105080101
+0511010106180100061E000007250000072F0000073B000007480000075600
+00076500000673000006870000058F0000058F0000058F0000058F00080501
+01080501010805010108050101080501010805010108050101080501010605
+00000307000003070000030800000408000004080000040900000409000004
+0900000208070202080F020108160101091D0100092400000A2D00000A3900
+000A4500000A530000096200000971000008840000088E0000088E0000088E
+0000088E00040A0000040A0000040A0000040A0000040A0000040A0000040A
+0000040A0000050A0000050A0000050A0000050B0000050B0000050B000005
+0B0000050B0000060C0000030B0402020B0C02010B1402010B1B01010C2201
+000D2B01000D3701010D4301010D5101000C6001000C7001000C8201010B8E
+01010B8E01010B8E01010B8E01060C0000060C0000060C0000060C0000060C
+0000060C0000060C0000060C0000060C0000060D0000060D0000060D000007
+0D0000070E0000070E0000070E0000070E0000030E0202020E0A03020E1203
+010E1902010F200101102A01011035010110410101104E0101105D01010F6D
+01010F8001010E8E01010F8E01010F8E01010F8E01070F0000070F0000070F
+0000070F0000070F0000070F0000070F0000070F0000080F0000080F000008
+10000008100000081000000810000008100000081100000811000005100202
+0311070302110F030211170201121E02011328010114330101143F0101134C
+0101135B0101136B0101137E01011390010113900101139001011390010912
+00000912000009120000091200000912000009120000091200000912000009
+12000009120000091200000913000009130000091300000913000009130000
+0A140000061401010314050303140C030215140302151C0201162502011730
+0101183D0101174A02011759020117690101177D0101179101011791010117
+9101011791010A1500000A1500000A1500000A1500000A1500000A1500000A
+1500000A1500000A1500000A1500000A1500000A1600000B1600000B160000
+0B1600000B1600000B170000081701010417040303180A0303181203021919
+03021A2302011C2E02011C3B01011C4802011C5602011C6701011C7B01011B
+9401011B9401011C9401011C94010B1800000B1800000B1800000B1800000B
+1800000B1800000B1800000B1800000B1800000B1800000C1900000C190000
+0C1900000C1900000C1A00000C1A00000C1A0000091A0101051A0303031B09
+04031C1003021D1703021F200202202C020121390201214602012254020122
+650201217801012092010120970101209701012097010D1B00000D1B00000D
+1B00000D1B00000D1B00000D1B00000D1B00000D1B00000D1C00000D1C0000
+0D1C00000D1D00000D1D00000D1D00000D1E00000D1E00000E1E00000B1E00
+00061E0203041F070403210E030322160302241E0302262902012736010128
+43010129520101296301012976010127900101269B0101269B0101269B010E
+2000000E2000000E2000000E2000000E2000000E2000000E2000000E200000
+0E2000000E2000000E2100000F2100000F2100000F2200000F2200000F2200
+000F2300000D230000082401020524060404270D04032A1503022B1C03022D
+2502012F32010131400101324F01013360010133740101308E01012EA00101
+2EA001012EA001102500001025000010250000102500001025000010250000
+10250000102500001025000010260000102600001027000010270000102800
+001028000011290000112900000E2A00000A2B0102062C0504042E0B040332
+130302351B030236230202382D02013A3C01013D4C01013F5E01013F720100
+3C8C00003AA600003AA600003AA600112C0000112C0000112C0000112C0000
+112C0000112C0000112C0000112C0000112C0000112D0000122E0000122E00
+00122F0000122F0000123000001230000012310000103200000C3301010835
+030304370805033C100402411803024420020245290201473601014A470100
+4E5B0100507000004E8900004BAE00004BAE00004BAE001335000013350000
+13350000133500001335000013350000133500001335000013350000133600
+001337000013370000133800001339000013390000143A0000143B0000123C
+00000E3F0001094002030543060504490D040350160302561E020158260201
+593101005B41000061550000646C00006486000061B7000061B7000062B700
+14400000144000001440000014400000144000001440000014400000144000
+00144000001441000015420000154300001544000015450000154500001546
+00001547000014490000104E00000C51010208550404055A0A050462130402
+691B03016E230100722C0000753B0000794E00007E6500007D8100007CB800
+007CC500007CC500164D0000164D0000164D0000164D0000164D0000164D00
+00164D0000164D0000164E0000164F00001650000016510000165200001652
+000016530000175400001755000015580000125E00000E6401010A69020206
+6F040403770904027F1102008817000092200000982E00009E410000A35A00
+00A8770000A6AF0000A8D90000A9DA00>
+] 4 {} bind dup dup dup ]
+/RenderingIntent (Perceptual)
+>>
+setcolorrendering
diff --git a/crd/kx.crd b/crd/kx.crd
new file mode 100644
index 0000000..836404b
--- /dev/null
+++ b/crd/kx.crd
@@ -0,0 +1,4682 @@
+<<
+/ColorRenderingType 1
+/BlackPoint [0.000000 0.000000 0.000000]
+/WhitePoint [0.964200 1.000000 0.824900]
+% Bradford Cone Space
+/MatrixPQR [0.8951 -0.7502 0.0389 0.2664 1.7135 -0.0685 -0.1614 0.0367 1.0296 ]
+/RangePQR [ -0.5 2 -0.5 2 -0.5 2 ]
+% VonKries-like transform in Bradford Cone Space
+/TransformPQR [
+{exch pop exch 3 get mul exch pop exch 3 get div} bind
+{exch pop exch 4 get mul exch pop exch 4 get div} bind
+{exch pop exch 5 get mul exch pop exch 5 get div} bind
+]
+/EncodeLMN [
+{ 0.964200 div dup 0.008856 le {7.787 mul 16 116 div add}{1 3 div exp} ifelse } bind
+{ 1.000000 div dup 0.008856 le {7.787 mul 16 116 div add}{1 3 div exp} ifelse } bind
+{ 0.824900 div dup 0.008856 le {7.787 mul 16 116 div add}{1 3 div exp} ifelse } bind
+]
+/MatrixABC [ 0 1 0 1 -1 1 0 0 -1 ]
+/EncodeABC [
+{ 116 mul 16 sub 100 div } bind
+{ 500 mul 128 add 255 div } bind
+{ 200 mul 128 add 255 div } bind
+]
+/RenderTable [ 33 33 33 [
+<000000FF000000FF000000FF000000FF000000FF000000FF000000FF000000
+FF000000FF000000FF000000FF000000FF000000FF000000FF000000FF0000
+00FF000000FF000000FF000000FF000000FF000000FF000000FF000000FF00
+0000FF000000FF000000FF000000FF000000FF000000FF000000FF000000FF
+000000FF000000FF000000FF000000FF000000FF000000FF000000FF000000
+FF000000FF000000FF000000FF000000FF000000FF000000FF000000FF0000
+00FF000000FF000000FF000000FF000000FF000000FF000000FF000000FF00
+0000FF000000FF000000FF000000FF000000FF000000FF000000FF000000FF
+000000FF000000FF000000FF000000FF000000FF000000FF000000FF000000
+FF000000FF000000FF000000FF000000FF000000FF000000FF000000FF0000
+00FF000000FF000000FF000000FF000000FF000000FF000000FF000000FF00
+0000FF000000FF000000FF000000FF000000FF000000FF000000FF000000FF
+000000FF000000FF000000FF000000FF000000FF000000FF000000FF000000
+FF000000FF000000FF000000FF000000FF000000FF000000FF000000FF0000
+00FF000000FF000000FF000000FF000000FF000000FF000000FF000000FF00
+0000FF000000FF000000FF000000FF000000FF000000FF000000FF000000FF
+000000FF000000FF000000FF000000FF000000FF000000FF000000FF000000
+FF000000FF000000FF000000FF000000FF000000FF000000FF000000FF0000
+00FF000000FF000000FF000000FF000000FF000000FF000000FF000000FF00
+0000FF000000FF000000FF000000FF000000FF000000FF000000FF000000FF
+000000FF000000FF000000FF000000FF000000FF000000FF000000FF000000
+FF000000FF000000FF000000FF000000FF000000FF000000FF000000FF0000
+00FF000000FF000000FF000000FF000000FF000000FF000000FF000000FF00
+0000FF000000FF000000FF000000FF000000FF000000FF000000FF000000FF
+000000FF000000FF000000FF000000FF000000FF000000FF000000FF000000
+FF000000FF000000FF000000FF000000FF000000FF000000FF000000FF0000
+00FF000000FF000000FF000000FF000000FF000000FF000000FF000000FF00
+0000FF000000FF000000FF000000FF000000FF000000FF000000FF000000FF
+000000FF000000FF000000FF000000FF000000FF000000FF000000FF000000
+FF000000FF000000FF000000FF000000FF000000FF000000FF000000FF0000
+00FF000000FF000000FF000000FF000000FF000000FF000000FF000000FF00
+0000FF000000FF000000FF000000FF000000FF000000FF000000FF000000FF
+000000FF000000FF000000FF000000FF000000FF000000FF000000FF000000
+FF000000FF000000FF000000FF000000FF000000FF000000FF000000FF0000
+00FF000000FF000000FF000000FF000000FF000000FF000000FF000000FF00
+0000FF000000FF000000FF000000FF000000FF000000FF000000FF000000FF
+000000FF000000FF000000FF000000FF000000FF000000FF000000FF000000
+FF000000FF000000FF000000FF000000FF000000FF000000FF000000FF0000
+00FF000000FF000000FF000000FF000000FF000000FF000000FF000000FF00
+0000FF000000FF000000FF000000FF000000FF000000FF000000FF000000FF
+000000FF000000FF000000FF000000FF000000FF000000FF000000FF000000
+FF000000FF000000FF000000FF000000FF000000FF000000FF000000FF0000
+00FF000000FF000000FF000000FF000000FF000000FF000000FF000000FF00
+0000FF000000FF000000FF000000FF000000FF000000FF000000FF000000FF
+000000FF000000FF000000FF000000FF000000FF000000FF000000FF000000
+FF000000FF000000FF000000FF000000FF000000FF000000FF000000FF0000
+00FF000000FF000000FF000000FF000000FF000000FF000000FF000000FF00
+0000FF000000FF000000FF000000FF000000FF000000FF000000FF000000FF
+000000FF000000FF000000FF000000FF000000FF000000FF000000FF000000
+FF000000FF000000FF000000FF000000FF000000FF000000FF000000FF0000
+00FF000000FF000000FF000000FF000000FF000000FF000000FF000000FF00
+0000FF000000FF000000FF000000FF000000FF000000FF000000FF000000FF
+000000FF000000FF000000FF000000FF000000FF000000FF000000FF000000
+FF000000FF000000FF000000FF000000FF000000FF000000FF000000FF0000
+00FF000000FF000000FF000000FF000000FF000000FF000000FF000000FF00
+0000FF000000FF000000FF000000FF000000FF000000FF000000FF000000FF
+000000FF000000FF000000FF000000FF000000FF000000FF000000FF000000
+FF000000FF000000FF000000FF000000FF000000FF000000FF000000FF0000
+00FF000000FF000000FF000000FF000000FF000000FF000000FF000000FF00
+0000FF000000FF000000FF000000FF000000FF000000FF000000FF000000FF
+000000FF000000FF000000FF000000FF000000FF000000FF000000FF000000
+FF000000FF000000FF000000FF000000FF000000FF000000FF000000FF0000
+00FF000000FF000000FF000000FF000000FF000000FF000000FF000000FF00
+0000FF000000FF000000FF000000FF000000FF000000FF000000FF000000FF
+000000FF000000FF000000FF000000FF000000FF000000FF000000FF000000
+FF000000FF000000FF000000FF000000FF000000FF000000FF000000FF0000
+00FF000000FF000000FF000000FF000000FF000000FF000000FF000000FF00
+0000FF000000FF000000FF000000FF000000FF000000FF000000FF000000FF
+000000FF000000FF000000FF000000FF000000FF000000FF000000FF000000
+FF000000FF000000FF000000FF000000FF000000FF000000FF000000FF0000
+00FF000000FF000000FF000000FF000000FF000000FF000000FF000000FF00
+0000FF000000FF000000FF000000FF000000FF000000FF000000FF000000FF
+000000FF000000FF000000FF000000FF000000FF000000FF000000FF000000
+FF000000FF000000FF000000FF000000FF000000FF000000FF000000FF0000
+00FF000000FF000000FF000000FF000000FF000000FF000000FF000000FF00
+0000FF000000FF000000FF000000FF000000FF000000FF000000FF000000FF
+000000FF000000FF000000FF000000FF000000FF000000FF000000FF000000
+FF000000FF000000FF000000FF000000FF000000FF000000FF000000FF0000
+00FF000000FF000000FF000000FF000000FF000000FF000000FF000000FF00
+0000FF000000FF000000FF000000FF000000FF000000FF000000FF000000FF
+000000FF000000FF000000FF000000FF000000FF000000FF000000FF000000
+FF000000FF000000FF000000FF000000FF000000FF000000FF000000FF0000
+00FF000000FF000000FF000000FF000000FF000000FF000000FF000000FF00
+0000FF000000FF000000FF000000FF000000FF000000FF000000FF000000FF
+000000FF000000FF000000FF000000FF000000FF000000FF000000FF000000
+FF000000FF000000FF000000FF000000FF000000FF000000FF000000FF0000
+00FF000000FF000000FF000000FF000000FF000000FF000000FF000000FF00
+0000FF000000FF000000FF000000FF000000FF000000FF000000FF000000FF
+000000FF000000FF000000FF000000FF000000FF000000FF000000FF000000
+FF000000FF000000FF000000FF000000FF000000FF000000FF000000FF0000
+00FF000000FF000000FF000000FF000000FF000000FF000000FF000000FF00
+0000FF000000FF000000FF000000FF000000FF000000FF000000FF000000FF
+000000FF000000FF000000FF000000FF000000FF000000FF000000FF000000
+FF000000FF000000FF000000FF000000FF000000FF000000FF000000FF0000
+00FF000000FF000000FF000000FF000000FF000000FF000000FF000000FF00
+0000FF000000FF000000FF000000FF000000FF000000FF000000FF000000FF
+000000FF000000FF000000FF000000FF000000FF000000FF000000FF000000
+FF000000FF000000FF000000FF000000FF000000FF000000FF000000FF0000
+00FF000000FF000000FF000000FF000000FF000000FF000000FF000000FF00
+0000FF000000FF000000FF000000FF000000FF000000FF000000FF000000FF
+000000FF000000FF000000FF000000FF000000FF000000FF000000FF000000
+FF000000FF000000FF000000FF000000FF000000FF000000FF000000FF0000
+00FF000000FF000000FF000000FF000000FF000000FF000000FF000000FF00
+0000FF000000FF000000FF000000FF000000FF000000FF000000FF000000FF
+000000FF000000FF000000FF000000FF000000FF000000FF000000FF000000
+FF000000FF000000FF000000FF000000FF000000FF000000FF000000FF0000
+00FF000000FF000000FF000000FF000000FF000000FF000000FF000000FF00
+0000FF000000FF000000FF000000FF000000FF000000FF000000FF000000FF
+000000FF000000FF000000FF000000FF000000FF000000FF000000FF000000
+FF000000FF000000FF000000FF000000FF000000FF000000FF000000FF0000
+00FF000000FF000000FF000000FF000000FF000000FF000000FF000000FF00
+0000FF000000FF000000FF000000FF000000FF000000FF000000FF000000FF
+000000FF000000FF000000FF000000FF000000FF000000FF000000FF000000
+FF000000FF000000FF000000FF000000FF000000FF000000FF000000FF0000
+00FF000000FF000000FF000000FF000000FF000000FF000000FF000000FF00
+0000FF000000FF000000FF000000FF000000FF000000FF000000FF000000FF
+000000FF000000FF000000FF000000FF000000FF000000FF000000FF000000
+FF000000FF000000FF000000FF000000FF000000FF000000FF000000FF0000
+00FF000000FF000000FF000000FF000000FF000000FF000000FF000000FF00
+0000FF000000FF000000FF000000FF000000FF000000FF000000FF000000FF
+000000FF000000FF000000FF000000FF000000FF000000FF000000FF000000
+FF000000FF000000FF000000FF000000FF000000FF000000FF000000FF0000
+00FF000000FF000000FF000000FF000000FF000000FF000000FF000000FF00
+0000FF000000FF000000FF000000FF000000FF000000FF000000FF000000FF
+000000FF000000FF000000FF000000FF000000FF000000FF000000FF000000
+FF000000FF000000FF000000FF000000FF000000FF000000FF000000FF0000
+00FF000000FF000000FF000000FF000000FF000000FF000000FF000000FF00
+0000FF000000FF000000FF000000FF000000FF000000FF000000FF000000FF
+000000FF000000FF000000FF000000FF000000FF000000FF000000FF000000
+FF000000FF000000FF000000FF000000FF000000FF000000FF000000FF0000
+00FF000000FF000000FF000000FF000000FF000000FF000000FF000000FF00
+0000FF000000FF000000FF000000FF000000FF000000FF000000FF000000FF
+000000FF000000FF000000FF000000FF000000FF000000FF000000FF000000
+FF000000FF000000FF000000FF000000FF000000FF000000FF000000FF0000
+00FF000000FF000000FF000000FF000000FF000000FF000000FF000000FF00
+0000FF000000FF000000FF000000FF000000FF000000FF000000FF000000FF
+000000FF000000FF000000FF000000FF000000FF000000FF000000FF000000
+FF000000FF000000FF000000FF000000FF000000FF000000FF000000FF0000
+00FF000000FF000000FF000000FF000000FF000000FF000000FF000000FF00
+0000FF000000FF000000FF000000FF000000FF000000FF000000FF000000FF
+000000FF000000FF000000FF000000FF>
+<A6590000A75D0000AA620000B0680000BA6F0002CA760005DF7E0009F58200
+0FF6820118F07D0225E56F0039D85F004ECB4E0064BE33007D9F1B03983609
+25CB090116DE0C0037D50C0037D50C0037D50C0037D50C0037D50C0037D50C
+0037D50C0037D50C0037D50C0037D50C0037D50C0037D50C0037D50C0037D5
+0C0037D50C0037D5A6590000A75D0000AA620000B0680000BA6F0002CA7600
+05DF7E0009F582000FF6820118F07D0225E56F0039D85F004ECB4E0064BE33
+007D9F1B0398360925CB090116DE0C0037D50C0037D50C0037D50C0037D50C
+0037D50C0037D50C0037D50C0037D50C0037D50C0037D50C0037D50C0037D5
+0C0037D50C0037D50C0037D50C0037D5A6590000A75D0000AA620000B06800
+00BA6F0002CA760005DF7E0009F582000FF6820118F07D0225E56F0039D85F
+004ECB4E0064BE33007D9F1B0398360925CB090116DE0C0037D50C0037D50C
+0037D50C0037D50C0037D50C0037D50C0037D50C0037D50C0037D50C0037D5
+0C0037D50C0037D50C0037D50C0037D50C0037D50C0037D5A6590000A75D00
+00AA620000B0680000BA6F0002CA760005DF7E0009F582000FF6820118F07D
+0225E56F0039D85F004ECB4E0064BE33007D9F1B0398360925CB090116DE0C
+0037D50C0037D50C0037D50C0037D50C0037D50C0037D50C0037D50C0037D5
+0C0037D50C0037D50C0037D50C0037D50C0037D50C0037D50C0037D50C0037
+D5A6590000A75D0000AA620000B0680000BA6F0002CA760005DF7E0009F582
+000FF6820118F07D0225E56F0039D85F004ECB4E0064BE33007D9F1B039836
+0925CB090116DE0C0037D50C0037D50C0037D50C0037D50C0037D50C0037D5
+0C0037D50C0037D50C0037D50C0037D50C0037D50C0037D50C0037D50C0037
+D50C0037D50C0037D5A6590000A75D0000AA620000B0680000BA6F0002CA76
+0005DF7E0009F582000FF6820118F07D0225E56F0039D85F004ECB4E0064BE
+33007D9F1B0398360925CB090116DE0C0037D50C0037D50C0037D50C0037D5
+0C0037D50C0037D50C0037D50C0037D50C0037D50C0037D50C0037D50C0037
+D50C0037D50C0037D50C0037D50C0037D5A6590000A75D0000AA620000B068
+0000BA6F0002CA760005DF7E0009F582000FF6820118F07D0225E56F0039D8
+5F004ECB4E0064BE33007D9F1B0398360925CB090116DE0C0037D50C0037D5
+0C0037D50C0037D50C0037D50C0037D50C0037D50C0037D50C0037D50C0037
+D50C0037D50C0037D50C0037D50C0037D50C0037D50C0037D5A6590000A75D
+0000AA620000B0680000BA6F0002CA760005DF7E0009F582000FF6820118F0
+7D0225E56F0039D85F004ECB4E0064BE33007D9F1B0398360925CB090116DE
+0C0037D50C0037D50C0037D50C0037D50C0037D50C0037D50C0037D50C0037
+D50C0037D50C0037D50C0037D50C0037D50C0037D50C0037D50C0037D50C00
+37D5A6590000A75D0000AA620000B0680000BA6F0002CA760005DF7E0009F5
+82000FF6820118F07D0225E56F0039D85F004ECB4E0064BE33007D9F1B0398
+360925CB090116DE0C0037D50C0037D50C0037D50C0037D50C0037D50C0037
+D50C0037D50C0037D50C0037D50C0037D50C0037D50C0037D50C0037D50C00
+37D50C0037D50C0037D5A6590000A75D0000AA620000B0680000BA6F0002CA
+760005DF7E0009F582000FF6820118F07D0225E56F0039D85F004ECB4E0064
+BE33007D9F1B0398360925CB090116DE0C0037D50C0037D50C0037D50C0037
+D50C0037D50C0037D50C0037D50C0037D50C0037D50C0037D50C0037D50C00
+37D50C0037D50C0037D50C0037D50C0037D5A6590000A75D0000AA620000B0
+680000BA6F0002CA760005DF7E0009F582000FF6820118F07D0225E56F0039
+D85F004ECB4E0064BE33007D9F1B0398360925CB090116DE0C0037D50C0037
+D50C0037D50C0037D50C0037D50C0037D50C0037D50C0037D50C0037D50C00
+37D50C0037D50C0037D50C0037D50C0037D50C0037D50C0037D5A6590000A7
+5D0000AA620000B0680000BA6F0002CA760005DF7E0009F582000FF6820118
+F07D0225E56F0039D85F004ECB4E0064BE33007D9F1B0398360925CB090116
+DE0C0037D50C0037D50C0037D50C0037D50C0037D50C0037D50C0037D50C00
+37D50C0037D50C0037D50C0037D50C0037D50C0037D50C0037D50C0037D50C
+0037D5A6590000A75D0000AA620000B0680000BA6F0002CA760005DF7E0009
+F582000FF6820118F07D0225E56F0039D85F004ECB4E0064BE33007D9F1B03
+98360925CB090116DE0C0037D50C0037D50C0037D50C0037D50C0037D50C00
+37D50C0037D50C0037D50C0037D50C0037D50C0037D50C0037D50C0037D50C
+0037D50C0037D50C0037D5A6590000A75D0000AA620000B0680000BA6F0002
+CA760005DF7E0009F582000FF6820118F07D0225E56F0039D85F004ECB4E00
+64BE33007D9F1B0398360925CB090116DE0C0037D50C0037D50C0037D50C00
+37D50C0037D50C0037D50C0037D50C0037D50C0037D50C0037D50C0037D50C
+0037D50C0037D50C0037D50C0037D50C0037D5A6590000A75D0000AA620000
+B0680000BA6F0002CA760005DF7E0009F582000FF6820118F07D0225E56F00
+39D85F004ECB4E0064BE33007D9F1B0398360925CB090116DE0C0037D50C00
+37D50C0037D50C0037D50C0037D50C0037D50C0037D50C0037D50C0037D50C
+0037D50C0037D50C0037D50C0037D50C0037D50C0037D50C0037D5A6590000
+A75D0000AA620000B0680000BA6F0002C9770005DE7E0008F584000EF58400
+17EE7F0124E2720036D6650049C9530060BB3D00779D2200943C0E23C80000
+01EB090039D5090039D5090039D5090039D5090039D5090039D5090039D509
+0039D5090039D5090039D5090039D5090039D5090039D5090039D5090039D5
+090039D5A65A0000A75E0000A9620000AF680000B96F0002C8770004DD7F00
+07F687000CF3860015EB810021DC780031D46C0044C65C0059B74A006FA22F
+008A411C2CC4100003DF010100F9010100F9010100F9010100F9010100F901
+0100F9010100F9010100F9010100F9010100F9010100F9010100F9010100F9
+010100F9010100F9010100F9A65A0000A75E0000A9630000AE680000B87000
+01C7780004DC800006F789000AF2870013E783001DD97C002CD273003EC367
+0051B25900659A4E007A7A4300944E2202BB020000EE020000EE020000EE02
+0000EE020000EE020000EE020000EE020000EE020000EE020000EE020000EE
+020000EE020000EE020000EE020000EE020000EEA65A0000A65E0000A96300
+00AD690000B7700001C6790003DB820005F68A0009F0890010E486001AD780
+0027CB790037C0780343AD7C0A4A917E0C5B76860D6A654B11A0020001F002
+0001F0020001F0020001F0020001F0020001F0020001F0020001F0020001F0
+020001F0020001F0020001F0020001F0020001F0020001F0020001F0A65B00
+00A65E0000A8630000AC690000B5710001C5790002DA830004F48B0007EE8B
+000EE2880017D5830023C47F0130B0830639978D0B41769B0D565895087148
+5C0EA415300CC915300CC915300CC915300CC915300CC915300CC915300CC9
+15300CC915300CC915300CC915300CC915300CC915300CC915300CC915300C
+C915300CC9A65B0000A65F0000A8630000AC690000B5710000C37A0002D984
+0003F28B0006EE8B000DE2880017D0850022B486012C9A8F06357A9F07475C
+A7065F41A302781A8F0096006D01A5006D01A5006D01A5006D01A5006D01A5
+006D01A5006D01A5006D01A5006D01A5006D01A5006D01A5006D01A5006D01
+A5006D01A5006D01A5006D01A5A65C0000A65F0000A7640000AB6A0000B472
+0000C37A0001D9840003F28B0006EE8B000DDE890017BD8C001FA090002984
+A2033665AC004E4CAF006532AD007A159E078D0181099C0181099C0181099C
+0181099C0181099C0181099C0181099C0181099C0181099C0181099C018109
+9C0181099C0181099C0181099C0181099C0181099CA65C0000A6600000A764
+0000AA6A0000B3720000C27A0001D9840003F28B0006E78D000DC5910015AA
+98001C8EA6002773B3003959B9005041BD006629BA027812B40E85029D1292
+029D1292029D1292029D1292029D1292029D1292029D1292029D1292029D12
+92029D1292029D1292029D1292029D1292029D1292029D1292029D1292A65D
+0000A6600000A7640000AA6A0000B3720000C27A0001D9840003F28B0006CE
+94000CB39B00149CAA001A83BB002669C5003A4EC8005236CC006623CF0772
+0FC5127F00B91A8900B91A8900B91A8900B91A8900B91A8900B91A8900B91A
+8900B91A8900B91A8900B91A8900B91A8900B91A8900B91A8900B91A8900B9
+1A8900B91A89A65D0000A6600000A7640000AA6A0000B3720000C27A0001D8
+840003CC910006BA9E000BA5A9001192BE001878CF00265FD4003B46D70052
+2FDE00641CE5086F07D6117C00DA267C00DA267C00DA267C00DA267C00DA26
+7C00DA267C00DA267C00DA267C00DA267C00DA267C00DA267C00DA267C00DA
+267C00DA267C00DA267C00DA267CA65D0000A6600000A7640000AA6A0000B3
+720000C27A0001BE860003B4950005ABA6000B9BB6001089D1001771DE0026
+57E4003A3FE7005228F9016015FB076C00F1137800F5357100F5357100F535
+7100F5357100F5357100F5357100F5357100F5357100F5357100F5357100F5
+357100F5357100F5357100F5357100F5357100F53571A65D0000A6600000A7
+640000AA6A0000B3710000B27B0001A9890002A39800059EAC000993C4000F
+82E3001769EF00264EF4003B38FC025020FF045E0AFF076A00FD1D6C04FF45
+6504FF456504FF456504FF456504FF456504FF456504FF456504FF456504FF
+456504FF456504FF456504FF456504FF456504FF456504FF456504FF4565A6
+5D0000A6600000A7640000AA6A0000AB720000A07E00019B8C0002979C0005
+92B100098AD1000F7AF000185FF6002844FD003B2DFF064D14FF055C00FF09
+6700FF26620BFF55580BFF55580BFF55580BFF55580BFF55580BFF55580BFF
+55580BFF55580BFF55580BFF55580BFF55580BFF55580BFF55580BFF55580B
+FF55580BFF5558A65D0000A6600000A7640000A86A00009A74000094800000
+908F00028C9F000488B6000880D500106EEF001951F9002839FF033923FF07
+4B09FF035C00FF155E02FF33590FFF644F0FFF644F0FFF644F0FFF644F0FFF
+644F0FFF644F0FFF644F0FFF644F0FFF644F0FFF644F0FFF644F0FFF644F0F
+FF644F0FFF644F0FFF644F0FFF644FA65D0000A6600000A7640000966B0000
+8F7600008B8200018890000184A200037EB9000972D400115FEA001B45F600
+2930FF073818FE034B05FE0B5600FF1F5607FF444F0FFF6A480FFF6A480FFF
+6A480FFF6A480FFF6A480FFF6A480FFF6A480FFF6A480FFF6A480FFF6A480F
+FF6A480FFF6A480FFF6A480FFF6A480FFF6A480FFF6A48A65D0000A6600000
+966400008B6C00008678000083840000809300017BA5000374BD000A66D400
+1251E7001C3CF6042825FF06380EFD004B06FF174D02FF2B4D0BFF54450CFF
+6C430CFF6C430CFF6C430CFF6C430CFF6C430CFF6C430CFF6C430CFF6C430C
+FF6C430CFF6C430CFF6C430CFF6C430CFF6C430CFF6C430CFF6C430CFF6C43
+A65D0000985F000089650000826E00007F7A00007C8600007895000072A800
+0368BF000A59D4001345E5001D31F506291BFB03390EFE0F4307FF234505FF
+39430AFF5A3F09FF6F3F09FF6F3F09FF6F3F09FF6F3F09FF6F3F09FF6F3F09
+FF6F3F09FF6F3F09FF6F3F09FF6F3F09FF6F3F09FF6F3F09FF6F3F09FF6F3F
+09FF6F3F09FF6F3F9D5C0000895F0000806600007B700000787B0000748800
+006F97000069AB00045EC2000B4ED300133AE4001E26F2022A15F905370EFE
+1C3B0AFF303B07FF473B07FF5D3B07FF713A07FF713A07FF713A07FF713A07
+FF713A07FF713A07FF713A07FF713A07FF713A07FF713A07FF713A07FF713A
+07FF713A07FF713A07FF713A07FF713A>
+<A7560000A7590000A95E0000AD630000B5680002C26F0005D4760009E87B00
+0FFA7C0118F9780323F6690136ED57004EE6430066D7230081B10E0C968D01
+1FA775013BB1230036D019002ED419002ED419002ED419002ED419002ED419
+002ED419002ED419002ED419002ED419002ED419002ED419002ED419002ED4
+19002ED419002ED4A7560000A7590000A95E0000AD630000B5680002C26F00
+05D4760009E87B000FFA7C0118F9780323F6690136ED57004EE6430066D723
+0081B10E0C968D011FA775013BB1230036D019002ED419002ED419002ED419
+002ED419002ED419002ED419002ED419002ED419002ED419002ED419002ED4
+19002ED419002ED419002ED419002ED4A7560000A7590000A95E0000AD6300
+00B5680002C26F0005D4760009E87B000FFA7C0118F9780323F6690136ED57
+004EE6430066D7230081B10E0C968D011FA775013BB1230036D019002ED419
+002ED419002ED419002ED419002ED419002ED419002ED419002ED419002ED4
+19002ED419002ED419002ED419002ED419002ED419002ED4A7560000A75900
+00A95E0000AD630000B5680002C26F0005D4760009E87B000FFA7C0118F978
+0323F6690136ED57004EE6430066D7230081B10E0C968D011FA775013BB123
+0036D019002ED419002ED419002ED419002ED419002ED419002ED419002ED4
+19002ED419002ED419002ED419002ED419002ED419002ED419002ED419002E
+D4A7560000A7590000A95E0000AD630000B5680002C26F0005D4760009E87B
+000FFA7C0118F9780323F6690136ED57004EE6430066D7230081B10E0C968D
+011FA775013BB1230036D019002ED419002ED419002ED419002ED419002ED4
+19002ED419002ED419002ED419002ED419002ED419002ED419002ED419002E
+D419002ED419002ED4A7560000A7590000A95E0000AD630000B5680002C26F
+0005D4760009E87B000FFA7C0118F9780323F6690136ED57004EE6430066D7
+230081B10E0C968D011FA775013BB1230036D019002ED419002ED419002ED4
+19002ED419002ED419002ED419002ED419002ED419002ED419002ED419002E
+D419002ED419002ED419002ED419002ED4A7560000A7590000A95E0000AD63
+0000B5680002C26F0005D4760009E87B000FFA7C0118F9780323F6690136ED
+57004EE6430066D7230081B10E0C968D011FA775013BB1230036D019002ED4
+19002ED419002ED419002ED419002ED419002ED419002ED419002ED419002E
+D419002ED419002ED419002ED419002ED419002ED419002ED4A7560000A759
+0000A95E0000AD630000B5680002C26F0005D4760009E87B000FFA7C0118F9
+780323F6690136ED57004EE6430066D7230081B10E0C968D011FA775013BB1
+230036D019002ED419002ED419002ED419002ED419002ED419002ED419002E
+D419002ED419002ED419002ED419002ED419002ED419002ED419002ED41900
+2ED4A7560000A7590000A95E0000AD630000B5680002C26F0005D4760009E8
+7B000FFA7C0118F9780323F6690136ED57004EE6430066D7230081B10E0C96
+8D011FA775013BB1230036D019002ED419002ED419002ED419002ED419002E
+D419002ED419002ED419002ED419002ED419002ED419002ED419002ED41900
+2ED419002ED419002ED4A7560000A7590000A95E0000AD630000B5680002C2
+6F0005D4760009E87B000FFA7C0118F9780323F6690136ED57004EE6430066
+D7230081B10E0C968D011FA775013BB1230036D019002ED419002ED419002E
+D419002ED419002ED419002ED419002ED419002ED419002ED419002ED41900
+2ED419002ED419002ED419002ED419002ED4A7560000A7590000A95E0000AD
+630000B5680002C26F0005D4760009E87B000FFA7C0118F9780323F6690136
+ED57004EE6430066D7230081B10E0C968D011FA775013BB1230036D019002E
+D419002ED419002ED419002ED419002ED419002ED419002ED419002ED41900
+2ED419002ED419002ED419002ED419002ED419002ED419002ED4A7560000A7
+590000A95E0000AD630000B5680002C26F0005D4760009E87B000FFA7C0118
+F9780323F6690136ED57004EE6430066D7230081B10E0C968D011FA775013B
+B1230036D019002ED419002ED419002ED419002ED419002ED419002ED41900
+2ED419002ED419002ED419002ED419002ED419002ED419002ED419002ED419
+002ED4A7560000A7590000A95E0000AD630000B5680002C26F0005D4760009
+E87B000FFA7C0118F9780323F6690136ED57004EE6430066D7230081B10E0C
+968D011FA775013BB1230036D019002ED419002ED419002ED419002ED41900
+2ED419002ED419002ED419002ED419002ED419002ED419002ED419002ED419
+002ED419002ED419002ED4A7560000A7590000A95E0000AD630000B5680002
+C26F0005D3760008E87B000EFB7E0117FA7B0322F56B0135EB58004CE24600
+64D726007FB1100B95840122AB6B013DB6220038D018002FD418002FD41800
+2FD418002FD418002FD418002FD418002FD418002FD418002FD418002FD418
+002FD418002FD418002FD418002FD418002FD4A7560000A75A0000A95E0000
+AD630000B4690001C1700004D2770008E77D000DFB810014FD7F0320F47001
+32E75E0047DC4C0060D8300079B116059488081CA9470238C421003FCF1500
+31D4150031D4150031D4150031D4150031D4150031D4150031D4150031D415
+0031D4150031D4150031D4150031D4150031D4150031D4150031D4A7570000
+A75A0000A85E0000AC630000B3690001C0710004D1780007E77F000CF98200
+13FA80021EF174012FE3650043D852005BD13A0073AE1E00908C0E16A61B02
+1CD70D0330D70C0731D60C0731D60C0731D60C0731D60C0731D60C0731D60C
+0731D60C0731D60C0731D60C0731D60C0731D60C0731D60C0731D60C0731D6
+0C0731D6A7570000A65A0000A85F0000AC640000B26A0001BF710003D07900
+06E780000AF8830011F581021CEB79012BE16A003FD4590056C846006CAD2D
+008783220CA33E0301CA000101EC010302E7010302E7010302E7010302E701
+0302E7010302E7010302E7010302E7010302E7010302E7010302E7010302E7
+010302E7010302E7010302E7A7570000A65B0000A85F0000AB640000B26A00
+00BE710003CF790006E6810009F8850010F383011AE77C0128DE70003BD061
+0050B8570064A55104747C420094422500BF041501DB011301DD011301DD01
+1301DD011301DD011301DD011301DD011301DD011301DD011301DD011301DD
+011301DD011301DD011301DD011301DD011301DDA7580000A65B0000A85F00
+00AA640000B16A0000BD720002CF7B0005E5820008F988000EEF850017E57F
+0024D8760035C7740144AD78084F977B0C5A6E7D07784A7207950C0D06DC07
+0B05DE070B05DE070B05DE070B05DE070B05DE070B05DE070B05DE070B05DE
+070B05DE070B05DE070B05DE070B05DE070B05DE070B05DE070B05DEA75800
+00A65B0000A7600000AA650000B06B0000BB730002CD7B0004E4840007F88A
+000BED880014E084001FC681012BAA8301389191093E729E085351A2056C32
+9D0186077700A1006D02A5006D02A5006D02A5006D02A5006D02A5006D02A5
+006D02A5006D02A5006D02A5006D02A5006D02A5006D02A5006D02A5006D02
+A5006D02A5A7590000A65C0000A7600000A9650000AE6B0000BA730001CB7C
+0003E3860005F58B0009EA8A0010D08A001AB38D00229397002E76A8023F5A
+AF005741B0006E25A70184058B089600820A9C00820A9C00820A9C00820A9C
+00820A9C00820A9C00820A9C00820A9C00820A9C00820A9C00820A9C00820A
+9C00820A9C00820A9C00820A9CA7590000A65C0000A7610000A8650000AD6C
+0000B8740000C97D0002E2870004F48B0008DB8E000FB99300189F9E001F83
+AF002C68B900414EBD005935BD006E1FBD097C07AA128C009E1493009E1493
+009E1493009E1493009E1493009E1493009E1493009E1493009E1493009E14
+93009E1493009E1493009E1493009E1493009E1493A75A0000A65D0000A661
+0000A8660000AC6C0000B7740000C97D0002E2870004DD900007C099000EA8
+A3001591B4001D77C4002D5CC9004343CE005A2CCF006C1AD20D7602BB1487
+00C6228500C6228500C6228500C6228500C6228500C6228500C6228500C622
+8500C6228500C6228500C6228500C6228500C6228500C6228500C62285A85B
+0000A65E0000A6620000A8660000AC6C0000B7740000C97D0002D0880004C0
+970007AFA4000D9CB2001387CA001C6ED5002D53D900433BDD005A24E80168
+12E70C7300DF1D7C00E4317800E4317800E4317800E4317800E4317800E431
+7800E4317800E4317800E4317800E4317800E4317800E4317800E4317800E4
+317800E43178A85B0000A65E0000A6620000A8660000AC6C0000B7740000C0
+7E0001B48C0003AC9C0006A3AE000B92C300127FDC001C65E6002D4BEB0043
+34FA01571DF9026509F60B7000F5287002FE446B02FE446B02FE446B02FE44
+6B02FE446B02FE446B02FE446B02FE446B02FE446B02FE446B02FE446B02FE
+446B02FE446B02FE446B02FE446BA85B0000A65E0000A6610000A8660000AC
+6C0000B5740000A9810001A28F00039CA0000698B6000B8BD3001276ED001C
+5DF6002D42FA00442AFF045411FF036300FF0E6C00FF356509FF545F09FF54
+5F09FF545F09FF545F09FF545F09FF545F09FF545F09FF545F09FF545F09FF
+545F09FF545F09FF545F09FF545F09FF545F09FF545FA85B0000A65E0000A6
+610000A8660000AC6C0000A07600009A8300019592000391A300058CBD000A
+82DF00126DF3001E50FD002E37FF034120FF075205FF046200FF196207FF45
+590FFF65530FFF65530FFF65530FFF65530FFF65530FFF65530FFF65530FFF
+65530FFF65530FFF65530FFF65530FFF65530FFF65530FFF65530FFF6553A8
+5B0000A65E0000A6610000A76600009B6D0000937900008F8600018C940002
+88A7000581C1000B75DE00145EF0001F44FD012E2DFF073F14FE045202FF0C
+5C00FF23590BFF554F10FF6E4B10FF6E4B10FF6E4B10FF6E4B10FF6E4B10FF
+6E4B10FF6E4B10FF6E4B10FF6E4B10FF6E4B10FF6E4B10FF6E4B10FF6E4B10
+FF6E4B10FF6E4BA85B0000A65E0000A66100009A6600008E6F00008A7B0000
+86880001839700027FAA000476C4000C67DC001550ED00203AFD052E22FF06
+3F0AFE025103FF195304FF314F0EFF63460DFF6F460DFF6F460DFF6F460DFF
+6F460DFF6F460DFF6F460DFF6F460DFF6F460DFF6F460DFF6F460DFF6F460D
+FF6F460DFF6F460DFF6F460DFF6F46A85B0000A65E00009B6100008C670000
+85710000827D00007F8A00007B99000175AE00056BC6000D59DB001644EB01
+2031FC082E18FD023F0BFE104804FF244A07FF40450BFF66410BFF72410BFF
+72410BFF72410BFF72410BFF72410BFF72410BFF72410BFF72410BFF72410B
+FF72410BFF72410BFF72410BFF72410BFF72410BFF7241A85B0000A15E0000
+8C610000826800007D7200007A7F0000778C0000729C00016BB100055FC700
+0D4DD9001639EA022225F8042E12FA073C0BFF1D4007FF314008FF4E3D08FF
+683D09FF733C09FF733C09FF733C09FF733C09FF733C09FF733C09FF733C09
+FF733C09FF733C09FF733C09FF733C09FF733C09FF733C09FF733C09FF733C
+A85B00008E5C0000816100007A69000076740000738000006F8E0000699F00
+0161B5000654C9000E42D900172DE901231BF4002F10FB12370BFF263907FF
+3D3906FF523906FF6B3906FF753806FF753806FF753806FF753806FF753806
+FF753806FF753806FF753806FF753806FF753806FF753806FF753806FF7538
+06FF753806FF753892590000815C000078620000726B00006F7600006C8200
+006690000060A3000158B900064AC9000E37D8001826F1012313FA003006FE
+113907FF2B3404FF423403FF573403FF6C3504FF763504FF763504FF763504
+FF763504FF763504FF763504FF763504FF763504FF763504FF763504FF7635
+04FF763504FF763504FF763504FF7635>
+<A7520000A7550000A8590000AC5E0000B2630001BC680004CA6E0008DC7200
+0EEF730017F8700123F8630134F752004BF03C0064E91F007FCC0E148CB000
+27969A00489B7B0071AB6503A1AF6503A1AF6503A1AF6503A1AF6503A1AF65
+03A1AF6503A1AF6503A1AF6503A1AF6503A1AF6503A1AF6503A1AF6503A1AF
+6503A1AF6503A1AFA7520000A7550000A8590000AC5E0000B2630001BC6800
+04CA6E0008DC72000EEF730017F8700123F8630134F752004BF03C0064E91F
+007FCC0E148CB00027969A00489B7B0071AB6503A1AF6503A1AF6503A1AF65
+03A1AF6503A1AF6503A1AF6503A1AF6503A1AF6503A1AF6503A1AF6503A1AF
+6503A1AF6503A1AF6503A1AF6503A1AFA7520000A7550000A8590000AC5E00
+00B2630001BC680004CA6E0008DC72000EEF730017F8700123F8630134F752
+004BF03C0064E91F007FCC0E148CB00027969A00489B7B0071AB6503A1AF65
+03A1AF6503A1AF6503A1AF6503A1AF6503A1AF6503A1AF6503A1AF6503A1AF
+6503A1AF6503A1AF6503A1AF6503A1AF6503A1AF6503A1AFA7520000A75500
+00A8590000AC5E0000B2630001BC680004CA6E0008DC72000EEF730017F870
+0123F8630134F752004BF03C0064E91F007FCC0E148CB00027969A00489B7B
+0071AB6503A1AF6503A1AF6503A1AF6503A1AF6503A1AF6503A1AF6503A1AF
+6503A1AF6503A1AF6503A1AF6503A1AF6503A1AF6503A1AF6503A1AF6503A1
+AFA7520000A7550000A8590000AC5E0000B2630001BC680004CA6E0008DC72
+000EEF730017F8700123F8630134F752004BF03C0064E91F007FCC0E148CB0
+0027969A00489B7B0071AB6503A1AF6503A1AF6503A1AF6503A1AF6503A1AF
+6503A1AF6503A1AF6503A1AF6503A1AF6503A1AF6503A1AF6503A1AF6503A1
+AF6503A1AF6503A1AFA7520000A7550000A8590000AC5E0000B2630001BC68
+0004CA6E0008DC72000EEF730017F8700123F8630134F752004BF03C0064E9
+1F007FCC0E148CB00027969A00489B7B0071AB6503A1AF6503A1AF6503A1AF
+6503A1AF6503A1AF6503A1AF6503A1AF6503A1AF6503A1AF6503A1AF6503A1
+AF6503A1AF6503A1AF6503A1AF6503A1AFA7520000A7550000A8590000AC5E
+0000B2630001BC680004CA6E0008DC72000EEF730017F8700123F8630134F7
+52004BF03C0064E91F007FCC0E148CB00027969A00489B7B0071AB6503A1AF
+6503A1AF6503A1AF6503A1AF6503A1AF6503A1AF6503A1AF6503A1AF6503A1
+AF6503A1AF6503A1AF6503A1AF6503A1AF6503A1AF6503A1AFA7520000A755
+0000A8590000AC5E0000B2630001BC680004CA6E0008DC72000EEF730017F8
+700123F8630134F752004BF03C0064E91F007FCC0E148CB00027969A00489B
+7B0071AB6503A1AF6503A1AF6503A1AF6503A1AF6503A1AF6503A1AF6503A1
+AF6503A1AF6503A1AF6503A1AF6503A1AF6503A1AF6503A1AF6503A1AF6503
+A1AFA7520000A7550000A8590000AC5E0000B2630001BC680004CA6E0008DC
+72000EEF730017F8700123F8630134F752004BF03C0064E91F007FCC0E148C
+B00027969A00489B7B0071AB6503A1AF6503A1AF6503A1AF6503A1AF6503A1
+AF6503A1AF6503A1AF6503A1AF6503A1AF6503A1AF6503A1AF6503A1AF6503
+A1AF6503A1AF6503A1AFA7520000A7550000A8590000AC5E0000B2630001BC
+680004CA6E0008DC72000EEF730017F8700123F8630134F752004BF03C0064
+E91F007FCC0E148CB00027969A00489B7B0071AB6503A1AF6503A1AF6503A1
+AF6503A1AF6503A1AF6503A1AF6503A1AF6503A1AF6503A1AF6503A1AF6503
+A1AF6503A1AF6503A1AF6503A1AF6503A1AFA7520000A7550000A8590000AC
+5E0000B2630001BC680004CA6E0008DC72000EEF730017F8700123F8630134
+F752004BF03C0064E91F007FCC0E148CB00027969A00489B7B0071AB6503A1
+AF6503A1AF6503A1AF6503A1AF6503A1AF6503A1AF6503A1AF6503A1AF6503
+A1AF6503A1AF6503A1AF6503A1AF6503A1AF6503A1AF6503A1AFA7520000A7
+550000A8590000AC5E0000B2630001BC680004CA6E0008DC72000EEF730017
+F8700123F8630134F752004BF13C0063E91F007ECB0E148CB00026969A0047
+9C7B006FAC63039FB063039FB063039FB063039FB063039FB063039FB06303
+9FB063039FB063039FB063039FB063039FB063039FB063039FB063039FB063
+039FB0A7530000A7560000A85A0000AB5E0000B1630001BB690003C96F0008
+DB74000DEF760015F9740120F9670131F5560047F1440060E324007ACA110E
+8CAA001E9997003D9F77005EAE4A0178BB4A0178BB4A0178BB4A0178BB4A01
+78BB4A0178BB4A0178BB4A0178BB4A0178BB4A0178BB4A0178BB4A0178BB4A
+0178BB4A0178BB4A0178BBA7530000A7560000A85A0000AB5F0000B1640001
+BA6A0003C86F0007DB75000CF0790013FA77011EF86C022EF45C0043EE4900
+5CEE2D0075C814098DA702189B940032A273004FB131004FC831004FC83100
+4FC831004FC831004FC831004FC831004FC831004FC831004FC831004FC831
+004FC831004FC831004FC831004FC831004FC8A7540000A7570000A85A0000
+AA5F0000B0640000BA6A0003C7700007DA77000BF07C0011FB7A011CFC7302
+2AF261003FEB4E0058EA340071C417028DA606139B8F0027A66F0042B42300
+5DC823005FC723005FC723005FC723005FC723005FC723005FC723005FC723
+005FC723005FC723005FC723005FC723005FC723005FC723005FC7A7540000
+A7570000A75B0000AA5F0000AF650000B96B0002C6710006DA78000AF07D00
+10FC7E011AF8760327F166003BE8530054E53D006CC71D0089A80E0F994602
+20C6030004E70D0A69C60D0A69C60D0A69C60D0A69C60D0A69C60D0A69C60D
+0A69C60D0A69C60D0A69C60D0A69C60D0A69C60D0A69C60D0A69C60D0A69C6
+0D0A69C6A7540000A6570000A75B0000AA600000AF650000B86B0002C57200
+05D97A0009EF7F000FFA800118F87C0324EF6B0038E359004FD8460066B831
+00808D26079C440B01C6121136D1002855C5002855C5002855C5002855C500
+2855C5002855C5002855C5002855C5002855C5002855C5002855C5002855C5
+002855C5002855C5002855C5A7550000A6580000A75B0000A9600000AE6500
+00B76C0002C4730004D87B0008EE81000EF8820016F67F0222EB700034DD61
+0049B55E005F9A5C0471744F0091403700B80F1E09D300401DC700401DC700
+401DC700401DC700401DC700401DC700401DC700401DC700401DC700401DC7
+00401DC700401DC700401DC700401DC700401DC7A8550000A6580000A75C00
+00A9600000AD660000B66C0001C2740004D77C0007EF83000BF6850013F181
+011FE1780030BF790040A17A04518780075F637C017D3F76049813720BAB00
+4A08C0004A08C0004A08C0004A08C0004A08C0004A08C0004A08C0004A08C0
+004A08C0004A08C0004A08C0004A08C0004A08C0004A08C0004A08C0A85600
+00A6590000A65C0000A8610000AC660000B46D0001C1750003D57D0005EE86
+0009F6880011E885001ABE860027A0880034889304426A9C00574EA4016C2F
+A40182118B0397008E169C008E169C008E169C008E169C008E169C008E169C
+008E169C008E169C008E169C008E169C008E169C008E169C008E169C008E16
+9C008E169CA8560000A6590000A65D0000A8610000AB670000B26E0001BF76
+0002D37F0004ED880007EE8B000CC6900015AC98001B91A7002476B600335C
+BD004A42C1006229C0027516BD118000A4169100A4169100A4169100A41691
+00A4169100A4169100A4169100A4169100A4169100A4169100A4169100A416
+9100A4169100A4169100A41691A8570000A65A0000A65E0000A7620000AA67
+0000B06E0000BD770001D1800002EA8A0005CD95000AB49E00109EAB001786
+BF00216BCB003450CE004C38D2006222D806700FCF117C00CE268100CE2681
+00CE268100CE268100CE268100CE268100CE268100CE268100CE268100CE26
+8100CE268100CE268100CE268100CE268100CE2681A9580000A75B0000A65E
+0000A6630000A9680000AF6F0000BC770001D1800002C28E0005B69E0009A5
+AB000E93C100157CD5002262DB003548DE004C30EA015F1BF1076C06E60F79
+00F23C7400F23D7400F23D7400F23D7400F23D7400F23D7400F23D7400F23D
+7400F23D7400F23D7400F23D7400F23D7400F23D7400F23D7400F23D74AA59
+0000A75C0000A65F0000A6630000A9680000AF6F0000BC770001B3830002AB
+920004A4A300099BB8000D8AD3001473E6002259ED003440F2004D27FD035C
+11FF066A00FF157207FF516607FF546507FF546507FF546507FF546507FF54
+6507FF546507FF546507FF546507FF546507FF546507FF546507FF546507FF
+546507FF5465AA5A0000A75C0000A65F0000A6630000A9680000AF6F0000A7
+790000A18700019C95000497A8000791C3000C83E500146AF300224FFC0035
+37FF044A1DFF055A04FF066800FF1F660EFF62590EFF65580EFF65580EFF65
+580EFF65580EFF65580EFF65580EFF65580EFF65580EFF65580EFF65580EFF
+65580EFF65580EFF65580EFF6558AA5A0000A75C0000A65F0000A6630000A9
+680000A16F0000987B000094890002909800038CAD000785CA000D78EA0016
+5DF5002442FF01352BFF074711FF055800FF0F6100FF295C12FF714E12FF72
+4E12FF724E12FF724E12FF724E12FF724E12FF724E12FF724E12FF724E12FF
+724E12FF724E12FF724E12FF724E12FF724E12FF724EAA5A0000A75C0000A6
+5F0000A66300009E680000937100008D7E00008A8B0001879B000382B10006
+7ACD000E68E400184EF3002538FF053420FF054607FE035700FF1A5905FF3A
+520FFF72490FFF73490FFF73490FFF73490FFF73490FFF73490FFF73490FFF
+73490FFF73490FFF73490FFF73490FFF73490FFF73490FFF73490FFF7349AA
+5A0000A75C0000A65F0000A06300008F6900008973000085800000828D0001
+7E9E000278B400076DCE000F5AE2001943F102252FFF083314FE024607FE11
+4E01FF254F09FF4B470CFF74430CFF75430CFF75430CFF75430CFF75430CFF
+75430CFF75430CFF75430CFF75430CFF75430CFF75430CFF75430CFF75430C
+FF75430CFF7543AA5A0000A75C0000A45F00008F630000856A000081750000
+7E8200007A90000075A100026EB8000861CF00104CDF001A38F0042523FC05
+340FFC084208FF1E4504FF33450AFF563F0AFF763F0AFF773E0AFF773E0AFF
+773E0AFF773E0AFF773E0AFF773E0AFF773E0AFF773E0AFF773E0AFF773E0A
+FF773E0AFF773E0AFF773E0AFF773EAA5A0000A75C0000905E000083630000
+7D6C00007977000076830000729200006CA4000362BA000855CF001041DF00
+1B2CEF032719F801350FFD163B0AFF2A3C08FF433B07FF5A3B08FF773908FF
+783908FF783908FF783908FF783908FF783908FF783908FF783908FF783908
+FF783908FF783908FF783908FF783908FF783908FF7839AA5A0000935A0000
+835D00007A640000756E0000727900006E8500006994000062A8000359BF00
+084ACF001135DE001C23F0002711F9033509FE193908FF313705FF493704FF
+5E3605FF783606FF793606FF793606FF793606FF793606FF793606FF793606
+FF793606FF793606FF793606FF793606FF793606FF793606FF793606FF7936
+9958000084590000795E0000726600006D7000006A7B0000658700005F9800
+0059AC00034FC0000940CE00112DE2001C1DFC012607FC023705FE1E3505FF
+373202FF4E3202FF613202FF793203FF7A3203FF7A3203FF7A3203FF7A3203
+FF7A3203FF7A3203FF7A3203FF7A3203FF7A3203FF7A3203FF7A3203FF7A32
+03FF7A3203FF7A328756000079580000705F00006A67000066710000627D00
+005C8A0000579B000051B0000347C3000936CD001126EC011B13FC012803FD
+093306FF272D02FF3D2E01FF532D01FF652D02FF7A2E02FF7B2E02FF7B2E02
+FF7B2E02FF7B2E02FF7B2E02FF7B2E02FF7B2E02FF7B2E02FF7B2E02FF7B2E
+02FF7B2E02FF7B2E02FF7B2E02FF7B2E>
+<A74E0000A7510000A8550000AA590000AF5E0000B8620003C3670007D26A00
+0EE36A0016F1660022F2590033F1480049EA320061DA16007CD0081A85C700
+398AAF00608A9E008B95A409EF8BA30BFD89A30BFD89A30BFD89A30BFD89A3
+0BFD89A30BFD89A30BFD89A30BFD89A30BFD89A30BFD89A30BFD89A30BFD89
+A30BFD89A30BFD89A74E0000A7510000A8550000AA590000AF5E0000B86200
+03C3670007D26A000EE36A0016F1660022F2590033F1480049EA320061DA16
+007CD0081A85C700398AAF00608A9E008B95A409EF8BA30BFD89A30BFD89A3
+0BFD89A30BFD89A30BFD89A30BFD89A30BFD89A30BFD89A30BFD89A30BFD89
+A30BFD89A30BFD89A30BFD89A30BFD89A74E0000A7510000A8550000AA5900
+00AF5E0000B8620003C3670007D26A000EE36A0016F1660022F2590033F148
+0049EA320061DA16007CD0081A85C700398AAF00608A9E008B95A409EF8BA3
+0BFD89A30BFD89A30BFD89A30BFD89A30BFD89A30BFD89A30BFD89A30BFD89
+A30BFD89A30BFD89A30BFD89A30BFD89A30BFD89A30BFD89A74E0000A75100
+00A8550000AA590000AF5E0000B8620003C3670007D26A000EE36A0016F166
+0022F2590033F1480049EA320061DA16007CD0081A85C700398AAF00608A9E
+008B95A409EF8BA30BFD89A30BFD89A30BFD89A30BFD89A30BFD89A30BFD89
+A30BFD89A30BFD89A30BFD89A30BFD89A30BFD89A30BFD89A30BFD89A30BFD
+89A74E0000A7510000A8550000AA590000AF5E0000B8620003C3670007D26A
+000EE36A0016F1660022F2590033F1480049EA320061DA16007CD0081A85C7
+00398AAF00608A9E008B95A409EF8BA30BFD89A30BFD89A30BFD89A30BFD89
+A30BFD89A30BFD89A30BFD89A30BFD89A30BFD89A30BFD89A30BFD89A30BFD
+89A30BFD89A30BFD89A74E0000A7510000A8550000AA590000AF5E0000B862
+0003C3670007D26A000EE36A0016F1660022F2590033F1480049EA320061DA
+16007CD0081A85C700398AAF00608A9E008B95A409EF8BA30BFD89A30BFD89
+A30BFD89A30BFD89A30BFD89A30BFD89A30BFD89A30BFD89A30BFD89A30BFD
+89A30BFD89A30BFD89A30BFD89A30BFD89A74E0000A7510000A8550000AA59
+0000AF5E0000B8620003C3670007D26A000EE36A0016F1660022F2590033F1
+480049EA320061DA16007CD0081A85C700398AAF00608A9E008B95A409EF8B
+A30BFD89A30BFD89A30BFD89A30BFD89A30BFD89A30BFD89A30BFD89A30BFD
+89A30BFD89A30BFD89A30BFD89A30BFD89A30BFD89A30BFD89A74E0000A751
+0000A8550000AA590000AF5E0000B8620003C3670007D26A000EE36A0016F1
+660022F2590033F1480049EA320061DA16007CD0081A85C700398AAF00608A
+9E008B95A409EF8BA30BFD89A30BFD89A30BFD89A30BFD89A30BFD89A30BFD
+89A30BFD89A30BFD89A30BFD89A30BFD89A30BFD89A30BFD89A30BFD89A30B
+FD89A74E0000A7510000A8550000AA590000AF5E0000B8620003C3670007D2
+6A000EE36A0016F1660022F2590033F1480049EA320061DA16007CD0081A85
+C700398AAF00608A9E008B95A409EF8BA30BFD89A30BFD89A30BFD89A30BFD
+89A30BFD89A30BFD89A30BFD89A30BFD89A30BFD89A30BFD89A30BFD89A30B
+FD89A30BFD89A30BFD89A74E0000A7510000A8550000AA590000AF5E0000B8
+620003C3670007D26A000EE36A0016F1660022F2590033F1480049EA320061
+DA16007CD0081A85C700398AAF00608A9E008B95A409EF8BA30BFD89A30BFD
+89A30BFD89A30BFD89A30BFD89A30BFD89A30BFD89A30BFD89A30BFD89A30B
+FD89A30BFD89A30BFD89A30BFD89A30BFD89A74E0000A7520000A8560000AA
+590000AF5E0000B7630002C3670007D26B000DE36C0015F3690020F45C0031
+F44C0047F037005FDE1A0079D30A1786C600328CAF00598C9D0080969B08E1
+919E0AF68E9E0AF68E9E0AF68E9E0AF68E9E0AF68E9E0AF68E9E0AF68E9E0A
+F68E9E0AF68E9E0AF68E9E0AF68E9E0AF68E9E0AF68E9E0AF68EA74F0000A6
+520000A8560000AA5A0000AE5E0000B7640002C2680007D16C000CE36F0014
+F36B001FF560002EF5500044F43F005CE21F0076D40E1286C300298EB1004F
+8F9A0073998E05CD9A9308E7979308E7979308E7979308E7979308E7979308
+E7979308E7979308E7979308E7979308E7979308E7979308E7979308E79793
+08E797A74F0000A7520000A7560000AA5A0000AE5F0000B6640002C1690006
+D16E000BE3710012F36E001DF664012CF6550041F2430059E6250072D5110D
+86C0012191B10044919600659B7D03B4A38406D1A08406D1A08406D1A08406
+D1A08406D1A08406D1A08406D1A08406D1A08406D1A08406D1A08406D1A084
+06D1A08406D1A08406D1A0A74F0000A7530000A7570000A95B0000AD5F0000
+B5640002C16A0006D06F000BE3730011F470001CF8690129F75B003DF74900
+56E92C006ED7140787BF041D91AF003A949200599E6B0299AE7104B4A97104
+B4A97104B4A97104B4A97104B4A97104B4A97104B4A97104B4A97104B4A971
+04B4A97104B4A97104B4A97104B4A97104B4A9A7500000A7530000A7570000
+A95B0000AD600000B5650002C06A0005D070000AE2740010F573001AF96D02
+27F860003AF44D0052EF35006AD5170187BF081891AB002F97850053A74200
+BBB23500F9AB3500F9AB3500F9AB3500F9AB3500F9AB3500F9AB3500F9AB35
+00F9AB3500F9AB3500F9AB3500F9AB3500F9AB3500F9AB3500F9ABA8510000
+A7540000A7570000A85B0000AC600000B4650001BF6B0005CF710009E27600
+0FF5770018FA730224F8650136F553004EEF3E0066E11E0082B61111938000
+1BAE210330D11300C5B40E00E0B00E00E0B00E00E0B00E00E0B00E00E0B00E
+00E0B00E00E0B00E00E0B00E00E0B00E00E0B00E00E0B00E00E0B00E00E0B0
+0E00E0B0A8510000A7540000A7580000A85C0000AC600000B3660001BE6C00
+04CE730008E178000DF77B0015FB790221F76B0132EF590048E1490061B939
+007A8F2C0797491700C10F1361C300166DC00017F4B10017F4B10017F4B100
+17F4B10017F4B10017F4B10017F4B10017F4B10017F4B10017F4B10017F4B1
+0017F4B10017F4B10017F4B1A9520000A7550000A7580000A85C0000AB6100
+00B2670001BD6D0003CC740007E07A000CF7800012FD7E021DFA74022CE068
+0042AE68005A9363036F6E5A008E394E00AF0E3514C8003C3AC300588EB100
+588EB100588EB100588EB100588EB100588EB100588EB100588EB100588EB1
+00588EB100588EB100588EB100588EB100588EB1A9530000A7560000A65900
+00A75D0000AA610000B1670000BB6E0003CA750006DF7D0009F5810010F780
+011AE37B002AB67D003B947E00527D8202635D81017C3A810594137510A900
+6A23B300813CA600813CA600813CA600813CA600813CA600813CA600813CA6
+00813CA600813CA600813CA600813CA600813CA600813CA600813CA6A95400
+00A7560000A6590000A75D0000A9620000AF680000B96F0002C9770004DE7F
+0008F685000DE1880017B68B00239B8F002F829400426A9D00554DAA01682D
+AB017E1096039000991A9800AA399200AA399200AA399200AA399200AA3992
+00AA399200AA399200AA399200AA399200AA399200AA399200AA399200AA39
+9200AA3992AA540000A7570000A65A0000A65E0000A9630000AE690000B770
+0001C6780003DB810006DA8C000ABD950012A7A0001892AE002079BC002E5E
+C5004444CC00592BD1006B17D50C7602C5168400D12B7F00D12B7F00D12B7F
+00D12B7F00D12B7F00D12B7F00D12B7F00D12B7F00D12B7F00D12B7F00D12B
+7F00D12B7F00D12B7F00D12B7FAA550000A8580000A65B0000A65F0000A863
+0000AC690000B5710001C37A0002C5850003B9940005AEA4000B9CB3001189
+CE001871DB002856E0003D3DE4005524F3016410F10A7000EE1E7801F84271
+01F8427101F8427101F8427101F8427101F8427101F8427101F8427101F842
+7101F8427101F8427101F8427101F8427101F84271AB560000A8590000A65C
+0000A6600000A7640000AA6A0000B3720000B57B0001AB890002A59800059F
+AD000993C4000F81E2001868ED00284CF3003D35FF02531BFE036104FB0A6E
+00FE2A6B0AFF5B610AFF5B610AFF5B610AFF5B610AFF5B610AFF5B610AFF5B
+610AFF5B610AFF5B610AFF5B610AFF5B610AFF5B610AFF5B610AFF5B61AC57
+0000A95A0000A65D0000A6600000A7640000AA6A0000AB720000A07E00019B
+8C0002969C000592B200098AD3000F78F000195DF8002942FE013E29FF064F
+0EFF046000FF136602FF375F13FF735213FF735213FF735213FF735213FF73
+5213FF735213FF735213FF735213FF735213FF735213FF735213FF735213FF
+735213FF7352AD580000A95A0000A65D0000A6600000A7640000A66A000099
+740000948100018F8F00028C9F000487B700087ED800106BEF001B4EFA002A
+35FF043B1DFF064E03FF045E00FF1E5C08FF495411FF784C11FF784C11FF78
+4C11FF784C11FF784C11FF784C11FF784C11FF784C11FF784C11FF784C11FF
+784C11FF784C11FF784C11FF784CAD580000A95A0000A65D0000A6600000A6
+640000946B00008D7600008A8300018691000182A300037CBB00096FD50012
+5BEA001C42F8022A2CFF083A12FE024E04FF125502FF2A530CFF5B490EFF79
+460EFF79460EFF79460EFF79460EFF79460EFF79460EFF79460EFF79460EFF
+79460EFF79460EFF79460EFF79460EFF79460EFF7946AD580000A95A0000A6
+5D0000A660000092640000896D000084780000818500007E93000079A60003
+71BF000A62D600134DE7001D38F706291FFE053A0CFE084904FF1E4C06FF39
+480CFF62420BFF7B410BFF7B410BFF7B410BFF7B410BFF7B410BFF7B410BFF
+7B410BFF7B410BFF7B410BFF7B410BFF7B410BFF7B410BFF7B410BFF7B41AD
+580000A95A0000A65D0000935F000086650000806F00007C7A00007A870000
+759600006FA9000464C0000B54D4001440E6001E2CF5052B16FA013B0CFF16
+4107FF2B4108FF4A3E09FF653E0AFF7D3C0AFF7D3C0AFF7D3C0AFF7D3C0AFF
+7D3C0AFF7D3C0AFF7D3C0AFF7D3C0AFF7D3C0AFF7D3C0AFF7D3C0AFF7D3C0A
+FF7D3C0AFF7D3CAD580000A95A0000965C0000855F00007D66000078700000
+757C0000728900006C99000065AD00045AC4000B49D4001434E5001F21F101
+2C13FA0D350CFF213A08FF383906FF4F3906FF683908FF7E3708FF7E3708FF
+7E3708FF7E3708FF7E3708FF7E3708FF7E3708FF7E3708FF7E3708FF7E3708
+FF7E3708FF7E3708FF7E3708FF7E37AD5800009C590000875A00007B5F0000
+74680000707200006D7E0000698B0000639C00005BB100044FC4000C3ED400
+152BEA01201AFA012B09FC0C3808FF263505FF3E3403FF553503FF6A3505FF
+7E3405FF7E3405FF7E3405FF7E3405FF7E3405FF7E3405FF7E3405FF7E3405
+FF7E3405FF7E3405FF7E3405FF7E3405FF7E3405FF7E34A458000089570000
+7B5A0000726000006D69000069740000658000005F8E00005AA0000053B600
+0446C7000C34D3001524F6011F0FFD012D02FE0F3605FF2C3003FF443001FF
+5A3001FF6D3003FF7E3003FF7E3003FF7E3003FF7E3003FF7E3003FF7E3003
+FF7E3003FF7E3003FF7E3003FF7E3003FF7E3003FF7E3003FF7E3003FF7E30
+8E5500007C560000715A00006A620000656B0000617600005B820000569100
+0052A400004AB800043CC6000C2CD900151DF9011F07F8002F06FE1C2C04FF
+332B00FF4A2C00FF5E2B01FF6F2B02FF7F2B02FF7F2B02FF7F2B02FF7F2B02
+FF7F2B02FF7F2B02FF7F2B02FF7F2B02FF7F2B02FF7F2B02FF7F2B02FF7F2B
+02FF7F2B02FF7F2B7F52000072550000695B0000626200005D6C0000597700
+00538500004E9400004AA8000042B9000532C3000D24E0001614F100210BF8
+0F2608FF252502FF392700FF4F2700FF622601FF712701FF802701FF802701
+FF802701FF802701FF802701FF802701FF802701FF802701FF802701FF8027
+01FF802701FF802701FF802701FF8027>
+<A6490000A64C0000A7500000AA550000AE590000B55D0001BE5F0006CB6100
+0DDA610016E75C0021E6500031E13D0045D426005EC20E0177BC061D7BB400
+3A7EAE00667DAA0095819F03DD7D9C0CFF739C0CFF749C0CFF749C0CFF749C
+0CFF749C0CFF749C0CFF749C0CFF749C0CFF749C0CFF749C0CFF749C0CFF74
+9C0CFF749C0CFF74A6490000A64C0000A7500000AA550000AE590000B55D00
+01BE5F0006CB61000DDA610016E75C0021E6500031E13D0045D426005EC20E
+0177BC061D7BB4003A7EAE00667DAA0095819F03DD7D9C0CFF739C0CFF749C
+0CFF749C0CFF749C0CFF749C0CFF749C0CFF749C0CFF749C0CFF749C0CFF74
+9C0CFF749C0CFF749C0CFF749C0CFF74A6490000A64C0000A7500000AA5500
+00AE590000B55D0001BE5F0006CB61000DDA610016E75C0021E6500031E13D
+0045D426005EC20E0177BC061D7BB4003A7EAE00667DAA0095819F03DD7D9C
+0CFF739C0CFF749C0CFF749C0CFF749C0CFF749C0CFF749C0CFF749C0CFF74
+9C0CFF749C0CFF749C0CFF749C0CFF749C0CFF749C0CFF74A6490000A64C00
+00A7500000AA550000AE590000B55D0001BE5F0006CB61000DDA610016E75C
+0021E6500031E13D0045D426005EC20E0177BC061D7BB4003A7EAE00667DAA
+0095819F03DD7D9C0CFF739C0CFF749C0CFF749C0CFF749C0CFF749C0CFF74
+9C0CFF749C0CFF749C0CFF749C0CFF749C0CFF749C0CFF749C0CFF749C0CFF
+74A6490000A64C0000A7500000AA550000AE590000B55D0001BE5F0006CB61
+000DDA610016E75C0021E6500031E13D0045D426005EC20E0177BC061D7BB4
+003A7EAE00667DAA0095819F03DD7D9C0CFF739C0CFF749C0CFF749C0CFF74
+9C0CFF749C0CFF749C0CFF749C0CFF749C0CFF749C0CFF749C0CFF749C0CFF
+749C0CFF749C0CFF74A6490000A64C0000A7500000AA550000AE590000B55D
+0001BE5F0006CB61000DDA610016E75C0021E6500031E13D0045D426005EC2
+0E0177BC061D7BB4003A7EAE00667DAA0095819F03DD7D9C0CFF739C0CFF74
+9C0CFF749C0CFF749C0CFF749C0CFF749C0CFF749C0CFF749C0CFF749C0CFF
+749C0CFF749C0CFF749C0CFF749C0CFF74A6490000A64C0000A7500000AA55
+0000AE590000B55D0001BE5F0006CB61000DDA610016E75C0021E6500031E1
+3D0045D426005EC20E0177BC061D7BB4003A7EAE00667DAA0095819F03DD7D
+9C0CFF739C0CFF749C0CFF749C0CFF749C0CFF749C0CFF749C0CFF749C0CFF
+749C0CFF749C0CFF749C0CFF749C0CFF749C0CFF749C0CFF74A6490000A64C
+0000A7500000AA550000AE590000B55D0001BE5F0006CB61000DDA610016E7
+5C0021E6500031E13D0045D426005EC20E0177BC061D7BB4003A7EAE00667D
+AA0095819F03DD7D9C0CFF739C0CFF749C0CFF749C0CFF749C0CFF749C0CFF
+749C0CFF749C0CFF749C0CFF749C0CFF749C0CFF749C0CFF749C0CFF749C0C
+FF74A6490000A64D0000A7510000AA550000AE590000B45D0001BD600006CB
+62000DDA620015E75D0020E7510030E23F0044D729005DC40F0076BE071C7C
+B600387FAF00647EAB009382A003DB7F9D0CFF759D0CFF759D0CFF759D0CFF
+759D0CFF759D0CFF759D0CFF759D0CFF759D0CFF759D0CFF759D0CFF759D0C
+FF759D0CFF759D0CFF75A6490000A64D0000A7510000AA550000AD590000B4
+5E0001BD600006CA63000CD9640014E960001FE954002EE5430042DE2E005B
+CA130074C209197DBA003381B1006181AE008D84A403D7839E0CFF789F0CFF
+789F0CFF789F0CFF789F0CFF789F0CFF789F0CFF789F0CFF789F0CFF789F0C
+FF789F0CFF789F0CFF789F0CFF789F0CFF78A74A0000A64E0000A7520000A9
+560000AD5A0000B35E0001BC610006CA64000CD9660013E862001DEB57002C
+E8470040E5340059CF180071C70B157DBF002F83B4005B83B2008986A603D2
+87A00CFF7CA00CFF7CA00CFF7CA00CFF7CA00CFF7CA00CFF7CA00CFF7CA00C
+FF7CA00CFF7CA00CFF7CA00CFF7CA00CFF7CA00CFF7CA00CFF7CA74A0000A7
+4E0000A7520000A9560000AD5A0000B35F0001BC620005C965000BD9680012
+E864001CED5B002AEB4B003EEB3A0056D61C006FCC0D117EC5002B85B80055
+85B4008489A502C88CA20CFF7FA20CFF7FA20CFF7FA20CFF7FA20CFF7FA20C
+FF7FA20CFF7FA20CFF7FA20CFF7FA20CFF7FA20CFF7FA20CFF7FA20CFF7FA2
+0CFF7FA74B0000A74F0000A7520000A9560000AC5A0000B25F0001BB620005
+C966000AD96A0011E867001BEF5E0028EE50003BEE3E0054DD21006CD10F0D
+7FCA002787BC004F87B1007B8C9E02B991A40CFE83A40CFE83A40CFE83A40C
+FE83A40CFE83A40CFE83A40CFE83A40CFE83A40CFE83A40CFE83A40CFE83A4
+0CFE83A40CFE83A40CFE83A74C0000A74F0000A7530000A8570000AC5B0000
+B25F0001BA630004C8680009D86B0010E869001AF2620026F2550039F24300
+51E527006AD6110881CE032288C000488AA9006D8E9401A898970AFE8C8B08
+FF908B08FF908B08FF908B08FF908B08FF908B08FF908B08FF908B08FF908B
+08FF908B08FF908B08FF908B08FF908B08FF90A84C0000A7500000A7530000
+A8570000AB5B0000B1600001BA640004C76A0008D76D000FE86C0018F56700
+24F55A0036F549004DEC300066DC150181D0081D89B60039909100679F6501
+C8AB3F00FFA13C00FFA13C00FFA13C00FFA13C00FFA13C00FFA13C00FFA13C
+00FFA13C00FFA13C00FFA13C00FFA13C00FFA13C00FFA13C00FFA1A84D0000
+A7500000A7540000A8580000AB5C0000B0610000B9650003C66B0008D66F00
+0EE8700016F66D0121F7600132F6500049F13A0061DE1E007CAE14118E7C00
+1BA847045FB81C01BDB21400FFA71100FFA71100FFA71100FFA71100FFA711
+00FFA71100FFA71100FFA71100FFA71100FFA71100FFA71100FFA71100FFA7
+1100FFA7A94E0000A7510000A7540000A8580000AA5C0000AF610000B86700
+02C56C0007D671000CE9750013F872011EF868012DF4570043D44C005B9F3D
+00757A2C01924B1B00B614133DC0021C70BE0219FFA7021BFFA7021BFFA702
+1BFFA7021BFFA7021BFFA7021BFFA7021BFFA7021BFFA7021BFFA7021BFFA7
+021BFFA7021BFFA7021BFFA7A94F0000A7520000A7550000A7590000AA5D00
+00AE620000B6670002C36D0006D574000AE9780010F977011BFB710228D86D
+003DA5690055835E006D625B008A2C4D00A90D4C20BD004044BF004EF39F00
+51F29E0051F29E0051F29E0051F29E0051F29E0051F29E0051F29E0051F29E
+0051F29E0051F29E0051F29E0051F29E0051F29EAA500000A8530000A75600
+00A7590000A95E0000AD630000B5680001C16F0005D3760008E87B000EFB7E
+0116D07F0026AC8000378E80004C74810062517E007A28760494066D12A801
+7850A5009CB591009EB391009EB391009EB391009EB391009EB391009EB391
+009EB391009EB391009EB391009EB391009EB391009EB391009EB391AB5100
+00A8540000A7570000A65A0000A85E0000AC630000B3690001BF710003D178
+0007E77F000BC9870015AD8C001F9992002C8395003E6A9E00544AA0006828
+A0007D12A3128A00A6259000CF758600D1768500D1768500D1768500D17685
+00D1768500D1768500D1768500D1768500D1768500D1768500D1768500D176
+8500D17685AB520000A9550000A7570000A65B0000A85F0000AA640000B16A
+0000BD720002CF7A0005BE850009AD910010A3A2001591B1001E7CBD002B62
+C5004046CC005628CE00680CC8047701D71C7C00F5567300F7597200F75972
+00F7597200F7597200F7597200F7597200F7597200F7597200F7597200F759
+7200F7597200F7597200F75972AC530000A9560000A7590000A65C0000A760
+0000A9650000AE6B0000B9730001AF7F0003A68D00049F9E00089AB5000B8C
+D1001276EA001D5CF3002F41F8004727FE04580DFF056800FD186D09FF5561
+0CFF605F0CFF605F0CFF605F0CFF605F0CFF605F0CFF605F0CFF605F0CFF60
+5F0CFF605F0CFF605F0CFF605F0CFF605F0CFF605FAD540000AA570000A75A
+0000A65D0000A6610000A8660000AC6C0000A27600009C8300019792000392
+A400068EBE000A83E100136CF3001F4FFD003035FF04441BFF065600FF0566
+00FF236110FF675313FF765013FF765013FF765013FF765013FF765013FF76
+5013FF765013FF765013FF765013FF765013FF765013FF765013FF7650AF56
+0000AB580000A85B0000A65E0000A6610000A86600009B6D0000937900008F
+8600018C95000288A8000581C2000B74E000145BF1002042FF01302AFF0842
+0FFE035500FF135D02FF305710FF704B10FF7B4A10FF7B4A10FF7B4A10FF7B
+4A10FF7B4A10FF7B4A10FF7B4A10FF7B4A10FF7B4A10FF7B4A10FF7B4A10FF
+7B4A10FF7B4AB0570000AB590000A85B0000A65E0000A6610000986600008E
+6F0000897B000086880001839700027EAB000575C6000C65DE00164DEE0021
+37FF062F1DFE054209FE095100FF1F5308FF444B0DFF71450DFF80450DFF80
+450DFF80450DFF80450DFF80450DFF80450DFF80450DFF80450DFF80450DFF
+80450DFF80450DFF80450DFF8045B0570000AB590000A85B0000A65E000099
+6100008A67000084710000817D00007E8A00007A9A000173AF000568C8000D
+55DB001741EC02212CFD072F13FC014209FF174803FF2C480BFF54410AFF74
+400CFF833E0CFF833E0CFF833E0CFF833E0CFF833E0CFF833E0CFF833E0CFF
+833E0CFF833E0CFF833E0CFF833E0CFF833E0CFF833EB0570000AC590000A8
+5B00009B5D000089610000806800007C730000797F0000768C0000709D0001
+69B300065CCA000E49DA001734EB022321F8033011FB0E3C0AFF233E07FF3D
+3D08FF583C09FF753B0BFF84390BFF84390BFF84390BFF84390BFF84390BFF
+84390BFF84390BFF84390BFF84390BFF84390BFF84390BFF84390BFF8439B0
+570000AC590000A15B00008A5C00007E610000786A00007475000071810000
+6D8F000066A100025EB7000650CA000E3DDA001928EA002417F800310CFD15
+3909FF2C3806FF463705FF5D3706FF773708FF843508FF843508FF843508FF
+843508FF843508FF843508FF843508FF843508FF843508FF843508FF843508
+FF843508FF8435B0570000AA5900008C5800007E5C000075620000706C0000
+6C77000069830000639200005DA5000155BB000646CB000F33D9001922F601
+230DFB003305FE183706FF333303FF4B3302FF603303FF783304FF833104FF
+833104FF833104FF833104FF833104FF833104FF833104FF833104FF833104
+FF833104FF833104FF833104FF8331B0570000905600007F570000745C0000
+6D640000686D0000647900005F8500005995000054A900014CBE00063CCA00
+0F2BE101191AFE022403FB003505FE202F03FF392E01FF512E01FF642E02FF
+792F03FF832D03FF832D03FF832D03FF832D03FF832D03FF832D03FF832D03
+FF832D03FF832D03FF832D03FF832D03FF832D03FF832D9654000081540000
+745700006B5D000065650000606F00005C7A000056880000519800004CAD00
+0143BF000632C9001023E9011912F6012507FC102B07FF292801FF402A00FF
+562900FF682901FF7A2A02FF842902FF842902FF842902FF842902FF842902
+FF842902FF842902FF842902FF842902FF842902FF842902FF842902FF8429
+84510000755200006A570000635E00005D66000058700000537D00004D8B00
+004A9C000044AE000139BC00072ACE00111BE5001B0DF2052309FC1B2404FF
+2E2500FF452500FF5A2400FF6B2401FF7C2501FF842601FF842601FF842601
+FF842601FF842601FF842601FF842601FF842601FF842601FF842601FF8426
+01FF842601FF8426774F00006A520000625700005B5E000056670000517200
+004B7F0000468D0000429E00003BAE00022FBA000823D3001114E8001B06F1
+062304FB1E2200FF342300FF4A2000FF5E2000FF6E2000FF7D2100FF842200
+FF842200FF842200FF842200FF842200FF842200FF842200FF842200FF8422
+00FF842200FF842200FF842200FF8422>
+<A5440000A5470000A64A0000A84E0000AC530000B2570000BA590005C45900
+0CD1570015DC52001FDC46002FD5340043C41D005AB108056FAC022172A400
+3F739F0062729F00886F9500CA6E930BFF62930CFF62930CFF62930CFF6293
+0CFF62930CFF62930CFF62930CFF62930CFF62930CFF62930CFF62930CFF62
+930CFF62930CFF62A5440000A5470000A64A0000A84E0000AC530000B25700
+00BA590005C459000CD1570015DC52001FDC46002FD5340043C41D005AB108
+056FAC022172A4003F739F0062729F00886F9500CA6E930BFF62930CFF6293
+0CFF62930CFF62930CFF62930CFF62930CFF62930CFF62930CFF62930CFF62
+930CFF62930CFF62930CFF62930CFF62A5440000A5470000A64A0000A84E00
+00AC530000B2570000BA590005C459000CD1570015DC52001FDC46002FD534
+0043C41D005AB108056FAC022172A4003F739F0062729F00886F9500CA6E93
+0BFF62930CFF62930CFF62930CFF62930CFF62930CFF62930CFF62930CFF62
+930CFF62930CFF62930CFF62930CFF62930CFF62930CFF62A5440000A54700
+00A64A0000A84E0000AC530000B2570000BA590005C459000CD1570015DC52
+001FDC46002FD5340043C41D005AB108056FAC022172A4003F739F0062729F
+00886F9500CA6E930BFF62930CFF62930CFF62930CFF62930CFF62930CFF62
+930CFF62930CFF62930CFF62930CFF62930CFF62930CFF62930CFF62930CFF
+62A5440000A5470000A64A0000A84E0000AC530000B2570000BA590005C459
+000CD1570015DC52001FDC46002FD5340043C41D005AB108056FAC022172A4
+003F739F0062729F00886F9500CA6E930BFF62930CFF62930CFF62930CFF62
+930CFF62930CFF62930CFF62930CFF62930CFF62930CFF62930CFF62930CFF
+62930CFF62930CFF62A5440000A5470000A64A0000A84E0000AC530000B257
+0000BA590005C459000CD1570015DC52001FDC46002FD5340043C41D005AB1
+08056FAC022172A4003F739F0062729F00886F9500CA6E930BFF62930CFF62
+930CFF62930CFF62930CFF62930CFF62930CFF62930CFF62930CFF62930CFF
+62930CFF62930CFF62930CFF62930CFF62A5440000A5470000A64A0000A84F
+0000AC530000B2570000BA590005C459000CD1570015DD52001FDC46002FD5
+340043C41E005AB108046FAC022072A4003E739F0062729F0088709600C96E
+930BFE63940CFF63940CFF63940CFF63940CFF63940CFF63940CFF63940CFF
+63940CFF63940CFF63940CFF63940CFF63940CFF63940CFF63A5440000A547
+0000A64B0000A84F0000AC530000B2580000BA5A0004C45A000CD1590014DE
+55001EDE49002DD8370041C9210059B3090170AE021E74A6003B75A0005F74
+A10085719700C470940BFD65950CFF65950CFF65950CFF65950CFF65950CFF
+65950CFF65950CFF65950CFF65950CFF65950CFF65950CFF65950CFF65950C
+FF65A6440000A5480000A64B0000A8500000AC540000B1580000B95B0004C4
+5B000BD15B0013DF57001DDF4C002CDB3B0040CE250057B70C006FB1041B74
+A9003776A2005D76A30082739A00C073960BFB68960CFF67960CFF67960CFF
+67960CFF67960CFF67960CFF67960CFF67960CFF67960CFF67960CFF67960C
+FF67960CFF67960CFF67A6450000A5480000A64C0000A8500000AB540000B1
+590000B95B0004C35D000BD15D0012DF59001CE14E002BDD3E003ED4290055
+BB10006DB4061875AD003378A4005A78A5007E759C00BD76970AFA6B970CFF
+6A970CFF6A970CFF6A970CFF6A970CFF6A970CFF6A970CFF6A970CFF6A970C
+FF6A970CFF6A970CFF6A970CFF6A970CFF6AA6450000A5490000A64C0000A8
+510000AB550000B1590000B95C0004C35E000AD15F0012DF5B001BE2510029
+DF41003CD92F0053BF13006BB7081576B0002F7AA700567AA8007B779F00B9
+7A980AF96E990CFF6C990CFF6C990CFF6C990CFF6C990CFF6C990CFF6C990C
+FF6C990CFF6C990CFF6C990CFF6C990CFF6C990CFF6C990CFF6CA6460000A6
+490000A64D0000A8510000AB550000B15A0000B85D0003C35F0009D0600011
+DF5D001AE4540027E245003ADD330051C4170069BB091177B4002B7CAB0051
+7BAA007879A200B67D9A0AF8719A0CFF6F9A0CFF6F9A0CFF6F9A0CFF6F9A0C
+FF6F9A0CFF6F9A0CFF6F9A0CFF6F9A0CFF6F9A0CFF6F9A0CFF6F9A0CFF6F9A
+0CFF6FA7460000A64A0000A64E0000A8520000AB560000B05A0000B85E0003
+C2600009D0620010DF5F0019E6570026E54A0038E037004ECA1C0066BF0C0D
+78BA00277EB0004B7EAD00747CA500B2819C09F6759C0CFF739C0CFF739C0C
+FF739C0CFF739C0CFF739C0CFF739C0CFF739C0CFF739C0CFF739C0CFF739C
+0CFF739C0CFF739C0CFF73A7470000A64B0000A64E0000A8530000AB570000
+AF5B0000B75F0003C2620008CF63000FDE620018E95C0024E94F0035E43C00
+4BD2220063C50E0779BF03227FB6004480B2006F7FA700AD878B08F57F7208
+FF827108FF827108FF827108FF827108FF827108FF827108FF827108FF8271
+08FF827108FF827108FF827108FF827108FF82A8480000A74B0000A64F0000
+A8530000AA570000AF5B0000B6600002C1630007CE65000EDE650016EC6100
+21EC540032E8420047DC2B0060CD11007BC6061D80A200348A84005C946000
+9C9D4600EA983C00FF973B00FF973B00FF973B00FF973B00FF973B00FF973B
+00FF973B00FF973B00FF973B00FF973B00FF973B00FF973B00FF97A8490000
+A74C0000A6500000A8540000AA580000AE5C0000B5610001BF640006CD6700
+0CDE690014EE66001FF05A002EEE4A0043EA36005CC01E00758E1310886100
+14A3420142AD22007FAE1700D8A11100FF9D1000FF9D1000FF9D1000FF9D10
+00FF9D1000FF9D1000FF9D1000FF9D1000FF9D1000FF9D1000FF9D1000FF9D
+1000FF9DA94A0000A74D0000A7510000A7540000A9580000AD5D0000B46200
+01BE660005CC6A000BDE6E0011ED6B001CF461002AF553003EBD4B00568D3A
+006F6826018B3A1800AC120F25BB051970B40214C6A10217FF9D0217FF9D02
+17FF9D0217FF9D0217FF9D0217FF9D0217FF9D0217FF9D0217FF9D0217FF9D
+0217FF9D0217FF9D0217FF9DA94B0000A84E0000A7520000A7550000A85900
+00AC5E0000B3630001BD680004CB6D0009DC71000FEE700019F16B0125C26A
+0038976300507758006855500083233A009F0A371BAE004861AD0046B59900
+4BF093004BF093004BF093004BF093004BF093004BF093004BF093004BF093
+004BF093004BF093004BF093004BF093004BF093AA4C0000A8500000A75300
+00A7560000A85A0000AB5E0000B1640001BB690003C96F0007DB74000DE278
+0015BA7900229F7A0032847800476A79005E447000751F63048D0058139F00
+6C539A007B978D0085E4850085E4850085E4850085E4850085E4850085E485
+0085E4850085E4850085E4850085E4850085E4850085E4850085E485AC4E00
+00A9510000A7540000A7570000A75B0000AA5F0000AF650000B96B0002C671
+0006CC79000AB4810013A086001D908D00287B8F003A5F920050408E00651B
+81007B09831885008A3886009B738000C0B27A00C1B27A00C1B27A00C1B27A
+00C1B27A00C1B27A00C1B27A00C1B27A00C1B27A00C1B27A00C1B27A00C1B2
+7A00C1B27AAE4F0000AA530000A8550000A6580000A75C0000A9600000AE66
+0000B66C0001B8740004AB7F0008A08A000E979800148AA6001D77B000295A
+B3003E3DB0005320AB026605A9077500BD267400D5546F02F17F6902F17F69
+02F17F6902F17F6902F17F6902F17F6902F17F6902F17F6902F17F6902F17F
+6902F17F6902F17F6902F17F69AE500000AB540000A8560000A6590000A65D
+0000A8610000AB660000AB6E00019E79000299860004939400088EA8000B86
+C3001277E1001A5BEA002940EE013D27F3064F0BF7045F00FC186205FF405A
+13FF775013FF774F13FF774F13FF774F13FF774F13FF774F13FF774F13FF77
+4F13FF774F13FF774F13FF774F13FF774F13FF774FB0520000AB550000A957
+0000A65A0000A65E0000A7620000A3680000957100008F7E00008C8C000188
+9B000384B100077BCF000E69E700194EF5002636FF05371DFE054B04FF085A
+00FF23580BFF544F0FFF7C490FFF7C490FFF7C490FFF7C490FFF7C490FFF7C
+490FFF7C490FFF7C490FFF7C490FFF7C490FFF7C490FFF7C490FFF7C49B254
+0000AD560000AA590000A75C0000A65F0000A2630000916900008973000086
+800000838E00017F9E000278B500086DCF001059E4001A41F302262BFF0837
+10FE014B05FE175004FF334D0DFF62450DFF81430DFF81430DFF81430DFF81
+430DFF81430DFF81430DFF81430DFF81430DFF81430DFF81430DFF81430DFF
+81430DFF8143B3550000AE570000AA5A0000A75C0000A45F00008F63000085
+6A0000817600007E8200007A90000075A200026DB9000860D000114AE1001A
+36F305271FFC04370EFE0D4406FF244607FF44420AFF653F0CFF873C0CFF87
+3C0CFF873C0CFF873C0CFF873C0CFF873C0CFF873C0CFF873C0CFF873C0CFF
+873C0CFF873C0CFF873C0CFF873CB4550000AE570000AA5A0000A75C00008F
+5E0000826300007C6C00007978000076840000719300006BA5000361BC0009
+52D000113EE1001C29F0022816F803370EFE1B3B09FF333B07FF4E3B07FF68
+3B0AFF8A370BFF8C370BFF8C370BFF8C370BFF8C370BFF8C370BFF8C370BFF
+8C370BFF8C370BFF8C370BFF8C370BFF8C370BFF8C37B4550000AE570000AA
+5A0000915A0000815D000079640000746E0000707A00006D86000067950000
+60AA000357C0000947D0001232E0001D20F400280EFA073609FF203706FF3A
+3604FF543604FF6A3607FF893308FF8B3308FF8B3308FF8B3308FF8B3308FF
+8B3308FF8B3308FF8B3308FF8B3308FF8B3308FF8B3308FF8B3308FF8B33B4
+550000AF5700009557000082590000775E0000706600006C700000687B0000
+638800005D99000057AE00034CC200093CCF00122AE8011D17FC012903FD06
+3905FF253303FF403101FF593102FF6C3204FF882F05FF8A2F05FF8A2F05FF
+8A2F05FF8A2F05FF8A2F05FF8A2F05FF8A2F05FF8A2F05FF8A2F05FF8A2F05
+FF8A2F05FF8A2FB45500009B56000084550000775800006E5F000068670000
+647200005F7D0000598B0000559D00004FB2000343C4000932CF001223F302
+1C0EFA012B05FE133005FF2E2C01FF472C01FF5D2C01FF702C03FF882B03FF
+8A2B03FF8A2B03FF8A2B03FF8A2B03FF8A2B03FF8A2B03FF8A2B03FF8A2B03
+FF8A2B03FF8A2B03FF8A2B03FF8A2BA354000087530000775400006D590000
+66600000606800005C73000056800000508E00004DA1000046B4000339C100
+0A2AD500131AEF011E0AF6072809FF1F2603FF342700FF4C2800FF622701FF
+712701FF872801FF882801FF882801FF882801FF882801FF882801FF882801
+FF882801FF882801FF882801FF882801FF882801FF88288C51000079500000
+6D530000645900005E600000596A0000547500004E8200004991000045A300
+003CB300032FC0000B22DC001412EB001F09F50F2306FF252300FF3A2400FF
+512200FF652201FF742301FF872401FF892401FF892401FF892401FF892401
+FF892401FF892401FF892401FF892401FF892401FF892401FF892401FF8924
+7C4D00006E4F0000635300005C59000057610000516B00004C780000468500
+00419400003CA4000033B1000427C4000C1CE000150CEC021F02F5112301FF
+292100FF3F1F00FF551E00FF671E00FF761F00FF882001FF8A2001FF8A2001
+FF8A2001FF8A2001FF8A2001FF8A2001FF8A2001FF8A2001FF8A2001FF8A20
+01FF8A2001FF8A206F4B0000644E00005B530000555A0000506300004A6E00
+00447A00003E8700003995000033A200002AB0000421C6000C15E4001605EB
+031E00F8172000FF2E1E00FF451B01FF581901FF6A1A00FF781C00FF881D00
+FF891D00FF891D00FF891D00FF891D00FF891D00FF891D00FF891D00FF891D
+00FF891D00FF891D00FF891D00FF891D>
+<A33F0000A3410000A4440000A6480000AA4C0000B0510000B7530003BF5100
+0BCA4E0014D348001ED23C002CC72A0040B4150057A5030968A20024689D00
+40689B0062679B0084649500B9638F06F65B900BFF55900BFF55900BFF5590
+0BFF55900BFF55900BFF55900BFF55900BFF55900BFF55900BFF55900BFF55
+900BFF55900BFF55A33F0000A3410000A4440000A6480000AA4C0000B05100
+00B7530003BF51000BCA4E0014D348001ED23C002CC72A0040B4150057A503
+0968A20024689D0040689B0062679B0084649500B9638F06F65B900BFF5590
+0BFF55900BFF55900BFF55900BFF55900BFF55900BFF55900BFF55900BFF55
+900BFF55900BFF55900BFF55900BFF55A33F0000A3410000A4440000A64800
+00AA4C0000B0510000B7530003BF51000BCA4E0014D348001ED23C002CC72A
+0040B4150057A5030968A20024689D0040689B0062679B0084649500B9638F
+06F65B900BFF55900BFF55900BFF55900BFF55900BFF55900BFF55900BFF55
+900BFF55900BFF55900BFF55900BFF55900BFF55900BFF55A33F0000A34100
+00A4440000A6480000AA4C0000B0510000B7530003BF51000BCA4E0014D348
+001ED23C002CC72A0040B4150057A5030968A20024689D0040689B0062679B
+0084649500B9638F06F65B900BFF55900BFF55900BFF55900BFF55900BFF55
+900BFF55900BFF55900BFF55900BFF55900BFF55900BFF55900BFF55900BFF
+55A33F0000A3410000A4440000A6480000AA4C0000B0510000B7530003BF51
+000BCA4E0014D348001ED23C002CC72A0040B4150057A5030968A20024689D
+0040689B0062679B0084649500B9638F06F65B900BFF55900BFF55900BFF55
+900BFF55900BFF55900BFF55900BFF55900BFF55900BFF55900BFF55900BFF
+55900BFF55900BFF55A33F0000A3420000A4450000A6480000AA4D0000B051
+0000B6530003BF52000ACA4F0013D44A001DD33E002BC92C003FB7170056A6
+040768A30122699E003E699B0060689B0083659600B8649006F55D900BFF56
+900BFF56900BFF56900BFF56900BFF56900BFF56900BFF56900BFF56900BFF
+56900BFF56900BFF56900BFF56900BFF56A4400000A4420000A4450000A649
+0000AA4D0000B0510000B6540003BF53000ACA510013D54C001DD440002ACB
+2F003EBB1A0055A8050469A502206A9F003B6B9B005D699C0081679600B365
+9006F45F910BFF58910BFF58910BFF58910BFF58910BFF58910BFF58910BFF
+58910BFF58910BFF58910BFF58910BFF58910BFF58910BFF58A4400000A442
+0000A4460000A6490000AA4D0000AF520000B6540002BE540009C9520012D6
+4E001CD5420029CD31003DBF1D0053A905016AA6021D6BA100386C9C005B6B
+9D007F689700AF679105F160910BFF5A910BFF5A910BFF5A910BFF5A910BFF
+5A910BFF5A910BFF5A910BFF5A910BFF5A910BFF5A910BFF5A910BFF5A910B
+FF5AA4400000A4430000A5460000A64A0000A94E0000AF520000B6550002BE
+550009C9540011D64F001BD6440028CF34003BC3200052AC080069A8031B6C
+A200356D9C00586C9D007C6A9800AB689105EF62920BFF5B920BFF5B920BFF
+5B920BFF5B920BFF5B920BFF5B920BFF5B920BFF5B920BFF5B920BFF5B920B
+FF5B920BFF5B920BFF5BA4410000A4430000A5470000A64A0000A94E0000AF
+530000B5560002BE560008C9550010D651001AD8470027D237003AC7240050
+B00B0068A904196DA400326F9D00566E9E00796B9900A76A9205EC64920BFF
+5D920BFF5D920BFF5D920BFF5D920BFF5D920BFF5D920BFF5D920BFF5D920B
+FF5D920BFF5D920BFF5D920BFF5D920BFF5DA5410000A5440000A5470000A6
+4B0000A94F0000AE530000B5560002BE570008C9570010D653001AD9490026
+D43A0038CD28004EB40F0066AB05156EA6002E709D0053709E00756D9A00A2
+6C9204E966930BFF5F930BFF5F930BFF5F930BFF5F930BFF5F930BFF5F930B
+FF5F930BFF5F930BFF5F930BFF5F930BFF5F930BFF5F930BFF5FA5420000A5
+440000A5480000A64C0000A9500000AE540000B4570001BD590007C959000F
+D6550019DB4D0024D83E0036D12C004CB9130064AE06126FA8002B729F004E
+729F0071709B009D6E9304E669930CFF61930CFF61930CFF61930CFF61930C
+FF61930CFF61930CFF61930CFF61930CFF61930CFF61930CFF61930CFF6193
+0CFF61A6430000A5450000A5480000A64C0000A9500000AE550000B4580001
+BD5A0006C85A000ED6580018DE500023DC440034D5310049C0180061B1070D
+71AB002775A2004974A0006D739D0098719403E36C940CFF64940CFF64940C
+FF64940CFF64940CFF64940CFF64940CFF64940CFF64940CFF64940CFF6494
+0CFF64940CFF64940CFF64A6430000A5460000A5490000A64D0000A9510000
+AD550000B3590001BC5C0006C85C000DD55B0016E0550021E0490031DA3600
+46C81E005EB6090773B0032276A7004277A40068769200907A7A01E17B6D09
+FF766306FF7B6306FF7B6306FF7B6306FF7B6306FF7B6306FF7B6306FF7B63
+06FF7B6306FF7B6306FF7B6306FF7B6306FF7BA6440000A6470000A54A0000
+A74E0000A9520000AD560000B35B0000BC5D0005C75F000CD55E0015E35A00
+1FE34E002EDE3C0042D226005BBD0D0074B0061B798A002D847400538B5600
+7F8F4700C98F3D00FF8B3A00FF8C3A00FF8C3A00FF8C3A00FF8C3A00FF8C3A
+00FF8C3A00FF8C3A00FF8C3A00FF8C3A00FF8C3A00FF8C3A00FF8CA7450000
+A6480000A64B0000A74F0000A9530000AC570000B25C0000BB5F0005C66100
+0BD5620012E45F001CE754002AE444003EDF310056A51E006F7B130B825400
+119A390138A3230067A21800B39A1300FF920F00FF930F00FF930F00FF930F
+00FF930F00FF930F00FF930F00FF930F00FF930F00FF930F00FF930F00FF93
+0F00FF93A8460000A7490000A64D0000A7500000A8540000AB580000B15D00
+00B9600004C5640009D4660010E364001AEB5C0027E0500039AB4700508136
+006A592400842F1500A20E0A20AF070F56AA04139C9C0314FF930316FF9203
+16FF920316FF920316FF920316FF920316FF920316FF920316FF920316FF92
+0316FF920316FF920316FF92A9480000A84A0000A74E0000A7510000A85500
+00AA590000AF5E0000B8620003C4670007D369000EE36A0016D7670023B065
+00348C5E004A6D5100634944007C1A2E009705291CA3002E4C9F0033929400
+32FE880034FE870034FE870034FE870034FE870034FE870034FE870034FE87
+0034FE870034FE870034FE870034FE870034FE87AA490000A94C0000A74F00
+00A7520000A7560000AA5A0000AE5F0000B6640002C2690006D16D000CC672
+0013AA74001F9474002E7C730042606F00593C62006F1A550585004B169400
+55438E005D7C880066F17C0069F07B0069F07B0069F07B0069F07B0069F07B
+0069F07B0069F07B0069F07B0069F07B0069F07B0069F07B0069F07BAB4B00
+00A94D0000A8500000A7540000A7570000A85B0000AC600000B4650002BF6B
+0005B7730009A67A00119680001A88850025738700365785004B367D006114
+7100770473197F0079397D00816879009DDB71009EDB70009EDB70009EDB70
+009EDB70009EDB70009EDB70009EDB70009EDB70009EDB70009EDB70009EDB
+70009EDB70AD4C0000AB4F0000A9530000A7550000A6580000A85C0000AB61
+0000B1670001A86F00039D7900079583000C8C8E00138099001C6D9F002852
+9F003C3399005117920364008F0F71009D2F6D00A8576901CBA06401D1AA63
+01D1AA6301D1AA6301D1AA6301D1AA6301D1AA6301D1AA6301D1AA6301D1AA
+6301D1AA6301D1AA6301D1AA63AF4E0000AD510000A9540000A7560000A65A
+0000A75D0000A96200009E690000947300028F7F00048A8B0007839A000C7B
+AF001369BF001C51C8002837C7003D1ECB014F05CE065E00DA205E02F04459
+0DFF804F0EFF8C4C0EFF8C4C0EFF8C4C0EFF8C4C0EFF8C4C0EFF8C4C0EFF8C
+4C0EFF8C4C0EFF8C4C0EFF8C4C0EFF8C4C0EFF8C4CB1500000AE520000AA55
+0000A8580000A65B0000A65F0000986300008C6C0000877700008484000180
+9300017BA6000373C0000A64D800144DEA001E37FB062C1DFE043F0AFE0C4D
+01FF244F0AFF51460CFF77430DFF82420DFF82420DFF82420DFF82420DFF82
+420DFF82420DFF82420DFF82420DFF82420DFF82420DFF82420DFF8242B352
+0000B0540000AC570000A95A0000A65D0000965F000088650000816E00007E
+7A00007B8700007796000070AA000466C2000B54D6001540E8011F2BF8052D
+12FA013F0AFF1B4305FF334309FF593F0AFF793D0CFF883B0CFF883B0CFF88
+3B0CFF883B0CFF883B0CFF883B0CFF883B0CFF883B0CFF883B0CFF883B0CFF
+883B0CFF883BB5540000B2560000AD580000A95A0000985C0000865F00007D
+66000079710000767C0000728900006D99000066AF00045AC6000C48D60015
+33E701211FF4012E12FB12370BFF273A07FF433A06FF5D3908FF7A380AFF8C
+360AFF8C360AFF8C360AFF8C360AFF8C360AFF8C360AFF8C360AFF8C360AFF
+8C360AFF8C360AFF8C360AFF8C36B5550000B2560000AD5800009C59000087
+5B00007B60000074680000717300006D7E0000698C0000629D00005BB30005
+4EC6000C3CD5001629EE012116FA002F07FE113907FF2D3504FF493503FF62
+3505FF7B3407FF8F3107FF8F3107FF8F3107FF8F3107FF8F3107FF8F3107FF
+8F3107FF8F3107FF8F3107FF8F3107FF8F3107FF8F31B5550000B2560000A3
+570000885700007A5A0000726100006C6A000068740000648000005E8F0000
+59A2000052B7000544C8000D32D5001722FB02200BFD013103FE173404FF34
+3001FF4F3001FF653002FF7C3005FF922D05FF922D05FF922D05FF922D05FF
+922D05FF922D05FF922D05FF922D05FF922D05FF922D05FF922D05FF922DB5
+550000AB5600008B5400007B560000705A000069620000646B000060760000
+5A8300005592000051A6000048BA000539C7000D29DD01171AF9012106F907
+2E07FF242A02FF3B2B00FF542B01FF692A01FF7D2B02FF912A02FF912A02FF
+912A02FF912A02FF912A02FF912A02FF912A02FF912A02FF912A02FF912A02
+FF912A02FF912AB5550000905200007D52000070550000675B000061630000
+5C6D000057780000518600004C95000049A900003FBA00052FC6000E22E400
+1711F100230BFA162406FF2A2500FF422600FF592500FF6C2501FF7E2601FF
+902601FF902601FF902601FF902601FF902601FF902601FF902601FF902601
+FF902601FF902601FF902601FF9026945200007F4F00007051000066550000
+5F5B000059640000546E00004F7B0000498800004598000040AA000034B600
+0627CB000F1AE400190AEF022205F9192301FF2F2300FF472100FF5D2100FF
+6F2100FF7F2203FF922003FF922003FF922003FF922003FF922003FF922003
+FF922003FF922003FF922003FF922003FF922003FF9220814E0000724D0000
+665000005E550000575C0000526500004D700000477D0000418B00003D9A00
+0037A900002BB6000620CE001013E8001903EF042200F91D2100FF341F00FF
+4C1C00FF601C00FF721D00FF801E04FF931C04FF931C04FF931C04FF931C04
+FF931C04FF931C04FF931C04FF931C04FF931C04FF931C04FF931C04FF931C
+734B0000674C00005D50000056560000515D00004B670000457300003F8000
+00398C0000339900002DA7000024B900071AD200100DE5011901F20A1E00FF
+221D00FF3A1B01FF4F1801FF631800FF731A00FF811B01FF901A01FF901A01
+FF901A01FF901A01FF901A01FF901A01FF901A01FF901A01FF901A01FF901A
+01FF901A01FF901A674900005D4B000056500000505700004A5F0000446900
+003D76000037810000308C00002B99000026A800011EBC000914D4001106E1
+011901F9121A00FF261900FF3F1702FF531401FF651400FF751600FF821702
+FF901602FF901602FF901602FF901602FF901602FF901602FF901602FF9016
+02FF901602FF901602FF901602FF9016>
+<A03B0000A13B0000A13E0000A3410000A6440000AB480000B14A0001B94900
+09C1450012C83D001CC633002ABC21003EA90F03539C010D5F9A00275E9600
+435E9600625C9700815A9400AA588C01EE548C08FF488C08FF488C08FF488C
+08FF488C08FF488C08FF488C08FF488C08FF488C08FF488C08FF488C08FF48
+8C08FF488C08FF48A03B0000A13B0000A13E0000A3410000A6440000AB4800
+00B14A0001B9490009C1450012C83D001CC633002ABC21003EA90F03539C01
+0D5F9A00275E9600435E9600625C9700815A9400AA588C01EE548C08FF488C
+08FF488C08FF488C08FF488C08FF488C08FF488C08FF488C08FF488C08FF48
+8C08FF488C08FF488C08FF488C08FF48A03B0000A13B0000A13E0000A34100
+00A6440000AB480000B14A0001B9490009C1450012C83D001CC633002ABC21
+003EA90F03539C010D5F9A00275E9600435E9600625C9700815A9400AA588C
+01EE548C08FF488C08FF488C08FF488C08FF488C08FF488C08FF488C08FF48
+8C08FF488C08FF488C08FF488C08FF488C08FF488C08FF48A13B0000A13B00
+00A13E0000A3410000A6440000AB480000B14B0001B9490008C1450012C83E
+001CC7340029BD22003DAA1003529C010C609A00265F9700425F9600615D97
+00805A9500A9588C01ED558C08FF498C08FF498C08FF498C08FF498C08FF49
+8C08FF498C08FF498C08FF498C08FF498C08FF498C08FF498C08FF498C08FF
+49A13B0000A13C0000A23E0000A3410000A6450000AB490000B14B0001B94A
+0008C1470011CA40001BC8350029BF24003CAD1202519D010A619B00256097
+00406097005F5E98007F5C9500A75A8C00ED568D09FF4A8D09FF4A8D09FF4A
+8D09FF4A8D09FF4A8D09FF4A8D09FF4A8D09FF4A8D09FF4A8D09FF4A8D09FF
+4A8D09FF4A8D09FF4AA13C0000A13C0000A23F0000A3420000A6450000AB49
+0000B14C0001B94B0008C1480011CB42001BCA370028C126003BAF1401519E
+0107629C00236198003E6197005D5F98007D5D9600A65B8C00EC588D0AFF4B
+8D0AFF4B8D0AFF4B8D0AFF4B8D0AFF4B8D0AFF4B8D0AFF4B8D0AFF4B8D0AFF
+4B8D0AFF4B8D0AFF4B8D0AFF4B8D0AFF4BA13C0000A23D0000A23F0000A442
+0000A6460000AC4A0000B24D0001B94C0007C1490010CC44001ACB390027C3
+28003AB21601509E0105639D00216299003B6297005B6198007B5E9700A45C
+8D00EA598E0AFF4C8E0AFF4C8E0AFF4C8E0AFF4C8E0AFF4C8E0AFF4C8E0AFF
+4C8E0AFF4C8E0AFF4C8E0AFF4C8E0AFF4C8E0AFF4C8E0AFF4CA23C0000A23D
+0000A2400000A4430000A7460000AC4A0000B24E0001B94E0007C24B0010CD
+46001ACC3B0027C52A0039B518004F9F0102649E001E639A00396398005962
+99007A5F9700A15E8D00E75B8E0AFF4D8E0AFF4D8E0AFF4E8E0AFF4E8E0AFF
+4E8E0AFF4E8E0AFF4E8E0AFF4E8E0AFF4E8E0AFF4E8E0AFF4E8E0AFF4E8E0A
+FF4EA23D0000A23D0000A2400000A4430000A7470000AC4B0000B24E0001B9
+4F0007C24C000FCE470019CE3D0026C72D0038B81A004EA10300649F011C64
+9B003664980056639900786098009E5F8E00E35C8E0AFF4F8E0AFF4F8F0AFF
+4F8F0AFF4F8F0AFF4F8F0AFF4F8F0AFF4F8F0AFF4F8F0AFF4F8F0AFF4F8F0A
+FF4F8F0AFF4F8F0AFF4FA23D0000A33E0000A3410000A4440000A7480000AC
+4C0000B24F0001B9500006C24E000ECE490019D03F0025CA300036BD1E004C
+A5060062A10219659D003366990054659A00756299009A618F00DF5E8F0AFF
+518F0AFF518F0AFF518F0AFF518F0AFF518F0AFF518F0AFF518F0AFF518F0A
+FF518F0AFF518F0AFF518F0AFF518F0AFF51A33E0000A33F0000A3420000A4
+450000A7490000AC4D0000B2510001B9520006C250000ECE4B0018D1420023
+CC340034C222004AA90B0060A30316669F002F67990050679B0071649A0096
+629000DB60900AFF53900AFF54900AFF54900AFF54900AFF54900AFF54900A
+FF54900AFF54900AFF54900AFF54900AFF54900AFF54900AFF54A33F0000A3
+3F0000A3420000A4460000A74A0000AC4E0000B2520001B9530005C251000D
+CE4E0017D3450022D0380032C6260047AE0F005EA5041268A1002B699B004C
+699B006D679B0092659100D763900BFF56900BFF56900BFF56900BFF56900B
+FF56900BFF56900BFF56900BFF56900BFF56900BFF56900BFF56900BFF5690
+0BFF56A43F0000A4400000A4430000A5470000A74B0000AC4F0000B1530001
+B9550004C153000CCD500015D5490020D43D0030CA2A0044B514005BA8050D
+6AA400276B9D00466C9C0068699C008D679300D266910BFF598E0BFF5A8D0B
+FF5A8D0BFF5A8D0BFF5A8D0BFF5A8D0BFF5A8D0BFF5A8D0BFF5A8D0BFF5A8D
+0BFF5A8D0BFF5A8D0BFF5AA4400000A5410000A4440000A5480000A74C0000
+AB500000B1540000B8560004C155000BCD530014D84E001ED742002DCF3000
+41BC1A0058AC06066CA701226EA100406E9500606F850080727300C2746608
+FE6C5C05FF715904FF735904FF735904FF735904FF735904FF735904FF7359
+04FF735904FF735904FF735904FF735904FF73A5410000A5420000A5450000
+A5490000A74D0000AA510000B0550000B7580003C058000ACD570012DB5300
+1CDB47002AD437003EC7220055B009006D9A0519737900287D69004A835400
+6C854600A4853D00F9803900FF803800FF803800FF803800FF803800FF8038
+00FF803800FF803800FF803800FF803800FF803800FF803800FF80A5420000
+A6430000A5460000A54A0000A74E0000AA520000B0560000B7590003C05B00
+09CD5B0010DA57001ADE4E0027DB3F003ACB2E0050931C00696E110B7C4700
+109133002F98240055991B0089941600E28A1200FF891000FF8A1000FF8A10
+00FF8A1000FF8A1000FF8A1000FF8A1000FF8A1000FF8A1000FF8A1000FF8A
+1000FF8AA6440000A7440000A6480000A64B0000A74F0000AA530000AF5800
+00B65B0002BF5E0007CC5F000FDA5D0018E3550024CA4E00359C43004A7633
+00645120007C281200970C0A19A4080F45A106117D960412CF8B0315FF8903
+15FF890315FF890315FF890315FF890315FF890315FF890315FF890315FF89
+0315FF890315FF890315FF89A7450000A7460000A6490000A64D0000A75100
+00AA550000AE590000B45E0001BD600006CA62000DDA620015C2630020A460
+003083570044644B005D423D00751728008D0524169A00293F96002F788F00
+2EC3810031FF7E0032FF7D0032FF7D0032FF7D0032FF7D0032FF7D0032FF7D
+0032FF7D0032FF7D0032FF7D0032FF7D0032FF7DA8470000A8480000A74B00
+00A74F0000A7520000A9560000AC5A0000B25F0001BB620005C966000AB46C
+00129F6E001D8C6E002A756B003D5966005435580069164A067D0041158B00
+493D840050727F0052B5760057FF720058FF710058FF710058FF710058FF71
+0058FF710058FF710058FF710058FF710058FF710058FF710058FF71A94900
+00AA490000A84D0000A7500000A7530000A8570000AB5C0000B0600001B865
+0003A76D00099A7400108D790018807E00226B7F0032507C00472F72005D0F
+63007202651878006B397400716270007CA06C0082E5680082E4680082E468
+0082E4680082E4680082E4680082E4680082E4680082E4680082E4680082E4
+680082E468AB4A0000AC4B0000A94F0000A7520000A7550000A7590000AA5D
+0000AC6200009C690003937300078C7C000C84860012778D001B649200274A
+9100392C8B004F138404610083146A008D33660094586300A2896000B4CF5D
+00B4CF5C00B4CF5C00B4CF5C00B4CF5C00B4CF5C00B4CF5C00B4CF5C00B4CF
+5C00B4CF5C00B4CF5C00B4CF5CAD4D0000AE4D0000AB510000A8540000A757
+0000A75A0000A65E0000946400008B6D000287780004828400077B90000C70
+9F00135EA9001D48AD00292EAC003C15AB005001AD0D5B00B6275802C74C54
+05D7755008EAA84A08EAA74A08EAA74A08EAA74A08EAA74A08EAA74A08EAA7
+4A08EAA74A08EAA74A08EAA74A08EAA74A08EAA74AAF4F0000B0500000AC53
+0000A9550000A7580000A55C00008F5F000085660000807100007C7D000179
+8A0002739B00046AB0000A5CC5001149D7001A34E803261EF803350EFD1040
+07FF284209FF4E3E09FF6C3E0CFF893A0CFF893A0CFF893A0CFF893A0CFF89
+3A0CFF893A0CFF893A0CFF893A0CFF893A0CFF893A0CFF893A0CFF893AB251
+0000B2520000AE550000AA570000A75A00008E5C0000816100007A6A000076
+750000738100006F8F000068A1000260B8000752CC000F3DDC001A28EC0126
+16F804330CFE1B3A08FF353906FF533906FF6F3909FF8D3509FF8D3509FF8D
+3509FF8D3509FF8D3509FF8D3509FF8D3509FF8D3509FF8D3509FF8D3509FF
+8D3509FF8D35B4530000B4540000B0570000AB5900008F5900007F5C000076
+620000716C00006D7700006A830000649200005EA6000255BC000746CD0010
+32DC001B20F701260AFB033607FF203605FF3C3403FF593403FF703407FF90
+3007FF903007FF903007FF903007FF903007FF903007FF903007FF903007FF
+903007FF903007FF903007FF9030B5550000B5550000B05700009256000080
+570000755C00006D640000696E0000657900005F8600005A96000054AA0002
+4BBF00073BCC001029E5011A16FE012702FD063606FF282E02FF432F01FF5D
+2E01FF732F04FF8E2C04FF932C04FF932C04FF932C04FF932C04FF932C04FF
+932C04FF932C04FF932C04FF932C04FF932C04FF932CB5550000B555000096
+54000081540000745700006B5D000065650000606F00005C7B000056890000
+519900004CAE000241C0000730CC001122EF011B0DF6002807FE162B05FF2F
+2900FF4A2A00FF622901FF752902FF8D2902FF962902FF962902FF962902FF
+962902FF962902FF962902FF962902FF962902FF962902FF962902FF9629B5
+5500009C53000083510000745200006A570000625E00005D66000058710000
+527E00004D8C0000499D000043B0000237BD000828D2001218E7001C0CF40A
+2308FE202301FF362500FF4F2400FF662401FF772501FF8C2506FF9F2006FF
+9F2006FF9F2006FF9F2006FF9F2006FF9F2006FF9F2006FF9F2006FF9F2006
+FF9F2006FF9F209F530000874F0000754F000069520000615700005B5E0000
+55670000507300004A800000458E0000419F000039AF00022DBD000921D700
+1311EB001D05F30B2303FE242200FF3B2100FF541F00FF692000FF792002FF
+8E200AFFA5190AFFA5190AFFA5190AFFA5190AFFA5190AFFA5190AFFA5190A
+FFA5190AFFA5190AFFA5190AFFA519874F0000784C00006A4D000060510000
+59580000535F00004E69000048760000428200003D910000379F00002FAC00
+0226BF00091ADB00130BEB021C00F40F2100FF291F00FF411C01FF571A00FF
+6B1B00FF7A1D01FF8D1D08FFA21708FFA21708FFA21708FFA21708FFA21708
+FFA21708FFA21708FFA21708FFA21708FFA21708FFA217774C00006B4A0000
+604D000058520000525900004C610000476C00004078000039840000349100
+002E9D000027AD00031FC3000A13DC001404E6021C00FC161D00FF2E1B01FF
+461802FF5B1601FF6D1800FF7C1900FF8C1A04FF9E1704FF9E1704FF9E1704
+FF9E1704FF9E1704FF9E1704FF9E1704FF9E1704FF9E1704FF9E1704FF9E17
+6A4A000060490000574D0000515300004B5A0000456400003F6F0000387B00
+00318600002C910000279E000021AF000419C7000C0CD8001403EB0B1800FF
+1C1900FF331701FF491401FF5D1200FF6E1400FF7E1603FF8E1409FF9F0F09
+FF9F0F09FF9F0F09FF9F0F09FF9F0F09FF9F0F09FF9F0F09FF9F0F09FF9F0F
+09FF9F0F09FF9F0F5F49000057490000504D00004B540000455D00003E6700
+0037730000307D00002A8700002592000021A000011BB3000513CA000C07DA
+021300EC0E1600FF211500FF371300FF4D1000FF5F0F00FF701100FF80120A
+FF940A10FFA30410FFA30410FFA30410FFA30410FFA30410FFA30410FFA304
+10FFA30410FFA30410FFA30410FFA304>
+<9D3600009E3600009E370000A03A0000A23C0000A63F0000AB420000B24000
+07B93C0010BD34001ABA280027B01A003BA00A064D9600155594002A539300
+45549300625294007E4F92009F4C8C00D4488802FF3F8802FF3F8803FF3F88
+03FF3F8803FF3F8803FF3F8803FF3F8803FF3F8803FF3F8803FF3F8803FF3F
+8803FF3F8803FF3F9E3600009E3600009E380000A03A0000A23C0000A63F00
+00AC420000B2400007B93C0010BD34001ABA290027B01A003BA00A064D9600
+155594002A54930044549300615295007E5092009F4C8C00D4498803FF3F88
+03FF408803FF408803FF408803FF408803FF408803FF408803FF408803FF40
+8803FF408803FF408803FF408803FF409E3600009E3700009F380000A03A00
+00A33D0000A7400000AC430000B3410006BA3D0010BE36001ABC2B0026B21C
+003AA20C064C9700135694002854930043559300605395007C5192009E4E8C
+00D24A8803FF408803FF408803FF408803FF408803FF408803FF408803FF40
+8803FF408803FF408803FF408803FF408803FF408803FF409E3600009E3700
+009F380000A03B0000A33D0000A7400000AC430000B3420006BA3E000FBF37
+0019BD2C0026B31D0039A40D054B97001157950027559400415693005E5495
+007B5293009D4F8C00D14B8904FE418904FF418904FF418904FF418904FF41
+8904FF418904FF418904FF418904FF418904FF418904FF418904FF418904FF
+419E3700009F3800009F390000A13B0000A33E0000A7410000AC440000B343
+0006BA3F000FC0390019BE2E0025B51E0038A60F054B98000F589500255694
+003F5794005C5595007A5393009C508C00D04D8904FE428904FF428904FF42
+8904FF428904FF428904FF428904FF428904FF428904FF428904FF428904FF
+428904FF428904FF429E3700009F3800009F390000A13C0000A33E0000A741
+0000AC440000B3440006BA40000EC13A0018BF2F0025B6200037A811044A99
+000D599600245795003D5894005B569500785494009B518C00CF4E8A05FD43
+8A05FF438A05FF438A05FF438A05FF438A05FF438A05FF438A05FF438A05FF
+438A05FF438A05FF438A05FF438A05FF439F3800009F380000A03A0000A13C
+0000A33F0000A7420000AC450000B3450005BA41000EC23C0018C0310024B8
+220036AA1204499A000A5A9700225896003A59940059589600775595009A53
+8D00CE4F8A05FD448A05FF438A05FF438A05FF448A05FF448A05FF448A05FF
+448A05FF448A05FF448A05FF448A05FF448A05FF448A05FF449F3800009F39
+0000A03A0000A13D0000A3400000A7420000AD460000B3460005BB43000DC3
+3E0017C2330023BA240035AD1503489A00085C9800205A9600385A94005659
+96007556950098548D00CB518B06FC458A06FF448A06FF458A06FF458A06FF
+458A06FF458A06FF458A06FF458A06FF458A06FF458A06FF458A06FF458A06
+FF459F390000A03A0000A03B0000A13D0000A4400000A7430000AD470000B3
+470004BB45000DC43F0017C3350022BD260033B01702479C01045D99001D5B
+9700355B9500545B96007358960096568E00C8538C07FC478B07FF468B07FF
+468B07FF468B07FF468B07FF468B07FF468B07FF468B07FF468B07FF468B07
+FF468B07FF468B07FF46A03A0000A03A0000A13C0000A13E0000A4410000A7
+440000AD480000B3490004BB47000CC4410016C5370021C02A0032B41A0146
+9F04035C9A001A5D9800325D9500515C97007159960092588F00C4558C07FB
+498C07FF478C07FF478C07FF478C07FF478C07FF478C07FF478C07FF478C07
+FF478C07FF478C07FF478C07FF478C07FF47A03A0000A13B0000A13C0000A2
+3F0000A4420000A8450000AD490000B44B0003BC49000BC4440015C73A0020
+C32D0030B91D0045A208025A9B00175F9A002F5F96004E5F97006D5C97008F
+5A9000C1578D07F94C8C08FF498C08FF498C08FF498C08FF498C08FF498C08
+FF498C08FF498C08FF498C08FF498C08FF498C08FF498C08FF49A13B0000A1
+3C0000A13D0000A2400000A4430000A8460000AD4A0000B44D0002BC4B000B
+C5460014CA3E001FC732002EBD210042A70C01599D0112619B002B6196004A
+619800695E97008B5C9200BD5A8D06F84F8D09FF4A8D0AFF4B8D0AFF4B8D0A
+FF4B8D0AFF4B8D0AFF4B8D0AFF4B8D0AFF4B8D0AFF4B8D0AFF4B8D0AFF4B8D
+0AFF4BA13C0000A23D0000A23E0000A3410000A4440000A8480000AE4C0000
+B44F0002BC4D000AC6490013CD42001ECC37002CC2250040AD1000579F010D
+649D00276398004463980064619800875F9300B95D8806F755850BFF50810D
+FF50810DFF50810DFF50810DFF50810DFF50810DFF50810DFF50810DFF5081
+0DFF50810DFF50810DFF50A23D0000A23E0000A33F0000A3420000A5450000
+A8490000AE4E0000B4500002BC500009C64D0012D147001CCF3C0029C62A00
+3DB4160054A2020666A00122659B003D66880059697B00766B6C00A36C6004
+EE685B06FF655603FF685503FF685503FF685503FF685503FF685503FF6855
+03FF685503FF685503FF685503FF685503FF68A33E0000A33F0000A3400000
+A4430000A5470000A84B0000AE500000B4520002BC530008C6510010D24C00
+1AD2410027CC310039BE1E0050A70600678A05166D6E0025766100437B5000
+647D44008E7C3C00DB783800FF753600FF763500FF763500FF763500FF7635
+00FF763500FF763500FF763500FF763500FF763500FF763500FF76A33F0000
+A4400000A4420000A4450000A5480000A84C0000AD510000B3540001BB5500
+06C655000ED2500018D6470024D2390035B62C004B871C0064631109753F00
+0D882D002A8F22004B901B00768B1500BD841300FF7F1000FF801000FF8010
+00FF801000FF801000FF801000FF801000FF801000FF801000FF801000FF80
+1000FF80A4410000A5420000A5430000A4460000A64A0000A84E0000AC5200
+00B2560001BB580005C558000DD1550016DB4F0021BB4B0031913F00456E2F
+005F491F0075220F008D0A07179A080C3B98050F699004109F850313FF8103
+15FF800215FF800215FF800215FF800215FF800215FF800215FF800215FF80
+0215FF800215FF800215FF80A5420000A6430000A6450000A5480000A64C00
+00A8500000AB540000B1580000B95B0004C45C000BCB5C0013B15E001E995B
+002C7C52003F5D4400583B35006D13220084021F168F0024368D0029678600
+29987C002CFF77002EFF76002FFF76002FFF76002FFF76002FFF76002FFF76
+002FFF76002FFF76002FFF76002FFF76002FFF76A6440000A7450000A74600
+00A64A0000A64D0000A8520000AB560000B05A0000B85E0003B8610009A565
+00119568001B846800266E650038535E004F304F006314410675003A168100
+42357D00476377004B90710050FF6B0052FF6A0052FF6A0052FF6A0052FF6A
+0052FF6A0052FF6A0052FF6A0052FF6A0052FF6A0052FF6A0052FF6AA74600
+00A8470000A8480000A74C0000A6500000A8530000AA570000AE5C0000AA61
+00029C670008916D000F86730016797700206477002F4A7300432A6800580B
+58006C015B18720062376D00665E69006B87660072E6610073E5610073E461
+0073E4610073E4610073E4610073E4610073E4610073E4610073E4610073E4
+610073E461A9480000A9490000A94B0000A84E0000A7510000A7550000A959
+0000A05E0000936400038B6C00068475000B7C7D00116F84001A5B88002643
+8700362780004C0F78055D00781764008134600084565D00897B5A0096D457
+0098D4560098D4560098D4560098D4560098D4560098D4560098D4560098D4
+560098D4560098D4560098D456AB4B0000AC4B0000AB4D0000A9510000A754
+0000A75700009B5A00008C5F0000846700027F7200047A7C00077287000C67
+9200135599001D3F9B0029279A003B1099014E009B125600A12C5200A94D4E
+00B2714C01CDBC4901D2C94701D2C94701D2C94701D2C94701D2C94701D2C9
+4701D2C94701D2C94701D2C94701D2C94701D2C947AE4D0000AF4E0000AE50
+0000AA530000A85500009A580000885B00007E610000796B00007577000171
+8200026A90000560A0000B53B0001240BA001C29C0002A15CA003907D60F41
+01E3254101F4483F02FB6A3E09FE91380CFF9C340CFF9C340CFF9C340CFF9C
+340CFF9C340CFF9C340CFF9C340CFF9C340CFF9C340CFF9C340CFF9C34B050
+0000B1510000B0520000AB5500009C570000865800007A5D0000736500006F
+6F00006B7B000066880000609A000059AE00034EC3000A3CD2001429EC011F
+15FB012D05FE0F3806FF2F3303FF4D3302FF683305FF843106FF912F06FF91
+2F06FF912F06FF912F06FF912F06FF912F06FF912F06FF912F06FF912F06FF
+912F06FF912FB3530000B3530000B3540000A1560000875600007959000070
+5F00006A67000066720000617E00005B8C0000569E000050B3000344C5000B
+32D2001422F9021E0AFB002F05FE193003FF362E01FF542D01FF6C2D03FF84
+2D03FF932C03FF932C03FF932C03FF932C03FF932C03FF932C03FF932C03FF
+932C03FF932C03FF932C03FF932CB5550000B5550000A85500008A53000079
+5400006E59000067600000626900005D74000057800000518F00004EA20000
+46B6000438C3000B29D9001518F3012009F80B2908FF252701FF3E2900FF59
+2801FF6F2801FF842901FF962801FF962801FF962801FF962801FF962801FF
+962801FF962801FF962801FF962801FF962801FF9628B5550000AD5500008D
+5100007A5100006D530000655900005E610000596A0000547600004E830000
+4992000045A500003CB500042EC3000C20DE001610EE002108F8142304FF2A
+2400FF442300FF5D2200FF722301FF852408FFA51D08FFA51D08FFA51D08FF
+A51D08FFA51D08FFA51D08FFA51D08FFA51D08FFA51D08FFA51D08FFA51DB3
+5500008F5000007C4D00006E4F0000635300005C59000057620000516C0000
+4C78000046860000419500003CA5000032B2000426C7000D19E3001709EE02
+2002F7172200FF302100FF491E00FF601E00FF741F00FF85200FFFB7140FFF
+B7140FFFB7140FFFB7140FFFB7140FFFB7140FFFB7140FFFB7140FFFB7140F
+FFB7140FFFB714905100007D4D00006F4B0000634E00005B530000555A0000
+4F6300004A6E0000437B00003D8800003895000032A4000029B300051FCA00
+0E13E6001702EC042000FC1D1F00FF351D01FF4D1A01FF631900FF761B00FF
+861C0AFFB6140BFFBF130BFFBF130BFFBF130BFFBF130BFFBF130BFFBF130B
+FFBF130BFFBF130BFFBF130BFFBF137C4D00006E4A0000634A00005A4E0000
+535400004E5C000048650000427100003B7E0000358900002F9500002AA300
+0022B5000619CE000F0CE1001702F20C1B00FF221B00FF3B1902FF511501FF
+651500FF791800FF861806FFB31307FFBB1207FFBB1207FFBB1207FFBB1207
+FFBB1207FFBB1207FFBB1207FFBB1207FFBB1207FFBB126E4A000063490000
+5A4A0000534F00004D560000475E0000416900003A750000337F00002D8A00
+002896000023A500021CB9000812CF000F06DF021600F5121800FF271700FF
+3F1401FF541100FF671200FF7A1401FF88140EFFB3090EFFBB080EFFBB080E
+FFBB080EFFBB080EFFBB080EFFBB080EFFBB080EFFBB080EFFBB080EFFBB08
+6149000059490000524A00004C5000004658000040620000396D0000327800
+002C820000268B0000229700001DA8000216BD00080CD1000F02E0061400F4
+181400FF2C1200FF431000FF570E00FF690F00FF7B1007FF8D0B10FFB1020E
+FFB6030EFFB6030EFFB6030EFFB6030EFFB6030EFFB6030EFFB6030EFFB603
+0EFFB6030EFFB60358490000514900004C4B000046520000405B0000396500
+00327000002B7A000025830000218E00001D9A000018AB000310BE000907D1
+020E00E20A1100F81E1004FF330B00FF470C00FF5A0B00FF6B0B00FF7B0C04
+FF8B090DFFAE010EFFB4000EFFB4000EFFB4000EFFB4000EFFB4000EFFB400
+0EFFB4000EFFB4000EFFB4000EFFB400>
+<9B3100009B3100009B3200009C3300009E350000A1370000A5390000A93800
+04AE33000DB02C0018AD210024A514003798070A459100184A90002B489000
+44499100604791007945900096418C00C13D8800FC388700FF368700FF3687
+00FF368700FF368700FF368700FF368700FF368700FF368700FF368700FF36
+8700FF368700FF369B3100009B3200009C3200009C3400009E360000A13700
+00A5390000A9380004AE34000DB12D0017AE220024A61500379A0809459100
+174B90002A499000434A91005F4891007846900095428C00BF3E8800FB3986
+00FF368600FF378600FF378600FF378600FF378600FF378600FF378600FF37
+8600FF378600FF378600FF378600FF379B3100009B3200009C3300009D3400
+009E360000A1380000A53A0000AA390004AF35000DB32E0017B0240023A816
+00369B0908459200154C9000284A9000424B91005E4991007747900094448C
+00BE3F8800FA3A8600FF378600FF378600FF378600FF378600FF378600FF37
+8600FF378600FF378600FF378600FF378600FF378600FF379B3200009C3200
+009C3300009D3500009F370000A2390000A63A0000AA3A0004B036000CB430
+0016B1250022A91700359C0A08459300144D9000274B9100404C91005C4A92
+007648910093458C00BC418800F93B8600FF388600FF388600FF388600FF38
+8600FF388600FF388600FF388600FF388600FF388600FF388600FF388600FF
+389B3200009C3300009C3300009D3500009F370000A2390000A63B0000AB3B
+0003B037000CB5310016B3260022AA1900349E0B07449300134E9000264C91
+003F4D91005B4B92007549910092468C00BB428800F83C8600FF398600FF39
+8600FF398600FF398600FF398600FF398600FF398600FF398600FF398600FF
+398600FF398600FF399C3300009C3300009D3400009D3600009F380000A23A
+0000A63C0000AB3C0003B138000CB6320016B4280021AC1A0033A00C064494
+00114F9100254D91003D4E9100594C9200744A920091478D00B9438800F63E
+8600FF3A8600FF3A8600FF3B8600FF3B8600FF3B8600FF3B8600FF3B8600FF
+3B8600FF3B8600FF3B8600FF3B8600FF3B9C3300009C3400009D3400009E36
+00009F380000A23A0000A63C0000AB3D0003B23A000BB8340015B6290021AE
+1C0032A20E054495000F519100244E91003B4F9200574E9200734C93009049
+8D00B7448900F53F8600FF3C8600FF3C8600FF3C8600FF3C8600FF3C8600FF
+3C8600FF3C8600FF3C8600FF3C8600FF3C8600FF3C8600FF3C9C3400009D34
+00009D3500009E370000A0390000A33B0000A73D0000AC3E0002B33B000BB9
+360014B82B0020B11E0031A410044396000D5392002250920039509200554F
+9300714D93008F4A8D00B6468901F4418701FF3D8701FF3D8701FF3D8701FF
+3D8701FF3D8701FF3D8701FF3D8701FF3D8701FF3D8701FF3D8701FF3D8701
+FF3D9D3400009D3500009E3600009E380000A03A0000A33C0000A73E0000AD
+400002B43D000ABB380014BA2E001FB320002FA712024397000A5493001F52
+930036529200525193006F4F94008E4C8E00B4488A01F3428702FF3E8702FF
+3E8702FF3E8702FF3E8702FF3E8702FF3E8702FF3E8702FF3E8702FF3E8702
+FF3E8702FF3E8702FF3E9D3500009E3600009E3700009F380000A13B0000A4
+3D0000A8400000AD420001B53F0009BC3A0013BC30001EB623002EAB150141
+9A03085495001C549400325493004F5394006D5195008A4F8F00B14B8B02F2
+448803FF3F8803FF408803FF408803FF408803FF408803FF408803FF408803
+FF408803FF408803FF408803FF408803FF409E3600009E3700009F3700009F
+390000A13C0000A43E0000A9410000AE440001B5410009BC3C0012BE33001D
+BA27002CB01800409E0707529600185695002F5693004C5694006A53950087
+519000AE4D8B01F1488904FF418904FF418904FF418904FF418904FF418904
+FF418904FF418904FF418904FF418904FF418904FF418904FF419E3700009F
+3800009F380000A03A0000A23D0000A5400000A9430000AE460000B5430008
+BD3F0011C137001CBE2B002AB41C003EA20B06509800145996002B58940048
+5895006656960083539200AA508B01EF4C8A05FF438A05FF438A05FF438A05
+FF438A05FF438A05FF438A05FF438A05FF438A05FF438A05FF438A05FF438A
+05FF439F3800009F390000A03A0000A13B0000A23E0000A5410000A9440000
+AF470000B6460007BD420010C43B001BC2300028B820003BA810054E9A000E
+5C9800275A9500425B9500615997007F568C00A3567E00ED557D0AFF477A0B
+FF47790CFF47790CFF47790CFF47790CFF47790CFF47790CFF47790CFF4779
+0CFF47790CFF47790CFF47A0390000A03A0000A13B0000A13D0000A23F0000
+A5430000A9460000AF490000B6490006BE46000FC8400019C6350026BD2500
+38AF15034C9C01075F9A00225E8F0039607F00526374006D6568008F655B00
+D9655603FF5D5201FF605001FF615001FF615001FF615001FF615001FF6150
+01FF615001FF615001FF615001FF615001FF61A03B0000A13B0000A13C0000
+A23E0000A3410000A5440000AA480000AF4B0000B64C0005BF4A000DC94500
+18CA3A0024C42C0035B71B0149990601617E0415686400246F59003D744C00
+5A7642007D743A00BA713700FF6B3500FF6C3300FF6C3300FF6C3300FF6C33
+00FF6C3300FF6C3300FF6C3300FF6C3300FF6C3300FF6C3300FF6CA13C0000
+A23D0000A23D0000A2400000A3430000A6460000AA4A0000B04E0000B75000
+04BF4E000CCA490016CF410021CB340031A52900467C1A005E5B0F096F3801
+0D7F28002685210041881B00678415009B7F1400FF771100FF780F00FF780F
+00FF780F00FF780F00FF780F00FF780F00FF780F00FF780F00FF780F00FF78
+0F00FF78A23D0000A33E0000A33F0000A3410000A4440000A6480000AA4C00
+00B0510000B7530003BF52000BCA4F0014CA4A001EAC46002D8739003F662B
+0059431C006E1E0D00840807148F080C3290050F5C89041088800312FA7902
+13F9790214F8780214F8780214F8780214F8780214F8780214F8780214F878
+0214F8780214F8780214F878A33F0000A4400000A4410000A4430000A54700
+00A64A0000A94E0000AF530000B5550002BE560009B9570011A558001C8F55
+0028734B0039563F005135300067111E007C021D158600222F8500265B7F00
+278377002AF570002BFB6F002DFC6F002DFC6F002DFC6F002DFC6F002DFC6F
+002DFC6F002DFC6F002DFC6F002DFC6F002DFC6FA5410000A5420000A64300
+00A5450000A5480000A64C0000A9500000AE550000B4580001AA5C00079A5F
+00108C6100197D610023675E00334D56004A2B47005F1039066F0034167900
+3C307600415B700044826A0046E5650048FF630049FF620049FF620049FF62
+0049FF620049FF620049FF620049FF620049FF620049FF620049FF62A64300
+00A6440000A7450000A6470000A64B0000A74F0000A9530000AC5700009F5C
+0001926100078966000E7F6C00157170001E5E6F002C456A003F265F005409
+4F01660052186B005A3467005F586300637D5F0067C95B0068ED590069ED58
+0069ED580069ED580069ED580069ED580069ED580069ED580069ED580069ED
+580069ED58A7460000A8460000A8470000A74A0000A74D0000A7510000A855
+0000975800008B5E0002846600067D6E000A74760011677B0019557E00243D
+7D0033237600480C6E055A006F185E0077335A007B5557007E76540084AF51
+0087DA500088DA4F0088DA4F0088DA4F0088DA4F0088DA4F0088DA4F0088DA
+4F0088DA4F0088DA4F0088DA4FA9480000A9490000AA4A0000A94D0000A74F
+0000A753000092550000855A00007D610001786B0004737500076B7E000C5E
+8700134D8D001C388E0028228D003A0A8A024D008D155000922E4C00974D48
+009D6F4600ABA34400AFD74200B0D84100B0D84100B0D84100B0D84100B0D8
+4100B0D84100B0D84100B0D84100B0D84100B0D841AB4B0000AC4C0000AD4D
+0000AB500000A95300009153000081560000785C0000726500006E70000169
+7B0002618600065894000B4B9F001237A4001D23A7002B0FB0003A04B6123E
+00BE283D00C6483B00CB6A3A03DB8D3805EABC3305EBBB3305EBBB3305EBBB
+3305EBBB3305EBBB3305EBBB3305EBBB3305EBBB3305EBBB3305EBBB33AF4E
+0000B04F0000B0500000AD5200009252000080530000745800006D5F000068
+690000647400005E8100005890000052A3000249B700073AC6000F29E10118
+17FC012404FD083206FF2A2C01FF472D01FF642C02FF7D2D03FF942B03FF94
+2B03FF942B03FF942B03FF942B03FF942B03FF942B03FF942B03FF942B03FF
+942B03FF942BB2510000B2520000B35300009652000080520000735500006A
+5B0000636300005E6D00005A780000548600004E9600004AAB000140BC0006
+30C8000F21E901190EF3002609FD192704FF312700FF4D2800FF682701FF7F
+2802FF982602FF992602FF992602FF992602FF992602FF992602FF992602FF
+992602FF992602FF992602FF9926B4540000B5550000995300008250000073
+51000068550000615C00005B640000566E0000507B00004B89000046990000
+41AC000135B9000627CF001018E5001A09F2072306FD1F2300FF372400FF53
+2200FF6B2201FF7F2308FFA11D0AFFA91B0AFFA91B0AFFA91B0AFFA91B0AFF
+A91B0AFFA91B0AFFA91B0AFFA91B0AFFA91B0AFFA91BB55500009B53000083
+4E0000744D0000675000005F550000585C0000536500004E710000487E0000
+428B00003E9B000037AB00012BB9000720D2001111EA011B02F1082301FC24
+2100FF3D1F00FF571D00FF6E1E00FF801F0AFFA4170EFFBB140EFFBB140EFF
+BB140EFFBB140EFFBB140EFFBB140EFFBB140EFFBB140EFFBB140EFFBB149D
+530000834E0000744B0000674C00005E50000057560000515E00004B670000
+457300003F8000003A8D0000349A00002DA8000124BB000819D600120AE702
+1B00F60F1F00FF291D00FF431A01FF5A1800FF701A00FF811B06FF9F170BFF
+CB110BFFCB110BFFCB110BFFCB110BFFCB110BFFCB110BFFCB110BFFCB110B
+FFCB110BFFCB11834E0000734B0000674900005D4B00005650000050570000
+4A600000446A00003D77000036820000308D00002B9A000025AA00021DBF00
+0A12D7001205E6041900FE161A00FF2E1901FF471602FF5D1300FF721600FF
+821705FF9E1307FFDC1007FFDC1007FFDC1007FFDC1007FFDC1007FFDC1007
+FFDC1007FFDC1007FFDC1007FFDC10734B0000664900005D490000554B0000
+4F51000049590000436300003C6E0000357900002E840000298F0000249B00
+001FAC000317C4000B0BD6001302E80A1600FF1C1600FF331401FF4B1101FF
+5F1000FF731200FF84140DFFA10805FFDF0D05FFDF0D05FFDF0D05FFDF0D05
+FFDF0D05FFDF0D05FFDF0D05FFDF0D05FFDF0D05FFDF0D654900005B490000
+544900004E4C000048530000425C00003B660000347200002D7C0000278500
+00239000001F9E000119B0000411C5000B07D7031100E80E1300FE221201FF
+380F00FF4E0E00FF620D00FF750F03FF870D0FFFA20205FFD70905FFD70905
+FFD70905FFD70905FFD70905FFD70905FFD70905FFD70905FFD70905FFD709
+5A490000534900004D4A0000474E0000415600003B600000346A00002D7500
+00277E0000228800001E93000019A1000114B300050BC7000C02D5041000ED
+150F05FD290A04FF3F0800FF510A00FF640900FF760B01FF860B09FFA10407
+FFCC0407FFCC0407FFCC0407FFCC0407FFCC0407FFCC0407FFCC0407FFCC04
+07FFCC0407FFCC04514900004B4A0000464C0000415100003B5A0000346400
+002D6E000027780000218100001D8A00001996000014A400010EB5000605C5
+000B00D80A0C02F11B0A09FD300103FF420400FF540600FF660600FF760701
+FF860706FF9F0208FFC40008FFC40008FFC40008FFC40008FFC40008FFC400
+08FFC40008FFC40008FFC40008FFC400>
+<952B0000962C0000962C0000972D0000992E00009B3000009E310000A23000
+03A52C000BA6240015A21B00219B0F003491040C3F8C001B408B002C3E8E00
+433E8E005E3D8E00733B8D008D388B00B3348A00F7308700FF2B8700FF2B87
+00FF2B8700FF2B8700FF2B8700FF2B8700FF2B8700FF2B8700FF2B8700FF2B
+8700FF2B8700FF2B952B0000962C0000972D0000972D0000992F00009B3000
+009F310000A2300003A62C000BA7250015A31C00209C10003393050C3E8C00
+1A408B002B3F8E00423F8E005C3E8E00733C8D008C398B00B1358A00F53187
+00FF2C8700FF2C8700FF2C8700FF2C8700FF2C8700FF2C8700FF2C8700FF2C
+8700FF2C8700FF2C8700FF2C8700FF2C962C0000962C0000972D0000982E00
+009A2F00009C3100009F320000A3310003A62D000AA8260014A41D00209D11
+003294060B3E8D0019418C002A3F8E0041408F005B3F8E00723C8D008C398B
+00B0368A00F3328700FF2C8700FF2C8700FF2D8700FF2D8700FF2D8700FF2D
+8700FF2D8700FF2D8700FF2D8700FF2D8700FF2D8700FF2D962C0000972D00
+00982E0000982E00009A3000009C310000A0320000A3320003A72E000AA928
+0014A61E001F9F12003195070A3E8E0018428C0029408E0040418F005A408E
+00713D8E008B3A8B00AF378A00F0338700FF2D8700FF2D8700FF2D8700FF2D
+8700FF2D8700FF2D8700FF2D8700FF2D8700FF2D8700FF2D8700FF2D8700FF
+2D972D0000972D0000982E0000992F00009A3100009D320000A0330000A433
+0003A72F000AAA290013A720001EA01300309708093E8E0016448C0027418E
+003E428F0058418F00703E8E008A3C8C00AE388A00EE348700FF2E8700FF2E
+8700FF2F8700FF2F8700FF2F8700FF2F8700FF2F8700FF2F8700FF2F8700FF
+2F8700FF2F8700FF2F972D0000982E0000992F00009A3000009B3100009D33
+0000A0340000A4340002A8310009AB2B0013A821001EA215002F980A083D8F
+0015458C0026428F003C438F0056428F006F408F00893D8C00AC398A00EB35
+8700FF308700FF308700FF308700FF308700FF308700FF308700FF308700FF
+308700FF308700FF308700FF308700FF30982E0000992F0000993000009A30
+00009C3200009E330000A1350000A5350002A9320009AD2D0012AA23001DA4
+17002E9A0B073D900013478D0024448F003A448F0054448F006E419000883F
+8C00AA3B8A00E8378700FF318700FF318700FF318700FF318700FF318700FF
+318700FF318700FF318700FF318700FF318700FF318700FF31992F00009A30
+00009A3000009B3100009C3300009E340000A1360000A5360002AA340008AE
+2E0012AC25001DA619002D9D0D063D910010498E0022458F00374690005245
+90006C43900087408C00A83D8A00E5398700FF338700FF338700FF338700FF
+338700FF338700FF338700FF338700FF338700FF338700FF338700FF338700
+FF339A3000009A3100009B3100009B3200009C3400009F350000A2370000A6
+380001AB360007AF300011AE27001CA91B002BA00F043C92000E4B8F002048
+9000344890004F4790006A45910085438D00A63F8A00E13B8700FF358700FF
+358700FF358700FF358700FF358700FF358700FF358700FF358700FF358700
+FF358700FF358700FF359B3100009B3100009B3200009C3300009D3400009F
+360000A2380000A73A0001AC380007B1330010B12A001BAC1E0029A311023C
+95020B4C90001D4A9000314A90004C4A91006947920084458E00A4418A00DD
+3D8600FF378600FF378600FF378600FF378600FF378600FF378600FF378600
+FF378600FF378600FF378600FF378600FF379B3200009C3200009C3300009C
+3400009D350000A0370000A3390000A73C0000AD3A0006B235000FB42D001A
+B0210028A714003B9805094B92001A4D91002E4C9100494C9100664A920081
+488F00A1448B00D7408600FF398600FF398600FF398600FF398600FF398600
+FF398600FF398600FF398600FF398600FF398600FF398600FF399C3300009C
+3300009D3400009D3500009E370000A0390000A43B0000A83D0000AE3C0005
+B438000FB7310019B4250026AB1700399C08074A9400175091002B4F910045
+4F9200624D93007E4B90009E478B00D1438600FF3C8600FF3C8501FF3C8401
+FF3C8401FF3C8401FF3C8401FF3C8401FF3C8401FF3C8401FF3C8401FF3C84
+01FF3C9C3400009D3500009D3500009E3600009F380000A13A0000A53D0000
+A93F0000AF3F0005B63B000EBB350018B92A0024B01B0036A10C0549960012
+54930027529300405292005E508E007850820093507800C34E7508FF417108
+FF426F08FF436E08FF436E08FF436E08FF436E08FF436E08FF436E08FF436E
+08FF436E08FF436E08FF439D3500009E3600009E3700009F3700009F3A0000
+A23C0000A53F0000AA420000B0420004B73F000CBF3A0016BD2E0022B52000
+33A711034798000C57950022558500345A77004C5D6E00665F6200835F5900
+B55E5202FC564F01FF574D01FF594C00FF594C00FF594C00FF594C00FF594C
+00FF594C00FF594C00FF594C00FF594C00FF599E3700009F3700009F380000
+9F390000A03B0000A33E0000A6410000AB440000B1450003B843000BC03E00
+15C1340020BB260030AF1701448C06005C750414625C0021685300386D4800
+546F3F00746D3800A26B3400F4643200FF643000FF652F00FF652F00FF652F
+00FF652F00FF652F00FF652F00FF652F00FF652F00FF652F00FF659F380000
+A0390000A03A0000A03B0000A13D0000A3400000A6430000AB460000B14900
+01B9470009C0420013C53A001EBC30002C9825004073180059530E08683301
+0C772600247C20003C7F19005D7D150086791300E7711100FD701000FD710F
+01FC710F01FC710F01FC710F01FC710F01FC710F01FC710F01FC710F01FC71
+0F01FC71A03A0000A13B0000A13B0000A13C0000A23F0000A3420000A64500
+00AC490000B24C0001B94B0008C1480011B846001B9F4100297E34003A5E27
+00523D1A00671A0C007B07051386070A2F86050E5282030E777B0310C57302
+11F3710112F2710013F2710013F2710013F2710013F2710013F2710013F271
+0013F2710013F2710013F271A13C0000A23D0000A23D0000A33E0000A34100
+00A4440000A7480000AC4C0000B2500001BA500006AA52000F9A52001A874E
+00246B4400335038004A312B00610F1B0075011A157E001F2C7C0023527800
+2476710026BB6A0029F869002BF968002BF968002BF968002BF968002BF968
+002BF968002BF968002BF968002BF968002BF968A33E0000A33F0000A43F00
+00A4400000A4430000A5470000A74B0000AC4F0000B15300019F5700069259
+000E855B0016755A001F6056002D474E0043294100580F3406680031167100
+382E6D003E5269004076640042B35F0044FB5C0045FB5C0045FB5B0045FB5B
+0045FB5B0045FB5B0045FB5B0045FB5B0045FB5B0045FB5B0045FB5BA44000
+00A5410000A5420000A5430000A5460000A5490000A74D0000A75100009656
+00018B5A0006825F000C786400136A68001C576600283F61003B2357004F08
+470160004A1864005331610058555D005C7559005FA855005FFE500060FF4F
+0061FF4F0061FF4F0061FF4F0061FF4F0061FF4F0061FF4F0061FF4F0061FF
+4F0061FF4FA6430000A6440000A6440000A7450000A6480000A64C0000A150
+00008F530000845800027D5F0005766700096D6D0010607300184E76002238
+7400311F6C00430964055400671957006E3154007251520077714D007A994B
+007DE947007EE846007EE846007EE846007EE846007EE846007EE846007EE8
+46007EE846007EE846007EE846A7450000A8460000A8470000A9480000A74B
+00009F4E00008A5000007F540000775B0001716400046B6D00076376000B57
+7E00124683001B328400271E820038087F04490082184A00872F45008A4B43
+008F6D400098943F0098E43C0099E53B0099E53B0099E53B0099E53B0099E5
+3B0099E53B0099E53B0099E53B0099E53B0099E53BA9490000AA4A0000AB4A
+0000AC4B0000A14E0000894E00007B510000725700006C5F00006769000161
+730003597E00065089000B439200123095001D1E97002B0A9D013902A1153B
+00A7293800AC473500B0683400C0893400D0D83000D1D93000D2D93000D2D9
+3000D2D93000D2D93000D2D93000D2D93000D2D93000D2D93000D2D930AC4C
+0000AD4D0000AE4E0000A54E00008A4D0000794E00006E530000675A000061
+6300005C6D000057790000508600014A96000340A3000831AE001122BE001B
+11CC002703DC0C2D00EC242C00F3452900F5632902FB7D290AFFA3210DFFAF
+1E0DFFAE1E0DFFAE1E0DFFAE1E0DFFAE1E0DFFAE1E0DFFAE1E0DFFAE1E0DFF
+AE1E0DFFAE1EB04F0000B1500000A85100008C4D00007A4D00006D50000064
+5600005D5E000058670000537300004D800000478F000043A100003BB10003
+2EC0000A21DC001410ED001F06F7122303FF2B2300FF472100FF622100FF7A
+2204FF971F0BFFAC1A0BFFAC190BFFAC190BFFAC190BFFAC190BFFAC190BFF
+AC190BFFAC190BFFAC190BFFAC19B3530000AF5400008C5000007B4C00006D
+4E0000625200005B58000055600000506900004A760000448300003F920000
+3AA1000030AE000326C3000B19E0001508ED031E00F6162200FF312000FF4C
+1C00FF651C00FF7B1E05FF971A0DFFBE130DFFBE130DFFBE130DFFBE130DFF
+BE130DFFBE130DFFBE130DFFBE130DFFBE130DFFBE13B45500008C5000007A
+4C00006D4A0000614D000059520000535900004E610000486C000041790000
+3B850000359200002F9F000028AF00041EC6000C12E1001502EB051D00FE1D
+1D00FF371B01FF501701FF681800FF7D1A02FF93190AFFCF110AFFCF110AFF
+CF110AFFCF110AFFCF110AFFCF110AFFCF110AFFCF110AFFCF110AFFCF118D
+500000794C00006B4A000061490000584D0000525300004C5B000046640000
+40700000397B0000328600002C920000279F000021B2000518CB000D0ADC00
+1603F10E1900FF221900FF3C1602FF541300FF6A1400FF7F1605FF941306FF
+E00F06FFE00F06FFE00F06FFE00F06FFE00F06FFE00F06FFE00F06FFE00F06
+FFE00F06FFE00F794C00006A4A00005F49000058490000514E00004B540000
+455D00003F68000037730000307E00002A8800002593000021A200021AB600
+0611CD000E05DD031400F1131600FF281500FF401200FF571000FF6B1100FF
+81120CFF9A0804FFDF0C01FFF10E01FFF10E01FFF10E01FFF10E01FFF10E01
+FFF10E01FFF10E01FFF10E01FFF10E694A00005E4900005649000050490000
+4A4F0000445700003E610000376C00002F77000029800000248A0000209600
+001BA5000215B900070BCF000E02DD071200F2191202FF2D0E00FF450D00FF
+590C00FF6D0D00FF810E0BFF9A0405FFD70800FFF90B00FFF90B00FFF90B00
+FFF90B00FFF90B00FFF90B00FFF90B00FFF90B00FFF90B5D49000054490000
+4E4A0000494B0000435100003D5A0000366500002F6F000029790000238200
+001F8C00001B99000016A800030FBB000806CD000D00DF0C0F02F61F0C08FF
+360501FF480900FF5C0900FF6F0900FF810A06FF990508FFCB0202FFED0602
+FFED0602FFED0602FFED0602FFED0602FFED0602FFED0602FFED0602FFED06
+534900004D4A0000474B0000434D00003D550000365E00002F690000287300
+00237C00001E8500001A8F0000169C000010AB000309BC000800CB010C00E5
+120B05F7250506FF390100FF4B0500FF5F0500FF700501FF820605FF970208
+FFC40002FFE10402FFE10402FFE10402FFE10402FFE10402FFE10402FFE104
+02FFE10402FFE1044B4A0000464C0000414E00003C500000365800002F6200
+00286C0000237600001E7E00001987000015920000119E00000BAC000403BB
+010800D0080800E9170703FA280202FF3B0100FF4E0200FF610200FF720202
+FF830103FF960004FFBA0003FFD30003FFD30003FFD30003FFD30003FFD300
+03FFD30003FFD30003FFD30003FFD300>
+<8F250000902600009126000091270000922800009429000097290000992800
+019B2500089A1E00129616001E9009002F8B030E3588001C3688002B348B00
+42348C005B338B006F318A00862E8A00A72B8A00DF278500FF218500FF2285
+00FF228500FF228500FF228500FF228500FF228500FF228500FF228500FF22
+8500FF228500FF229025000090260000912700009227000093280000952900
+0097290000992900019B2500089B1F00129717001D910A002E8B030D358900
+1B3688002B358B0041358C005A348B006F318A00862F8A00A62C8A00DD2885
+00FF228500FF228500FF228500FF228500FF228500FF228500FF228500FF22
+8500FF228500FF228500FF228500FF22902600009126000091270000922800
+0093290000952A0000972A00009A2A00019C2600089C2000129918001D920B
+002E8D040D3689001A3789002A368B0040368C0059358B006E328B0085308A
+00A52D8A00DC298600FF238600FF238600FF238600FF238600FF238600FF23
+8600FF238600FF238600FF238600FF238600FF238600FF2391260000912700
+00922800009228000093290000962A0000982B00009A2A00019D2700079D21
+00119A19001C930D002D8E050C368A001939890029368B003E378C0058368C
+006D348B0084318A00A42E8A00D92A8600FF248600FF248600FF248600FF24
+8600FF248600FF248600FF248600FF248600FF248600FF248600FF248600FF
+2491270000922800009228000093290000942A0000962B0000992B00009B2B
+00019E2800079F2200119C1A001B950E002C8F060B368A00183A890027378B
+003D388D0056378C006C358B0083328B00A22F8A00D72B8600FF258600FF25
+8600FF258600FF258600FF258600FF258600FF258600FF258600FF258600FF
+258600FF258600FF25922700009228000093290000942A0000952B0000972C
+0000992C00009C2C00019F2A0007A12400109D1C001B9710002B910709368B
+00173C890026398C003B398D0054388C006B368C0082348B00A1308A00D52C
+8600FF268600FF268600FF268600FF268600FF268600FF268600FF268600FF
+268600FF268600FF268600FF268600FF269228000093290000942A0000942A
+0000952B0000972C00009A2D00009D2E0001A02B0006A326000F9F1D001A99
+12002A930808378C00153D8900253A8C00393B8D00523A8D0069388C008135
+8B009F328A00D22E8700FF278700FF278700FF278700FF278700FF278700FF
+278700FF278700FF278700FF278700FF278700FF278700FF2793290000942A
+0000952B0000952B0000962C0000982D00009B2E00009E2F0001A12D0005A4
+27000FA21F001A9C140028950906378D00133F8900233B8C00373C8D00503B
+8D00683A8D007F378B009D348A00CF308700FF298700FF298700FF298700FF
+298700FF298700FF298700FF298700FF298700FF298700FF298700FF298700
+FF29942A0000952B0000962C0000962C0000972D0000992F00009C3000009F
+300000A32F0005A629000EA42100199F160027970A04388E0011418A00213E
+8C00343E8E004D3D8E00663C8D007E398B009B368A00CC328700FF2B8700FF
+2B8700FF2B8700FF2B8700FF2B8700FF2B8700FF2B8700FF2B8700FF2B8700
+FF2B8700FF2B8700FF2B952B0000962C0000972D0000972D0000982F00009A
+3000009D310000A0320000A4310004A82C000DA7230018A21900259A0D0237
+90010E438C001E408D0031408E004A408F00643E8E007C3C8C0099388A00C9
+348800FF2E8700FF2D8700FF2D8700FF2D8700FF2D8700FF2D8700FF2D8700
+FF2D8700FF2D8700FF2D8700FF2D8700FF2D962C0000972D0000982E000099
+2F00009A3000009C3100009E330000A1340000A5330004A92E000DAA260017
+A61C00239E10003793040D428D001B438D002D428F0047428F0062418F007A
+3E8D00963B8B00C4378800FF318700FF2F8700FF2F8700FF2F8700FF2F8700
+FF2F8700FF2F8700FF2F8700FF2F8700FF2F8700FF2F8700FF2F982E000099
+2F0000992F00009A3000009B3100009D3300009F340000A2350000A6350003
+AB31000CAD2A0016AA200022A213003497080A418F0017468E002A458F0043
+4590005E44900077418F00933E8B00BF3A8600FD358201FF338001FF347E01
+FF357E01FF357E01FF357E01FF357E01FF357E01FF357E01FF357E01FF357E
+01FF35992F00009A3000009B3100009B3200009C3300009D340000A0360000
+A3370000A7380002AC34000AB12E0014AE240020A71700329C0C0840910013
+4A8F00264890003E4890005A47850070497C0087497300A8486D03F3406A05
+FF3D6805FF3E6505FF3F6505FF3F6505FF3F6505FF3F6505FF3F6505FF3F65
+05FF3F6505FF3F6505FF3F9B3100009B3200009C3200009C3300009C340000
+9E360000A0380000A43A0000A93B0002AF380009B4330013B228001EAC1C00
+2FA210053F94000E4E8B00214E7C00315370004757680060595D0079595700
+9F584F01E2524B00FF504900FF514800FF524800FF524800FF524800FF5248
+00FF524800FF524800FF524800FF524800FF529C3200009C3300009D340000
+9D3500009D3600009F380000A13A0000A53C0000AA3E0001B13C0008B73700
+12B72E001DB221002BA714023F810500576B03145D540021614D0034664400
+4E683C00696736008F653100D25F2F00FF5D2D00FF5E2B00FF5E2A00FF5E2A
+00FF5E2A00FF5E2A00FF5E2A00FF5E2A00FF5E2A00FF5E2A00FF5E9D340000
+9D3500009E3600009E3600009F380000A03A0000A23C0000A63F0000AC4200
+00B2400007BA3C0010BD34001BAC2C00288C22003A6A1600534C0D08622E01
+0C6F230022741D00367819005477140079731200B66C1100F9691001F8690F
+02F8690F02F8690F02F8690F02F8690F02F8690F02F8690F02F8690F02F869
+0F02F8699E3600009E3700009F3800009F380000A03A0000A13C0000A33F00
+00A7420000AC450000B3450005BB41000EA9400019913B0024763000345724
+004B38180061170A00740606127E050B2A7E050E4A7C030E6C75020F9F6E01
+10EA6A0011E96A0012E96A0012E96A0012E96A0012E96A0012E96A0012E96A
+0012E96A0012E96A0012E96A9F380000A0390000A03A0000A03B0000A13C00
+00A23F0000A4410000A8450000AD480000AE4A00049E4C000D8F4B00177D46
+0020643E002E4A3400442C27005A0D19006E01191476001D297400224A7200
+236B6B002498640027F3620029F462002AF461002AF461002AF461002AF461
+002AF461002AF461002AF461002AF461002AF461A03B0000A13B0000A13C00
+00A23D0000A23E0000A3410000A5440000A8480000A44D0000955000058A52
+000D7E5300146E53001C5A4F00284246003E253A00530D2E0662002C176A00
+332A6600394C63003C6D5E003E985A003FF6560040F6550041F5550041F555
+0041F5550041F5550041F5550041F5550041F5550041F5550041F555A23D00
+00A23E0000A33E0000A33F0000A4410000A4440000A54700009C4C00008E50
+0001845400057B58000B715D001163600019515E00253B590036204F004906
+40025A0045185D004D2D5A00534F5700576E53005A944F0059FD48005AFD48
+005BFD47005BFD47005BFD47005BFD47005BFD47005BFD47005BFD47005BFD
+47005BFD47A43F0000A4400000A5410000A5420000A5440000A5470000974A
+0000874D00007D510001765800046F5F00096565000E596A0016496D002033
+6B002E1C63003F075A054E005F195100672F4E006B4E4C00706C4700738E44
+0074F13E0075F73E0075F83D0075F83D0075F83D0075F83D0075F83D0075F8
+3D0075F83D0075F83D0075F83DA5420000A6430000A6440000A7450000A747
+000095490000834A0000784E0000705500016A5D0003646500065B6D000A50
+750011407A001A2C7A00251A7700350573044300791944007F2E400082493D
+0087693A008D8C38008CD935008CF134008DF233008DF233008DF233008DF2
+33008DF233008DF233008DF233008DF233008DF233A7460000A8470000A848
+0000A94900009649000082490000754B00006B51000065580000606100015A
+6B000352750006487F000B3B8600122A8A001D198C002A058E023900921736
+00962A32009A4730009F662F00A8852F00AFC32C00ADF12900AEF12900AEF1
+2900AEF12900AEF12900AEF12900AEF12900AEF12900AEF12900AEF129AA49
+0000AB4A0000AC4B0000974A000082480000734A0000684E0000615400005B
+5C00005665000050710000497D00014289000438950009299C00131BA7001D
+0BB1022801BA0F2B00C3252800CA442500CE632401D97C2506E9A12206F4CC
+1F06F4CC1E06F4CC1E06F4CC1E06F4CC1E06F4CC1E06F4CC1E06F4CC1E06F4
+CC1E06F4CC1EAE4D0000AF4E0000984D0000824A000073490000674B00005E
+51000058580000526100004D6C000047790000418700003C96000036A60000
+2BB500061FCE000F11E8011900F0062200FD242000FF401D00FF5B1B00FF75
+1D02FF8E1D0DFFC0130DFFC0130DFFC1130DFFC1130DFFC1130DFFC1130DFF
+C1130DFFC1130DFFC1130DFFC113B25200009A500000824C0000734A000067
+4A00005D4E000056540000505C00004A650000447100003D7E0000378A0000
+319700002BA4000023B8000718D300100AE4011900F70F1D00FF291B00FF45
+1802FF5F1600FF781900FF8C1A09FFD21109FFD31109FFD31109FFD31109FF
+D31109FFD31109FFD31109FFD31109FFD31109FFD3119D530000814E000071
+4B0000654900005C4A0000544F00004E560000495E0000426800003B750000
+348000002E8B00002997000024A700021CBC000911D2001105E4051700FD16
+1900FF2F1701FF491401FF611200FF791503FF8F1308FFD60D05FFE30F05FF
+E30F05FFE30F05FFE30F05FFE30F05FFE30F05FFE30F05FFE30F05FFE30F81
+4E0000704A0000634900005A490000544A00004D5000004758000041620000
+3A6D0000337800002C820000278C0000229800001DAA000316C0000A0AD400
+1101E5091500FC1D1500FF341200FF4D1000FF630F00FF7A110BFF950808FF
+CE0900FFF50E00FFF50E00FFF50E00FFF50E00FFF50E00FFF50E00FFF50E00
+FFF50E00FFF50E6F4A00006249000059490000524900004C4B000046520000
+405B000039650000327000002B7B000026840000218E00001D9C000018AD00
+040FC2000A06D4030F00E70F1101FC230F04FF3B0B00FF500C00FF650B00FF
+7B0D08FF930609FFC70500FFFA0A00FFFA0A00FFFA0A00FFFA0A00FFFA0A00
+FFFA0A00FFFA0A00FFFA0A00FFFA0A6049000057490000504900004B4A0000
+464D00003F550000395F0000326A00002B740000257D0000208600001C9100
+00189F000012B000040AC3000A00D1030E00ED150D07FC2A0505FF400500FF
+540800FF680800FF7B0903FF93060AFFC00000FFFF0700FFFF0700FFFF0700
+FFFF0700FFFF0700FFFF0700FFFF0700FFFF0700FFFF07564900004F4A0000
+494B0000444C00003F50000038590000316300002B6D000025770000208000
+001B8900001794000013A200000CB2000504C1000A00D70A0A00F11A0907FD
+2F0102FF420400FF560400FF6A0400FF7C0503FF920207FFB80000FFF80400
+FFFF0400FFFF0400FFFF0400FFFF0400FFFF0400FFFF0400FFFF0400FFFF04
+4D4A0000474B0000424D00003D4F000038530000315D00002A670000257100
+001F7A00001A820000168C0000129700000DA3000106B2000500C2030800DD
+100600F51E0502FC300101FF450000FF590100FF6B0101FF7E0102FF900003
+FFAF0001FFE90100FFF10100FFF10100FFF10100FFF10100FFF10100FFF101
+00FFF10100FFF101454C0000404E00003B51000036530000315700002A6100
+00246A00001F7400001A7C000016850000118E00000D99000007A4000201B2
+010500C90A0400E2150300F8220201FF340000FF4B0000FF5C0000FF6E0101
+FF800001FF8D0001FFA70000FFE10000FFE60000FFE60000FFE60000FFE600
+00FFE60000FFE60000FFE60000FFE600>
+<8A2000008B2100008B2100008C2200008C2200008E23000090230000912200
+01921F0007911900108C11001B860501298401102D84001E2B86002C2B8800
+412B8900572988006B278800812689009E238A00CD208500FF1A8300FF1983
+00FF198300FF198300FF198300FF198300FF198300FF198300FF198300FF19
+8300FF198300FF198B2100008B2100008C2200008C2200008D2300008E2300
+009023000092220001931F0007921A00108D12001A8605002A84010F2D8400
+1D2C86002C2C8800402B8900562A88006A288800802789009D248A00CC2085
+00FF1B8300FF1A8300FF1A8300FF1A8300FF1A8300FF1A8300FF1A8300FF1A
+8300FF1A8300FF1A8300FF1A8300FF1A8B2100008C2200008C2200008D2300
+008D2300008F240000912400009223000193200006931B000F8E13001A8706
+002A85010E2E84001C2D86002A2C88003E2C8900562B89006A2988007F2789
+009C258A00CA218600FF1C8300FF1B8300FF1B8300FF1B8300FF1B8300FF1B
+8300FF1B8300FF1B8300FF1B8300FF1B8300FF1B8300FF1B8C2200008C2200
+008D2300008D2300008E2400008F240000912400009324000194210006941C
+000F901400198907002986020D2E85001B2E8600292D88003D2D8A00552C89
+00692A89007E2889009A268A00C8228600FF1D8400FF1B8400FF1B8400FF1B
+8400FF1B8400FF1B8400FF1B8400FF1B8400FF1B8400FF1B8400FF1B8400FF
+1B8C2200008D2300008D2300008E2400008E24000090250000922500009424
+000195220005951D000E911500188A09002887030C2F85001A308600282E89
+003B2F8A00532E8900672B89007D2A890099278A00C6238700FF1E8400FF1C
+8400FF1C8400FF1C8400FF1C8400FF1C8400FF1C8400FF1C8400FF1C8400FF
+1C8400FF1C8400FF1C8D2300008D2300008E2400008E2400008F2500009025
+0000932600009525000196230005971E000E931700188C0B002789040B2F86
+0018318600273089003A308A00512F8A00662D89007C2B8A0097288A00C425
+8700FF208400FF1D8400FF1E8400FF1E8400FF1E8400FF1E8400FF1E8400FF
+1E8400FF1E8400FF1E8400FF1E8400FF1E8D2300008E2400008F2400008F25
+000090250000912600009326000096260001972500049920000D951800178F
+0D00258B05092F8700173386002531890038318B004F308A00652E8A007B2C
+8A00962A8A00C1268800FF218500FF1F8500FF1F8500FF1F8500FF1F8500FF
+1F8500FF1F8500FF1F8500FF1F8500FF1F8500FF1F8500FF1F8E2400008F25
+00008F2500009026000091260000922700009428000097280000992600049A
+21000C971A0016910F00248D0707308800153586002332890035338B004D32
+8B0063308A00792E8A00942B8A00BE288800FF238500FF208500FF208500FF
+208500FF208500FF208500FF208500FF208500FF208500FF208500FF208500
+FF208F25000090250000902600009127000092270000932800009529000098
+2900009A2800039C23000B991C0016941200238F0805308900123887002135
+890033358B004A348B0062338B0078308A00922D8A00BB2A8900FF258500FF
+228500FF228500FF228500FF228500FF228500FF228500FF228500FF228500
+FF228500FF228500FF22902600009126000091270000922800009328000094
+290000962A0000992B00009C2A00039D25000B9C1E001597150021920A0331
+8A01103A88001F378A0030378C0047378C0060358B0076338A0090308A00B8
+2C8900FF278600FF248600FF248600FF248600FF248600FF248600FF248600
+FF248600FF248600FF248600FF248600FF2491270000922800009328000093
+290000942A0000952B0000982C00009A2D00009D2C00029F28000A9F210014
+9B180020950C00328D030E3A8A001D3A8A002D398C0044398D005E388C0074
+358B008D328A00B42E8A00FC2A8600FF268600FF268600FF268600FF268600
+FF268600FF268600FF268600FF268600FF268600FF268600FF269328000093
+290000942A0000952B0000952B0000972D0000992E00009C2F00009F2E0002
+A22B0009A3240012A01B001E990F003091050B3B8B001A3D8A002A3B8D0040
+3C8E005B3B8D0071388C008A358700AD338100EE307C00FF2D7B00FF2E7800
+FF2F7600FF2F7600FF2F7600FF2F7600FF2F7600FF2F7600FF2F7600FF2F76
+00FF2F942A0000952B0000962C0000962C0000972D0000982E00009A300000
+9D310000A1310002A42E0008A7280011A41F001C9E13002D9508083B8D0016
+418B00263E8D003C3F870053417E00684275007E426E0099416700D93E6301
+FF396001FF3A5F01FF3B5D01FF3C5D01FF3C5D01FF3C5D01FF3C5D01FF3C5D
+01FF3C5D01FF3C5D01FF3C962C0000972D0000972D0000982E0000992F0000
+9A3000009C3200009F330000A3330001A7320006AA2C0010A823001BA31800
+2A9A0C053B900011458100204774002D4B6900425061005952580072525300
+92524D00C84E4900FF494700FF4A4500FF4B4400FF4B4400FF4B4400FF4B44
+00FF4B4400FF4B4400FF4B4400FF4B4400FF4B982E0000992F0000992F0000
+9A3000009B3100009C3200009D340000A0350000A4370000A8350005AC3000
+0EAD280019A91D00279813023976050151630314574F001E5A4700305F4000
+4861370062603300835F2F00B75A2D00FC562B00FC562900FB572700FB5727
+00FB572700FB572700FB572700FB572700FB572700FB572700FB579A300000
+9B3100009B3200009B3200009C3300009D3400009F360000A1380000A53A00
+00AA390004AF35000DB32E00179D280023821F00346114004C460C075B2A01
+0B682100206C1B00327016004D7012006D6D10009A681100F4621001F3620F
+02F2620E02F1620E02F1620E02F1620E02F1620E02F1620E02F1620E02F162
+0E02F1629B3200009C3300009C3300009D3400009D3500009E370000A03900
+00A33B0000A73D0000AC3E0003AB3C000B9C3B0016873400216C29002E5020
+00453316005B1509006D04051176050A2876050D4474020E6470010F8B6900
+0FE1640010E1630011E1630012E2620012E2620012E2620012E2620012E262
+0012E2620012E2620012E2629D3400009D3500009E3600009E3600009E3700
+009F390000A13B0000A43E0000A9410000A24400029445000B86430014743E
+001D5C370029452E003D292400540B1700680017146E001C286C0020446A00
+2264660022885E0026EB5C0027EE5B0028EE5A0028ED5A0028ED5A0028ED5A
+0028ED5A0028ED5A0028ED5A0028ED5A0028ED5A9E3700009F3700009F3800
+00A0390000A03A0000A13C0000A23E0000A5410000994600008C490003824A
+000B764B0012664A001A534600243D4000382235004C0C2B065C002A176300
+312A5F0036465D00396559003C8854003CE250003CF14E003DF14E003EF14D
+003EF14D003EF14D003EF14D003EF14D003EF14D003EF14D003EF14DA03900
+00A03A0000A13B0000A13C0000A23C0000A23F0000A3410000924500008648
+00007C4C0004745000096955000F5C5700174C560022365100321D48004405
+3A0254003F185600472B54004D49500052684E005588490054D5430054FC40
+0055FC400055FC3F0055FC3F0055FC3F0055FC3F0055FC3F0055FC3F0055FC
+3F0055FC3FA13C0000A23D0000A23E0000A33E0000A33F0000A34200008E44
+000080460000774B00016F510003675700085E5D000D536200144364001D2E
+62002A195A003A055306480058194A00602D4600654A45006A6742006D863D
+006DC639036FFB350370FB350370FB340370FB340370FB340370FB340370FB
+340370FB340370FB340370FB34A33F0000A4400000A5410000A5420000A543
+00008C4300007D440000724800006A4E0000635500025C5C0005556500094A
+6C00103A71001828710023166D00320468053E006F1A3D00762D3A007A4737
+007F6434008385320084BB310384FA2C0384FB2B0385FB2B0385FB2B0385FB
+2B0385FB2B0385FB2B0385FB2B0385FB2B0385FB2BA6430000A6440000A744
+0000A74500008C4400007B4300006F460000654B00005F510000595A000153
+6200024C6C00054275000B357C0012257F001D157F00290481053400861931
+008B2B2D0090442A00936329009A8029009FAD2805A0FE2205A0FE2205A1FE
+2205A1FE2205A1FE2205A1FE2205A1FE2205A1FE2205A1FE2205A1FE22A846
+0000A8480000A94900008B4600007B4400006D450000624800005B4E000055
+560000505E00004A680000437400013B7F00043088000B248F00151696001F
+079D052700A3142800AA282400B1412100B4612000BD7A2100CA992200D4E1
+1E00D4E01E00D5E01E00D5E01E00D5E01E00D5E01E00D5E01E00D5E01E00D5
+E01E00D5E01EAB4B0000AC4C00008B490000794600006C4500006147000059
+4C0000535200004D5B000048640000417100003A7D0000338900002C940003
+23A2000A1AB500120CC7001A00D40A1F00E9211C00F53C1A02FE581601FF71
+1900FF891B08FFD81208FFDB1208FFDC1208FFDC1208FFDC1208FFDC1208FF
+DC1208FFDC1208FFDC1208FFDC12B04F00008B4C0000784900006A47000060
+470000584A0000515000004B580000456200003E6D00003779000031840000
+2B900000269D000020AF000418C8000C0AD9001402EF0D1800FF221700FF3E
+1501FF571100FF701400FF88150AFFCC0B04FFE60F04FFE60F04FFE60F04FF
+E60F04FFE60F04FFE60F04FFE60F04FFE60F04FFE60F8C4F0000774B000069
+4900005E49000056490000504C00004A530000445C00003D66000036710000
+2F7C000029860000249100001F9F00011AB3000511CA000C05DB031300EE13
+1400FF281300FF421000FF5A0E00FF720F07FF8E0B0AFFC50600FFF60D00FF
+F60D00FFF60D00FFF60D00FFF60D00FFF60D00FFF60D00FFF60D00FFF60D76
+4B0000674900005C490000544900004E4A0000494E0000435600003C5F0000
+356A00002E750000287F0000238800001E9400001AA3000114B600060ACB00
+0D01DA061100F2191004FF2F0A00FF470B00FF5D0A00FF740C05FF8C090BFF
+BF0200FFFB0A00FFFC0900FFFC0900FFFC0900FFFC0900FFFC0900FFFC0900
+FFFC0900FFFC09664900005A490000524900004C4A0000474B000042500000
+3C590000356400002D6E000027780000228100001D8B00001997000014A600
+020EB8000704C9000C00DE0D0D03F4200809FF370101FF4A0700FF600700FF
+740702FF8C0709FFB90000FFFF0600FFFF0600FFFF0600FFFF0600FFFF0600
+FFFF0600FFFF0600FFFF0600FFFF0659490000514900004B4A0000454C0000
+414E00003B540000345E00002D68000027720000217B00001D840000188E00
+00149A00000FA8000208B9000700C9030A00E4130904F8240405FF390100FF
+4D0300FF620300FF760402FF8B0305FFB10001FFEE0300FFFF0300FFFF0300
+FFFF0300FFFF0300FFFF0300FFFF0300FFFF0300FFFF034F490000494B0000
+434D00003E4F00003A510000345800002D620000276B0000217500001C7D00
+0017860000139100000F9C000009A9000302B8010700CF0A0600E7180401F9
+270202FF3C0000FF510100FF640100FF780102FF8B0003FFA90001FFE10100
+FFFF0100FFFF0100FFFF0100FFFF0100FFFF0100FFFF0100FFFF0100FFFF01
+474B0000414E00003C50000037530000325500002D5C000027660000216F00
+001C77000017800000128900000E930000099D000104AA010300BC050400D6
+0F0200EE1C0201FE2A0001FF420000FF540000FF670000FF7A0000FF8A0001
+FFA20000FFDB0000FFFE0000FFFE0000FFFE0000FFFE0000FFFE0000FFFE00
+00FFFE0000FFFE003F4E00003A51000034540000305700002B5A0000266000
+00216900001B720000167A0000128200000D8B000009940000039D000200AB
+040100C30A0100DB150000F11F0000FF2C0000FF440000FF550000FF660000
+FF790000FF870000FF990000FFC60000FFEF0000FFEF0000FFEF0000FFEF00
+00FFEF0000FFEF0000FFEF0000FFEF00>
+<861C0000871D0000871D0000871D0000881E0000881E0000891E00008B1D00
+008B1A00058914000E840C00187E0203247F00122481001F2483002C238500
+3F23860054228500682085007C1E8700951C8800BB1A8700F7168400FF1384
+00FF148400FF148400FF148400FF148400FF148400FF148400FF148400FF14
+8400FF148400FF14861D0000871D0000871D0000871E0000881E0000881F00
+008A1E00008B1D00008B1A00058A15000E850D00187F020224800111248100
+1E2483002B2485003E24860054238500672185007B1F8700941D8800BA1A87
+00F5178400FF148400FF148400FF148400FF148400FF148400FF148400FF14
+8400FF148400FF148400FF148400FF14871D0000871D0000871E0000881E00
+00881F0000891F00008A1F00008C1E00008C1B00048B16000D870E00177F02
+01258001102582001D2583002A2585003D25860053238600662186007A2087
+00931E8800B91B8700F4188400FF158400FF158400FF158400FF158400FF15
+8400FF158400FF158400FF158400FF158400FF158400FF15871D0000871E00
+00881E0000881F0000891F0000891F00008B1F00008C1F00008D1C00048C17
+000D880F00178104012481010F2682001C268300292686003B268700522486
+006522860079218700911F8800B71C8700F2188400FF158400FF158400FF15
+8400FF158400FF158400FF158400FF158400FF158400FF158400FF158400FF
+15881E0000881E0000891F0000891F0000892000008A2000008B2000008D1F
+00008E1D00048D18000C8A1100168205012382020D2782001A288300282686
+003A27870050268700642486007822870090208900B51D8700F1198300FF16
+8300FF168300FF168300FF168300FF168300FF168300FF168300FF168300FF
+168300FF168300FF16881E0000891F0000891F00008A2000008A2000008B21
+00008C2100008E2000008F1E00038F1A000B8B1200158407012283020C2783
+001929830026288600382887004F27870063258700772388008F218900B31E
+8800EE1A8300FF178300FF178300FF178300FF178300FF178300FF178300FF
+178300FF178300FF178300FF178300FF17891F0000892000008A2000008A20
+00008B2100008B2100008D2100008F210000901F0003901B000A8D14001586
+09002184030A298300172A830025298700362988004C288800612687007524
+88008D228900B1208800EB1C8300FF188300FF188300FF188300FF188300FF
+188300FF188300FF188300FF188300FF188300FF188300FF188A2000008A20
+00008B2100008B2100008C2200008C2200008E220000902200009121000292
+1D000A8F160014890B00208503082A8300162C8400232A8700342B88004A2A
+880060288800742688008B248900AF218800E81D8300FF198300FF198300FF
+198300FF198300FF198300FF198300FF198300FF198300FF198300FF198300
+FF198B2100008B2100008C2200008C2200008D2300008D2300008F23000091
+23000093220002931E0009911700138B0E001F8604052B8400142E8400212C
+8700322C8900482B89005E2A8800722888008A268900AD238900E61F8300FF
+1A8300FF1A8300FF1A8300FF1A8300FF1A8300FF1A8300FF1A8300FF1A8300
+FF1A8300FF1A8300FF1A8B2100008C2200008D2300008D2300008E2400008E
+24000090240000922500009424000195200009931A00128E10001E8805032C
+8500113085001F2E87002F2E8900452E8A005C2C8900702A890088288A00AA
+258900E3218400FF1C8400FF1C8400FF1C8400FF1C8400FF1C8400FF1C8400
+FF1C8400FF1C8400FF1C8400FF1C8400FF1C8D2200008D2300008E2400008E
+2400008F2500009025000091260000942600009625000197220008961C0011
+9214001C8B07002D88030F3186001D3187002C308A0041308A00592F8A006E
+2D8900852A8A00A7278A00E1238400FF1E8400FF1E8400FF1E8400FF1E8300
+FF1F8300FF1F8300FF1F8300FF1F8300FF1F8300FF1F8300FF1F8E2400008E
+2400008F250000902500009026000091270000932700009528000097280001
+992500069A1F00109617001A8F0B002A8B050C3288001A35870029338A003E
+338B0057328B006C308700822E80009E2D7B00CF2B7600FF277400FF287100
+FF297000FF296F00FF2A6F00FF2A6F00FF2A6F00FF2A6F00FF2A6F00FF2A6F
+00FF2A8F250000902600009126000091270000922800009228000094290000
+972A0000992A00019C2800059D23000E9A1B0019940F00288F0709328A0016
+38880025358900393780004E3A7700623B6F00763B68008D3B6300B9395D00
+FF345B00FF355900FF365800FF365700FF375700FF375700FF375700FF3757
+00FF375700FF375700FF379126000092270000922800009329000094290000
+942A0000962B0000982C00009B2D00009E2B0004A126000D9E1E0017991400
+25940A06338A00123D78001E406C002C4462003E495B00534B53006A4A5000
+864C4A00B0484600FE424400FE434200FE434100FD444000FD444000FD4440
+00FD444000FD444000FD444000FD444000FD449328000093290000942A0000
+952B0000962C0000962C0000982E00009A2F00009E300000A12F0003A42A00
+0CA42200169F1900228C1101346C04014B5B02135149001E5342002E573B00
+435A34005B5A310076592C00A1552A00EF4F2800F84F2600F8502500F75024
+00F7502400F7502400F7502400F7502400F7502400F7502400F750952B0000
+962B0000962C0000972D0000982E0000992F00009A3000009D320000A03300
+00A4320003A72F000AA32900148E24001F771C002F59130045400B07542600
+0B611F001F6518002E6815004569110064680E0088630F00D85C0F02ED5B0E
+02EC5B0D03EB5B0D03EA5B0D03EA5B0D03EA5B0D03EA5B0D03EA5B0D03EA5B
+0D03EA5B972D0000982E0000992F00009A3000009A3100009B3100009C3300
+009E340000A1360000A53600029D3600098E3400137C2E001D6426002A4A1E
+003D2E150054120800660405116E020A256E030D3D6C020E5B6A010E7D6400
+0EBF5E0010DC5C0011DD5B0011DD5B0012DD5B0012DD5B0012DD5B0012DD5B
+0012DD5B0012DD5B0012DD5B9A3000009B3100009B3200009C3200009C3300
+009C3400009D350000A0370000A3390000963D0001893D00097C3B00126B37
+001A553200243F2A00372521004D0915006200161467001B2765001E3E6300
+215C6100217C580023BC550025E8540026E8530026E8530027E8520027E852
+0027E8520027E8520027E8520027E8520027E8529C3300009C3300009D3400
+009D3500009D3600009E3600009F3800009F3B00008F3E0000844100027A43
+00096E4300105E4200174D3F0021383900321F300046092606570027175B00
+2D28580032405600365E5200397D4E003AB84A0039ED47003AED46003BEE46
+003BEE45003BEE45003BEE45003BEE45003BEE45003BEE45003BEE459D3500
+009E3600009E3700009F3800009F390000A03900009B3C00008A3E00007E41
+0000754500036C480008614C000E544D0015454D001E3149002D1A41003E03
+35034E003C194E0042294C00494349004D624700527E430051AE3E0150F33A
+0151F3390151F3390152F3380152F3380152F3380152F3380152F3380152F3
+380152F3389F380000A0390000A03A0000A13B0000A13C0000993C0000863D
+0000794000006F44000068490003604E00065754000B4C5900123E5C001B2A
+59002716510035034A06420051184200592B40005F463F0065623B00677E37
+0067A934056AFC2E056AFC2D056BFC2D046BFB2D046BFB2D046BFB2D046BFB
+2D046BFB2D046BFB2D046BFB2DA13C0000A23D0000A23D0000A33E0000983F
+0000843D0000763F00006B420000634700005C4E0002565500044E5C000844
+63000E35670017246700211363002E025F063800671937006F2C3500744432
+0079602E007C7E2C007DA72B047EF725047EF725057FF824057FF824057FF8
+24057FF824057FF824057FF824057FF824057FF824A33F0000A4400000A541
+000098410000833F0000743E0000684100005F450000594B0000535300004D
+5B0002466300053C6C000A2F7300122076001C1175002701750630007D1A2C
+00822B2900874125008B5F24008F7B240092A0231298FF151298FF141399FF
+141399FF141399FF141399FF141399FF141399FF141399FF141399FF14A643
+0000A6440000984400008142000072400000674000005D4400005649000050
+5000004B580000456100003D6C000134760005297D000D1E84001611890020
+038E072500941723009B282000A13F1D00A55C1C00AA761C00B1941D00B5E2
+1A00B6F61900B7F61A00B7F61900B7F61900B7F61900B7F61900B7F61900B7
+F61900B7F619A9480000994800008045000070430000644200005C42000054
+4700004E4E000048560000435F00003C6A0000347500002D7F000226890006
+1D94000D13A1001608AD041B00B80F1C00C5221900D13A1700DA561500E06F
+1500E5881702F1BE1502EAE81202EAE91202EAE91202EAE91202EAE91202EA
+E91202EAE91202EAE91202EAE9129B4B0000804800006F4500006245000059
+450000534600004C4C000047540000415D00003A690000327500002C7F0000
+268A0000229600001DA7000216BD00080AD2001001E2081400FA1E1300FF35
+1100FF500E00FF680E02FF850E0DFFB90400FFF70D00FFF70D00FFF70D00FF
+F70D00FFF70D00FFF70D00FFF70D00FFF70D00FFF70D804B00006D48000060
+48000057480000514900004C4A0000465100003F5A000039640000316F0000
+2A79000025820000208D00001C9A000017AB00030FBF000905D1020E00E70E
+1003FB240C04FF3D0800FF530A00FF6B0A00FF840C0DFFB60000FFFC0900FF
+FD0900FFFD0900FFFD0900FFFD0900FFFD0900FFFD0900FFFD0900FFFD096C
+4A00005F490000554900004F4A0000494B0000454C00003E540000385E0000
+306800002A730000247C00001F8500001B900000179D000011AD000409C000
+0900CF030D00ED150B08FB2C0204FF410400FF560600FF6D0600FF840709FF
+B00000FFFC0500FFFF0500FFFF0500FFFF0500FFFF0500FFFF0500FFFF0500
+FFFF0500FFFF055D490000544900004D4A0000474B0000424D00003E4F0000
+3758000030620000296C0000247600001E7F00001A8800001593000011A000
+000BAF000403BE010900D60A0800F01A0704FC2E0101FF430200FF590300FF
+6E0302FF850205FFAA0002FFE80200FFFF0200FFFF0200FFFF0200FFFF0200
+FFFF0200FFFF0200FFFF0200FFFF02524900004B4A0000454C0000404E0000
+3B50000036530000305C000029660000237000001E79000019810000158B00
+00109500000BA1000105AF010500C1050600DC110400F41F0301FE310001FF
+480000FF5C0100FF710102FF860002FFA20001FFDE0000FFFF0100FFFF0100
+FFFF0100FFFF0100FFFF0100FFFF0100FFFF0100FFFF01494B0000434D0000
+3D4F000038520000335500002F57000029600000236A00001E730000197B00
+00148400000F8D00000B97000005A2000200B0020400C80A0200E2160200F8
+220100FF360000FF4D0000FF5F0000FF730000FF850000FF9C0000FFD70000
+FFFF0000FFFF0000FFFF0000FFFF0000FFFF0000FFFF0000FFFF0000FFFF00
+414E00003B50000036540000315600002C590000285C0000236400001D6D00
+0018750000137D00000F8600000A8E00000597000101A3020100B5080000CD
+0F0000E6190000F9240000FF370000FF4D0000FF5D0000FF710000FF820000
+FF930000FFBF0000FFF40000FFFF0000FFFF0000FFFF0000FFFF0000FFFF00
+00FFFF0000FFFF0039510000335500002E580000295B0000265D0000235F00
+001D67000018700000137700000E7F000009870000068E00000297000200A2
+030100B4070000CC0E0000E5180000F8230000FF350000FF4B0000FF5C0000
+FF6E0000FF800000FF8E0000FFAD0000FFE50000FFFB0000FFFB0000FFFB00
+00FFFB0000FFFB0000FFFB0000FFFB00>
+<83180000841800008419000084190000841A0000851A0000851A0000851800
+00851500038210000B7F0902147900061D7B00141D7E00201D81002C1D8200
+3E1C8200511B820064198200761884008C168600AB148600DE118400FF0E84
+00FF0E8400FF0E8400FF0E8400FF0E8400FF0E8400FF0E8400FF0E8400FF0E
+8400FF0E8400FF0E841800008419000084190000841A0000851A0000851A00
+00861A000086190000851600038311000B800A02147900041E7B00131E7E00
+1F1D81002C1E82003D1D8300511C8300631A8300761884008B168600AB1487
+00DE128400FF0E8400FF0E8400FF0E8400FF0E8400FF0E8400FF0E8400FF0E
+8400FF0E8400FF0E8400FF0E8400FF0E8419000084190000841A0000851A00
+00851A0000851B0000861B000086190000861700038412000B810B01147900
+031F7B00121E7E001E1E81002A1E82003C1E8300501D8300631B8300751984
+008B178600AA158700DD128400FF0F8400FF0F8400FF0F8400FF0F8400FF0F
+8400FF0F8400FF0F8400FF0F8400FF0F8400FF0F8400FF0F84190000851A00
+00851A0000851B0000851B0000861B0000861B0000871A0000871800038513
+000A820C01137A01021F7B00101F7E001D1F8100291F83003B1F83004F1E83
+00621C8300741A85008A188700A9168700DC138400FF108400FF108400FF10
+8400FF108400FF108400FF108400FF108400FF108400FF108400FF108400FF
+10851A0000851A0000851B0000851B0000861C0000861C0000871C0000871B
+0000881800028614000A830D00137B02011F7C000F207E001C208100282083
+00392084004D1F8400611D8400731B850088198700A8178700DB148400FF10
+8400FF108400FF108400FF118400FF118400FF118400FF118400FF118400FF
+118400FF118400FF11851A0000851B0000861B0000861C0000861C0000861C
+0000871C0000881B00008919000288150009840E00137D04011E7D010D217F
+001A21810027218300372184004C2084005F1E8400721C8500871B8700A618
+8700D9168400FF118400FF118400FF118400FF118400FF118400FF118400FF
+118400FF118400FF118400FF118400FF11851B0000861C0000861C0000861C
+0000871D0000871D0000881D0000891C00008A1B000289170008861000127F
+06011D7E010B227F001822810025228400352285004A2185005E1F8500701E
+8500861C8700A41A8800D7178400FF128400FF128400FF128400FF128400FF
+128400FF128400FF128400FF128400FF128400FF128400FF12861C0000861C
+0000871D0000871D0000871E0000881E0000881E00008A1D00008B1C00018B
+180008881200118108011C7F02092380001724810023238400332385004723
+86005C2185006F1F8600841E8700A21B8800D4188400FF138400FF138400FF
+148400FF148400FF148400FF148400FF148400FF148400FF148400FF148400
+FF14871D0000871D0000871E0000881E0000881E0000891F0000891F00008B
+1F00008C1E00018C1A00078A140010840B011B800206248000152682002125
+840030258600452486005A2386006D218600831F8800A01D8800D21A8400FF
+158400FF158400FF158400FF158400FF158400FF158400FF158400FF158400
+FF158400FF158400FF15871E0000881E0000881E0000891F0000891F00008A
+2000008B2000008C2000008E1F00018E1C00068C16000F870D001A82030426
+8100122882001F2784002E27860042268700582586006B238600812188009E
+1F8900CE1C8400FF168300FF168300FF168300FF168300FF168300FF168300
+FF168300FF168300FF168300FF168300FF16881E0000891F0000891F00008A
+2000008A2000008B2100008C2100008D2100008F200001901E00058F18000E
+8A1000198304002882010F2983001D2985002B2887003F288800552787006A
+2587007F2388009C218900CB1E8500FF188000FF187E00FF197D00FF1A7C00
+FF1B7B00FF1B7B00FF1B7B00FF1B7B00FF1B7B00FF1B7B00FF1B892000008A
+2000008B2100008B2100008C2200008C2200008D2200008F22000091220000
+92200004921B000D8E1300178707002684020C2B84001A2C8500282B87003B
+2B8900532A8700672880007A287A0092277500B7267200F8236D00FF236B00
+FF236A00FF246800FF246800FF246800FF246800FF246800FF246800FF2468
+00FF248B2100008B2100008C2200008D2200008D2300008E2300008F240000
+902400009224000094220003951E000C911600168B0B00248703092D850017
+2F8500252D81003530780048336F005C3368007034630085345E00A6335A00
+E72F5700FF2E5600FF2F5400FF305300FF305300FF315300FF315300FF3153
+00FF315300FF315300FF318C2200008D2300008E2300008E2400008F240000
+8F250000902500009226000095260000972500029721000A951A0014901000
+218B06052E7F00113770001D3A65002A3D5B00394054004D424D0064434B00
+7C4447009D414300DB3D4100FB3C3F00FA3D3D00FA3D3C00F93D3C00F93E3C
+00F93E3C00F93E3C00F93E3C00F93E3C00F93E8E2400008F2400008F250000
+902600009126000091270000922800009428000097290000992800029A2400
+099A1E00139316001E7F0F012E630403435502134944001D4B3D002A4E3700
+3E51300054522C006C512A00904F2800CB492600F1472400F0482300EF4822
+00EF492100EF492100EF492100EF492100EF492100EF492100EF4990260000
+9126000091270000922800009328000093290000942A0000962B0000992C00
+009C2C00019E290007942500118320001C6D19002A5211003E3A0A064C2300
+0A5A1D001E5E16002C6112003F620F005B620D007C5F0D01B0570E02E5540D
+02E4540C03E3540C03E2540C03E2540C03E2540C03E2540C03E2540C03E254
+0C03E2549228000093290000942A0000952A0000952B0000962C0000972D00
+00992E00009B2F00009E30000190300006832D00117127001A5B210026441B
+00382A12004C1007005F0304116702092467030C3965020D5563000E735F00
+0E9F59000FD8540010D8540011D9530011D9530012D9530012D9530012D953
+0012D9530012D9530012D953952B0000962C0000972C0000972D0000982E00
+00992F00009A3000009C320000993300008B35000080360007723300106230
+00184F2C00213A260032221E00450914015B00161460001A265D001D3B5B00
+1F5659002073520021A04E0023E34B0024E34A0024E34A0025E3490025E349
+0025E3490025E3490025E3490025E3490025E349982E0000992F00009A3000
+009B3100009B3100009B3200009C33000094350000863700007B390001713B
+0008643B000E563B00154638001E3234002D1D2B0040082406500025185400
+2B285000303D4E0033584B0036754600389F430036E7400037E73F0037E73F
+0038E73E0038E73E0038E73E0038E73E0038E73E0038E73E0038E73E9B3100
+009B3200009C3300009C3400009D3400009D3500009035000081370000763A
+00006D3D0002644100075943000C4D4500133F45001C2C420028183A003902
+31044700371947003E284400443F4100485B3F004D763D004E9A39004BE934
+004CE933014DE933014DE933014DE932014DE932014DE932014DE932014DE9
+32014DE9329D3400009D3500009E3600009E3700009F3800008E3700007E37
+0000723A0000683E000060420002584600054F4B000A455000103854001826
+510023134900300244063C004B183B00542A39005A4338005F5D3500637731
+0062992E0163EF2A0164EF290164EF290164EE290164EE290164EE290164EE
+290164EE290164EE290164EE299F3800009F390000A03A0000A03B00008D3A
+00007C3900006F390000653D00005C410000564600014F4D0003485400073E
+5B000D305F0015205D001E105900290157063100601A3000682C2F006E422C
+00725B2900767726007699260076E3230077F4220077F4220078F4220078F4
+220078F4220078F4220078F4220078F4220078F422A13C0000A23D0000A23D
+00008C3D00007A3B00006D3B0000623C000059400000534500004D4C000047
+540001405C0004366400092A6A00111C6C001B0D6A0024016D082A00751B27
+007B2B250080402100845A1F0087751F0089951F0E8CD913128EFB0F128EFC
+0F128EFC0E128EFC0E128EFC0E128EFC0E128EFC0E128EFC0E128EFC0EA440
+0000A44100008B400000783E00006A3D0000603D0000573F0000514400004B
+4A0000455200003F5B0000386500012E6E00062475000E197A00160C7D001F
+0182092200881A1F008F291C00953E1A00995918009C711800A08C1900A3C3
+1701A6FB1601A7FB1601A7FB1601A7FB1601A7FB1601A7FB1601A7FB1601A7
+FB1601A7FB16A74400008B43000076400000684000005D400000554100004F
+43000049490000445100003E5A0000376400002F6E00002878000320800009
+178800100C9000180399061B00A2141800AC241500B6391300BD531100C26B
+1100C6851300CEAB1300CCEF1000CCEF0F00CDEF0F00CDEF0F00CDEF0F00CD
+EF0F00CDEF0F00CDEF0F00CDEF0F8B47000075430000664200005B43000053
+4300004D45000048480000424F00003C590000356300002E6E000028780000
+228200001D8D0002179A000610AA000B06BB001100CD0A1100E61C0F00F92F
+0D00FF4A0B00FF630A00FF7C0B0AFFA90300FEFD0900FEFD0900FFFD0800FF
+FE0800FFFE0800FFFE0800FFFE0800FFFE0800FFFE08744600006445000059
+460000514700004B480000464A0000414F00003B580000346200002D6D0000
+27770000218000001D8900001895000014A400010DB5000604C6000B00DC0D
+0C03F4200707FF380100FF4D0600FF640600FF7C0707FFA40100FFFA0500FF
+FF0500FFFF0500FFFF0500FFFF0500FFFF0500FFFF0500FFFF0500FFFF0563
+4900005849000050490000494B0000444C00003F4E00003A530000335C0000
+2C66000026700000217A00001C830000178D0000139800000EA5000207B600
+0600C7040900E3130703F8250303FF390100FF500200FF660201FF7E0204FF
+A00002FFE60100FFFF0200FFFF0200FFFF0200FFFF0200FFFF0200FFFF0200
+FFFF0200FFFF02564900004E4A0000474B0000424D00003D50000038520000
+335700002C610000266A0000207400001B7C000016850000128F00000E9A00
+0008A6000301B5010600CE0B0400E7180301FB270201FF3E0000FF540100FF
+690101FF800002FF990001FFDE0000FFFF0100FFFF0100FFFF0100FFFF0100
+FFFF0100FFFF0100FFFF0100FFFF014C4A0000454C00003F4E00003A510000
+35540000305700002C5B000025650000206E00001B760000167F0000118800
+000D910000079B000103A7020200BA060300D4110100ED1D0100FF2A0000FF
+440000FF570000FF6B0000FF800000FF930000FFD30000FFFF0000FFFF0000
+FFFF0000FFFF0000FFFF0000FFFF0000FFFF0000FFFF00444C00003D4F0000
+37530000325600002D580000295B0000255F0000206800001A710000157900
+00108100000C89000007920000029B010200A8040000BF0A0000D7130000EE
+1E0000FF2A0000FF430000FF550000FF680000FF7D0000FF8E0000FFBB0000
+FFF30000FFFF0000FFFF0000FFFF0000FFFF0000FFFF0000FFFF0000FFFF00
+3B500000355400002F5700002A5A0000265D0000235F0000206300001A6B00
+0015730000107B00000B820000088A000004920001019B010200A8040000BE
+0A0000D5130000ED1D0000FF290000FF410000FF540000FF660000FF7B0000
+FF8A0000FFAB0000FFE40000FFFF0000FFFF0000FFFF0000FFFF0000FFFF00
+00FFFF0000FFFF00335500002D590000285C0000245F0000206100001D6200
+001A650000156D0000117400000E7B00000B8200000889000005910001019A
+010200A7040000BD090000D4120000EC1C0000FF270000FF3F0000FF520000
+FF630000FF770000FF870000FF9E0000FFD50000FFFF0000FFFF0000FFFF00
+00FFFF0000FFFF0000FFFF0000FFFF00>
+<7F140000801400008014000081150000811500008116000082160000811400
+00801100027C0C00097805021175000917780015177B0020177E002C177F00
+3D167F004F157F006013800071118000840F82009C0D8300C40B8400FD0884
+00FF088400FF088400FF088400FF088400FF088400FF088400FF088400FF08
+8400FF088400FF088014000080140000811500008115000082160000821600
+008217000082150000801200027D0D00087906021175000818780014177B00
+1F177E002B187F003C177F004E1680006014800071128100841082009C0E83
+00C30C8400FC098400FF098400FF098400FF098400FF098400FF098400FF09
+8400FF098400FF098400FF098400FF09801500008115000081160000821600
+0082160000821700008317000082150000811300027E0E00087A0701117600
+0618780013187B001E187E002A1880003A1880004D1780005F158000701381
+00831182009C0F8400C30D8500FC0A8400FF098400FF098400FF098400FF0A
+8400FF0A8400FF0A8400FF0A8400FF0A8400FF0A8400FF0A81150000811600
+0082160000821700008217000083170000831800008316000082140001800F
+00077C08011176000519780012197B001D197E0029198000391980004C1880
+005E1681006F148100821283009B108400C20E8500FB0B8400FF0A8400FF0A
+8400FF0A8400FF0A8400FF0A8400FF0A8400FF0A8400FF0A8400FF0A8400FF
+0A821600008216000082170000831700008317000083180000831800008317
+000083150001811000077D090010770104197800101A7B001C1A7F00281A80
+00371A81004A1981005D1781006E158200811383009A118400C10F8500FC0C
+8400FF0B8400FF0B8400FF0B8400FF0B8400FF0B8400FF0B8400FF0B8400FF
+0B8400FF0B8400FF0B82170000821700008317000083180000831800008418
+0000841900008418000084160001821200067E0B00107903041979000E1B7C
+001B1B7F00261B8100361B8100491A81005C1882006D168200801584009913
+8500C0108500FD0D8400FF0C8400FF0C8400FF0C8400FF0C8400FF0C8400FF
+0C8400FF0C8400FF0C8400FF0C8400FF0C8317000083180000831800008418
+00008419000084190000841A0000851900008517000184130006800C000F7B
+04031879000C1C7C00191C7F00251C8100341C8200471B82005A1982006C18
+83007F16840098148500BF128600FD0E8400FF0D8400FF0D8400FF0D8400FF
+0D8400FF0D8400FF0D8400FF0D8400FF0D8400FF0D8400FF0D831800008418
+00008419000084190000841A0000851A0000851A0000851A00008618000085
+140005820E000F7C0602187A000A1E7C00171D7F00231D8200321D8200451C
+8200581B83006A1983007E17850097158600BE138600FE108400FF0E8400FF
+0E8400FF0E8400FF0E8400FF0E8400FF0E8400FF0E8400FF0E8400FF0E8400
+FF0E8419000084190000841A0000851A0000851B0000851B0000861B000086
+1B000087190000861600058410000E7E0801187A00071F7C00151F7F00221E
+8200301F8300431E8300561C8300691B84007D19850095178700BC158600FE
+118400FF0F8400FF0F8400FF0F8400FF0F8400FF0F8400FF0F8400FF0F8400
+FF0F8400FF0F8400FF0F841A0000851A0000851B0000851B0000861B000086
+1C0000861C0000871C0000881B0000881700058612000D810901177B000421
+7D0013207F001F2082002D20830040208400541E8400671D84007B1B860094
+198700BA168700F9138400FF118400FF118400FF118400FF118400FF118400
+FF118400FF118400FF118400FF118400FF11851B0000861B0000861C000086
+1C0000861C0000871D0000871D0000881D0000891C0000891900048814000C
+840D00167C0101227E01102280001D2282002A2284003D2285005220850065
+1F8500791D8600911B8600B7198100F2167B00FF157900FF167800FF177600
+FF177500FF177500FF177500FF177500FF177500FF177500FF17861C000086
+1C0000871D0000871D0000871E0000881E0000881E0000891E00008B1E0000
+8B1B00038B17000B871000148005012180020D2381001A2582002724850039
+2486004F238000612279007322740088226F00A5206C00DC1F6800FF1F6600
+FF1F6400FF206300FF206200FF216200FF216200FF216200FF216200FF2162
+00FF21871D0000871E0000881E0000881E0000891F0000891F00008A200000
+8B2000008C1F00008E1E00028E1A00098A1300138409011F82030A25820017
+27820025267A00322A7100432D6800562D6200692D5D007D2D5900982C5600
+C92A5400FD295200FC2A5100FB2A5000FA2B4F00FA2B4F00FA2B4F00FA2B4F
+00FA2B4F00FA2B4F00FA2B881E0000891F0000891F00008A2000008A200000
+8B2100008B2100008D2100008E21000090200001901C00088E160012880D00
+1D840406287500103068001D335F002936550037394E00493A49005D3B4500
+713B43008E3B4000BD373E00F5353B00F4363A00F3363800F3363700F23737
+00F2373700F2373700F2373700F2373700F2378A2000008A2000008B210000
+8B2100008C2200008D2200008D2300008F2300009023000092230001931F00
+07921A00108613001B740D01295B03033C4E01134240001D43380028453200
+3A482C004D4B2900634B270081482500AD432300E93F2200E8402000E7401F
+00E6411E00E5411E00E5411E00E5411E00E5411E00E5411E00E5418C220000
+8C2200008D2300008D2300008E2400008F2400008F25000091250000932600
+0095250001962300058820000F781C0019631600254A0F0037340806442000
+0B521B001D571300295A1000395C0D00525C0B00715A0B0197520D02DB4C0B
+03D94C0B03D84C0A04D84C0A04D74C0A04D74C0A04D74C0A04D74C0A04D74C
+0A04D74C8E2300008E2400008F250000902500009026000091270000912700
+00932800009529000091290000862A00057927000E68230017541E00223E19
+0032261100440E0600580205106001092260010C355E010D4E5C000E6A5900
+0F8D52000FD14C0010D24C0011D24B0011D24B0012D34A0012D34A0012D34A
+0012D34A0012D34A0012D34A90260000912600009227000092280000932900
+0094290000942A0000962B00008D2D0000822F0000772F0006692D000E5A2B
+00164827001E3422002C1F1B003F071201540015145900192556001B375300
+1D5051001F6B4C00208D460021DE430022DE420022DE420023DE410023DE41
+0023DE410023DE410023DE410023DE410023DE419329000094290000952A00
+00952B0000962C0000972D0000982E00008A2E00007D310000733300016834
+00065C34000D4F3400133F32001C2D2E00281927003A0621064A0023184C00
+282748002C39460030524300346D3F00368E3D0034D7390034E2380035E137
+0035E1370036E1370036E1370036E1370036E1370036E1370036E137962C00
+00972D0000982E0000992F00009A3000009B310000862F0000793100006F34
+0000653700015C3A0005513C000B463E0011393E0019283C00241535003301
+2D04410034183F003A273D00403B3A0044553800496F36004B8D330048CC2E
+0048E22D0049E22D004AE22D004AE22C004AE22C004AE22C004AE22C004AE2
+2C004AE22C9A3000009B3100009B3200009C3300009B330000843200007632
+00006B35000062380000593C000151400004494400083F49000E334C001523
+4900201041002C003E063700451733004E2933005540310059572F005D702B
+005D8D28005CBE26005EE525005EE525005FE525005FE524005FE524005FE5
+24005FE524005FE524005FE5249C3400009D3500009D3500009A3600008235
+000073350000683500005F380000563C0000504100014A460002424D000538
+53000B2B5700131D54001C0C5000260050072C0059182900632B2A00683F27
+006C56240070702200708D21006FBD200071EB1E0071EB1E0072EB1E0072EB
+1E0072EB1E0072EB1E0072EB1E0072EB1E0072EB1E9F3800009F3900009A3A
+00008138000071370000653800005C390000543B00004E4000004846000042
+4D00003A550003315D000825620010186200190A60002100630925006D1B22
+00742B2100793D1E007D551C00806F1A00818B1A0082B91A0384F9170384F9
+170384F9170384F9170384F9170384F9170384F9170384F9170384F917A13C
+00009B3D0000803B00006F3A0000633B0000593B0000523C00004C3F000046
+450000404D00003A550000335E000129660006206C000E157000160872001D
+00780B1E00801B1B00862919008B3C16008F551400926C14009485140096AD
+14019AFA13019AF913019AF913019AF913019AF913019AF913019AF913019A
+F913019AF9139D4100007F3E00006D3D0000603D0000573E00004F3F00004A
+400000454400003F4C000039550000325F00002B680000237000041B77000A
+127E001107840018018C0A1800951715009C241200A4380F00A9500E00AE67
+0D00B17F0E00B2A00D00B6EE0C00B6EE0C00B6EE0C00B6EE0C00B6EE0C00B6
+EE0C00B6EE0C00B6EE0C00B6EE0C7F4100006B4000005E400000544100004D
+42000048430000434500003E4B000038540000315F00002A69000024720000
+1E7B000118840005118E00090898001001A3041200B3100D00C51E0B00D330
+0900DC490700E3600700E8780702EF990600E8EC0600E7FE0600E7FE0600E7
+FE0600E7FE0600E7FE0600E7FE0600E7FE0600E7FE066A4300005C43000053
+4400004C45000046480000414A00003C4D000037540000305F000029690000
+237300001E7D00001987000015910000109E00000AAC000402BC010800D50A
+0700EF1B0603FC2E0101FF450100FF5D0200FF750103FF940002FFDF0100FF
+FF0200FFFF0200FFFF0200FFFF0200FFFF0200FFFF0200FFFF0200FFFF025B
+460000514800004A4A0000444C00003F4F00003A510000355400002F5B0000
+28650000236E00001D78000018800000148900000F9400000A9F000104AC01
+0400BF060500DB110300F41F0301FF320000FF4B0000FF600100FF780101FF
+8F0001FFD80000FFFF0100FFFF0100FFFF0100FFFF0100FFFF0100FFFF0100
+FFFF0100FFFF0150490000484B0000424D00003C5000003753000032560000
+2D580000285F0000226900001D720000187A0000138300000E8C00000A9500
+00049F000200AD030200C70B0100E2160100F8230000FF370000FF4F0000FF
+620000FF790000FF8C0000FFC70000FFFF0000FFFF0000FFFF0000FFFF0000
+FFFF0000FFFF0000FFFF0000FFFF00464C0000404E00003951000034550000
+2F5800002A5A0000275D0000226300001C6C000017740000127C00000E8400
+00098C00000395000101A0020100B1070000C90D0000E2170000F7220000FF
+350000FF4D0000FF5F0000FF760000FF890000FFB30000FFF60000FFFF0000
+FFFF0000FFFF0000FFFF0000FFFF0000FFFF0000FFFF003E4F000037530000
+315600002C590000275C0000245F0000216100001C660000176E0000127600
+000D7E00000A850000078D00000395000101A0020100B0060000C80D0000E1
+170000F6220000FF330000FF4B0000FF5D0000FF730000FF860000FFA40000
+FFE60000FFFF0000FFFF0000FFFF0000FFFF0000FFFF0000FFFF0000FFFF00
+355400002E580000295B0000255E0000216000001E6200001B640000176900
+0013700000107700000D7E00000A850000078C000003950001019F020100AF
+060000C70C0000DF160000F4210000FF320000FF4A0000FF5B0000FF6F0000
+FF830000FF990000FFD80000FFFF0000FFFF0000FFFF0000FFFF0000FFFF00
+00FFFF0000FFFF002C590000275D0000226000001E6200001B640000186500
+00176500001669000013700000107700000D7D00000A850000078C00000394
+0001019F020100AE060000C60C0000DE160000F3200000FF300000FF480000
+FF590000FF6C0000FF800000FF900000FFBC0000FFF20000FFFF0000FFFF00
+00FFFF0000FFFF0000FFFF0000FFFF00>
+<7B0F00007B0F00007C1000007C1000007D1000007D1100007D1100007D1100
+007B0E0000770900067404040D72000B1174001611770021117B002C117C00
+3B107C004C0F7D005C0D7D006C0B7D007D097D0090077F00AE068300EA0583
+00FF048300FF048300FF048300FF048300FF048300FF048300FF048300FF04
+8300FF048300FF047B0F00007C1000007C1000007D1100007D1100007D1100
+007E1200007E1100007C0F0000780A00067505030D72000A12740016127700
+20127B002B127C003A117C004B107D005B0E7D006C0C7D007C0A7E0090087F
+00AD068300E9058300FF048300FF048300FF048300FF048300FF048300FF04
+8300FF048300FF048300FF048300FF047C1000007C1000007D1100007D1100
+007E1200007E1200007E1200007E1200007C0F0000790B00057605020D7200
+09137400141277001F127B002A137D0039127D004A107D005B0F7E006B0D7D
+007C0B7E0090098000AD078300E7068300FF048300FF048300FF048300FF04
+8300FF048300FF048300FF048300FF048300FF048300FF047D1000007D1100
+007D1100007E1200007E1200007F1300007F1300007F1300007D1000007A0C
+00057606020D730007137500131378001E137B0029137D0038137D0049117D
+005A107E006A0E7E007C0C7F008F0A8000AC088400E5068400FF058400FF05
+8400FF058400FF058400FF058400FF058400FF058400FF058400FF058400FF
+057D1100007E1200007E1200007F1300007F1300007F130000801400008014
+00007E1100007B0D00047706010D730106147500121478001D147B0028147E
+0036147E0048137E0059117F006A0F7F007B0D7F008F0B8100AC098400E407
+8400FF058400FF058400FF058400FF058400FF058400FF058400FF058400FF
+058400FF058400FF057E1200007E1200007F1300007F130000801400008014
+000080150000801400007F1200007D0E00037907000D750105147500101578
+001C157C0027157E0035157E0046147E0058127F0068107F007A0E80008E0C
+8100AB0A8400E2088400FF068400FF068400FF078400FF078400FF078400FF
+078400FF078400FF078400FF078400FF077F1300007F130000801400008014
+000080150000811500008115000081150000801300007E1000037A09000C76
+03041476000E1679001A167C0025167F0033167F0045157F00561480006712
+8000791080008D0E8200AA0C8400E0098400FF088400FF088400FF088400FF
+088400FF088400FF088400FF088400FF088400FF088400FF08801400008014
+00008115000081150000811600008216000082160000821600008214000080
+1100037C0B000C7804041376000C18790018177C0023187F0031187F004317
+80005415800066138000771281008C0F8300AA0D8400DE0B8400FF098400FF
+098400FF098400FF098400FF098400FF098400FF098400FF098400FF098400
+FF098115000081150000811600008216000082170000821700008317000083
+17000082150000811200027E0D000B7A06031377000919790016197C002219
+7F002F198000401880005217810064158100761382008B118300A90F8500DD
+0D8400FF0A8400FF0A8400FF0A8400FF0A8400FF0A8400FF0A8400FF0A8400
+FF0A8400FF0A8400FF0A821600008216000082170000831700008318000083
+18000083180000841800008317000083140002800F000A7C0802137700061B
+7900141A7C001F1A80002C1B81003D1A81005019810063178100751582008A
+138400A8118500DC0E8400FF0C8400FF0C8400FF0C8400FF0C8400FF0C8400
+FF0C8400FF0C8400FF0C8400FF0C8400FF0C82170000831700008318000083
+180000841900008419000084190000851A0000851800008416000182110009
+7F0A01127800031D7A00111C7D001D1C80002A1C81003A1C82004E1B820061
+1982007317820088167E00A4157B00D2137600FF127400FF127200FF137100
+FF137000FF146F00FF146F00FF146F00FF146F00FF146F00FF148318000084
+1900008419000084190000851A0000851A0000851B0000851B0000861A0000
+8618000185130008820C00127B03021C7B000E1E7D001B1E8000271E820037
+1E81004A1E79005C1D72006C1E6D007F1D6900981B6600C01B6300FE1B6100
+FE1C5F00FE1C5E00FE1D5D00FD1D5D00FD1D5D00FD1D5D00FD1D5D00FD1D5D
+00FD1D84190000851A0000851A0000851B0000851B0000861C0000861C0000
+861C0000871B0000881A000087160007840F00117E05011C7B000A217E0018
+207A00232273002F2569003F27620051265C0063285800762754008C265200
+B2255000F6244F00F4244D00F3254C00F3254B00F2264B00F2264B00F2264B
+00F2264B00F2264B00F226851B0000861B0000861C0000861C0000861D0000
+871D0000871D0000871E0000891D00008A1C00008A1800068812000F820A01
+1A7A0205236C00102A61001C2D590027304F00343049004432440057344000
+6B353E0083343C00A7313A00EC2E3700EB2F3600EA2F3400EA303300E93033
+00E9303300E9303300E9303300E9303300E930861C0000871D0000871D0000
+871E0000881E0000881E0000891F0000891F00008B1F00008C1E00008D1B00
+058B16000D7C1100186A0B0025540404334901113A3B001B3C3300263D2E00
+35402800474225005C442300764222009A3E2100DC391F00E0391E00DF3A1D
+00DE3A1C00DD3B1B00DD3B1B00DD3B1B00DD3B1B00DD3B1B00DD3B871E0000
+881E0000891F0000891F00008A2000008A2000008B2100008B2100008D2100
+008E2100008B1F00047E1D000D6F1900165B140022430D00313007063D1E00
+0B4A19001C4F120027530D0035550B004C56090067540A01884C0B02C4450A
+03D1440A03D0440904CF440904CE440804CE440804CE440804CE440804CE44
+0804CE44892000008A2000008B2100008B2100008C2200008C2200008D2300
+008D2300008F230000872400007C2400047022000D601F00154E1B001F3816
+002C230F003E0C0500510204105901092158010C3257010D4954000E635100
+0F814C000FB445000FCB430010CB430011CC420011CC420011CC420011CC42
+0011CC420011CC420011CC428C2200008C2200008D2300008E2300008E2400
+008F2500008F2500009026000084270000792900006E2900056127000D5326
+00144223001C2F1F00281D1900380712024D001414520018244F001A354A00
+1C4B47001E6544002081400020B73C0020D63A0021D6390021D6390022D639
+0022D6390022D6390022D6390022D6390022D6398E2400008F250000902500
+009026000091270000922700008E28000081280000752B00006B2D0000602E
+0005552E000B482E0011392D001A292A002417240034051F06430022184400
+272641002A373E002D4D3B00316739003383360033B3330032DA310032DA30
+0033DA300033DA300034DA300034DA300034DA300034DA300034DA30912700
+009228000093290000942A0000942A00008E2B00007E2B0000722C0000672F
+00005E320000553400044B3600094037000F3338001724360021122F002E01
+2A053A0031173800372636003C393300404F310044682F0047842D0045AD29
+0044DA280045DA270045DA270046D9270046D9270046D9270046D9270046D9
+270046D927952B0000962C0000972D0000982E00008D2D00007B2D00006F2F
+0000653000005B330000533700004B3A0003433D00073942000C2E4500131F
+42001D0D3B0027003A072F0041162D0049282C00503E2B0054522800586926
+005985230057A8210058DB200059DB200059DB20005ADB20005ADB20005ADB
+20005ADB20005ADB20005ADB20992F00009A3000009B3100008C3000007930
+00006C3100006132000059330000513700004A3B0000444000013C46000433
+4C0009274F0011194C00190A480022004A082600531824005C2B2500623E23
+00665220006A691E006A841C0069A71B006BE01B006BE01A006BE01A006BE1
+1A006CE11A006CE11A006CE11A006CE11A006CE11A9C3300009D3400008C34
+000077340000693400005E350000553600004F370000483B0000424100003C
+470000354F00022C560007215A000F155900170859021E005D0A2000671B1E
+006E2B1D00733D1A00765118007A6817007B8116007BA516007CEC15007CEC
+15007DEC15007DEC15007DEC15007DEC15007DEC15007DEC15007DEC159F38
+00008C38000076370000673700005B380000533900004C390000473B000041
+4000003B470000355000002D580001255F00061C64000E116700150468001A
+00700D1A00791D18007F291600833A1300865010008A6610008C7D10008C9E
+10008EE610008FEE0F008FED0F008FED0F008FED0F008FED0F008FED0F008F
+ED0F008FED0F8C3B0000743A0000653A0000593B0000503C00004A3D000044
+3E0000404000003A470000345000002D590000276200001F6900041770000A
+0D7400100479021500820D14008A1A110091260E0097370C009B4D0A009F62
+0900A1780900A1950900A4CF0800A5E20800A5E20800A5E20800A5E10800A5
+E10800A5E10800A5E10800A5E108733D0000633D0000573E00004E3F000048
+400000424200003D45000039470000335000002C5A000026630000206C0000
+1A740003137C00070B83000C038B02100095090E00A2150900AE210600B632
+0500BD480300C35D0200C8730200CB8E0300C9C20300CAEF0300CBEF0200CB
+F00200CBF00200CBF00200CBF00200CBF00200CBF00261400000554100004C
+42000046440000404700003B4A0000364D0000325000002C5A000025640000
+206E00001B77000016800000118900010B930003049E000700AE040600C70D
+0400E21A0300FA280101FF410000FF570000FF6F0101FF890001FFC80000FF
+FF0000FFFF0000FFFF0000FFFF0000FFFF0000FFFF0000FFFF0000FFFF0053
+4400004B460000444900003E4C000039500000345400002F5700002B5A0000
+256400001F6D00001A750000157E0000108600000C8F00000699000103A502
+0100B9070200D3110100ED1D0000FF2B0000FF450000FF590000FF6F0000FF
+860000FFB60000FFFF0000FFFF0000FFFF0000FFFF0000FFFF0000FFFF0000
+FFFF0000FFFF004A4B0000424D00003C50000036530000315700002C590000
+285C0000245E00001F6700001970000014780000108000000B880000069000
+000199000200A6040000BB090000D3120000EC1C0000FF290000FF430000FF
+570000FF6D0000FF830000FFA70000FFF70000FFFF0000FFFF0000FFFF0000
+FFFF0000FFFF0000FFFF0000FFFF00404E00003A510000335500002D580000
+295B0000255E0000216000001F620000196A0000147200000F7900000C8100
+0009880000059000000198000200A5030000BA090000D2110000EB1C0000FF
+280000FF410000FF550000FF6A0000FF800000FF9B0000FFE70000FFFF0000
+FFFF0000FFFF0000FFFF0000FFFF0000FFFF0000FFFF003753000031560000
+2B5A0000265D0000226000001F6200001C63000019650000156C0000127200
+000F7900000C80000009880000058F00000198000200A5030000B8090000D1
+110000EA1B0000FF260000FF3F0000FF530000FF670000FF7E0000FF910000
+FFDA0000FFFF0000FFFF0000FFFF0000FFFF0000FFFF0000FFFF0000FFFF00
+2E580000285C0000235F00001F6100001C6300001965000017650000176500
+00156B0000127200000F7900000C80000009880000068F00000198000200A4
+030000B7080000D0100000E81A0000FD260000FF3C0000FF510000FF640000
+FF7B0000FF8C0000FFBC0000FFF80000FFFF0000FFFF0000FFFF0000FFFF00
+00FFFF0000FFFF00265D0000216000001D6300001965000017650000176500
+001765000017650000156B0000127200000F7900000C80000009870000068F
+00000297000200A3030100B6080000CE100000E71A0000FC250000FF3A0000
+FF500000FF620000FF770000FF880000FFA80000FFE50000FFFF0000FFFF00
+00FFFF0000FFFF0000FFFF0000FFFF00>
+<740A0000750A0000750B0000760B0000770B0000770C0000780C0000780C00
+00770B0000720600046F0204096E000D0B7000170B7300210B76002C0B7800
+3A0A790049087A0058077A006705790077037A0087017B009E017E00CC0181
+00FF018100FF018100FF018100FF018100FF018100FF018100FF018100FF01
+8100FF018100FF01750A0000760B0000760B0000770C0000780C0000780C00
+00790D0000790D0000770B0000730700046F02030A6F000C0C7000160C7300
+200C77002B0C7800390B790048097A0057087A0066067A0076047A0087027B
+009E027E00CB018100FF018100FF018100FF018100FF018100FF018100FF01
+8100FF018100FF018100FF018100FF01760B0000770B0000770C0000780C00
+00780D0000790D00007A0D00007A0E0000780C0000740800047002030A6F00
+0B0D7000150D73001F0D77002A0D7900380C7A00470A7A0057097B0066077A
+0076057B0087037C009D027E00CA028100FF018100FF018100FF018100FF01
+8100FF018100FF018100FF018100FF018100FF018100FF01770C0000780C00
+00780D0000790D00007A0D00007A0E00007A0E00007B0E0000790D00007609
+00037103020A6F00090E7100140E73001E0E7700280E7900360D7A00460B7B
+00560A7B0065087B0075067B0087047C009D037F00C9038100FF028200FF02
+8200FF028200FF028200FF028200FF028200FF028200FF028200FF028200FF
+02780C0000790D0000790D00007A0E00007B0E00007B0F00007B0F00007C0F
+00007A0E0000770A00027204010A7000080E7100130F74001D0F7700270F7A
+00350E7B00450D7B00550B7C0065097B0075077C0086057D009D047F00C703
+8200FF028200FF028200FF028200FF028200FF028200FF028200FF028200FF
+028200FF028200FF02790D00007A0E00007B0E00007B0F00007B0F00007C0F
+00007C1000007C1000007B0F0000790B00027405000A7101070F7200111074
+001C10780026107B0033107B00440E7B00540C7C00640B7C0074097C008506
+7D009C058000C6048200FF038200FF038200FF038200FF038200FF038200FF
+038200FF038200FF038200FF038200FF037B0E00007B0F00007B0F00007C10
+00007C1000007D1000007D1100007D1100007D1000007A0D00017506000A73
+02060F72000F1175001A11780025117B0031117C00420F7C00530E7D00630C
+7D00730A7D0085087E009C068000C5058300FF048300FF048300FF048300FF
+048300FF048300FF048300FF048300FF048300FF048300FF047B0F00007C10
+00007C1000007D1100007D1100007D1100007E1200007E1200007E1100007B
+0E0001770800097403050F73000D1275001912790023127C0030127C004011
+7D00510F7D00610E7D00720C7E0084097F009B088100C3068300FF048300FF
+048300FF048300FF048300FF048300FF048300FF048300FF048300FF048300
+FF047C1000007D1100007D1100007E1200007E1200007E1300007F1300007F
+1300007F1200007D0F0001790A00087604040F73000B147600171379002113
+7D002E147D003E137D004F117E00600F7E00710D7E00830B7F009A098200C2
+078400FE058400FF058400FF058400FF058400FF058400FF058400FF058400
+FF058400FF058400FF057D1100007E1200007E1200007F1300007F13000080
+1400008014000080140000801300007E1100017B0C00077705020F74000915
+76001515790020157D002C157E003C147E004D137F005F117F006F0F7F0082
+0D8000990B8200C0098400FD068300FF068100FF078000FF087F00FF087E00
+FF097E00FF097E00FF097E00FF097E00FF097F1300007F1300008014000080
+1400008015000081150000811500008116000081150000801200017D0E0006
+7907010F75000616770012177A001D177D0029177F0039167F004B157F005D
+1380006E127B007F11770094107400B60F7200F30E6F00FE0F6D00FE106C00
+FE106B00FE116A00FE116A00FE116A00FE116A00FE116A00FE118014000080
+15000081150000811600008216000082160000821700008317000083160000
+82140001801000057C09000F7803051677000F197A001B187D002619800036
+187A004619720056196C0066196700771964008C186000AB175E00E8175C00
+F8185A00F6185900F6195800F5195800F5195800F5195800F5195800F51958
+00F51981160000821600008217000082170000831700008318000083180000
+841800008418000084160000821300047F0C000D7B06041578000B1B7B0018
+1A7300221E6B002D2162003C225B004C2157005D2353006F23500083224D00
+A0204C00D71F4B00EB204900EA204800E9214700E9214600E8214600E82146
+00E8214600E8214600E8218317000083170000831800008318000084190000
+84190000841A0000851A0000851A00008518000085150003820F000C7E0802
+157001051F64000F245A001B275200252A4A00312A4400402A3F00512D3C00
+642E3900792D3700962B3600C9293400E2293200E1293000E0292F00E02A2E
+00E02A2E00E02A2E00E02A2E00E02A2E00E02A841800008419000084190000
+851A0000851A0000851B0000851B0000861B0000861B0000871A0000871800
+038213000B730F0015610900214D02042D4200113337001B342F0025362A00
+32392500433B2200553D21006C3C20008A381E00B9341D00D8321B00D7331A
+00D6341A00D5341900D4341900D4351900D4351900D4351900D435851A0000
+851B0000851B0000861C0000861C0000861C0000871D0000871D0000881D00
+00891C0000811B00037519000A661600135411001E3E0B002B2B0606361C00
+0C4117001B471000254B0B00324E0900455007005F4E08027C470903A44009
+03C83D0804C73D0804C63D0704C63D0705C53D0705C53D0705C53D0705C53D
+0705C53D861C0000861C0000871D0000871D0000881E0000881E0000881F00
+00891F00008A1F00007F20000074200002681E000A591C00124819001B3414
+0027200E01370B04004A01040F5100092051010C2F4F000D444C000E5C4900
+0F7745000F9C3F000FC43B0010C43B0011C43A0011C53A0012C53A0012C53A
+0012C53A0012C53A0012C53A871E0000881E0000891F0000891F00008A2000
+008A2000008B210000872100007D23000072240000672500025A23000A4C22
+00113C2000192B1C00241A170033051002450014154A001723460019324100
+1B473E001D5F3D001F7839001F9C36001FCF33001FCF320020CF320020CF32
+0021CF310021CF310021CF310021CF310021CF318A2000008B2100008B2100
+008C2200008D2200008D23000085240000792500006F270000642800005A29
+00034E2900094229000F33280018252500211420002F041D073D0020173D00
+24253900273436002A4933002F623200317A3000329C2D0030D32A0030D32A
+0031D22A0031D2290032D2290032D2290032D2290032D2290032D2298D2300
+008D2300008E2400008F2500009025000084260000762700006B290000612A
+0000582D00004F2F0002443000073931000E2D3200142130001D102B002901
+280634002E17310034252F0038362C003C4B2A0041622800437B2700429B24
+0041D2230041D1220042D1220042D1220043D1210043D1210043D1210043D1
+210043D1219026000091260000922700009228000083280000732A0000682B
+00005E2C0000552E00004D310000453400013D380005343B000A283D00111B
+3B001A0B35002400360829003D162700442626004A3B25004F4D2300546321
+00557D1F00529A1D0052D31C0053D31C0053D31C0054D31C0054D31B0054D3
+1B0054D31B0054D31B0054D31B942A0000952B0000962C0000812B0000712D
+0000652E00005B2F0000523000004B320000443600003E3B0000374000032D
+4500072347000E164500170641012000450921004E171F00572A21005C3C1E
+00604E1B0065631900657C18006499170064D0170064D7160065D7160065D7
+160065D7160065D7160065D7160065D7160065D716992F00009A3000007F2E
+00006F30000062310000573200004F33000049340000433600003D3B000037
+42000030490001274F00051D52000D115100150450021B00570C1B00611B1A
+00672A1A006C3A1700704D140073621200757912007595120075CA110075DE
+110075DE110075DE110076DD100076DD100076DD100076DD100076DD109C34
+00007F3200006D3300005F340000543500004C36000046370000413900003C
+3C000036430000304A00002952000021580005185D000D0D5E0013025F0218
+00690F1600721D1400782912007C380F007F4C0C0082610B0084760B008490
+0B0085BF0B0086DE0B0086DE0B0086DD0B0086DD0A0086DD0A0086DD0A0086
+DD0A0086DD0A7F3600006B3600005D370000523800004A390000443B00003F
+3D00003A3F0000354300002F4B000029540000235C00001C6300051368000A
+096B001001700512007A111000821C0D0088270A008C370700904A0500945D
+040096710400968B040096B4040098D7040098D7040098D7040099D7040099
+D7040099D7040099D7040099D704693900005A3A0000503B0000483D000042
+3F00003C41000038440000334700002E4C000028550000225E00001D660000
+166D00040F7400080679000C0080050D008B0F0900961905009E240300A533
+0200AB470100B05B0100B66F0100B6880100B4AE0100B7E10100B7E20100B7
+E20100B7E20000B7E20000B7E20000B7E20000B7E200593E00004E3F000046
+410000404300003A460000354A0000314D00002C50000028560000225F0000
+1C68000017700000117800020B8000040588000700910306009F0A0200B212
+0100C51D0000D42B0000DF3F0000EA540000F4690000F7820000FBA60000E9
+FF0000E9FF0000E9FF0000EAFF0000EAFF0000EAFF0000EAFF0000EAFF004D
+430000454500003E490000384D0000335000002D54000029580000265B0000
+226000001C6A000017730000127B00000D830000088B000004930001019E02
+0100AD060000C60C0000E0160000F6220000FF360000FF4E0000FF630000FF
+7D0000FF990000FFF40000FFFF0000FFFF0000FFFF0000FFFF0000FFFF0000
+FFFF0000FFFF00444A00003D4F000036530000305700002A5A0000265D0000
+235F00001F6100001C650000166D0000117500000E7C00000B830000078B00
+0004930001019D010100AC050000C50B0000DE160000F5210000FF340000FF
+4D0000FF610000FF7A0000FF900000FFE40000FFFF0000FFFF0000FFFF0000
+FFFF0000FFFF0000FFFF0000FFFF003A510000335500002D590000285C0000
+235F0000206100001C6300001964000016670000136E0000117500000E7C00
+000B830000088B000004930001019D010100AC050000C40B0000DD150000F3
+200000FF320000FF4B0000FF5E0000FF760000FF8C0000FFD10000FFFF0000
+FFFF0000FFFF0000FFFF0000FFFF0000FFFF0000FFFF00315600002A5A0000
+255E0000216100001D63000019640000176500001765000017670000146E00
+00117500000E7C00000B830000088A000004930001019C010100AB050000C3
+0B0000DB150000F2200000FF300000FF490000FF5C0000FF730000FF880000
+FFB60000FFFF0000FFFF0000FFFF0000FFFF0000FFFF0000FFFF0000FFFF00
+285C0000235F00001E6200001A640000176500001765000017650000176500
+0017670000146E0000117500000E7C00000B830000088A000004920001019C
+010100AA050000C10A0000D9140000F01F0000FF2E0000FF480000FF5A0000
+FF6F0000FF840000FFA40000FFED0000FFFF0000FFFF0000FFFF0000FFFF00
+00FFFF0000FFFF00206100001C630000186500001765000017650000176500
+00176500001765000017670000146E0000117500000E7B00000B830000088A
+000004920001019B010200A9040000C00A0000D8140000EF1E0000FF2C0000
+FF450000FF580000FF6C0000FF810000FF970000FFDC0000FFFF0000FFFF00
+00FFFF0000FFFF0000FFFF0000FFFF00>
+<6D0500006E0500006E0500006F060000700600007007000071070000710700
+00710800006C0400026901050569000E076A0017076D00210670002B067300
+38047400460476005303760062027600720176008200770095007800B6007C
+00F9007D00FC007D00FC007D00FC007D00FC007D00FC007D00FC007D00FC00
+7D00FC007D00FC006E0500006F0600006F0600007007000070070000710700
+007108000072080000720800006D0500026A0104066A000D086B0017086D00
+200771002A0773003705750045047600530477006203760071027600810077
+0094007900B4007D00F8007D00FC007D00FC007D00FC007D00FC007D00FC00
+7D00FC007D00FC007D00FC007D00FC006F0600007006000070070000710700
+0071080000720800007208000073090000730900006F0500026B0103066A00
+0C086B0016086E001F08710029087400360675004405770052047700610377
+00700277008100780093007900B3007D00F6007E00FD007E00FD007E00FD00
+7E00FD007E00FD007E00FD007E00FD007E00FD007E00FD0070070000710700
+007108000072080000730900007309000074090000740A0000740A00007006
+00016C0202076B000A096C0015096E001E0972002809750035077600430677
+005105780060047700700277008000780092007A00B1007E00F4007F00FD00
+7F00FD007F00FD007F00FE007F00FE007F00FE007F00FE007F00FE007F00FE
+007108000072080000730900007309000074090000740A0000750A0000750A
+0000760B0000720700016D0201076C00090A6D00130A6F001D0A7300270975
+00330977004207780051067900600578006F0278007F01790091007B00B000
+7F00F2007F00FE007F00FE007F00FE007F00FE007F00FE007F00FE007F00FE
+007F00FE007F00FE00730800007309000074090000740A0000750A0000760B
+0000760B0000770B0000770C0000740900006E0300076D00080A6E00120B70
+001C0A7300260A7600320A780041087900500779005F0579006E0379007E01
+790090007B00AE008000F0008000FF008000FF008000FF008000FF008000FF
+008000FF008000FF008000FF008000FF0074090000750A0000750A0000760B
+0000760B0000770C0000780C0000780C0000780D0000760A0000700400076E
+01070B6F00110C71001B0B7400250B7700300B78003F0979004F087A005E06
+7A006D0479007D027A008F017C00AD018000EE018100FF018100FF018100FF
+018100FF018100FF018100FF018100FF018100FF018100FF01750B0000760B
+0000770C0000770C0000780C0000790D0000790D00007A0D00007A0E000077
+0B0000720500067002060B6F000F0D7100190D7400230D78002F0D79003E0B
+7A004D0A7B005C087A006C067A007C047B008F037D00AC028100EE028100FF
+018100FF018100FF018100FF018100FF018100FF018100FF018100FF018100
+FF01770C0000780C0000780D0000790D00007A0E00007A0E00007B0E00007B
+0F00007B0F0000790C0000740700057103040B70000C0E7200170E7500210E
+79002D0F7A003B0D7B004B0C7B005B0A7B006B087B007C067C008E047D00AB
+038100EB038200FF028200FF028200FF028200FF028200FF028200FF028200
+FF028200FF028200FF02790D00007A0D00007A0E00007B0E00007B0F00007B
+0F00007C1000007C1000007C1000007A0E0000770900057304030B71000A10
+7200151075001F1079002A107B00390F7B00490D7C005A0C7C006A0A7C007B
+087D008E067E00AA057F00E3047D00FD047B00FC057900FB057800FB067700
+FB067700FB067700FB067700FB067700FB067B0E00007B0F00007B0F00007C
+1000007C1000007D1100007D1100007D1100007E1200007C0F0000790B0004
+7505010C720007117300131176001D117A0028127C0036117C0047107C0058
+0E7900670E7400770D7000890C6D00A30C6B00D20B6900F80B6700F70C6600
+F60D6400F50D6400F40D6300F40E6300F40E6300F40E6300F40E7C1000007C
+1000007D1100007D1100007E1200007E1200007E1200007F1300007F130000
+7E1100007C0E00027707000C740206127400101377001B137A0026137B0033
+14730041166B00501566006016610070165E0083145B009C135900C6135700
+EE145500ED155400EC155300EC155300EB165200EB165200EB165200EB1652
+00EB167D1100007E1200007E1200007F1300007F1300007F14000080140000
+8014000080150000801300007E0F00027A09000A7603041275000D15740018
+166B00211A64002B1C5B00391C5500471D5100571E4E00691F4B007B1E4800
+931C4700BA1B4700E21B4500E11C4400E01C4300DF1D4200DF1D4100DE1D41
+00DE1D4100DE1D4100DE1D7F1300007F130000801400008014000081150000
+8115000081160000821600008216000081150000801200027D0C0009790602
+126801051B5D000F1F530019224C00232444002E243F003B253B004C273800
+5E2934007128320089263100AF243000D7232E00D6232C00D5242B00D5242A
+00D5242A00D4242A00D4242A00D4242A00D424801500008115000081160000
+82160000821700008317000083170000831800008318000083170000821400
+017A1100086B0D00115907001D480305263B000E2B3200182E2C0022302700
+2F3222003E351F004F371D0064361D007E331C00A22F1B00CF2C1900CE2D18
+00CD2E1700CC2E1600CB2E1600CB2F1600CB2F1600CB2F1600CB2F82160000
+82170000831700008318000083180000841900008419000084190000851A00
+00851900007A1900016E1700075F1300104E10001B390A00262705052F1900
+0B3A16001A400F0024440A002F460700404805005748070272410803923A08
+03C0360704BF360704BE360605BD360605BD360605BD360605BD360605BD36
+0605BD36831800008419000084190000841A0000851A0000851B0000851B00
+00861B0000821C0000781D00006D1D0001611B00065219000F431700192F12
+00231D0C01310904004201040F4900081F49010B2D46000D4143000E574000
+0F6F3D000F8C39000FBC340010BC330011BC330011BD330011BD320012BD32
+0012BD320012BD320012BD32851A0000851B0000861B0000861C0000861C00
+00871D0000871D0000801E0000762000006C2000006121000154200007471F
+000E371D0017271A00201815002D0510033E001315420017223E0019303900
+1A4336001C5934001E7032001F8C30001EC52C001FC52B001FC52B0020C52B
+0020C52B0020C52A0020C52A0020C52A0020C52A861C0000871D0000871D00
+00881E0000881F0000891F00007E20000073220000692300005E2400005425
+0001492500063C25000D2E2400152222001E121E002A031B0736001F173600
+2323310025312E0028452C002C5C2B002F7329002F8D27002EC325002EC924
+002FC924002FC8240030C8230030C8230030C8230030C8230030C823891F00
+00891F00008A2000008A2100008B2100007C2300006F240000652500005B26
+000052280000492A00013F2B0006342C000C292D00121D2B001A0E27002400
+25072D002B162B003023280034332600384724003D5D22003F7321003F8E20
+003DBB1E003DC91D003DC91D003EC91D003EC91D003EC91C003EC91C003EC9
+1C003EC91C8C2200008C2200008D2300008A240000792500006C2700006128
+0000572900004F290000472C0000402F0001373200042E3500082437000F18
+35001709310020003208240039162100402421004537200049491D004F5E1B
+0050741A004E8E19004DB518004ECA17004ECA17004ECA17004ECA17004FCA
+17004FCA17004FCA17004FCA178F250000902600008A26000077280000692A
+00005D2B0000542C00004C2D0000452E00003F31000039360000313B000129
+3F00061F40000C133E0015043B011E00410B1D0049171A0051291C0056391A
+005A4A1800605D1500617414005F8C13005DB212005ECE12005ECE12005FCE
+12005FCE11005FCE11005FCE11005FCE11005FCE11932900008C2A0000762B
+0000672D00005A2E0000502F000049300000433100003E3300003837000031
+3D00002B430001234800031A4B000B0D490013044A041800520D17005B1B15
+006129150065391300694910006D5C0E006F710D006F890D006FAE0D006ED1
+0C006ED10C006FD10C006FD10C006FD10C006FD10C006FD10C006FD10C8C2D
+0000742E000064300000573100004D32000046330000403500003B37000037
+390000313E00002B450000254C00001E5200041455000C0956001100580415
+00631112006B1E100071290E0075370B00784808007B5B06007E6E06007E85
+06007EA707007ED006007ED006007ED006007ED006007ED006007ED006007E
+D006007ED0067332000062330000553400004B360000443700003E39000039
+3B0000343E0000304000002B470000254F00001F560000185C00040F60000A
+0562000E0169080F0073150C007B1F08008029050084370400884802008C5A
+02008F6D01008E8401008DA501008FD001008FD001008FD001008FD001008F
+D001008FD001008FD001008FD001603700005338000049390000423B00003C
+3D000036400000324300002D4600002A490000245000001F59000019600000
+126600040A6B00080471030900790A0900831405008C1D0200932700009834
+00009C450000A0570000A5690000A5800000A2A00000A5D60000A5D80000A5
+D80000A5D80000A5D80000A5D80000A5D80000A5D800513B0000483D000040
+3F00003A420000344600002F4A00002B4D000027510000235400001F5A0000
+19630000136A00010D71000306770005017E01070086070400910D01009E14
+0000AA1D0000B4290000BB3B0000C34F0000CC630000D07A0000D1970000CB
+D40000CCEC0000CCED0000CCED0000CDED0000CDED0000CDED0000CDED0046
+4100003F44000038480000324D00002C5100002855000024580000205B0000
+1D5E000019640000136D00000F7400000C7B000109830001058B0002019400
+0300A1030100B5090000CF110000EA1B0000FF280000FF430000FF580000FF
+710000FF8A0000FFDC0000FFFF0000FFFF0000FFFF0000FFFF0000FFFF0000
+FFFF0000FFFF003D4A0000364F00002F5400002A590000255D000021600000
+1E6200001A64000018650000156A0000127100000F7800000D7F00000A8600
+00068E00000296000200A2030100B5080000CF100000E81A0000FF260000FF
+400000FF560000FF6D0000FF860000FFC00000FFFF0000FFFF0000FFFF0000
+FFFF0000FFFF0000FFFF0000FFFF00345500002D590000275D000022600000
+1E6200001B640000176500001765000017650000156A0000127100000F7800
+000D7F00000A860000068E00000296000200A2030100B4070000CD0F0000E7
+1A0000FD250000FF3E0000FF540000FF6A0000FF820000FFAB0000FFFF0000
+FFFF0000FFFF0000FFFF0000FFFF0000FFFF0000FFFF002A5A0000245E0000
+206100001B6300001865000017650000176500001765000017650000156A00
+0012700000107700000D7E00000A860000068D00000296000100A1020100B3
+070000CC0F0000E6190000FB250000FF3B0000FF520000FF670000FF7F0000
+FF9C0000FFF10000FFFF0000FFFF0000FFFF0000FFFF0000FFFF0000FFFF00
+226000001D6200001965000017650000176500001765000017650000176500
+00176500001669000013700000107700000D7E00000A860000078D00000395
+000101A1020100B2070000CB0E0000E5180000F9240000FF390000FF500000
+FF640000FF7C0000FF910000FFDE0000FFFF0000FFFF0000FFFF0000FFFF00
+00FFFF0000FFFF001B64000017650000176500001765000017650000176500
+001765000017650000176500001669000013700000107700000D7E00000A85
+0000078D00000395000101A0020100B1070000C90D0000E3180000F8230000
+FF360000FF4E0000FF610000FF780000FF8B0000FFC10000FFFF0000FFFF00
+00FFFF0000FFFF0000FFFF0000FFFF00>
+<62020000630200006402000065030000650300006603000067030000680300
+0068040000660200016300050363000E0364001703660020036A002A026D00
+36006F00420071004F0072005E0072006D0072007D0072008E007300A60076
+00DB007800F6007800F6007800F6007800F6007800F6007800F6007800F600
+7800F6007800F6006302000064020000650300006603000067030000680300
+0068040000690400006A040000680300016400040364000D03650016046700
+20036B0029026D0035007000420072004F0073005D0073006C0072007C0073
+008D007400A5007700DA007900F8007900F8007900F8007900F8007900F800
+7900F8007900F8007900F8007900F800650300006603000067030000680300
+0068040000690400006A0400006B0400006B04000069030001650004036500
+0C046600160468001F036B0028026E0034017000410072004E0073005C0073
+006B0073007B0074008C007400A4007700D8007900F9007900F9007A00F900
+7A00F9007A00F9007A00F9007A00F9007A00F9007A00F90067030000680300
+0069040000690400006A0400006B0400006C0500006C0500006D0500006B04
+00016600030466000B046700150569001E046C0027036F0033027100400173
+004D0174005C0174006B0174007B0074008C007500A3007800D6007A00F900
+7A00F9007A00F9007A00F9007A00F9007A00F9007A00F9007A00F9007A00F9
+0068040000690400006A0400006B0400006C0500006D0500006E0500006E05
+00006F0600006D0500016700010467000A05680013066A001D056D00260470
+00310372003F0274004C0275005B0175006A0174007A0075008B007600A200
+7900D5007B00FA007B00FA007B00FA007B00FA007B00FA007B00FA007B00FA
+007B00FA007B00FA006A0400006B0500006C0500006D0500006E0500006F06
+00006F06000070060000700700006F0600006901000568000906680012076A
+001C066D0025057100300573003E0374004C0376005A027500690175007900
+76008A007700A1007A00D2007C00FB007C00FB007C00FB007C00FB007C00FB
+007C00FB007C00FB007C00FB007C00FB006D0500006E0500006F0600006F06
+00007006000070070000710700007108000072080000710700006B0200046A
+010806690011086B001A076E00240772002F0674003D0575004B0476005903
+7600680276007801760089007800A0007A00D0007D00FC007D00FC007D00FC
+007D00FC007D00FC007D00FC007D00FC007D00FC007D00FC006F0600006F06
+00007007000071070000710800007208000072080000730900007309000073
+0800006D0400046B0106076B000F096C0019086F00220873002D0875003B06
+760049057700580477006703770077017700880078009E007B00CE007E00FD
+007E00FD007E00FD007E00FD007E00FD007E00FD007E00FD007E00FD007E00
+FD00700700007107000072080000720800007309000074090000740A000075
+0A0000750A0000740A00006F0500036C0205076C000D0A6D00170970002109
+74002C0976003907770048067800570578006603780075027800860079009D
+007C00CB007F00FE007F00FE007F00FE007F00FE007F00FE007F00FE007F00
+FE007F00FE007F00FE00720800007309000074090000740A0000750A000075
+0B0000760B0000760B0000770C0000760B0000720700026E0203086D000B0B
+6E00150B71001F0A75002A0B77003709780046087900550679006404790074
+0279008500770099017500BF017600F6027400F4027200F3027000F2036F00
+F1036F00F1036E00F0036E00F0036E00F003740A0000750A0000760B000076
+0B0000770C0000770C0000780C0000790D0000790D0000780C000075090002
+700301096E00090C6F00130C72001D0C7600280C7800350B7900440A780053
+097200610A6E006F096A008009670095086400B7086300EC076000EB085F00
+EA095E00E9095D00E90A5C00E90A5C00E90A5C00E90A5C00E90A760B000077
+0C0000780C0000780D0000790D00007A0D00007A0E00007B0E00007B0F0000
+7B0E0000780B0001720500087002070C7000110E73001B0E7600250E730030
+116B003E1264004B125F005A125C006A1359007B12560090105300B0105200
+E4105000E3114F00E3114E00E2124D00E2124D00E1124D00E1124D00E1124D
+00E112790D0000790D00007A0E00007B0E00007B0F00007B0F00007C100000
+7C1000007C1000007C1000007A0D0000750700077303050D71000E106B0017
+13630020165B002919540035194E0042194C00521B4A00631C4600741B4300
+88194200A7184200D9174000D7183E00D6183D00D6183C00D5193B00D5193B
+00D4193B00D4193B00D4197B0E00007B0F00007C0F00007C1000007D100000
+7D1100007D1100007E1200007E1200007E1200007C0F0000780A0006710503
+0D6000051756000E1B4C00181D460021203F002B203A003721360047223300
+582430006A242D0080222D009C202C00CE1E2A00CD1F2900CD1F2800CC1F27
+00CC202700CC202600CC202600CC202600CC207C1000007D1100007D110000
+7E1200007E1200007F1300007F1300007F14000080140000801400007E1100
+00720F0005630B000E530600194302052136000E252E001828280021292500
+2D2C20003B2E1D004B301A005D311A00742E1A00912B1900C3271700C52816
+00C4281500C3291500C3291400C2291400C2291400C2291400C2297E120000
+7F1300007F1300008014000080140000811500008115000081160000821600
+007E16000073150000671400035811000D490E0017340900222404052A1800
+0B33130018390E00223D09002D3F06003C41040051410502693C0603843607
+03B0300604B7300604B7300505B6300505B6300405B6300405B5300405B530
+0405B530801400008115000081160000821600008217000082170000831700
+00831800007B180000731A0000671900005B1900034D17000C3E1500162B11
+00201B0B012C0803003B01040F4100091E41000B2B3E000D3D3B000D523800
+0F673600108133000FA92E0010B62D0011B72C0011B72C0012B72B0012B72B
+0012B72B0012B72B0012B72B82170000831700008318000083180000841900
+008419000084190000791B00006F1C0000661D00005A1D00004F1D0004411C
+000C331B00152418001E16130028040E03380013153B0016213600182E3100
+193F2E001B532D001D692C001E812A001EA727001EBC26001EBC25001FBC25
+001FBC250020BC240020BC240020BC240020BC248419000084190000851A00
+00851A0000851B0000821B0000771D00006C1E0000621F0000592000004E21
+0000432100043621000B2A2000131F1F001B101B002602190831001D162F00
+21222900232F270026412600295524002D6B24002D8222002DA520002CBF1F
+002DBF1F002DBF1F002DBF1E002EBF1E002EBF1E002EBF1E002EBF1E851B00
+00861C0000861C0000871D0000821E000075200000692100005E2200005422
+00004D23000043250000392700042F28000A252900101B2700170D24002100
+23082700281524002D2122003130200034431E0039571D003C6C1C003B831B
+003AA219003AC019003AC018003AC018003BC018003BC018003BC018003BC0
+18003BC018871E0000881E0000891F00008120000072220000652300005924
+00005025000049260000422700003A2A0000322E00022A3100062132000C15
+300015072C001D002F091F0036161D003B231C003F331A00434518004A5817
+004C6C16004A84140047A0130047C1130048C1120048C1120048C1120049C1
+120049C1120049C1120049C1128B2100008B210000802300006F2500006126
+0000562700004D280000452900003F2B00003A2C0000333100002C36000025
+3900041C3A000A103900130236011B003D0C1900451816004B2617004F3515
+00544613005A5811005C6C0F005A820E00589E0E0058C40D0058C40D0058C4
+0D0058C40D0059C40C0059C40C0059C40C0059C40C8F2400007F2500006D28
+00005E290000532A0000492B0000422D00003C2E000037300000333300002D
+380000273E000020420002164400090A42001201440515004D0F1300551B11
+005A2811005F360F0062460C0067570900696A08006A8008006A9A0A0068C5
+080068C5070068C5070068C5070068C4070069C4070069C4070069C4077F29
+00006B2B00005C2C0000502E0000472F0000403100003A3300003535000031
+3700002D3A000027400000214700001A4C0002114E0009064E010F00530611
+005D130D00651E0B00692809006D350600704504007557030078690200787E
+02007897020077C3020077C4010078C4010078C3010078C3010078C3010078
+C3010078C301692E0000593000004D320000443300003D3500003837000032
+3A00002E3C00002A3F000027420000214900001B500000145600040B580009
+0159010D00630B0B006D18080074200400792901007C360000804500008355
+000086670000867B00008495000084BF000084CA000085CA000085CA000085
+CA000085CA000085CA000085CA00573400004B350000433700003C39000036
+3C0000303F00002C4300002846000024480000214C00001B530000165A0000
+0E5F0004066300070168040800700D070079160400801D0100862500008A30
+00008E4000009251000095630000977700009592000095BC000095D2000096
+D2000096D2000096D2000096D2000096D2000096D2004A390000413B00003A
+3E0000344200002E460000294A0000254D0000215000001E5300001B550000
+165D0000106300010C690003076D000502730107007B070600840E03008E15
+0000971D00009E280000A4370000A9490000AE5D0000B3710000B38B0000B0
+B50000B2DF0000B3DF0000B3DF0000B3DF0000B3DF0000B3DF0000B3DF0040
+40000038440000324800002C4D000027510000225500001F5800001B5B0000
+185D0000175E000014650000116C00000D7200010979000205800004018801
+0500910503009E0A0000B0110000C31B0000D3270000E03B0000EA520000F5
+670000F8820000FBAD0000EBFF0000EBFF0000EBFF0000ECFF0000ECFF0000
+ECFF0000ECFF00374A0000304F00002955000024590000205D00001C600000
+18620000176400001765000017660000146C0000117300000E7A00000B8100
+000889000005910001019B010200A8040000C00A0000D9140000F2200000FF
+310000FF4C0000FF610000FF7C0000FF9D0000FFFF0000FFFF0000FFFF0000
+FFFF0000FFFF0000FFFF0000FFFF002D580000275D0000226000001D630000
+196500001765000017650000176500001765000017650000146C0000117300
+000E7A00000C8100000889000005910001019A000200A7040000BE0A0000D8
+140000F01F0000FF2F0000FF4A0000FF5E0000FF790000FF910000FFEF0000
+FFFF0000FFFF0000FFFF0000FFFF0000FFFF0000FFFF00245E00001F620000
+1A640000176500001765000017650000176500001765000017650000176500
+00146C0000117300000F7A00000C8100000888000005900000019A000200A7
+040000BD090000D6130000EF1E0000FF2D0000FF480000FF5C0000FF740000
+FF8C0000FFDD0000FFFF0000FFFF0000FFFF0000FFFF0000FFFF0000FFFF00
+1D630000186500001765000017650000176500001765000017650000176500
+001765000017650000146C0000117300000F7A00000C810000098800000590
+00000199000200A6040000BB090000D4120000ED1D0000FF2B0000FF460000
+FF590000FF700000FF870000FFBE0000FFFF0000FFFF0000FFFF0000FFFF00
+00FFFF0000FFFF001765000017650000176500001765000017650000176500
+0017650000176500001765000017650000156C0000127300000F7900000C81
+000009880000059000000199000200A5030000BA090000D3120000EB1C0000
+FF290000FF430000FF570000FF6C0000FF830000FFA60000FFF70000FFFF00
+00FFFF0000FFFF0000FFFF0000FFFF00>
+<590002005A0002005A0002005B0001005B0001005C0001005C0001005D0001
+005E0001005E0101005D0005005D000E015D0016015F001F01620028006500
+320068003F006A004B006D0059006E0067006D0077006D0087006E009B006F
+00BF007200E9007200E9007200E9007200E9007200E9007200E9007200E900
+7200E9007200E9005A0002005B0002005B0001005C0001005C0001005D0001
+005E0001005E0101005F010100600101005E0005015E000D015E0016016000
+1E01630027016600320068003E006B004B006E0058006E0067006E0076006E
+0086006E009A007000BE007300EB007300EB007300EB007300EB007300EB00
+7300EB007300EB007300EB007300EB005B0001005C0001005D0001005D0001
+005E0101005F010100600101006001010061010000610200005F0004015F00
+0C015F00150261001E01640026016700310069003D006C004A006F0057006F
+0066006F0076006F0086006F0099007100BE007400ED007400ED007400ED00
+7400ED007400ED007400ED007400ED007400ED007400ED005D0001005D0001
+005E0101005F01010060010100610101006102000062020000630200006302
+00006000030260000B026000140262001D0265002601680030016B003C006D
+0049006F005700700065006F0075006F008500700099007200BD007500EF00
+7500EF007500EF007500EF007500F0007500F0007500F0007500F0007500F0
+005E0101005F01010060010100610100006202000063020000630200006402
+000065030000650300006100020261000A026200130363001C026600250269
+002F016C003C006E0048007000560071006500700074007000850071009800
+7300BC007600F2007600F2007600F2007600F2007600F2007600F2007600F2
+007600F2007600F20060010100610200006202000063020000640200006503
+00006503000066030000670300006703000063000002630009036300120364
+001B03670024026A002E016D003B006F004800710055007200640071007400
+71008400720097007400BA007700F5007700F5007700F5007700F5007700F5
+007700F5007700F5007700F5007700F5006302000063020000640200006503
+000066030000670300006803000068040000690400006A0400006501000264
+0008036400110466001A03680023026C002D016E003A007000470072005400
+730063007200730072008300730096007500B9007900F8007900F8007900F8
+007900F8007900F8007900F8007900F8007900F8007900F800650300006603
+0000670300006803000069040000690400006A0400006B0400006C0500006C
+050000680200026600060466000F04670019046A0022036D002C0270003801
+7100450173005301740062017300720073008200740095007600B7007A00F9
+007A00F9007A00F9007A00F9007A00F9007A00F9007A00F9007A00F9007A00
+F90068030000690400006A0400006A0400006B0400006C0500006D0500006E
+0500006E0500006F0600006A0300026700050467000E05680017056A002005
+6E002A04710037027200440274005202750061017400700174008100750094
+007700B5007B00FA007B00FA007A00F8007900F7007800F7007700F6007600
+F5007600F5007600F5006A0400006B0400006C0500006D0500006E0500006F
+0600006F0600007006000070070000710700006D0500016901030568000C07
+690015076C001F066F0028067200350474004204750051037600600275006F
+0172007E016F008F016D00AB016D00E9016B00EA016900E9016700E7016600
+E5016500E5016500E4016500E4016500E4016D0500006E0500006F06000070
+06000070070000710700007108000072080000720800007309000070060001
+6B0101066A0009086B0013086D001D0870002707730032067500410570004D
+076C005B07670069076400780660008A065E00A4055C00D8045A00DF055800
+DE065700DD065600DD075600DD075500DD075500DD075500DD077007000071
+0700007108000072080000730800007309000074090000740A0000750A0000
+750A0000730800006D0300066C0107096C00110A6E001B097000240A6B002E
+0E630039105C00460F5900540F560064105300740F5000860E4E009F0D4C00
+CF0C4B00DA0D4A00D90D4900D80E4800D80E4800D70E4700D70E4700D70E47
+00D70E720800007309000074090000740A0000750A0000750B0000760B0000
+770B0000770C0000780C0000760A0000710500056E0105096D000E0B620016
+0F5A001E12540026154D00311648003D1646004C1745005D1942006D183E00
+80163C0098143C00C2133B00CF143900CE143800CD143700CC153600CC1536
+00CC153600CB153600CB15750A0000750B0000760B0000770C0000770C0000
+780C0000790D0000790D00007A0E00007A0E0000780C000074070004680402
+0B5A0005144F000E174600161940001E1C3A00271D3500321D3100411E2F00
+53202C0064202A00771E29008F1C2800B51B2700C51A2600C51B2500C51B24
+00C41B2400C41C2300C41C2300C41C2300C41C770C0000780C0000790D0000
+7A0D00007A0E00007B0E00007B0F00007B0F00007C0F00007C100000780F00
+006B0D00025D0A000B4D0500163E02051D31000C212900152325001F252200
+2A281E0037291A00472B1800582B17006C2A170085271700A9241600BE2314
+00BD241300BC241300BB251200BB251200BA251200BA251200BA257A0E0000
+7B0E00007B0F00007C1000007C1000007D1000007D1100007D1100007E1200
+00771300006D130000601200015210000A430D00143008001E210405251600
+0A2D120017320D00213608002B380400383A03014B3B0402623605037A3106
+049B2B0604B22A0505B12A0405B02A0405B02A0405B02A0306AF2A0306AF2A
+0306AF2A7C1000007D1100007D1100007E1200007E1200007F1300007F1300
+007F140000741500006B16000061160000551600024715000A391300132810
+001D190A01270703003500040F3A00081D39000B2936000D3A33000D4D3000
+0F612F0010772C001095290010B0270010B0260011B1260011B1260012B125
+0012B1250012B1250012B1257E1200007F1300007F14000080140000801500
+00811500007D16000072170000681800005F190000541A0000491A00023C19
+00092E1800122216001B14120024040E0431001215330015202F00172B2A00
+193B28001A4F26001C6326001D7824001E9422001DB420001EB420001EB41F
+001EB41F001FB41F001FB41F001FB31F001FB31F8115000081160000821600
+0082170000831700007B1800006F1A0000651B00005A1C0000511C0000491D
+00003E1E0002321E0009271E00111D1C00180E1900220218082A001C152800
+1F202300222C2200243D200027501F002A641E002B791D002B931B002AB61A
+002AB61A002BB61A002BB619002BB619002CB619002CB619002CB619831800
+00831800008419000084190000791A00006D1C0000601D0000561E00004D1F
+0000462000003E210000352300022B2400072225000D182400150B21001D00
+2108220025151F002A201D002E2E1B00313F1A003552180038651800387917
+003692150036B8140036B8140037B8140037B8130037B8130037B8130037B8
+130037B813851A0000851B0000861B0000781D00006A1F00005D2000005221
+000049210000422300003C240000352600002E290001262D00041E2E000A13
+2C00120629011A002C0A1B0032151900382218003B3016003F411300455312
+0047661100467A100044910E0043B90E0043B90D0043B90D0044B90D0044B8
+0D0044B80D0044B80D0044B80D871D0000871E000077200000682200005A22
+00004E230000462400003E26000039280000342900002F2D00002831000022
+350002193600080D3400100132021700390D15004118120046241200493210
+004D420E0053530C0057660B0056790900548F090052B6080052BA080052BA
+070053BA070053B9070053B9070053B9070053B90787200000752200006524
+0000562500004B260000422800003B2A0000362C0000312E00002D30000029
+340000233900001C3D0001133E0007073C0010013F06120048100F00501C0D
+0054260B00573209005A4106005F5304006365030064780300648D030062AF
+020062B9020062B9020062B9010063B8010063B8010063B8010063B8017226
+00006227000053290000482A0000402C0000392E0000333000002F3300002B
+35000027380000233C00001D410000174500010E4600070447020D004D090D
+00581409005F1F06006328040065330100684100006C520000706300007176
+0000708A00006FAB01006EBD00006EBD00006FBD00006FBD00006FBD00006F
+BD00006FBD005F2B0000512C0000462E00003E30000037330000313600002C
+380000283B0000253E0000214000001D440000184A0000114E0002084F0008
+0153030A005C0C0800641706006A1E04006E26020071310100743E0000784E
+00007C6000007D7200007B8800007BA900007AC400007AC400007BC400007B
+C400007BC400007BC400007BC4004E310000443200003C350000353800002F
+3B00002A3E000026410000224400001F4700001C490000184E000012530000
+0D570003075A0006015D010900650A08006D140600751C04007A2302007E2D
+0000813A0000854A0000895C00008B6E00008986000088A7000089CC000089
+CC000089CC000089CC000089CC000089CC000089CC00423600003A39000033
+3D00002D41000028450000234900001F4C00001C4F00001951000016530000
+15560000125B00000E6000020965000403680007006F060800780E06008016
+0300881D01008E26000093330000974400009A5600009F6900009F8100009D
+A400009FD600009FD600009FD600009FD600009FD600009FD600009FD60039
+3F0000324300002B480000264C0000215000001D5400001956000017590000
+17590000175A0000165D0000136300000F6900010B6F000306750005027C01
+0700840605008E0C02009A130000A71C0000B1270000B9380000C14D0000C9
+610000CE790000CE9A0000CAE80000CAEB0000CBEB0000CBEC0000CBEC0000
+CBEC0000CBEC00304A000029500000235400001F5800001A5C0000175F0000
+175F000017600000176100001762000016650000136C0000107300000D7B00
+000A830000078B00000394000101A0020100B1070000CA0E0000E6190000FC
+250000FF3F0000FF560000FF6F0000FF8B0000FFE70000FFFF0000FFFF0000
+FFFF0000FFFF0000FFFF0000FFFF0027580000215D00001C61000018640000
+17650000176500001765000017650000176500001765000016680000136F00
+00107600000D7D00000A840000078C000003940001019F020100B0060000C9
+0D0000E4180000FA240000FF3C0000FF540000FF6C0000FF860000FFD20000
+FFFF0000FFFF0000FFFF0000FFFF0000FFFF0000FFFF001F6200001A640000
+17650000176500001765000017650000176500001765000017650000176500
+0016680000136E0000107500000D7C00000A840000078B000003940001019E
+020100AE060000C80D0000E2170000F8230000FF390000FF520000FF680000
+FF820000FFB30000FFFF0000FFFF0000FFFF0000FFFF0000FFFF0000FFFF00
+17650000176500001765000017650000176500001765000017650000176500
+00176500001765000016680000136E0000107500000E7C00000B840000078B
+000004930001019E020100AD060000C60C0000E0170000F6220000FF360000
+FF4F0000FF640000FF7E0000FF9F0000FFFF0000FFFF0000FFFF0000FFFF00
+00FFFF0000FFFF001765000017650000176500001765000017650000176500
+001765000017650000176500001765000016670000136E0000117500000E7C
+00000B830000088B000004930001019D010100AC050000C50B0000DE160000
+F4210000FF330000FF4D0000FF610000FF7B0000FF910000FFE60000FFFF00
+00FFFF0000FFFF0000FFFF0000FFFF00>
+<53000600530006005300060054000500540005005500050055000500560004
+0056000400560004005700050056000C005600140058001C005A0025005D00
+2F0060003A0063004700660054006800620069007100680080006800910069
+00AB006B00DA006B00DA006B00DA006B00DA006B00DA006B00DA006B00DA00
+6B00DA006B00DA005400050054000500540005005500050055000400560004
+00560004005700040057000400580003005800040057000C00570014005900
+1C005B0024005E002E0061003A006400460067005400690062006900700069
+008000690091006900AA006C00DD006C00DD006C00DD006C00DD006C00DD00
+6C00DD006C00DD006C00DD006C00DD00550005005500050056000400560004
+00570004005700040058000300580003005800030059000300590003005900
+0B00590013005A001C005C0024005F002E006200390065004600680053006A
+0061006A0070006A007F006A0090006B00AA006D00DE006E00E0006E00E000
+6E00E0006E00E0006E00E0006E00E0006E00E0006E00E00056000400560004
+005700040057000300580003005800030059000300590002005A0002005A00
+02005A0003005A000A005A0013005B001B005D00240060002D006300390066
+004500690052006B0060006B006F006B007F006B0090006C00A9006E00DE00
+6F00E3006F00E3006F00E3006F00E3006F00E3006F00E3006F00E3006F00E3
+0057000300580003005800030059000300590002005A0002005A0002005B00
+02005B0001005B0001005C0002005C000A005B0012005C001A005F00230061
+002C0064003800670045006A0052006C0060006C006E006C007E006C008F00
+6D00A9006F00DD007000E5007000E5007000E6007000E6007000E6007000E6
+007000E6007000E60059000300590003005A0002005A0002005B0002005B00
+01005C0001005C0001005D0001005D0001005D0001005D0009005D0011015E
+001A016000220163002B0066003700680044006B0051006D005F006D006E00
+6D007E006D008F006E00A7007000DC007100E8007100E8007100E8007100E8
+007200E8007200E8007200E8007200E8005A0002005A0002005B0001005C00
+01005C0001005D0001005E0001005E0101005F01010060010100600101005E
+0007015E0010015F0018016100210164002A0167003600690043006C005000
+6E005E006E006D006E007D006E008E006F00A7007100DC007300EB007300EB
+007300EB007300EB007300EB007300EB007300EB007300EB005C0001005C00
+01005D0001005E0001005F0101005F01010060010100610100006102000062
+020000620200006000060160000E0260001702620020016600290168003500
+6B0042006D004F006F005D006F006C006F007C0070008D007000A6007300DB
+007400EE007400EE007400EF007400EF007500EF007500EF007500EF007500
+EF005E0101005F010100600101006001010061020000620200006302000064
+0200006402000065030000650300006100040261000D026200160364001F02
+670028016A0034006C0040006F004E0070005C0071006B0070007B0071008C
+007100A5007400D9007200ED007000EC006F00EA006E00E9006D00E9006C00
+E8006C00E8006C00E800610200006102000062020000630200006402000065
+03000066030000670300006703000068030000680300006300030363000B03
+6400150366001E03690027026C0032016E003F0070004C0072005A006F0068
+006B0077006800870065009D006400C6006200DE006000DC005E00DA005D00
+D9005D00D9005C00D8005C00D8005C00D80064020000650300006603000066
+0300006703000068040000690400006A0400006A0400006B0400006B040000
+6500010365000A046600130467001D036A0026026E0031016D003D01680048
+0464005505600062055E0071045A008204570096035500B8025300D2025200
+D2035100D2035000D1034F00D1044F00D1044F00D1044F00D1046803000068
+030000690400006A0400006B0400006C0500006C0500006D0500006E050000
+6F0500006F06000068010003670008056700110569001B056600230760002B
+0B5A00350D5400410D51004E0D50005E0D4E006E0D4B007E0C4800920A4700
+B4094600CF094400CE0A4300CE0A4300CD0A4200CD0A4100CC0B4100CC0B41
+00CC0B6B0400006B0500006D0500006E0500006E0500006F06000070060000
+700700007107000071070000710800006B0300026901060664000D095A0015
+0D52001C0F4C00231247002D1342003814400046153F0058163D0067163900
+781437008D123700AB103600C6103400C5103300C5103200C4113100C41131
+00C3113000C3113000C3116F0600006F060000700600007007000071070000
+7208000072080000730900007309000074090000740A00006E060002610402
+075300051149000D14410014163A001C183500251A31002E1A2C003C1B2A00
+4C1C28005D1C26006F1B250084192500A2182500BF172300BE172200BE1822
+00BE182100BE182100BE182000BD182000BD18720800007208000072080000
+7309000074090000740A0000750A0000760B0000760B0000770B0000710D00
+00640B000056090007470400133902051A2D000C1D2600151F22001D201F00
+28231C00342518004326160054261500652614007A24150098211400B71F13
+00B6201200B6201100B5201100B5211000B4211000B4211000B421740A0000
+750A0000750B0000760B0000770C0000770C0000780C0000790D0000780D00
+006F0F0000661000005A1000004D0E00073E0C00122C07001C1E0305221400
+0A281000152C0B00203007012932030035340101463502025B310304712C05
+058D270504AD250405AC250405AC250305AB250306AB250206AB250206AB25
+0206AB25780C0000780C0000790D0000790D00007A0E00007B0E00007B0F00
+00761000006C110000621300005A1400004F1400004213000734120011250E
+001A160901230602002F00040E3300091D31000C282F000E362C000E482900
+0F5B280010702700118A240010AC220010AC210011AC210011AC200012AC20
+0012AC200012AC200012AC207B0F00007B0F00007B0F00007C1000007C1000
+007D11000074120000691400005F150000561600004E170000441700003717
+00072B1600101F14001812100021020D042C0011142C00141F280016292400
+18382200194921001B5C20001C701F001C871D001CAC1B001CAC1B001DAC1A
+001DAC1A001EAC1A001EAC1A001EAC1A001EAC1A7D1100007D1100007E1200
+007E1200007F13000072150000671600005C170000521800004A190000431A
+0000391B00002E1B0006241B000E1A1A00150C17001F01160826001A152200
+1D1F1F00202A1D00223A1B00244B1A00275D1A00287019002887170027AB16
+0028AE150028AE150028AE150029AE140029AE140029AE140029AE14801400
+008014000080150000801500007217000065190000581A00004E1B0000461C
+00003F1D0000391E000030200000282100041F22000B16210012091E001A00
+1F091D0023141B00271E19002B2B17002E3B1500324D1400355F1300367112
+003486100033A80F0033B00F0033B00F0033B00E0034B00E0034B00E0034B0
+0E0034B00E82170000821700007F180000701A0000611B0000541C00004A1D
+0000421E00003B20000035210000302300002A260000232900011B2A000711
+2800100425011700290A16002F15140034201300372D11003A3C0E003E4E0D
+0042600C0043720B00418609003EA408003EB108003FB008003FB008003FB0
+07003FB0070040B0070040B007831A00007F1A00006E1C00005E1E0000511F
+0000472000003E21000037230000322500002E2700002A290000252D00001E
+300000163100060B2F000E012E031400360D11003D180E0041230D00442E0B
+00473D09004B4E07005060050051720400508403004E9F02004DB102004DB0
+02004DB002004EB001004EB001004EB001004EB001711F00006C1F00005C21
+00004E220000442300003B250000342700002F2900002B2C0000282E000025
+3000001F34000019380000113900050537000E003A070E0043110B004A1B08
+004E250500512F0400523C0100574D00005B5F00005D7100005C8300005A9B
+010059B3010059B3010059B3010059B3010059B3010059B3010059B3015D23
+0000592400004B2500004127000039290000322C00002D2E00002931000025
+340000223600001F3800001A3C0000143F00000B4000060140020B00480B08
+0050140600561C0400592403005B2E02005C3A0100604A0000655C0000676E
+000067810000669A010064B8000064B8000064B8000064B8000064B8000064
+B8000064B8004C280000492900003F2B0000372E0000303100002B34000027
+370000233900001F3C00001C3E0000193F0000144400000E47000108480005
+024A02090050090900581207005F1B050064230400662C0200683800006B47
+000070590000736B0000737E00007298010070BE000070BE000070BE000071
+BE000071BE000071BE000071BE003F2F00003D2F0000353200002F36000029
+3A0000243D0000204000001D420000194500001647000015480000134C0000
+0F4F00010952000403530108005906090061100700691A06006F2103007329
+010076350000794400007D55000080670000807C00007E9700007EC600007E
+C600007EC600007EC600007EC600007EC600007EC60036370000343800002D
+3C000027400000224300001E4700001A4A0000174D0000164E0000164E0000
+164F000014530000105800010B5C0003055F000701630309006B0C07007416
+06007B1C02008124010085300000893F00008C50000090620000917700008F
+9400008FC5000090D0000090D0000090D0000090D0000090D0000090D0002D
+4100002B42000025470000204B00001C4F0000185200001653000017540000
+175500001756000017560000145B0000116100010D660002086B0005037001
+070078050700800E04008A140100931C00009A270000A0350000A5480000AA
+5C0000AF710000AE8D0000ADBF0000AFDC0000AFDD0000AFDD0000AFDD0000
+AFDD0000AFDD00254E0000234F00001E5300001957000017590000175B0000
+175B0000175C0000175D0000175E0000175E000015640000126A00000E7100
+010B780002077F000302860005008F0303009C080100AE0F0000C1180000D6
+240000E3370000ED4F0000F8650000FA820000FCBA0000EFFF0000F0FF0000
+F0FF0000F0FF0000F1FF0000F1FF001D5B00001C5C0000175F000017610000
+17620000176300001764000017650000176500001765000017650000156A00
+00127100000F7800000C7F000009870000068F00000298000200A5030000BA
+090000D4120000EE1D0000FF2D0000FF490000FF5F0000FF7C0000FFA50000
+FFFF0000FFFF0000FFFF0000FFFF0000FFFF0000FFFF001765000017650000
+17650000176500001765000017650000176500001765000017650000176500
+0017650000156A0000127100000F7800000C7F000009870000068E00000297
+000200A4030000B8080000D2110000EC1C0000FF2B0000FF470000FF5C0000
+FF780000FF950000FFFF0000FFFF0000FFFF0000FFFF0000FFFF0000FFFF00
+17650000176500001765000017650000176500001765000017650000176500
+00176500001765000017650000156A0000127100000F7800000C7F00000986
+0000068E00000297000200A3030100B7080000D0110000EA1C0000FF280000
+FF440000FF5A0000FF730000FF8D0000FFE70000FFFF0000FFFF0000FFFF00
+00FFFF0000FFFF001765000017650000176500001765000017650000176500
+001765000017650000176500001765000017650000156A0000127100000F78
+00000D7F00000A860000068E00000296000200A2030100B5080000CF100000
+E91B0000FF260000FF410000FF570000FF6E0000FF870000FFCC0000FFFF00
+00FFFF0000FFFF0000FFFF0000FFFF00>
+<4C0009004C0009004D0009004D0008004E0008004E0008004E0008004F0008
+004F000800500008005000070050000B005000130050001A00530022005500
+2B00580036005A0042005F004F0062005D0064006B0063007A0062008A0062
+009E006300BE006300CA006300CA006300CA006300CA006300CA006300CA00
+6300CA006300CA004D0008004D0008004E0008004E0008004F0008004F0008
+00500008005000070050000700510007005100070051000B00510012005100
+1A005300210056002A00590035005C00410060004E0063005C0065006B0064
+007A006300890063009D006400BE006500CC006500CC006500CC006500CC00
+6500CD006500CD006500CD006500CD004F0008004F0008004F0008004F0008
+00500007005000070051000700510007005200070052000600520006005200
+0A0052001200520019005400210057002A005A0035005D00410061004E0064
+005C0065006A00650079006400890064009D006500BF006600CF006600CF00
+6600CF006600CF006600CF006600CF006600CF006600CF0050000700500007
+00500007005100070051000700520007005200060052000600530006005300
+06005400060054000900530011005400190056002000590029005B0034005E
+00400062004D0065005B0066006900660079006500880065009D006600BF00
+6700D2006700D2006800D2006800D2006800D3006800D3006800D3006800D3
+00510007005100070051000700520006005200060053000600530006005400
+0500540005005500050055000500550008005500100055001800570020005A
+0029005D0033005F00400063004D0066005A00670069006700780067008800
+67009C006800BF006900D6006900D6006900D6006900D6006900D6006900D6
+006900D6006900D60053000600530006005300060053000600540005005400
+050055000500550005005600040056000400560004005700080056000F0057
+00170058001F005B0028005E00330061003F0064004C006700590068006800
+680078006800870068009B006900BE006B00DA006B00DA006B00DA006B00DA
+006B00DA006B00DA006B00DA006B00DA005400050054000500540005005500
+05005600040056000400560004005700040057000300580003005800030058
+00070058000F00580017005A001F005D0028005F00320062003E0065004B00
+690059006A006700690077006900870069009B006A00BE006D00DE006D00DE
+006D00DE006D00DE006D00DE006D00DE006D00DE006D00DE00560004005600
+04005600040057000400570003005800030058000300590003005900020059
+0002005A0002005A0006005A000E005A0016005B001E005E00270061003100
+64003E0067004A006A0058006B0066006B0076006A0086006B009A006C00BE
+006F00E2006F00E2006F00E2006F00E3006F00E3006F00E3006F00E3006F00
+E30058000300580003005800030059000300590002005A0002005A0002005B
+0002005B0001005B0001005C0001005C0004005C000D005C0015005D001D00
+600026006300300066003D00680049006B0057006C0065006C0075006C0085
+006A0098006900BA006700DD006500DC006400DC006300DB006200DB006100
+DA006000D9006000D9005A0002005A0002005A0002005B0002005B0001005C
+0001005C0001005D0001005D0001005E0001005E0101005E0003015E000B01
+5E0014015F001C016100250164002F0067003B006A0048006B005500680062
+006400700060007F005D0092005B00AF005900D3005700D2005600D1005500
+D1005500D0005400CF005400CF005300CF005C0001005C0001005C0001005D
+0001005E0001005E0101005F01010060010100610101006101000062020000
+60000101600009025F00120261001B026300240166002D01630038025E0043
+045B004F0459005D0456006B0353007B0350008C024E00A6014D00CB014B00
+CA024A00CA024900C9024900C9024800C9024800C8024800C8025F0101005F
+0101005F010100600101006101000062020000630200006302000064020000
+6503000065030000630100016200070262001003620019035C002005570027
+085100300B4C003B0C4900480B4900580C4800670B4500770A420089084100
+A2074000C6063F00C6063E00C5063D00C5073C00C4073C00C4073B00C4073B
+00C30762020000620200006302000064020000650300006503000066030000
+6703000068030000680400006904000067020001640005035B000C06520013
+0A4B00190C4500200E400028103C0033113900401139005113370061123400
+70113200830F31009B0D3200BF0C3000BE0C2F00BE0D2E00BD0D2D00BD0D2D
+00BD0D2C00BD0D2C00BD0D6603000066030000670300006803000069040000
+690400006A0400006B0400006C0500006D0500006D05000066040001590302
+044D00050E43000C113B00131335001A15300022172C002B17280036172600
+4719240057192300681822007B16210093152200B9132100B9142000B8141F
+00B8141F00B8151E00B8151E00B7151E00B7156A0400006A0400006B040000
+6C0500006D0500006E0500006F0600006F0600007006000070070000670900
+005D09000050080004420400103402041628000A1A2200131B1F001C1D1C00
+25201900302116003F2213004F2212005F221100722111008A1E1200B01B11
+00B01C1000B01C0F00AF1D0F00AE1D0E00AE1D0E00AE1D0E00AE1D6F060000
+6F0600006F06000070060000700700007107000072080000720800006E0A00
+00640B00005C0D0000530E0000470D0004390B000F290700181C03041E1200
+0A240E0014270A011E2A0601272C0201322D0101422E0103552B02046A2803
+0582230404A3200305A7200305A7200206A6200206A6200206A6200106A620
+0106A6207208000072080000720800007309000074090000740A0000750A00
+006C0C0000620E0000590F000051110000491100003D1100043010000E220D
+00171408001F0502002900040E2C00091C2A000C2628000E3425000E442300
+0F56220010682100117F1F00109E1D0010A61C0011A61C0011A61C0012A61B
+0012A61B0012A61B0012A61B750A0000750A0000760B0000770B0000770C00
+00770C00006B0F000060100000561200004E130000471400003E1500003315
+00032715000D1C120015100F001D020C04260010132500131E220016281F00
+17351D0019451C001A561B001B691B001C7E19001B9917001BA616001CA616
+001CA615001DA515001DA515001DA515001DA515790D0000790D00007A0D00
+007A0E0000770F0000691100005D130000531400004A150000421600003B17
+0000341800002A1900032119000B181800130B15001B001508210019141D00
+1C1D1A001E28180021371700234716002558150026691400267D1300269711
+0026A7100026A7100026A7100026A7100027A70F0027A70F0027A70F7C1000
+007C1000007C10000076120000681400005B1500004F170000461800003E19
+0000371A0000311B00002B1D0000241F00021D200008141F000F071C001700
+1E09190021131600251D1400282913002B3811002E480F0031580E0032690D
+00327D0C0030950B002FA80A0030A80A0030A8090030A8090030A8090030A8
+090031A8097F1300007F1300007514000066160000581800004C190000431A
+00003A1C0000331D00002E1F00002A2000002622000020250000192700050F
+25000D0223011400260A12002C151000301F0F00342B0C0036390A003A4908
+003D5A07003E6B06003E7C05003B9303003AA903003BA802003BA802003BA8
+02003BA802003BA802003CA8016E1800006E18000065190000551A0000491C
+00003F1D0000371F0000302000002B2200002824000025260000212900001B
+2C0000142D0003092B000B002B031000320E0C0039180A003C2208003F2C05
+00423903004549020048590100496A0100497C00004691000044AB000044AB
+000044AB000044AB000044AB000045AB000045AB005B1D00005B1D0000521D
+0000461E00003C200000342200002E2500002927000026290000222C00001F
+2E00001C300000163300000E3400030433010A0037080A003F120600431A05
+0046220400472A0300493702004C4602005058010052690000527B0000508F
+00004EAF00004EAF00004EAF00004EAF00004EAF00004EAF00004EAF004A21
+00004A2100004322000039240000322600002C290000272C0000232F000020
+3100001D3300001A35000016370000103A0000093A00030139000A003E0709
+00451007004B1905004F210400502903005234020054430100595500005D67
+00005D7900005C8D010059B3010059B3010059B3010059B3010059B301005A
+B301005AB3013C2700003C27000037280000302B00002A2F00002532000021
+3500001D3700001A390000173B0000143C0000133D0000104000000B410002
+034000090045050A004D0E070054170600591F04005B2803005D3202005F40
+0000645100006864000069760000688C010066B1000065B8000066B9000066
+B9000066B9000066B9000066B900322F0000322F00002E3100002834000023
+3800001F3B00001B3D0000173F000015410000154200001543000014440000
+114700000C4A0002054A0007014E040900550B08005D150600641E04006826
+03006A3001006C3D0000714E000075600000767300007589000074AE010073
+C0000074C0000074C0000074C0000074C0000074C0002A3800002A38000027
+3A0000213E00001D4100001844000015470000154800001548000015490000
+164A0000154B0000125000000E5300020856000501580109005F0909006813
+07006F1C050075230200792C00007C3900007F4A0000845B0000856F000084
+87000083AC000083C9000083C9000083C9000083C9000084C9000084C90022
+430000224300001F4500001A490000164D0000164E0000164F0000164F0000
+16500000165100001651000016530000135800000F5D00010A620004046500
+07016C050800740D07007C160400841D01008A2500008E3200009243000096
+5500009B6900009A82000098A900009AD400009AD400009AD400009AD40000
+9AD400009AD4001B4F00001B4F000018510000165400001755000017560000
+17570000175700001758000017590000175A0000175B000014620000106700
+010C6E000208740004037A000600810406008B0B030097110000A4190000AF
+250000B7350000BF4A0000C8600000CD790000CC9F0000C9EA0000CAEB0000
+CAEB0000CAEB0000CBEB0000CBEC00175B0000175B0000175B0000175C0000
+175D0000175E0000175F000017600000176100001762000017630000176400
+00146B0000117300000E7A00000B820000088A000004920001019C010100AC
+050000C60B0000E1170000F8230000FF3B0000FF540000FF6F0000FF8D0000
+FFFB0000FFFF0000FFFF0000FFFF0000FFFF0000FFFF001763000017630000
+17640000176500001765000017650000176500001765000017650000176500
+001765000017660000146D0000117400000E7B00000B820000088A00000492
+0001019C010100AB050000C40B0000DE160000F6220000FF380000FF520000
+FF6B0000FF870000FFE30000FFFF0000FFFF0000FFFF0000FFFF0000FFFF00
+17650000176500001765000017650000176500001765000017650000176500
+0017650000176500001765000017660000146C0000117300000E7A00000B82
+00000889000004910001019B010200A9050000C20B0000DC150000F4210000
+FF350000FF4F0000FF670000FF820000FFC20000FFFF0000FFFF0000FFFF00
+00FFFF0000FFFF001765000017650000176500001765000017650000176500
+00176500001765000017650000176500001765000017660000146C00001173
+00000E7A00000B8100000889000005910001019B010200A8040000C00A0000
+DA140000F2200000FF320000FF4D0000FF630000FF7E0000FFA60000FFFF00
+00FFFF0000FFFF0000FFFF0000FFFF00>
+<46000B0046000B0046000B0046000B0047000B0047000B0048000A0048000A
+0049000A0049000A0049000A0049000A0049001000490017004B001E004E00
+26005000300053003C00570049005B0057005D0066005E0075005D0083005C
+0094005C00AC005D00BF005D00BF005D00BF005D00BF005D00BF005D00BF00
+5D00BF005D00BF0047000B0047000B0047000B0048000B0048000A0048000A
+0049000A0049000A004A000A004A000A004A000A004B0009004A0010004A00
+16004C001E004F0026005100300054003C00580049005C0057005E0065005F
+0074005E0083005D0094005D00AC005E00C1005E00C1005E00C1005E00C100
+5E00C1005E00C1005E00C1005E00C10048000A0048000A0048000A0049000A
+0049000A004A000A004A000A004A0009004B0009004B0009004C0009004C00
+09004B000F004C0016004D001D005000250053002F0055003B00590048005D
+0056005F006400600073005F0082005E0093005E00AC005F00C2005F00C200
+5F00C2005F00C2005F00C2005F00C3005F00C3005F00C3004A000A004A000A
+004A000A004A000A004B0009004B0009004B0009004C0009004C0009004D00
+09004D0009004D0008004D000F004D0016004E001D005100250054002F0056
+003B005A0048005E0056006000640061007300600082005F0093006000AB00
+6000C4006000C4006000C4006000C4006000C4006000C4006000C4006000C4
+004B0009004B0009004B0009004B0009004C0009004C0009004D0009004D00
+08004E0008004E0008004E0008004F0008004E000E004E00160050001D0052
+00250055002F0058003B005B0047005F005500620063006200720062008100
+610092006100AB006200C6006200C7006200C7006200C7006200C7006200C7
+006200C7006200C7004C0009004C0009004C0009004D0009004D0008004E00
+08004E0008004F0008004F0008004F000800500007005000070050000E0050
+00150051001D005400250057002E0059003A005C0047006000540063006200
+6300710063008100620091006300AB006300CA006300CA006400CA006400CA
+006400CA006400CA006400CA006400CA004E0008004E0008004E0008004E00
+08004F0008004F000800500007005000070051000700510007005100070052
+00070051000D005100140053001C005500240058002E005B0039005E004600
+61005300640062006500700064008000640091006400AB006500CE006500CE
+006500CE006500CE006500CE006500CE006500CE006600CE00500007005000
+07005000070050000700510007005100070052000700520006005200060053
+000600530006005400060053000C005300140054001B00570024005A002D00
+5C0039005F00450063005300650061006600700066007F00650090006600AA
+006700D2006700D2006700D2006600D2006500D2006500D1006400D0006300
+D0005200070052000700520007005200060053000600530006005300060054
+0005005400050055000500550005005500040055000B005500130056001B00
+580023005B002C005E00380061004400640052006700600068006F0065007E
+0062008E005F00A6005D00CF005B00CE005A00CF005900CE005800CE005800
+CD005700CD005700CD00530006005300060053000600540005005400050055
+00050055000400560004005600040057000400570004005800030057000A00
+5700120058001A005A0022005D002C00600037006300440061004F005F005C
+005C006A00590079005600890053009F005100CA005000CA004F00CA004E00
+C9004D00C8004C00C8004C00C8004C00C70056000400560004005600040056
+00040057000400570004005800030058000300590003005900030059000200
+5A0002005A000900590011005A0019005C0021005D002A005800320254003D
+0451004904500056034F0065024D0075024A008401470099014600C0004500
+C2004400C2004300C1004300C1004200C0004200C0004100C0005800030058
+000300580003005800030059000300590002005A0002005B0002005B000100
+5B0001005C0001005C0001005C0007005C0010005900170153001D044E0023
+0649002B094400350A4200420A4100500A410061093F0071083C0081073A00
+95053A00B9033A00BF033900BE043700BE043700BD043600BD053600BD0535
+00BD055A0002005A0002005A0002005B0002005B0001005C0001005D000100
+5D0001005E0101005F0101005F010100600101005C00050153000B054B0011
+084400170A3E001D0C3A00240E35002E0F32003A0F3100490F300059102E00
+690F2C007B0D2C00900B2D00B1092C00B9092A00B90A2A00B80A2900B80A28
+00B80A2800B80B2800B70B5D0001005D0001005D0001005E0101005F010100
+6001010061010100610200006202000063020000630200005C030000520301
+024700040B3D000A0E350011112F0018122A001F1428002815240033152100
+4115200051161F0061161E0073141E0088121F00A7101E00B4101D00B3111D
+00B3111C00B3111B00B2121B00B2121B00B212610200006102000061020000
+620200006302000064020000650300006603000066030000630400005B0600
+00550700004A0700023C04000D2F02041325000A17200012181C001A1B1A00
+241C17002D1E13003B1E10004A1F0F00591F0E006A1E0F007F1B10009C190F
+00AB180E00AA190D00A9190D00A9190C00A8190C00A8190C00A81A66030000
+66030000660300006703000068030000690400006A0400006A040000620600
+005A080000520A00004C0B0000420B0002340A000C250600161A02041B1100
+09200C00132309011D25060226260202302700023E27000350260104632402
+0679200305931D0305A31C0205A31C0206A21C0106A21C0106A21C0106A21C
+0107A21C6B0400006B0400006B0400006C0500006D0500006E0500006D0600
+0061080000580B0000500C0000490E0000420F0000381000022C0F000B1F0C
+00141207001C0402002400050E2600091B24000C2522000E311F000F401E00
+0F501D0010621C0011771B001190190010A2180011A2180011A2170012A217
+0012A1170012A1170012A1176F0600006F0600006F06000070070000710700
+006C090000600B0000560D00004D0F0000451000003E120000371300002E13
+00012413000A1A1100130E0E001A010B04220010132000131D1D0015261A00
+1632180018411700195117001A6216001B7515001B8C12001BA012001BA011
+001BA011001CA011001CA011001CA010001CA0107309000073090000730900
+00740A00006B0C00005E0E0000531000004A110000411300003A1400003315
+00002D160000261700021E17000916160010091400190014081C0018131900
+1A1C16001D2614001F34120021431100235210002462100025750E00248A0C
+0024A10C0024A10B0024A10B0025A10B0025A10A0025A10A0025A10A770C00
+00770C0000770C00006B0E00005D10000051120000471400003E1500003516
+00002F1800002A190000261A0000211C00011A1D0005111D000D051A001500
+1C0914001F121200221B100026270E0029350C002B440A002D5309002F6308
+002F7407002E8906002CA105002DA104002DA104002DA104002DA103002DA1
+03002EA1036911000069110000691100005B1300004E150000431600003A18
+0000321900002B1B0000271C0000241E0000212000001D220000162400020C
+22000A0221021000240A0E0029140B002D1E0A003029070033360500364503
+003853020039630200397402003687010034A3000034A3000034A3000034A3
+000034A3000034A3000034A3005816000058160000581600004C1700004019
+0000371A00002F1C0000291E00002520000022220000202400001D26000018
+28000011290002072800090029040B00300E070034180500361F0500382804
+003A3403003C4202003E52020040620200407301003E8601003BA500003BA7
+00003BA700003BA700003BA700003BA700003BA700481A0000481A0000481A
+00003E1C0000341E00002D2000002822000024250000202700001D2900001A
+2B0000172C0000122E00000B2F0002042F01070030060900350E07003A1605
+003D1E05003E26040040310300424003004650020048610100497201004785
+000044A3000044AB000044AB000044AB000044AB000044AB000044AB003A1F
+00003A1F00003A1F0000312100002B24000026270000222A00001E2C00001A
+2E0000173000001431000012320000103400000C350002053400070035040A
+003A0C080041150500451D040046250400482F03004A3D02004E4D0100525F
+010053710000528400004FA000004EAF00004EAF00004EAF00004EAF00004E
+AF00004FAF002F2600002F2600002F26000029290000242D0000203000001C
+3200001834000014360000133700001337000013380000113900000D3B0001
+063A0006003B030A00410A0800491306004E1C040051230300522D03005439
+0200574A00005C5D00005E6F00005E8200005C9D01005BB401005BB401005B
+B401005BB401005BB401005BB401282F0000282F0000282F0000233200001E
+35000019380000153A0000143B0000143C0000143D0000143D0000143E0000
+124000000E420001094300040143010A004908090051110700581A05005C22
+04005E2B02006037010063470000685900006B6C00006B8000006A9B010068
+BA000068BA000069BA000069BA000069BA000069BA00203900002039000020
+3900001C3C0000173E00001440000015410000154200001543000015440000
+154400001545000013470000104B00010A4D0003044E000800530509005B0E
+070063180600692004006D2902006F34010072430000775500007A6800007A
+7D0000799A000078C2000078C2000078C2000078C2000078C3000078C30019
+430000194300001943000015460000154700001548000015490000164A0000
+164B0000164C0000164C0000164D000014500000115500010C590003065B00
+06005E020900670A08006F150600771C03007C240100802F0000843E000087
+4F00008B6200008C7800008A9800008ACD00008BCD00008BCD00008BCD0000
+8BCD00008BCD00164E0000164E0000164E0000164F00001650000016510000
+16510000165200001653000017540000175500001756000015590000125F00
+000E64000209690004046D000700740408007D0C050086140200901C000097
+2600009C340000A2460000A65B0000AC710000AA900000AACE0000ACDB0000
+ACDB0000ACDB0000ACDB0000ACDB0017560000175600001756000017570000
+17590000175A0000175B0000175C0000175D0000175D0000175E0000175F00
+0016620000136900000F7000010C770001087E000204850004018F0203009A
+060100AC0C0000C2150000D9200000ED310000F64C0000FC640000FE830000
+FED30000F7FF0000F7FF0000F8FF0000F8FF0000F8FF001760000017600000
+17600000176100001762000017630000176400001765000017650000176500
+00176500001765000016680000136F0000107600000D7D00000A850000078D
+00000395000100A1020100B4080000CF100000EA1B0000FF290000FF470000
+FF5E0000FF7D0000FFB20000FFFF0000FFFF0000FFFF0000FFFF0000FFFF00
+17650000176500001765000017650000176500001765000017650000176500
+001765000017650000176500001765000016680000136F0000107600000D7D
+00000A850000078C00000395000101A1020100B3070000CD0F0000E81A0000
+FF270000FF440000FF5B0000FF780000FF9C0000FFFF0000FFFF0000FFFF00
+00FFFF0000FFFF001765000017650000176500001765000017650000176500
+0017650000176500001765000017650000176500001765000016680000136F
+0000107600000D7D00000A840000078C00000394000101A0020100B1070000
+CB0E0000E6190000FD260000FF400000FF580000FF720000FF8F0000FFF900
+00FFFF0000FFFF0000FFFF0000FFFF00>
+<3F000C003F000C003F000C003F000C0040000C0040000C0041000C0041000C
+0041000C0042000C0042000C0042000C0043000E004200140044001A004600
+210049002A004B0036004F004300540052005700610058006F0057007E0056
+008D0056009F005700B6005700B7005700B7005700B7005700B7005700B700
+5700B7005700B70040000C0040000C0040000C0041000C0041000C0041000C
+0042000C0042000C0043000C0043000C0043000C0044000C0044000D004400
+140045001A00470021004A002A004C00360050004300540051005800600059
+006F0059007D0057008C0057009F005800B8005800B8005800B8005800B800
+5800B8005800B8005800B8005800B80042000C0042000C0042000C0042000C
+0042000C0043000C0043000C0044000C0044000C0045000B0045000B004500
+0B0045000D004500140046001A00480021004B002A004D0035005100420055
+00510059005F005A006E005A007D0059008C0058009F005900B9005900B900
+5900BA005900BA005900BA005900BA005900BA005900BA0043000C0043000C
+0043000C0043000C0044000C0044000B0045000B0045000B0046000B004600
+0B0046000B0047000B0047000D004600130047001A004A0021004C002A004F
+00350052004200560050005A005F005C006D005B007C005A008B0059009E00
+5A00BB005A00BB005A00BB005A00BB005A00BB005A00BB005A00BB005A00BB
+0045000B0045000B0045000B0045000B0045000B0046000B0046000B004700
+0B0047000B0047000B0048000A0048000A0048000C0048001300490019004B
+0021004E002A00500035005300410058004F005B005E005D006C005C007B00
+5B008B005B009E005B00BB005C00BD005C00BD005C00BD005C00BD005C00BD
+005C00BD005C00BD0046000B0046000B0046000B0046000B0047000B004700
+0B0048000A0048000A0049000A0049000A0049000A004A000A004A000C0049
+0012004A0019004C0020004F002900510034005500410059004F005C005D00
+5E006C005E007B005D008A005C009E005D00BB005D00BF005D00BF005D00C0
+005D00C0005D00C0005D00C0005D00C00048000A0048000A0048000A004800
+0A0049000A0049000A0049000A004A000A004A000A004B0009004B0009004B
+0009004B000B004B0012004C0019004E002000510029005300340056004000
+5A004E005E005C0060006B005F007A005E0089005E009E005E00BB005F00C2
+005F00C2005F00C2005F00C2005F00C2005F00C2005F00C2004A000A004A00
+0A004A000A004A000A004A000A004B0009004B0009004C0009004C0009004C
+0009004D0009004D0008004D000A004D0011004D0018004F00200052002900
+55003400570040005C004D005F005B0061006A0061007900600089005F009D
+006000BC005E00C3005D00C3005C00C3005B00C3005A00C3005900C2005900
+C2004C0009004C0009004C0009004C0009004C0009004D0009004D0008004E
+0008004E0008004E0008004F0008004F0008004F0009004F0011004F001800
+51002000540028005700330059003F005D004C0061005A00610068005D0077
+005A008600560098005400B7005300C4005100C4005000C3004F00C3004F00
+C3004E00C3004E00C2004D0008004D0008004D0008004E0008004E0008004F
+0008004F000800500008005000070050000700510007005100070051000800
+510010005100170053001F00560028005800320058003D0056004900550056
+0054006400520073004F0082004B0094004900B2004800C3004700C3004600
+C2004500C2004500C1004400C1004400C10050000800500008005000080050
+00070050000700510007005100070052000700520006005300060053000600
+530006005300070053000F005300160055001E00520025004E002C024A0036
+0448004203480050024700600245006F0243007E01400090013F00AD003E00
+BF003D00BF003C00BE003C00BE003B00BE003B00BE003B00BE005200060052
+00060052000600520006005300060053000600540006005400050054000500
+5500050055000500560004005600060055000E004F0014014A00190345001F
+04410026063C002F083A003C083900490839005A0738006A06360079053400
+8C043400A8023400BB023300BB023200BA023100BA023000BA023000B90330
+00B90354000500540005005400050054000500550005005600040056000400
+5600040057000400570003005800030058000300530003004C00090344000E
+063D00140837001A0A3300210B2F002A0C2C00340C2A00420C2900520D2900
+620C2700730B270086092800A1072800B5062700B5062600B4072500B40725
+00B3072500B3072400B3075700040057000400570004005700040058000300
+5800030059000300590002005A0002005A00020058000100510101004C0201
+01410003083700080C2F000F0E2A00161026001D112300261220002F121D00
+3C131C004C131B005B131A006B121A007F101B00980E1C00AF0D1B00AE0D1A
+00AD0E1900AD0E1900AD0E1900AD0E1800AC0F5A0002005A0002005A000200
+5A0002005B0002005B0001005C0001005C0001005D00010056010000500300
+004B05000045060000370400092A020310210009141C001016190019181600
+221A13002B1B1000371C0E00451B0C00541C0B00641C0B0076190C008E160D
+00A6150C00A5150B00A4150B00A4160A00A3160A00A3160A00A3165D000100
+5D0001005D0001005D0001005E0101005F010100600101005F010000560300
+004F05000049070000430900003C0A00003009000723060012170203180F00
+081C0B00121F07011C210402252201032E2100033B2100044B2000055E1F01
+06711C0106881902059F1801069E1801069E1800069E1800079E1800079E18
+00079D176202000062020000620200006202000063020000640200005F0300
+00550600004E080000460A0000400B0000390D0000330E0000280D00071D0B
+0011110700180402001F00050E2100091A1F000C241D000E2E1A000E3D1900
+0F4C1800105D1800116F170011841500109D1400119D1300119D1300129D12
+00129D1200129D1200129D1267030000670300006703000067030000680400
+005F060000550800004C0A0000440C00003C0E0000350F00002F1000002911
+000021110007170F00100C0D0017010B051D000F131C00121B190014241600
+16301400173E1200184D1200195D11001A6E10001A820E001A9B0D001A9B0D
+001B9B0C001B9B0C001B9B0C001B9B0C001B9B0C6D0500006D0500006D0500
+006D05000060080000540B00004A0D0000410F000038100000311200002B13
+000026140000231500001C1600061415000D08130015001408180017121500
+191B12001C2410001E310E00203F0C00214E0B00225D0A00236D0900238108
+00229A0700229B0600229B0600239B0600239B0500239A0500239A05620A00
+00620A0000620A00005F0B0000520D0000471000003D110000341300002D14
+00002715000024170000211800001E1A0000181B0002101B00090519011100
+1B0910001E110E00201A0C002426090027340600294105002A4E04002C5D03
+002C6D03002B80020028970200289B0200289B0200289B0200289C0200289C
+0200289C0254100000541000005410000051100000451200003A1400003115
+00002A17000025180000211A00001F1C00001C1D0000191F0000142100000B
+200007011F020C00220A090026140700291C05002B2604002E3303002F4003
+00304D0200315C0200316C0200307E02002D9601002D9F01002D9F01002D9F
+01002D9F01002D9F01002D9F01451400004514000045140000431500003716
+00002E180000281A0000231C0000201E00001D2000001A2200001723000015
+2400000E260000052500060025040900290B07002C1406002E1C0500302404
+0032300300343D0300354B0200375A0200386B0200367D01003495010033A2
+010033A2010033A2010033A2010033A2010033A20137190000371900003719
+0000341900002C1B0000261E0000222000001E2200001B2400001826000014
+27000012290000112900000D2A0000062A0005012A0308002D0A0800311306
+00341B050036230500382D03003A3A03003C4902003E5902003F6A01003E7C
+01003C9400003AA600003AA600003AA600003AA600003AA600003AA6002C1E
+00002C1E00002C1E00002A1F000025220000212500001C2700001829000015
+2B0000112C0000112D0000112D0000122E00000E2F0000082F0004012E0209
+0032080800371106003B1A05003D2104003F2A030041370300444602004757
+020049690100487B00004592000044AB000044AB000044AB000044AB000044
+AB000044AB00252600002526000025260000242700001F2A00001A2D000016
+2F00001230000012310000123200001232000012330000123300000F350000
+0A3500030234010900370709003E0F07004418050046200400482804004A34
+02004C4302005155010054670000547A0000529001004FAF00004FAF00004F
+AF000050AF000050AF000050AF001E2F00001E2F00001E2F00001D30000018
+32000013340000133500001336000013370000133700001338000013380000
+13390000103B00000B3C0002033B0009003E050A00450D08004D160500511E
+04005427030055310200573F01005C5100006065000061780000608E01005D
+B500005DB500005DB500005DB500005DB500005DB500173800001738000017
+38000016380000143A0000143B0000143C0000143D0000143D0000143E0000
+143F0000143F000014400000114300000D450002064500060148030A004F0A
+0800571406005D1D050061250300632F0200643C00006A4D00006E61000070
+7400006F8B00006DB700006DBC00006DBC00006DBC00006DBC00006DBC0014
+40000014400000144000001440000015410000154200001543000015440000
+1545000015460000154700001547000015480000124C00000E500001095200
+0502530109005A070900621107006A1B050070220300732B0000763800007A
+4900007F5B0000807000007F8900007EB400007EC600007EC600007EC60000
+7EC600007EC60015490000154900001549000015490000164A0000164B0000
+164C0000164D0000164E0000164F0000164F00001650000016510000145600
+00105B00010B5F0003056300060167030800700C070078150500801C010086
+2500008B3100008F42000093550000976900009684000094B0000096D20000
+96D2000096D2000096D2000096D30016520000165200001652000016520000
+16530000175400001755000017560000175700001758000017590000175A00
+00175B000014600000116600010D6C00020972000304780006008003060089
+0A030094100000A2170000AE230000B7330000BF480000C95F0000CE7A0000
+CCA50000CAEB0000CBEC0000CBEC0000CCEC0000CCEC00175C0000175C0000
+175C0000175C0000175D0000175E0000176000001760000017610000176200
+00176300001764000017650000156B0000127200000F7900000C8000000988
+000005900000019A000200A8040000C00A0000DB150000F5210000FF380000
+FF530000FF6F0000FF900000FFFF0000FFFF0000FFFF0000FFFF0000FFFF00
+17650000176500001765000017650000176500001765000017650000176500
+001765000017650000176500001765000017650000156B0000127200000F79
+00000C80000009880000059000000199000200A7040000BE0A0000D9140000
+F3200000FF340000FF500000FF6A0000FF890000FFF60000FFFF0000FFFF00
+00FFFF0000FFFF001765000017650000176500001765000017650000176500
+0017650000176500001765000017650000176500001765000017650000156A
+0000127100000F7800000C80000009870000068F00000198000200A6040000
+BC090000D7130000F01F0000FF310000FF4D0000FF660000FF840000FFDC00
+00FFFF0000FFFF0000FFFF0000FFFF00>
+<3A000D003A000D003A000D003A000D003A000D003A000D003A000D003A000D
+003A000D003B000D003B000D003B000D003B000D003C0011003C0017003F00
+1D00410025004400300048003D004C004B0050005B0052006A005200780051
+008700500097005000AB005100B1005100B1005100B1005100B1005100B100
+5100B1005100B1003A000D003A000D003A000D003A000D003A000D003A000D
+003B000D003B000D003C000D003C000D003C000D003D000D003D000D003D00
+11003E00170040001D004300250045002F0049003D004D004B0051005A0053
+0069005300780052008600510096005100AB005200B2005200B2005200B200
+5200B2005200B2005200B2005200B2003B000D003B000D003B000D003B000D
+003B000D003C000D003C000D003D000D003D000D003D000D003E000D003E00
+0D003E000D003E0011003F00170041001D004400250046002F0049003C004E
+004A0052005900540068005400770053008600520096005200AB005300B300
+5300B3005300B3005300B3005300B3005300B3005300B3003C000D003C000D
+003C000D003C000D003D000D003D000D003E000D003E000D003E000D003F00
+0C003F000C0040000C0040000C00400011004000170042001D004500250047
+002F004B003C004F004A005300590055006800550076005400850053009500
+5400AA005400B4005400B4005400B4005400B4005500B4005500B4005500B4
+003E000D003E000D003E000D003E000D003E000D003F000C003F000C004000
+0C0040000C0040000C0041000C0041000C0041000C00410010004200160044
+001D004600250049002E004C003B0050004900540058005700670057007600
+56008500550095005500AA005600B6005600B6005600B6005600B6005600B6
+005600B6005600B60040000C0040000C0040000C0040000C0040000C004100
+0C0041000C0041000C0042000C0042000C0043000C0043000C0043000C0043
+0010004300160045001D00480024004A002E004D003B005100490055005700
+580066005800750058008400560094005600A9005700B7005700B7005700B7
+005700B7005700B7005700B7005700B70042000C0042000C0042000C004200
+0C0042000C0042000C0043000C0043000C0044000C0044000C0044000B0045
+000B0045000B00450010004500160047001C00490024004C002E004F003A00
+5300480057005600590065005A00740059008300580094005800AA005900B9
+005900B9005900B9005900B9005900B9005900B9005900B90043000C004300
+0C0043000C0043000C0044000C0044000C0045000B0045000B0046000B0046
+000B0046000B0047000B0047000B0047000F004700160048001C004B002400
+4D002E0050003A0054004700580055005B0064005B0073005B008200590093
+005700AA005500BC005400BC005200BC005100BC005100BB005000BB005000
+BB0046000B0046000B0046000B0046000B0046000B0046000B0047000B0047
+000B0048000B0048000A0048000A0049000A0049000A0049000E0049001500
+4A001C004D0024004F002D0052003900550046005800540057006200550071
+00520080004E0090004C00A8004B00BF004900BE004800BE004700BE004700
+BE004600BE004600BE0048000B0048000B0048000B0048000B0048000A0048
+000A0049000A0049000A004A000A004A000A004A000A004B0009004B000900
+4B000E004B0015004C001C004E00230051002D004E0036004C0042004C004F
+004B005E004A006D0047007C0044008C004200A4004100C0004000C0003F00
+BF003E00BF003D00BF003D00BF003D00BF004A000A004A000A004A000A004A
+000A004A000A004A0009004B0009004B0009004C0009004C0009004D000900
+4D0009004D0008004D000D004D0014004C001B00490020004500260141002F
+023F003B023F0048023F0058013E0068013C007800390088003800A0003800
+BE003700BE003600BE003500BE003500BE003400BE003400BD004C0009004C
+0009004C0009004C0009004C0009004D0009004D0008004E0008004E000800
+4E0008004F0008004F000800500008004E000C0047001100410016023D001B
+033900220535002A06320036053100430531005205300062052E0072042E00
+83022D009B012E00B9002D00B9002C00B8012C00B8012B00B7012B00B7012A
+00B7014E0008004E0008004E0008004E0008004F0008004F00080050000700
+50000700510007005100070051000700520007004B000500450007013D000C
+0436001107300017082C001E0A2900260A2700300A25003D0A23004C0A2300
+5B0A22006B0922007E07230094052400B2042300B2042200B1042200B10521
+00B0052100B0052100B0055100070051000700510007005100070051000700
+52000600520006005300060053000600540005004F00040049010300440101
+013A0002053100070929000C0C2500140D21001B0F1F0024101D002D101A00
+38111700471116005611160065101600770E17008C0C1900AB0A1800AA0A17
+00AA0B1600A90B1600A90B1600A80B1500A80B540005005400050054000500
+5400050054000500550005005500050056000400550004004D000200470101
+00400300013B040001320400052601020D1E00081119000F13150018161300
+2017100029180D0033190B00401909004E1909015E1808006F17090084140B
+00A1110A00A01209009F1209009F1208009E1208009E1307009E1357000400
+570004005700040057000400570004005800030058000300530002004C0201
+00450300003F05000039070000340800002B0800051F05000D160203140E00
+08180900121B06021B1C0403241C01042D1C0005391B0005481A0006591A00
+066A1801077F150106981301069A1300069A1300079A1300079A1300079A13
+000899135A0002005A0002005A0002005A0002005A0002005B000100520100
+004B030000440600003D08000036090000300B00002B0C0000240C00041A0A
+000D0F0600140302001A00050E1C0009191A000B2218000D2C16000E391400
+0F4813001057130010691200117C100010940F0010990F0011980E0011980E
+0012980D0012980D0012980D5E0101005E0101005E0101005E0101005D0100
+00520300004A060000420800003A0A0000330C00002C0D0000270F00002310
+00001E100003150E000C0B0C0013010B0519000F121700111A140013221200
+152D0F00163B0E0017490D0018570C0019670B00197A0A00198F0800199608
+001A9608001A9607001A9607001A9607001A96075904000059040000590400
+00590400005306000049090000400B0000370D00002F0E0000291000002411
+0000211200001E130000191400041114000907120011001308130016111000
+18190E001A230B001D2F08001E3C07001F4A06002057050021670400217803
+00208C020020960200209602002096020020960200209602002096024E0A00
+004E0A00004E0A00004E0A0000480B00003E0D0000340F00002C1100002612
+0000221400001E1500001B17000019180000151900010D1900060318010D00
+1A080C001C1009001F1907002224040023300300243D030025490300255603
+002566030025770200248C0200239802002398020023980200239802002398
+0200239802410F0000410F0000410F0000410F00003B100000311200002913
+000024150000201700001C180000191A0000171B0000141D0000101E000009
+1E0004011D0208001F090700211106002318060025220500272F0300283B03
+00294703002A5503002A6403002A760200288B0200279B0200279B0200279B
+0200279B0200279B0200279B02331300003313000033130000331300002E14
+000026160000221800001E1A00001A1C0000171E0000141F0000122000000F
+2100000D220000082200030120010800220807002510060027170600292005
+002C2C03002D3903002E4503002F53030030630200307502002E8901002C9E
+01002C9E01002C9E01002C9E01002C9E01002C9E0128180000281800002818
+00002818000025190000201C00001C1E00001920000015220000122300000F
+24000010250000102500000E250000092600020224010800260608002A0E06
+002C1706002E1F050031290400323603003443020036520200376202003773
+02003488010032A2010032A2010032A2010032A2010032A2010032A201221E
+0000221E0000221E0000221E00001F2000001B220000172400001326000010
+270000102800001028000011290000112900000F2A00000B2A0002042A0107
+002A0509002F0D070033160500351E050037270400393203003A4002003D50
+02003F6102003F7201003D8701003AA600003AA600003AA600003AA600003A
+A600003AA6001C2600001C2600001C2600001C260000192700001429000011
+2B0000112B0000112C0000112D0000112D0000112D0000122E0000102F0000
+0C300001062F0006002F030A00340B08003A1405003D1D05003E240400402F
+0300423D0300464E020049600100497101004885000044A7000044AB000044
+AB000045AB000045AB000045AB00152E0000152E0000152E0000152E000012
+2F000012300000123000001231000012310000123200001233000012330000
+13340000113500000E360001073600050035020A003A09080042120600461B
+0400492304004A2C03004C390200504A0100545D0100567000005584000052
+A4000051B0000052B0000052B0000052B0000052B000133400001334000013
+34000013340000133500001336000013360000133700001338000013380000
+13390000133A0000143A0000133B00000F3E00000A3E0003013D000B004307
+09004B1007005219050055210400572A0300593602005C4601006159000064
+6D00006481000062A0010061B6000061B6000061B6000061B6000061B60014
+3B0000143B0000143B0000143B0000143C0000143D0000143E0000143E0000
+143F00001440000014410000154100001542000014430000104700000C4900
+0204490008004D040900560D08005E1706006320040067280200693301006C
+4200007154000074680000747E0000749D010072BF000072BF000072BF0000
+72BF000072BF00154400001544000015440000154400001544000015450000
+15460000154700001548000015490000164A0000164A0000164B0000154D00
+00125100000D55000207580006015A010900620908006B140700731C040078
+2402007C2E00007F3D0000834F000087620000887A0000869C000086CB0000
+86CB000086CB000087CB000087CB00164D0000164D0000164D0000164D0000
+164E0000164F00001650000016510000165200001653000016530000175400
+001755000016570000135D00000F6200010A670004056B000601720308007A
+0B0600841302008D1B0000942400009A3200009F450000A45A0000A9710000
+A7940000A9DA0000A9DA0000AADA0000AADA0000AADA001757000017570000
+17570000175700001758000017590000175A0000175B0000175C0000175D00
+00175E0000175F0000176000001761000014680000106F00000D7700010A7E
+000205850003018E0104009A040200AB090000C4110000DF1D0000FA2B0000
+FF490000FF620000FF840000FFEB0000FEFF0000FEFF0000FFFF0000FFFF00
+17620000176200001762000017620000176300001764000017650000176500
+00176500001765000017650000176500001765000017660000146D00001174
+00000E7B00000B830000088B000004930001019E020100B0060000CA0E0000
+E7190000FF270000FF450000FF5E0000FF7E0000FFCD0000FFFF0000FFFF00
+00FFFF0000FFFF001765000017650000176500001765000017650000176500
+00176500001765000017650000176500001765000017650000176500001766
+0000146D0000117400000E7B00000B830000088A000004930001019E010100
+AE060000C80D0000E5180000FC250000FF410000FF5A0000FF790000FFA800
+00FFFF0000FFFF0000FFFF0000FFFF00>
+<3A000D003A000D003A000D003A000D003A000D003A000D003A000D003A000D
+003A000D003A000D003A000D003A000D003A000D003A000E003A0014003B00
+1A003E0020004000290043003600480044004C0053004E0064004F0072004E
+0081004D0090004D00A2004E00AE004E00AE004E00AE004E00AE004E00AE00
+4E00AE004E00AE003A000D003A000D003A000D003A000D003A000D003A000D
+003A000D003A000D003A000D003A000D003A000D003A000D003A000D003A00
+0E003A0014003B001A003E0020004000290043003600480044004C0053004E
+0063004F0072004E0081004D008F004D00A1004E00AE004E00AE004E00AE00
+4E00AE004E00AE004E00AE004E00AE003A000D003A000D003A000D003A000D
+003A000D003A000D003A000D003A000D003A000D003A000D003A000D003A00
+0D003A000D003A000E003A0014003B001A003E002000400029004300360047
+0043004C0053004E0063004F0072004E0080004D008F004D00A0004E00AE00
+4E00AE004E00AE004E00AE004E00AE004E00AE004E00AE003A000D003A000D
+003A000D003A000D003A000D003A000D003A000D003A000D003A000D003A00
+0D003A000D003A000D003A000D003A000E003A0014003B001A003E00200040
+00290043003600480043004C0052004F006200500071004F0080004E008E00
+4E00A0004F00AF004F00AF004F00AF004F00AF004F00AF004F00AF004F00AF
+003A000D003A000D003A000D003A000D003A000D003A000D003A000D003A00
+0D003A000D003A000D003A000D003A000D003A000D003B000E003B0013003C
+0019003F0020004200290045003500490043004D0052005000620051007000
+50007F004F008E004F00A0005000B0005000B0005000B0005000B0005000B0
+005000B0005000B0003A000D003A000D003A000D003A000D003A000D003A00
+0D003A000D003A000D003B000D003B000D003C000D003C000D003C000D003C
+000D003C0013003E0019004000200043002800460035004A0042004E005100
+520061005300700052007F0051008E0050009F005100B1005100B1005100B2
+005200B2005200B2005200B2005200B2003B000D003B000D003B000D003B00
+0D003B000D003B000D003C000D003C000D003D000D003D000D003D000D003E
+000D003E000D003E000D003E0013003F00190042001F004500280047003400
+4B004100500050005300600054006F0054007E0053008D0052009F005300B3
+005300B3005300B3005300B3005300B3005200B3005100B4003D000D003D00
+0D003D000D003D000D003D000D003D000D003E000D003E000D003F000C003F
+000C003F000C0040000C0040000C0040000C00400013004100190044001F00
+46002800490033004D00410051004F0055005F0056006E0054007D0051008B
+004E009E004C00B7004B00B8004A00B8004900B7004800B7004700B7004700
+B8003F000C003F000C003F000C003F000C003F000C003F000C0040000C0040
+000C0041000C0041000C0042000C0042000C0042000C0043000C0042001200
+4300190045001F00480028004A0033004E0040004E004D004E005C004D006B
+004A007A004700890044009C004300BB004100BB004000BC004000BC003F00
+BC003E00BC003E00BC0041000C0041000C0041000C0041000C0041000C0042
+000C0042000C0043000C0043000C0043000C0044000C0044000C0045000B00
+45000B00440012004500180047001F004700260044002F0043003A00430047
+004300570042006800400077003D0086003A009B003A00BF003900BF003800
+BF003700BF003700BF003600BF003600BF0044000C0044000C0044000C0044
+000C0044000C0044000C0045000B0045000B0045000B0046000B0046000B00
+47000B0047000B0047000B0047001100430017003F001B003C002100380029
+01360035013600420136005101350062013400720032008300310098003100
+BD003000BF003000BF002F00BF002F00BF002E00BF002E00BF0046000B0046
+000B0046000B0046000B0046000B0047000B0047000B0047000B0048000A00
+48000A0049000A0049000A0049000A00460009003F000E0039001302350018
+0331001E042D0026042C0031042A003D0329004C0328005C0327006B032700
+7D02270093012900B5002800BA002700B9002700B9002600B8002600B80025
+00B80049000A0049000A0049000A0049000A0049000A0049000A0049000A00
+4A000A004A000A004B0009004B00090049000800430007003E000500360009
+032F000E052A00140626001C082400240822002D08200038071F0047071D00
+56071D0065071D0076051E008B032000AA021F00B0021F00B0021E00AF021D
+00AF021D00AE021D00AE034B0009004B0009004B0009004B0009004B000900
+4C0009004C0009004D0009004D0009004D00080046000600410004003C0003
+01320001032B00050625000B092100120B1D001A0D1B00220E19002B0E1600
+350E1400420E1300510E1200600D1200700C1300830915009D071500A60614
+00A5071400A5071300A4071300A4081300A4084E0008004E0008004E000800
+4E0008004E0008004E0008004F0008004F0008004C000600440004003F0002
+0234000003300200022C040001230102091B00060E17000E10130016121000
+1F140D0027150A00301508003C1506004915050159150501691406007B1108
+00920E08009C0E07009B0E07009B0E06009A0F06009A0F05009A0F51000700
+5100070051000700510007005100070051000700520006004A000400430102
+0139010002330300012F0500002A060000260700001D050009140202100C00
+07150800111704021A180203221801042B1700053616000644150007541400
+0765130007771201068C100006970F0006960F0007960F0007960E0008960E
+0008960E540005005400050054000500540005005400050053000400490102
+004102010138040001330600002D07000028090000240A0000210B00001909
+00080E0600100302001600050E1800081916000B2113000D2A11000E370F00
+0F440E000F530E0010630D0010740B0010880A0010940A0010940900119409
+00119308001193080012930850000200500002005000020050000200500002
+00490201003F04000138060000300800002A0A0000250B0000210C00001E0E
+00001B0F0000130D00080A0B000F000A0415000E10120010190F0012210D00
+142B0A00153808001645080017530700176206001872040018850300189203
+00189202001992020019920200199202001992024704000047040000470400
+0047040000470400003F060000360900002E0B0000270C0000220E00001F0F
+00001B1000001911000116130000101300050611000C0012070E0015100B00
+17180800192106001B2D03001C3903001C4503001C5203001C6103001C7103
+001B8402001B9303001B9303001B9303001B9303001B9303001C93033D0900
+003D0900003D0900003D0900003D090000330B00002B0D0000250F00002010
+00001C120000191300001615000014160000121700000C1800030317010800
+190806001A0F06001B1706001C2005001E2B03001F3703001F4403001F5103
+001F5F03001F6F03001F8202001F9503001F9503001F9503001F9503001F95
+03001F9503300E0000300E0000300E0000300E0000300E0000281000002212
+00001E1300001A1500001717000014180000121900000F1A00000D1B000009
+1B0001021A0107001B0607001D0E06001E1506001F1E050021290400223603
+0023420300234F0300245E0300246E03002381020022970200229702002297
+02002297020022970200229702251300002513000025130000251300002513
+0000211400001C16000019180000151A0000121C00000F1D00000D1E00000D
+1E00000E1E00000A1E0000031D0006001D050800200C060021140600231C05
+00252704002734030027400300284D0300295C0300296C030028800200269A
+0200269A0200269A0200269A0200269A0200269A021E1800001E1800001E18
+00001E1800001E1800001B1A0000171C0000131E0000101F00000E2000000E
+2000000E2100000E2100000F2100000C220000052000060120040800230B07
+0025130600271B0600292504002C3203002D3F03002E4C03002F5B03002F6B
+02002E7F02002B9901002B9D01002B9D01002B9D01002B9D01002B9D01191E
+0000191E0000191E0000191E0000191E000015200000112200000F2300000F
+2300000F2400000F2400000F24000010250000102500000D26000007250004
+0124020900270A07002B1206002D1A05002F230500312E0300333B03003449
+020036590200376A0200357D01003297010032A2010032A2010032A2010032
+A2010032A20113240000132400001324000013240000132400001026000010
+26000010270000102700001028000010280000112900001129000011290000
+0E2A0000082A0004022A0208002C080800311106003419050036210500382B
+03003A3803003C4702003E570200406901003F7C01003C9600003AA600003B
+A600003BA600003BA600003BA600112A0000112A0000112A0000112A000011
+2A0000112B0000112B0000112C0000112C0000112D0000112D0000122E0000
+122E0000122F00000F3000000A310002033001080032060900370F07003C17
+05003F1F0400402804004234030045440200495502004B6801004A7B000048
+94000046AC000046AC000046AC000046AC000046AC00123000001230000012
+30000012300000123000001230000012310000123200001232000012330000
+13340000133400001335000013350000103700000C38000204370007003904
+0A003F0C0800461505004A1E04004C2603004E310300503F02005451010058
+650000597900005791010055B1000055B1000055B1000055B1000055B10013
+36000013360000133600001336000013360000133700001338000013390000
+13390000143A0000143B0000143B0000143C0000143D0000123F00000E4100
+01074100050042020A004909090051130600571C05005B2403005C2E02005E
+3B0100634D00006861000069750000688E010066B9000066B9000066B90000
+66B9000066B900143E0000143E0000143E0000143E0000143E0000143F0000
+14400000144100001542000015430000154400001544000015450000154600
+00134800000F4C00010A4E0004034F000800550609005D100700651A06006B
+2203006E2B010071370000754800007A5B00007C7100007A8B000079C00000
+79C3000079C3000079C300007AC30015480000154800001548000015480000
+1548000015490000164A0000164B0000164C0000164D0000164E0000164E00
+00164F00001650000014530000115800010C5D00030660000601640208006C
+0A0800751406007D1C020083240000883000008C41000090540000946A0000
+9287000092BC000093D1000093D1000093D1000093D1001652000016520000
+16520000165200001652000016530000175400001755000017560000175700
+001758000017590000175A0000175B0000155F0000126500000E6B00010A71
+000305770005017F01070087080400930E0100A1160000AE210000B8300000
+C1460000CB5E0000D27C0000CEB00000CDED0000CDEE0000CEEE0000CEEE00
+175E0000175E0000175E0000175E0000175E0000175F000017600000176100
+00176200001763000017640000176500001765000017650000166900001370
+0000107700000D7E00000A860000068E00000297000200A5030000BB090000
+D7130000F2200000FF350000FF530000FF700000FF9A0000FFFF0000FFFF00
+00FFFF0000FFFF001765000017650000176500001765000017650000176500
+00176500001765000017650000176500001765000017650000176500001765
+00001669000013700000107700000D7E00000A860000068E00000297000200
+A4030100B9090000D4120000EF1E0000FF310000FF4F0000FF6B0000FF8D00
+00FFFF0000FFFF0000FFFF0000FFFF00>
+<3A000D003A000D003A000D003A000D003A000D003A000D003A000D003A000D
+003A000D003A000D003A000D003A000D003A000D003A000D003A0010003A00
+16003C001C003F00240042002F0045003D004A004B004D005C004F006B004F
+007B004D008A004D009B004E00AE004E00AE004E00AE004E00AE004E00AE00
+4E00AE004E00AE003A000D003A000D003A000D003A000D003A000D003A000D
+003A000D003A000D003A000D003A000D003A000D003A000D003A000D003A00
+0D003A0010003A0016003C001C003F00240042002F0045003C004A004B004D
+005B004F006B004F007A004D0089004D009A004E00AE004E00AE004E00AE00
+4E00AE004E00AE004E00AE004E00AE003A000D003A000D003A000D003A000D
+003A000D003A000D003A000D003A000D003A000D003A000D003A000D003A00
+0D003A000D003A000D003A0010003A0016003C001C003F00240042002E0045
+003C0049004B004D005B004F006B004F007A004D0089004D009A004E00AE00
+4E00AE004E00AE004E00AE004E00AE004E00AE004E00AE003A000D003A000D
+003A000D003A000D003A000D003A000D003A000D003A000D003A000D003A00
+0D003A000D003A000D003A000D003A000D003A0010003A0016003C001C003F
+00240041002E0045003C0049004A004D005A004F006A004F007A004D008900
+4D0099004E00AE004E00AE004E00AE004E00AE004E00AE004E00AE004E00AE
+003A000D003A000D003A000D003A000D003A000D003A000D003A000D003A00
+0D003A000D003A000D003A000D003A000D003A000D003A000D003A0010003A
+0016003C001C003F00230041002E0045003C0049004A004D005A004F006A00
+4F0079004D0088004D0098004D00AD004E00AE004E00AE004E00AE004E00AE
+004E00AE004E00AE003A000D003A000D003A000D003A000D003A000D003A00
+0D003A000D003A000D003A000D003A000D003A000D003A000D003A000D003A
+000D003A0010003A0016003C001C003F00230041002E0045003B0049004A00
+4D005A004F0069004F0079004E0087004D0097004D00AC004E00AE004E00AE
+004E00AE004E00AE004E00AE004E00AE003A000D003A000D003A000D003A00
+0D003A000D003A000D003A000D003A000D003A000D003A000D003A000D003A
+000D003A000D003A000D003A0010003A0016003C001C003F00230041002E00
+45003B00490049004D0059004F0069004F0078004E0087004D0097004D00AB
+004D00AE004C00AF004A00AF004900B0004900B0004800B1003A000D003A00
+0D003A000D003A000D003A000D003A000D003A000D003A000D003A000D003A
+000D003A000D003A000D003A000D003A000D003A0010003A0016003C001C00
+3F00230042002D0045003B004A0049004E0058004F0068004C007700490085
+00460096004400B0004200B6004100B7004000B8004000B8003F00B9003F00
+B9003A000D003A000D003A000D003A000D003A000D003A000D003A000D003A
+000D003A000D003A000D003B000D003B000D003B000D003C000D003C001000
+3C0016003E001C004100230044002D00440039004500460045005400440065
+00420074003F0083003C0095003B00B3003A00BD003900BE003800BF003800
+BF003700BF003700C0003B000D003B000D003B000D003B000D003B000D003B
+000D003B000D003C000D003C000D003D000D003D000D003D000D003E000D00
+3E000D003E000F003E00150040001C003D0021003A00280039003400390041
+0039004F00380061003700710035008100330094003300B4003300C2003200
+C2003100C2003000C2003000C2003000C2003D000D003D000D003D000D003D
+000D003D000D003D000D003E000D003E000D003F000C003F000C003F000C00
+40000C0040000C0040000C003F000E003A0013003600180033001E00300025
+012F0030012E003C002D004B002C005B002B006B002A007D002A0091002B00
+B0002B00C1002A00C1002900C1002900C1002900C0002800C00040000C0040
+000C0040000C0040000C0040000C0040000C0040000C0041000C0041000C00
+42000C0042000C0042000C0043000C003D000A0037000B0031000F012D0015
+012A001B022700230326002C02250038022300460121005500210065012100
+760022008B002300A9002300BC002300BB002200BB002100BA002100BA0021
+00B90042000C0042000C0042000C0042000C0042000C0043000C0043000C00
+44000C0044000C0044000B0045000B0040000A003A000800340006002E0007
+0128000C032400120421001A06200022061E002A061C0034051A0042051900
+51051800600418007003190083021A009E011B00B1011A00B0011A00AF0119
+00AE011900AE011900AD0145000B0045000B0045000B0045000B0045000B00
+45000B0046000B0046000B0047000B0045000A003E00080037000600310004
+002B00030125000403200009071D0010081900180A1700200B1600290B1300
+320B11003E0B0F004C0B0F005B0B0E006A0A0F007B08110091051200A40411
+00A3051000A2051000A2050F00A1050F00A10548000A0048000A0048000A00
+48000A0048000A0048000A0049000A0049000A00430008003B000600340004
+012C00020227010102240201011F0101051900050A14000D0D1100150F0E00
+1E100B00251208002D12060038110500451104015411040164100300740F05
+00870C0600990A0500980B0500970B0400970B0400970B0400970B4B000900
+4B0009004B0009004B0009004B0009004B0009004A000800410006003A0003
+012F0001022A0201022603000123040001200500011B0500041302020C0B00
+071107001013040119140203211300042912000534100006410F0007500F00
+07600E0007700D0007820B0006930A0007930A000792090008920900089209
+000892094B0007004B0007004B0007004B0007004B00070049000600400004
+00350001032D0200022904000024050000210600001E0800001B0900001709
+00030E06000C0302001300050E1300081811000A200E000C280C000D340A00
+0E4109000F4F08000F5E07000F6D06000F7F05000F90040010900300108F03
+00118F0300118F0200118F0241000201410002014100020141000201410002
+0140000202330200022D04000027060000230800001F0900001C0A0000190B
+0001160C0001120D0003090B000B000A0410000D0F0D000F180A00111F0700
+132905001435030014410300144E0300145C0300146C0200147D0200149002
+00149002001490020014900200149002001490023504000135040001350400
+013504000135040001330500012C07000026090000210A00001D0C0000190D
+0000160E0001140F0001111100010E110002051100070012060900140F0600
+14160500151E0400162803001734030017400300174D0300175B0300176A03
+00177C020017900200179102001791020017910200179102001791022C0900
+002C0900002C0900002C0900002C0900002A0A0000240B00001F0D00001B0F
+00001710000114110000121300000F1400000D150000091600010415000400
+15050700160D060017140500181C0400192603001A3203001A3E03001A4B03
+001A5903001A6903001A7A02001A8F02001A9202001A9202001A9202001A92
+02001A9203230E0000230E0000230E0000230E0000230E0000220E00001D10
+00001911000115130000121500000F1600000C1700000B1800000B1800000A
+180000051800040017040700190B0600191206001A1A05001C2504001D3103
+001E3D03001E4A03001E5703001E6703001E7903001D8E02001D9403001D94
+03001D9403001D9403001D94031C1200001C1200001C1200001C1200001C12
+00001B1300001715000013170000101800000D1900000C1A00000C1A00000C
+1A00000C1B00000C1B0000061A000300190208001B0906001C1106001D1806
+001F230400212F0300223B030022480300225603002265030022770300218D
+02002197020021970200219702002197020021970216180000161800001618
+0000161800001618000015180000111A00000E1C00000D1C00000D1D00000D
+1D00000D1D00000D1D00000D1E00000D1E0000081E0002011C0108001E0807
+00200F06002117060023210500252D0300263A030027460300275403002864
+030028760200268C0200259A0200259A0200259A0200259A0200259A02101D
+0000101D0000101D0000101D0000101D00000F1E00000E1F00000E1F00000E
+1F00000E2000000E2000000E2000000E2100000E2100000E2100000A210001
+021F00080020060800240E060025160600281F05002A2A04002C3703002D44
+03002E5203002F6203002E7402002C8A02002B9D02002B9D02002B9D02002B
+9D02002B9D020F2200000F2200000F2200000F2200000F2200000F2200000F
+2200000F2300000F2300000F2300000F2400000F2400000F24000010250000
+0F2500000B260000042400070025050800290D07002C1505002E1D05003027
+040032330300344102003550020037610200377302003489010032A2010032
+A2010032A2010032A2010032A2011026000010260000102600001026000010
+26000010260000102600001027000010270000102800001028000011290000
+11290000112A0000112A00000D2B0000062B0006012A0309002E0B07003314
+0600361C050037240400392F03003C3E03003E4E0200405F0200417201003F
+8701003CA700003CA700003CA700003CA700003CA700112B0000112B000011
+2B0000112B0000112B0000112B0000112C0000112D0000112D0000122E0000
+122E0000122F0000122F000012300000123000000E32000008320004013102
+0900350908003B1206003F1A050041220400432C0300453A0300494A02004C
+5D01004D7000004C86000049AC000049AD000049AD000049AD000049AD0012
+31000012310000123100001231000012310000123200001232000012330000
+133400001334000013350000133600001336000013370000133700000F3A00
+000A3A00030239000A003D060900440F07004B1805004F2004005129030052
+360200554601005A5A00005D6E00005D8301005AA7010059B3010059B30100
+5AB301005AB301133900001339000013390000133900001339000013390000
+143A0000143B0000143C0000143D0000143D0000143E0000143F0000143F00
+0014400000114300000C450002054500070048030A00500C0800581606005E
+1F04006127030063320100664100006B5500006F6900006F8000006EA30100
+6CBC00006DBC00006DBC00006DBC0015420000154200001542000015420000
+15420000154200001543000015440000154500001546000015470000154800
+001549000015490000164A0000124E00000E5300020955000502570109005E
+080900671207006F1C050074230200782D00007C3C0000804E000084630000
+847B000082A1000082C9000083C9000083C9000083C900164D0000164D0000
+164D0000164D0000164D0000164D0000164E0000164F000016500000165100
+001652000016530000165400001754000017550000145B0000106000010B65
+0003066A0006017002080078090600811203008B1A00009323000098310000
+9E440000A35A0000A8730000A59B0000A8D90000A8D90000A8D90000A9D900
+175800001758000017580000175800001758000017590000175A0000175B00
+00175C0000175D0000175E0000175F00001760000017600000176100001468
+0000116F00000E7600000B7E000107860001038F0002009A010200AC060000
+C80D0000E6190000FF270000FF470000FF620000FF860000FFFF0000FFFF00
+00FFFF0000FFFF001765000017650000176500001765000017650000176500
+00176500001765000017650000176500001765000017650000176500001765
+000017650000156B0000127200000F7A00000C810000088900000591000101
+9C010200AB050000C60C0000E3180000FD250000FF430000FF5E0000FF8000
+00FFE70000FFFF0000FFFF0000FFFF00>
+<3A000D003A000D003A000D003A000D003A000D003A000D003A000D003A000D
+003A000D003A000D003A000D003A000D003A000D003A000D003A000D003A00
+13003B0019003D001F004000280043003500470043004C0053004E0064004F
+0074004E0084004D0094004D00A9004E00AE004E00AE004E00AE004E00AE00
+4E00AE004E00AE003A000D003A000D003A000D003A000D003A000D003A000D
+003A000D003A000D003A000D003A000D003A000D003A000D003A000D003A00
+0D003A000D003A0013003B0019003D001F004000280043003500470043004C
+0053004E0064004F0073004E0083004D0093004D00A8004E00AE004E00AE00
+4E00AE004E00AE004E00AE004E00AE003A000D003A000D003A000D003A000D
+003A000D003A000D003A000D003A000D003A000D003A000D003A000D003A00
+0D003A000D003A000D003A000D003A0013003B0019003D001F004000280043
+003500470043004C0053004E0064004F0073004E0083004D0093004D00A700
+4E00AE004E00AE004E00AE004E00AE004E00AE004E00AE003A000D003A000D
+003A000D003A000D003A000D003A000D003A000D003A000D003A000D003A00
+0D003A000D003A000D003A000D003A000D003A000D003A0013003B0019003D
+001F004000280043003500470043004B0052004E0063004F0073004E008200
+4D0092004D00A6004E00AE004E00AE004E00AE004E00AE004E00AE004E00AE
+003A000D003A000D003A000D003A000D003A000D003A000D003A000D003A00
+0D003A000D003A000D003A000D003A000D003A000D003A000D003A000D003A
+0013003B0019003D001F004000280043003400470042004B0052004E006300
+4F0072004E0082004D0091004D00A5004E00AE004E00AE004E00AE004E00AE
+004E00AE004E00AE003A000D003A000D003A000D003A000D003A000D003A00
+0D003A000D003A000D003A000D003A000D003A000D003A000D003A000D003A
+000D003A000D003A0013003B0019003D001F00400027004300340047004200
+4B0051004E0062004F0072004E0081004D0091004D00A4004E00AE004E00AE
+004E00AE004E00AE004E00AE004E00AE003A000D003A000D003A000D003A00
+0D003A000D003A000D003A000D003A000D003A000D003A000D003A000D003A
+000D003A000D003A000D003A000D003A0012003B0018003D001F0040002700
+43003400470042004B0051004E0062004F0071004E0081004D0090004B00A4
+004A00B0004800B1004700B2004600B2004500B3004400B3003A000D003A00
+0D003A000D003A000D003A000D003A000D003A000D003A000D003A000D003A
+000D003A000D003A000D003A000D003A000D003A000D003A0012003A001800
+3D001F004000270043003300470041004B0050004A0061004800700045007F
+0041008F003F00A6003E00B8003C00B9003C00BA003B00BB003A00BC003A00
+BC003A000D003A000D003A000D003A000D003A000D003A000D003A000D003A
+000D003A000D003A000D003A000D003A000D003A000D003A000D003A000D00
+3A0012003A0018003D001E003F0027003D0031003D003E003E004C003D005E
+003C006E0039007D0036008E003500A9003500C1003400C1003300C2003200
+C2003200C2003100C3003A000D003A000D003A000D003A000D003A000D003A
+000D003A000D003A000D003A000D003A000D003A000D003A000D003A000D00
+3A000D003A000D003A0012003800170035001D003200240031002E0031003B
+003000490030005A002E006A002D007B002C008E002C00AA002D00C5002C00
+C5002B00C5002B00C5002A00C5002A00C5003A000D003A000D003A000D003A
+000D003A000D003A000D003A000D003A000D003A000D003A000D003A000D00
+3A000D003A000D003A000D0037000C00320010002E0015002B001B00290022
+0028002B00270037002500460024005600230065002300770023008B002400
+A7002600C4002500C3002400C3002400C3002300C3002300C3003A000D003A
+000D003A000D003A000D003A000D003A000D003A000D003A000D003A000D00
+3B000D003B000D003C000D0039000C0034000A002F0009002A000C00270012
+01240019012200210121002901200034011E0042001C0051001B0061011B00
+71001B0085001D00A0001F00BE001E00BD001D00BC001D00BB001C00BB001C
+00BA003C000D003C000D003C000D003C000D003C000D003C000D003C000D00
+3D000D003D000D003E000D003D000C0037000A00310009002B000700270006
+0023000A02200010021D0018031C0020031A0028031900320317003E031400
+4D0314005C0313006B0214007D01150093001700B1001600B0001600AF0015
+00AE001500AD001400AD003F000C003F000C003F000C003F000C003F000C00
+3F000C003F000C0040000C0040000C003B000B00340009002E000700280006
+0024000500200004021D00080419000F051600170715001F07130027071000
+30070E003B070C0048080C0056070B0065070B0075050D0088030F00A2020E
+00A1020D00A0020D009F020C009E020C009E0242000C0042000C0042000C00
+42000C0042000C0042000C0042000C0041000B003A000900310007002A0005
+0025000401200003021D0001031B0000041700050612000C090F00140B0C00
+1D0C0900240D07002B0D0500350D0300420D0301500C03015F0B02016E0A03
+017F0904009707030096070300960702009507020195070201950745000B00
+45000B0045000B0045000B0045000B0045000B0040000A00370007002E0005
+0028000301220002021F0101031C0200031A03000218040001120202070A00
+060D0600100E0301190F0103200E0004270D0005320B00063F0A00074C0900
+075B0800086A0700077A0600068F05000790040008900400088F0400088F03
+00098F033A0006003A0006003A0006003A0006003A0006003A000600350005
+002C00030125010102210200021E0300021B04000119050001160600011407
+00010D0600070201001000050D0E0007170C00091F09000B2706000C320400
+0D3E03000E4B02000E5902000E6802000D7701000D8B02000C8E02000D8E02
+000D8E02000D8E02000D8E022E0002022E0002022E0002022E0002022E0002
+022E0002022A01010224020001200400011C0600011A070001170800011409
+0001110A00020F0B0001080B0006000A040B000C0E08000E1705000F1E0300
+1027020010310200103C0200104903001057020010660200107602000F8802
+000F8E02000F8E02000F8E02000F8E02000F8E022604000026040000260400
+00260400002604000026040000240500001F0700001B080000180A0001140B
+0001110C00010F0D00010D0F00010B10000004100003000F050600100D0600
+10150500111C04001225030013300200133B02001348030013550300136402
+001275020012870200128F0200128F0200128F0200128F0200128F02200800
+0020080000200800002008000020080000200800001E090000190B0000150C
+0001120E00010F0F00010D1100000A12000009130000091300000613000200
+12030600120B060013130500141A040015230300162E030016390300164603
+00165303001663030015730200158602001590020015900200159002001590
+02001590021A0D00001A0D00001A0D00001A0D00001A0D00001A0D0000170E
+0001140F0001101100000D1300000A1400000A1400000A1500000A1500000A
+15000007150002021502050015090600151006001618050017210400192C03
+00193803001944030019520300196103001971030019850200199202001992
+02001992020019920200199202141200001412000014120000141200001412
+000014120000121300000E1500000B1600000B1600000B1700000B1700000B
+1700000B1700000B18000008170001021701060017070600180E0600191605
+001A1F04001C2A03001D3603001D4303001D5003001D5F03001D7003001D83
+02001C9403001C9403001C9403001D9403001D94030E1700000E1700000E17
+00000E1700000E1700000E1700000C1800000C1800000C1900000C1900000C
+1900000C1A00000C1A00000C1A00000C1A00000A1A00010419010500190507
+001B0C06001C1406001D1D05001F2704002134030021410300214E0300225D
+0300226E030021820200209602002096020020960200209602002096020C1B
+00000C1B00000C1B00000C1B00000C1B00000C1B00000C1B00000D1B00000D
+1C00000D1C00000D1C00000D1D00000D1D00000D1D00000D1D00000B1E0000
+051C0005001C0308001F0B060020120600211B06002425040025320300263F
+0300274C0300275B0300276C03002681020025990200259902002599020025
+9902002599020E1E00000E1E00000E1E00000E1E00000E1E00000E1E00000E
+1E00000E1F00000E1F00000E1F00000E2000000E2000000E2000000E210000
+0F2100000D2100000720000401200208002209070025110600261906002923
+05002B3003002C3D03002D4A03002E5903002F6A02002E7F02002B9C02002B
+9D02002B9D02002B9D01002B9D010F2200000F2200000F2200000F2200000F
+2200000F2200000F2200000F2300000F2300000F2400000F2400000F240000
+1025000010250000102500000E260000092600030225010800270708002B10
+06002D1805002F210500322B03003339030035470200375702003869020036
+7D0100339A010033A2010033A2010033A2010033A201102700001027000010
+27000010270000102700001027000010270000102800001028000011290000
+11290000112A0000112A0000112A0000112B00000F2C00000B2C0002042C01
+07002C050900320E070036170500381F05003A2804003C3403003E44020041
+55020043680100427C01003F9800003EA800003EA800003EA800003EA80011
+2D0000112D0000112D0000112D0000112D0000112D0000112D0000122E0000
+122E0000122F00001230000012300000123100001231000012320000113300
+000C340001063300060034030A00390C080040150500431D04004525040047
+300300494002004E52010051660000517A00004E9500004DAE00004DAE0000
+4DAE00004DAE00133400001334000013340000133400001334000013340000
+13340000133500001336000013360000133700001338000013380000133900
+00133A0000123B00000E3D0001083D0005003D010B00430909004B12060052
+1B040055230300562D0300583B01005D4D0000626200006377000061920100
+5FB600005FB600005FB600005FB600143C0000143C0000143C0000143C0000
+143C0000143C0000143D0000143E0000143F00001440000014400000144100
+0015420000154300001543000014450000104900000B4B0003044B00080050
+050A00590E070061190600662104006A2A02006C37000070480000755C0000
+77720000768F000074C0000075C0000075C0000075C0001547000015470000
+154700001547000015470000154700001547000015490000164A0000164B00
+00164C0000164C0000164D0000164E0000164F000015510000125600000D5A
+0002085E0005016101090069090800721306007A1B030080240100852F0000
+894000008D540000916B00008F8A000090CE000090D0000090D0000090D000
+16530000165300001653000016530000165300001653000016530000175500
+0017560000175700001758000017590000175A0000175A0000175B0000165D
+0000136400000F6A00010B71000207770004027E00060087060400920C0100
+A1130000AF1E0000BB2D0000C5440000D15E0000D87E0000D1C50000D2F100
+00D2F20000D3F2001760000017600000176000001760000017600000176000
+00176000001762000017630000176400001765000017650000176500001765
+00001765000017670000136E0000107500000D7D00000A840000078C000003
+95000100A2030100B7080000D3120000EF1E0000FF330000FF520000FF7300
+00FFAC0000FFFF0000FFFF0000FFFF00>
+<3A000D003A000D003A000D003A000D003A000D003A000D003A000D003A000D
+003A000D003A000D003A000D003A000D003A000D003A000D003A000D003A00
+10003A0016003C001C003F00230041002E0045003C004A004B004D005C004F
+006D004E007D004D008D004D00A1004E00AE004E00AE004E00AE004E00AE00
+4E00AE004E00AE003A000D003A000D003A000D003A000D003A000D003A000D
+003A000D003A000D003A000D003A000D003A000D003A000D003A000D003A00
+0D003A000D003A000F003A0015003C001C003F00230041002E0045003C0049
+004B004D005C004F006C004E007D004D008D004D00A0004E00AE004E00AE00
+4E00AE004E00AE004E00AE004E00AE003A000D003A000D003A000D003A000D
+003A000D003A000D003A000D003A000D003A000D003A000D003A000D003A00
+0D003A000D003A000D003A000D003A000F003A0015003C001C003F00230041
+002D0045003C0049004A004D005B004F006C004E007C004D008C004D009F00
+4E00AE004E00AE004E00AE004E00AE004E00AE004E00AE003A000D003A000D
+003A000D003A000D003A000D003A000D003A000D003A000D003A000D003A00
+0D003A000D003A000D003A000D003A000D003A000D003A000F003A0015003C
+001B003F00230041002D0045003B0049004A004D005B004F006B004E007C00
+4D008B004D009F004E00AE004E00AE004E00AE004E00AE004E00AE004E00AE
+003A000D003A000D003A000D003A000D003A000D003A000D003A000D003A00
+0D003A000D003A000D003A000D003A000D003A000D003A000D003A000D003A
+000F003A0015003C001B003E00220041002D0045003B0049004A004D005A00
+4F006B004F007B004D008B004D009E004E00AE004E00AE004E00AE004E00AE
+004E00AE004E00AE003A000D003A000D003A000D003A000D003A000D003A00
+0D003A000D003A000D003A000D003A000D003A000D003A000D003A000D003A
+000D003A000D003A000F003A0015003C001B003E00220041002D0044003B00
+490049004D005A004F006A004F007A004D008A004D009D004E00AE004E00AE
+004E00AE004E00AE004E00AE004D00AE003A000D003A000D003A000D003A00
+0D003A000D003A000D003A000D003A000D003A000D003A000D003A000D003A
+000D003A000D003A000D003A000D003A000F003A0015003B001B003E002200
+41002C0044003A00490049004D0059004F006A004E007A004A00890047009C
+004600B2004400B3004300B4004200B5004100B6004000B6003A000D003A00
+0D003A000D003A000D003A000D003A000D003A000D003A000D003A000D003A
+000D003A000D003A000D003A000D003A000D003A000D003A000F003A001500
+3B001B003E00220041002C0044003A00450047004600570044006800420078
+003E0088003C009E003A00BC003900BD003800BE003700BE003700BF003600
+BF003A000D003A000D003A000D003A000D003A000D003A000D003A000D003A
+000D003A000D003A000D003A000D003A000D003A000D003A000D003A000D00
+3A000F003A0015003B001B003A002100380029003700360038004300380053
+0037006500340075003300870032009F003100C3003000C3003000C4002F00
+C4002F00C5002E00C5003A000D003A000D003A000D003A000D003A000D003A
+000D003A000D003A000D003A000D003A000D003A000D003A000D003A000D00
+3A000D003A000D003A000F0035001300310018002E001F002C0027002C0032
+002B0040002A00510029006100280072002700850028009E002900C5002900
+C5002800C5002700C5002700C5002600C5003A000D003A000D003A000D003A
+000D003A000D003A000D003A000D003A000D003A000D003A000D003A000D00
+3A000D003A000D003A000D0034000C002F000C002A0010002800160025001E
+00240026002300300021003E001F004E001E005E001E006F001E0083001F00
+9B002200C3002100C3002000C2002000C2001F00C2001F00C1003A000D003A
+000D003A000D003A000D003A000D003A000D003A000D003A000D003A000D00
+3A000D003A000D003A000D0035000C002E000A002A0009002600090023000F
+00200016001E001E001E0026001D002F001A003C0018004B0017005B001600
+6B0016007E00170095001A00B9001900BC001900BC001800BB001800BA0017
+00BA003A000D003A000D003A000D003A000D003A000D003A000D003A000D00
+3A000D003A000D003A000D0036000C002F000A002A00090025000800220008
+001F0008001D000F001A00170018001F001700270016002F0013003B001100
+4900100057000F0067000F00770010008B001200AB001200B0001100AF0011
+00AE001000AD001000AC003A000D003A000D003A000D003A000D003A000D00
+3A000D003A000D003A000D003A000D0031000B002B00090026000800220007
+001F0006001C0006001900060117000D021400150312001E02110025020E00
+2D030C0038030B0044030A0052030800600308006F03090080020A0099010A
+009F0109009E0109009D0108009C0108009B013C000D003C000D003C000D00
+3C000D003C000D003C000D003C000D0038000C002F00090029000800240007
+00200006001C00050119000402170003011500030211000B050E0013060B00
+1C0608002207060029080400330803003E0702014C0702025A060101690601
+01760501008D04020095040100940401019403010193030102930335000A00
+35000A0035000A0035000A0035000A0035000A0035000A002D000800270006
+00210005011D0004021A000202170102021501010214020101110201020900
+0608060010090301180901021F08000326070004300600053C040006490300
+07570200076501000773000006860000068F0100068F0100068F0100068F01
+00068F012A0006002A0006002A0006002A0006002A0006002A0006002A0006
+00250004011F0003021B000103180101031602000214030002110400010F05
+00020C0500030101000D00040D090006160600081D03000A2501000A2F0000
+0A3A01000A4701000A5401000A6300000971000009830100088E0100088E01
+00088E0100088E0100088E0121000202210002022100020221000202210002
+0221000202210002021D0000041A0200031703000214050001120600010F07
+00020C0800020A090001070A000100090405000A0D05000A1504000B1C0200
+0C2401000C2D01000C3901000C4501000C5201000C6101000C7001000B8101
+000B8E01000B8E01000B8E01000B8E01000B8E011C0300021C0300021C0300
+021C0300021C0300021C0300021C0300021904000116060001130700010F08
+00020C0A00020A0C0001070D0000070D0000060E0000000C0205000C0B0500
+0D1304000D1A03000E2202000F2C02000F3702000F4302000F5002000F5F02
+000E6E02000E8002000D8E02000D8E02000D8E02000D8E02000E8E02170700
+0117070001170700011707000117070001170700011707000114090001100A
+00020D0C00010A0E0001080F0000080F0000080F0000081000000810000000
+0E0005000E0906000F1105001019040010200300112A020012350200124103
+00114E0300115D0300116C0200117E0200118F0200118F0200118F0200118F
+0200118F02120C0001120C0001120C0001120C0001120C0001120C0001120C
+00010F0E00010B0F0000081100000811000009110000091100000912000009
+12000009120000021100040011070600120F060012160500131E0300142803
+0015330300153F0300154C0300155B0300146B0300147D0200149002001490
+020014900200149002001490020C1100000C1100000C1100000C1100000C11
+00000C1100000C1100000913000009130000091300000A1300000A1400000A
+1400000A1400000A1400000A140000041400030014040600140C0600151405
+00161C04001726030018310300183D0300184A03001859030018690300187B
+0200189102001891020018910200189102001891020A1500000A1500000A15
+00000A1500000A1500000A1500000A1500000A1500000A1500000B1600000B
+1600000B1600000B1700000B1700000B1700000B1700000617000301160307
+00170A060018120600191A05001A2304001C2F03001C3C03001C4903001C57
+03001C6703001C7A03001C9002001C9303001C9303001C9303001C93030B18
+00000B1800000B1800000B1800000B1800000B1800000B1800000B1800000B
+1800000C1900000C1900000C1900000C1900000C1A00000C1A00000C1A0000
+081A000201180107001A0806001B0F06001C1706001E210500202D0300203A
+030021470300215503002165030021780300208F0200209602002096020020
+9602002096020C1B00000C1B00000C1B00000C1B00000C1B00000C1B00000C
+1B00000D1B00000D1B00000D1C00000D1C00000D1C00000D1D00000D1D0000
+0D1D00000D1D0000091E0001021C0107001D0607001F0E060020150600221F
+0500242B04002638030026450300275303002763030027760200258D020025
+99020025990200259902002599020E1E00000E1E00000E1E00000E1E00000E
+1E00000E1E00000E1E00000E1F00000E1F00000E2000000E2000000E200000
+0E2100000E2100000F2100000F2100000B220000042000060020050800230C
+060026140600271D05002A2704002C3503002D4203002E5003002F6103002F
+7402002D8C01002B9D01002B9E01002B9E01002B9E010F2300000F2300000F
+2300000F2300000F2300000F2300000F2300000F2300000F2300000F240000
+0F24000010250000102500001026000010260000102600000D270000062700
+050126030900290A07002D1306002F1B05003124040034300300353E020037
+4E0200395F020039720200368A010034A3000034A3000034A3000034A30010
+28000010280000102800001028000010280000102800001028000010280000
+11290000112A0000112A0000112B0000112B0000112C0000112C0000112C00
+000E2E0000082E0003022D0209003008080036110600391A05003B2204003D
+2C03003F3A0300424B0200455E0100467101004488000041A9000041A90000
+41A9000041A900122F0000122F0000122F0000122F0000122F0000122F0000
+122F0000122F00001230000012310000123100001232000012320000123300
+001334000013340000103600000B3600020336010800380609003F0E070045
+180500482004004A2903004C3502004F460100545A0100566F000055860000
+52B0000052B0000052B0000052B00013370000133700001337000013370000
+133700001337000013370000133800001338000013390000143A0000143B00
+00143B0000143C0000143D0000143D0000114000000D420001064200060043
+030A004B0B080053150600591E04005C2603005E3102006041000066550000
+696B00006982000067AE010067B9000067B9000067B9001441000014410000
+14410000144100001441000014410000144100001542000015430000154400
+00154500001545000015460000154700001548000015480000134C00000F50
+00010A53000403540108005A070900631107006B1B050071230200752D0000
+783C00007C4E000081640000807E00007FA900007FC700007FC700007FC700
+164D0000164D0000164D0000164D0000164D0000164D0000164D0000164E00
+00164F00001650000016510000165200001653000016530000175400001755
+000014590000115F00010D64000207690005026E010700760807007F110400
+8918000092210000982F00009D420000A25A0000A8740000A4A30000A7D900
+00A8D90000A8D900175A0000175A0000175A0000175A0000175A0000175A00
+00175A0000175B0000175C0000175D0000175E0000175F0000176000001761
+0000176200001763000015670000126F00000F7700000C7F00000987000005
+900000019A000200A9040000C50B0000E3180000FE260000FF470000FF6400
+00FF8B0000FFFF0000FFFF0000FFFF00>
+<3A000D003A000D003A000D003A000D003A000D003A000D003A000D003A000D
+003A000D003A000D003A000D003A000D003A000D003A000D003A000D003A00
+0D003A0012003A0018003D001F004000280043003500470043004C0054004E
+0065004F0076004E0087004D0099004E00AE004E00AE004E00AE004E00AE00
+4E00AE004E00AE003A000D003A000D003A000D003A000D003A000D003A000D
+003A000D003A000D003A000D003A000D003A000D003A000D003A000D003A00
+0D003A000D003A000D003A0012003A0018003D001E00400027004300340047
+0043004C0053004E0065004F0075004E0086004D0099004E00AE004E00AE00
+4E00AE004E00AE004E00AE004E00AE003A000D003A000D003A000D003A000D
+003A000D003A000D003A000D003A000D003A000D003A000D003A000D003A00
+0D003A000D003A000D003A000D003A000D003A0012003A0018003D001E0040
+00270043003400470043004C0053004E0064004F0075004E0085004D009800
+4E00AE004E00AE004E00AE004E00AE004E00AE004E00AE003A000D003A000D
+003A000D003A000D003A000D003A000D003A000D003A000D003A000D003A00
+0D003A000D003A000D003A000D003A000D003A000D003A000D003A0012003A
+0018003D001E004000270043003400470042004C0053004E0064004F007400
+4E0085004D0097004E00AE004E00AE004E00AE004E00AE004E00AE004E00AE
+003A000D003A000D003A000D003A000D003A000D003A000D003A000D003A00
+0D003A000D003A000D003A000D003A000D003A000D003A000D003A000D003A
+000D003A0012003A0018003D001E004000270043003400470042004B005200
+4E0064004F0074004E0084004D0096004E00AE004E00AE004E00AE004E00AE
+004E00AE004E00AE003A000D003A000D003A000D003A000D003A000D003A00
+0D003A000D003A000D003A000D003A000D003A000D003A000D003A000D003A
+000D003A000D003A000D003A0012003A0018003D001E004000270042003300
+470042004B0052004E0063004F0073004E0084004D0095004D00AD004E00AE
+004D00AE004B00AF004A00B0004900B0003A000D003A000D003A000D003A00
+0D003A000D003A000D003A000D003A000D003A000D003A000D003A000D003A
+000D003A000D003A000D003A000D003A000D003A0012003A0018003D001E00
+4000260042003300470041004B0051004E0063004B00720048008200440094
+004200B2004000B6003F00B7003E00B8003D00B9003C00BA003A000D003A00
+0D003A000D003A000D003A000D003A000D003A000D003A000D003A000D003A
+000D003A000D003A000D003A000D003A000D003A000D003A000D003A001200
+3A0018003D001E00400026004000310040003E0040004D00400060003E0070
+003B008000380094003700B8003600C0003500C0003400C1003300C2003300
+C2003A000D003A000D003A000D003A000D003A000D003A000D003A000D003A
+000D003A000D003A000D003A000D003A000D003A000D003A000D003A000D00
+3A000D003A0011003900170036001C003300230032002E0032003B0032004A
+0031005C002F006D002E007F002D0095002E00B9002D00C5002C00C5002B00
+C5002B00C5002A00C5003A000D003A000D003A000D003A000D003A000D003A
+000D003A000D003A000D003A000D003A000D003A000D003A000D003A000D00
+3A000D003A000D0037000D0032000F002E0014002B001A002800220028002B
+002700380025004700240058002200680022007C00230093002500B6002500
+C5002400C4002300C4002300C4002200C4003A000D003A000D003A000D003A
+000D003A000D003A000D003A000D003A000D003A000D003A000D003A000D00
+3A000D003A000D0037000D0031000B002C000A0028000C002500120022001A
+002100220020002A001F0036001C0045001A00550019006500190078001A00
+8E001D00B1001D00C0001C00C0001C00BF001B00BE001B00BE003A000D003A
+000D003A000D003A000D003A000D003A000D003A000D003A000D003A000D00
+3A000D003A000D0038000D0031000B002B000900270008002300080020000B
+001E0012001B001A001A0022001A002A001700350015004300130052001200
+620012007300130087001400A5001500B8001400B6001400B5001300B40013
+00B3003A000D003A000D003A000D003A000D003A000D003A000D003A000D00
+3A000D003A000D003A000D0033000B002C000A0027000800230008001F0007
+001D0007001A000B001800120016001B001400230013002A00110035000F00
+41000D004F000C005E000B006D000C007F000D0097000D00A9000D00A7000C
+00A6000C00A5000B00A4003A000D003A000D003A000D003A000D003A000D00
+3A000D003A000D003A000D0036000C002E000A0028000900230008001F0007
+001C000700190006001700050015000A001200120110001B000E0022000C00
+2A000A00330009003F0007004B0006005A01050068010500770006008B0006
+009A0006009A0005009900050099000500980033000B0033000B0033000B00
+33000B0033000B0033000B0033000B0032000B002A000900240008001F0007
+001C000700190006001600050014000500120004000F0009010D0012010A00
+1A0108002101060027010400300103003C0102014801020157010101650101
+01720001018200000193000001930000019300000193000001930027000800
+27000800270008002700080027000800270008002700080026000800210007
+001C000700190006001600050014000400110003000F0003010D0102010900
+0503060010030301170301011E030002240200032D0100043A000004450000
+045300000462000004700000037E0000039100000391000003910000039100
+00039100200006002000060020000600200006002000060020000600200006
+001F0006001A0005011700040114000301120102010F0102010D0201010A02
+0101080300010101000700030E030004150100051C010005230000062B0000
+063800000643000006510000065F0000066E0000057C000005900000059000
+00059000000590000005900019000302190003021900030219000302190003
+021900030219000302190003021501020213020101100301010D0300010A04
+00010705000105070000030800000107030200060C030006140300071B0200
+08210100082A00000835000008410000084E0000085C0000086B0000077A00
+00068E0100068E0100068E0100068E0100068E011502010215020102150201
+021502010215020102150201021502010214030101110400010D0500020A06
+000207080001040A0000050A0000050A0000050A0000020902020009090400
+09120400091903000A2001000B2801000B3301000B3F01000B4C01000B5A01
+000B6901000A790100098E0100098E0100098E0100098E0100098E01100600
+021006000210060002100600021006000210060002100600020F0600020B08
+0002080A0001050B0000060C0000060C0000060C0000060C0000060C000003
+0C0002000B0705000B0F05000C1703000C1E02000D2602000E3101000E3D02
+000D4A02000D5802000D6701000D7701000C8C01000C8E01000C8E02000C8E
+02000C8E020A0B00010A0B00010A0B00010A0B00010A0B00010A0B00010A0B
+0001090C0001070D0000070E0000070E0000070E0000070E0000070E000007
+0F0000070F0000040E0002000D0406000E0D06000E1505000F1C0300102502
+00112F0200113B0200104703001055030010650200107602000F8902000F8E
+02000F8E02000F8E02000F8E02080F0000080F0000080F0000080F0000080F
+0000080F0000080F0000080F00000810000008100000081000000810000008
+110000081100000811000009110000061100010010020600100A0600111205
+00121A040013230300142D0200143902001445030014530300146303001374
+02001388020013900200139002001390020013900209120000091200000912
+00000912000009120000091200000912000009120000091200000913000009
+13000009130000091300000A1300000A1400000A1400000814000102130205
+0013080600141006001518050016200400172B030017370300174303001751
+03001760030017720300178602001791020017910200179102001791020A15
+00000A1500000A1500000A1500000A1500000A1500000A1500000A1500000A
+1500000A1500000A1600000B1600000B1600000B1600000B1600000B170000
+09170001031600050016060700170D060018150500191D04001B2803001B35
+03001C4203001C4F03001C5E03001C7003001B8502001B9303001B9303001B
+9303001B93030B1800000B1800000B1800000B1800000B1800000B1800000B
+1800000B1800000B1800000B1800000C1900000C1900000C1900000C190000
+0C1A00000C1A00000B1A00010519000400190408001B0B06001B1206001D1B
+05001F2604002033030021400300214D0300215C0300216D03002083020020
+96020020960200209602002096020C1B00000C1B00000C1B00000C1B00000C
+1B00000C1B00000C1B00000C1B00000D1B00000D1C00000D1C00000D1C0000
+0D1D00000D1D00000D1D00000D1E00000C1E0000071D0003001C0208001E09
+070020110600211906002323040025300300263D0300274B0300285A030028
+6C0300278102002599020025990200259A0200259A020E1F00000E1F00000E
+1F00000E1F00000E1F00000E1F00000E1F00000E1F00000E1F00000E200000
+0E2000000E2100000E2100000F2100000F2100000F2200000E220000092200
+01012001080022070800250F0600271706002A2105002C2D03002E3A03002F
+48030030580300316A02002F7F02002C9E01002C9E01002C9E01002C9E010F
+2400000F2400000F2400000F2400000F2400000F2400000F2400000F240000
+0F240000102500001025000010260000102600001026000010270000102700
+000F2800000B2800010427000700280509002C0D070030160500321E050034
+28040036350300384402003A5502003C6802003A7D0100369E000036A40000
+36A4000037A400112A0000112A0000112A0000112A0000112A0000112A0000
+112A0000112A0000112A0000112B0000112C0000112C0000112D0000112D00
+00122E0000122E0000112F00000D30000007300005002F030A00340B08003A
+1405003D1D05003F2504004130030043400300475202004A670100497C0000
+469B000045AB000045AB000045AB0012310000123100001231000012310000
+12310000123100001231000012310000123200001233000013340000133400
+0013350000133600001336000013370000133700000F390000093A00030139
+010A003E080900461106004C1A04004F230400512D0300523A0100574D0000
+5C6300005D7900005B97010059B3010059B3010059B301143B0000143B0000
+143B0000143B0000143B0000143B0000143B0000143B0000143C0000143D00
+00143D0000143E0000143F0000144000001440000014410000144200001146
+00000C48000205480008004C040A00540D08005C17060062200400652A0200
+673601006C480000715D0000737400007293010070BE000070BE000071BE00
+15460000154600001546000015460000154600001546000015460000154600
+001548000015490000164A0000164B0000164B0000164C0000164D0000164E
+0000164F0000135400000E580002095C0005025F010800660708006F120600
+781B03007E230100832E0000874000008B5400008F6C00008D8F00008DCE00
+008ECF00008ECF001654000016540000165400001654000016540000165400
+0016540000175400001755000017560000175700001758000017590000175A
+0000175B0000175C0000175D000014630000106A00010C7000020877000303
+7F00060087040500920A0200A1110000B21B0000C12A0000CC420000DA5D00
+00E3810000D9F10000DAF70000DBF800>
+<3A000D003A000D003A000D003A000D003A000D003A000D003A000D003A000D
+003A000D003A000D003A000D003A000D003A000D003A000D003A000D003A00
+0D003A000F003A0015003B001B003E00220041002D0045003C004A004C004D
+005D004F006F004E0080004D0092004D00AA004E00AE004E00AE004E00AE00
+4E00AE004E00AE003A000D003A000D003A000D003A000D003A000D003A000D
+003A000D003A000D003A000D003A000D003A000D003A000D003A000D003A00
+0D003A000D003A000D003A000F003A0015003B001B003E00220041002D0045
+003C004A004B004D005D004F006E004E007F004D0091004D00A9004E00AE00
+4E00AE004E00AE004E00AE004E00AE003A000D003A000D003A000D003A000D
+003A000D003A000D003A000D003A000D003A000D003A000D003A000D003A00
+0D003A000D003A000D003A000D003A000D003A000F003A0015003B001B003E
+00220041002D0045003B0049004B004D005C004F006E004E007F004D009000
+4D00A7004E00AE004E00AE004E00AE004E00AE004E00AE003A000D003A000D
+003A000D003A000D003A000D003A000D003A000D003A000D003A000D003A00
+0D003A000D003A000D003A000D003A000D003A000D003A000D003A000E003A
+0015003B001B003E00220041002C0045003B0049004A004D005C004F006D00
+4E007E004D008F004D00A6004E00AE004E00AE004E00AE004E00AE004E00AE
+003A000D003A000D003A000D003A000D003A000D003A000D003A000D003A00
+0D003A000D003A000D003A000D003A000D003A000D003A000D003A000D003A
+000D003A000E003A0014003B001B003E00220041002C0044003B0049004A00
+4D005B004F006C004E007E004D008F004D00A5004E00AE004E00AE004E00AE
+004E00AE004E00AE003A000D003A000D003A000D003A000D003A000D003A00
+0D003A000D003A000D003A000D003A000D003A000D003A000D003A000D003A
+000D003A000D003A000D003A000E003A0014003B001A003E00210041002C00
+44003A00490049004D005B004F006C004E007D004D008E004C00A4004A00B0
+004800B1004700B2004600B2004400B3003A000D003A000D003A000D003A00
+0D003A000D003A000D003A000D003A000D003A000D003A000D003A000D003A
+000D003A000D003A000D003A000D003A000D003A000E003A0014003B001A00
+3E00210041002C0044003A00490049004900590048006B0045007B0041008C
+003E00A7003C00B9003B00BB003A00BC003900BD003900BE003A000D003A00
+0D003A000D003A000D003A000D003A000D003A000D003A000D003A000D003A
+000D003A000D003A000D003A000D003A000D003A000D003A000D003A000E00
+3A0014003B001A003D0021003A002900390036003A0044003A005500390067
+003600790034008C003300AA003200C2003100C3003000C3003000C4002F00
+C4003A000D003A000D003A000D003A000D003A000D003A000D003A000D003A
+000D003A000D003A000D003A000D003A000D003A000D003A000D003A000D00
+3A000D003A000E0036001300320018002F001E002D0027002C0032002C0041
+002B005200290063002800760028008B002900AA002A00C5002900C5002800
+C5002700C5002700C5003A000D003A000D003A000D003A000D003A000D003A
+000D003A000D003A000D003A000D003A000D003A000D003A000D003A000D00
+3A000D003A000D0035000C002F000B002B000F002800160025001D00240026
+002300300021003E001F004F001E005F001E0072001E0088002000A7002100
+C3002000C2001F00C2001F00C1001E00C1003A000D003A000D003A000D003A
+000D003A000D003A000D003A000D003A000D003A000D003A000D003A000D00
+3A000D003A000D0034000C002E000A00290009002500080022000E00200015
+001E001E001D0026001C002F0019003C0017004C0016005C0015006E001500
+820017009F001900BC001800BB001700BA001700B9001600B9003A000D003A
+000D003A000D003A000D003A000D003A000D003A000D003A000D003A000D00
+3A000D003A000D0035000C002E000A002900090024000800210007001E0007
+001C000E001900160017001E001600260015002F0012003B0010004A000F00
+59000E0069000E007B000F0093001100AF001000AE000F00AC000F00AB000E
+00AB003A000D003A000D003A000D003A000D003A000D003A000D003A000D00
+3A000D003A000D0038000D0030000B002900090024000800200007001D0007
+001A0006001800060016000E001300160111001F00100026000E002E000C00
+3A000A004700090055000800640008007400080087000900A00008009E0008
+009D0007009C0007009B0037000D0037000D0037000D0037000D0037000D00
+37000D0037000D0037000D0033000B002B00090025000800200007001D0007
+001A00060017000500150005001300040010000D010E0016010B001E000900
+250007002C010500380104004301030051010200600102016F0003017E0002
+009600020195000101950001019400010194002A0009002A0009002A000900
+2A0009002A0009002A0009002A0009002A00090027000800210007001D0007
+00190006001700050014000500120004000F0003000D0003010A000D020700
+160105001C010300220102012901010137000002410000024F0000025E0000
+026D0000017900000193000001930000019300000193000001930020000700
+200007002000070020000700200007002000070020000700200007001E0007
+001A0006001700050014000500110004000E0003000C0002000A0002000800
+010004000D010201140000011B000001210000012800000236000002400000
+024E0000025D0000026C000002770000019200000193000001930000019300
+00019300190006001900060019000600190006001900060019000600190006
+00190006001700060014000500110004000E0003000B000200090001000500
+0100020000000000000000010D000001140000011B00000120000002280000
+0235000002400000024D0000025C0000026B00000276000001900000019300
+00019300000193000001920013000400130004001300040013000400130004
+00130004001300040013000400120004000E0003010B000200080101000401
+00000102000001020000010200000102000000020A01000312010003190100
+031F00000427000004320000053E0000054B00000459000004680000047400
+00048C00000391000003910000039100000391000E0102010E0102010E0102
+010E0102010E0102010E0102010E0102010E0102010C020101090201010403
+00010204000002050000020500000205000002060000030600000005070200
+0510020005170200061E010007250000072F0000073B000007480000075600
+00076500000673000006870000058F0100058F0100058F0100058F01070400
+01070400010704000107040001070400010704000107040001070400010605
+00010307000003070000030800000408000004080000040900000409000004
+0900000108050300070E040008150300081C0200092401000A2D00000A3900
+000A45010009530100096200000971000008840100088E0100088E0100088E
+0100088E01040A0000040A0000040A0000040A0000040A0000040A0000040A
+0000040A0000050A0000050A0000050A0000050B0000050B0000050B000005
+0B0000050B0000060C0000010A0304000A0B05000A1304000B1B03000C2202
+000C2B01000D3701000C4302000C5102000C6001000C7001000B8201000B8E
+01000B8E01000B8E01000B8E01060C0000060C0000060C0000060C0000060C
+0000060C0000060C0000060C0000060C0000060D0000060D0000060D000007
+0D0000070E0000070E0000070E0000070E0000010D0004000D0806000D1105
+000E1804000E2003000F290200103402000F4002000F4E03000F5D02000F6D
+02000E8002000E8E02000E8E02000E8E02000E8E02070F0000070F0000070F
+0000070F0000070F0000070F0000070F0000070F0000080F0000080F000008
+10000008100000081000000810000008100000081100000811000003100004
+0010060600100E060011160500111E03001227030013320200133E0300134C
+0300135B0300136B0200127E0200128F0200128F0200128F0200128F020912
+00000912000009120000091200000912000009120000091200000912000009
+12000009120000091200000913000009130000091300000913000009130000
+0A140000051300030013030600130B060014130500151B0400162503001730
+0300173C0300174A03001758030017690300167C0200169102001791020017
+9102001791020A1500000A1500000A1500000A1500000A1500000A1500000A
+1500000A1500000A1500000A1500000A1500000A1600000B1600000B160000
+0B1600000B1600000B17000007160002011602060017090600171006001818
+0500192204001B2E03001B3A03001C4803001C5603001C6603001B7A03001B
+9303001B9303001B9303001B93030B1800000B1800000B1800000B1800000B
+1800000B1800000B1800000B1800000B1800000B1800000C1900000C190000
+0C1900000C1900000C1A00000C1A00000C1A0000091A000103190106001A06
+07001B0E06001C1606001E1F05001F2B040020380300214503002153030021
+640300217803002091020020960200209602002096020D1B00000D1B00000D
+1B00000D1B00000D1B00000D1B00000D1B00000D1B00000D1C00000D1C0000
+0D1C00000D1D00000D1D00000D1D00000D1E00000D1E00000E1E00000B1E00
+00041D0006001D040800200C060021140600231D0500252804002735030027
+430300285103002962030028760200268F0200269A0200269A0200269A020E
+2000000E2000000E2000000E2000000E2000000E2000000E2000000E200000
+0E2000000E2000000E2100000F2100000F2100000F2200000F2200000F2200
+000F2300000D230000062300040122030800240A070028120600291A06002C
+2404002E32030030400200314F020032600200327402002F8E01002E9F0100
+2E9F01002E9F01102500001025000010250000102500001025000010250000
+10250000102500001025000010260000102600001027000010270000102800
+001028000011290000112900000E2A0000092A000303290208002B08080030
+1006003319050035220500372C03003A3B03003C4B02003E5E02003F720100
+3C8B00003AA600003AA600003AA600112C0000112C0000112C0000112C0000
+112C0000112C0000112C0000112C0000112C0000112D0000122E0000122E00
+00122F0000122F0000123000001230000012310000103200000B3300020532
+01070034050900390E070040170500431F040044280400463503004A470200
+4E5B01004F7000004E8900004BAE00004BAE00004BAE001335000013350000
+13350000133500001335000013350000133500001335000013350000133600
+001337000013370000133800001339000013390000143A0000143B0000123C
+00000E3E0001073E0005003F020A00460A08004E140600551D040057260300
+593102005B41010061550000646C00006486000061B7000061B7000062B700
+14400000144000001440000014400000144000001440000014400000144000
+00144000001441000015420000154300001544000015450000154500001546
+00001547000014490000104D00010B5000030451000800560509005F0F0700
+681A06006E220300712C0100753B0000794E00007E6500007D8100007CB800
+007CC500007CC500164D0000164D0000164D0000164D0000164D0000164D00
+00164D0000164D0000164E0000164F00001650000016510000165200001652
+000016530000175400001755000015580000125E00000E6300020968000403
+6D000700750607007E0F04008817010092200000982E00009E410000A35A00
+00A8770000A6AF0000A8D90000A9DA00>
+] 4 {} bind dup dup dup ]
+/RenderingIntent (Perceptual)
+>>
+setcolorrendering
diff --git a/crd/prolog.ps b/crd/prolog.ps
new file mode 100644
index 0000000..5ed2b7d
--- /dev/null
+++ b/crd/prolog.ps
@@ -0,0 +1,78 @@
+%!PS
+%
+% $Header: /home/cvs/foo2zjs/crd/prolog.ps,v 1.3 2004/07/02 11:45:14 rick Exp $
+%
+% Copyright (C) 2004 Gerhard Fuernkranz
+%
+% 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.
+%
+
+% setup initial clipping,
+% redefine initclip to clip 4mm (approx 12pt) on each side
+
+/m2300wBorder 4
+ 25.4 div 72 mul def
+
+/m2300w_initclip {
+ initclip clippath pathbbox
+ m2300wBorder 2 mul sub 4 1 roll
+ m2300wBorder 2 mul sub 4 1 roll
+ m2300wBorder add 4 1 roll
+ m2300wBorder add 4 1 roll
+ rectclip
+} bind def
+
+<< /BeginPage { pop m2300w_initclip } bind >> setpagedevice
+
+
+% setup CIE based color rendering
+
+<< /UseCIEColor true >> setpagedevice
+
+revision 800 ge {
+
+ /DefaultGray
+ [ /CIEBasedA <<
+ /DecodeLMN [
+ { dup 0.03928 le
+ {12.92321 div}
+ {0.055 add 1.055 div 2.4 exp}
+ ifelse
+ } bind dup dup
+ ]
+ /MatrixLMN [0.412457 0.212673 0.019334
+ 0.357576 0.715152 0.119192
+ 0.180437 0.072175 0.950301]
+ /WhitePoint [0.9505 1.0 1.0890]
+ >> ] /ColorSpace defineresource pop
+
+ /DefaultRGB
+ [ /CIEBasedABC <<
+ /DecodeLMN [
+ { dup 0.03928 le
+ {12.92321 div}
+ {0.055 add 1.055 div 2.4 exp}
+ ifelse
+ } bind dup dup
+ ]
+ /MatrixLMN [0.412457 0.212673 0.019334
+ 0.357576 0.715152 0.119192
+ 0.180437 0.072175 0.950301]
+ /WhitePoint [0.9505 1.0 1.0890]
+ >> ] /ColorSpace defineresource setcolorspace
+
+} if
+
+
diff --git a/crd/screen1200.ps b/crd/screen1200.ps
new file mode 100644
index 0000000..5918b0e
--- /dev/null
+++ b/crd/screen1200.ps
@@ -0,0 +1,218 @@
+%!PS
+%
+% $Header: /home/cvs/foo2zjs/crd/screen1200.ps,v 1.1 2004/07/02 11:45:14 rick Exp $
+%
+% 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.
+%
+
+<<
+ /HalftoneType 5
+ /Magenta <<
+% w=68 h=2 strip=17 shift=16
+ /HalftoneType 3
+ /Width 68
+ /Height 34
+ /TransferFunction {0 max 1 min 0.8 exp} bind
+ /Thresholds <
+5f503a1e04233e8ac8ccb5926974a4dbf3faede6a87d6a9bb0d9c2874b290d13
+2f545c4e381a0720418cc4cfbb9463789fe0f7feebe4aa797099b1d5bf83472b
+0b15345ac6d1b9956576a1def5fceae2ac7b6e97b3d3bd81452d091632586152
+3c1c02254088cacdb7906772a3dcf1f8efe8a67f6c9daed7c08549270f113156
+5d4d36180622438ef3faede6a87d6a9bb0d9c2874b290d132f545c4e381a0720
+418cc4cfbb9463789fe0f7feebe4aa797099b1d5bf83472b0b15345a5f503a1e
+04233e8ac8ccb5926974a4dbb3d3bd81452d0916325861523c1c02254088cacd
+b7906772a3dcf1f8efe8a67f6c9daed7c08549270f1131565d4d36180622438e
+c6d1b9956576a1def5fceae2ac7b6e972f545c4e381a0720418cc4cfbb946378
+9fe0f7feebe4aa797099b1d5bf83472b0b15345a5f503a1e04233e8ac8ccb592
+6974a4dbf3faede6a87d6a9bb0d9c2874b290d134088cacdb7906772a3dcf1f8
+efe8a67f6c9daed7c08549270f1131565d4d36180622438ec6d1b9956576a1de
+f5fceae2ac7b6e97b3d3bd81452d0916325861523c1c02259fe0f7feebe4aa79
+7099b1d5bf83472b0b15345a5f503a1e04233e8ac8ccb5926974a4dbf3faede6
+a87d6a9bb0d9c2874b290d132f545c4e381a0720418cc4cfbb9463786c9daed7
+c08549270f1131565d4d36180622438ec6d1b9956576a1def5fceae2ac7b6e97
+b3d3bd81452d0916325861523c1c02254088cacdb7906772a3dcf1f8efe8a67f
+0b15345a5f503a1e04233e8ac8ccb5926974a4dbf3faede6a87d6a9bb0d9c287
+4b290d132f545c4e381a0720418cc4cfbb9463789fe0f7feebe4aa797099b1d5
+bf83472b0622438ec6d1b9956576a1def5fceae2ac7b6e97b3d3bd81452d0916
+325861523c1c02254088cacdb7906772a3dcf1f8efe8a67f6c9daed7c0854927
+0f1131565d4d36186974a4dbf3faede6a87d6a9bb0d9c2874b290d132f545c4e
+381a0720418cc4cfbb9463789fe0f7feebe4aa797099b1d5bf83472b0b15345a
+5f503a1e04233e8ac8ccb592ac7b6e97b3d3bd81452d0916325861523c1c0225
+4088cacdb7906772a3dcf1f8efe8a67f6c9daed7c08549270f1131565d4d3618
+0622438ec6d1b9956576a1def5fceae24b290d132f545c4e381a0720418cc4cf
+bb9463789fe0f7feebe4aa797099b1d5bf83472b0b15345a5f503a1e04233e8a
+c8ccb5926974a4dbf3faede6a87d6a9bb0d9c2873c1c02254088cacdb7906772
+a3dcf1f8efe8a67f6c9daed7c08549270f1131565d4d36180622438ec6d1b995
+6576a1def5fceae2ac7b6e97b3d3bd81452d091632586152bb9463789fe0f7fe
+ebe4aa797099b1d5bf83472b0b15345a5f503a1e04233e8ac8ccb5926974a4db
+f3faede6a87d6a9bb0d9c2874b290d132f545c4e381a0720418cc4cfefe8a67f
+6c9daed7c08549270f1131565d4d36180622438ec6d1b9956576a1def5fceae2
+ac7b6e97b3d3bd81452d0916325861523c1c02254088cacdb7906772a3dcf1f8
+bf83472b0b15345a5f503a1e04233e8ac8ccb5926974a4dbf3faede6a87d6a9b
+b0d9c2874b290d132f545c4e381a0720418cc4cfbb9463789fe0f7feebe4aa79
+7099b1d55d4d36180622438ec6d1b9956576a1def5fceae2ac7b6e97b3d3bd81
+452d0916325861523c1c02254088cacdb7906772a3dcf1f8efe8a67f6c9daed7
+c08549270f113156c8ccb5926974a4dbf3faede6a87d6a9bb0d9c2874b290d13
+2f545c4e381a0720418cc4cfbb9463789fe0f7feebe4aa797099b1d5bf83472b
+0b15345a5f503a1e04233e8af5fceae2ac7b6e97b3d3bd81452d091632586152
+3c1c02254088cacdb7906772a3dcf1f8efe8a67f6c9daed7c08549270f113156
+5d4d36180622438ec6d1b9956576a1deb0d9c2874b290d132f545c4e381a0720
+418cc4cfbb9463789fe0f7feebe4aa797099b1d5bf83472b0b15345a5f503a1e
+04233e8ac8ccb5926974a4dbf3faede6a87d6a9b325861523c1c02254088cacd
+b7906772a3dcf1f8efe8a67f6c9daed7c08549270f1131565d4d36180622438e
+c6d1b9956576a1def5fceae2ac7b6e97b3d3bd81452d0916418cc4cfbb946378
+9fe0f7feebe4aa797099b1d5bf83472b0b15345a5f503a1e04233e8ac8ccb592
+6974a4dbf3faede6a87d6a9bb0d9c2874b290d132f545c4e381a0720a3dcf1f8
+efe8a67f6c9daed7c08549270f1131565d4d36180622438ec6d1b9956576a1de
+f5fceae2ac7b6e97b3d3bd81452d0916325861523c1c02254088cacdb7906772
+7099b1d5bf83472b0b15345a5f503a1e04233e8ac8ccb5926974a4dbf3faede6
+a87d6a9bb0d9c2874b290d132f545c4e381a0720418cc4cfbb9463789fe0f7fe
+ebe4aa790f1131565d4d36180622438ec6d1b9956576a1def5fceae2ac7b6e97
+b3d3bd81452d0916325861523c1c02254088cacdb7906772a3dcf1f8efe8a67f
+6c9daed7c085492704233e8ac8ccb5926974a4dbf3faede6a87d6a9bb0d9c287
+4b290d132f545c4e381a0720418cc4cfbb9463789fe0f7feebe4aa797099b1d5
+bf83472b0b15345a5f503a1e6576a1def5fceae2ac7b6e97b3d3bd81452d0916
+325861523c1c02254088cacdb7906772a3dcf1f8efe8a67f6c9daed7c0854927
+0f1131565d4d36180622438ec6d1b995a87d6a9bb0d9c2874b290d132f545c4e
+381a0720418cc4cfbb9463789fe0f7feebe4aa797099b1d5bf83472b0b15345a
+5f503a1e04233e8ac8ccb5926974a4dbf3faede6452d0916325861523c1c0225
+4088cacdb7906772a3dcf1f8efe8a67f6c9daed7c08549270f1131565d4d3618
+0622438ec6d1b9956576a1def5fceae2ac7b6e97b3d3bd81381a0720418cc4cf
+bb9463789fe0f7feebe4aa797099b1d5bf83472b0b15345a5f503a1e04233e8a
+c8ccb5926974a4dbf3faede6a87d6a9bb0d9c2874b290d132f545c4eb7906772
+a3dcf1f8efe8a67f6c9daed7c08549270f1131565d4d36180622438ec6d1b995
+6576a1def5fceae2ac7b6e97b3d3bd81452d0916325861523c1c02254088cacd
+ebe4aa797099b1d5bf83472b0b15345a5f503a1e04233e8ac8ccb5926974a4db
+f3faede6a87d6a9bb0d9c2874b290d132f545c4e381a0720418cc4cfbb946378
+9fe0f7fec08549270f1131565d4d36180622438ec6d1b9956576a1def5fceae2
+ac7b6e97b3d3bd81452d0916325861523c1c02254088cacdb7906772a3dcf1f8
+efe8a67f6c9daed7>
+ >>
+ /Cyan <<
+% w=68 h=2 strip=17 shift=52
+ /HalftoneType 3
+ /Width 68
+ /Height 34
+ /TransferFunction {0 max 1 min 0.8 exp} bind
+ /Thresholds <
+658cd1d3f8edc25440224d819ba87427090613346eb1a17d491c3661b9e6f3de
+c894698acdd7fcebbd584125528597aa782b0f0415316cb0a379471a3a5cb7e4
+f5dbc490385fbbe8f1e0ca956788ccd9feeabf5a4323508799ac762d0d02162f
+6aaea47b45183c5db5e2f7dcc692638ecfd5faefc0563e204e839da672290b07
+113270b39f7f4b1e15316cb0a379471a3a5cb7e4f5dbc490658cd1d3f8edc254
+40224d819ba87427090613346eb1a17d491c3661b9e6f3dec894698acdd7fceb
+bd584125528597aa782b0f044e839da672290b07113270b39f7f4b1e385fbbe8
+f1e0ca956788ccd9feeabf5a4323508799ac762d0d02162f6aaea47b45183c5d
+b5e2f7dcc692638ecfd5faefc0563e20cdd7fcebbd584125528597aa782b0f04
+15316cb0a379471a3a5cb7e4f5dbc490658cd1d3f8edc25440224d819ba87427
+090613346eb1a17d491c3661b9e6f3dec894698ab5e2f7dcc692638ecfd5faef
+c0563e204e839da672290b07113270b39f7f4b1e385fbbe8f1e0ca956788ccd9
+feeabf5a4323508799ac762d0d02162f6aaea47b45183c5d6eb1a17d491c3661
+b9e6f3dec894698acdd7fcebbd584125528597aa782b0f0415316cb0a379471a
+3a5cb7e4f5dbc490658cd1d3f8edc25440224d819ba874270906133499ac762d
+0d02162f6aaea47b45183c5db5e2f7dcc692638ecfd5faefc0563e204e839da6
+72290b07113270b39f7f4b1e385fbbe8f1e0ca956788ccd9feeabf5a43235087
+f8edc25440224d819ba87427090613346eb1a17d491c3661b9e6f3dec894698a
+cdd7fcebbd584125528597aa782b0f0415316cb0a379471a3a5cb7e4f5dbc490
+658cd1d3f1e0ca956788ccd9feeabf5a4323508799ac762d0d02162f6aaea47b
+45183c5db5e2f7dcc692638ecfd5faefc0563e204e839da672290b07113270b3
+9f7f4b1e385fbbe8a379471a3a5cb7e4f5dbc490658cd1d3f8edc25440224d81
+9ba87427090613346eb1a17d491c3661b9e6f3dec894698acdd7fcebbd584125
+528597aa782b0f0415316cb072290b07113270b39f7f4b1e385fbbe8f1e0ca95
+6788ccd9feeabf5a4323508799ac762d0d02162f6aaea47b45183c5db5e2f7dc
+c692638ecfd5faefc0563e204e839da6bd584125528597aa782b0f0415316cb0
+a379471a3a5cb7e4f5dbc490658cd1d3f8edc25440224d819ba8742709061334
+6eb1a17d491c3661b9e6f3dec894698acdd7fcebc692638ecfd5faefc0563e20
+4e839da672290b07113270b39f7f4b1e385fbbe8f1e0ca956788ccd9feeabf5a
+4323508799ac762d0d02162f6aaea47b45183c5db5e2f7dc491c3661b9e6f3de
+c894698acdd7fcebbd584125528597aa782b0f0415316cb0a379471a3a5cb7e4
+f5dbc490658cd1d3f8edc25440224d819ba87427090613346eb1a17d0d02162f
+6aaea47b45183c5db5e2f7dcc692638ecfd5faefc0563e204e839da672290b07
+113270b39f7f4b1e385fbbe8f1e0ca956788ccd9feeabf5a4323508799ac762d
+40224d819ba87427090613346eb1a17d491c3661b9e6f3dec894698acdd7fceb
+bd584125528597aa782b0f0415316cb0a379471a3a5cb7e4f5dbc490658cd1d3
+f8edc2546788ccd9feeabf5a4323508799ac762d0d02162f6aaea47b45183c5d
+b5e2f7dcc692638ecfd5faefc0563e204e839da672290b07113270b39f7f4b1e
+385fbbe8f1e0ca953a5cb7e4f5dbc490658cd1d3f8edc25440224d819ba87427
+090613346eb1a17d491c3661b9e6f3dec894698acdd7fcebbd584125528597aa
+782b0f0415316cb0a379471a113270b39f7f4b1e385fbbe8f1e0ca956788ccd9
+feeabf5a4323508799ac762d0d02162f6aaea47b45183c5db5e2f7dcc692638e
+cfd5faefc0563e204e839da672290b07528597aa782b0f0415316cb0a379471a
+3a5cb7e4f5dbc490658cd1d3f8edc25440224d819ba87427090613346eb1a17d
+491c3661b9e6f3dec894698acdd7fcebbd584125cfd5faefc0563e204e839da6
+72290b07113270b39f7f4b1e385fbbe8f1e0ca956788ccd9feeabf5a43235087
+99ac762d0d02162f6aaea47b45183c5db5e2f7dcc692638eb9e6f3dec894698a
+cdd7fcebbd584125528597aa782b0f0415316cb0a379471a3a5cb7e4f5dbc490
+658cd1d3f8edc25440224d819ba87427090613346eb1a17d491c36616aaea47b
+45183c5db5e2f7dcc692638ecfd5faefc0563e204e839da672290b07113270b3
+9f7f4b1e385fbbe8f1e0ca956788ccd9feeabf5a4323508799ac762d0d02162f
+9ba87427090613346eb1a17d491c3661b9e6f3dec894698acdd7fcebbd584125
+528597aa782b0f0415316cb0a379471a3a5cb7e4f5dbc490658cd1d3f8edc254
+40224d81feeabf5a4323508799ac762d0d02162f6aaea47b45183c5db5e2f7dc
+c692638ecfd5faefc0563e204e839da672290b07113270b39f7f4b1e385fbbe8
+f1e0ca956788ccd9f5dbc490658cd1d3f8edc25440224d819ba8742709061334
+6eb1a17d491c3661b9e6f3dec894698acdd7fcebbd584125528597aa782b0f04
+15316cb0a379471a3a5cb7e49f7f4b1e385fbbe8f1e0ca956788ccd9feeabf5a
+4323508799ac762d0d02162f6aaea47b45183c5db5e2f7dcc692638ecfd5faef
+c0563e204e839da672290b07113270b3782b0f0415316cb0a379471a3a5cb7e4
+f5dbc490658cd1d3f8edc25440224d819ba87427090613346eb1a17d491c3661
+b9e6f3dec894698acdd7fcebbd584125528597aac0563e204e839da672290b07
+113270b39f7f4b1e385fbbe8f1e0ca956788ccd9feeabf5a4323508799ac762d
+0d02162f6aaea47b45183c5db5e2f7dcc692638ecfd5faefc894698acdd7fceb
+bd584125528597aa782b0f0415316cb0a379471a3a5cb7e4f5dbc490658cd1d3
+f8edc25440224d819ba87427090613346eb1a17d491c3661b9e6f3de45183c5d
+b5e2f7dcc692638ecfd5faefc0563e204e839da672290b07113270b39f7f4b1e
+385fbbe8f1e0ca956788ccd9feeabf5a4323508799ac762d0d02162f6aaea47b
+090613346eb1a17d491c3661b9e6f3dec894698acdd7fcebbd584125528597aa
+782b0f0415316cb0a379471a3a5cb7e4f5dbc490658cd1d3f8edc25440224d81
+9ba874274323508799ac762d0d02162f6aaea47b45183c5db5e2f7dcc692638e
+cfd5faefc0563e204e839da672290b07113270b39f7f4b1e385fbbe8f1e0ca95
+6788ccd9feeabf5a>
+ >>
+ /Yellow <<
+% w=12 h=6 strip=1 shift=0
+ /HalftoneType 3
+ /Width 12
+ /Height 6
+ /TransferFunction {0 max 1 min 0.8 exp} bind
+ /Thresholds <
+7138200e124366312a041c3ff3b3785889ccfdb07b6286d0e8be9b4da5deecc5
+9454a2da6a2e2707193c6d35230b1546faac7f5f82d3f6b7745b8dc8efc19051
+9ed7e5ba974aa9e1>
+ >>
+ /Default <<
+% w=24 h=6 strip=2 shift=12
+ /HalftoneType 3
+ /Width 24
+ /Height 12
+ /TransferFunction {0 max 1 min 0.8 exp} bind
+ /Thresholds <
+4c53657a9db0b8a99684615a4e55667c9fafb6a89886635c6f2c190b2a3e92cd
+e5f7d7c2712e1709294094cbe4f5d6c08a451e04103876bfddfbf0d488472002
+123778bddef9eed2b2a69a815f584a51687da2adb4a49b835e56484f6a7fa1ab
+8fc9e9f4dbc66d301a0e273a91c7e7f2d9c46c311c0c253c73bbe2fcecce8b43
+2205133574b9e0feebd08d41230715334e55667c9fafb6a89886635c4c53657a
+9db0b8a99684615a712e1709294094cbe4f5d6c06f2c190b2a3e92cde5f7d7c2
+88472002123778bddef9eed28a451e04103876bfddfbf0d4b4a49b835e56484f
+6a7fa1abb2a69a815f584a51687da2ad91c7e7f2d9c46c311c0c253c8fc9e9f4
+dbc66d301a0e273a74b9e0feebd08d412307153373bbe2fcecce8b4322051335>
+ >>
+>>
+
+/Default exch /Halftone defineresource
+sethalftone
+
+{0 max 1 min 0.8 exp} bind dup dup dup setcolortransfer
+
diff --git a/crd/screen2400.ps b/crd/screen2400.ps
new file mode 100644
index 0000000..95f655f
--- /dev/null
+++ b/crd/screen2400.ps
@@ -0,0 +1,357 @@
+
+/m2300_transfer {0 max 1 min 0.8 exp} bind def
+/m2300_transfer load dup dup dup setcolortransfer
+
+<<
+ /HalftoneType 5
+ /Cyan <<
+% w=136 h=2 strip=17 shift=104
+ /HalftoneType 3
+ /Width 136
+ /Height 34
+ /TransferFunction /m2300_transfer load
+ /Thresholds <
+787987bbc4d4e2ebfcf4ddcfbe99624b3f27223344597393a8b1a18d6c533117
+0c0b020710192f50678aa2b2a694715d43361b233b496598c1cedcf5fdf0e5d8
+c7b5837f767c85b6cad9e3effef6dacdc29a5f4f3d281f38415b708fa7b39e88
+6a512c160f09040612152b56698ba4b4a8916d5747321e25394d619cbfd0dbf7
+ffece7d5c5b8817d3c486097bcd1e0f2f8ede6d3c6b6807a777c86b7c5d3e4ee
+f9f1ded2bd9b644c40242033465c7496abb0a08e6b52301a1107030a0d182e55
+688aa3ada995725842371c293a4e639dc0cbdff0fbe9e8d7c8b9827b757e84ba
+c9d6e2eafaf3e1ccc3995f4a3e242135425a6f90aaae9f896d542a1613050108
+0e142d50668ca5afac926e5e45341d2612152b56698ba4b4a8916d5747321e25
+394d619cbfd0dbf7ffece7d5c5b8817d787987bbc4d4e2ebfcf4ddcfbe99624b
+3f27223344597393a8b1a18d6c5331170c0b020710192f50678aa2b2a694715d
+43361b233b496598c1cedcf5fdf0e5d8c7b5837f767c85b6cad9e3effef6dacd
+c29a5f4f3d281f38415b708fa7b39e886a512c160f090406425a6f90aaae9f89
+6d542a16130501080e142d50668ca5afac926e5e45341d263c486097bcd1e0f2
+f8ede6d3c6b6807a777c86b7c5d3e4eef9f1ded2bd9b644c40242033465c7496
+abb0a08e6b52301a1107030a0d182e55688aa3ada995725842371c293a4e639d
+c0cbdff0fbe9e8d7c8b9827b757e84bac9d6e2eafaf3e1ccc3995f4a3e242135
+cad9e3effef6dacdc29a5f4f3d281f38415b708fa7b39e886a512c160f090406
+12152b56698ba4b4a8916d5747321e25394d619cbfd0dbf7ffece7d5c5b8817d
+787987bbc4d4e2ebfcf4ddcfbe99624b3f27223344597393a8b1a18d6c533117
+0c0b020710192f50678aa2b2a694715d43361b233b496598c1cedcf5fdf0e5d8
+c7b5837f767c85b6c0cbdff0fbe9e8d7c8b9827b757e84bac9d6e2eafaf3e1cc
+c3995f4a3e242135425a6f90aaae9f896d542a16130501080e142d50668ca5af
+ac926e5e45341d263c486097bcd1e0f2f8ede6d3c6b6807a777c86b7c5d3e4ee
+f9f1ded2bd9b644c40242033465c7496abb0a08e6b52301a1107030a0d182e55
+688aa3ada995725842371c293a4e639d678aa2b2a694715d43361b233b496598
+c1cedcf5fdf0e5d8c7b5837f767c85b6cad9e3effef6dacdc29a5f4f3d281f38
+415b708fa7b39e886a512c160f09040612152b56698ba4b4a8916d5747321e25
+394d619cbfd0dbf7ffece7d5c5b8817d787987bbc4d4e2ebfcf4ddcfbe99624b
+3f27223344597393a8b1a18d6c5331170c0b020710192f50abb0a08e6b52301a
+1107030a0d182e55688aa3ada995725842371c293a4e639dc0cbdff0fbe9e8d7
+c8b9827b757e84bac9d6e2eafaf3e1ccc3995f4a3e242135425a6f90aaae9f89
+6d542a16130501080e142d50668ca5afac926e5e45341d263c486097bcd1e0f2
+f8ede6d3c6b6807a777c86b7c5d3e4eef9f1ded2bd9b644c40242033465c7496
+fcf4ddcfbe99624b3f27223344597393a8b1a18d6c5331170c0b020710192f50
+678aa2b2a694715d43361b233b496598c1cedcf5fdf0e5d8c7b5837f767c85b6
+cad9e3effef6dacdc29a5f4f3d281f38415b708fa7b39e886a512c160f090406
+12152b56698ba4b4a8916d5747321e25394d619cbfd0dbf7ffece7d5c5b8817d
+787987bbc4d4e2ebf8ede6d3c6b6807a777c86b7c5d3e4eef9f1ded2bd9b644c
+40242033465c7496abb0a08e6b52301a1107030a0d182e55688aa3ada9957258
+42371c293a4e639dc0cbdff0fbe9e8d7c8b9827b757e84bac9d6e2eafaf3e1cc
+c3995f4a3e242135425a6f90aaae9f896d542a16130501080e142d50668ca5af
+ac926e5e45341d263c486097bcd1e0f2a8916d5747321e25394d619cbfd0dbf7
+ffece7d5c5b8817d787987bbc4d4e2ebfcf4ddcfbe99624b3f27223344597393
+a8b1a18d6c5331170c0b020710192f50678aa2b2a694715d43361b233b496598
+c1cedcf5fdf0e5d8c7b5837f767c85b6cad9e3effef6dacdc29a5f4f3d281f38
+415b708fa7b39e886a512c160f09040612152b56698ba4b46d542a1613050108
+0e142d50668ca5afac926e5e45341d263c486097bcd1e0f2f8ede6d3c6b6807a
+777c86b7c5d3e4eef9f1ded2bd9b644c40242033465c7496abb0a08e6b52301a
+1107030a0d182e55688aa3ada995725842371c293a4e639dc0cbdff0fbe9e8d7
+c8b9827b757e84bac9d6e2eafaf3e1ccc3995f4a3e242135425a6f90aaae9f89
+c29a5f4f3d281f38415b708fa7b39e886a512c160f09040612152b56698ba4b4
+a8916d5747321e25394d619cbfd0dbf7ffece7d5c5b8817d787987bbc4d4e2eb
+fcf4ddcfbe99624b3f27223344597393a8b1a18d6c5331170c0b020710192f50
+678aa2b2a694715d43361b233b496598c1cedcf5fdf0e5d8c7b5837f767c85b6
+cad9e3effef6dacdc8b9827b757e84bac9d6e2eafaf3e1ccc3995f4a3e242135
+425a6f90aaae9f896d542a16130501080e142d50668ca5afac926e5e45341d26
+3c486097bcd1e0f2f8ede6d3c6b6807a777c86b7c5d3e4eef9f1ded2bd9b644c
+40242033465c7496abb0a08e6b52301a1107030a0d182e55688aa3ada9957258
+42371c293a4e639dc0cbdff0fbe9e8d743361b233b496598c1cedcf5fdf0e5d8
+c7b5837f767c85b6cad9e3effef6dacdc29a5f4f3d281f38415b708fa7b39e88
+6a512c160f09040612152b56698ba4b4a8916d5747321e25394d619cbfd0dbf7
+ffece7d5c5b8817d787987bbc4d4e2ebfcf4ddcfbe99624b3f27223344597393
+a8b1a18d6c5331170c0b020710192f50678aa2b2a694715d1107030a0d182e55
+688aa3ada995725842371c293a4e639dc0cbdff0fbe9e8d7c8b9827b757e84ba
+c9d6e2eafaf3e1ccc3995f4a3e242135425a6f90aaae9f896d542a1613050108
+0e142d50668ca5afac926e5e45341d263c486097bcd1e0f2f8ede6d3c6b6807a
+777c86b7c5d3e4eef9f1ded2bd9b644c40242033465c7496abb0a08e6b52301a
+3f27223344597393a8b1a18d6c5331170c0b020710192f50678aa2b2a694715d
+43361b233b496598c1cedcf5fdf0e5d8c7b5837f767c85b6cad9e3effef6dacd
+c29a5f4f3d281f38415b708fa7b39e886a512c160f09040612152b56698ba4b4
+a8916d5747321e25394d619cbfd0dbf7ffece7d5c5b8817d787987bbc4d4e2eb
+fcf4ddcfbe99624b777c86b7c5d3e4eef9f1ded2bd9b644c40242033465c7496
+abb0a08e6b52301a1107030a0d182e55688aa3ada995725842371c293a4e639d
+c0cbdff0fbe9e8d7c8b9827b757e84bac9d6e2eafaf3e1ccc3995f4a3e242135
+425a6f90aaae9f896d542a16130501080e142d50668ca5afac926e5e45341d26
+3c486097bcd1e0f2f8ede6d3c6b6807a394d619cbfd0dbf7ffece7d5c5b8817d
+787987bbc4d4e2ebfcf4ddcfbe99624b3f27223344597393a8b1a18d6c533117
+0c0b020710192f50678aa2b2a694715d43361b233b496598c1cedcf5fdf0e5d8
+c7b5837f767c85b6cad9e3effef6dacdc29a5f4f3d281f38415b708fa7b39e88
+6a512c160f09040612152b56698ba4b4a8916d5747321e250e142d50668ca5af
+ac926e5e45341d263c486097bcd1e0f2f8ede6d3c6b6807a777c86b7c5d3e4ee
+f9f1ded2bd9b644c40242033465c7496abb0a08e6b52301a1107030a0d182e55
+688aa3ada995725842371c293a4e639dc0cbdff0fbe9e8d7c8b9827b757e84ba
+c9d6e2eafaf3e1ccc3995f4a3e242135425a6f90aaae9f896d542a1613050108
+415b708fa7b39e886a512c160f09040612152b56698ba4b4a8916d5747321e25
+394d619cbfd0dbf7ffece7d5c5b8817d787987bbc4d4e2ebfcf4ddcfbe99624b
+3f27223344597393a8b1a18d6c5331170c0b020710192f50678aa2b2a694715d
+43361b233b496598c1cedcf5fdf0e5d8c7b5837f767c85b6cad9e3effef6dacd
+c29a5f4f3d281f38c9d6e2eafaf3e1ccc3995f4a3e242135425a6f90aaae9f89
+6d542a16130501080e142d50668ca5afac926e5e45341d263c486097bcd1e0f2
+f8ede6d3c6b6807a777c86b7c5d3e4eef9f1ded2bd9b644c40242033465c7496
+abb0a08e6b52301a1107030a0d182e55688aa3ada995725842371c293a4e639d
+c0cbdff0fbe9e8d7c8b9827b757e84bac1cedcf5fdf0e5d8c7b5837f767c85b6
+cad9e3effef6dacdc29a5f4f3d281f38415b708fa7b39e886a512c160f090406
+12152b56698ba4b4a8916d5747321e25394d619cbfd0dbf7ffece7d5c5b8817d
+787987bbc4d4e2ebfcf4ddcfbe99624b3f27223344597393a8b1a18d6c533117
+0c0b020710192f50678aa2b2a694715d43361b233b496598688aa3ada9957258
+42371c293a4e639dc0cbdff0fbe9e8d7c8b9827b757e84bac9d6e2eafaf3e1cc
+c3995f4a3e242135425a6f90aaae9f896d542a16130501080e142d50668ca5af
+ac926e5e45341d263c486097bcd1e0f2f8ede6d3c6b6807a777c86b7c5d3e4ee
+f9f1ded2bd9b644c40242033465c7496abb0a08e6b52301a1107030a0d182e55
+a8b1a18d6c5331170c0b020710192f50678aa2b2a694715d43361b233b496598
+c1cedcf5fdf0e5d8c7b5837f767c85b6cad9e3effef6dacdc29a5f4f3d281f38
+415b708fa7b39e886a512c160f09040612152b56698ba4b4a8916d5747321e25
+394d619cbfd0dbf7ffece7d5c5b8817d787987bbc4d4e2ebfcf4ddcfbe99624b
+3f27223344597393f9f1ded2bd9b644c40242033465c7496abb0a08e6b52301a
+1107030a0d182e55688aa3ada995725842371c293a4e639dc0cbdff0fbe9e8d7
+c8b9827b757e84bac9d6e2eafaf3e1ccc3995f4a3e242135425a6f90aaae9f89
+6d542a16130501080e142d50668ca5afac926e5e45341d263c486097bcd1e0f2
+f8ede6d3c6b6807a777c86b7c5d3e4eeffece7d5c5b8817d787987bbc4d4e2eb
+fcf4ddcfbe99624b3f27223344597393a8b1a18d6c5331170c0b020710192f50
+678aa2b2a694715d43361b233b496598c1cedcf5fdf0e5d8c7b5837f767c85b6
+cad9e3effef6dacdc29a5f4f3d281f38415b708fa7b39e886a512c160f090406
+12152b56698ba4b4a8916d5747321e25394d619cbfd0dbf7ac926e5e45341d26
+3c486097bcd1e0f2f8ede6d3c6b6807a777c86b7c5d3e4eef9f1ded2bd9b644c
+40242033465c7496abb0a08e6b52301a1107030a0d182e55688aa3ada9957258
+42371c293a4e639dc0cbdff0fbe9e8d7c8b9827b757e84bac9d6e2eafaf3e1cc
+c3995f4a3e242135425a6f90aaae9f896d542a16130501080e142d50668ca5af
+6a512c160f09040612152b56698ba4b4a8916d5747321e25394d619cbfd0dbf7
+ffece7d5c5b8817d787987bbc4d4e2ebfcf4ddcfbe99624b3f27223344597393
+a8b1a18d6c5331170c0b020710192f50678aa2b2a694715d43361b233b496598
+c1cedcf5fdf0e5d8c7b5837f767c85b6cad9e3effef6dacdc29a5f4f3d281f38
+415b708fa7b39e88c3995f4a3e242135425a6f90aaae9f896d542a1613050108
+0e142d50668ca5afac926e5e45341d263c486097bcd1e0f2f8ede6d3c6b6807a
+777c86b7c5d3e4eef9f1ded2bd9b644c40242033465c7496abb0a08e6b52301a
+1107030a0d182e55688aa3ada995725842371c293a4e639dc0cbdff0fbe9e8d7
+c8b9827b757e84bac9d6e2eafaf3e1ccc7b5837f767c85b6cad9e3effef6dacd
+c29a5f4f3d281f38415b708fa7b39e886a512c160f09040612152b56698ba4b4
+a8916d5747321e25394d619cbfd0dbf7ffece7d5c5b8817d787987bbc4d4e2eb
+fcf4ddcfbe99624b3f27223344597393a8b1a18d6c5331170c0b020710192f50
+678aa2b2a694715d43361b233b496598c1cedcf5fdf0e5d842371c293a4e639d
+c0cbdff0fbe9e8d7c8b9827b757e84bac9d6e2eafaf3e1ccc3995f4a3e242135
+425a6f90aaae9f896d542a16130501080e142d50668ca5afac926e5e45341d26
+3c486097bcd1e0f2f8ede6d3c6b6807a777c86b7c5d3e4eef9f1ded2bd9b644c
+40242033465c7496abb0a08e6b52301a1107030a0d182e55688aa3ada9957258
+0c0b020710192f50678aa2b2a694715d43361b233b496598c1cedcf5fdf0e5d8
+c7b5837f767c85b6cad9e3effef6dacdc29a5f4f3d281f38415b708fa7b39e88
+6a512c160f09040612152b56698ba4b4a8916d5747321e25394d619cbfd0dbf7
+ffece7d5c5b8817d787987bbc4d4e2ebfcf4ddcfbe99624b3f27223344597393
+a8b1a18d6c53311740242033465c7496abb0a08e6b52301a1107030a0d182e55
+688aa3ada995725842371c293a4e639dc0cbdff0fbe9e8d7c8b9827b757e84ba
+c9d6e2eafaf3e1ccc3995f4a3e242135425a6f90aaae9f896d542a1613050108
+0e142d50668ca5afac926e5e45341d263c486097bcd1e0f2f8ede6d3c6b6807a
+777c86b7c5d3e4eef9f1ded2bd9b644c>
+ >>
+ /Magenta <<
+% w=136 h=2 strip=17 shift=32
+ /HalftoneType 3
+ /Width 136
+ /Height 34
+ /TransferFunction /m2300_transfer load
+ /Thresholds <
+625f50463c2918090416242e425784a8c3d2d8ccb4b0997e706c758f9cbae4e5
+f2fafff6ede7e3bb9b8d786b6e8295acb6c8dbd3c4a686543d342416060a1a2c
+36494f5d6460524a372d190f011523333e5588a5c1cfd6cab7a994836d6a778c
+9abedfe9f0f8fdf4f0ebdebc9d92766d6f7c97adb2ceddd4c6a28a5a41312514
+070c17283a444d5cc5d0dacbb3aa938071687b90a0b9e2eaeef5fef9f3ece2b8
+9f8e7c69727d98aeb6c9d7d5c2a8875340322112050b1e2a39484e5b655f514b
+3b2b1d0e031320333f5689a3c5d1dcc7b5af997f7466798b9ebfe0e6eff7fcfb
+f1e8e1bda1917a67738196abb1cdd9d3c0a48a5942301f10070d1c2635474c5e
+6361504538271b080211222f435885a7f2fafff6ede7e3bb9b8d786b6e8295ac
+b6c8dbd3c4a686543d342416060a1a2c36494f5d6460524a372d190f01152333
+3e5588a5c1cfd6cab7a994836d6a778c9abedfe9f0f8fdf4f0ebdebc9d92766d
+6f7c97adb2ceddd4c6a28a5a41312514070c17283a444d5c625f50463c291809
+0416242e425784a8c3d2d8ccb4b0997e706c758f9cbae4e5b6c9d7d5c2a88753
+40322112050b1e2a39484e5b655f514b3b2b1d0e031320333f5689a3c5d1dcc7
+b5af997f7466798b9ebfe0e6eff7fcfbf1e8e1bda1917a67738196abb1cdd9d3
+c0a48a5942301f10070d1c2635474c5e6361504538271b080211222f435885a7
+c5d0dacbb3aa938071687b90a0b9e2eaeef5fef9f3ece2b89f8e7c69727d98ae
+36494f5d6460524a372d190f011523333e5588a5c1cfd6cab7a994836d6a778c
+9abedfe9f0f8fdf4f0ebdebc9d92766d6f7c97adb2ceddd4c6a28a5a41312514
+070c17283a444d5c625f50463c2918090416242e425784a8c3d2d8ccb4b0997e
+706c758f9cbae4e5f2fafff6ede7e3bb9b8d786b6e8295acb6c8dbd3c4a68654
+3d342416060a1a2c3f5689a3c5d1dcc7b5af997f7466798b9ebfe0e6eff7fcfb
+f1e8e1bda1917a67738196abb1cdd9d3c0a48a5942301f10070d1c2635474c5e
+6361504538271b080211222f435885a7c5d0dacbb3aa938071687b90a0b9e2ea
+eef5fef9f3ece2b89f8e7c69727d98aeb6c9d7d5c2a8875340322112050b1e2a
+39484e5b655f514b3b2b1d0e031320339abedfe9f0f8fdf4f0ebdebc9d92766d
+6f7c97adb2ceddd4c6a28a5a41312514070c17283a444d5c625f50463c291809
+0416242e425784a8c3d2d8ccb4b0997e706c758f9cbae4e5f2fafff6ede7e3bb
+9b8d786b6e8295acb6c8dbd3c4a686543d342416060a1a2c36494f5d6460524a
+372d190f011523333e5588a5c1cfd6cab7a994836d6a778c738196abb1cdd9d3
+c0a48a5942301f10070d1c2635474c5e6361504538271b080211222f435885a7
+c5d0dacbb3aa938071687b90a0b9e2eaeef5fef9f3ece2b89f8e7c69727d98ae
+b6c9d7d5c2a8875340322112050b1e2a39484e5b655f514b3b2b1d0e03132033
+3f5689a3c5d1dcc7b5af997f7466798b9ebfe0e6eff7fcfbf1e8e1bda1917a67
+070c17283a444d5c625f50463c2918090416242e425784a8c3d2d8ccb4b0997e
+706c758f9cbae4e5f2fafff6ede7e3bb9b8d786b6e8295acb6c8dbd3c4a68654
+3d342416060a1a2c36494f5d6460524a372d190f011523333e5588a5c1cfd6ca
+b7a994836d6a778c9abedfe9f0f8fdf4f0ebdebc9d92766d6f7c97adb2ceddd4
+c6a28a5a413125140211222f435885a7c5d0dacbb3aa938071687b90a0b9e2ea
+eef5fef9f3ece2b89f8e7c69727d98aeb6c9d7d5c2a8875340322112050b1e2a
+39484e5b655f514b3b2b1d0e031320333f5689a3c5d1dcc7b5af997f7466798b
+9ebfe0e6eff7fcfbf1e8e1bda1917a67738196abb1cdd9d3c0a48a5942301f10
+070d1c2635474c5e6361504538271b08706c758f9cbae4e5f2fafff6ede7e3bb
+9b8d786b6e8295acb6c8dbd3c4a686543d342416060a1a2c36494f5d6460524a
+372d190f011523333e5588a5c1cfd6cab7a994836d6a778c9abedfe9f0f8fdf4
+f0ebdebc9d92766d6f7c97adb2ceddd4c6a28a5a41312514070c17283a444d5c
+625f50463c2918090416242e425784a8c3d2d8ccb4b0997e9f8e7c69727d98ae
+b6c9d7d5c2a8875340322112050b1e2a39484e5b655f514b3b2b1d0e03132033
+3f5689a3c5d1dcc7b5af997f7466798b9ebfe0e6eff7fcfbf1e8e1bda1917a67
+738196abb1cdd9d3c0a48a5942301f10070d1c2635474c5e6361504538271b08
+0211222f435885a7c5d0dacbb3aa938071687b90a0b9e2eaeef5fef9f3ece2b8
+3d342416060a1a2c36494f5d6460524a372d190f011523333e5588a5c1cfd6ca
+b7a994836d6a778c9abedfe9f0f8fdf4f0ebdebc9d92766d6f7c97adb2ceddd4
+c6a28a5a41312514070c17283a444d5c625f50463c2918090416242e425784a8
+c3d2d8ccb4b0997e706c758f9cbae4e5f2fafff6ede7e3bb9b8d786b6e8295ac
+b6c8dbd3c4a686543b2b1d0e031320333f5689a3c5d1dcc7b5af997f7466798b
+9ebfe0e6eff7fcfbf1e8e1bda1917a67738196abb1cdd9d3c0a48a5942301f10
+070d1c2635474c5e6361504538271b080211222f435885a7c5d0dacbb3aa9380
+71687b90a0b9e2eaeef5fef9f3ece2b89f8e7c69727d98aeb6c9d7d5c2a88753
+40322112050b1e2a39484e5b655f514bb7a994836d6a778c9abedfe9f0f8fdf4
+f0ebdebc9d92766d6f7c97adb2ceddd4c6a28a5a41312514070c17283a444d5c
+625f50463c2918090416242e425784a8c3d2d8ccb4b0997e706c758f9cbae4e5
+f2fafff6ede7e3bb9b8d786b6e8295acb6c8dbd3c4a686543d342416060a1a2c
+36494f5d6460524a372d190f011523333e5588a5c1cfd6caf1e8e1bda1917a67
+738196abb1cdd9d3c0a48a5942301f10070d1c2635474c5e6361504538271b08
+0211222f435885a7c5d0dacbb3aa938071687b90a0b9e2eaeef5fef9f3ece2b8
+9f8e7c69727d98aeb6c9d7d5c2a8875340322112050b1e2a39484e5b655f514b
+3b2b1d0e031320333f5689a3c5d1dcc7b5af997f7466798b9ebfe0e6eff7fcfb
+c6a28a5a41312514070c17283a444d5c625f50463c2918090416242e425784a8
+c3d2d8ccb4b0997e706c758f9cbae4e5f2fafff6ede7e3bb9b8d786b6e8295ac
+b6c8dbd3c4a686543d342416060a1a2c36494f5d6460524a372d190f01152333
+3e5588a5c1cfd6cab7a994836d6a778c9abedfe9f0f8fdf4f0ebdebc9d92766d
+6f7c97adb2ceddd46361504538271b080211222f435885a7c5d0dacbb3aa9380
+71687b90a0b9e2eaeef5fef9f3ece2b89f8e7c69727d98aeb6c9d7d5c2a88753
+40322112050b1e2a39484e5b655f514b3b2b1d0e031320333f5689a3c5d1dcc7
+b5af997f7466798b9ebfe0e6eff7fcfbf1e8e1bda1917a67738196abb1cdd9d3
+c0a48a5942301f10070d1c2635474c5ec3d2d8ccb4b0997e706c758f9cbae4e5
+f2fafff6ede7e3bb9b8d786b6e8295acb6c8dbd3c4a686543d342416060a1a2c
+36494f5d6460524a372d190f011523333e5588a5c1cfd6cab7a994836d6a778c
+9abedfe9f0f8fdf4f0ebdebc9d92766d6f7c97adb2ceddd4c6a28a5a41312514
+070c17283a444d5c625f50463c2918090416242e425784a8eef5fef9f3ece2b8
+9f8e7c69727d98aeb6c9d7d5c2a8875340322112050b1e2a39484e5b655f514b
+3b2b1d0e031320333f5689a3c5d1dcc7b5af997f7466798b9ebfe0e6eff7fcfb
+f1e8e1bda1917a67738196abb1cdd9d3c0a48a5942301f10070d1c2635474c5e
+6361504538271b080211222f435885a7c5d0dacbb3aa938071687b90a0b9e2ea
+b6c8dbd3c4a686543d342416060a1a2c36494f5d6460524a372d190f01152333
+3e5588a5c1cfd6cab7a994836d6a778c9abedfe9f0f8fdf4f0ebdebc9d92766d
+6f7c97adb2ceddd4c6a28a5a41312514070c17283a444d5c625f50463c291809
+0416242e425784a8c3d2d8ccb4b0997e706c758f9cbae4e5f2fafff6ede7e3bb
+9b8d786b6e8295ac39484e5b655f514b3b2b1d0e031320333f5689a3c5d1dcc7
+b5af997f7466798b9ebfe0e6eff7fcfbf1e8e1bda1917a67738196abb1cdd9d3
+c0a48a5942301f10070d1c2635474c5e6361504538271b080211222f435885a7
+c5d0dacbb3aa938071687b90a0b9e2eaeef5fef9f3ece2b89f8e7c69727d98ae
+b6c9d7d5c2a8875340322112050b1e2a3e5588a5c1cfd6cab7a994836d6a778c
+9abedfe9f0f8fdf4f0ebdebc9d92766d6f7c97adb2ceddd4c6a28a5a41312514
+070c17283a444d5c625f50463c2918090416242e425784a8c3d2d8ccb4b0997e
+706c758f9cbae4e5f2fafff6ede7e3bb9b8d786b6e8295acb6c8dbd3c4a68654
+3d342416060a1a2c36494f5d6460524a372d190f011523339ebfe0e6eff7fcfb
+f1e8e1bda1917a67738196abb1cdd9d3c0a48a5942301f10070d1c2635474c5e
+6361504538271b080211222f435885a7c5d0dacbb3aa938071687b90a0b9e2ea
+eef5fef9f3ece2b89f8e7c69727d98aeb6c9d7d5c2a8875340322112050b1e2a
+39484e5b655f514b3b2b1d0e031320333f5689a3c5d1dcc7b5af997f7466798b
+6f7c97adb2ceddd4c6a28a5a41312514070c17283a444d5c625f50463c291809
+0416242e425784a8c3d2d8ccb4b0997e706c758f9cbae4e5f2fafff6ede7e3bb
+9b8d786b6e8295acb6c8dbd3c4a686543d342416060a1a2c36494f5d6460524a
+372d190f011523333e5588a5c1cfd6cab7a994836d6a778c9abedfe9f0f8fdf4
+f0ebdebc9d92766d070d1c2635474c5e6361504538271b080211222f435885a7
+c5d0dacbb3aa938071687b90a0b9e2eaeef5fef9f3ece2b89f8e7c69727d98ae
+b6c9d7d5c2a8875340322112050b1e2a39484e5b655f514b3b2b1d0e03132033
+3f5689a3c5d1dcc7b5af997f7466798b9ebfe0e6eff7fcfbf1e8e1bda1917a67
+738196abb1cdd9d3c0a48a5942301f100416242e425784a8c3d2d8ccb4b0997e
+706c758f9cbae4e5f2fafff6ede7e3bb9b8d786b6e8295acb6c8dbd3c4a68654
+3d342416060a1a2c36494f5d6460524a372d190f011523333e5588a5c1cfd6ca
+b7a994836d6a778c9abedfe9f0f8fdf4f0ebdebc9d92766d6f7c97adb2ceddd4
+c6a28a5a41312514070c17283a444d5c625f50463c29180971687b90a0b9e2ea
+eef5fef9f3ece2b89f8e7c69727d98aeb6c9d7d5c2a8875340322112050b1e2a
+39484e5b655f514b3b2b1d0e031320333f5689a3c5d1dcc7b5af997f7466798b
+9ebfe0e6eff7fcfbf1e8e1bda1917a67738196abb1cdd9d3c0a48a5942301f10
+070d1c2635474c5e6361504538271b080211222f435885a7c5d0dacbb3aa9380
+9b8d786b6e8295acb6c8dbd3c4a686543d342416060a1a2c36494f5d6460524a
+372d190f011523333e5588a5c1cfd6cab7a994836d6a778c9abedfe9f0f8fdf4
+f0ebdebc9d92766d6f7c97adb2ceddd4c6a28a5a41312514070c17283a444d5c
+625f50463c2918090416242e425784a8c3d2d8ccb4b0997e706c758f9cbae4e5
+f2fafff6ede7e3bb40322112050b1e2a39484e5b655f514b3b2b1d0e03132033
+3f5689a3c5d1dcc7b5af997f7466798b9ebfe0e6eff7fcfbf1e8e1bda1917a67
+738196abb1cdd9d3c0a48a5942301f10070d1c2635474c5e6361504538271b08
+0211222f435885a7c5d0dacbb3aa938071687b90a0b9e2eaeef5fef9f3ece2b8
+9f8e7c69727d98aeb6c9d7d5c2a88753372d190f011523333e5588a5c1cfd6ca
+b7a994836d6a778c9abedfe9f0f8fdf4f0ebdebc9d92766d6f7c97adb2ceddd4
+c6a28a5a41312514070c17283a444d5c625f50463c2918090416242e425784a8
+c3d2d8ccb4b0997e706c758f9cbae4e5f2fafff6ede7e3bb9b8d786b6e8295ac
+b6c8dbd3c4a686543d342416060a1a2c36494f5d6460524ab5af997f7466798b
+9ebfe0e6eff7fcfbf1e8e1bda1917a67738196abb1cdd9d3c0a48a5942301f10
+070d1c2635474c5e6361504538271b080211222f435885a7c5d0dacbb3aa9380
+71687b90a0b9e2eaeef5fef9f3ece2b89f8e7c69727d98aeb6c9d7d5c2a88753
+40322112050b1e2a39484e5b655f514b3b2b1d0e031320333f5689a3c5d1dcc7
+f0ebdebc9d92766d6f7c97adb2ceddd4c6a28a5a41312514070c17283a444d5c
+625f50463c2918090416242e425784a8c3d2d8ccb4b0997e706c758f9cbae4e5
+f2fafff6ede7e3bb9b8d786b6e8295acb6c8dbd3c4a686543d342416060a1a2c
+36494f5d6460524a372d190f011523333e5588a5c1cfd6cab7a994836d6a778c
+9abedfe9f0f8fdf4c0a48a5942301f10070d1c2635474c5e6361504538271b08
+0211222f435885a7c5d0dacbb3aa938071687b90a0b9e2eaeef5fef9f3ece2b8
+9f8e7c69727d98aeb6c9d7d5c2a8875340322112050b1e2a39484e5b655f514b
+3b2b1d0e031320333f5689a3c5d1dcc7b5af997f7466798b9ebfe0e6eff7fcfb
+f1e8e1bda1917a67738196abb1cdd9d3>
+ >>
+ /Yellow <<
+% w=24 h=6 strip=1 shift=0
+ /HalftoneType 3
+ /Width 24
+ /Height 6
+ /TransferFunction /m2300_transfer load
+ /Thresholds <
+7c553a272313020c1c293c5c7a53332e1a15040e1e2a375afcdbcb9d8366475f
+88a2d2d9fee2c9a68f7845719aa8d4ddf2eec0af916f4a769babbbf0f7e9c6b8
+8b5e486586b4b9e57f56352c190b05122030384f7d583e252209071017314051
+f9e0cea48d63436884a9cddefbd7d09f966c417394a1c7d6f5e7bfb698744e6d
+92b2c2e4f4ebbdb0816a4c618aadc4ec>
+ >>
+ /Default <<
+% w=48 h=6 strip=2 shift=24
+ /HalftoneType 3
+ /Width 48
+ /Height 12
+ /TransferFunction /m2300_transfer load
+ /Thresholds <
+5153695d75627e94a58b99b0aaada2978a9f816d775e66544f57675a72617d93
+a48d9baba8afa196889d836b7659645870463925160c070f222d3c4886bbc8d5
+e9f7fdeee1cfc1b26e45372a1b0e04121f2f394985bacad9e5f6fff0ddd3c2b3
+8e4a3a301e15030b1c2933417ab6c3d1deebf3f8e3dbcbba91483b2c22130109
+182435437bb8c5cee2edf1fae7d8cdb9a7b1a398899c806e785c65565052685f
+73637e92a48c9aaea9aba095879e826c765f675550586a5b74607f94a68d9cac
+84bfc7dae4f9f4ecdcd1c2b36f443626170a0613212e3e4b85bcc9d6e8fbf2ea
+e0d4c0b47147382a1b08051420313f4e79b5c6d2e1effcf5e8d7ccbd904c4031
+1d11020b1a2832427cb7c4d0dff0fef7e6d9cabe8f4d3d2b2310040d19273441
+4f57675a72617d93a48d9baba8afa196889d836b765964585153695d75627e94
+a58b99b0aaada2978a9f816d775e66546e45372a1b0e04121f2f394985bacad9
+e5f6fff0ddd3c2b370463925160c070f222d3c4886bbc8d5e9f7fdeee1cfc1b2
+91483b2c22130109182435437bb8c5cee2edf1fae7d8cdb98e4a3a301e15030b
+1c2933417ab6c3d1deebf3f8e3dbcbbaa9aba095879e826c765f675550586a5b
+74607f94a68d9caca7b1a398899c806e785c65565052685f73637e92a48c9aae
+85bcc9d6e8fbf2eae0d4c0b47147382a1b08051420313f4e84bfc7dae4f9f4ec
+dcd1c2b36f443626170a0613212e3e4b7cb7c4d0dff0fef7e6d9cabe8f4d3d2b
+2310040d1927344179b5c6d2e1effcf5e8d7ccbd904c40311d11020b1a283242>
+ >>
+>>
+
+/Default exch /Halftone defineresource
+sethalftone
+
+
diff --git a/cups.h b/cups.h
new file mode 100644
index 0000000..5c83e6f
--- /dev/null
+++ b/cups.h
@@ -0,0 +1,226 @@
+/*
+ * Raster file definitions for the Common UNIX Printing System (CUPS).
+ *
+ * Copyright 1997-2006 by Easy Software Products.
+ *
+ * This file is part of the CUPS Imaging library.
+ *
+ * These coded instructions, statements, and computer programs are the
+ * property of Easy Software Products and are protected by Federal
+ * copyright law. Distribution and use rights are outlined in the file
+ * "LICENSE.txt" which should have been included with this file. If this
+ * file is missing or damaged please contact Easy Software Products
+ * at:
+ *
+ * Attn: CUPS Licensing Information
+ * Easy Software Products
+ * 44141 Airport View Drive, Suite 204
+ * Hollywood, Maryland 20636 USA
+ *
+ * Voice: (301) 373-9600
+ * EMail: cups-info@cups.org
+ * WWW: http://www.cups.org
+ *
+ * This code and any derivative of it may be used and distributed
+ * freely under the terms of the GNU General Public License when
+ * used with GNU/GPL Ghostscript or its derivatives. Use of the
+ * code (or any derivative of it) with software other than GNU/GPL
+ * GhostScript (or its derivatives) is governed by the CUPS license
+ * agreement.
+ *
+ * This file is subject to the Apple OS-Developed Software exception.
+ */
+
+#ifndef _CUPS_RASTER_H_
+# define _CUPS_RASTER_H_
+
+/*
+ * Constants...
+ */
+
+# define CUPS_RASTER_SYNC 0x52615333 /* RaS3 */
+# define CUPS_RASTER_REVSYNC 0x33536152 /* 3SaR */
+
+# define CUPS_RASTER_SYNCv1 0x52615374 /* RaSt */
+# define CUPS_RASTER_REVSYNCv1 0x74536152 /* tSaR */
+
+# define CUPS_RASTER_SYNCv2 0x52615332 /* RaS2 */
+# define CUPS_RASTER_REVSYNCv2 0x32536152 /* 2SaR */
+
+
+/*
+ * Types...
+ */
+
+typedef enum cups_bool_e /**** Boolean type ****/
+{
+ CUPS_FALSE = 0, /* Logical false */
+ CUPS_TRUE = 1 /* Logical true */
+} cups_bool_t;
+
+typedef enum cups_jog_e /**** Jog attribute values ****/
+{
+ CUPS_JOG_NONE = 0, /* Never move pages */
+ CUPS_JOG_FILE = 1, /* Move pages after this file */
+ CUPS_JOG_JOB = 2, /* Move pages after this job */
+ CUPS_JOG_SET = 3 /* Move pages after this set */
+} cups_jog_t;
+
+typedef enum cups_orient_e /**** Orientation attribute values ****/
+{
+ CUPS_ORIENT_0 = 0, /* Don't rotate the page */
+ CUPS_ORIENT_90 = 1, /* Rotate the page counter-clockwise */
+ CUPS_ORIENT_180 = 2, /* Turn the page upside down */
+ CUPS_ORIENT_270 = 3 /* Rotate the page clockwise */
+} cups_orient_t;
+
+typedef enum cups_cut_e /**** CutMedia attribute values ****/
+{
+ CUPS_CUT_NONE = 0, /* Never cut the roll */
+ CUPS_CUT_FILE = 1, /* Cut the roll after this file */
+ CUPS_CUT_JOB = 2, /* Cut the roll after this job */
+ CUPS_CUT_SET = 3, /* Cut the roll after this set */
+ CUPS_CUT_PAGE = 4 /* Cut the roll after this page */
+} cups_cut_t;
+
+typedef enum cups_adv_e /**** AdvanceMedia attribute values ****/
+{
+ CUPS_ADVANCE_NONE = 0, /* Never advance the roll */
+ CUPS_ADVANCE_FILE = 1, /* Advance the roll after this file */
+ CUPS_ADVANCE_JOB = 2, /* Advance the roll after this job */
+ CUPS_ADVANCE_SET = 3, /* Advance the roll after this set */
+ CUPS_ADVANCE_PAGE = 4 /* Advance the roll after this page */
+} cups_adv_t;
+
+typedef enum cups_edge_e /**** LeadingEdge attribute values ****/
+{
+ CUPS_EDGE_TOP = 0, /* Leading edge is the top of the page */
+ CUPS_EDGE_RIGHT = 1, /* Leading edge is the right of the page */
+ CUPS_EDGE_BOTTOM = 2, /* Leading edge is the bottom of the page */
+ CUPS_EDGE_LEFT = 3 /* Leading edge is the left of the page */
+} cups_edge_t;
+
+typedef enum cups_order_e /**** cupsColorOrder attribute values ****/
+{
+ CUPS_ORDER_CHUNKED = 0, /* CMYK CMYK CMYK ... */
+ CUPS_ORDER_BANDED = 1, /* CCC MMM YYY KKK ... */
+ CUPS_ORDER_PLANAR = 2 /* CCC ... MMM ... YYY ... KKK ... */
+} cups_order_t;
+
+typedef enum cups_cspace_e /**** cupsColorSpace attribute values ****/
+{
+ CUPS_CSPACE_W = 0, /* Luminance */
+ CUPS_CSPACE_RGB = 1, /* Red, green, blue */
+ CUPS_CSPACE_RGBA = 2, /* Red, green, blue, alpha */
+ CUPS_CSPACE_K = 3, /* Black */
+ CUPS_CSPACE_CMY = 4, /* Cyan, magenta, yellow */
+ CUPS_CSPACE_YMC = 5, /* Yellow, magenta, cyan */
+ CUPS_CSPACE_CMYK = 6, /* Cyan, magenta, yellow, black */
+ CUPS_CSPACE_YMCK = 7, /* Yellow, magenta, cyan, black */
+ CUPS_CSPACE_KCMY = 8, /* Black, cyan, magenta, yellow */
+ CUPS_CSPACE_KCMYcm = 9, /* Black, cyan, magenta, yellow, *
+ * light-cyan, light-magenta */
+ CUPS_CSPACE_GMCK = 10, /* Gold, magenta, yellow, black */
+ CUPS_CSPACE_GMCS = 11, /* Gold, magenta, yellow, silver */
+ CUPS_CSPACE_WHITE = 12, /* White ink (as black) */
+ CUPS_CSPACE_GOLD = 13, /* Gold foil */
+ CUPS_CSPACE_SILVER = 14, /* Silver foil */
+
+ CUPS_CSPACE_CIEXYZ = 15, /* CIE XYZ @since CUPS 1.1.19@ */
+ CUPS_CSPACE_CIELab = 16, /* CIE Lab @since CUPS 1.1.19@ */
+ CUPS_CSPACE_RGBW = 17, /* Red, green, blue, white @since CUPS 1.2@ */
+
+ CUPS_CSPACE_ICC1 = 32, /* ICC-based, 1 color @since CUPS 1.1.19@ */
+ CUPS_CSPACE_ICC2 = 33, /* ICC-based, 2 colors @since CUPS 1.1.19@ */
+ CUPS_CSPACE_ICC3 = 34, /* ICC-based, 3 colors @since CUPS 1.1.19@ */
+ CUPS_CSPACE_ICC4 = 35, /* ICC-based, 4 colors @since CUPS 1.1.19@ */
+ CUPS_CSPACE_ICC5 = 36, /* ICC-based, 5 colors @since CUPS 1.1.19@ */
+ CUPS_CSPACE_ICC6 = 37, /* ICC-based, 6 colors @since CUPS 1.1.19@ */
+ CUPS_CSPACE_ICC7 = 38, /* ICC-based, 7 colors @since CUPS 1.1.19@ */
+ CUPS_CSPACE_ICC8 = 39, /* ICC-based, 8 colors @since CUPS 1.1.19@ */
+ CUPS_CSPACE_ICC9 = 40, /* ICC-based, 9 colors @since CUPS 1.1.19@ */
+ CUPS_CSPACE_ICCA = 41, /* ICC-based, 10 colors @since CUPS 1.1.19@ */
+ CUPS_CSPACE_ICCB = 42, /* ICC-based, 11 colors @since CUPS 1.1.19@ */
+ CUPS_CSPACE_ICCC = 43, /* ICC-based, 12 colors @since CUPS 1.1.19@ */
+ CUPS_CSPACE_ICCD = 44, /* ICC-based, 13 colors @since CUPS 1.1.19@ */
+ CUPS_CSPACE_ICCE = 45, /* ICC-based, 14 colors @since CUPS 1.1.19@ */
+ CUPS_CSPACE_ICCF = 46 /* ICC-based, 15 colors @since CUPS 1.1.19@ */
+} cups_cspace_t;
+
+
+/*
+ * The page header structure contains the standard PostScript page device
+ * dictionary, along with some CUPS-specific parameters that are provided
+ * by the RIPs...
+ *
+ * The API supports a "version 1" (from CUPS 1.0 and 1.1) and a "version 2"
+ * (from CUPS 1.2 and higher) page header, for binary compatibility.
+ */
+
+typedef struct cups_page_header_s /**** Version 1 Page Header ****/
+{
+ /**** Standard Page Device Dictionary String Values ****/
+ char MediaClass[64]; /* MediaClass string */
+ char MediaColor[64]; /* MediaColor string */
+ char MediaType[64]; /* MediaType string */
+ char OutputType[64]; /* OutputType string */
+
+ /**** Standard Page Device Dictionary Integer Values ****/
+ unsigned AdvanceDistance; /* AdvanceDistance value in points */
+ cups_adv_t AdvanceMedia; /* AdvanceMedia value (see above) */
+ cups_bool_t Collate; /* Collated copies value */
+ cups_cut_t CutMedia; /* CutMedia value (see above) */
+ cups_bool_t Duplex; /* Duplexed (double-sided) value */
+ unsigned HWResolution[2]; /* Resolution in dots-per-inch */
+ unsigned ImagingBoundingBox[4]; /* Pixel region that is painted (points) */
+ cups_bool_t InsertSheet; /* InsertSheet value */
+ cups_jog_t Jog; /* Jog value (see above) */
+ cups_edge_t LeadingEdge; /* LeadingEdge value (see above) */
+ unsigned Margins[2]; /* Lower-lefthand margins in points */
+ cups_bool_t ManualFeed; /* ManualFeed value */
+ unsigned MediaPosition; /* MediaPosition value */
+ unsigned MediaWeight; /* MediaWeight value in grams/m^2 */
+ cups_bool_t MirrorPrint; /* MirrorPrint value */
+ cups_bool_t NegativePrint; /* NegativePrint value */
+ unsigned NumCopies; /* Number of copies to produce */
+ cups_orient_t Orientation; /* Orientation value (see above) */
+ cups_bool_t OutputFaceUp; /* OutputFaceUp value */
+ unsigned PageSize[2]; /* Width and length of page in points */
+ cups_bool_t Separations; /* Separations value */
+ cups_bool_t TraySwitch; /* TraySwitch value */
+ cups_bool_t Tumble; /* Tumble value */
+
+ /**** CUPS Page Device Dictionary Values ****/
+ unsigned cupsWidth; /* Width of page image in pixels */
+ unsigned cupsHeight; /* Height of page image in pixels */
+ unsigned cupsMediaType; /* Media type code */
+ unsigned cupsBitsPerColor; /* Number of bits for each color */
+ unsigned cupsBitsPerPixel; /* Number of bits for each pixel */
+ unsigned cupsBytesPerLine; /* Number of bytes per line */
+ cups_order_t cupsColorOrder; /* Order of colors */
+ cups_cspace_t cupsColorSpace; /* True colorspace */
+ unsigned cupsCompression; /* Device compression to use */
+ unsigned cupsRowCount; /* Rows per band */
+ unsigned cupsRowFeed; /* Feed between bands */
+ unsigned cupsRowStep; /* Spacing between lines */
+} cups_page_header_t;
+
+typedef struct cups_page_header2_s /**** Version 2 Page Header @since CUPS 1.2@ ****/
+{
+ /**** Version 2 Dictionary Values ****/
+ unsigned cupsNumColors; /* Number of colors */
+ float cupsBorderlessScalingFactor;
+ /* Scaling that was applied to page data */
+ float cupsPageSize[2]; /* Floating point PageSize (scaling *
+ * factor not applied) */
+ float cupsImagingBBox[4]; /* Floating point ImagingBoundingBox *
+ * (scaling factor not applied) */
+ unsigned cupsInteger[16]; /* User-defined integer values */
+ float cupsReal[16]; /* User-defined floating-point values */
+ char cupsString[16][64]; /* User-defined string values */
+ char cupsMarkerType[64]; /* Ink/toner type */
+ char cupsRenderingIntent[64];/* Color rendering intent */
+ char cupsPageSizeName[64]; /* PageSize name */
+} cups_page_header2_t;
+
+#endif /* !_CUPS_RASTER_H_ */
diff --git a/foo2hp.1in b/foo2hp.1in
new file mode 100644
index 0000000..963c535
--- /dev/null
+++ b/foo2hp.1in
@@ -0,0 +1,368 @@
+.TH foo2hp 1 "${MODpage}" "foo2hp ${MODver}"
+'\"==========================================================================
+'\" STRINGS and MACROS
+'\"==========================================================================
+'\"
+'\" Define strings for special characters that nroff doesn't have
+'\"
+'\" N.B. using .if cua to test for special characters did not work.
+'\"
+.if !'\*[.T]'ps' .ds ua up
+.if '\*[.T]'ps' .ds ua \(ua
+.if !'\*[.T]'ps' .ds da down
+.if '\*[.T]'ps' .ds da \(da
+.if !'\*[.T]'ps' .ds <- left
+.if '\*[.T]'ps' .ds <- \(<-
+.if !'\*[.T]'ps' .ds -> right
+.if '\*[.T]'ps' .ds -> \(->
+'\"
+'\" bx - box a Courier string for making keycaps
+'\"
+'\" N.B. this mess is to make the line drawing come out only
+'\" if we are really generating postscript
+'\"
+.de bx
+.ie !'\*[.T]'ps' \{\
+. RB [ \\$1 ]\\$2
+.\}
+.el \{\
+. ie !r ps4html \{\
+'\" \(br\|\s-1\f(CB\\$1\fP\s+1\|\(br\l'|0\(rn'\l'|0\(ul'
+. ft CW
+. nr par*bxw \w'\\$1'+.4m
+\Z'\v'.25m'\D'l 0 -1m'\D'l \\n[par*bxw]u 0'\D'l 0 1m'\D'l -\\n[par*bxw]u 0''\
+\Z'\h'.2m'\s-1\\$1\s+1'\
+\h'\\n[par*bxw]u'\\$2
+. ft P
+. \}
+. el \{\
+. RB [ \\$1 ]\\$2
+. \}
+.\}
+..
+'\"
+'\" strings to set current color (null with old groff)
+'\"
+.if mred .ds red \m[red]
+.if mgreen .ds green \m[green]
+.if mblue .ds blue \m[blue]
+.if mblack .ds black \m[black]
+.if mblack .ds mP \mP
+'\"
+'\" fix for grotty + xterm. We call for orange, grotty outputs yellow,
+'\" but xterm displays yellow as orange. The cycle is complete.
+'\"
+.if n .defcolor orange rgb #ffff00
+'\"
+'\" color <color> - set the current color (ignores request with old groff)
+'\"
+.de color
+.if mred \m[\\$1]\c
+..
+'\"
+'\" colorword <color> <word> - colorize a word (ignored by old groff)
+'\"
+.de colorword
+.ie m\\$1 \m[\\$1]\\$2\mP\c
+.el \\$2\c
+..
+'\"
+'\" colbox <fg> <bg> <word> - colorize a word in a filled box
+'\"
+.de colbox
+.ie mred \M[\\$2]\
+\v'+.167v'\
+\D'P 0 -0.9v \w'\\$3'u 0 0 +0.9v -\w'\\$3'u 0'\
+\v'-.167v'\
+\m[\\$1]\\$3\mP\MP
+.el \\$3\c
+..
+'\"
+'\" Macros for doing pdfmarks
+'\"
+.de specialps
+\\k_\X'ps: \\$*'\h'|\\n_u'\c
+..
+'\"
+'\" pdfmark PDFMARKCODE
+'\"
+.ds pdfmarks
+.if d pdfmarks \{\
+.de pdfmark
+. specialps exec [\\$1 pdfmark
+..
+'\"
+'\" pdfdest LINKNAME
+'\"
+.de pdfdest
+.pdfmark "/Dest /\\$1 /View [/XYZ -5 PL null] /DEST"
+..
+'\"
+'\" pdfbookmark COUNT LINKNAME STRING
+'\"
+.de pdfbookmark
+. pdfmark "/View [/XYZ 44 730 1.0] /Count \\$1 /Dest /\\$2 /Title (\\$3) /OUT"
+..
+'\"
+'\" Define the SH and SS macros to save pdfmark information
+'\" in "arrays" of numbers and strings.
+'\"
+.if !r rr_n \{\
+.nr rr_n 0 1
+.am SH
+. nr rr_levels!\\n+[rr_n] 2
+. ds rr_labels!\\n[rr_n] \\$*
+. pdfdest Link\\n[rr_n]
+..
+.am SS
+. nr rr_levels!\\n+[rr_n] 3
+. ds rr_labels!\\n[rr_n] \\$*
+. pdfdest Link\\n[rr_n]
+..
+.\}
+'\"
+'\" Called at the end of the document to generate the pdfmark outline
+'\"
+.de pdf_outline
+.nr rr_levels!\\n+[rr_n] 1
+.nr rr_i 0 1
+.while \\n+[rr_i]<\\n[rr_n] \{\
+. nr rr_ip1 \\n[rr_i]+1
+. nr rr_count 0
+. if \\n[rr_levels!\\n[rr_ip1]]>\\n[rr_levels!\\n[rr_i]] \{\
+. nr rr_j \\n[rr_i] 1
+. while \\n+[rr_j]<\\n[rr_n] \{\
+. if \\n[rr_levels!\\n[rr_j]]<=\\n[rr_levels!\\n[rr_i]] \{\
+. break
+. \}
+. if \\n[rr_levels!\\n[rr_j]]==(\\n[rr_levels!\\n[rr_i]]+1) \{\
+. nr rr_count \\n[rr_count]+1
+. \}
+. \}
+. \}
+. ds hhh \\*[rr_labels!\\n[rr_i]]
+. pdfbookmark \\n[rr_count] Link\\n[rr_i] "\\*[hhh]"
+.\}
+..
+'\"
+'\" Some postscript to make pdfmarks harmless on old interpreters...
+'\"
+.specialps "def /pdfmark where {pop} {userdict /pdfmark /cleartomark load put} ifelse"
+'\"
+'\" Force display of Bookmarks in Acrobat when document is viewed.
+'\"
+.pdfmark "[/PageMode /UseOutlines /Page 1 /View [/XYZ null null null] /DOCVIEW"
+'\"
+'\" Output the document info in pdfmarks
+'\"
+.pdfmark "\
+ /Title (\*[an-title](\*[an-section])) \
+ /Subject (foo2hp Manual Page) \
+ /Author (Rick Richardson) \
+ /Keywords (printing, ZjStream) \
+ /Creator (groff \n(.x.\n(.y.\n(.Y -man) \
+ /CreationDate (\*[an-extra1]) \
+ /ModDate (\*[an-extra1]) \
+ /DOCINFO"
+\}
+'\"
+'\" The manual page name is only 1st level mark
+'\"
+.nr rr_levels!\n+[rr_n] 1
+.ds rr_labels!\n[rr_n] \*[an-title](\*[an-section])
+.pdfdest Link\n[rr_n]
+'\"==========================================================================
+'\" MANUAL PAGE SOURCE
+'\"==========================================================================
+.SH NAME
+foo2hp \- Convert Ghostscript pbmraw or bitcmyk format into a
+ZJS printer stream
+.SH SYNOPSIS
+.B foo2hp
+.RI [ options "] <" pbmraw-file " >" zjs-file
+.sp 1
+.B foo2hp
+.RI [ options "] <" bitcmyk-file " >" zjs-file
+.sp 1
+.B foo2hp
+.RI [ options "] <" cups-file " >" zjs-file
+.SH DESCRIPTION
+.B foo2hp
+converts Ghostscript pbmraw, bitcmyk, or cups output formats to monochrome
+or color ZJS streams,
+for driving the Hewlett-Packard 2600n color laser printer
+and other Zenographics-based printers.
+
+.SH COMMAND LINE OPTIONS
+.SS Normal Options
+These are the options used to select the parameters of a
+print job that are usually controlled on a per job basis.
+.TP
+.BI \-b\0 bits
+Bits per plane if autodetect doesn't work (1 or 2) [1].
+.TP
+.BI \-c
+Force color mode if autodetect doesn't work.
+.TP
+.BI \-d\0 duplex
+Duplex code to send to printer [1].
+.TS
+| n l | n l | n l .
+1 off 2 long edge 3 short edge
+.TE
+.TP
+.BI \-g\0 xpix x ypix
+Set page dimensions in pixels [10200x6600].
+.TP
+.BI \-m\0 media
+Media code to send to printer [1].
+.TS
+l l
+l n.
+_
+Media HPLJ 2600n
+_
+plain 1
+preprinted 514
+letterhead 513
+transparency 2
+prepunched 515
+labels 265
+bond 260
+recycled 516
+color 512
+tough 276
+envelope 267
+light 258
+heavy 262
+cardstock 261
+lightglossy 268
+glossy 269
+heavyglossy 270
+cover 277
+photo 278
+.TE
+.TP
+.BI \-p\0 paper
+Paper code to send to printer [1].
+.TS
+| n l | n l.
+1 letter 9 A4
+5 legal 11 A5
+7 executive 13 B5jis
+20 env #10 27 env DL
+28 env C5 34 env B5
+37 env Monarch
+.TE
+.TP
+.BI \-n\0 copies
+Number of copies [1].
+.TP
+.BI \-r\0 xres x yres
+Set device resolution in pixels/inch [600x600].
+.TP
+.BI \-s\0 source
+Source (InputSlot) code to send to printer [7].
+.TS
+| n l | n l.
+1 tray 2 7 auto
+2 tray 1
+.TE
+.TP
+.BI \-t
+Draft mode. Every other pixel is white.
+.TP
+.BI \-J\0 filename
+Filename string to send to printer.
+.TP
+.BI \-U\0 username
+Username string to send to printer.
+.SS Printer Tweaking Options
+These are the options used to customize the operation of \fBfoo2hp\fP
+for a particular printer.
+.TP
+.BI \-u\0 xoff x yoff
+Set the offset of the start of the printable region from the
+upper left corner, in pixels [0x0].
+.TP
+.BI \-l\0 xoff x yoff
+Set the offset of the end of the printable region from the
+lower right corner, in pixels [0x0].
+.TP
+.BI \-L\0 mask
+Send logical clipping amounts implied by -u/-l in the ZjStream [3].
+.TS
+l l.
+0 don't send any logical clipping amounts
+1 only send Y clipping amount
+2 only send X clipping amount
+3 send both X and Y clipping amounts
+.TE
+.TP
+.BI \-P
+Do not send START_PLANE codes on monochrome output. May be
+needed by some black and white only printers, such as the
+HP LaserJet 1000.
+.TP
+.BI \-A
+AllIsBlack: convert C=1,M=1,Y=1 to just K=1. Works with bitcmyk input only.
+.TP
+.BI \-B
+BlackClears: K=1 forces C,M,Y to 0. Works with bitcmyk input only.
+.TP
+.BI \-X\0 padlen
+Add extra zero padding to the end of BID segments. The default is
+16 bytes.
+.SS Debugging Options
+These options are used for debugging \fBfoo2hp\fP.
+.TP
+.BI \-S\0 plane
+Output just a single color plane from a color print and print it
+on the black plane. The default is to output all color planes.
+.TS
+l l.
+1 Cyan
+2 Magenta
+3 Yellow
+4 Black
+.TE
+.TP
+.BI \-D\0 level
+Set Debug level [0].
+
+.SH EXAMPLES
+Create a black and white ZJS stream:
+
+.RS
+.nf
+gs -q -dBATCH -dSAFER -dQUIET -dNOPAUSE \
+ -sPAPERSIZE=letter -r600x600 -sDEVICE=pbmraw \
+ -sOutputFile=- - < testpage.ps \
+| foo2hp -r600x600 -g5100x6600 -p1 >testpage.zm
+.fi
+.RE
+.P
+Create a color ZJS stream:
+
+.RS
+.nf
+gs -q -dBATCH -dSAFER -dQUIET -dNOPAUSE \
+ -sPAPERSIZE=letter -g5100x6600 -r600x600 -sDEVICE=bitcmyk \
+ -sOutputFile=- - < testpage.ps \
+| foo2hp -r600x600 -g5100x6600 -p1 >testpage.zc
+.fi
+.RE
+
+.SH FILES
+.BR /usr/bin/foo2hp
+.SH SEE ALSO
+.BR foo2hp2600-wrapper (1),
+.BR zjsdecode (1)
+.SH "AUTHOR"
+Rick Richardson <rick.richardson@comcast.net>
+.br
+${URLHP}/
+'/"
+'/"
+'/"
+.em pdf_outline
diff --git a/foo2hp.c b/foo2hp.c
new file mode 100644
index 0000000..5a50478
--- /dev/null
+++ b/foo2hp.c
@@ -0,0 +1,1732 @@
+/*
+
+GENERAL
+This program converts pbm (B/W) images and 1-bit-per-pixel cmyk images
+(both produced by ghostscript) to Zenographics ZJ-stream format. There
+is some information about the ZJS format at http://ddk.zeno.com.
+
+With this utility, you can print to some HP, such as these:
+ - HP LaserJet 2600n mono or color
+ - HP LaserJet 1600 mono or color
+
+AUTHORS
+You can contact the current author at mailto:rick.richardson@comcast.net
+
+LICENSE
+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.
+
+If you want to use this program under different license conditions,
+then contact the author for an arrangement.
+
+It is possible that certain products which can be built using the jbig
+software module might form inventions protected by patent rights in
+some countries (e.g., by patents about arithmetic coding algorithms
+owned by IBM and AT&T in the USA). Provision of this software by the
+author does NOT include any licenses for any patents. In those
+countries where a patent license is required for certain applications
+of this software module, you will have to obtain such a license
+yourself.
+
+*/
+
+static char Version[] = "$Id: foo2hp.c,v 1.36 2006/12/07 13:24:30 rick Exp $";
+
+#include <stdio.h>
+#include <stdlib.h>
+#include <ctype.h>
+#include <string.h>
+#include <unistd.h>
+#include <stdarg.h>
+#include "jbig.h"
+#include "zjs.h"
+#include "cups.h"
+
+/*
+ * Command line options
+ */
+int Debug = 0;
+int ResX = 600;
+int ResY = 600;
+int Bpp = 1;
+int PaperCode = DMPAPER_LETTER;
+int PageWidth = 600 * 8.5;
+int PageHeight = 600 * 11;
+int UpperLeftX = 0;
+int UpperLeftY = 0;
+int LowerRightX = 0;
+int LowerRightY = 0;
+int Copies = 1;
+int Duplex = DMDUPLEX_OFF;
+int SourceCode = DMBIN_AUTO;
+int MediaCode = DMMEDIA_STANDARD;
+char *Username = NULL;
+char *Filename = NULL;
+int Mode = 0;
+ #define MODE_MONO 1
+ #define MODE_COLOR 2
+
+int Color2Mono = 0;
+int BlackClears = 0;
+int AllIsBlack = 0;
+int OutputStartPlane = 1;
+int ExtraPad = 0;
+
+int LogicalOffsetX = 0;
+int LogicalOffsetY = 0;
+
+#define LOGICAL_CLIP_X 2
+#define LOGICAL_CLIP_Y 1
+int LogicalClip = LOGICAL_CLIP_X | LOGICAL_CLIP_Y;
+int SaveToner = 0;
+int PageNum = 0;
+
+FILE *EvenPages = NULL;
+typedef struct
+{
+ off_t b, e;
+} SEEKREC;
+SEEKREC SeekRec[2000];
+int SeekIndex = 0;
+
+long JbgOptions[5] =
+{
+ /* Order */
+ JBG_ILEAVE | JBG_SMID,
+ /* Options */
+ JBG_DELAY_AT | JBG_LRLTWO | JBG_TPDON | JBG_TPBON | JBG_DPON,
+ /* L0 */
+ 128,
+ /* MX */
+ 16,
+ /* MY */
+ 0
+};
+
+void
+usage(void)
+{
+ fprintf(stderr,
+"Usage:\n"
+" foo2hp [options] <pbmraw-file >zjs-file\n"
+"\n"
+" Convert Ghostscript pbmraw format to a monochrome ZJS stream,\n"
+" for driving the Hewlett-Packard 2600n color laser printer\n"
+" and other Zenographics-based black and white printers.\n"
+"\n"
+" gs -q -dBATCH -dSAFER -dQUIET -dNOPAUSE \\ \n"
+" -sPAPERSIZE=letter -r600x600 -sDEVICE=pbmraw \\ \n"
+" -sOutputFile=- - < testpage.ps \\ \n"
+" | foo2hp -r600x600 -g5100x6600 -p1 >testpage.zm\n"
+"\n"
+" foo2hp [options] <bitcmyk-file >zjs-file\n"
+" foo2hp [options] <cups-file >zjs-file\n"
+"\n"
+" Convert Ghostscript bitcmyk or cups format to a color ZJS stream,\n"
+" for driving the Hewlett-Packard 2600n color laser printer\n"
+" N.B. Color correction is expected to be performed by ghostscript.\n"
+"\n"
+" gs -q -dBATCH -dSAFER -dQUIET -dNOPAUSE \\ \n"
+" -sPAPERSIZE=letter -g5100x6600 -r600x600 -sDEVICE=bitcmyk \\ \n"
+" -sOutputFile=- - < testpage.ps \\ \n"
+" | foo2hp -r600x600 -g5100x6600 -p1 >testpage.zc\n"
+"\n"
+"Normal Options:\n"
+"-b bits Bits per plane if autodetect doesn't work (1 or 2) [%d]\n"
+"-c Force color mode if autodetect doesn't work\n"
+"-d duplex Duplex code to send to printer [%d]\n"
+" 1=off, 2=longedge, 3=shortedge,\n"
+//" 4=manual longedge, 5=manual shortedge\n"
+"-g <xpix>x<ypix> Set page dimensions in pixels [%dx%d]\n"
+"-m media Media code to send to printer [%d]\n"
+" 1=plain 514=preprinted 513=letterhead 2=transparency\n"
+" 515=prepunched 265=labels 260=bond 516=recycled\n"
+" 512=color 276=tough 267=envelope 258=light 262=heavy\n"
+" 261=cardstock 268=lightglossy 269=glossy\n"
+" 270=heavyglossy 277=cover 278=photo\n"
+"-p paper Paper code to send to printer [%d]\n"
+" 1=letter, 5=legal 7=executive 9=A4 11=A5 13=B5jis\n"
+" 20=env#10, 27=envDL 28=envC5 34=envB5 37=envMonarch\n"
+"-n copies Number of copies [%d]\n"
+"-r <xres>x<yres> Set device resolution in pixels/inch [%dx%d]\n"
+"-s source Source code to send to printer [%d]\n"
+" 1=tray2 2=tray1 7=auto\n"
+" Code numbers may vary with printer model\n"
+"-t Draft mode. Every other pixel is white.\n"
+"-J filename Filename string to send to printer [%s]\n"
+"-U username Username string to send to printer [%s]\n"
+"\n"
+"Printer Tweaking Options:\n"
+"-u <xoff>x<yoff> Set offset of upper left printable in pixels [%dx%d]\n"
+"-l <xoff>x<yoff> Set offset of lower right printable in pixels [%dx%d]\n"
+"-L mask Send logical clipping values from -u/-l in ZjStream [%d]\n"
+" 0=no, 1=Y, 2=X, 3=XY\n"
+"-A AllIsBlack: convert C=1,M=1,Y=1 to just K=1\n"
+"-B BlackClears: K=1 forces C,M,Y to 0\n"
+" -A, -B work with bitcmyk input only\n"
+"-P Do not output START_PLANE codes. May be needed by some\n"
+" some black and white only printers.\n"
+"-X padlen Add extra zero padding to the end of BID segments [%d]\n"
+"\n"
+"Debugging Options:\n"
+"-S plane Output just a single color plane from a color print [all]\n"
+" 1=Cyan, 2=Magenta, 3=Yellow, 4=Black\n"
+"-D lvl Set Debug level [%d]\n"
+"-V Version %s\n"
+ , Bpp
+ , Duplex
+ , PageWidth , PageHeight
+ , MediaCode
+ , PaperCode
+ , Copies
+ , ResX , ResY
+ , SourceCode
+ , Filename ? Filename : ""
+ , Username ? Username : ""
+ , UpperLeftX , UpperLeftY
+ , LowerRightX , LowerRightY
+ , LogicalClip
+ , ExtraPad
+ , Debug
+ , Version
+ );
+
+ exit(1);
+}
+
+/*
+ * Mirror1: bits 01234567 become 76543210
+ */
+unsigned char Mirror1[256] =
+{
+ 0,128, 64,192, 32,160, 96,224, 16,144, 80,208, 48,176,112,240,
+ 8,136, 72,200, 40,168,104,232, 24,152, 88,216, 56,184,120,248,
+ 4,132, 68,196, 36,164,100,228, 20,148, 84,212, 52,180,116,244,
+ 12,140, 76,204, 44,172,108,236, 28,156, 92,220, 60,188,124,252,
+ 2,130, 66,194, 34,162, 98,226, 18,146, 82,210, 50,178,114,242,
+ 10,138, 74,202, 42,170,106,234, 26,154, 90,218, 58,186,122,250,
+ 6,134, 70,198, 38,166,102,230, 22,150, 86,214, 54,182,118,246,
+ 14,142, 78,206, 46,174,110,238, 30,158, 94,222, 62,190,126,254,
+ 1,129, 65,193, 33,161, 97,225, 17,145, 81,209, 49,177,113,241,
+ 9,137, 73,201, 41,169,105,233, 25,153, 89,217, 57,185,121,249,
+ 5,133, 69,197, 37,165,101,229, 21,149, 85,213, 53,181,117,245,
+ 13,141, 77,205, 45,173,109,237, 29,157, 93,221, 61,189,125,253,
+ 3,131, 67,195, 35,163, 99,227, 19,147, 83,211, 51,179,115,243,
+ 11,139, 75,203, 43,171,107,235, 27,155, 91,219, 59,187,123,251,
+ 7,135, 71,199, 39,167,103,231, 23,151, 87,215, 55,183,119,247,
+ 15,143, 79,207, 47,175,111,239, 31,159, 95,223, 63,191,127,255,
+};
+
+/*
+ * Mirror2: bits 01234567 become 67452301
+ */
+unsigned char Mirror2[256] =
+{
+ 0, 64,128,192, 16, 80,144,208, 32, 96,160,224, 48,112,176,240,
+ 4, 68,132,196, 20, 84,148,212, 36,100,164,228, 52,116,180,244,
+ 8, 72,136,200, 24, 88,152,216, 40,104,168,232, 56,120,184,248,
+ 12, 76,140,204, 28, 92,156,220, 44,108,172,236, 60,124,188,252,
+ 1, 65,129,193, 17, 81,145,209, 33, 97,161,225, 49,113,177,241,
+ 5, 69,133,197, 21, 85,149,213, 37,101,165,229, 53,117,181,245,
+ 9, 73,137,201, 25, 89,153,217, 41,105,169,233, 57,121,185,249,
+ 13, 77,141,205, 29, 93,157,221, 45,109,173,237, 61,125,189,253,
+ 2, 66,130,194, 18, 82,146,210, 34, 98,162,226, 50,114,178,242,
+ 6, 70,134,198, 22, 86,150,214, 38,102,166,230, 54,118,182,246,
+ 10, 74,138,202, 26, 90,154,218, 42,106,170,234, 58,122,186,250,
+ 14, 78,142,206, 30, 94,158,222, 46,110,174,238, 62,126,190,254,
+ 3, 67,131,195, 19, 83,147,211, 35, 99,163,227, 51,115,179,243,
+ 7, 71,135,199, 23, 87,151,215, 39,103,167,231, 55,119,183,247,
+ 11, 75,139,203, 27, 91,155,219, 43,107,171,235, 59,123,187,251,
+ 15, 79,143,207, 31, 95,159,223, 47,111,175,239, 63,127,191,255,
+};
+
+/*
+ * Mirror4: bits 01234567 become 45670123
+ */
+unsigned char Mirror4[256] =
+{
+ 0, 16, 32, 48, 64, 80, 96,112,128,144,160,176,192,208,224,240,
+ 1, 17, 33, 49, 65, 81, 97,113,129,145,161,177,193,209,225,241,
+ 2, 18, 34, 50, 66, 82, 98,114,130,146,162,178,194,210,226,242,
+ 3, 19, 35, 51, 67, 83, 99,115,131,147,163,179,195,211,227,243,
+ 4, 20, 36, 52, 68, 84,100,116,132,148,164,180,196,212,228,244,
+ 5, 21, 37, 53, 69, 85,101,117,133,149,165,181,197,213,229,245,
+ 6, 22, 38, 54, 70, 86,102,118,134,150,166,182,198,214,230,246,
+ 7, 23, 39, 55, 71, 87,103,119,135,151,167,183,199,215,231,247,
+ 8, 24, 40, 56, 72, 88,104,120,136,152,168,184,200,216,232,248,
+ 9, 25, 41, 57, 73, 89,105,121,137,153,169,185,201,217,233,249,
+ 10, 26, 42, 58, 74, 90,106,122,138,154,170,186,202,218,234,250,
+ 11, 27, 43, 59, 75, 91,107,123,139,155,171,187,203,219,235,251,
+ 12, 28, 44, 60, 76, 92,108,124,140,156,172,188,204,220,236,252,
+ 13, 29, 45, 61, 77, 93,109,125,141,157,173,189,205,221,237,253,
+ 14, 30, 46, 62, 78, 94,110,126,142,158,174,190,206,222,238,254,
+ 15, 31, 47, 63, 79, 95,111,127,143,159,175,191,207,223,239,255,
+};
+
+/*
+ * Mirror24: bits 01234567 become 10325476
+ */
+unsigned char Mirror24[256] =
+{
+ 0, 2, 1, 3, 8, 10, 9, 11, 4, 6, 5, 7, 12, 14, 13, 15,
+ 32, 34, 33, 35, 40, 42, 41, 43, 36, 38, 37, 39, 44, 46, 45, 47,
+ 16, 18, 17, 19, 24, 26, 25, 27, 20, 22, 21, 23, 28, 30, 29, 31,
+ 48, 50, 49, 51, 56, 58, 57, 59, 52, 54, 53, 55, 60, 62, 61, 63,
+ 128,130,129,131,136,138,137,139,132,134,133,135,140,142,141,143,
+ 160,162,161,163,168,170,169,171,164,166,165,167,172,174,173,175,
+ 144,146,145,147,152,154,153,155,148,150,149,151,156,158,157,159,
+ 176,178,177,179,184,186,185,187,180,182,181,183,188,190,189,191,
+ 64, 66, 65, 67, 72, 74, 73, 75, 68, 70, 69, 71, 76, 78, 77, 79,
+ 96, 98, 97, 99,104,106,105,107,100,102,101,103,108,110,109,111,
+ 80, 82, 81, 83, 88, 90, 89, 91, 84, 86, 85, 87, 92, 94, 93, 95,
+ 112,114,113,115,120,122,121,123,116,118,117,119,124,126,125,127,
+ 192,194,193,195,200,202,201,203,196,198,197,199,204,206,205,207,
+ 224,226,225,227,232,234,233,235,228,230,229,231,236,238,237,239,
+ 208,210,209,211,216,218,217,219,212,214,213,215,220,222,221,223,
+ 240,242,241,243,248,250,249,251,244,246,245,247,252,254,253,255,
+};
+
+void
+rotate_bytes_180(unsigned char *sp, unsigned char *ep, unsigned char *mirror)
+{
+ unsigned char tmp;
+
+ while (sp < ep)
+ {
+ tmp = mirror[*sp];
+ *sp = mirror[*ep];
+ *ep = tmp;
+ ++sp;
+ --ep;
+ }
+ if (sp == ep)
+ *sp = mirror[*sp];
+}
+
+void
+debug(int level, char *fmt, ...)
+{
+ va_list ap;
+
+ if (Debug < level)
+ return;
+
+ setvbuf(stderr, (char *) NULL, _IOLBF, BUFSIZ);
+ va_start(ap, fmt);
+ vfprintf(stderr, fmt, ap);
+ va_end(ap);
+}
+
+void
+error(int fatal, char *fmt, ...)
+{
+ va_list ap;
+
+ va_start(ap, fmt);
+ vfprintf(stderr, fmt, ap);
+ va_end(ap);
+
+ if (fatal)
+ exit(fatal);
+}
+
+static void
+chunk_write_rsvd(unsigned long type, unsigned int rsvd,
+ unsigned long items, unsigned long size, FILE *fp)
+{
+ ZJ_HEADER chunk;
+
+ chunk.type = be32(type);
+ chunk.items = be32(items);
+ chunk.size = be32(sizeof(ZJ_HEADER) + size);
+ chunk.reserved = be16(rsvd);
+ chunk.signature = 0x5a5a;
+ fwrite(&chunk, 1, sizeof(ZJ_HEADER), fp);
+}
+
+static void
+chunk_write(unsigned long type, unsigned long items, unsigned long size,
+ FILE *fp)
+{
+ chunk_write_rsvd(type, 0, items, size, fp);
+}
+
+static void
+item_uint32_write(unsigned short item, unsigned long value, FILE *fp)
+{
+ ZJ_ITEM_UINT32 item_uint32;
+
+ item_uint32.header.size = be32(sizeof(ZJ_ITEM_UINT32));
+ item_uint32.header.item = be16(item);
+ item_uint32.header.type = ZJIT_UINT32;
+ item_uint32.header.param = 0;
+ item_uint32.value = be32(value);
+ fwrite(&item_uint32, 1, sizeof(ZJ_ITEM_UINT32), fp);
+}
+
+static int
+item_str_write(unsigned short item, char *str, FILE *fp)
+{
+ int lenpadded;
+ ZJ_ITEM_HEADER hdr;
+
+ lenpadded = 4 * ((strlen(str)+1 + 3) / 4);
+
+ hdr.size = be32(sizeof(hdr) + lenpadded);
+ hdr.item = be16(item);
+ hdr.type = ZJIT_STRING;
+ hdr.param = 0;
+ if (fp)
+ {
+ fwrite(&hdr, sizeof(hdr), 1, fp);
+ fwrite(str, lenpadded, 1, fp);
+ }
+ return (sizeof(hdr) + lenpadded);
+}
+
+static int
+item_bytelut_write(unsigned short item, int size, unsigned char *p, FILE *fp)
+{
+ int lenpadded;
+ ZJ_ITEM_HEADER hdr;
+ DWORD val;
+
+ lenpadded = 4 * ((size + 3) / 4);
+
+ hdr.size = be32(sizeof(hdr) + 4 + lenpadded);
+ hdr.item = be16(item);
+ hdr.type = ZJIT_BYTELUT;
+ hdr.param = 0;
+ if (fp)
+ {
+ val = be32(size);
+ fwrite(&hdr, sizeof(hdr), 1, fp);
+ fwrite(&val, 4, 1, fp);
+ fwrite(p, lenpadded, 1, fp);
+ }
+ return (sizeof(hdr) + 4 + lenpadded);
+}
+
+/*
+ * A linked list of compressed data
+ */
+typedef struct _BIE_CHAIN{
+ unsigned char *data;
+ size_t len;
+ struct _BIE_CHAIN *next;
+} BIE_CHAIN;
+
+void
+free_chain(BIE_CHAIN *chain)
+{
+ BIE_CHAIN *next;
+ next = chain;
+ while ((chain = next))
+ {
+ next = chain->next;
+ if (chain->data)
+ free(chain->data);
+ free(chain);
+ }
+}
+
+int
+write_bitmap_plane(int planeNum, int eof, int incry, BIE_CHAIN **root, FILE *fp)
+{
+ BIE_CHAIN *current = *root;
+ BIE_CHAIN *next;
+ int i, len, pad_len;
+ #define PADTO 4
+
+ debug(3, "Write Plane %d\n", planeNum);
+
+ /* error handling */
+ if (!current)
+ error(1,"There is no JBIG!\n");
+ if (!current->next)
+ error(1,"There is no or wrong JBIG header!\n");
+ if (current->len != 20)
+ error(1,"wrong BIH length\n");
+
+ if (planeNum)
+ {
+ int size = 0;
+
+ for (current = *root; current && current->len; current = current->next)
+ {
+ if (current == *root)
+ {}
+ //size = current->len;
+ else
+ {
+ len = current->len;
+ next = current->next;
+ if (!next || !next->len)
+ pad_len = ExtraPad + PADTO * ((len+PADTO-1)/PADTO) - len;
+ else
+ pad_len = 0;
+ size += len + pad_len;
+ }
+ }
+ if (eof)
+ {
+ debug(3, "Write Plane %d %d\n", planeNum, eof);
+ chunk_write_rsvd(ZJT_2600N, 0x24,
+ 3, size + 3*sizeof(ZJ_ITEM_UINT32), fp);
+ item_uint32_write(ZJI_PLANE, planeNum, fp);
+ item_uint32_write(ZJI_INCRY, incry, fp);
+ item_uint32_write(0x67, 1, fp);
+ }
+ else
+ {
+ chunk_write_rsvd(ZJT_2600N, 0xc,
+ 1, size + 1*sizeof(ZJ_ITEM_UINT32), fp);
+ item_uint32_write(ZJI_PLANE, planeNum, fp);
+ }
+ }
+
+ for (current = *root; current && current->len; current = current->next)
+ {
+ if (current == *root)
+ {
+// chunk_write(ZJT_JBIG_BIH, 0, current->len, fp);
+ //fwrite(current->data, 1, current->len, fp);
+ }
+ else
+ {
+ len = current->len;
+ next = current->next;
+ if (!next || !next->len)
+ pad_len = ExtraPad + PADTO * ((len+PADTO-1)/PADTO) - len;
+ else
+ pad_len = 0;
+ //chunk_write(ZJT_JBIG_BID, 0, len + pad_len, fp);
+ fwrite(current->data, 1, len, fp);
+ for (i = 0; i < pad_len; i++ )
+ putc(0, fp);
+ }
+ }
+
+ free_chain(*root);
+
+ return 0;
+}
+
+void
+start_bitmap_page(int w, int h, int nbie, FILE *ofp)
+{
+ //static int pageno = 0;
+ int nitems;
+
+ nitems = 13;
+ chunk_write_rsvd(ZJT_START_PAGE, 0x9c,
+ nitems, nitems * sizeof(ZJ_ITEM_UINT32), ofp);
+ item_uint32_write(ZJI_PLANE, nbie, ofp);
+ item_uint32_write(ZJI_DMPAPER, PaperCode, ofp);
+ item_uint32_write(ZJI_DMCOPIES, Copies, ofp);
+ item_uint32_write(ZJI_DMDEFAULTSOURCE, SourceCode, ofp);
+ item_uint32_write(ZJI_DMMEDIATYPE, MediaCode, ofp);
+ item_uint32_write(ZJI_NBIE, nbie, ofp);
+ item_uint32_write(ZJI_RESOLUTION_X, ResX, ofp);
+ item_uint32_write(ZJI_RESOLUTION_Y, ResY, ofp);
+ item_uint32_write(ZJI_RASTER_X, w*Bpp, ofp);
+ item_uint32_write(ZJI_RASTER_Y, h, ofp);
+ item_uint32_write(ZJI_VIDEO_BPP, Bpp, ofp);
+ item_uint32_write(ZJI_VIDEO_X, w, ofp);
+ item_uint32_write(ZJI_VIDEO_Y, h, ofp);
+ // RES_X == ResX*Bpp, VIDEO_X == w; HP has a bug!!!!
+
+ //item_uint32_write(ZJI_OFFSET_X, LogicalOffsetX, ofp);
+ //item_uint32_write(ZJI_OFFSET_Y, LogicalOffsetY, ofp);
+ //item_uint32_write(ZJI_MINOLTA_PAGE_NUMBER, ++pageno, ofp);
+}
+
+void
+end_page(int np, FILE *ofp)
+{
+ int nitems;
+
+ nitems = 8;
+ chunk_write_rsvd(ZJT_END_PAGE, 0x60,
+ nitems, nitems * sizeof(ZJ_ITEM_UINT32), ofp);
+ item_uint32_write(0x8200, (np>1) ? 1 : 0, ofp);
+ item_uint32_write(0x8201, (np>1) ? 1 : 0, ofp);
+ item_uint32_write(0x8202, (np>1) ? 1 : 0, ofp);
+ item_uint32_write(0x8203, 1, ofp);
+ item_uint32_write(0x8204, (np>1) ? 1 : 0, ofp);
+ item_uint32_write(0x8205, (np>1) ? 1 : 0, ofp);
+ item_uint32_write(0x8206, (np>1) ? 1 : 0, ofp);
+ item_uint32_write(0x8207, 1, ofp);
+}
+
+/*
+ * This creates a linked list of compressed data. The first item
+ * in the list is the BIH and is always 20 bytes in size. Each following
+ * item is 65536 bytes in length. The last item length is whatever remains.
+ */
+void
+output_jbig(unsigned char *start, size_t len, void *cbarg)
+{
+ BIE_CHAIN *current, **root = (BIE_CHAIN **) cbarg;
+ int size = 65536; // Printer does strange things otherwise.
+ int i, state;
+ unsigned char ch;
+
+ // Delete everything after ff 02
+ state = 0;
+ for (i = 0; i < len; ++i)
+ {
+ ch = start[i];
+ switch (state)
+ {
+ case 0:
+ if (ch == 0xff) state = 0xff;
+ break;
+ case 0xff:
+ if (ch == 0x02) { len = i + 1; goto out; }
+ if (state == 0xff) state = 0;
+ break;
+ }
+ }
+out:
+
+ if ( (*root) == NULL)
+ {
+ (*root) = malloc(sizeof(BIE_CHAIN));
+ if (!(*root))
+ error(1, "Can't allocate space for chain\n");
+
+ (*root)->data = NULL;
+ (*root)->next = NULL;
+ (*root)->len = 0;
+ size = 20;
+ if (len != 20)
+ error(1, "First chunk must be BIH and 20 bytes long\n");
+ }
+
+ current = *root;
+ while (current->next)
+ current = current->next;
+
+ while (len > 0)
+ {
+ int amt, left;
+
+ if (!current->data)
+ {
+ current->data = malloc(size);
+ if (!current->data)
+ error(1, "Can't allocate space for compressed data\n");
+ }
+
+ left = size - current->len;
+ amt = (len > left) ? left : len;
+ memcpy(current->data + current->len, start, amt);
+ current->len += amt;
+ len -= amt;
+ start += amt;
+
+ if (current->len == size)
+ {
+ current->next = malloc(sizeof(BIE_CHAIN));
+ if (!current->next)
+ error(1, "Can't allocate space for chain\n");
+ current = current->next;
+ current->data = NULL;
+ current->next = NULL;
+ current->len = 0;
+ }
+ }
+}
+
+int
+write_bitmap_page(int w, int h, int np, unsigned char *bitmaps[4], FILE *ofp)
+{
+ int x, y;
+ int p;
+ int size;
+ int i;
+ DWORD bih[5];
+ int w16;
+
+ start_bitmap_page(w, h, np, ofp);
+ if (Bpp == 2)
+ w16 = (w + 63) & ~63;
+ else
+ w16 = (w + 127) & ~127;
+ debug(2, "w16 = %d\n", w16);
+
+ for (p = 0; p < np; ++p)
+ {
+ int nitems;
+
+ nitems = 7;
+ size = nitems * sizeof(ZJ_ITEM_UINT32);
+ ++nitems;
+ bih[0] = 1 << 8;
+ bih[1] = w16*Bpp;
+ bih[2] = 100;
+ bih[3] = 128;
+ bih[4] = (16 << 24) | ((JBG_ILEAVE|JBG_SMID) << 8) |
+ ((JBG_LRLTWO | JBG_TPDON | JBG_TPBON | JBG_DPON) << 0);
+ for (i = 0; i < 5; ++i)
+ bih[i] = be32(bih[i]);
+ size += item_bytelut_write(0, 20, (unsigned char *) bih, NULL);
+
+ chunk_write_rsvd(ZJT_2600N, 0x74, nitems, size, ofp);
+ item_uint32_write(0x65, 1, ofp);
+ item_uint32_write(0x68, w16*Bpp, ofp);
+ item_uint32_write(0x6b, w16*Bpp, ofp);
+ item_uint32_write(ZJI_INCRY, 100, ofp);
+ item_uint32_write(0x6a, 1, ofp);
+ item_uint32_write(ZJI_VIDEO_BPP, Bpp, ofp);
+ item_uint32_write(ZJI_PLANE, (np==1) ? 4 : p+1, ofp);
+ item_bytelut_write(ZJI_JBIG_BIH, 20, (unsigned char *) bih, ofp);
+
+ if (Bpp == 2)
+ {
+ for (y = 0; y < h; ++y)
+ for (x = 0; x < w16*Bpp/8; ++x)
+ bitmaps[p][y*w16*Bpp/8 + x]
+ = Mirror24[ bitmaps[p][y*w16*Bpp/8 + x] ];
+ }
+ }
+
+ for (y = 0; y < h; y += 100)
+ {
+ for (p = 0; p < np; ++p)
+ {
+ struct jbg_enc_state se;
+ BIE_CHAIN *chain = NULL;
+ int len, eof;
+
+ len = h - y;
+ if (len > 100)
+ len = 100;
+ eof = (y+100) >= h;
+ jbg_enc_init(&se, w16*Bpp, len, 1, &bitmaps[p],
+ output_jbig, &chain);
+ jbg_enc_options(&se, JbgOptions[0], JbgOptions[1],
+ JbgOptions[2], JbgOptions[3], JbgOptions[4]);
+ jbg_enc_out(&se);
+ jbg_enc_free(&se);
+
+ write_bitmap_plane((np==1) ? 4 : p+1, eof, len, &chain, ofp);
+ bitmaps[p] += (100*w16*Bpp + 7) / 8;
+ }
+ }
+
+ end_page(np, ofp);
+ return 0;
+}
+
+void
+start_doc(FILE *fp)
+{
+ char header[4] = "JZJZ"; // Big-endian data
+ int nitems;
+ int size;
+
+ fwrite(header, 1, sizeof(header), fp);
+
+ nitems = 3;
+ size = nitems * sizeof(ZJ_ITEM_UINT32);
+ if (Username)
+ {
+ ++nitems;
+ size += item_str_write(0, Username, NULL);
+ }
+ if (Filename)
+ {
+ ++nitems;
+ size += item_str_write(0, Filename, NULL);
+ }
+
+ chunk_write_rsvd(ZJT_START_DOC, 0x24, nitems, size, fp);
+ item_uint32_write(ZJI_DMCOLLATE, 0, fp);
+ item_uint32_write(ZJI_DMDUPLEX, Duplex, fp);
+ item_uint32_write(ZJI_PAGECOUNT, 0, fp);
+
+ if (Username)
+ item_str_write(ZJI_MINOLTA_USERNAME, Username, fp);
+ if (Filename)
+ item_str_write(ZJI_MINOLTA_FILENAME, Filename, fp);
+}
+
+void
+end_doc(FILE *fp)
+{
+ int nitems;
+
+ nitems = 0;
+ chunk_write(ZJT_END_DOC , nitems, nitems * sizeof(ZJ_ITEM_UINT32), fp);
+}
+
+void
+load_tray2(FILE *fp)
+{
+ int nitems;
+
+ nitems = 0;
+ chunk_write(ZJT_2600N_PAUSE, nitems, nitems * sizeof(ZJ_ITEM_UINT32), fp);
+}
+
+static int AnyColor;
+
+void
+cmyk_planes(unsigned char *plane[4], unsigned char *raw, int w, int h)
+{
+ int rawbpl = (w+1) / 2;
+ int bpl = (w + 7) / 8;
+ int i;
+ int x, y;
+ unsigned char byte;
+ unsigned char mask[8] = { 128, 64, 32, 16, 8, 4, 2, 1 };
+ int aib = AllIsBlack;
+ int bc = BlackClears;
+
+ bpl = (bpl + 15) & ~15;
+ AnyColor = 0;
+ for (i = 0; i < 4; ++i)
+ memset(plane[i], 0, bpl * h);
+
+ //
+ // Unpack the combined plane into individual color planes
+ //
+ // TODO: this can be speeded up using a 256 or 65536 entry lookup table
+ //
+ for (y = 0; y < h; ++y)
+ {
+ for (x = 0; x < w; ++x)
+ {
+ byte = raw[y*rawbpl + x/2];
+
+ if (aib && (byte & 0xE0) == 0xE0)
+ {
+ plane[3][y*bpl + x/8] |= mask[x&7];
+ }
+ else if (byte & 0x10)
+ {
+ plane[3][y*bpl + x/8] |= mask[x&7];
+ if (!bc)
+ {
+ if (byte & 0x80) plane[0][y*bpl + x/8] |= mask[x&7];
+ if (byte & 0x40) plane[1][y*bpl + x/8] |= mask[x&7];
+ if (byte & 0x20) plane[2][y*bpl + x/8] |= mask[x&7];
+ if (byte & 0xE0) AnyColor |= byte;
+ }
+ }
+ else
+ {
+ if (byte & 0x80) plane[0][y*bpl + x/8] |= mask[x&7];
+ if (byte & 0x40) plane[1][y*bpl + x/8] |= mask[x&7];
+ if (byte & 0x20) plane[2][y*bpl + x/8] |= mask[x&7];
+ if (byte & 0xE0) AnyColor |= byte;
+ }
+
+ ++x;
+ if (aib && (byte & 0x0E) == 0x0E)
+ {
+ plane[3][y*bpl + x/8] |= mask[x&7];
+ }
+ else if (byte & 0x1)
+ {
+ plane[3][y*bpl + x/8] |= mask[x&7];
+ if (!bc)
+ {
+ if (byte & 0x8) plane[0][y*bpl + x/8] |= mask[x&7];
+ if (byte & 0x4) plane[1][y*bpl + x/8] |= mask[x&7];
+ if (byte & 0x2) plane[2][y*bpl + x/8] |= mask[x&7];
+ if (byte & 0xE) AnyColor |= byte;
+ }
+ }
+ else
+ {
+ if (byte & 0x8) plane[0][y*bpl + x/8] |= mask[x&7];
+ if (byte & 0x4) plane[1][y*bpl + x/8] |= mask[x&7];
+ if (byte & 0x2) plane[2][y*bpl + x/8] |= mask[x&7];
+ if (byte & 0xE) AnyColor |= byte;
+ }
+ }
+ }
+ debug(2, "BlackClears = %d; AnyColor = %s %s %s\n",
+ BlackClears,
+ (AnyColor & 0x88) ? "Cyan" : "",
+ (AnyColor & 0x44) ? "Magenta" : "",
+ (AnyColor & 0x22) ? "Yellow" : ""
+ );
+}
+
+int
+cmyk_page(unsigned char *raw, int w, int h, FILE *ofp)
+{
+ int i;
+ int bpl = (w + 7) / 8;
+ int bpl16 = (bpl + 15) & ~15;
+ unsigned char *plane[4], *bitmaps[4];
+
+ for (i = 0; i < 4; ++i)
+ {
+ plane[i] = malloc(bpl16 * h);
+ if (!plane[i]) error(3, "Cannot allocate space for bit plane\n");
+ debug(1, "malloc plane[%d] = %x\n", i, plane[i]);
+ }
+
+ cmyk_planes(plane, raw, w, h);
+ for (i = 0; i < 4; ++i)
+ {
+ if (Debug >= 9)
+ {
+ FILE *dfp;
+ char fname[256];
+ sprintf(fname, "xxxplane%d", i);
+ dfp = fopen(fname, "w");
+ if (dfp)
+ {
+ fwrite(plane[i], bpl*h, 1, dfp);
+ fclose(dfp);
+ }
+ }
+
+ bitmaps[i] = plane[i];
+ }
+
+ if (Color2Mono)
+ write_bitmap_page(w, h, 1, &bitmaps[Color2Mono-1], ofp);
+ else if (AnyColor)
+ write_bitmap_page(w, h, 4, bitmaps, ofp);
+ else
+ write_bitmap_page(w, h, 1, &bitmaps[3], ofp);
+
+ for (i = 0; i < 4; ++i)
+ {
+ debug(1, "free plane[%d] = %x\n", i, plane[i]);
+ free(plane[i]);
+ }
+ return 0;
+}
+
+int
+pksm_page(unsigned char *plane[4], int w, int h, FILE *ofp)
+{
+ int i;
+ unsigned char *bitmaps[4];
+
+ for (i = 0; i < 4; ++i)
+ bitmaps[i] = plane[i];
+
+ if (Color2Mono)
+ write_bitmap_page(w, h, 1, &bitmaps[Color2Mono-1], ofp);
+ else if (AnyColor)
+ write_bitmap_page(w, h, 4, bitmaps, ofp);
+ else
+ write_bitmap_page(w, h, 1, &bitmaps[3], ofp);
+
+ return 0;
+}
+
+int
+pbm_page(unsigned char *buf, int w, int h, FILE *ofp)
+{
+ unsigned char *bitmaps[1];
+
+ if (SaveToner && Bpp == 1)
+ {
+ int x, y;
+ int bpl, bpl16;
+
+ bpl = (w + 7) / 8;
+ bpl16 = (bpl + 15) & ~15;
+
+ for (y = 0; y < h; y += 2)
+ for (x = 0; x < bpl16; ++x)
+ buf[y*bpl16 + x] &= 0x55;
+ for (y = 1; y < h; y += 2)
+ for (x = 0; x < bpl16; ++x)
+ buf[y*bpl16 + x] &= 0xaa;
+ }
+
+ bitmaps[0] = buf;
+
+ write_bitmap_page(w, h, 1, bitmaps, ofp);
+
+ return 0;
+}
+
+int
+read_and_clip_image(unsigned char *buf,
+ int rawBpl, int rightBpl, int pixelsPerByte,
+ int bpl, int h, int bpl16, FILE *ifp)
+{
+ unsigned char *rowbuf, *rowp;
+ int y;
+ int rc;
+
+ rowbuf = malloc(rawBpl);
+ if (!rowbuf)
+ error(1, "Can't allocate row buffer\n");
+
+ // Clip top rows
+ if (UpperLeftY)
+ {
+ for (y = 0; y < UpperLeftY; ++y)
+ {
+ rc = fread(rowbuf, rawBpl, 1, ifp);
+ if (rc == 0)
+ goto eof;
+ if (rc != 1)
+ error(1, "Premature EOF(1) on input at y=%d\n", y);
+ }
+ }
+
+ // Copy the rows that we want to image
+ rowp = buf;
+ for (y = 0; y < h; ++y, rowp += bpl16)
+ {
+ // Clip left pixel *bytes*
+ if (UpperLeftX)
+ {
+ rc = fread(rowbuf, UpperLeftX / pixelsPerByte, 1, ifp);
+ if (rc == 0 && y == 0 && !UpperLeftY)
+ goto eof;
+ if (rc != 1)
+ error(1, "Premature EOF(2) on input at y=%d\n", y);
+ }
+
+ memset(rowp, 0, bpl16);
+ rc = fread(rowp, bpl, 1, ifp);
+ if (rc == 0 && y == 0 && !UpperLeftY && !UpperLeftX)
+ goto eof;
+ if (rc != 1)
+ error(1, "Premature EOF(3) on input at y=%d\n", y);
+
+ // Clip right pixels
+ if (rightBpl != bpl)
+ {
+ rc = fread(rowbuf, rightBpl - bpl, 1, ifp);
+ if (rc != 1)
+ error(1, "Premature EOF(4) on input at y=%d\n", y);
+ }
+ }
+
+ // Clip bottom rows
+ if (LowerRightY)
+ {
+ for (y = 0; y < LowerRightY; ++y)
+ {
+ rc = fread(rowbuf, rawBpl, 1, ifp);
+ if (rc != 1)
+ error(1, "Premature EOF(5) on input at y=%d\n", y);
+ }
+ }
+
+ free(rowbuf);
+ return (0);
+
+eof:
+ free(rowbuf);
+ return (EOF);
+}
+
+int
+cmyk_pages(FILE *ifp, FILE *ofp)
+{
+ unsigned char *buf;
+ int rawW, rawH, rawBpl;
+ int rightBpl;
+ int w, h, bpl;
+ int rc;
+
+ //
+ // Save the original Upper Right clip values as the logical offset,
+ // because we may adjust them slightly below, in the interest of speed.
+ //
+ if (LogicalClip & LOGICAL_CLIP_X)
+ LogicalOffsetX = UpperLeftX;
+ if (LogicalClip & LOGICAL_CLIP_Y)
+ LogicalOffsetY = UpperLeftY;
+
+ rawW = PageWidth;
+ rawH = PageHeight;
+ rawBpl = (PageWidth + 1) / 2;
+
+ // We only clip multiples of 2 pixels off the leading edge, and
+ // add any remainder to the amount we clip from the right edge.
+ // Its fast, and good enough for government work.
+ LowerRightX += UpperLeftX & 1;
+ UpperLeftX &= ~1;
+
+ w = rawW - UpperLeftX - LowerRightX;
+ h = rawH - UpperLeftY - LowerRightY;
+ bpl = (w + 1) / 2;
+ rightBpl = (rawW - UpperLeftX + 1) / 2;
+
+ buf = malloc(bpl * h);
+ if (!buf)
+ error(1, "Unable to allocate page buffer of %d x %d = %d bytes\n",
+ rawW, rawH, rawBpl * rawH);
+
+ for (;;)
+ {
+ rc = read_and_clip_image(buf, rawBpl, rightBpl, 2, bpl, h, bpl, ifp);
+ if (rc == EOF)
+ goto done;
+
+ ++PageNum;
+ if (Duplex == DMDUPLEX_LONGEDGE && (PageNum & 1) == 0)
+ rotate_bytes_180(buf, buf + bpl * h - 1, Mirror4);
+ if (Duplex == DMDUPLEX_MANUALLONG && (PageNum & 1) == 0)
+ rotate_bytes_180(buf, buf + bpl * h - 1, Mirror4);
+
+ if ((PageNum & 1) == 0 && EvenPages)
+ {
+ SeekRec[SeekIndex].b = ftell(EvenPages);
+ cmyk_page(buf, w, h, EvenPages);
+ SeekRec[SeekIndex].e = ftell(EvenPages);
+ debug(1, "CMYK Page: %d %ld %ld\n",
+ PageNum, SeekRec[SeekIndex].b, SeekRec[SeekIndex].e);
+ SeekIndex++;
+ }
+ else
+ cmyk_page(buf, w, h, ofp);
+ }
+
+done:
+ free(buf);
+ return 0;
+}
+
+static unsigned long
+getint(FILE *fp)
+{
+ int c;
+ unsigned long i;
+
+ while ((c = getc(fp)) != EOF && !isdigit(c))
+ if (c == '#')
+ while ((c = getc(fp)) != EOF && !(c == 13 || c == 10)) ;
+ if (c != EOF)
+ {
+ ungetc(c, fp);
+ fscanf(fp, "%lu", &i);
+ }
+ return i;
+}
+
+static void
+skip_to_nl(FILE *fp)
+{
+ for (;;)
+ {
+ int c;
+ c = getc(fp);
+ if (c == EOF)
+ error(1, "Premature EOF on input stream\n");
+ if (c == '\n')
+ return;
+ }
+}
+
+int
+pbm_header(FILE *ifp, int *p4eatenp, int *wp, int *hp)
+{
+ int c1, c2;
+
+ if (*p4eatenp)
+ *p4eatenp = 0; // P4 already eaten in main
+ else
+ {
+ c1 = getc(ifp);
+ if (c1 == EOF)
+ return 0;
+ c2 = getc(ifp);
+ if (c1 != 'P' || c2 != '4')
+ error(1, "Not a pbmraw data stream\n");
+ }
+
+ skip_to_nl(ifp);
+
+ *wp = getint(ifp);
+ *hp = getint(ifp);
+ skip_to_nl(ifp);
+ return 1;
+}
+
+int
+pksm_pages(FILE *ifp, FILE *ofp)
+{
+ unsigned char *plane[4];
+ int rawW, rawH, rawBpl;
+ int saveW = 0, saveH = 0;
+ int rightBpl;
+ int w, h, bpl;
+ int bpl16;
+ int i;
+ int rc;
+ int p4eaten = 1;
+
+ //
+ // Save the original Upper Right clip values as the logical offset,
+ // because we may adjust them slightly below, in the interest of speed.
+ //
+ if (LogicalClip & LOGICAL_CLIP_X)
+ LogicalOffsetX = UpperLeftX;
+ if (LogicalClip & LOGICAL_CLIP_Y)
+ LogicalOffsetY = UpperLeftY;
+
+ for (;;)
+ {
+ ++PageNum;
+ AnyColor = 0;
+
+ for (i = 0; i < 4; ++i)
+ {
+ if (pbm_header(ifp, &p4eaten, &rawW, &rawH) == 0)
+ {
+ if (i == 0)
+ goto eof;
+ else
+ error(1, "Premature EOF(pksm) on page %d hdr, plane %d\n",
+ PageNum, i);
+ }
+ if (i == 0)
+ {
+ saveW = rawW;
+ saveH = rawH;
+ }
+ if (saveW != rawW)
+ error(1, "Image width changed from %d to %d on plane %d\n",
+ saveW, rawW, i);
+ if (saveH != rawH)
+ error(1, "Image height changed from %d to %d on plane %d\n",
+ saveH, rawH, i);
+
+ rawBpl = (rawW + 7) / 8;
+
+ // We only clip multiples of 8 pixels off the leading edge, and
+ // add any remainder to the amount we clip from the right edge.
+ // Its fast, and good enough for government work.
+ LowerRightX += UpperLeftX & 7;
+ UpperLeftX &= ~7;
+
+ w = rawW - UpperLeftX - LowerRightX;
+ h = rawH - UpperLeftY - LowerRightY;
+ bpl = (w + 7) / 8;
+ rightBpl = (rawW - UpperLeftX + 7) / 8;
+
+ bpl16 = (bpl + 15) & ~15;
+ plane[i] = malloc(bpl16 * h);
+ if (!plane[i])
+ error(1, "Can't allocate plane buffer\n");
+
+ rc = read_and_clip_image(plane[i],
+ rawBpl, rightBpl, 8, bpl, h, bpl16, ifp);
+ if (rc == EOF)
+ error(1, "Premature EOF(pksm) on page %d data, plane %d\n",
+ PageNum, i);
+
+ if (Debug >= 9)
+ {
+ FILE *dfp;
+ char fname[256];
+ sprintf(fname, "xxxplane%d", i);
+ dfp = fopen(fname, "w");
+ if (dfp)
+ {
+ fwrite(plane[i], bpl*h, 1, dfp);
+ fclose(dfp);
+ }
+ }
+
+ // See if we can optimize this to be a monochrome page
+ if (!AnyColor && i != 3)
+ {
+ unsigned char *p, *e;
+
+ for (p = plane[i], e = p + bpl16*h; p < e; ++p)
+ if (*p)
+ {
+ AnyColor |= 1<<i;
+ break;
+ }
+ }
+
+ if (Duplex == DMDUPLEX_LONGEDGE && (PageNum & 1) == 0)
+ rotate_bytes_180(plane[i], plane[i] + bpl16 * h - 1, Mirror1);
+ if (Duplex == DMDUPLEX_MANUALLONG && (PageNum & 1) == 0)
+ rotate_bytes_180(plane[i], plane[i] + bpl16 * h - 1, Mirror1);
+ }
+
+ debug(2, "AnyColor = %s %s %s\n",
+ (AnyColor & 0x01) ? "Cyan" : "",
+ (AnyColor & 0x02) ? "Magenta" : "",
+ (AnyColor & 0x04) ? "Yellow" : ""
+ );
+
+ if ((PageNum & 1) == 0 && EvenPages)
+ {
+ SeekRec[SeekIndex].b = ftell(EvenPages);
+ pksm_page(plane, w, h, EvenPages);
+ SeekRec[SeekIndex].e = ftell(EvenPages);
+ debug(1, "PKSM Page: %d %ld %ld\n",
+ PageNum, SeekRec[SeekIndex].b, SeekRec[SeekIndex].e);
+ SeekIndex++;
+ }
+ else
+ pksm_page(plane, w, h, ofp);
+
+ for (i = 0; i < 4; ++i)
+ free(plane[i]);
+ }
+eof:
+ return (0);
+}
+
+int
+pbm_pages(FILE *ifp, FILE *ofp)
+{
+ unsigned char *buf;
+ int rawW, rawH, rawBpl;
+ int rightBpl;
+ int w, h, bpl;
+ int bpl16;
+ int rc;
+ int p4eaten = 1;
+
+ //
+ // Save the original Upper Right clip values as the logical offset,
+ // because we may adjust them slightly below, in the interest of speed.
+ //
+ if (LogicalClip & LOGICAL_CLIP_X)
+ LogicalOffsetX = UpperLeftX;
+ if (LogicalClip & LOGICAL_CLIP_Y)
+ LogicalOffsetY = UpperLeftY;
+
+ for (;;)
+ {
+ if (pbm_header(ifp, &p4eaten, &rawW, &rawH) == 0)
+ break;
+
+ rawBpl = (rawW + 7) / 8;
+
+ // We only clip multiples of 8 pixels off the leading edge, and
+ // add any remainder to the amount we clip from the right edge.
+ // Its fast, and good enough for government work.
+ LowerRightX += UpperLeftX & 7;
+ UpperLeftX &= ~7;
+
+ w = rawW - UpperLeftX - LowerRightX;
+ h = rawH - UpperLeftY - LowerRightY;
+ bpl = (w + 7) / 8;
+ rightBpl = (rawW - UpperLeftX + 7) / 8;
+
+ bpl16 = (bpl + 15) & ~15;
+ buf = malloc(bpl16 * h);
+ if (!buf)
+ error(1, "Can't allocate page buffer\n");
+
+ rc = read_and_clip_image(buf, rawBpl, rightBpl, 8, bpl, h, bpl16, ifp);
+ if (rc == EOF)
+ error(1, "Premature EOF(pbm) on input stream\n");
+
+ ++PageNum;
+ if (Duplex == DMDUPLEX_LONGEDGE && (PageNum & 1) == 0)
+ rotate_bytes_180(buf, buf + bpl16 * h - 1, Mirror1);
+
+ if ((PageNum & 1) == 0 && EvenPages)
+ {
+ if (Duplex == DMDUPLEX_MANUALLONG)
+ rotate_bytes_180(buf, buf + bpl16 * h - 1, Mirror1);
+ SeekRec[SeekIndex].b = ftell(EvenPages);
+ pbm_page(buf, w, h, EvenPages);
+ SeekRec[SeekIndex].e = ftell(EvenPages);
+ debug(1, "PBM Page: %d %ld %ld\n",
+ PageNum, SeekRec[SeekIndex].b, SeekRec[SeekIndex].e);
+ SeekIndex++;
+ }
+ else
+ pbm_page(buf, w, h, ofp);
+
+ free(buf);
+ }
+ return (0);
+}
+
+int
+cups_pages(FILE *ifp, FILE *ofp)
+{
+ unsigned char *plane[4];
+ int p, np = 1;
+ int bpc;
+ int bpp;
+ int co, cs;
+ int rawW, rawH, rawBpl;
+ int rightBpl;
+ int w, h, bpl, bpl16;
+ int rc;
+ int version = 0, swapped = 0, compress = 0;
+ int seek;
+ unsigned magic;
+ cups_page_header_t c1;
+ cups_page_header2_t c2;
+
+ if (fread(&magic, sizeof(magic), 1, ifp) != 1)
+ error(1, "Premature EOF reading magic number\n");
+ switch (magic)
+ {
+ case CUPS_RASTER_SYNCv1: version = 1; swapped = 0; compress = 0; break;
+ case CUPS_RASTER_REVSYNCv1: version = 1; swapped = 1; compress = 0; break;
+ case CUPS_RASTER_SYNCv2: version = 2; swapped = 0; compress = 1; break;
+ case CUPS_RASTER_REVSYNCv2: version = 2; swapped = 1; compress = 1; break;
+ case CUPS_RASTER_SYNC: version = 3; swapped = 0; compress = 0; break;
+ case CUPS_RASTER_REVSYNC: version = 3; swapped = 1; compress = 0; break;
+ default: error(1, "Illegal cups magic number '%4.4s'\n", (char *) &magic);
+ break;
+ }
+ debug(2, "CUPS magic number '%4.4s', version=%d, swapped=%d, compress=%d\n",
+ (char *) &magic, version, swapped, compress);
+
+ if (swapped)
+ error(1, "Don't know how to swap '%4.4s'\n", (char *) &magic);
+ if (compress)
+ error(1, "Don't know how to decompress '%4.4s'\n", (char *) &magic);
+
+ //
+ // Save the original Upper Right clip values as the logical offset,
+ // because we may adjust them slightly below, in the interest of speed.
+ //
+ if (LogicalClip & LOGICAL_CLIP_X)
+ LogicalOffsetX = UpperLeftX;
+ if (LogicalClip & LOGICAL_CLIP_Y)
+ LogicalOffsetY = UpperLeftY;
+
+ // We only clip multiples of 4 pixels off the leading edge, and
+ // add any remainder to the amount we clip from the right edge.
+ // Its fast, and good enough for government work.
+ LowerRightX += UpperLeftX & 3;
+ UpperLeftX &= ~3;
+
+ AnyColor = 1;
+ for (;;)
+ {
+ ++PageNum;
+ seek = sizeof(magic);
+ if (fread(&c1, sizeof(c1), 1, ifp) != 1)
+ break;
+ seek += sizeof(c1);
+ if (version != 1)
+ {
+ if (fread(&c2, sizeof(c2), 1, ifp) != 1)
+ error(1, "Premature EOF skipping CUPS header V2\n");
+ seek += sizeof(c2);
+ }
+
+ rawW = c1.cupsWidth;
+ rawH = c1.cupsHeight;
+ // c1.cupsMediaType
+ bpc = c1.cupsBitsPerColor;
+ if (bpc != 2)
+ error(1, "Illegal number of bits per color (%d)\n", bpc);
+ bpp = c1.cupsBitsPerPixel;
+ rawBpl = c1.cupsBytesPerLine;
+ co = c1.cupsColorOrder;
+ if (co != CUPS_ORDER_PLANAR)
+ error(1, "Illegal color order (%d)\n", co);
+ cs = c1.cupsColorSpace;
+ switch (cs)
+ {
+ case CUPS_CSPACE_K: np = 1; break;
+ case CUPS_CSPACE_CMYK: np = 4; break;
+ default: error(1, "Illegal color space (%d)\n", cs); break;
+ }
+ debug(2,"data at %ld\n", seek);
+
+ debug(1, "%s: %d x %d x %d, %d (%d)\n",
+ cs==3 ? "mono" : "color", rawW, rawH, bpp, rawBpl, rawBpl*8);
+
+ w = rawW - UpperLeftX - LowerRightX;
+ h = rawH - UpperLeftY - LowerRightY;
+ bpl = (w + 3) / 4;
+ debug(2, "w = %d, bpl = %d\n", w, bpl);
+ rightBpl = (rawW - UpperLeftX + 3) / 4;
+
+ bpl16 = (bpl + 15) & ~15;
+ debug(2, "rawBpl = %d, bpl16 = %d\n", rawBpl, bpl16);
+
+ for (p = 0; p < np; ++p)
+ {
+ plane[p] = malloc(bpl16 * h);
+ if (!plane[p])
+ error(1, "Unable to allocate plane[%d] of %d x %d = %d bytes\n",
+ p, rawW, rawH, rawBpl * rawH);
+ }
+
+ for (p = 0; p < np; ++p)
+ {
+ rc = read_and_clip_image(plane[p], rawBpl, rightBpl, 4,
+ bpl, h, bpl16, ifp);
+ if (rc == EOF)
+ error(1, "Premature EOF on plane[%d]\n", p);
+
+ if (Duplex == DMDUPLEX_LONGEDGE && (PageNum & 1) == 0)
+ rotate_bytes_180(plane[p], plane[p] + bpl16 * h - 1, Mirror1);
+ if (Duplex == DMDUPLEX_MANUALLONG && (PageNum & 1) == 0)
+ rotate_bytes_180(plane[p], plane[p] + bpl16 * h - 1, Mirror1);
+ }
+
+ if ((PageNum & 1) == 0 && EvenPages)
+ {
+ SeekRec[SeekIndex].b = ftell(EvenPages);
+ if (np == 1)
+ pbm_page(plane[0], w, h, EvenPages);
+ else
+ pksm_page(plane, w, h, EvenPages);
+ SeekRec[SeekIndex].e = ftell(EvenPages);
+ debug(1, "CUPS Page: %d %ld %ld\n",
+ PageNum, SeekRec[SeekIndex].b, SeekRec[SeekIndex].e);
+ SeekIndex++;
+ }
+ else
+ {
+ if (np == 1)
+ pbm_page(plane[0], w, h, ofp);
+ else
+ pksm_page(plane, w, h, ofp);
+ }
+
+ for (p = 0; p < np; ++p)
+ free(plane[p]);
+ }
+
+ return 0;
+}
+
+void
+blank_page(FILE *ofp)
+{
+ int w, h, bpl, bpl16;
+ unsigned char *plane;
+
+ w = PageWidth - UpperLeftX - LowerRightX;
+ h = PageHeight - UpperLeftY - LowerRightY;
+ bpl = (w + 7) / 8;
+ bpl16 = (bpl + 15) & ~15;
+
+ plane = malloc(bpl16 * h);
+ if (!plane)
+ error(1, "Unable to allocate blank plane (%d bytes)\n", bpl16*h);
+ memset(plane, 0, bpl16*h);
+
+ pbm_page(plane, w, h, ofp);
+ ++PageNum;
+ free(plane);
+}
+
+int
+parse_xy(char *str, int *xp, int *yp)
+{
+ char *p;
+
+ if (!str || str[0] == 0) return -1;
+
+ *xp = strtoul(str, &p, 0);
+ if (str == p) return -2;
+ while (*p && (*p < '0' || *p > '9'))
+ ++p;
+ str = p;
+ if (str[0] == 0) return -3;
+ *yp = strtoul(str, &p, 0);
+ if (str == p) return -4;
+ return (0);
+}
+
+void
+do_one(FILE *in)
+{
+ int mode;
+
+ mode = getc(in);
+ if (mode == 't' || (mode >= '2' && mode <='5') )
+ {
+ ungetc(mode, in);
+ cups_pages(in, stdout);
+ }
+ else if (Mode == MODE_COLOR)
+ {
+ if (mode != 'P')
+ {
+ ungetc(mode, in);
+ cmyk_pages(in, stdout);
+ }
+ else
+ {
+ mode = getc(in);
+ if (mode == '4')
+ pksm_pages(in, stdout);
+ else
+ error(1, "Not a pksmraw file!\n");
+ }
+ }
+ else
+ {
+ if (mode != 'P')
+ error(1, "Not a pbm file!\n");
+ mode = getc(in);
+ if (mode == '4')
+ pbm_pages(in, stdout);
+ else
+ error(1, "Not a pbmraw file!\n");
+ }
+}
+
+int
+main(int argc, char *argv[])
+{
+ int c;
+ int i, j;
+
+ while ( (c = getopt(argc, argv,
+ "b:cd:g:n:m:p:r:s:tu:l:L:ABPJ:S:U:X:D:V?h")) != EOF)
+ switch (c)
+ {
+ case 'b': Bpp = atoi(optarg);
+ if (Bpp != 1 && Bpp != 2)
+ error(1, "Illegal value '%s' for -b\n", optarg);
+ break;
+ case 'c': Mode = MODE_COLOR; break;
+ case 'S': Color2Mono = atoi(optarg);
+ Mode = MODE_COLOR;
+ if (Color2Mono < 0 || Color2Mono > 4)
+ error(1, "Illegal value '%s' for -C\n", optarg);
+ break;
+ case 'd': Duplex = atoi(optarg); break;
+ case 'g': if (parse_xy(optarg, &PageWidth, &PageHeight))
+ error(1, "Illegal format '%s' for -g\n", optarg);
+ if (PageWidth < 0 || PageWidth > 1000000)
+ error(1, "Illegal X value '%s' for -g\n", optarg);
+ if (PageHeight < 0 || PageHeight > 1000000)
+ error(1, "Illegal Y value '%s' for -g\n", optarg);
+ break;
+ case 'm': MediaCode = atoi(optarg); break;
+ case 'n': Copies = atoi(optarg); break;
+ case 'p': PaperCode = atoi(optarg); break;
+ case 'r': if (parse_xy(optarg, &ResX, &ResY))
+ error(1, "Illegal format '%s' for -r\n", optarg);
+ break;
+ case 's': SourceCode = atoi(optarg); break;
+ case 't': SaveToner = 1; break;
+ case 'u':
+ if (strcmp(optarg, "0") == 0)
+ break;
+ if (parse_xy(optarg, &UpperLeftX, &UpperLeftY))
+ error(1, "Illegal format '%s' for -u\n", optarg);
+ break;
+ case 'l':
+ if (strcmp(optarg, "0") == 0)
+ break;
+ if (parse_xy(optarg, &LowerRightX, &LowerRightY))
+ error(1, "Illegal format '%s' for -l\n", optarg);
+ break;
+ case 'L': LogicalClip = atoi(optarg);
+ if (LogicalClip < 0 || LogicalClip > 3)
+ error(1, "Illegal value '%s' for -L\n", optarg);
+ break;
+ case 'A': AllIsBlack = !AllIsBlack; break;
+ case 'B': BlackClears = !BlackClears; break;
+ case 'P': OutputStartPlane = !OutputStartPlane; break;
+ case 'J': if (optarg[0]) Filename = optarg; break;
+ case 'U': if (optarg[0]) Username = optarg; break;
+ case 'X': ExtraPad = atoi(optarg); break;
+ case 'D': Debug = atoi(optarg); break;
+ case 'V': printf("%s\n", Version); exit(0);
+ default: usage(); exit(1);
+ }
+
+ if (UpperLeftX < 0 || UpperLeftX >= PageWidth)
+ error(1, "Illegal X value '%d' for -u\n", UpperLeftX);
+ if (UpperLeftY < 0 || UpperLeftY >= PageHeight)
+ error(1, "Illegal Y value '%d' for -u\n", UpperLeftY);
+ if (LowerRightX < 0 || LowerRightX >= PageWidth)
+ error(1, "Illegal X value '%d' for -l\n", LowerRightX);
+ if (LowerRightY < 0 || LowerRightY >= PageHeight)
+ error(1, "Illegal Y value '%d' for -l\n", LowerRightY);
+
+ argc -= optind;
+ argv += optind;
+
+ start_doc(stdout);
+
+ switch (Duplex)
+ {
+ case DMDUPLEX_LONGEDGE:
+ case DMDUPLEX_SHORTEDGE:
+ case DMDUPLEX_MANUALLONG:
+ case DMDUPLEX_MANUALSHORT:
+ EvenPages = tmpfile();
+ break;
+ }
+
+ if (argc == 0)
+ {
+ do_one(stdin);
+ }
+ else
+ {
+ for (i = 0; i < argc; ++i)
+ {
+ FILE *ifp;
+
+ ifp = fopen(argv[i], "r");
+ if (!ifp)
+ error(1, "Can't open '%s' for reading\n", argv[i]);
+ do_one(ifp);
+ fclose(ifp);
+ }
+ }
+
+ /*
+ * Do manual duplex
+ */
+ if (EvenPages)
+ {
+ // Handle odd page count
+ if ( (PageNum & 1) == 1)
+ {
+ SeekRec[SeekIndex].b = ftell(EvenPages);
+ blank_page(EvenPages);
+ SeekRec[SeekIndex].e = ftell(EvenPages);
+ debug(1, "Blank Page: %d %ld %ld\n",
+ PageNum, SeekRec[SeekIndex].b, SeekRec[SeekIndex].e);
+ SeekIndex++;
+ }
+
+ // Manual Pause
+ load_tray2(stdout);
+
+ // Write even pages in reverse order
+ for (i = SeekIndex-1; i >= 0; --i)
+ {
+ debug(1, "EvenPage: %d %ld %ld\n",
+ i, SeekRec[i].b, SeekRec[i].e);
+ fseek(EvenPages, SeekRec[i].b, 0L);
+ for (j = 0; j < (SeekRec[i].e - SeekRec[i].b); ++j)
+ putc(getc(EvenPages), stdout);
+ }
+ fclose(EvenPages);
+ }
+
+ end_doc(stdout);
+
+ exit(0);
+}
diff --git a/foo2hp2600-wrapper.1in b/foo2hp2600-wrapper.1in
new file mode 100644
index 0000000..e6e4ea8
--- /dev/null
+++ b/foo2hp2600-wrapper.1in
@@ -0,0 +1,400 @@
+.TH foo2hp2600-wrapper 1 "${MODpage}" "foo2hp2600-wrapper ${MODver}"
+'\"==========================================================================
+'\" STRINGS and MACROS
+'\"==========================================================================
+'\"
+'\" Define strings for special characters that nroff doesn't have
+'\"
+'\" N.B. using .if cua to test for special characters did not work.
+'\"
+.if !'\*[.T]'ps' .ds ua up
+.if '\*[.T]'ps' .ds ua \(ua
+.if !'\*[.T]'ps' .ds da down
+.if '\*[.T]'ps' .ds da \(da
+.if !'\*[.T]'ps' .ds <- left
+.if '\*[.T]'ps' .ds <- \(<-
+.if !'\*[.T]'ps' .ds -> right
+.if '\*[.T]'ps' .ds -> \(->
+'\"
+'\" bx - box a Courier string for making keycaps
+'\"
+'\" N.B. this mess is to make the line drawing come out only
+'\" if we are really generating postscript
+'\"
+.de bx
+.ie !'\*[.T]'ps' \{\
+. RB [ \\$1 ]\\$2
+.\}
+.el \{\
+. ie !r ps4html \{\
+'\" \(br\|\s-1\f(CB\\$1\fP\s+1\|\(br\l'|0\(rn'\l'|0\(ul'
+. ft CW
+. nr par*bxw \w'\\$1'+.4m
+\Z'\v'.25m'\D'l 0 -1m'\D'l \\n[par*bxw]u 0'\D'l 0 1m'\D'l -\\n[par*bxw]u 0''\
+\Z'\h'.2m'\s-1\\$1\s+1'\
+\h'\\n[par*bxw]u'\\$2
+. ft P
+. \}
+. el \{\
+. RB [ \\$1 ]\\$2
+. \}
+.\}
+..
+'\"
+'\" strings to set current color (null with old groff)
+'\"
+.if mred .ds red \m[red]
+.if mgreen .ds green \m[green]
+.if mblue .ds blue \m[blue]
+.if mblack .ds black \m[black]
+.if mblack .ds mP \mP
+'\"
+'\" fix for grotty + xterm. We call for orange, grotty outputs yellow,
+'\" but xterm displays yellow as orange. The cycle is complete.
+'\"
+.if n .defcolor orange rgb #ffff00
+'\"
+'\" color <color> - set the current color (ignores request with old groff)
+'\"
+.de color
+.if mred \m[\\$1]\c
+..
+'\"
+'\" colorword <color> <word> - colorize a word (ignored by old groff)
+'\"
+.de colorword
+.ie m\\$1 \m[\\$1]\\$2\mP\c
+.el \\$2\c
+..
+'\"
+'\" colbox <fg> <bg> <word> - colorize a word in a filled box
+'\"
+.de colbox
+.ie mred \M[\\$2]\
+\v'+.167v'\
+\D'P 0 -0.9v \w'\\$3'u 0 0 +0.9v -\w'\\$3'u 0'\
+\v'-.167v'\
+\m[\\$1]\\$3\mP\MP
+.el \\$3\c
+..
+'\"
+'\" Macros for doing pdfmarks
+'\"
+.de specialps
+\\k_\X'ps: \\$*'\h'|\\n_u'\c
+..
+'\"
+'\" pdfmark PDFMARKCODE
+'\"
+.ds pdfmarks
+.if d pdfmarks \{\
+.de pdfmark
+. specialps exec [\\$1 pdfmark
+..
+'\"
+'\" pdfdest LINKNAME
+'\"
+.de pdfdest
+.pdfmark "/Dest /\\$1 /View [/XYZ -5 PL null] /DEST"
+..
+'\"
+'\" pdfbookmark COUNT LINKNAME STRING
+'\"
+.de pdfbookmark
+. pdfmark "/View [/XYZ 44 730 1.0] /Count \\$1 /Dest /\\$2 /Title (\\$3) /OUT"
+..
+'\"
+'\" Define the SH and SS macros to save pdfmark information
+'\" in "arrays" of numbers and strings.
+'\"
+.if !r rr_n \{\
+.nr rr_n 0 1
+.am SH
+. nr rr_levels!\\n+[rr_n] 2
+. ds rr_labels!\\n[rr_n] \\$*
+. pdfdest Link\\n[rr_n]
+..
+.am SS
+. nr rr_levels!\\n+[rr_n] 3
+. ds rr_labels!\\n[rr_n] \\$*
+. pdfdest Link\\n[rr_n]
+..
+.\}
+'\"
+'\" Called at the end of the document to generate the pdfmark outline
+'\"
+.de pdf_outline
+.nr rr_levels!\\n+[rr_n] 1
+.nr rr_i 0 1
+.while \\n+[rr_i]<\\n[rr_n] \{\
+. nr rr_ip1 \\n[rr_i]+1
+. nr rr_count 0
+. if \\n[rr_levels!\\n[rr_ip1]]>\\n[rr_levels!\\n[rr_i]] \{\
+. nr rr_j \\n[rr_i] 1
+. while \\n+[rr_j]<\\n[rr_n] \{\
+. if \\n[rr_levels!\\n[rr_j]]<=\\n[rr_levels!\\n[rr_i]] \{\
+. break
+. \}
+. if \\n[rr_levels!\\n[rr_j]]==(\\n[rr_levels!\\n[rr_i]]+1) \{\
+. nr rr_count \\n[rr_count]+1
+. \}
+. \}
+. \}
+. ds hhh \\*[rr_labels!\\n[rr_i]]
+. pdfbookmark \\n[rr_count] Link\\n[rr_i] "\\*[hhh]"
+.\}
+..
+'\"
+'\" Some postscript to make pdfmarks harmless on old interpreters...
+'\"
+.specialps "def /pdfmark where {pop} {userdict /pdfmark /cleartomark load put} ifelse"
+'\"
+'\" Force display of Bookmarks in Acrobat when document is viewed.
+'\"
+.pdfmark "[/PageMode /UseOutlines /Page 1 /View [/XYZ null null null] /DOCVIEW"
+'\"
+'\" Output the document info in pdfmarks
+'\"
+.pdfmark "\
+ /Title (\*[an-title](\*[an-section])) \
+ /Subject (foo2hp2600-wrapper Manual Page) \
+ /Author (Rick Richardson) \
+ /Keywords (printing) \
+ /Creator (groff \n(.x.\n(.y.\n(.Y -man) \
+ /CreationDate (\*[an-extra1]) \
+ /ModDate (\*[an-extra1]) \
+ /DOCINFO"
+\}
+'\"
+'\" The manual page name is only 1st level mark
+'\"
+.nr rr_levels!\n+[rr_n] 1
+.ds rr_labels!\n[rr_n] \*[an-title](\*[an-section])
+.pdfdest Link\n[rr_n]
+'\"==========================================================================
+'\" MANUAL PAGE SOURCE
+'\"==========================================================================
+.SH NAME
+foo2hp2600-wrapper \- Convert Postscript into a ZJS printer stream
+.SH SYNOPSIS
+.B foo2hp2600-wrapper
+.RI [ options "] [" ps-file ]
+.SH DESCRIPTION
+.B foo2hp2600-wrapper
+is a Foomatic compatible printer wrapper for the \fBfoo2hp\fP printer driver.
+This script reads a Postscript \fIps-file\fP or standard input
+and converts it to Zenographics ZjStream printer format
+for driving the Hewlett-Packard 2600n color laser printer
+and other Zenographics-based printers.
+.P
+This script can be used in a standalone fashion, but is intended to
+be called from a printer spooler system which uses the Foomatic
+printer database.
+
+.SH COMMAND LINE OPTIONS
+.SS Normal Options
+These are the options used to select the parameters of a
+print job that are usually controlled on a per job basis.
+.TP
+.BI \-b\0 bits
+Number of bits per plane. 1 or 2. [1].
+.TP
+.BI \-c
+Print in color (else monochrome).
+.TP
+.BI \-d\0 duplex
+Duplex code to send to printer [1].
+.TS
+| n l | n l | n l .
+1 off 2 long edge 3 short edge
+.TE
+.TP
+.BI \-m\0 media
+Media code to send to printer [1].
+.TS
+l l
+l n.
+_
+Media HPLJ 2600n
+_
+plain 1
+preprinted 514
+letterhead 513
+transparency 2
+prepunched 515
+labels 265
+bond 260
+recycled 516
+color 512
+tough 276
+envelope 267
+light 258
+heavy 262
+cardstock 261
+lightglossy 268
+glossy 269
+heavyglossy 270
+cover 277
+photo 278
+.TE
+.TP
+.BI \-p\0 paper
+Paper size code to send to printer [1].
+.TS
+| n l | n l.
+1 letter 9 A4
+5 legal 11 A5
+7 executive 13 B5jis
+20 env #10 27 env DL
+28 env C5 34 env B5
+37 env Monarch
+.TE
+.TP
+.BI \-n\0 copies
+Number of copies [1].
+.TP
+.BI \-r\0 xres x yres
+Set device resolution in pixels/inch [1200x600].
+.TP
+.BI \-s\0 source
+Source (Input Slot) code to send to printer [7].
+.TS
+| n l | n l.
+1 tray 2 4 manual/tray 1
+2 tray 3 7 auto
+.TE
+.TP
+.BI \-t
+Draft mode. Every other pixel is white.
+.TP
+.BI "\-2 \-3 \-4 \-5 \-6 \-8 \-9 \-10 \-12 \-14 \-15 \-16 \-18"
+Print in N-up. Requires the \fBpsutils\fP package.
+.TP
+.BI \-o\0 orient
+Orientation used for N-up.
+.TS
+l l l.
+Portrait -op (normal)
+Landscape -ol (rotated 90 degrees anticlockwise)
+Seascape -os (rotated 90 degrees clockwise)
+.TE
+.SS Printer Tweaking Options
+These are the options used to customize the operation of \fBfoo2hp\fP
+for a particular printer.
+.TP
+.BI \-u\0 xoff x yoff
+Set the offset of the start of the printable region from the
+upper left corner, in pixels [varies with paper size].
+The defaults should work on the 2200DL and 2300DL, and have not
+been tested on any other printers.
+.TP
+.BI \-l\0 xoff x yoff
+Set the offset of the end of the printable region from the
+lower right corner, in pixels [varies with paper size].
+The defaults should work on the 2200DL and 2300DL, and have not
+been tested on any other printers.
+.TP
+.BI \-L\0 mask
+Send the logical clipping values from -u/-l in the ZjStream.
+\fBfoo2hp2600-wrapper\fP always runs Ghostscript with the ideal page dimensions,
+so that the scale of the image is correct,
+regardless whether or not the printer has unprintable regions.
+This option is used to move the position of the clipped image
+back to where it belongs on the page. The default is to send
+the amount which was clipped by -u and -l, and should be
+good in most cases.
+.TS
+l l.
+0 don't send any logical clipping amounts
+1 only send Y clipping amount
+2 only send X clipping amount
+3 send both X and Y clipping amounts
+.TE
+.TP
+.BI \-P
+Do not send START_PLANE codes on monochrome output. May be
+needed by some monochrome-only printers, such as the
+HP LaserJet 1000.
+.TP
+.BI \-X\0 padlen
+Add extra zero padding to the end of BID segments. The default is
+16 bytes. Padding 16 bytes of zeroes
+is needed for older ZjStream printers, such as the Minolta 2200DL
+and HP LaserJet 1000, and seems harmless to newer ones, such as
+the Minolta 2300DL. So the default should be good for all cases.
+.SS Color Tweaking Options
+These are the options used to control the quality of color output.
+Color correction is currently a WORK IN PROGRESS.
+.TP
+.BI \-g\0 gsopts
+Additional options to pass to Ghostscript, such as -g\(lq-dDITHERPPI=nnn\(rq,
+etc. This option may appear more than once.
+.TP
+.BI \-G\0 profile.icm
+Convert \fIprofile.icm\fP to a Postscript color rendering
+dictionary (CRD) using \fBfoo2zjs-icc2ps\fP and
+adjust the printer colors by using the Postscript \fBsetcolorrendering\fP
+operator. If \fIprofile.icm\fP is none.icm, then prepare for ordering a
+ICM custom printer profile (i.e. from www.ICCFactory.com).
+.TP
+.BI \-G\0 gamma-file.ps
+Prepend \fIgamma-file.ps\fP to the Postscript input to perform
+color correction using the \fBsetcolortransfer\fP Postscript operator.
+For example, the file might contain:
+.br
+{0.333 exp} {0.333 exp} {0.333 exp} {0.333 exp} setcolortransfer
+.TP
+.BI \-I\0 intent
+Select profile intent from the ICM file.
+0=Perceptual, 1=Colorimetric, 2=Saturation, 3=Absolute.
+Default is 0 (perceptual).
+.SS Debugging Options
+These options are used for debugging \fBfoo2hp\fP and its wrapper.
+.TP
+.BI \-S\0 plane
+Output just a single color plane from a color print and print it
+on the black plane. The default is to output all color planes.
+.TS
+l l.
+1 Cyan
+2 Magenta
+3 Yellow
+4 Black
+.TE
+.TP
+.BI \-D\0 level
+Set Debug level [0].
+
+.SH EXAMPLES
+Create a monochrome ZjStream from a Postscript document,
+examine it, and then print it using a RAW print queue:
+
+.RS
+.nf
+foo2hp2600-wrapper testpage.ps > testpage.zm
+zjsdecode < testpage.zm
+lpr -P raw testpage.zm
+.fi
+.RE
+.P
+Create a color ZjStream stream from a Postscript document:
+
+.RS
+.nf
+foo2hp2600-wrapper -c testpage.ps > testpage.zc
+.fi
+.RE
+
+.SH FILES
+.BR /usr/bin/foo2hp2600-wrapper
+.SH SEE ALSO
+.BR foo2hp (1),
+.BR zjsdecode (1)
+.SH "AUTHOR"
+Rick Richardson <rick.richardson@comcast.net>
+.br
+${URLHP}/
+'/"
+'/"
+'/"
+.em pdf_outline
diff --git a/foo2hp2600-wrapper.in b/foo2hp2600-wrapper.in
new file mode 100755
index 0000000..f7f5540
--- /dev/null
+++ b/foo2hp2600-wrapper.in
@@ -0,0 +1,689 @@
+#!/bin/sh
+
+#* Copyright (C) 2005-2006 Rick Richardson
+#*
+#* 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.
+#*
+#* Authors: Rick Richardson <rick.richardson@comcast.net>
+
+VERSION='$Id: foo2hp2600-wrapper.in,v 1.43 2006/12/17 16:00:06 rick Exp $'
+
+#
+# Printer Notes:
+#
+# hp2600 -
+#
+
+PROGNAME="$0"
+BASENAME=`basename $PROGNAME`
+PREFIX=/usr
+SHARE=$PREFIX/share/foo2hp
+
+#
+# Log the command line, for debugging and problem reports
+#
+if [ -x /usr/bin/logger ]; then
+ logger -t "$BASENAME" -p lpr.info -- "foo2hp2600-wrapper $@" </dev/null
+fi
+
+usage() {
+ cat <<EOF
+Usage:
+ $BASENAME [options] [ps-file]
+
+ Foomatic printer wrapper for the foo2hp2600 printer driver.
+ This script reads a Postscript ps-file or standard input
+ and converts it to Zenographics ZjStream printer format.
+
+Normal Options:
+-b bits Bits per plane (1 or 2) [$BPP]
+-c Print in color (else monochrome)
+-d duplex Duplex code to send to printer [$DUPLEX]
+ 1=off, 2=longedge, 3=shortedge
+-m media Media code to send to printer [$MEDIA]
+ 1=standard, 2=transparency, 3=glossy, 257=envelope,
+ 259=letterhead, 261=thickstock, 262=postcard, 263=labels
+-p paper Paper code [$PAPER]
+ 1=letter, 5=legal, 7=executive, 9=A4, 11=A5, 13=B5
+ 20=env#10, 27=envDL 28=envC5 34=envB5 37=envMonarch
+-n copies Number of copies [$COPIES]
+-r <xres>x<yres> Set device resolution in pixels/inch [$RES]
+-s source Source code to send to printer [$SOURCE]
+ 1=tray2, 2=tray3, 4=manual/tray1, 7=auto
+ Code numbers may vary with printer model.
+-t Draft mode. Every other pixel is white.
+-2/-3/-4/-6/-8/-10/-12/-14/-15/-16/-18
+ Print with N-up (requires psutils)
+-o orient For N-up: -op is portrait, -ol is landscape, -os is seascape.
+
+Printer Tweaking Options:
+-u <xoff>x<yoff> Set offset of upper left printable in pixels [varies]
+-l <xoff>x<yoff> Set offset of lower right printable in pixels [varies]
+-L mask Send logical clipping values from -u/-l in ZjStream [3]
+ 0=no, 1=Y, 2=X, 3=XY
+-P Do not output START_PLANE codes. May be needed by some
+ monochrome-only printers.
+-X padlen Add extra zero padding to the end of BID segments [16]
+
+Color Tweaking Options:
+-g gsopts Additional options to pass to Ghostscript, such as
+ -dDITHERPPI=nnn, etc. May appear more than once. []
+-G profile.icm Convert profile.icm to a Postscript CRD using icc2ps and
+ adjust colors using the setcolorrendering PS operator.
+ $SHARE/icm/ will be searched for profile.icm.
+-I intent Select profile intent from ICM file [$INTENT]
+ 0=Perceptual, 1=Colorimetric, 2=Saturation, 3=Absolute
+-G gamma-file.ps Prepend gamma-file to the Postscript input to perform
+ color correction using the setcolortransfer PS operator.
+
+Debugging Options:
+-S plane Output just a single color plane from a color print [all]
+ 1=Cyan, 2=Magenta, 3=Yellow, 4=Black
+-D lvl Set Debug level [$DEBUG]
+-V $VERSION
+EOF
+
+ exit 1
+}
+
+#
+# Report an error and exit
+#
+error() {
+ echo "$BASENAME: $1" >&2
+ exit 1
+}
+
+dbgcmd() {
+ if [ $DEBUG -ge 1 ]; then
+ echo "$@" >&2
+ fi
+ "$@"
+}
+
+#
+# Portable version of 'which'
+#
+pathfind() {
+ if [ "$1" = -p ]; then
+ optp=1
+ shift
+ else
+ optp=0
+ fi
+ OLDIFS="$IFS"
+ IFS=:
+ for p in $PATH; do
+ if [ -x "$p/$*" ]; then
+ if [ $optp = 1 ]; then
+ echo "$p/$*"
+ fi
+ IFS="$OLDIFS"
+ return 0
+ fi
+ done
+ IFS="$OLDIFS"
+ return 1
+}
+
+#
+# Returns true if $1 is 32-bit binary
+#
+is32() {
+ if pathfind file; then
+ path=`pathfind -p "$*"`
+ is32=`file -L "$path" | grep 32-bit`
+ if [ "$is32" = "" ]; then
+ return 1
+ else
+ return 0
+ fi
+ else
+ return 1
+ fi
+}
+
+#
+# N-up-ify the job. Requires psnup from psutils package
+#
+nup() {
+ case "$NUP" in
+ [2368]|1[0458])
+ tr '\r' '\n' | psnup $NUP_ORIENT -d2 -$NUP -m.3in -p$paper -q
+ ;;
+ [49]|1[26])
+ tr '\r' '\n' | psnup $NUP_ORIENT -d2 -$NUP -m.5in -p$paper -q
+ ;;
+ *)
+ error "Illegal call to nup()."
+ ;;
+ esac
+}
+
+#
+# Process the options
+#
+
+# Try to use a local copy of GhostScript 8.54, if available. Otherwise,
+# fallback to whatever the Linux distro has installed (usually 7.07)
+#
+# N.B. := operator used here, when :- would be better, because "ash"
+# doesn't have :-
+if gs8 -v >/dev/null 2>&1; then
+ GSBIN=${GSBIN:-gs8}
+else
+ GSBIN=${GSBIN:-gs}
+fi
+
+CMDLINE="$*"
+DEBUG=0
+DUPLEX=1
+BPP=1
+COLOR=
+COLORMODE=default
+QUALITY=1
+QUALITY=wts
+
+MEDIA=1
+COPIES=1
+PAPER=1
+RES=600x600
+SOURCE=7
+NUP=
+CLIP_UL=
+CLIP_LR=
+CLIP_LOG=
+BC=
+AIB=
+NOPLANES=
+COLOR2MONO=
+GAMMAFILE=default
+INTENT=0
+GSOPTS=
+EXTRAPAD=
+SAVETONER=
+NUP_ORIENT=
+GSDEV=-sDEVICE=pbmraw
+DefaultRGB=sRGB
+# What mode to use if the user wants us to pick the "best" mode
+case `$GSBIN --version` in
+7*)
+ DEFAULTCOLORMODE=10
+ ;;
+8.1*)
+ # Buggy 8.14/8.15 in Ubuntu
+ DEFAULTCOLORMODE=10
+ if is32 $GSBIN; then
+ GAMMAFILE=km2430_2.icm
+ else
+ GAMMAFILE=hpclj2600n-0.icm
+ fi
+ QUALITY=1
+ ;;
+*)
+ DEFAULTCOLORMODE=10
+ ;;
+esac
+
+while getopts "1:23456789o:b:cC:d:g:l:u:L:m:n:p:q:r:s:tABS:D:G:I:PX:Vh?" opt
+do
+ case $opt in
+ b) BPP="$OPTARG";;
+ c) COLOR=-c;;
+ d) DUPLEX="$OPTARG";;
+ g) GSOPTS="$GSOPTS $OPTARG";;
+ m) MEDIA="$OPTARG";;
+ n) COPIES="$OPTARG";;
+ p) PAPER="$OPTARG";;
+ q) QUALITY="$OPTARG";;
+ r) RES="$OPTARG";;
+ s) SOURCE="$OPTARG";;
+ t) SAVETONER="-t";;
+ l) CLIP_LR="-l $OPTARG";;
+ u) CLIP_UL="-u $OPTARG";;
+ L) CLIP_LOG="-L $OPTARG";;
+ A) AIB=-A;;
+ B) BC=-B;;
+ C) COLORMODE="$OPTARG";;
+ S) COLOR2MONO="-S$OPTARG";;
+ D) DEBUG="$OPTARG";;
+ G) GAMMAFILE="$OPTARG";;
+ I) INTENT="$OPTARG";;
+ P) NOPLANES=-P;;
+ X) EXTRAPAD="-X $OPTARG";;
+ [234689]) NUP="$opt";;
+ [57]) error "Can't find acceptable layout for $opt-up";;
+ 1) case "$OPTARG" in
+ [024568]) NUP="1$OPTARG";;
+ *) error "Can't find acceptable layout for 1$OPTARG-up";;
+ esac
+ ;;
+ o) case "$OPTARG" in
+ l*) NUP_ORIENT=-l;;
+ s*) NUP_ORIENT=-r;;
+ p*|*) NUP_ORIENT=;;
+ esac;;
+ V) echo "$VERSION"; foo2hp -V; exit 0;;
+ h|\?)
+ if [ "$CMDLINE" != "-?" -a "$CMDLINE" != -h ]; then
+ echo "Illegal command:"
+ echo " $0 $CMDLINE"
+ echo
+ fi
+ usage;;
+ esac
+done
+shift `expr $OPTIND - 1`
+
+#
+# Select the ghostscript device to use
+#
+case "$BPP" in
+1) if [ "" = "$COLOR" ]; then
+ GSDEV=-sDEVICE=pbmraw
+ else
+ GSDEV=-sDEVICE=bitcmyk
+ fi
+ case "$GAMMAFILE" in
+ default)
+ if is32 $GSBIN; then
+ GAMMAFILE=km2430_2.icm
+ GAMMAFILE=hpclj2600n-1.icm
+ else
+ GAMMAFILE=hpclj2600n-0.icm
+ fi
+ ;;
+ none) GAMMAFILE=;;
+ esac
+ ;;
+2) if [ "" = "$COLOR" ];
+ then
+ # GSDEV=-sDEVICE=pgmraw
+ # error "2-bpp monochrome is not yet supported"
+ GSDEV="-sDEVICE=cups -dcupsColorSpace=3 -dcupsBitsPerColor=2"
+ GSDEV="$GSDEV -dcupsColorOrder=2"
+ else
+ GSDEV="-sDEVICE=cups -dcupsColorSpace=6 -dcupsBitsPerColor=2"
+ GSDEV="$GSDEV -dcupsColorOrder=2"
+ fi
+
+ case "$GAMMAFILE" in
+ default)
+ if is32 $GSBIN; then
+ GAMMAFILE=km2430_2.icm
+ GAMMAFILE=hpclj2600n-1.icm
+ else
+ GAMMAFILE=
+ fi
+ ;;
+ none) GAMMAFILE=;;
+ esac
+ ;;
+*) error "Illegal number of bits per plane ($BPP)";;
+esac
+
+#
+case "$QUALITY" in
+0)
+ GSOPTS="-dCOLORSCREEN $GSOPTS"
+ ;;
+1)
+ GSOPTS="-dCOLORSCREEN $GSOPTS"
+ ;;
+2)
+ GSOPTS="-dMaxBitMap=500000000 $GSOPTS"
+ ;;
+wts)
+ GSOPTS="-dCOLORSCREEN $GSOPTS"
+ ;;
+esac
+
+#
+# Validate media code
+#
+case "$MEDIA" in
+1|plain) MEDIA=1;;
+514|preprinted) MEDIA=514;;
+513|letterhead) MEDIA=513;;
+2|transparency) MEDIA=2;;
+515|prepunched) MEDIA=515;;
+265|labels) MEDIA=265;;
+260|bond) MEDIA=260;;
+516|recycled) MEDIA=516;;
+512|color) MEDIA=512;;
+276|tough) MEDIA=276;;
+267|envelope) MEDIA=267;;
+258|light) MEDIA=258;;
+262|heavy) MEDIA=262;;
+261|cardstock) MEDIA=261;;
+268|lightglossy) MEDIA=268;;
+269|glossy) MEDIA=269;;
+270|heavyglossy) MEDIA=270;;
+277|cover) MEDIA=277;;
+278|photo) MEDIA=278;;
+[0-9]*) ;;
+*) error "Unknown media code $MEDIA";;
+esac
+
+#
+# Validate source (InputSlot) code
+#
+case "$SOURCE" in
+1|tray2) SOURCE=1;;
+4|tray1) SOURCE=4;;
+7|auto) SOURCE=7;;
+[0-9]*) ;;
+*) error "Unknown source code $SOURCE";;
+esac
+
+#
+# Validate Duplex code
+#
+case "$DUPLEX" in
+1|off|none) DUPLEX=1;;
+2|long*) DUPLEX=2;;
+3|short*) DUPLEX=3;;
+[0-9]*) ;;
+*) error "Unknown duplex code $DUPLEX";;
+esac
+
+#
+# Validate Resolution
+#
+case "$RES" in
+600x600) ;;
+1200x600) ;;
+2400x600) ;;
+*) error "Illegal resolution $RES";;
+esac
+
+#
+# Figure out the paper dimensions in pixels/inch, and set the
+# default clipping region. Unfortunately, this is a trouble
+# area for ZjStream printers. Various versions of ZjS print
+# engines react differently when asked to print into their
+# unprintable regions.
+#
+set_clipping() {
+ ulx=$1; uly=$2
+ lrx=$3; lry=$4
+
+ # Set clipping region if it isn't already set
+ if [ "$CLIP_UL" = "" ]; then
+ case "$RES" in
+ 600x600) ulx=`expr $ulx / 2`;;
+ 2400x600) ulx=`expr $ulx \* 2`;;
+ esac
+ CLIP_UL="-u ${ulx}x${uly}"
+ fi
+ if [ "$CLIP_LR" = "" ]; then
+ case "$RES" in
+ 600x600) lrx=`expr $lrx / 2`;;
+ 2400x600) lrx=`expr $lrx \* 2`;;
+ esac
+ CLIP_LR="-l ${lrx}x${lry}"
+ fi
+}
+
+case "$PAPER" in
+1|letter) PAPER=1; paper=letter; XDIM="10200"; YDIM="6600"
+ set_clipping 172 80 172 80
+ ;;
+5|legal) PAPER=5; paper=legal; XDIM="10200"; YDIM="8400"
+ set_clipping 172 80 172 80
+ ;;
+7|executive) PAPER=7; paper=executive; XDIM="8700"; YDIM="6300"
+ set_clipping 174 78 174 78
+ ;;
+9|a4|A4) PAPER=9; paper=a4; XDIM="9920"; YDIM="7016"
+ set_clipping 176 84 176 84
+ ;;
+11|a5|A5) PAPER=11; paper=a5; XDIM="6992"; YDIM="4960"
+ set_clipping 176 80 176 80
+ ;;
+13|b5|B5|b5jis) PAPER=13; paper=b5; XDIM="8598"; YDIM="6070"
+ set_clipping 172 83 171 83
+ ;;
+20|"env#10") PAPER=20; paper=env10; XDIM="4950"; YDIM="5700"
+ set_clipping 171 78 171 78
+ ;;
+27|envDL) PAPER=27; paper=envDL; XDIM="5200"; YDIM="5200"
+ set_clipping 176 84 176 84
+ ;;
+28|envC5) PAPER=28; paper=envC5; XDIM="7650"; YDIM="5408"
+ set_clipping 170 80 169 80
+ ;;
+34|envB5) PAPER=34; paper=envB5; XDIM="8316"; YDIM="5892"
+ set_clipping 174 74 174 74
+ ;;
+37|envMonarch) PAPER=37; paper=envMonarch;XDIM="4650"; YDIM="4500"
+ set_clipping 174 78 173 78
+ ;;
+*) error "Unimplemented paper code $PAPER";;
+esac
+# e.g. /usr/share/ghostscript/7.07/lib/gs_statd.ps
+PAPERSIZE="-sPAPERSIZE=$paper";
+
+case "$RES" in
+600x600) XDIM=`expr $XDIM / 2`;;
+1200x600) ;;
+2400x600) XDIM=`expr $XDIM \* 2`;;
+esac
+DIM="${XDIM}x${YDIM}"
+
+#
+# If there is an argument left, take it as the file to print.
+# Else, the input comes from stdin.
+#
+if [ $# -ge 1 ]; then
+ if [ "$LPJOB" = "" ]; then
+ : # LPJOB="$1"
+ fi
+ exec < $1
+fi
+
+#
+# Filter thru psnup if N-up printing has been requested
+#
+case $NUP in
+[234689]|1[024568]) PREFILTER="nup";;
+*) PREFILTER=cat;;
+esac
+
+#
+# Overload -G. If the file name ends with ".icm" or ".ICM"
+# then convert the ICC color profile to a Postscript CRD,
+# then prepend it to the users job. Select the intent
+# using the -I option.
+#
+
+create_crd() {
+ #
+ # Create a Postscript CRD
+ #
+ ICC2PS=$PREFIX/bin/foo2zjs-icc2ps
+ if [ -x $ICC2PS ]; then
+ case "$GAMMAFILE" in
+ none.icm | */none.icm)
+ ;;
+ *)
+ $ICC2PS -o $GAMMAFILE -t$INTENT > $ICCTMP.crd.ps 2>$ICCTMP.log \
+ || error "Problem converting .ICM file to Postscript"
+ ;;
+ esac
+
+ cat > $ICCTMP.usecie.ps <<-EOF
+ %!PS-Adobe-3.0
+ <</UseCIEColor true>>setpagedevice
+ EOF
+ if [ "$QUALITY" = wts ]; then
+ cat >> $ICCTMP.usecie.ps <<-EOF
+ << /UseWTS true >> setuserparams
+ <<
+ /AccurateScreens true
+ /HalftoneType 1
+ /HalftoneName (Round Dot Screen) cvn
+ /SpotFunction { 180 mul cos exch 180 mul cos add 2 div}
+ /Frequency 137
+ /Angle 37
+ >> sethalftone
+ EOF
+ fi
+ cat > $ICCTMP.selcrd.ps <<-EOF
+ /Current /ColorRendering findresource setcolorrendering
+ EOF
+ case "$GAMMAFILE" in
+ none.icm | */none.icm) GAMMAFILE="$ICCTMP.usecie.ps";;
+ *) GAMMAFILE="$ICCTMP.usecie.ps $ICCTMP.crd.ps $ICCTMP.selcrd.ps";;
+ esac
+ else
+ GAMMFILE=
+ fi
+}
+
+if [ $DEBUG -gt 0 ]; then
+ ICCTMP=/tmp/icc
+else
+ ICCTMP=/tmp/icc$$
+fi
+
+if [ "" = "$COLOR" ]; then
+ COLORMODE=
+ GAMMAFILE=
+else
+ case "$COLORMODE" in
+ default) COLORMODE=$DEFAULTCOLORMODE;;
+ esac
+fi
+
+CRDBASE="$PREFIX/share/foo2zjs/crd"
+PSFILES="$PREFIX/share/foo2hp/psfiles"
+case "$RES" in
+ 600x600) SCREEN=screen1200.ps;;
+ 1200x600) SCREEN=screen1200.ps;;
+ 2400x600) SCREEN=screen2400.ps;;
+esac
+
+case "$COLORMODE" in
+0|"")
+ # Monochrome
+ ;;
+10|icm)
+ # Use old ICM method
+ AIB=-A
+ BC=-B
+ case "$GAMMAFILE" in
+ none.icm | */none.icm)
+ create_crd
+ ;;
+ *.icm|*.ICM|*.icc|*.ICC)
+ #
+ # Its really an .ICM file, not a gamma file.
+ #
+ # The file can be a full path name, or the name of a file in $SHARE/icm/
+ #
+ if [ -r "$GAMMAFILE" ]; then
+ create_crd
+ elif [ -r "$SHARE/icm/$GAMMAFILE" ]; then
+ GAMMAFILE="$SHARE/icm/$GAMMAFILE"
+ create_crd
+ else
+ GAMMAFILE=
+ fi
+ ;;
+ esac
+ ;;
+*.crd)
+ GAMMAFILE="$CRDBASE/prolog.ps"
+ if [ -f $COLORMODE ]; then
+ GAMMAFILE="$GAMMAFILE $COLORMODE"
+ elif [ -f $CRDBASE/$COLORMODE ]; then
+ GAMMAFILE="$GAMMAFILE $CRDBASE/$COLORMODE"
+ else
+ error "Can't find CRD '$COLORMODE' in . or in $CRDBASE"
+ fi
+ GAMMAFILE="$GAMMAFILE $CRDBASE/$SCREEN"
+ ;;
+*)
+ error "Unknown color method '$COLORMODE'"
+ ;;
+esac
+
+if [ "" != "$COLOR" ]; then
+ if [ "" = "$AIB" -a "" = "$BC" ]; then
+ # Faster, but can't handle AllIsBlack or BlackClears
+ : #GSDEV=-sDEVICE=pksmraw
+ else
+ # Can't handle different size pages
+ : #GSDEV=-sDEVICE=bitcmyk
+ fi
+fi
+
+#
+# Figure out USERNAME
+#
+if [ "$LPUSER" != "" ]; then
+ USER="$LPUSER@$LPHOST"
+else
+ USER=""
+fi
+
+#
+# Main Program, just cobble together the pipeline and run it
+#
+# The malarky with file descriptors 1 and 3 is to avoid a bug in
+# (some versions?) of Ghostscript where Postscript's stdout gets
+# intermingled with the printer drivers output, resulting in
+# corrupted image data.
+#
+# CUPS also does grief by adding its own PS code to the input file.
+# We take care of that with the sed command. Thus, Well Tempered
+# Screening now works!
+#
+GS="$GSBIN -q -dBATCH -dSAFER -dQUIET -dNOPAUSE"
+
+sed 's#^[^/]*cupsPSLevel2#false#' | \
+$PREFILTER \
+| ($GS $PAPERSIZE -g$DIM -r$RES $GSDEV $GSOPTS \
+ -sOutputFile="|cat 1>&3" $GAMMAFILE - >/dev/null 2>&1) 3>&1 \
+| foo2hp -r$RES -g$DIM -p$PAPER -m$MEDIA -n$COPIES -d$DUPLEX -s$SOURCE \
+ $COLOR -b$BPP $CLIP_UL $CLIP_LR $CLIP_LOG $SAVETONER \
+ -J "$LPJOB" -U "$USER" \
+ $BC $AIB $COLOR2MONO $NOPLANES $EXTRAPAD -D$DEBUG
+
+#
+# Log the command line, for debugging and problem reports
+#
+if [ -x /usr/bin/logger ]; then
+ logger -t "$BASENAME" -p lpr.info -- \
+ "$GSBIN $PAPERSIZE -g$DIM -r$RES $GSDEV $GSOPT $GAMAFILE"
+ logger -t "$BASENAME" -p lpr.info -- \
+ "foo2hp -r$RES -g$DIM -p$PAPER -m$MEDIA \
+-n$COPIES -d$DUPLEX -s$SOURCE $COLOR -b$BPP $CLIP_UL $CLIP_LR $CLIP_LOG \
+$SAVETONER $BC $AIB $COLOR2MONO $NOPLANES $EXTRAPAD"
+fi
+
+#
+# Remove cruft
+#
+if [ $DEBUG -eq 0 ]; then
+ for i in crd.ps log usecie.ps selcrd.ps
+ do
+ file="$ICCTMP.$i"
+ [ -f $file ] && rm -f $file
+ done
+fi
+
+exit 0
diff --git a/foo2lava-wrapper.1in b/foo2lava-wrapper.1in
new file mode 100644
index 0000000..0522a1e
--- /dev/null
+++ b/foo2lava-wrapper.1in
@@ -0,0 +1,388 @@
+.TH foo2lava-wrapper 1 "${MODpage}" "foo2lava-wrapper ${MODver}"
+'\"==========================================================================
+'\" STRINGS and MACROS
+'\"==========================================================================
+'\"
+'\" Define strings for special characters that nroff doesn't have
+'\"
+'\" N.B. using .if cua to test for special characters did not work.
+'\"
+.if !'\*[.T]'ps' .ds ua up
+.if '\*[.T]'ps' .ds ua \(ua
+.if !'\*[.T]'ps' .ds da down
+.if '\*[.T]'ps' .ds da \(da
+.if !'\*[.T]'ps' .ds <- left
+.if '\*[.T]'ps' .ds <- \(<-
+.if !'\*[.T]'ps' .ds -> right
+.if '\*[.T]'ps' .ds -> \(->
+'\"
+'\" bx - box a Courier string for making keycaps
+'\"
+'\" N.B. this mess is to make the line drawing come out only
+'\" if we are really generating postscript
+'\"
+.de bx
+.ie !'\*[.T]'ps' \{\
+. RB [ \\$1 ]\\$2
+.\}
+.el \{\
+. ie !r ps4html \{\
+'\" \(br\|\s-1\f(CB\\$1\fP\s+1\|\(br\l'|0\(rn'\l'|0\(ul'
+. ft CW
+. nr par*bxw \w'\\$1'+.4m
+\Z'\v'.25m'\D'l 0 -1m'\D'l \\n[par*bxw]u 0'\D'l 0 1m'\D'l -\\n[par*bxw]u 0''\
+\Z'\h'.2m'\s-1\\$1\s+1'\
+\h'\\n[par*bxw]u'\\$2
+. ft P
+. \}
+. el \{\
+. RB [ \\$1 ]\\$2
+. \}
+.\}
+..
+'\"
+'\" strings to set current color (null with old groff)
+'\"
+.if mred .ds red \m[red]
+.if mgreen .ds green \m[green]
+.if mblue .ds blue \m[blue]
+.if mblack .ds black \m[black]
+.if mblack .ds mP \mP
+'\"
+'\" fix for grotty + xterm. We call for orange, grotty outputs yellow,
+'\" but xterm displays yellow as orange. The cycle is complete.
+'\"
+.if n .defcolor orange rgb #ffff00
+'\"
+'\" color <color> - set the current color (ignores request with old groff)
+'\"
+.de color
+.if mred \m[\\$1]\c
+..
+'\"
+'\" colorword <color> <word> - colorize a word (ignored by old groff)
+'\"
+.de colorword
+.ie m\\$1 \m[\\$1]\\$2\mP\c
+.el \\$2\c
+..
+'\"
+'\" colbox <fg> <bg> <word> - colorize a word in a filled box
+'\"
+.de colbox
+.ie mred \M[\\$2]\
+\v'+.167v'\
+\D'P 0 -0.9v \w'\\$3'u 0 0 +0.9v -\w'\\$3'u 0'\
+\v'-.167v'\
+\m[\\$1]\\$3\mP\MP
+.el \\$3\c
+..
+'\"
+'\" Macros for doing pdfmarks
+'\"
+.de specialps
+\\k_\X'ps: \\$*'\h'|\\n_u'\c
+..
+'\"
+'\" pdfmark PDFMARKCODE
+'\"
+.ds pdfmarks
+.if d pdfmarks \{\
+.de pdfmark
+. specialps exec [\\$1 pdfmark
+..
+'\"
+'\" pdfdest LINKNAME
+'\"
+.de pdfdest
+.pdfmark "/Dest /\\$1 /View [/XYZ -5 PL null] /DEST"
+..
+'\"
+'\" pdfbookmark COUNT LINKNAME STRING
+'\"
+.de pdfbookmark
+. pdfmark "/View [/XYZ 44 730 1.0] /Count \\$1 /Dest /\\$2 /Title (\\$3) /OUT"
+..
+'\"
+'\" Define the SH and SS macros to save pdfmark information
+'\" in "arrays" of numbers and strings.
+'\"
+.if !r rr_n \{\
+.nr rr_n 0 1
+.am SH
+. nr rr_levels!\\n+[rr_n] 2
+. ds rr_labels!\\n[rr_n] \\$*
+. pdfdest Link\\n[rr_n]
+..
+.am SS
+. nr rr_levels!\\n+[rr_n] 3
+. ds rr_labels!\\n[rr_n] \\$*
+. pdfdest Link\\n[rr_n]
+..
+.\}
+'\"
+'\" Called at the end of the document to generate the pdfmark outline
+'\"
+.de pdf_outline
+.nr rr_levels!\\n+[rr_n] 1
+.nr rr_i 0 1
+.while \\n+[rr_i]<\\n[rr_n] \{\
+. nr rr_ip1 \\n[rr_i]+1
+. nr rr_count 0
+. if \\n[rr_levels!\\n[rr_ip1]]>\\n[rr_levels!\\n[rr_i]] \{\
+. nr rr_j \\n[rr_i] 1
+. while \\n+[rr_j]<\\n[rr_n] \{\
+. if \\n[rr_levels!\\n[rr_j]]<=\\n[rr_levels!\\n[rr_i]] \{\
+. break
+. \}
+. if \\n[rr_levels!\\n[rr_j]]==(\\n[rr_levels!\\n[rr_i]]+1) \{\
+. nr rr_count \\n[rr_count]+1
+. \}
+. \}
+. \}
+. ds hhh \\*[rr_labels!\\n[rr_i]]
+. pdfbookmark \\n[rr_count] Link\\n[rr_i] "\\*[hhh]"
+.\}
+..
+'\"
+'\" Some postscript to make pdfmarks harmless on old interpreters...
+'\"
+.specialps "def /pdfmark where {pop} {userdict /pdfmark /cleartomark load put} ifelse"
+'\"
+'\" Force display of Bookmarks in Acrobat when document is viewed.
+'\"
+.pdfmark "[/PageMode /UseOutlines /Page 1 /View [/XYZ null null null] /DOCVIEW"
+'\"
+'\" Output the document info in pdfmarks
+'\"
+.pdfmark "\
+ /Title (\*[an-title](\*[an-section])) \
+ /Subject (foo2lava-wrapper Manual Page) \
+ /Author (Rick Richardson) \
+ /Keywords (printing) \
+ /Creator (groff \n(.x.\n(.y.\n(.Y -man) \
+ /CreationDate (\*[an-extra1]) \
+ /ModDate (\*[an-extra1]) \
+ /DOCINFO"
+\}
+'\"
+'\" The manual page name is only 1st level mark
+'\"
+.nr rr_levels!\n+[rr_n] 1
+.ds rr_labels!\n[rr_n] \*[an-title](\*[an-section])
+.pdfdest Link\n[rr_n]
+'\"==========================================================================
+'\" MANUAL PAGE SOURCE
+'\"==========================================================================
+.SH NAME
+foo2lava-wrapper \- Convert Postscript into a LAVAFLOW printer stream
+.SH SYNOPSIS
+.B foo2lava-wrapper
+.RI [ options "] [" ps-file ]
+.SH DESCRIPTION
+.B foo2lava-wrapper
+is a Foomatic compatible printer wrapper for the \fBfoo2lava\fP printer driver.
+This script reads a Postscript \fIps-file\fP or standard input
+and converts it to Zenographics LAVAFLOW printer format
+for driving the Konica Minolta magicolor 2530 DL network color laser printer
+and other Zenographics-based LAVAFLOW printers.
+.P
+This script can be used in a standalone fashion, but is intended to
+be called from a printer spooler system which uses the Foomatic
+printer database.
+
+.SH COMMAND LINE OPTIONS
+.SS Normal Options
+These are the options used to select the parameters of a
+print job that are usually controlled on a per job basis.
+.TP
+.BI \-c
+Print in color (else monochrome).
+.TP
+.BI \-C\0 colormode
+Color correction mode [0].
+.TS
+n l .
+0 Best compromise
+1 Photos (using m2300w CRDs)
+2 Photos and text (using m2300w CRDs)
+3 Graphics and text (using m2300w CRDs)
+10 ICM color profile (using -G *.icm file)
+.TE
+.TP
+.BI \-d\0 duplex
+Duplex code to send to printer [1].
+.TS
+| n l | n l | n l .
+1 off 2 long edge 3 short edge
+.TE
+.TP
+.BI \-m\0 media
+Media code to send to printer [0].
+.TS
+l l l
+l n n.
+_
+Media 2530DL
+_
+plain 0
+transparency 4
+thick stock 20
+envelope 22
+letterhead 23
+postcard 25
+labels 26
+recycled 27
+.TE
+.TP
+.BI \-p\0 paper
+Paper size code to send to printer [2].
+.TS
+| n l | n l.
+1 executive 25 A5
+2 letter 26 A4
+3 legal 45 B5jis
+80 env Monarch 65 B5iso
+81 env #10 90 env DL
+91 env C5 92 env B5
+835 4x6" photo 837 10x15cm photo
+.TE
+.TP
+.BI \-n\0 copies
+Number of copies [1].
+.TP
+.BI \-r\0 xres x yres
+Set device resolution in pixels/inch [1200x600].
+.TP
+.BI \-s\0 source
+Source (Input Slot) code to send to printer [255].
+.TS
+| n l | n l.
+1 Tray 1 255 auto
+4 Tray 2
+.TE
+.TP
+.BI \-t
+Draft mode. Every other pixel is white.
+.TP
+.BI "\-2 \-3 \-4 \-5 \-6 \-8 \-9 \-10 \-12 \-14 \-15 \-16 \-18"
+Print in N-up. Requires the \fBpsutils\fP package.
+.TP
+.BI \-o\0 orient
+Orientation used for N-up.
+.TS
+l l l.
+Portrait -op (normal)
+Landscape -ol (rotated 90 degrees anticlockwise)
+Seascape -os (rotated 90 degrees clockwise)
+.TE
+.SS Printer Tweaking Options
+These are the options used to customize the operation of \fBfoo2lava\fP
+for a particular printer.
+.TP
+.BI \-u\0 xoff x yoff
+Set the offset of the start of the printable region from the
+upper left corner, in pixels [varies with paper size].
+The defaults should work on the 2200DL and 2300DL, and have not
+been tested on any other printers.
+.TP
+.BI \-l\0 xoff x yoff
+Set the offset of the end of the printable region from the
+lower right corner, in pixels [varies with paper size].
+The defaults should work on the 2200DL and 2300DL, and have not
+been tested on any other printers.
+.TP
+.BI \-L\0 mask
+Send the logical clipping values from -u/-l in the LAVAFLOW stream.
+\fBfoo2lava-wrapper\fP always runs Ghostscript with the ideal page dimensions,
+so that the scale of the image is correct,
+regardless whether or not the printer has unprintable regions.
+This option is used to move the position of the clipped image
+back to where it belongs on the page. The default is to send
+the amount which was clipped by -u and -l, and should be
+good in most cases.
+.TS
+l l.
+0 don't send any logical clipping amounts
+1 only send Y clipping amount
+2 only send X clipping amount
+3 send both X and Y clipping amounts
+.TE
+.TP
+.BI \-z\0 model
+Model: 0=2530DL. Default is 0.
+.SS Color Tweaking Options
+These are the options used to control the quality of color output.
+Color correction is currently a WORK IN PROGRESS.
+.TP
+.BI \-g\0 gsopts
+Additional options to pass to Ghostscript, such as -g\(lq-dDITHERPPI=nnn\(rq,
+etc. This option may appear more than once.
+.TP
+.BI \-G\0 profile.icm
+Convert \fIprofile.icm\fP to a Postscript color rendering
+dictionary (CRD) using \fBfoo2zjs-icc2ps\fP and
+adjust the printer colors by using the Postscript \fBsetcolorrendering\fP
+operator. (WORK IN PROGRESS).
+.TP
+.BI \-G\0 gamma-file.ps
+Prepend \fIgamma-file.ps\fP to the Postscript input to perform
+color correction using the \fBsetcolortransfer\fP Postscript operator.
+For example, the file might contain:
+.br
+{0.333 exp} {0.333 exp} {0.333 exp} {0.333 exp} setcolortransfer
+.TP
+.BI \-I\0 intent
+Select profile intent from the ICM file.
+0=Perceptual, 1=Colorimetric, 2=Saturation, 3=Absolute.
+Default is 0 (perceptual).
+.SS Debugging Options
+These options are used for debugging \fBfoo2lava\fP and its wrapper.
+.TP
+.BI \-S\0 plane
+Output just a single color plane from a color print and print it
+on the black plane. The default is to output all color planes.
+.TS
+l l.
+1 Cyan
+2 Magenta
+3 Yellow
+4 Black
+.TE
+.TP
+.BI \-D\0 level
+Set Debug level [0].
+
+.SH EXAMPLES
+Create a monochrome LAVAFLOW stream from a Postscript document,
+examine it, and then print it using a RAW print queue:
+
+.RS
+.nf
+foo2lava-wrapper testpage.ps > testpage.zm
+lavadecode < testpage.zm
+lpr -P raw testpage.zm
+.fi
+.RE
+.P
+Create a color LAVAFLOW stream from a Postscript document:
+
+.RS
+.nf
+foo2lava-wrapper -c testpage.ps > testpage.zc
+.fi
+.RE
+
+.SH FILES
+.BR /usr/bin/foo2lava-wrapper
+.SH SEE ALSO
+.BR foo2lava (1),
+.BR lavadecode (1)
+.SH "AUTHOR"
+Rick Richardson <rick.richardson@comcast.net>
+.br
+${URLZJS}/
+'/"
+'/"
+'/"
+.em pdf_outline
diff --git a/foo2lava-wrapper.in b/foo2lava-wrapper.in
new file mode 100755
index 0000000..1ceaa8c
--- /dev/null
+++ b/foo2lava-wrapper.in
@@ -0,0 +1,591 @@
+#!/bin/sh
+
+#* Copyright (C) 2003-2006 Rick Richardson
+#*
+#* 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.
+#*
+#* Authors: Rick Richardson <rick.richardson@comcast.net>
+
+VERSION='$Id: foo2lava-wrapper.in,v 1.11 2006/12/23 14:20:22 rick Exp $'
+
+#
+# Printer Notes:
+#
+# Konica Minolta 2530 DL
+#
+
+PROGNAME="$0"
+BASENAME=`basename $PROGNAME`
+PREFIX=/usr
+SHARE=$PREFIX/share/foo2lava
+
+#
+# Log the command line, for debugging and problem reports
+#
+if [ -x /usr/bin/logger ]; then
+ logger -t "$BASENAME" -p lpr.info -- "foo2lava-wrapper $@" </dev/null
+fi
+
+usage() {
+ cat <<EOF
+Usage:
+ $BASENAME [options] [ps-file]
+
+ Foomatic printer wrapper for the foo2lava printer driver.
+ This script reads a Postscript ps-file or standard input
+ and converts it to LAVAFLOW printer format.
+
+Normal Options:
+-c Print in color (else monochrome)
+-d duplex Duplex code to send to printer [$DUPLEX]
+ 1=off, 2=longedge, 3=shortedge
+-m media Media code to send to printer [$MEDIA]
+ 1=standard 4=transparency 20=thick stock 22=envelope
+ 23=letterhead 25=postcard 26=labels 27=recycled
+ 28=glossy
+-p paper Paper code [$PAPER]
+ 1=executive 2=letter 3=legal 25=A5 26=A4 45=B5jis
+ 65=B5iso 80=envMonarch 81=env#10 90=envDL 91=envC5
+ 92=envC6 835=4x6\" 837=10x15cm
+-n copies Number of copies [$COPIES]
+-r <xres>x<yres> Set device resolution in pixels/inch [$RES]
+-s source Source code to send to printer [$SOURCE]
+ 1=upper, 2=lower, 4=manual, 7=auto
+ Code numbers may vary with printer model.
+-t Draft mode. Every other pixel is white.
+-2/-3/-4/-6/-8/-10/-12/-14/-15/-16/-18
+ Print with N-up (requires psutils)
+-o orient For N-up: -op is portrait, -ol is landscape, -os is seascape.
+
+Printer Tweaking Options:
+-u <xoff>x<yoff> Set offset of upper left printable in pixels [varies]
+-l <xoff>x<yoff> Set offset of lower right printable in pixels [varies]
+-L mask Send logical clipping values from -u/-l in ZjStream [3]
+ 0=no, 1=Y, 2=X, 3=XY
+-P Do not output START_PLANE codes. May be needed by some
+ monochrome-only printers.
+-X padlen Add extra zero padding to the end of BID segments [16]
+-z model Model: 0=2300DL 1=hp1020 [0]
+
+Color Tweaking Options:
+-g gsopts Additional options to pass to Ghostscript, such as
+ -dDITHERPPI=nnn, etc. May appear more than once. []
+-G profile.icm Convert profile.icm to a Postscript CRD using icc2ps and
+ adjust colors using the setcolorrendering PS operator.
+ $SHARE/icm/ will be searched for profile.icm.
+-I intent Select profile intent from ICM file [$INTENT]
+ 0=Perceptual, 1=Colorimetric, 2=Saturation, 3=Absolute
+-G gamma-file.ps Prepend gamma-file to the Postscript input to perform
+ color correction using the setcolortransfer PS operator.
+
+Debugging Options:
+-S plane Output just a single color plane from a color print [all]
+ 1=Cyan, 2=Magenta, 3=Yellow, 4=Black
+-D lvl Set Debug level [$DEBUG]
+-V $VERSION
+EOF
+
+ exit 1
+}
+
+#
+# Report an error and exit
+#
+error() {
+ echo "$BASENAME: $1" >&2
+ exit 1
+}
+
+dbgcmd() {
+ if [ $DEBUG -ge 1 ]; then
+ echo "$@" >&2
+ fi
+ "$@"
+}
+
+#
+# N-up-ify the job. Requires psnup from psutils package
+#
+nup() {
+ case "$NUP" in
+ [2368]|1[0458])
+ tr '\r' '\n' | psnup $NUP_ORIENT -d2 -$NUP -m.3in -p$paper -q
+ ;;
+ [49]|1[26])
+ tr '\r' '\n' | psnup $NUP_ORIENT -d2 -$NUP -m.5in -p$paper -q
+ ;;
+ *)
+ error "Illegal call to nup()."
+ ;;
+ esac
+}
+
+#
+# Process the options
+#
+
+# Try to use a local copy of GhostScript 8.14, if available. Otherwise,
+# fallback to whatever the Linux distro has installed (usually 7.05)
+#
+# N.B. := operator used here, when :- would be better, because "ash"
+# doesn't have :-
+if gs8 -v >/dev/null 2>&1; then
+ GSBIN=${GSBIN:-gs8}
+else
+ GSBIN=${GSBIN:-gs}
+fi
+
+CMDLINE="$*"
+DEBUG=0
+DUPLEX=1
+COLOR=
+COLORMODE=0
+MODEL=0
+# What mode to use if the user wants us to pick the "best" mode
+case `$GSBIN --version` in
+7*) DEFAULTCOLORMODE=10
+ DEFAULTCOLORMODE=2
+ DEFAULTCOLORMODE=10
+ ;;
+*) DEFAULTCOLORMODE=2
+ DEFAULTCOLORMODE=10
+ ;;
+esac
+QUALITY=1
+MEDIA=0
+COPIES=1
+PAPER=2
+RES=1200x600
+SOURCE=255
+NUP=
+CLIP_UL=
+CLIP_LR=
+CLIP_LOG=
+BC=
+AIB=
+NOPLANES=
+COLOR2MONO=
+GAMMAFILE=
+INTENT=0
+GSOPTS=
+EXTRAPAD=
+SAVETONER=
+NUP_ORIENT=
+GSDEV=-sDEVICE=pbmraw
+while getopts "1:23456789o:b:cC:d:g:l:u:L:m:n:p:q:r:s:tz:ABS:D:G:I:PX:Vh?" opt
+do
+ case $opt in
+ b) GSBIN="$OPTARG";;
+ c) COLOR=-c;;
+ d) DUPLEX="$OPTARG";;
+ g) GSOPTS="$GSOPTS $OPTARG";;
+ m) MEDIA="$OPTARG";;
+ n) COPIES="$OPTARG";;
+ p) PAPER="$OPTARG";;
+ q) QUALITY="$OPTARG";;
+ r) RES="$OPTARG";;
+ s) SOURCE="$OPTARG";;
+ t) SAVETONER="-t";;
+ z) MODEL="$OPTARG";;
+ l) CLIP_LR="-l $OPTARG";;
+ u) CLIP_UL="-u $OPTARG";;
+ L) CLIP_LOG="-L $OPTARG";;
+ A) AIB=-A;;
+ B) BC=-B;;
+ C) COLORMODE="$OPTARG";;
+ S) COLOR2MONO="-S$OPTARG";;
+ D) DEBUG="$OPTARG";;
+ G) GAMMAFILE="$OPTARG";;
+ I) INTENT="$OPTARG";;
+ P) NOPLANES=-P;;
+ X) EXTRAPAD="-X $OPTARG";;
+ [234689]) NUP="$opt";;
+ [57]) error "Can't find acceptable layout for $opt-up";;
+ 1) case "$OPTARG" in
+ [024568]) NUP="1$OPTARG";;
+ *) error "Can't find acceptable layout for 1$OPTARG-up";;
+ esac
+ ;;
+ o) case "$OPTARG" in
+ l*) NUP_ORIENT=-l;;
+ s*) NUP_ORIENT=-r;;
+ p*|*) NUP_ORIENT=;;
+ esac;;
+ V) echo "$VERSION"; foo2lava -V; exit 0;;
+ h|\?)
+ if [ "$CMDLINE" != "-?" -a "$CMDLINE" != -h ]; then
+ echo "Illegal command:"
+ echo " $0 $CMDLINE"
+ echo
+ fi
+ usage;;
+ esac
+done
+shift `expr $OPTIND - 1`
+
+#
+case "$QUALITY" in
+0)
+ GSOPTS="-dCOLORSCREEN $GSOPTS"
+ ;;
+1)
+ GSOPTS="-dCOLORSCREEN $GSOPTS"
+ ;;
+2)
+ GSOPTS="-dMaxBitMap=500000000 $GSOPTS"
+ ;;
+esac
+
+#
+# Validate model code
+#
+case "$MODEL" in
+0|1) ;;
+*) error "Unknown model code $MODEL";;
+esac
+
+#
+# Validate media code
+#
+case "$MEDIA" in
+0|plain) MEDIA=0;;
+4|transparency) MEDIA=4;;
+20|thickstock) MEDIA=20;;
+22|envelope) MEDIA=22;;
+23|letterhead) MEDIA=23;;
+25|postcard) MEDIA=25;;
+26|labels) MEDIA=26;;
+27|recycled) MEDIA=27;;
+28|glossy) MEDIA=28;;
+[0-9]*) ;;
+*) error "Unknown media code $MEDIA";;
+esac
+
+#
+# Validate source (InputSlot) code
+#
+case "$SOURCE" in
+1|tray1) SOURCE=1;;
+4|tray2) SOURCE=4;;
+255|auto) SOURCE=255;;
+[0-9]*) ;;
+*) error "Unknown source code $SOURCE";;
+esac
+
+#
+# Validate Duplex code
+#
+case "$DUPLEX" in
+1|off|none) DUPLEX=1;;
+2|long*) DUPLEX=2;;
+3|short*) DUPLEX=3;;
+[0-9]*) ;;
+*) error "Unknown duplex code $DUPLEX";;
+esac
+
+#
+# Validate Resolution
+#
+case "$RES" in
+600x600) ;;
+1200x600) ;;
+2400x600) ;;
+*) error "Illegal resolution $RES";;
+esac
+
+#
+# Figure out the paper dimensions in pixels/inch, and set the
+# default clipping region. Unfortunately, this is a trouble
+# area for ZjStream printers. Various versions of ZjS print
+# engines react differently when asked to print into their
+# unprintable regions.
+#
+set_clipping() {
+ ulx=$1; uly=$2
+ lrx=$3; lry=$4
+
+ # Set clipping region if it isn't already set
+ if [ "$CLIP_UL" = "" ]; then
+ case "$RES" in
+ 600x600) ulx=`expr $ulx / 2`;;
+ 2400x600) ulx=`expr $ulx \* 2`;;
+ esac
+ CLIP_UL="-u ${ulx}x${uly}"
+ fi
+ if [ "$CLIP_LR" = "" ]; then
+ case "$RES" in
+ 600x600) lrx=`expr $lrx / 2`;;
+ 2400x600) lrx=`expr $lrx \* 2`;;
+ esac
+ CLIP_LR="-l ${lrx}x${lry}"
+ fi
+}
+
+case "$PAPER" in
+1|executive) PAPER=1; paper=executive; XDIM="8700"; YDIM="6300"
+ set_clipping 206 110 206 110
+ ;;
+2|letter) PAPER=2; paper=letter; XDIM="10200"; YDIM="6600"
+ set_clipping 204 100 204 100
+ ;;
+3|legal) PAPER=3; paper=legal; XDIM="10200"; YDIM="8400"
+ set_clipping 204 104 204 104
+ ;;
+25|a5|A5) PAPER=25; paper=a5; XDIM="6992"; YDIM="4960"
+ set_clipping 216 112 216 112
+ ;;
+26|a4|A4) PAPER=26; paper=a4; XDIM="9920"; YDIM="7016"
+ set_clipping 208 100 208 100
+ ;;
+45|b5jis|B5jis) PAPER=45; paper=b5; XDIM="8598"; YDIM="6070"
+ set_clipping 204 107 202 107
+ ;;
+65|b5iso|B5iso) PAPER=65; paper=b5; XDIM="8314"; YDIM="5906"
+ set_clipping 206 105 204 105
+ ;;
+80|envMonarch) PAPER=80; paper=envMonarch;XDIM="4650"; YDIM="4500"
+ set_clipping 214 106 212 106
+ ;;
+81|"env#10") PAPER=81; paper=env10; XDIM="4950"; YDIM="5700"
+ set_clipping 204 114 202 114
+ ;;
+90|envDL) PAPER=90; paper=envDL; XDIM="5200"; YDIM="5200"
+ set_clipping 216 104 216 104
+ ;;
+91|envC5) PAPER=91; paper=envC5; XDIM="7650"; YDIM="5408"
+ set_clipping 210 112 208 112
+ ;;
+92|envC6) PAPER=92; paper=envC6; XDIM="5386"; YDIM="3826"
+ set_clipping 214 105 212 105
+ ;;
+835|photo4x6) PAPER=835; paper=photo4x6; XDIM="4800"; YDIM="3600"
+ set_clipping 224 104 224 104
+ ;;
+837|photo10x15) PAPER=837; paper=photo10x15; XDIM="4818"; YDIM="3590"
+ # Actually, 102x152
+ set_clipping 201 115 201 115
+ ;;
+*) error "Unimplemented paper code $PAPER";;
+esac
+PAPERSIZE="-sPAPERSIZE=$paper";
+
+case "$RES" in
+600x600) XDIM=`expr $XDIM / 2`;;
+1200x600) ;;
+2400x600) XDIM=`expr $XDIM \* 2`;;
+esac
+DIM="${XDIM}x${YDIM}"
+
+#
+# If there is an argument left, take it as the file to print.
+# Else, the input comes from stdin.
+#
+if [ $# -ge 1 ]; then
+ if [ "$LPJOB" = "" ]; then
+ : # LPJOB="$1"
+ fi
+ exec < $1
+fi
+
+#
+# Filter thru psnup if N-up printing has been requested
+#
+case $NUP in
+[234689]|1[024568]) PREFILTER="nup";;
+*) PREFILTER=cat;;
+esac
+
+#
+# Overload -G. If the file name ends with ".icm" or ".ICM"
+# then convert the ICC color profile to a Postscript CRD,
+# then prepend it to the users job. Select the intent
+# using the -I option.
+#
+
+create_crd() {
+ #
+ # Create a Postscript CRD
+ #
+ ICC2PS=$PREFIX/bin/foo2zjs-icc2ps
+ if [ -x $ICC2PS ]; then
+ $ICC2PS -o $GAMMAFILE -t$INTENT > $ICCTMP.crd.ps 2>$ICCTMP.log \
+ || error "Problem converting .ICM file to Postscript"
+ cat > $ICCTMP.usecie.ps <<-EOF
+ %!PS-Adobe-3.0
+ <</UseCIEColor true>>setpagedevice
+ EOF
+ cat > $ICCTMP.selcrd.ps <<-EOF
+ /Current /ColorRendering findresource setcolorrendering
+ EOF
+ GAMMAFILE="$ICCTMP.usecie.ps $ICCTMP.crd.ps $ICCTMP.selcrd.ps"
+ else
+ GAMMFILE=
+ fi
+}
+
+if [ $DEBUG -gt 0 ]; then
+ ICCTMP=/tmp/icc
+else
+ ICCTMP=/tmp/icc$$
+fi
+
+if [ "" = "$COLOR" ]; then
+ COLORMODE=
+ GAMMAFILE=
+else
+ case "$COLORMODE" in
+ 0) COLORMODE=$DEFAULTCOLORMODE;;
+ esac
+fi
+
+CRDBASE="$PREFIX/share/foo2zjs/crd"
+case "$RES" in
+ 600x600) COLORMODE=;;
+ 1200x600) SCREEN=screen1200.ps;;
+ 2400x600) SCREEN=screen2400.ps;;
+esac
+
+case "$COLORMODE" in
+"")
+ # Monochrome
+ ;;
+10|icm)
+ # Use old ICM method
+ AIB=-A
+ BC=-B
+ case "$GAMMAFILE" in
+ *.icm|*.ICM|*.icc|*.ICC)
+ #
+ # Its really an .ICM file, not a gamma file.
+ #
+ # The file can be a full path name, or the name of a file in $SHARE/icm/
+ #
+ if [ -r "$GAMMAFILE" ]; then
+ create_crd
+ elif [ -r "$SHARE/icm/$GAMMAFILE" ]; then
+ GAMMAFILE="$SHARE/icm/$GAMMAFILE"
+ create_crd
+ else
+ GAMMAFILE=
+ fi
+ ;;
+ none)
+ GAMMAFILE=
+ ;;
+ esac
+ ;;
+1|photo)
+ # Photo
+ GAMMAFILE="$CRDBASE/prolog.ps"
+ GAMMAFILE="$GAMMAFILE $CRDBASE/2300w-1200@150-l250-kx,ucr125,75-per.crd"
+ GAMMAFILE="$GAMMAFILE $CRDBASE/$SCREEN"
+ ;;
+2|graphics)
+ # Photo and Text
+ GAMMAFILE="$CRDBASE/prolog.ps"
+ #GAMMAFILE="$GAMMAFILE $CRDBASE/2300w-1200@150-l250-kx,ucr100,75-per.crd"
+ GAMMAFILE="$GAMMAFILE $CRDBASE/kh.crd"
+ GAMMAFILE="$GAMMAFILE $CRDBASE/$SCREEN"
+ ;;
+3|text)
+ # Graphic and Text
+ GAMMAFILE="$CRDBASE/prolog.ps"
+ #GAMMAFILE="$GAMMAFILE $CRDBASE/2300w-1200@150-l250-kx,ucr100,50-per.crd"
+ GAMMAFILE="$GAMMAFILE $CRDBASE/kx.crd"
+ GAMMAFILE="$GAMMAFILE $CRDBASE/$SCREEN"
+ ;;
+4|tonersave)
+ # Reduced toner
+ GAMMAFILE="$CRDBASE/prolog.ps"
+ GAMMAFILE="$GAMMAFILE $CRDBASE/2300w-1200@150-l250-kx,ucr100,0-per.crd"
+ GAMMAFILE="$GAMMAFILE $CRDBASE/$SCREEN"
+ ;;
+*.crd)
+ GAMMAFILE="$CRDBASE/prolog.ps"
+ if [ -f $COLORMODE ]; then
+ GAMMAFILE="$GAMMAFILE $COLORMODE"
+ elif [ -f $CRDBASE/$COLORMODE ]; then
+ GAMMAFILE="$GAMMAFILE $CRDBASE/$COLORMODE"
+ else
+ error "Can't find CRD '$COLORMODE' in . or in $CRDBASE"
+ fi
+ GAMMAFILE="$GAMMAFILE $CRDBASE/$SCREEN"
+ ;;
+*)
+ error "Unknown color method '$COLORMODE'"
+ ;;
+esac
+
+if [ "" != "$COLOR" ]; then
+ if [ "" = "$AIB" -a "" = "$BC" ]; then
+ # Faster, but can't handle AllIsBlack or BlackClears
+ GSDEV=-sDEVICE=pksmraw
+ else
+ # Can't handle different size pages
+ GSDEV=-sDEVICE=bitcmyk
+ fi
+fi
+
+#
+# Figure out USERNAME
+#
+if [ "$LPUSER" != "" ]; then
+ USER="$LPUSER@$LPHOST"
+else
+ USER=""
+fi
+
+#
+# Main Program, just cobble together the pipeline and run it
+#
+# The malarky with file descriptors 1 and 3 is to avoid a bug in
+# (some versions?) of Ghostscript where Postscript's stdout gets
+# intermingled with the printer drivers output, resulting in
+# corrupted image data.
+#
+GS="$GSBIN -q -dBATCH -dSAFER -dQUIET -dNOPAUSE"
+
+$PREFILTER \
+| ($GS $PAPERSIZE -g$DIM -r$RES $GSDEV $GSOPTS \
+ -sOutputFile="|cat 1>&3" $GAMMAFILE - >/dev/null) 3>&1 \
+| foo2lava -r$RES -g$DIM -p$PAPER -m$MEDIA -n$COPIES -d$DUPLEX -s$SOURCE \
+ -z$MODEL $COLOR $CLIP_UL $CLIP_LR $CLIP_LOG $SAVETONER \
+ -J "$LPJOB" -U "$USER" \
+ $BC $AIB $COLOR2MONO $NOPLANES $EXTRAPAD -D$DEBUG
+
+#
+# Log the command line, for debugging and problem reports
+#
+if [ -x /usr/bin/logger ]; then
+ logger -t "$BASENAME" -p lpr.info -- \
+ "$GSBIN $PAPERSIZE -g$DIM -r$RES $GSDEV $GSOPT $GAMAFILE"
+ logger -t "$BASENAME" -p lpr.info -- \
+ "foo2lava -r$RES -g$DIM -p$PAPER -m$MEDIA \
+-n$COPIES -d$DUPLEX -s$SOURCE -z$MODEL $COLOR $CLIP_UL $CLIP_LR $CLIP_LOG \
+$SAVETONER $BC $AIB $COLOR2MONO $NOPLANES $EXTRAPAD"
+fi
+
+#
+# Remove cruft
+#
+if [ $DEBUG -eq 0 ]; then
+ for i in crd.ps log usecie.ps selcrd.ps
+ do
+ file="$ICCTMP.$i"
+ [ -f $file ] && rm -f $file
+ done
+fi
+
+exit 0
diff --git a/foo2lava.1in b/foo2lava.1in
new file mode 100644
index 0000000..8d166aa
--- /dev/null
+++ b/foo2lava.1in
@@ -0,0 +1,349 @@
+.TH foo2lava 1 "${MODpage}" "foo2lava ${MODver}"
+'\"==========================================================================
+'\" STRINGS and MACROS
+'\"==========================================================================
+'\"
+'\" Define strings for special characters that nroff doesn't have
+'\"
+'\" N.B. using .if cua to test for special characters did not work.
+'\"
+.if !'\*[.T]'ps' .ds ua up
+.if '\*[.T]'ps' .ds ua \(ua
+.if !'\*[.T]'ps' .ds da down
+.if '\*[.T]'ps' .ds da \(da
+.if !'\*[.T]'ps' .ds <- left
+.if '\*[.T]'ps' .ds <- \(<-
+.if !'\*[.T]'ps' .ds -> right
+.if '\*[.T]'ps' .ds -> \(->
+'\"
+'\" bx - box a Courier string for making keycaps
+'\"
+'\" N.B. this mess is to make the line drawing come out only
+'\" if we are really generating postscript
+'\"
+.de bx
+.ie !'\*[.T]'ps' \{\
+. RB [ \\$1 ]\\$2
+.\}
+.el \{\
+. ie !r ps4html \{\
+'\" \(br\|\s-1\f(CB\\$1\fP\s+1\|\(br\l'|0\(rn'\l'|0\(ul'
+. ft CW
+. nr par*bxw \w'\\$1'+.4m
+\Z'\v'.25m'\D'l 0 -1m'\D'l \\n[par*bxw]u 0'\D'l 0 1m'\D'l -\\n[par*bxw]u 0''\
+\Z'\h'.2m'\s-1\\$1\s+1'\
+\h'\\n[par*bxw]u'\\$2
+. ft P
+. \}
+. el \{\
+. RB [ \\$1 ]\\$2
+. \}
+.\}
+..
+'\"
+'\" strings to set current color (null with old groff)
+'\"
+.if mred .ds red \m[red]
+.if mgreen .ds green \m[green]
+.if mblue .ds blue \m[blue]
+.if mblack .ds black \m[black]
+.if mblack .ds mP \mP
+'\"
+'\" fix for grotty + xterm. We call for orange, grotty outputs yellow,
+'\" but xterm displays yellow as orange. The cycle is complete.
+'\"
+.if n .defcolor orange rgb #ffff00
+'\"
+'\" color <color> - set the current color (ignores request with old groff)
+'\"
+.de color
+.if mred \m[\\$1]\c
+..
+'\"
+'\" colorword <color> <word> - colorize a word (ignored by old groff)
+'\"
+.de colorword
+.ie m\\$1 \m[\\$1]\\$2\mP\c
+.el \\$2\c
+..
+'\"
+'\" colbox <fg> <bg> <word> - colorize a word in a filled box
+'\"
+.de colbox
+.ie mred \M[\\$2]\
+\v'+.167v'\
+\D'P 0 -0.9v \w'\\$3'u 0 0 +0.9v -\w'\\$3'u 0'\
+\v'-.167v'\
+\m[\\$1]\\$3\mP\MP
+.el \\$3\c
+..
+'\"
+'\" Macros for doing pdfmarks
+'\"
+.de specialps
+\\k_\X'ps: \\$*'\h'|\\n_u'\c
+..
+'\"
+'\" pdfmark PDFMARKCODE
+'\"
+.ds pdfmarks
+.if d pdfmarks \{\
+.de pdfmark
+. specialps exec [\\$1 pdfmark
+..
+'\"
+'\" pdfdest LINKNAME
+'\"
+.de pdfdest
+.pdfmark "/Dest /\\$1 /View [/XYZ -5 PL null] /DEST"
+..
+'\"
+'\" pdfbookmark COUNT LINKNAME STRING
+'\"
+.de pdfbookmark
+. pdfmark "/View [/XYZ 44 730 1.0] /Count \\$1 /Dest /\\$2 /Title (\\$3) /OUT"
+..
+'\"
+'\" Define the SH and SS macros to save pdfmark information
+'\" in "arrays" of numbers and strings.
+'\"
+.if !r rr_n \{\
+.nr rr_n 0 1
+.am SH
+. nr rr_levels!\\n+[rr_n] 2
+. ds rr_labels!\\n[rr_n] \\$*
+. pdfdest Link\\n[rr_n]
+..
+.am SS
+. nr rr_levels!\\n+[rr_n] 3
+. ds rr_labels!\\n[rr_n] \\$*
+. pdfdest Link\\n[rr_n]
+..
+.\}
+'\"
+'\" Called at the end of the document to generate the pdfmark outline
+'\"
+.de pdf_outline
+.nr rr_levels!\\n+[rr_n] 1
+.nr rr_i 0 1
+.while \\n+[rr_i]<\\n[rr_n] \{\
+. nr rr_ip1 \\n[rr_i]+1
+. nr rr_count 0
+. if \\n[rr_levels!\\n[rr_ip1]]>\\n[rr_levels!\\n[rr_i]] \{\
+. nr rr_j \\n[rr_i] 1
+. while \\n+[rr_j]<\\n[rr_n] \{\
+. if \\n[rr_levels!\\n[rr_j]]<=\\n[rr_levels!\\n[rr_i]] \{\
+. break
+. \}
+. if \\n[rr_levels!\\n[rr_j]]==(\\n[rr_levels!\\n[rr_i]]+1) \{\
+. nr rr_count \\n[rr_count]+1
+. \}
+. \}
+. \}
+. ds hhh \\*[rr_labels!\\n[rr_i]]
+. pdfbookmark \\n[rr_count] Link\\n[rr_i] "\\*[hhh]"
+.\}
+..
+'\"
+'\" Some postscript to make pdfmarks harmless on old interpreters...
+'\"
+.specialps "def /pdfmark where {pop} {userdict /pdfmark /cleartomark load put} ifelse"
+'\"
+'\" Force display of Bookmarks in Acrobat when document is viewed.
+'\"
+.pdfmark "[/PageMode /UseOutlines /Page 1 /View [/XYZ null null null] /DOCVIEW"
+'\"
+'\" Output the document info in pdfmarks
+'\"
+.pdfmark "\
+ /Title (\*[an-title](\*[an-section])) \
+ /Subject (foo2lava Manual Page) \
+ /Author (Rick Richardson) \
+ /Keywords (printing, LAVAFLOW) \
+ /Creator (groff \n(.x.\n(.y.\n(.Y -man) \
+ /CreationDate (\*[an-extra1]) \
+ /ModDate (\*[an-extra1]) \
+ /DOCINFO"
+\}
+'\"
+'\" The manual page name is only 1st level mark
+'\"
+.nr rr_levels!\n+[rr_n] 1
+.ds rr_labels!\n[rr_n] \*[an-title](\*[an-section])
+.pdfdest Link\n[rr_n]
+'\"==========================================================================
+'\" MANUAL PAGE SOURCE
+'\"==========================================================================
+.SH NAME
+foo2lava \- Convert Ghostscript pbmraw or bitcmyk format into a
+LAVAFLOW printer stream
+.SH SYNOPSIS
+.B foo2lava
+.RI [ options "] <" pbmraw-file " >" lava-file
+.sp 1
+.B foo2lava
+.RI [ options "] <" bitcmyk-file " >" lava-file
+.sp 1
+.B foo2lava
+.RI [ options "] <" pksmraw-file " >" lava-file
+.SH DESCRIPTION
+.B foo2lava
+converts Ghostscript pbmraw, bitcmyk, or pksmraw output formats to monochrome
+or color LAVAFLOW streams,
+for driving the Konica Minolta magicolor 2530 DL network color laser printer
+and other Zenographics-based LAVAFLOW printers.
+
+.SH COMMAND LINE OPTIONS
+.SS Normal Options
+These are the options used to select the parameters of a
+print job that are usually controlled on a per job basis.
+.TP
+.BI \-c
+Force color mode if autodetect doesn't work.
+.TP
+.BI \-d\0 duplex
+Duplex code to send to printer [1].
+.TS
+| n l | n l | n l .
+1 off 2 long edge 3 short edge
+.TE
+.TP
+.BI \-g\0 xpix x ypix
+Set page dimensions in pixels [10200x6600].
+.TP
+.BI \-m\0 media
+Media code to send to printer [0].
+.TS
+l l l
+l n n.
+_
+Media 2530DL
+_
+plain 0
+transparency 4
+thick stock 20
+envelope 22
+letterhead 23
+postcard 25
+labels 26
+recycled 27
+.TE
+.TP
+.BI \-p\0 paper
+Paper code to send to printer [2].
+.TS
+| n l | n l.
+1 executive 25 A5
+2 letter 26 A4
+3 legal 45 B5jis
+80 env Monarch 65 B5iso
+81 env #10 90 env DL
+91 env C5 92 env C6
+835 4x6" photo 837 10x15cm photo
+.TE
+.TP
+.BI \-n\0 copies
+Number of copies [1].
+.TP
+.BI \-r\0 xres x yres
+Set device resolution in pixels/inch [1200x600].
+.TP
+.BI \-s\0 source
+Source (InputSlot) code to send to printer [255].
+.TS
+| n l | n l.
+1 Tray 1 255 auto
+4 Tray 2
+.TE
+.TP
+.BI \-t
+Draft mode. Every other pixel is white.
+.TP
+.BI \-J\0 filename
+Filename string to send to printer.
+.TP
+.BI \-U\0 username
+Username string to send to printer.
+.SS Printer Tweaking Options
+These are the options used to customize the operation of \fBfoo2lava\fP
+for a particular printer.
+.TP
+.BI \-u\0 xoff x yoff
+Set the offset of the start of the printable region from the
+upper left corner, in pixels [0x0].
+.TP
+.BI \-l\0 xoff x yoff
+Set the offset of the end of the printable region from the
+lower right corner, in pixels [0x0].
+.TP
+.BI \-L\0 mask
+Send logical clipping amounts implied by -u/-l in the LAVAFLOW stream [3].
+.TS
+l l.
+0 don't send any logical clipping amounts
+1 only send Y clipping amount
+2 only send X clipping amount
+3 send both X and Y clipping amounts
+.TE
+.TP
+.BI \-A
+AllIsBlack: convert C=1,M=1,Y=1 to just K=1. Works with bitcmyk input only.
+.TP
+.BI \-B
+BlackClears: K=1 forces C,M,Y to 0. Works with bitcmyk input only.
+.TP
+.BI \-z\0 model
+Model: 0=2530DL. Default is 0.
+.SS Debugging Options
+These options are used for debugging \fBfoo2lava\fP.
+.TP
+.BI \-S\0 plane
+Output just a single color plane from a color print and print it
+on the black plane. The default is to output all color planes.
+.TS
+l l.
+1 Cyan
+2 Magenta
+3 Yellow
+4 Black
+.TE
+.TP
+.BI \-D\0 level
+Set Debug level [0].
+
+.SH EXAMPLES
+Create a black and white LAVAFLOW stream:
+
+.RS
+.nf
+gs -q -dBATCH -dSAFER -dQUIET -dNOPAUSE \
+ -sPAPERSIZE=letter -r1200x600 -sDEVICE=pbmraw \
+ -sOutputFile=- - < testpage.ps \
+| foo2lava -r1200x600 -g10200x6600 -p1 >testpage.zm
+.fi
+.RE
+.P
+Create a color LAVAFLOW stream:
+
+.RS
+.nf
+gs -q -dBATCH -dSAFER -dQUIET -dNOPAUSE \
+ -sPAPERSIZE=letter -g10200x6600 -r1200x600 -sDEVICE=bitcmyk \
+ -sOutputFile=- - < testpage.ps \
+| foo2lava -r1200x600 -g10200x6600 -p1 >testpage.zc
+.fi
+.RE
+
+.SH FILES
+.BR /usr/bin/foo2lava
+.SH SEE ALSO
+.BR foo2lava-wrapper (1),
+.BR lavadecode (1)
+.SH "AUTHOR"
+Rick Richardson <rick.richardson@comcast.com>
+.br
+${URLZJS}/
+'/"
+'/"
+'/"
+.em pdf_outline
diff --git a/foo2lava.c b/foo2lava.c
new file mode 100644
index 0000000..e969610
--- /dev/null
+++ b/foo2lava.c
@@ -0,0 +1,1496 @@
+/*
+
+GENERAL
+This program converts pbm (B/W) images and 1-bit-per-pixel cmyk images
+(both produced by ghostscript) to Zenographics LAVAFLOW format.
+
+With this utility, you can print to some HP and Minolta/QMS printers,
+such as these:
+ - Konica Minolta magicolor 2530 DL B/W and color
+
+AUTHORS
+It also uses Markus Kuhn's jbig-kit compression library (included, but
+also available at http://www.cl.cam.ac.uk/~mgk25/jbigkit/).
+
+You can contact the current author at mailto:rick.richardson@comcast.net
+
+LICENSE
+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.
+
+If you want to use this program under different license conditions,
+then contact the author for an arrangement.
+
+It is possible that certain products which can be built using the jbig
+software module might form inventions protected by patent rights in
+some countries (e.g., by patents about arithmetic coding algorithms
+owned by IBM and AT&T in the USA). Provision of this software by the
+author does NOT include any licenses for any patents. In those
+countries where a patent license is required for certain applications
+of this software module, you will have to obtain such a license
+yourself.
+
+*/
+
+static char Version[] = "$Id: foo2lava.c,v 1.10 2006/12/24 06:22:52 rick Exp $";
+
+#include <stdio.h>
+#include <stdlib.h>
+#include <ctype.h>
+#include <string.h>
+#include <unistd.h>
+#include <stdarg.h>
+#include <time.h>
+#ifdef linux
+ #include <sys/utsname.h>
+#endif
+#include "jbig.h"
+
+/*
+ * Command line options
+ */
+int Debug = 0;
+int ResX = 1200;
+int ResY = 600;
+int Bpp = 1;
+int PaperCode = 1;
+int PageWidth = 1200 * 8.5;
+int PageHeight = 600 * 11;
+int UpperLeftX = 0;
+int UpperLeftY = 0;
+int LowerRightX = 0;
+int LowerRightY = 0;
+int Copies = 1;
+int Duplex = 1;
+int SourceCode = 255;
+int MediaCode = 0;
+char *Username = NULL;
+char *Filename = NULL;
+int Mode = 0;
+ #define MODE_MONO 1
+ #define MODE_COLOR 2
+int Model = 0;
+ #define MODEL_2300DL 0
+ #define MODEL_HP1020 1
+ #define MODEL_2530DL 2
+ #define MODEL_LAST 2
+
+int Color2Mono = 0;
+int BlackClears = 0;
+int AllIsBlack = 0;
+int OutputStartPlane = 1;
+int ExtraPad = 16;
+
+int LogicalOffsetX = 0;
+int LogicalOffsetY = 0;
+
+#define LOGICAL_CLIP_X 2
+#define LOGICAL_CLIP_Y 1
+int LogicalClip = LOGICAL_CLIP_X | LOGICAL_CLIP_Y;
+int SaveToner = 0;
+int PageNum = 0;
+int RealWidth;
+int EconoMode = 0;
+int BihW;
+int BihH;
+int Dots[4];
+int TotalDots;
+
+FILE *EvenPages = NULL;
+typedef struct
+{
+ off_t b, e;
+} SEEKREC;
+SEEKREC SeekRec[2000];
+int SeekIndex = 0;
+off_t SeekMedia;
+
+long JbgOptions[5] =
+{
+ /* Order */
+ JBG_ILEAVE | JBG_SMID,
+ /* Options */
+ JBG_DELAY_AT | JBG_LRLTWO | JBG_TPDON | JBG_TPBON | JBG_DPON,
+ /* L0 */
+ 128,
+ /* MX */
+ 16,
+ /* MY */
+ 0
+};
+
+void
+usage(void)
+{
+ fprintf(stderr,
+"Usage:\n"
+" foo2lava [options] <pbmraw-file >lava-file\n"
+"\n"
+" Convert Ghostscript pbmraw format to a monochrome LAVAFLOW stream,\n"
+" for driving the Konica Minolta magicolor 2530 DL network color laser\n"
+" printer and other LAVAFLOW-based black and white printers.\n"
+"\n"
+" gs -q -dBATCH -dSAFER -dQUIET -dNOPAUSE \\ \n"
+" -sPAPERSIZE=letter -r1200x600 -sDEVICE=pbmraw \\ \n"
+" -sOutputFile=- - < testpage.ps \\ \n"
+" | foo2lava -r1200x600 -g10200x6600 -p1 >testpage.zm\n"
+"\n"
+" foo2lava [options] <bitcmyk-file >lava-file\n"
+" foo2lava [options] <pksmraw-file >lava-file\n"
+"\n"
+" Convert Ghostscript bitcmyk or pksmraw format to a color LAVAFLOW\n"
+" stream, for driving the Konica Minolta magicolor 2530 DL network\n"
+" color laser printer.\n"
+" N.B. Color correction is expected to be performed by ghostscript.\n"
+"\n"
+" gs -q -dBATCH -dSAFER -dQUIET -dNOPAUSE \\ \n"
+" -sPAPERSIZE=letter -g10200x6600 -r1200x600 -sDEVICE=bitcmyk \\ \n"
+" -sOutputFile=- - < testpage.ps \\ \n"
+" | foo2lava -r1200x600 -g10200x6600 -p1 >testpage.zc\n"
+"\n"
+"Normal Options:\n"
+"-c Force color mode if autodetect doesn't work\n"
+"-d duplex Duplex code to send to printer [%d]\n"
+" 1=off, 2=longedge, 3=shortedge\n"
+" 4=manual longedge, 5=manual shortedge\n"
+"-g <xpix>x<ypix> Set page dimensions in pixels [%dx%d]\n"
+"-m media Media code to send to printer [%d]\n"
+" 1=standard 4=transparency 20=thick stock 22=envelope\n"
+" 23=letterhead 25=postcard 26=labels 27=recycled\n"
+" 28=glossy\n"
+"-p paper Paper code to send to printer [%d]\n"
+" 1=executive 2=letter 3=legal 25=A5 26=A4 45=B5jis\n"
+" 65=B5iso 80=envMonarch 81=env#10 90=envDL 91=envC5\n"
+" 92=envC6 835=4x6\" 837=10x15cm\n"
+"-n copies Number of copies [%d]\n"
+"-r <xres>x<yres> Set device resolution in pixels/inch [%dx%d]\n"
+"-s source Source code to send to printer [%d]\n"
+" 1=tray 1 (multipurpose) 4=tray 2 255=auto\n"
+" Code numbers may vary with printer model\n"
+"-t Draft mode. Every other pixel is white.\n"
+"-J filename Filename string to send to printer [%s]\n"
+"-U username Username string to send to printer [%s]\n"
+"\n"
+"Printer Tweaking Options:\n"
+"-u <xoff>x<yoff> Set offset of upper left printable in pixels [%dx%d]\n"
+"-l <xoff>x<yoff> Set offset of lower right printable in pixels [%dx%d]\n"
+"-L mask Send logical clipping values from -u/-l in ZjStream [%d]\n"
+" 0=no, 1=Y, 2=X, 3=XY\n"
+"-A AllIsBlack: convert C=1,M=1,Y=1 to just K=1\n"
+"-B BlackClears: K=1 forces C,M,Y to 0\n"
+" -A, -B work with bitcmyk input only\n"
+"-P Do not output START_PLANE codes. May be needed by some\n"
+" some black and white only printers.\n"
+"-X padlen Add extra zero padding to the end of BID segments [%d]\n"
+"-z model Model: 0=2300DL 1=hp1020 [%d]\n"
+"\n"
+"Debugging Options:\n"
+"-S plane Output just a single color plane from a color print [all]\n"
+" 1=Cyan, 2=Magenta, 3=Yellow, 4=Black\n"
+"-D lvl Set Debug level [%d]\n"
+"-V Version %s\n"
+ , Duplex
+ , PageWidth , PageHeight
+ , MediaCode
+ , PaperCode
+ , Copies
+ , ResX , ResY
+ , SourceCode
+ , Filename ? Filename : ""
+ , Username ? Username : ""
+ , UpperLeftX , UpperLeftY
+ , LowerRightX , LowerRightY
+ , LogicalClip
+ , ExtraPad
+ , Model
+ , Debug
+ , Version
+ );
+
+ exit(1);
+}
+
+/*
+ * Mirror1: bits 01234567 become 76543210
+ */
+unsigned char Mirror1[256] =
+{
+ 0,128, 64,192, 32,160, 96,224, 16,144, 80,208, 48,176,112,240,
+ 8,136, 72,200, 40,168,104,232, 24,152, 88,216, 56,184,120,248,
+ 4,132, 68,196, 36,164,100,228, 20,148, 84,212, 52,180,116,244,
+ 12,140, 76,204, 44,172,108,236, 28,156, 92,220, 60,188,124,252,
+ 2,130, 66,194, 34,162, 98,226, 18,146, 82,210, 50,178,114,242,
+ 10,138, 74,202, 42,170,106,234, 26,154, 90,218, 58,186,122,250,
+ 6,134, 70,198, 38,166,102,230, 22,150, 86,214, 54,182,118,246,
+ 14,142, 78,206, 46,174,110,238, 30,158, 94,222, 62,190,126,254,
+ 1,129, 65,193, 33,161, 97,225, 17,145, 81,209, 49,177,113,241,
+ 9,137, 73,201, 41,169,105,233, 25,153, 89,217, 57,185,121,249,
+ 5,133, 69,197, 37,165,101,229, 21,149, 85,213, 53,181,117,245,
+ 13,141, 77,205, 45,173,109,237, 29,157, 93,221, 61,189,125,253,
+ 3,131, 67,195, 35,163, 99,227, 19,147, 83,211, 51,179,115,243,
+ 11,139, 75,203, 43,171,107,235, 27,155, 91,219, 59,187,123,251,
+ 7,135, 71,199, 39,167,103,231, 23,151, 87,215, 55,183,119,247,
+ 15,143, 79,207, 47,175,111,239, 31,159, 95,223, 63,191,127,255,
+};
+
+/*
+ * Mirror2: bits 01234567 become 67452301
+ */
+unsigned char Mirror2[256] =
+{
+ 0, 64,128,192, 16, 80,144,208, 32, 96,160,224, 48,112,176,240,
+ 4, 68,132,196, 20, 84,148,212, 36,100,164,228, 52,116,180,244,
+ 8, 72,136,200, 24, 88,152,216, 40,104,168,232, 56,120,184,248,
+ 12, 76,140,204, 28, 92,156,220, 44,108,172,236, 60,124,188,252,
+ 1, 65,129,193, 17, 81,145,209, 33, 97,161,225, 49,113,177,241,
+ 5, 69,133,197, 21, 85,149,213, 37,101,165,229, 53,117,181,245,
+ 9, 73,137,201, 25, 89,153,217, 41,105,169,233, 57,121,185,249,
+ 13, 77,141,205, 29, 93,157,221, 45,109,173,237, 61,125,189,253,
+ 2, 66,130,194, 18, 82,146,210, 34, 98,162,226, 50,114,178,242,
+ 6, 70,134,198, 22, 86,150,214, 38,102,166,230, 54,118,182,246,
+ 10, 74,138,202, 26, 90,154,218, 42,106,170,234, 58,122,186,250,
+ 14, 78,142,206, 30, 94,158,222, 46,110,174,238, 62,126,190,254,
+ 3, 67,131,195, 19, 83,147,211, 35, 99,163,227, 51,115,179,243,
+ 7, 71,135,199, 23, 87,151,215, 39,103,167,231, 55,119,183,247,
+ 11, 75,139,203, 27, 91,155,219, 43,107,171,235, 59,123,187,251,
+ 15, 79,143,207, 31, 95,159,223, 47,111,175,239, 63,127,191,255,
+};
+
+/*
+ * Mirror4: bits 01234567 become 45670123
+ */
+unsigned char Mirror4[256] =
+{
+ 0, 16, 32, 48, 64, 80, 96,112,128,144,160,176,192,208,224,240,
+ 1, 17, 33, 49, 65, 81, 97,113,129,145,161,177,193,209,225,241,
+ 2, 18, 34, 50, 66, 82, 98,114,130,146,162,178,194,210,226,242,
+ 3, 19, 35, 51, 67, 83, 99,115,131,147,163,179,195,211,227,243,
+ 4, 20, 36, 52, 68, 84,100,116,132,148,164,180,196,212,228,244,
+ 5, 21, 37, 53, 69, 85,101,117,133,149,165,181,197,213,229,245,
+ 6, 22, 38, 54, 70, 86,102,118,134,150,166,182,198,214,230,246,
+ 7, 23, 39, 55, 71, 87,103,119,135,151,167,183,199,215,231,247,
+ 8, 24, 40, 56, 72, 88,104,120,136,152,168,184,200,216,232,248,
+ 9, 25, 41, 57, 73, 89,105,121,137,153,169,185,201,217,233,249,
+ 10, 26, 42, 58, 74, 90,106,122,138,154,170,186,202,218,234,250,
+ 11, 27, 43, 59, 75, 91,107,123,139,155,171,187,203,219,235,251,
+ 12, 28, 44, 60, 76, 92,108,124,140,156,172,188,204,220,236,252,
+ 13, 29, 45, 61, 77, 93,109,125,141,157,173,189,205,221,237,253,
+ 14, 30, 46, 62, 78, 94,110,126,142,158,174,190,206,222,238,254,
+ 15, 31, 47, 63, 79, 95,111,127,143,159,175,191,207,223,239,255,
+};
+
+int BlackOnes[256] =
+{
+ 0, 1, 1, 2, 1, 2, 2, 3, 1, 2, 2, 3, 2, 3, 3, 4,
+ 1, 2, 2, 3, 2, 3, 3, 4, 2, 3, 3, 4, 3, 4, 4, 5,
+ 1, 2, 2, 3, 2, 3, 3, 4, 2, 3, 3, 4, 3, 4, 4, 5,
+ 2, 3, 3, 4, 3, 4, 4, 5, 3, 4, 4, 5, 4, 5, 5, 6,
+ 1, 2, 2, 3, 2, 3, 3, 4, 2, 3, 3, 4, 3, 4, 4, 5,
+ 2, 3, 3, 4, 3, 4, 4, 5, 3, 4, 4, 5, 4, 5, 5, 6,
+ 2, 3, 3, 4, 3, 4, 4, 5, 3, 4, 4, 5, 4, 5, 5, 6,
+ 3, 4, 4, 5, 4, 5, 5, 6, 4, 5, 5, 6, 5, 6, 6, 7,
+ 1, 2, 2, 3, 2, 3, 3, 4, 2, 3, 3, 4, 3, 4, 4, 5,
+ 2, 3, 3, 4, 3, 4, 4, 5, 3, 4, 4, 5, 4, 5, 5, 6,
+ 2, 3, 3, 4, 3, 4, 4, 5, 3, 4, 4, 5, 4, 5, 5, 6,
+ 3, 4, 4, 5, 4, 5, 5, 6, 4, 5, 5, 6, 5, 6, 6, 7,
+ 2, 3, 3, 4, 3, 4, 4, 5, 3, 4, 4, 5, 4, 5, 5, 6,
+ 3, 4, 4, 5, 4, 5, 5, 6, 4, 5, 5, 6, 5, 6, 6, 7,
+ 3, 4, 4, 5, 4, 5, 5, 6, 4, 5, 5, 6, 5, 6, 6, 7,
+ 4, 5, 5, 6, 5, 6, 6, 7, 5, 6, 6, 7, 6, 7, 7, 8
+};
+
+void
+rotate_bytes_180(unsigned char *sp, unsigned char *ep, unsigned char *mirror)
+{
+unsigned char tmp;
+
+ while (sp < ep)
+ {
+ tmp = mirror[*sp];
+ *sp = mirror[*ep];
+ *ep = tmp;
+ ++sp;
+ --ep;
+ }
+ if (sp == ep)
+ *sp = mirror[*sp];
+}
+
+void
+debug(int level, char *fmt, ...)
+{
+ va_list ap;
+
+ if (Debug < level)
+ return;
+
+ setvbuf(stderr, (char *) NULL, _IOLBF, BUFSIZ);
+ va_start(ap, fmt);
+ vfprintf(stderr, fmt, ap);
+ va_end(ap);
+}
+
+void
+error(int fatal, char *fmt, ...)
+{
+ va_list ap;
+
+ va_start(ap, fmt);
+ vfprintf(stderr, fmt, ap);
+ va_end(ap);
+
+ if (fatal)
+ exit(fatal);
+}
+
+/*
+ * A linked list of compressed data
+ */
+typedef struct _BIE_CHAIN{
+ unsigned char *data;
+ size_t len;
+ struct _BIE_CHAIN *next;
+} BIE_CHAIN;
+
+void
+free_chain(BIE_CHAIN *chain)
+{
+ BIE_CHAIN *next;
+ next = chain;
+ while ((chain = next))
+ {
+ next = chain->next;
+ if (chain->data)
+ free(chain->data);
+ free(chain);
+ }
+}
+
+int
+write_plane(int planeNum, BIE_CHAIN **root, FILE *fp)
+{
+ BIE_CHAIN *current = *root;
+ BIE_CHAIN *next;
+ int len;
+
+ debug(3, "Write Plane %d\n", planeNum);
+
+ /* error handling */
+ if (!current)
+ error(1,"There is no JBIG!\n");
+ if (!current->next)
+ error(1,"There is no or wrong JBIG header!\n");
+ if (current->len != 20)
+ error(1,"wrong BIH length\n");
+
+ for (current = *root; current && current->len; current = current->next)
+ {
+ if (current == *root)
+ {
+ fprintf(fp, "\033*b20V");
+ fwrite(current->data, 1, current->len, fp);
+ }
+ else
+ {
+ len = current->len;
+ next = current->next;
+ fprintf(fp, "\033*b%d%s", len, next ? "V" : "W");
+ fwrite(current->data, 1, len, fp);
+ }
+ }
+
+ free_chain(*root);
+
+ //chunk_write(ZJT_END_JBIG, 0, 0, fp);
+ //if (planeNum)
+ //chunk_write(ZJT_END_PLANE, 0, 0, fp);
+ return 0;
+}
+
+void
+start_page(BIE_CHAIN **root, int nbie, FILE *ofp)
+{
+ BIE_CHAIN *current = *root;
+ unsigned long w, h;
+
+ /* error handling */
+ if (!current)
+ error(1, "There is no JBIG!\n");
+ if (!current->next)
+ error(1, "There is no or wrong JBIG header!\n");
+ if (current->len != 20 )
+ error(1,"wrong BIH length\n");
+
+ /* startpage, jbig_bih, jbig_bid, jbig_end, endpage */
+ w = (((long) current->data[ 4] << 24)
+ | ((long) current->data[ 5] << 16)
+ | ((long) current->data[ 6] << 8)
+ | (long) current->data[ 7]);
+ h = (((long) current->data[ 8] << 24)
+ | ((long) current->data[ 9] << 16)
+ | ((long) current->data[10] << 8)
+ | (long) current->data[11]);
+ TotalDots = w*h;
+
+ fprintf(ofp, "\033&l%dO", 0);
+ fprintf(ofp, "\033*r%dU", Mode == MODE_COLOR ? 1004 : 1);
+ fprintf(ofp, "\033*g%dW", Mode == MODE_COLOR ? 26 : 8);
+ fprintf(ofp, "\033*b%dM", 1234);
+ fprintf(ofp, "\033&l%dA", PaperCode);
+ fprintf(ofp, "\033&l%dH", SourceCode);
+ fprintf(ofp, "\033&l%dM", MediaCode);
+ fprintf(ofp, "\033&l%dE", 0);
+ fprintf(ofp, "\033*r%dS", (int) w);
+ fprintf(ofp, "\033*r%dT", (int) h);
+ fprintf(ofp, "\033&l%dU", 0);
+ fprintf(ofp, "\033&l%dZ", 0);
+ fprintf(ofp, "\033*p%dX", 200);
+ fprintf(ofp, "\033*p%dY", 200);
+
+ fprintf(ofp, "\033*r1A");
+
+ if ((PageNum & 1) == 0 && EvenPages)
+ SeekMedia = ftell(EvenPages) - 4;
+}
+
+void
+end_page(FILE *ofp)
+{
+ if (Mode == MODE_COLOR)
+ {
+ fprintf(ofp, "\033*x%dY", Dots[0]);
+ fprintf(ofp, "\033*x%dU", TotalDots - Dots[0]);
+ fprintf(ofp, "\033*x%dM", Dots[1]);
+ fprintf(ofp, "\033*x%dV", TotalDots - Dots[1]);
+ fprintf(ofp, "\033*x%dC", Dots[2]);
+ fprintf(ofp, "\033*x%dZ", TotalDots - Dots[2]);
+ }
+ fprintf(ofp, "\033*x%dK", Dots[3]);
+ fprintf(ofp, "\033*x%dW", TotalDots - Dots[3]);
+
+ fprintf(ofp, "\033*r0C");
+}
+
+int
+write_page(BIE_CHAIN **root, BIE_CHAIN **root2,
+ BIE_CHAIN **root3, BIE_CHAIN **root4, FILE *ofp)
+{
+ int nbie = root2 ? 4 : 1;
+
+ start_page(root, nbie, ofp);
+
+ if (root3)
+ write_plane(3, root3, ofp);
+ if (root2)
+ write_plane(2, root2, ofp);
+ if (root)
+ {
+ if (OutputStartPlane)
+ write_plane(nbie == 1 ? 4 : 1, root, ofp);
+ else
+ write_plane(nbie == 1 ? 0 : 1, root, ofp);
+ }
+ if (root4)
+ write_plane(4, root4, ofp);
+
+ end_page(ofp);
+ return 0;
+}
+
+/*
+ * This creates a linked list of compressed data. The first item
+ * in the list is the BIH and is always 20 bytes in size. Each following
+ * item is 65536 bytes in length. The last item length is whatever remains.
+ */
+void
+output_jbig(unsigned char *start, size_t len, void *cbarg)
+{
+ BIE_CHAIN *current, **root = (BIE_CHAIN **) cbarg;
+ int size = 65536; // Printer does strange things otherwise.
+
+ if ( (*root) == NULL)
+ {
+ (*root) = malloc(sizeof(BIE_CHAIN));
+ if (!(*root))
+ error(1, "Can't allocate space for chain\n");
+
+ (*root)->data = NULL;
+ (*root)->next = NULL;
+ (*root)->len = 0;
+ size = 20;
+ if (len != 20)
+ error(1, "First chunk must be BIH and 20 bytes long\n");
+ }
+
+ current = *root;
+ while (current->next)
+ current = current->next;
+
+ while (len > 0)
+ {
+ int amt, left;
+
+ if (!current->data)
+ {
+ current->data = malloc(size);
+ if (!current->data)
+ error(1, "Can't allocate space for compressed data\n");
+ }
+
+ left = size - current->len;
+ amt = (len > left) ? left : len;
+ memcpy(current->data + current->len, start, amt);
+ current->len += amt;
+ len -= amt;
+ start += amt;
+
+ if (current->len == size)
+ {
+ current->next = malloc(sizeof(BIE_CHAIN));
+ if (!current->next)
+ error(1, "Can't allocate space for chain\n");
+ current = current->next;
+ current->data = NULL;
+ current->next = NULL;
+ current->len = 0;
+ }
+ }
+}
+
+void
+start_doc(FILE *fp)
+{
+ char buf[64];
+ time_t now;
+ struct tm *tmp;
+
+ now = time(NULL);
+ tmp = localtime(&now);
+ strftime(buf, sizeof(buf), "%m/%d/%Y", tmp);
+
+ fprintf(fp, "\033%%-12345X@PJL JOB NAME=\"%s\"\n",
+ Filename ? Filename : "stdin");
+ fprintf(fp, "\033%%-12345X@PJL JOB USERNAME=\"%s\"\n",
+ Username ? Username : "");
+ fprintf(fp, "\033%%-12345X@PJL JOB TIMESTAMP=\"%s\"\n", buf);
+ #ifdef linux
+ {
+ struct utsname u;
+
+ u.release[0] = 0;
+ uname(&u);
+
+ fprintf(fp, "\033%%-12345X@PJL JOB OSINFO=\"Linux/%s\"\n", u.release);
+ }
+ #else
+ fprintf(fp, "\033%%-12345X@PJL JOB OSINFO=\"%s\"\n", "Unknown");
+ #endif
+ fprintf(fp, "\033%%-12345X@PJL ENTER LANGUAGE=LAVAFLOW\n");
+ fprintf(fp, "\033E");
+ fprintf(fp, "\033&l%dS", Duplex-1);
+ fprintf(fp, "\033&l%dG", 0);
+ fprintf(fp, "\033&u%dD", ResX);
+ fprintf(fp, "\033&l%dX", 1);
+ fprintf(fp, "\033&x%dX", 1);
+}
+
+void
+end_doc(FILE *fp)
+{
+ fprintf(fp, "\033E");
+ fprintf(fp, "\033%%-12345X");
+}
+
+void
+load_tray2(FILE *fp)
+{
+ int nitems;
+
+ nitems = 0;
+ //chunk_write(ZJT_2600N_PAUSE, nitems, nitems * sizeof(ZJ_ITEM_UINT32), fp);
+}
+
+int
+compute_image_dots(int w, int h, unsigned char *bitmap)
+{
+ int dots = 0;
+ int x, y, bpl;
+
+ bpl = (w + 7) / 8;
+ for (y = 0; y < h; ++y)
+ for (x = 0; x < bpl; ++x)
+ dots += BlackOnes[ bitmap[y*bpl + x] ];
+ return dots;
+}
+
+static int AnyColor;
+
+void
+cmyk_planes(unsigned char *plane[4], unsigned char *raw, int w, int h)
+{
+ int rawbpl = (w+1) / 2;
+ int bpl = (w + 7) / 8;
+ int i;
+ int x, y;
+ unsigned char byte;
+ unsigned char mask[8] = { 128, 64, 32, 16, 8, 4, 2, 1 };
+ int aib = AllIsBlack;
+ int bc = BlackClears;
+
+ AnyColor = 0;
+ for (i = 0; i < 4; ++i)
+ memset(plane[i], 0, bpl * h);
+
+ //
+ // Unpack the combined plane into individual color planes
+ //
+ // TODO: this can be speeded up using a 256 or 65536 entry lookup table
+ //
+ for (y = 0; y < h; ++y)
+ {
+ for (x = 0; x < w; ++x)
+ {
+ byte = raw[y*rawbpl + x/2];
+
+ if (aib && (byte & 0xE0) == 0xE0)
+ {
+ plane[3][y*bpl + x/8] |= mask[x&7];
+ }
+ else if (byte & 0x10)
+ {
+ plane[3][y*bpl + x/8] |= mask[x&7];
+ if (!bc)
+ {
+ if (byte & 0x80) plane[0][y*bpl + x/8] |= mask[x&7];
+ if (byte & 0x40) plane[1][y*bpl + x/8] |= mask[x&7];
+ if (byte & 0x20) plane[2][y*bpl + x/8] |= mask[x&7];
+ if (byte & 0xE0) AnyColor |= byte;
+ }
+ }
+ else
+ {
+ if (byte & 0x80) plane[0][y*bpl + x/8] |= mask[x&7];
+ if (byte & 0x40) plane[1][y*bpl + x/8] |= mask[x&7];
+ if (byte & 0x20) plane[2][y*bpl + x/8] |= mask[x&7];
+ if (byte & 0xE0) AnyColor |= byte;
+ }
+
+ ++x;
+ if (aib && (byte & 0x0E) == 0x0E)
+ {
+ plane[3][y*bpl + x/8] |= mask[x&7];
+ }
+ else if (byte & 0x1)
+ {
+ plane[3][y*bpl + x/8] |= mask[x&7];
+ if (!bc)
+ {
+ if (byte & 0x8) plane[0][y*bpl + x/8] |= mask[x&7];
+ if (byte & 0x4) plane[1][y*bpl + x/8] |= mask[x&7];
+ if (byte & 0x2) plane[2][y*bpl + x/8] |= mask[x&7];
+ if (byte & 0xE) AnyColor |= byte;
+ }
+ }
+ else
+ {
+ if (byte & 0x8) plane[0][y*bpl + x/8] |= mask[x&7];
+ if (byte & 0x4) plane[1][y*bpl + x/8] |= mask[x&7];
+ if (byte & 0x2) plane[2][y*bpl + x/8] |= mask[x&7];
+ if (byte & 0xE) AnyColor |= byte;
+ }
+ }
+ }
+ debug(2, "BlackClears = %d; AnyColor = %s %s %s\n",
+ BlackClears,
+ (AnyColor & 0x88) ? "Cyan" : "",
+ (AnyColor & 0x44) ? "Magenta" : "",
+ (AnyColor & 0x22) ? "Yellow" : ""
+ );
+}
+
+int
+cmyk_page(unsigned char *raw, int w, int h, FILE *ofp)
+{
+ BIE_CHAIN *chain[4];
+ int i;
+ int bpl = (w + 7) / 8;
+ unsigned char *plane[4], *bitmaps[4][1];
+ struct jbg_enc_state se[4];
+
+ RealWidth = w;
+ for (i = 0; i < 4; ++i)
+ {
+ plane[i] = malloc(bpl * h);
+ if (!plane[i]) error(3, "Cannot allocate space for bit plane\n");
+ chain[i] = NULL;
+ }
+
+ cmyk_planes(plane, raw, w, h);
+ for (i = 0; i < 4; ++i)
+ {
+ if (Debug >= 9)
+ {
+ FILE *dfp;
+ char fname[256];
+ sprintf(fname, "xxxplane%d", i);
+ dfp = fopen(fname, "w");
+ if (dfp)
+ {
+ fwrite(plane[i], bpl*h, 1, dfp);
+ fclose(dfp);
+ }
+ }
+
+ Dots[i] = compute_image_dots(w, h, plane[i]);
+
+ *bitmaps[i] = plane[i];
+
+ jbg_enc_init(&se[i], w, h, 1, bitmaps[i], output_jbig, &chain[i]);
+ jbg_enc_options(&se[i], JbgOptions[0], JbgOptions[1],
+ JbgOptions[2], JbgOptions[3], JbgOptions[4]);
+ jbg_enc_out(&se[i]);
+ jbg_enc_free(&se[i]);
+ }
+
+ if (Color2Mono)
+ write_page(&chain[Color2Mono-1], NULL, NULL, NULL, ofp);
+ else if (AnyColor)
+ write_page(&chain[0], &chain[1], &chain[2], &chain[3], ofp);
+ else
+ write_page(&chain[3], NULL, NULL, NULL, ofp);
+
+ for (i = 0; i < 4; ++i)
+ free(plane[i]);
+ return 0;
+}
+
+int
+pksm_page(unsigned char *plane[4], int w, int h, FILE *ofp)
+{
+ BIE_CHAIN *chain[4];
+ int i;
+ unsigned char *bitmaps[4][1];
+ struct jbg_enc_state se[4];
+
+ RealWidth = w;
+ for (i = 0; i < 4; ++i)
+ chain[i] = NULL;
+
+ for (i = 0; i < 4; ++i)
+ {
+ Dots[i] = compute_image_dots(w, h, plane[i]);
+
+ *bitmaps[i] = plane[i];
+
+ jbg_enc_init(&se[i], w, h, 1, bitmaps[i], output_jbig, &chain[i]);
+ jbg_enc_options(&se[i], JbgOptions[0], JbgOptions[1],
+ JbgOptions[2], JbgOptions[3], JbgOptions[4]);
+ jbg_enc_out(&se[i]);
+ jbg_enc_free(&se[i]);
+ }
+
+ if (Color2Mono)
+ write_page(&chain[Color2Mono-1], NULL, NULL, NULL, ofp);
+ else if (AnyColor)
+ write_page(&chain[0], &chain[1], &chain[2], &chain[3], ofp);
+ else
+ write_page(&chain[3], NULL, NULL, NULL, ofp);
+
+ return 0;
+}
+
+int
+pbm_page(unsigned char *buf, int w, int h, FILE *ofp)
+{
+ BIE_CHAIN *chain = NULL;
+ unsigned char *bitmaps[1];
+ struct jbg_enc_state se;
+ int x, y;
+ int bpl, bpl16;
+
+ RealWidth = w;
+ if (Model == MODEL_HP1020)
+ w = (w + 127) & ~127;
+
+ Dots[3] = 0;
+ bpl = (w + 7) / 8;
+ if (Model == MODEL_2300DL)
+ bpl16 = bpl;
+ else
+ bpl16 = (bpl + 15) & ~15;
+
+ if (SaveToner)
+ {
+ for (y = 0; y < h; y += 2)
+ for (x = 0; x < bpl16; ++x)
+ buf[y*bpl16 + x] &= 0x55;
+ for (y = 1; y < h; y += 2)
+ for (x = 0; x < bpl16; ++x)
+ buf[y*bpl16 + x] &= 0xaa;
+ }
+
+ Dots[3] = compute_image_dots(w, h, buf);
+
+ *bitmaps = buf;
+
+ jbg_enc_init(&se, w, h, 1, bitmaps, output_jbig, &chain);
+ jbg_enc_options(&se, JbgOptions[0], JbgOptions[1],
+ JbgOptions[2], JbgOptions[3], JbgOptions[4]);
+ jbg_enc_out(&se);
+ jbg_enc_free(&se);
+
+ write_page(&chain, NULL, NULL, NULL, ofp);
+
+ return 0;
+}
+
+int
+read_and_clip_image(unsigned char *buf,
+ int rawBpl, int rightBpl, int pixelsPerByte,
+ int bpl, int h, int bpl16, FILE *ifp)
+{
+ unsigned char *rowbuf, *rowp;
+ int y;
+ int rc;
+
+ rowbuf = malloc(rawBpl);
+ if (!rowbuf)
+ error(1, "Can't allocate row buffer\n");
+
+ // Clip top rows
+ if (UpperLeftY)
+ {
+ for (y = 0; y < UpperLeftY; ++y)
+ {
+ rc = fread(rowbuf, rawBpl, 1, ifp);
+ if (rc == 0)
+ goto eof;
+ if (rc != 1)
+ error(1, "Premature EOF(1) on input at y=%d\n", y);
+ }
+ }
+
+ // Copy the rows that we want to image
+ rowp = buf;
+ for (y = 0; y < h; ++y, rowp += bpl16)
+ {
+ // Clip left pixel *bytes*
+ if (UpperLeftX)
+ {
+ rc = fread(rowbuf, UpperLeftX / pixelsPerByte, 1, ifp);
+ if (rc == 0 && y == 0 && !UpperLeftY)
+ goto eof;
+ if (rc != 1)
+ error(1, "Premature EOF(2) on input at y=%d\n", y);
+ }
+
+ if (bpl != bpl16)
+ memset(rowp, 0, bpl16);
+ rc = fread(rowp, bpl, 1, ifp);
+ if (rc == 0 && y == 0 && !UpperLeftY && !UpperLeftX)
+ goto eof;
+ if (rc != 1)
+ error(1, "Premature EOF(3) on input at y=%d\n", y);
+
+ // Clip right pixels
+ if (rightBpl != bpl)
+ {
+ rc = fread(rowbuf, rightBpl - bpl, 1, ifp);
+ if (rc != 1)
+ error(1, "Premature EOF(4) on input at y=%d\n", y);
+ }
+ }
+
+ // Clip bottom rows
+ if (LowerRightY)
+ {
+ for (y = 0; y < LowerRightY; ++y)
+ {
+ rc = fread(rowbuf, rawBpl, 1, ifp);
+ if (rc != 1)
+ error(1, "Premature EOF(5) on input at y=%d\n", y);
+ }
+ }
+
+ free(rowbuf);
+ return (0);
+
+eof:
+ free(rowbuf);
+ return (EOF);
+}
+
+int
+cmyk_pages(FILE *ifp, FILE *ofp)
+{
+ unsigned char *buf;
+ int rawW, rawH, rawBpl;
+ int rightBpl;
+ int w, h, bpl;
+ int rc;
+
+ //
+ // Save the original Upper Right clip values as the logical offset,
+ // because we may adjust them slightly below, in the interest of speed.
+ //
+ if (LogicalClip & LOGICAL_CLIP_X)
+ LogicalOffsetX = UpperLeftX;
+ if (LogicalClip & LOGICAL_CLIP_Y)
+ LogicalOffsetY = UpperLeftY;
+
+ rawW = PageWidth;
+ rawH = PageHeight;
+ rawBpl = (PageWidth + 1) / 2;
+
+ // We only clip multiples of 2 pixels off the leading edge, and
+ // add any remainder to the amount we clip from the right edge.
+ // Its fast, and good enough for government work.
+ LowerRightX += UpperLeftX & 1;
+ UpperLeftX &= ~1;
+
+ w = rawW - UpperLeftX - LowerRightX;
+ h = rawH - UpperLeftY - LowerRightY;
+ bpl = (w + 1) / 2;
+ rightBpl = (rawW - UpperLeftX + 1) / 2;
+
+ buf = malloc(bpl * h);
+ if (!buf)
+ error(1, "Unable to allocate page buffer of %d x %d = %d bytes\n",
+ rawW, rawH, rawBpl * rawH);
+
+ for (;;)
+ {
+ rc = read_and_clip_image(buf, rawBpl, rightBpl, 2, bpl, h, bpl, ifp);
+ if (rc == EOF)
+ goto done;
+
+ ++PageNum;
+ if (Duplex == 2 && (PageNum & 1) == 0)
+ rotate_bytes_180(buf, buf + bpl * h - 1, Mirror4);
+
+ if ((PageNum & 1) == 0 && EvenPages)
+ {
+ SeekRec[SeekIndex].b = ftell(EvenPages);
+ cmyk_page(buf, w, h, EvenPages);
+ SeekRec[SeekIndex].e = ftell(EvenPages);
+ debug(1, "CMYK Page: %d %ld %ld\n",
+ PageNum, SeekRec[SeekIndex].b, SeekRec[SeekIndex].e);
+ SeekIndex++;
+ }
+ else
+ cmyk_page(buf, w, h, ofp);
+ }
+
+done:
+ free(buf);
+ return 0;
+}
+
+static unsigned long
+getint(FILE *fp)
+{
+ int c;
+ unsigned long i;
+
+ while ((c = getc(fp)) != EOF && !isdigit(c))
+ if (c == '#')
+ while ((c = getc(fp)) != EOF && !(c == 13 || c == 10)) ;
+ if (c != EOF)
+ {
+ ungetc(c, fp);
+ fscanf(fp, "%lu", &i);
+ }
+ return i;
+}
+
+static void
+skip_to_nl(FILE *fp)
+{
+ for (;;)
+ {
+ int c;
+ c = getc(fp);
+ if (c == EOF)
+ error(1, "Premature EOF on input stream\n");
+ if (c == '\n')
+ return;
+ }
+}
+
+int
+pbm_header(FILE *ifp, int *p4eatenp, int *wp, int *hp)
+{
+ int c1, c2;
+
+ if (*p4eatenp)
+ *p4eatenp = 0; // P4 already eaten in main
+ else
+ {
+ c1 = getc(ifp);
+ if (c1 == EOF)
+ return 0;
+ c2 = getc(ifp);
+ if (c1 != 'P' || c2 != '4')
+ error(1, "Not a pbmraw data stream\n");
+ }
+
+ skip_to_nl(ifp);
+
+ *wp = getint(ifp);
+ *hp = getint(ifp);
+ skip_to_nl(ifp);
+ return 1;
+}
+
+int
+pksm_pages(FILE *ifp, FILE *ofp)
+{
+ unsigned char *plane[4];
+ int rawW, rawH, rawBpl;
+ int saveW = 0, saveH = 0;
+ int rightBpl;
+ int w, h, bpl;
+ int i;
+ int rc;
+ int p4eaten = 1;
+
+ //
+ // Save the original Upper Right clip values as the logical offset,
+ // because we may adjust them slightly below, in the interest of speed.
+ //
+ if (LogicalClip & LOGICAL_CLIP_X)
+ LogicalOffsetX = UpperLeftX;
+ if (LogicalClip & LOGICAL_CLIP_Y)
+ LogicalOffsetY = UpperLeftY;
+
+ for (;;)
+ {
+ ++PageNum;
+ AnyColor = 0;
+
+ for (i = 0; i < 4; ++i)
+ {
+ if (pbm_header(ifp, &p4eaten, &rawW, &rawH) == 0)
+ {
+ if (i == 0)
+ goto eof;
+ else
+ error(1, "Premature EOF(pksm) on page %d hdr, plane %d\n",
+ PageNum, i);
+ }
+ if (i == 0)
+ {
+ saveW = rawW;
+ saveH = rawH;
+ }
+ if (saveW != rawW)
+ error(1, "Image width changed from %d to %d on plane %d\n",
+ saveW, rawW, i);
+ if (saveH != rawH)
+ error(1, "Image height changed from %d to %d on plane %d\n",
+ saveH, rawH, i);
+
+ rawBpl = (rawW + 7) / 8;
+
+ // We only clip multiples of 8 pixels off the leading edge, and
+ // add any remainder to the amount we clip from the right edge.
+ // Its fast, and good enough for government work.
+ LowerRightX += UpperLeftX & 7;
+ UpperLeftX &= ~7;
+
+ w = rawW - UpperLeftX - LowerRightX;
+ h = rawH - UpperLeftY - LowerRightY;
+ bpl = (w + 7) / 8;
+ rightBpl = (rawW - UpperLeftX + 7) / 8;
+
+ plane[i] = malloc(bpl * h);
+ if (!plane[i])
+ error(1, "Can't allocate plane buffer\n");
+
+ rc = read_and_clip_image(plane[i],
+ rawBpl, rightBpl, 8, bpl, h, bpl, ifp);
+ if (rc == EOF)
+ error(1, "Premature EOF(pksm) on page %d data, plane %d\n",
+ PageNum, i);
+
+ if (Debug >= 9)
+ {
+ FILE *dfp;
+ char fname[256];
+ sprintf(fname, "xxxplane%d", i);
+ dfp = fopen(fname, "w");
+ if (dfp)
+ {
+ fwrite(plane[i], bpl*h, 1, dfp);
+ fclose(dfp);
+ }
+ }
+
+ // See if we can optimize this to be a monochrome page
+ if (!AnyColor && i != 3)
+ {
+ unsigned char *p, *e;
+
+ for (p = plane[i], e = p + bpl*h; p < e; ++p)
+ if (*p)
+ {
+ AnyColor |= 1<<i;
+ break;
+ }
+ }
+
+ if (Duplex == 2 && (PageNum & 1) == 0)
+ rotate_bytes_180(plane[i], plane[i] + bpl * h - 1, Mirror1);
+ if (Duplex == 4 && (PageNum & 1) == 0)
+ rotate_bytes_180(plane[i], plane[i] + bpl * h - 1, Mirror1);
+ }
+
+ debug(2, "AnyColor = %s %s %s\n",
+ (AnyColor & 0x01) ? "Cyan" : "",
+ (AnyColor & 0x02) ? "Magenta" : "",
+ (AnyColor & 0x04) ? "Yellow" : ""
+ );
+
+ if ((PageNum & 1) == 0 && EvenPages)
+ {
+ SeekRec[SeekIndex].b = ftell(EvenPages);
+ pksm_page(plane, w, h, EvenPages);
+ SeekRec[SeekIndex].e = ftell(EvenPages);
+ debug(1, "PKSM Page: %d %ld %ld\n",
+ PageNum, SeekRec[SeekIndex].b, SeekRec[SeekIndex].e);
+ SeekIndex++;
+ }
+ else
+ pksm_page(plane, w, h, ofp);
+
+ for (i = 0; i < 4; ++i)
+ free(plane[i]);
+ }
+eof:
+ return (0);
+}
+
+int
+pbm_pages(FILE *ifp, FILE *ofp)
+{
+ unsigned char *buf;
+ int rawW, rawH, rawBpl;
+ int rightBpl;
+ int w, h, bpl;
+ int bpl16 = 0;
+ int rc;
+ int p4eaten = 1;
+
+ //
+ // Save the original Upper Right clip values as the logical offset,
+ // because we may adjust them slightly below, in the interest of speed.
+ //
+ if (LogicalClip & LOGICAL_CLIP_X)
+ LogicalOffsetX = UpperLeftX;
+ if (LogicalClip & LOGICAL_CLIP_Y)
+ LogicalOffsetY = UpperLeftY;
+
+ for (;;)
+ {
+ if (pbm_header(ifp, &p4eaten, &rawW, &rawH) == 0)
+ break;
+
+ rawBpl = (rawW + 7) / 8;
+
+ // We only clip multiples of 8 pixels off the leading edge, and
+ // add any remainder to the amount we clip from the right edge.
+ // Its fast, and good enough for government work.
+ LowerRightX += UpperLeftX & 7;
+ UpperLeftX &= ~7;
+
+ w = rawW - UpperLeftX - LowerRightX;
+ h = rawH - UpperLeftY - LowerRightY;
+ bpl = (w + 7) / 8;
+ rightBpl = (rawW - UpperLeftX + 7) / 8;
+
+ switch (Model)
+ {
+ case MODEL_2300DL: bpl16 = bpl; break;
+ case MODEL_HP1020: bpl16 = (bpl + 15) & ~15; break;
+ default: error(1, "Bad model %d\n", Model); break;
+ }
+
+ buf = malloc(bpl16 * h);
+ if (!buf)
+ error(1, "Can't allocate page buffer\n");
+
+ rc = read_and_clip_image(buf, rawBpl, rightBpl, 8, bpl, h, bpl16, ifp);
+ if (rc == EOF)
+ error(1, "Premature EOF(pbm) on input stream\n");
+
+ ++PageNum;
+ if (Duplex == 2 && (PageNum & 1) == 0)
+ rotate_bytes_180(buf, buf + bpl16 * h - 1, Mirror1);
+
+ if ((PageNum & 1) == 0 && EvenPages)
+ {
+ if (Duplex == 4)
+ rotate_bytes_180(buf, buf + bpl16 * h - 1, Mirror1);
+ SeekRec[SeekIndex].b = ftell(EvenPages);
+ pbm_page(buf, w, h, EvenPages);
+ SeekRec[SeekIndex].e = ftell(EvenPages);
+ debug(1, "PBM Page: %d %ld %ld\n",
+ PageNum, SeekRec[SeekIndex].b, SeekRec[SeekIndex].e);
+ SeekIndex++;
+ }
+ else
+ pbm_page(buf, w, h, ofp);
+
+ free(buf);
+ }
+ return (0);
+}
+
+void
+blank_page(FILE *ofp)
+{
+ int w, h, bpl, bpl16 = 0;
+ unsigned char *plane;
+
+ w = PageWidth - UpperLeftX - LowerRightX;
+ h = PageHeight - UpperLeftY - LowerRightY;
+ bpl = (w + 7) / 8;
+ switch (Model)
+ {
+ case MODEL_2300DL: bpl16 = bpl; break;
+ case MODEL_HP1020: bpl16 = (bpl + 15) & ~15; break;
+ default: error(1, "Bad model %d\n", Model); break;
+ }
+
+ plane = malloc(bpl16 * h);
+ if (!plane)
+ error(1, "Unable to allocate blank plane (%d bytes)\n", bpl16*h);
+ memset(plane, 0, bpl16*h);
+
+ pbm_page(plane, w, h, ofp);
+ ++PageNum;
+ free(plane);
+}
+
+int
+parse_xy(char *str, int *xp, int *yp)
+{
+ char *p;
+
+ if (!str || str[0] == 0) return -1;
+
+ *xp = strtoul(str, &p, 0);
+ if (str == p) return -2;
+ while (*p && (*p < '0' || *p > '9'))
+ ++p;
+ str = p;
+ if (str[0] == 0) return -3;
+ *yp = strtoul(str, &p, 0);
+ if (str == p) return -4;
+ return (0);
+}
+
+void
+do_one(FILE *in)
+{
+ int mode;
+
+ if (Mode == MODE_COLOR)
+ {
+ mode = getc(in);
+ if (mode != 'P')
+ {
+ ungetc(mode, in);
+ cmyk_pages(in, stdout);
+ }
+ else
+ {
+ mode = getc(in);
+ if (mode == '4')
+ pksm_pages(in, stdout);
+ else
+ error(1, "Not a pksmraw file!\n");
+ }
+ }
+ else
+ {
+ mode = getc(in);
+ if (mode != 'P')
+ error(1, "Not a pbm file!\n");
+ mode = getc(in);
+ if (mode == '4')
+ pbm_pages(in, stdout);
+ else
+ error(1, "Not a pbmraw file!\n");
+ }
+}
+
+int
+main(int argc, char *argv[])
+{
+ int c;
+ int i, j;
+
+ while ( (c = getopt(argc, argv,
+ "cd:g:n:m:p:r:s:tu:l:z:L:ABPJ:S:U:X:D:V?h")) != EOF)
+ switch (c)
+ {
+ case 'c': Mode = MODE_COLOR; break;
+ case 'S': Color2Mono = atoi(optarg);
+ Mode = MODE_COLOR;
+ if (Color2Mono < 0 || Color2Mono > 4)
+ error(1, "Illegal value '%s' for -C\n", optarg);
+ break;
+ case 'd': Duplex = atoi(optarg); break;
+ case 'g': if (parse_xy(optarg, &PageWidth, &PageHeight))
+ error(1, "Illegal format '%s' for -g\n", optarg);
+ if (PageWidth < 0 || PageWidth > 1000000)
+ error(1, "Illegal X value '%s' for -g\n", optarg);
+ if (PageHeight < 0 || PageHeight > 1000000)
+ error(1, "Illegal Y value '%s' for -g\n", optarg);
+ break;
+ case 'm': MediaCode = atoi(optarg); break;
+ case 'n': Copies = atoi(optarg); break;
+ case 'p': PaperCode = atoi(optarg); break;
+ case 'r': if (parse_xy(optarg, &ResX, &ResY))
+ error(1, "Illegal format '%s' for -r\n", optarg);
+ break;
+ case 's': SourceCode = atoi(optarg); break;
+ case 't': SaveToner = 1; break;
+ case 'u':
+ if (strcmp(optarg, "0") == 0)
+ break;
+ if (parse_xy(optarg, &UpperLeftX, &UpperLeftY))
+ error(1, "Illegal format '%s' for -u\n", optarg);
+ break;
+ case 'l':
+ if (strcmp(optarg, "0") == 0)
+ break;
+ if (parse_xy(optarg, &LowerRightX, &LowerRightY))
+ error(1, "Illegal format '%s' for -l\n", optarg);
+ break;
+ case 'z': Model = atoi(optarg);
+ if (Model < 0 || Model > MODEL_LAST)
+ error(1, "Illegal value '%s' for -z\n", optarg);
+ break;
+ case 'L': LogicalClip = atoi(optarg);
+ if (LogicalClip < 0 || LogicalClip > 3)
+ error(1, "Illegal value '%s' for -L\n", optarg);
+ break;
+ case 'A': AllIsBlack = !AllIsBlack; break;
+ case 'B': BlackClears = !BlackClears; break;
+ case 'P': OutputStartPlane = !OutputStartPlane; break;
+ case 'J': if (optarg[0]) Filename = optarg; break;
+ case 'U': if (optarg[0]) Username = optarg; break;
+ case 'X': ExtraPad = atoi(optarg); break;
+ case 'D': Debug = atoi(optarg); break;
+ case 'V': printf("%s\n", Version); exit(0);
+ default: usage(); exit(1);
+ }
+
+ if (UpperLeftX < 0 || UpperLeftX >= PageWidth)
+ error(1, "Illegal X value '%d' for -u\n", UpperLeftX);
+ if (UpperLeftY < 0 || UpperLeftY >= PageHeight)
+ error(1, "Illegal Y value '%d' for -u\n", UpperLeftY);
+ if (LowerRightX < 0 || LowerRightX >= PageWidth)
+ error(1, "Illegal X value '%d' for -l\n", LowerRightX);
+ if (LowerRightY < 0 || LowerRightY >= PageHeight)
+ error(1, "Illegal Y value '%d' for -l\n", LowerRightY);
+
+ argc -= optind;
+ argv += optind;
+
+ if (Model == MODEL_HP1020)
+ {
+ Bpp = ResX / 600;
+ ResX = 600;
+ if (SaveToner)
+ {
+ SaveToner = 0;
+ EconoMode = 1;
+ }
+ }
+
+ switch (Duplex)
+ {
+ case 4:
+ case 5:
+ EvenPages = tmpfile();
+ break;
+ }
+
+ start_doc(stdout);
+
+ if (argc == 0)
+ {
+ do_one(stdin);
+ }
+ else
+ {
+ for (i = 0; i < argc; ++i)
+ {
+ FILE *ifp;
+
+ ifp = fopen(argv[i], "r");
+ if (!ifp)
+ error(1, "Can't open '%s' for reading\n", argv[i]);
+ do_one(ifp);
+ fclose(ifp);
+ }
+ }
+
+ /*
+ * Do manual duplex
+ */
+ if (EvenPages)
+ {
+int media;
+
+ // Handle odd page count
+ if ( (PageNum & 1) == 1)
+ {
+ SeekRec[SeekIndex].b = ftell(EvenPages);
+ blank_page(EvenPages);
+ SeekRec[SeekIndex].e = ftell(EvenPages);
+ debug(1, "Blank Page: %d %ld %ld\n",
+ PageNum, SeekRec[SeekIndex].b, SeekRec[SeekIndex].e);
+ SeekIndex++;
+ }
+
+ /*
+ * Manual Pause
+ */
+ if (Model == MODEL_HP1020)
+ load_tray2(stdout);
+
+ fseek(EvenPages, SeekMedia, 0L);
+ //media = be32(DMMEDIA_LETTERHEAD);
+ fwrite(&media, 1, sizeof(4), EvenPages);
+
+ // Write even pages in reverse order
+ for (i = SeekIndex-1; i >= 0; --i)
+ {
+ debug(1, "EvenPage: %d %ld %ld\n",
+ i, SeekRec[i].b, SeekRec[i].e);
+ fseek(EvenPages, SeekRec[i].b, 0L);
+ for (j = 0; j < (SeekRec[i].e - SeekRec[i].b); ++j)
+ putc(getc(EvenPages), stdout);
+ }
+ fclose(EvenPages);
+ }
+
+ end_doc(stdout);
+
+ exit(0);
+}
diff --git a/foo2oak-wrapper.1in b/foo2oak-wrapper.1in
new file mode 100644
index 0000000..69e9fd5
--- /dev/null
+++ b/foo2oak-wrapper.1in
@@ -0,0 +1,355 @@
+.TH foo2oak-wrapper 1 "${MODpage}" "foo2oak-wrapper ${MODver}"
+'\"==========================================================================
+'\" STRINGS and MACROS
+'\"==========================================================================
+'\"
+'\" Define strings for special characters that nroff doesn't have
+'\"
+'\" N.B. using .if cua to test for special characters did not work.
+'\"
+.if !'\*[.T]'ps' .ds ua up
+.if '\*[.T]'ps' .ds ua \(ua
+.if !'\*[.T]'ps' .ds da down
+.if '\*[.T]'ps' .ds da \(da
+.if !'\*[.T]'ps' .ds <- left
+.if '\*[.T]'ps' .ds <- \(<-
+.if !'\*[.T]'ps' .ds -> right
+.if '\*[.T]'ps' .ds -> \(->
+'\"
+'\" bx - box a Courier string for making keycaps
+'\"
+'\" N.B. this mess is to make the line drawing come out only
+'\" if we are really generating postscript
+'\"
+.de bx
+.ie !'\*[.T]'ps' \{\
+. RB [ \\$1 ]\\$2
+.\}
+.el \{\
+. ie !r ps4html \{\
+'\" \(br\|\s-1\f(CB\\$1\fP\s+1\|\(br\l'|0\(rn'\l'|0\(ul'
+. ft CW
+. nr par*bxw \w'\\$1'+.4m
+\Z'\v'.25m'\D'l 0 -1m'\D'l \\n[par*bxw]u 0'\D'l 0 1m'\D'l -\\n[par*bxw]u 0''\
+\Z'\h'.2m'\s-1\\$1\s+1'\
+\h'\\n[par*bxw]u'\\$2
+. ft P
+. \}
+. el \{\
+. RB [ \\$1 ]\\$2
+. \}
+.\}
+..
+'\"
+'\" strings to set current color (null with old groff)
+'\"
+.if mred .ds red \m[red]
+.if mgreen .ds green \m[green]
+.if mblue .ds blue \m[blue]
+.if mblack .ds black \m[black]
+.if mblack .ds mP \mP
+'\"
+'\" fix for grotty + xterm. We call for orange, grotty outputs yellow,
+'\" but xterm displays yellow as orange. The cycle is complete.
+'\"
+.if n .defcolor orange rgb #ffff00
+'\"
+'\" color <color> - set the current color (ignores request with old groff)
+'\"
+.de color
+.if mred \m[\\$1]\c
+..
+'\"
+'\" colorword <color> <word> - colorize a word (ignored by old groff)
+'\"
+.de colorword
+.ie m\\$1 \m[\\$1]\\$2\mP\c
+.el \\$2\c
+..
+'\"
+'\" colbox <fg> <bg> <word> - colorize a word in a filled box
+'\"
+.de colbox
+.ie mred \M[\\$2]\
+\v'+.167v'\
+\D'P 0 -0.9v \w'\\$3'u 0 0 +0.9v -\w'\\$3'u 0'\
+\v'-.167v'\
+\m[\\$1]\\$3\mP\MP
+.el \\$3\c
+..
+'\"
+'\" Macros for doing pdfmarks
+'\"
+.de specialps
+\\k_\X'ps: \\$*'\h'|\\n_u'\c
+..
+'\"
+'\" pdfmark PDFMARKCODE
+'\"
+.ds pdfmarks
+.if d pdfmarks \{\
+.de pdfmark
+. specialps exec [\\$1 pdfmark
+..
+'\"
+'\" pdfdest LINKNAME
+'\"
+.de pdfdest
+.pdfmark "/Dest /\\$1 /View [/XYZ -5 PL null] /DEST"
+..
+'\"
+'\" pdfbookmark COUNT LINKNAME STRING
+'\"
+.de pdfbookmark
+. pdfmark "/View [/XYZ 44 730 1.0] /Count \\$1 /Dest /\\$2 /Title (\\$3) /OUT"
+..
+'\"
+'\" Define the SH and SS macros to save pdfmark information
+'\" in "arrays" of numbers and strings.
+'\"
+.if !r rr_n \{\
+.nr rr_n 0 1
+.am SH
+. nr rr_levels!\\n+[rr_n] 2
+. ds rr_labels!\\n[rr_n] \\$*
+. pdfdest Link\\n[rr_n]
+..
+.am SS
+. nr rr_levels!\\n+[rr_n] 3
+. ds rr_labels!\\n[rr_n] \\$*
+. pdfdest Link\\n[rr_n]
+..
+.\}
+'\"
+'\" Called at the end of the document to generate the pdfmark outline
+'\"
+.de pdf_outline
+.nr rr_levels!\\n+[rr_n] 1
+.nr rr_i 0 1
+.while \\n+[rr_i]<\\n[rr_n] \{\
+. nr rr_ip1 \\n[rr_i]+1
+. nr rr_count 0
+. if \\n[rr_levels!\\n[rr_ip1]]>\\n[rr_levels!\\n[rr_i]] \{\
+. nr rr_j \\n[rr_i] 1
+. while \\n+[rr_j]<\\n[rr_n] \{\
+. if \\n[rr_levels!\\n[rr_j]]<=\\n[rr_levels!\\n[rr_i]] \{\
+. break
+. \}
+. if \\n[rr_levels!\\n[rr_j]]==(\\n[rr_levels!\\n[rr_i]]+1) \{\
+. nr rr_count \\n[rr_count]+1
+. \}
+. \}
+. \}
+. ds hhh \\*[rr_labels!\\n[rr_i]]
+. pdfbookmark \\n[rr_count] Link\\n[rr_i] "\\*[hhh]"
+.\}
+..
+'\"
+'\" Some postscript to make pdfmarks harmless on old interpreters...
+'\"
+.specialps "def /pdfmark where {pop} {userdict /pdfmark /cleartomark load put} ifelse"
+'\"
+'\" Force display of Bookmarks in Acrobat when document is viewed.
+'\"
+.pdfmark "[/PageMode /UseOutlines /Page 1 /View [/XYZ null null null] /DOCVIEW"
+'\"
+'\" Output the document info in pdfmarks
+'\"
+.pdfmark "\
+ /Title (\*[an-title](\*[an-section])) \
+ /Subject (foo2oak-wrapper Manual Page) \
+ /Author (Rick Richardson) \
+ /Keywords (printing, OAKT) \
+ /Creator (groff \n(.x.\n(.y.\n(.Y -man) \
+ /CreationDate (\*[an-extra1]) \
+ /ModDate (\*[an-extra1]) \
+ /DOCINFO"
+\}
+'\"
+'\" The manual page name is only 1st level mark
+'\"
+.nr rr_levels!\n+[rr_n] 1
+.ds rr_labels!\n[rr_n] \*[an-title](\*[an-section])
+.pdfdest Link\n[rr_n]
+'\"==========================================================================
+'\" MANUAL PAGE SOURCE
+'\"==========================================================================
+.SH NAME
+foo2oak-wrapper \- Convert Postscript into an OAKT printer stream
+.SH SYNOPSIS
+.B foo2oak-wrapper
+.RI [ options "] [" ps-file ]
+.SH DESCRIPTION
+.B foo2oak-wrapper
+is a Foomatic compatible printer wrapper for the \fBfoo2oak\fP printer driver.
+This script reads a Postscript \fIps-file\fP or standard input
+and converts it to Oak Technology OAKT printer format
+for driving the HP Color LaserJet 1500 laser printer
+and other OAKT-based printers.
+.P
+This script can be used in a standalone fashion, but is intended to
+be called from a printer spooler system which uses the Foomatic
+printer database.
+
+.SH COMMAND LINE OPTIONS
+.SS Normal Options
+These are the options used to select the parameters of a
+print job that are usually controlled on a per job basis.
+.TP
+.BI \-b\0 bits
+Number of bits per plane (1 or 2) [1].
+.TP
+.BI \-c
+Print in color (else monochrome).
+.TP
+.BI \-m\0 media
+Media code to send to printer [1].
+.TS
+| n l | n l .
+1 standard 259 letterhead
+2 transparency 261 thickstock
+3 glossy 262 postcard
+257 envelope 263 labels
+.TE
+.TP
+.BI \-p\0 paper
+Paper size code to send to printer [1].
+.TS
+| n l | n l.
+1 letter 9 A4
+5 legal 11 A5
+7 executive 13 B5
+.TE
+.TP
+.BI \-n\0 copies
+Number of copies [1].
+.TP
+.BI \-r\0 xres x yres
+Set device resolution in pixels/inch [600x600].
+.TP
+.BI \-s\0 source
+Source (Input Slot) code to send to printer [7].
+.TS
+| n l | n l.
+1 upper 4 manual
+7 auto
+.TE
+.TP
+.BI "\-2 \-3 \-4 \-5 \-6 \-8 \-9 \-10 \-12 \-14 \-15 \-16 \-18"
+Print in N-up. Requires the \fBpsutils\fP package.
+.TP
+.BI \-o\0 orient
+Orientation used for N-up.
+.TS
+l l l.
+Portrait -op (normal)
+Landscape -ol (rotated 90 degrees anticlockwise)
+Seascape -os (rotated 90 degrees clockwise)
+.TE
+.SS Printer Tweaking Options
+These are the options used to customize the operation of \fBfoo2oak\fP
+for a particular printer.
+.TP
+.BI \-u\0 xoff x yoff
+Set the offset of the start of the printable region from the
+upper left corner, in pixels [varies with paper size].
+The defaults should work on the 2200DL and 2300DL, and have not
+been tested on any other printers.
+.TP
+.BI \-l\0 xoff x yoff
+Set the offset of the end of the printable region from the
+lower right corner, in pixels [varies with paper size].
+The defaults should work on the 2200DL and 2300DL, and have not
+been tested on any other printers.
+.TP
+.BI \-L\0 mask
+Send the logical clipping values from -u/-l in the OAKT stream.
+\fBfoo2oak-wrapper\fP always runs Ghostscript with the ideal page dimensions,
+so that the scale of the image is correct,
+regardless whether or not the printer has unprintable regions.
+This option is used to move the position of the clipped image
+back to where it belongs on the page. The default is to send
+the amount which was clipped by -u and -l, and should be
+good in most cases.
+.TS
+l l.
+0 don't send any logical clipping amounts
+1 only send Y clipping amount
+2 only send X clipping amount
+3 send both X and Y clipping amounts
+.TE
+.SS Color Tweaking Options
+These are the options used to control the quality of color output.
+Color correction is currently a WORK IN PROGRESS.
+.TP
+.BI \-g\0 gsopts
+Additional options to pass to Ghostscript, such as -g\(lq-dDITHERPPI=nnn\(rq,
+etc. This option may appear more than once.
+.TP
+.BI \-G\0 profile.icm
+Convert \fIprofile.icm\fP to a Postscript color rendering
+dictionary (CRD) using \fBfoo2zjs-icc2ps\fP and
+adjust the printer colors by using the Postscript \fBsetcolorrendering\fP
+operator. (WORK IN PROGRESS).
+.TP
+.BI \-G\0 gamma-file.ps
+Prepend \fIgamma-file.ps\fP to the Postscript input to perform
+color correction using the \fBsetcolortransfer\fP Postscript operator.
+For example, the file might contain:
+.br
+{0.333 exp} {0.333 exp} {0.333 exp} {0.333 exp} setcolortransfer
+.TP
+.BI \-I\0 intent
+Select profile intent from the ICM file.
+0=Perceptual, 1=Colorimetric, 2=Saturation, 3=Absolute.
+Default is 0 (perceptual).
+.SS Debugging Options
+These options are used for debugging \fBfoo2oak\fP and its wrapper.
+.TP
+.BI \-S\0 plane
+Output just a single color plane from a color print and print it
+on the black plane. The default is to output all color planes.
+.TS
+l l.
+1 Cyan
+2 Magenta
+3 Yellow
+4 Black
+.TE
+.TP
+.BI \-D\0 level
+Set Debug level [0].
+
+.SH EXAMPLES
+Create a monochrome OAKT stream from a Postscript document,
+examine it, and then print it using a RAW print queue:
+
+.RS
+.nf
+foo2oak-wrapper testpage.ps > testpage.oak
+oakdecode < testpage.oak
+lpr -P raw testpage.oak
+.fi
+.RE
+.P
+Create a color OAKT stream from a Postscript document:
+
+.RS
+.nf
+foo2oak-wrapper -c testpage.ps > testpage.oak
+.fi
+.RE
+
+.SH FILES
+.BR /usr/bin/foo2oak-wrapper
+.SH SEE ALSO
+.BR foo2oak (1),
+.BR oak (1)
+.SH "AUTHOR"
+Rick Richardson <rick.richardson@comcast.net>
+.br
+${URLOAK}/
+'/"
+'/"
+'/"
+.em pdf_outline
diff --git a/foo2oak-wrapper.in b/foo2oak-wrapper.in
new file mode 100644
index 0000000..15c15ba
--- /dev/null
+++ b/foo2oak-wrapper.in
@@ -0,0 +1,595 @@
+#!/bin/sh
+
+#* Copyright (C) 2003-2006 Rick Richardson
+#*
+#* 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.
+#*
+#* Authors: Rick Richardson <rick.richardson@comcast.net>
+
+VERSION='$Id: foo2oak-wrapper.in,v 1.24 2006/12/17 16:00:06 rick Exp $'
+
+PROGNAME="$0"
+BASENAME=`basename $PROGNAME`
+PREFIX=/usr
+SHARE=$PREFIX/share/foo2oak
+
+#
+# Log the command line, for debugging and problem reports
+#
+if [ -x /usr/bin/logger ]; then
+ logger -t "$BASENAME" -p lpr.info -- "foo2oak-wrapper $@" </dev/null
+fi
+
+usage() {
+ cat <<EOF
+Usage:
+ $BASENAME [options] [ps-file]
+
+ Foomatic printer wrapper for the foo2oak printer driver.
+ This script reads a Postscript ps-file or standard input
+ and converts it to Oak Technoligies OAKT printer format.
+
+Normal Options:
+-b bits Bits per plane (1 or 2) [$BPP]
+-c Print in color (else monochrome)
+-m media Media code to send to printer [$MEDIA]
+ 0=auto 1=plain 2=preprinted 3=letterhead 4=graytrans
+ 5=prepunched 6=labels 7=bond 8=recycled 9=color
+ 10=cardstock 11=heavy 12=envelope 13=light 14=tough
+-p paper Paper code [$PAPER]
+ 1=letter, 5=legal, 7=executive, 9=A4, 11=A5, 13=B5jis
+-n copies Number of copies [$COPIES]
+-r <xres>x<yres> Set device resolution in pixels/inch [$RES]
+-s source Source code to send to printer [$SOURCE]
+ 1=tray1, 4=manual, 7=auto
+ Code numbers may vary with printer model.
+-2/-3/-4/-6/-8/-10/-12/-14/-15/-16/-18
+ Print with N-up (requires psutils)
+-o orient For N-up: -op is portrait, -ol is landscape, -os is seascape.
+
+Printer Tweaking Options:
+-u <xoff>x<yoff> Set offset of upper left printable in pixels [varies]
+-l <xoff>x<yoff> Set offset of lower right printable in pixels [varies]
+-L mask Send logical clipping values from -u/-l in ZjStream [3]
+ 0=no, 1=Y, 2=X, 3=XY
+
+Color Tweaking Options:
+-g gsopts Additional options to pass to Ghostscript, such as
+ -dDITHERPPI=nnn, etc. May appear more than once. []
+-G profile.icm Convert profile.icm to a Postscript CRD using icc2ps and
+ adjust colors using the setcolorrendering PS operator.
+ $SHARE/icm/ will be searched for profile.icm.
+-I intent Select profile intent from ICM file [$INTENT]
+ 0=Perceptual, 1=Colorimetric, 2=Saturation, 3=Absolute
+-G gamma-file.ps Prepend gamma-file to the Postscript input to perform
+ color correction using the setcolortransfer PS operator.
+
+Debugging Options:
+-S plane Output just a single color plane from a color print [all]
+ 1=Cyan, 2=Magenta, 3=Yellow, 4=Black
+-D lvl Set Debug level [$DEBUG]
+-V $VERSION
+EOF
+
+ exit 1
+}
+
+#
+# Report an error and exit
+#
+error() {
+ echo "$BASENAME: $1" >&2
+ exit 1
+}
+
+dbgcmd() {
+ if [ $DEBUG -ge 1 ]; then
+ echo "$@" >&2
+ fi
+ "$@"
+}
+
+#
+# N-up-ify the job. Requires psnup from psutils package
+#
+nup() {
+ case "$NUP" in
+ [2368]|1[0458])
+ tr '\r' '\n' | psnup $NUP_ORIENT -d2 -$NUP -m.3in -p$paper -q
+ ;;
+ [49]|1[26])
+ tr '\r' '\n' | psnup $NUP_ORIENT -d2 -$NUP -m.5in -p$paper -q
+ ;;
+ *)
+ error "Illegal call to nup()."
+ ;;
+ esac
+}
+
+#
+# Process the options
+#
+BPP=1
+GSBIN=gs
+CMDLINE="$*"
+DEBUG=0
+DUPLEX=1
+COLOR=
+QUALITY=1
+MEDIA=1
+COPIES=1
+PAPER=1
+RES=600x600
+SOURCE=7
+NUP=
+CLIP_UL=
+CLIP_LR=
+CLIP_LOG=
+BC=
+AIB=
+COLOR2MONO=
+GAMMAFILE=
+INTENT=0
+GSOPTS=
+GSDEV=-sDEVICE=pbmraw
+NUP_ORIENT=
+while getopts "1:23456789o:b:cd:g:l:u:L:m:n:p:q:r:s:ABS:D:G:I:Vh?" opt
+do
+ case $opt in
+ b) BPP=$OPTARG;;
+ c) COLOR=-c;;
+ d) DUPLEX="$OPTARG";;
+ g) GSOPTS="$GSOPTS $OPTARG";;
+ m) MEDIA="$OPTARG";;
+ n) COPIES="$OPTARG";;
+ p) PAPER="$OPTARG";;
+ q) QUALITY="$OPTARG";;
+ r) RES="$OPTARG";;
+ s) SOURCE="$OPTARG";;
+ l) CLIP_LR="-l $OPTARG";;
+ u) CLIP_UL="-u $OPTARG";;
+ L) CLIP_LOG="-L $OPTARG";;
+ A) AIB=-A;;
+ B) BC=-B;;
+ S) COLOR2MONO="-S$OPTARG";;
+ D) DEBUG="$OPTARG";;
+ G) GAMMAFILE="$OPTARG";;
+ I) INTENT="$OPTARG";;
+ [234689]) NUP="$opt";;
+ [57]) error "Can't find acceptable layout for $opt-up";;
+ 1) case "$OPTARG" in
+ [024568]) NUP="1$OPTARG";;
+ *) error "Can't find acceptable layout for 1$OPTARG-up";;
+ esac
+ ;;
+ o) case "$OPTARG" in
+ l*) NUP_ORIENT=-l;;
+ s*) NUP_ORIENT=-r;;
+ p*|*) NUP_ORIENT=;;
+ esac;;
+ V) echo "$VERSION"; foo2oak -V; exit 0;;
+ h|\?)
+ if [ "$CMDLINE" != "-?" -a "$CMDLINE" != -h ]; then
+ echo "Illegal command:"
+ echo " $0 $CMDLINE"
+ echo
+ fi
+ usage;;
+ esac
+done
+shift `expr $OPTIND - 1`
+
+#
+# Select the ghostscript device to use
+#
+case "$BPP" in
+1) if [ "" = "$COLOR" ]; then
+ GSDEV=-sDEVICE=pbmraw
+ else
+ GSDEV=-sDEVICE=bitcmyk
+ fi
+ ;;
+2) if [ "" = "$COLOR" ];
+ then
+ GSDEV=-sDEVICE=pgmraw
+ else
+ GSDEV="-sDEVICE=cups -dcupsColorSpace=6 -dcupsBitsPerColor=2"
+ fi
+ ;;
+*) error "Illegal number of bits per plane ($BPP)";;
+esac
+
+#
+case "$QUALITY" in
+0)
+ GSOPTS="-dCOLORSCREEN $GSOPTS"
+ ;;
+1)
+ GSOPTS="-dCOLORSCREEN $GSOPTS"
+ ;;
+2)
+ GSOPTS="-dMaxBitMap=500000000 $GSOPTS"
+ ;;
+esac
+
+#
+# Validate media code
+#
+case "$MEDIA" in
+0|auto) MEDIA=0;;
+1|plain) MEDIA=1;;
+2|preprinted) MEDIA=2;;
+3|letterhead) MEDIA=3;;
+4|gratrans*) MEDIA=4;;
+5|prepunched) MEDIA=5;;
+6|labels) MEDIA=6;;
+7|bond) MEDIA=7;;
+8|recylcled) MEDIA=8;;
+9|color) MEDIA=9;;
+10|cardstock) MEDIA=10;;
+11|heavy) MEDIA=11;;
+12|envelope) MEDIA=12;;
+13|light) MEDIA=13;;
+14|tough) MEDIA=14;;
+[0-9]*) ;;
+*) error "Unknown media code $MEDIA";;
+esac
+
+#
+# Validate source (InputSlot) code
+#
+case "$SOURCE" in
+1|tray1) SOURCE=1;;
+4|manual) SOURCE=4;;
+7|auto) SOURCE=7;;
+[0-9]*) ;;
+*) error "Unknown source code $SOURCE";;
+esac
+
+#
+# Validate Duplex code
+#
+case "$DUPLEX" in
+1|off|none) DUPLEX=1;;
+2|long*) DUPLEX=2;;
+3|short*) DUPLEX=3;;
+[0-9]*) ;;
+*) error "Unknown duplex code $DUPLEX";;
+esac
+
+#
+# Validate Resolution
+#
+case "$RES" in
+600x600) ;;
+1200x600) ;;
+2400x600) ;;
+*) error "Illegal resolution $RES";;
+esac
+
+#
+# Figure out the paper dimensions in pixels/inch, and set the
+# default clipping region.
+#
+set_clipping() {
+ ulx=$1; uly=$2
+ lrx=$3; lry=$4
+
+ # Set clipping region if it isn't already set
+ if [ "$CLIP_UL" = "" ]; then
+ case "$RES" in
+ 600x600) ulx=`expr $ulx / 2`;;
+ 2400x600) ulx=`expr $ulx \* 2`;;
+ esac
+ CLIP_UL="-u ${ulx}x${uly}"
+ fi
+ if [ "$CLIP_LR" = "" ]; then
+ case "$RES" in
+ 600x600) lrx=`expr $lrx / 2`;;
+ 2400x600) lrx=`expr $lrx \* 2`;;
+ esac
+ CLIP_LR="-l ${lrx}x${lry}"
+ fi
+}
+
+case "$PAPER" in
+[0-9]*x*[0-9])
+ XDIM=`echo "$PAPER" | sed 's/x.*//' `
+ YDIM=`echo "$PAPER" | sed 's/.*x//' `
+ XDIM=`awk -vval=$XDIM 'BEGIN{ print int(val * 1200.0) }' `
+ YDIM=`awk -vval=$YDIM 'BEGIN{ print int(val * 600.0) }' `
+ set_clipping 140 100 140 100
+ paper=letter
+ PAPER=256
+ ;;
+1|letter) PAPER=1; paper=letter; XDIM="10200"; YDIM="6600"
+ set_clipping 140 100 140 100
+ ;;
+5|legal) PAPER=5; paper=legal; XDIM="10200"; YDIM="8400"
+ set_clipping 140 100 140 100
+ ;;
+7|executive) PAPER=7; paper=executive; XDIM="8700"; YDIM="6300"
+ set_clipping 140 100 140 100
+ ;;
+9|a4|A4) PAPER=9; paper=a4; XDIM="9920"; YDIM="7014"
+ set_clipping 160 100 160 100
+ ;;
+11|a5|A5) PAPER=11; paper=a5; XDIM="6992"; YDIM="4960"
+ set_clipping 140 100 140 100
+ ;;
+13|b5jis|B5JIS) PAPER=13; paper=b5; XDIM="8598"; YDIM="6070"
+ set_clipping 140 100 140 100
+ ;;
+*) error "Unimplemented paper code $PAPER";;
+esac
+PAPERSIZE="-sPAPERSIZE=$paper";
+
+case "$RES" in
+600x600) XDIM=`expr $XDIM / 2`;;
+1200x600) ;;
+2400x600) XDIM=`expr $XDIM \* 2`;;
+esac
+DIM="${XDIM}x${YDIM}"
+
+#
+# If there is an argument left, take it as the file to print.
+# Else, the input comes from stdin.
+#
+if [ $# -ge 1 ]; then
+ if [ "$LPJOB" = "" ]; then
+ LPJOB="$1"
+ fi
+ exec < $1
+fi
+
+#
+# Filter thru psnup if N-up printing has been requested
+#
+case $NUP in
+[234689]|1[024568]) PREFILTER="nup";;
+*) PREFILTER=cat;;
+esac
+
+#
+# Overload -G. If the file name ends with ".icm" or ".ICM"
+# then convert the ICC color profile to a Postscript CRD,
+# then prepend it to the users job. Select the intent
+# using the -I option.
+#
+
+create_crd() {
+ #
+ # Create a Postscript CRD
+ #
+ ICC2PS=$PREFIX/bin/foo2zjs-icc2ps
+ if [ -x $ICC2PS ]; then
+ $ICC2PS -o $GAMMAFILE -t$INTENT > $ICCTMP.crd.ps 2>$ICCTMP.log \
+ || error "Problem converting .ICM file to Postscript"
+ cat > $ICCTMP.usecie.ps <<-EOF
+ %!PS-Adobe-3.0
+ <</UseCIEColor true>>setpagedevice
+ EOF
+ cat > $ICCTMP.selcrd.ps <<-EOF
+ /Current /ColorRendering findresource setcolorrendering
+ EOF
+ GAMMAFILE="$ICCTMP.usecie.ps $ICCTMP.crd.ps $ICCTMP.selcrd.ps"
+ else
+ GAMMFILE=
+ fi
+}
+
+if [ $DEBUG -gt 0 ]; then
+ ICCTMP=/tmp/icc
+else
+ ICCTMP=/tmp/icc$$
+fi
+case "$GAMMAFILE" in
+*.icm|*.ICM|*.icc|*.ICC)
+ #
+ # Its really an .ICM file, not a gamma file.
+ #
+ # The file can be a full path name, or the name of a file in $SHARE/icm/
+ #
+ if [ "$COLOR" = "" ]; then
+ GAMMAFILE=
+ elif [ -r "$GAMMAFILE" ]; then
+ create_crd
+ elif [ -r "$SHARE/icm/$GAMMAFILE" ]; then
+ GAMMAFILE="$SHARE/icm/$GAMMAFILE"
+ create_crd
+ else
+ GAMMAFILE=
+ fi
+ ;;
+esac
+
+#
+# Use a Well Tempered Screen in quality mode 2.
+# from Karl Putland <karl@putland.linux-site.net>
+#
+# NOTE from Rick: Karl abandoned this approach.
+#
+create_wts() {
+ #
+ # Screen frequencies
+ #
+ C_FREQ="120"
+ M_FREQ="123.33"
+ Y_FREQ="126.85"
+ K_FREQ="143.22"
+
+ case "$RES" in
+ 600x600) MUL=0.50;;
+ 1200x600) MUL=0.75;;
+ 2400x600) MUL=1.00;;
+ *) MUL=0.50;;
+ esac
+
+ cat > $ICCTMP.wts.ps <<-EOF
+ %!PS-Adobe-3.0
+ << /UseWTS true >> setuserparams
+ <<
+ /HalftoneType 5
+ /Cyan <<
+ /AccurateScreens true
+ /HalftoneType 1
+ /SpotFunction {
+ % 180 mul cos exch 180 mul cos add 2 div
+ abs exch abs 2 dup add 0.75 le
+ { 2 exp exch 2 exp add 1 exch sub }
+ { 2 dup add 1.23 le
+ { exch 0.76 mul add 1 exch sub }
+ { 1 sub 2 exp exch 1 sub 2 exp add 1 sub }
+ ifelse
+ }
+ ifelse
+ }
+ /TransferFunction {1 exp}
+ /Frequency $C_FREQ $MUL mul
+ /Angle 98
+ >>
+ /Magenta <<
+ /AccurateScreens true
+ /HalftoneType 1
+ /SpotFunction {
+ % 180 mul cos exch 180 mul cos add 2 div
+ abs exch abs 2 dup add 0.75 le
+ { 2 exp exch 2 exp add 1 exch sub }
+ { 2 dup add 1.23 le
+ { exch 0.76 mul add 1 exch sub }
+ { 1 sub 2 exp exch 1 sub 2 exp add 1 sub }
+ ifelse
+ }
+ ifelse
+ }
+ /TransferFunction {0.45 exp}
+ /Frequency $M_FREQ $MUL mul
+ /Angle 51.5
+ >>
+ /Yellow <<
+ /AccurateScreens true
+ /HalftoneType 1
+ /SpotFunction {
+ % 180 mul cos exch 180 mul cos add 2 div
+ abs exch abs 2 dup add 0.75 le
+ { 2 exp exch 2 exp add 1 exch sub }
+ { 2 dup add 1.23 le
+ { exch 0.76 mul add 1 exch sub }
+ { 1 sub 2 exp exch 1 sub 2 exp add 1 sub }
+ ifelse
+ }
+ ifelse
+ }
+ /TransferFunction {0.45 exp}
+ /Frequency $Y_FREQ $MUL mul
+ /Angle 27
+ >>
+ /Black <<
+ /AccurateScreens true
+ /HalftoneType 1
+ /SpotFunction {
+ % 180 mul cos exch 180 mul cos add 2 div
+ abs exch abs 2 dup add 0.75 le
+ { 2 exp exch 2 exp add 1 exch sub }
+ { 2 dup add 1.23 le
+ { exch 0.76 mul add 1 exch sub }
+ { 1 sub 2 exp exch 1 sub 2 exp add 1 sub }
+ ifelse
+ }
+ ifelse
+ }
+ /TransferFunction {0.60 exp}
+ /Frequency $K_FREQ $MUL mul
+ /Angle 75
+ >>
+ /Default <<
+ /AccurateScreens true
+ /HalftoneType 1
+ /SpotFunction {
+ % 180 mul cos exch 180 mul cos add 2 div
+ abs exch abs 2 dup add 0.75 le
+ { 2 exp exch 2 exp add 1 exch sub }
+ { 2 dup add 1.23 le
+ { exch 0.76 mul add 1 exch sub }
+ { 1 sub 2 exp exch 1 sub 2 exp add 1 sub }
+ ifelse
+ }
+ ifelse
+ }
+ /TransferFunction {0.45 exp}
+ /Frequency $Y_FREQ $MUL mul
+ /Angle 27
+ >>
+ >> sethalftone
+ EOF
+
+ GAMMAFILE="$GAMMAFILE $ICCTMP.wts.ps"
+}
+
+if [ "$COLOR" != "" -a "$QUALITY" = 2 ]; then
+ create_wts
+fi
+
+#
+# Figure out USERNAME
+#
+if [ "$LPUSER" != "" ]; then
+ USER="$LPUSER@$LPHOST"
+else
+ USER=""
+fi
+
+#
+# Main Program, just cobble together the pipeline and run it
+#
+# The malarky with file descriptors 1 and 3 is to avoid a bug in
+# (some versions?) of Ghostscript where Postscript's stdout gets
+# intermingled with the printer drivers output, resulting in
+# corrupted image data.
+#
+GS="$GSBIN -q -dBATCH -dSAFER -dQUIET -dNOPAUSE"
+
+$PREFILTER \
+| ($GS $PAPERSIZE -g$DIM -r$RES $GSDEV $GSOPTS \
+ -sOutputFile="|cat 1>&3" $GAMMAFILE - >/dev/null 2>/dev/null) 3>&1 \
+| dbgcmd foo2oak -r$RES -g$DIM -p$PAPER -m$MEDIA -n$COPIES -d$DUPLEX -s$SOURCE \
+ $COLOR -b$BPP $CLIP_UL $CLIP_LR $CLIP_LOG \
+ -J "$LPJOB" -U "$USER" \
+ $BC $AIB $COLOR2MONO -D$DEBUG
+
+#
+# Log the command line, for debugging and problem reports
+#
+if [ $DEBUG = 0 -a -x /usr/bin/logger ]; then
+ logger -t "$BASENAME" -p lpr.info -- \
+ "gs $PAPERSIZE -g$DIM -r$RES $GSDEV $GSOPT"
+ logger -t "$BASENAME" -p lpr.info -- \
+ "foo2oak -r$RES -g$DIM -p$PAPER -m$MEDIA \
+-n$COPIES -d$DUPLEX -s$SOURCE $COLOR -b$BPP $CLIP_UL $CLIP_LR $CLIP_LOG \
+$BC $AIB $COLOR2MONO"
+fi
+
+#
+# Remove cruft
+#
+if [ $DEBUG -eq 0 ]; then
+ for i in crd.ps log usecie.ps selcrd.ps wts.ps
+ do
+ file="$ICCTMP.$i"
+ [ -f $file ] && rm -f $file
+ done
+fi
+
+exit 0
diff --git a/foo2oak.1in b/foo2oak.1in
new file mode 100644
index 0000000..070be43
--- /dev/null
+++ b/foo2oak.1in
@@ -0,0 +1,324 @@
+.TH foo2oak 1 "${MODpage}" "foo2oak ${MODver}"
+'\"==========================================================================
+'\" STRINGS and MACROS
+'\"==========================================================================
+'\"
+'\" Define strings for special characters that nroff doesn't have
+'\"
+'\" N.B. using .if cua to test for special characters did not work.
+'\"
+.if !'\*[.T]'ps' .ds ua up
+.if '\*[.T]'ps' .ds ua \(ua
+.if !'\*[.T]'ps' .ds da down
+.if '\*[.T]'ps' .ds da \(da
+.if !'\*[.T]'ps' .ds <- left
+.if '\*[.T]'ps' .ds <- \(<-
+.if !'\*[.T]'ps' .ds -> right
+.if '\*[.T]'ps' .ds -> \(->
+'\"
+'\" bx - box a Courier string for making keycaps
+'\"
+'\" N.B. this mess is to make the line drawing come out only
+'\" if we are really generating postscript
+'\"
+.de bx
+.ie !'\*[.T]'ps' \{\
+. RB [ \\$1 ]\\$2
+.\}
+.el \{\
+. ie !r ps4html \{\
+'\" \(br\|\s-1\f(CB\\$1\fP\s+1\|\(br\l'|0\(rn'\l'|0\(ul'
+. ft CW
+. nr par*bxw \w'\\$1'+.4m
+\Z'\v'.25m'\D'l 0 -1m'\D'l \\n[par*bxw]u 0'\D'l 0 1m'\D'l -\\n[par*bxw]u 0''\
+\Z'\h'.2m'\s-1\\$1\s+1'\
+\h'\\n[par*bxw]u'\\$2
+. ft P
+. \}
+. el \{\
+. RB [ \\$1 ]\\$2
+. \}
+.\}
+..
+'\"
+'\" strings to set current color (null with old groff)
+'\"
+.if mred .ds red \m[red]
+.if mgreen .ds green \m[green]
+.if mblue .ds blue \m[blue]
+.if mblack .ds black \m[black]
+.if mblack .ds mP \mP
+'\"
+'\" fix for grotty + xterm. We call for orange, grotty outputs yellow,
+'\" but xterm displays yellow as orange. The cycle is complete.
+'\"
+.if n .defcolor orange rgb #ffff00
+'\"
+'\" color <color> - set the current color (ignores request with old groff)
+'\"
+.de color
+.if mred \m[\\$1]\c
+..
+'\"
+'\" colorword <color> <word> - colorize a word (ignored by old groff)
+'\"
+.de colorword
+.ie m\\$1 \m[\\$1]\\$2\mP\c
+.el \\$2\c
+..
+'\"
+'\" colbox <fg> <bg> <word> - colorize a word in a filled box
+'\"
+.de colbox
+.ie mred \M[\\$2]\
+\v'+.167v'\
+\D'P 0 -0.9v \w'\\$3'u 0 0 +0.9v -\w'\\$3'u 0'\
+\v'-.167v'\
+\m[\\$1]\\$3\mP\MP
+.el \\$3\c
+..
+'\"
+'\" Macros for doing pdfmarks
+'\"
+.de specialps
+\\k_\X'ps: \\$*'\h'|\\n_u'\c
+..
+'\"
+'\" pdfmark PDFMARKCODE
+'\"
+.ds pdfmarks
+.if d pdfmarks \{\
+.de pdfmark
+. specialps exec [\\$1 pdfmark
+..
+'\"
+'\" pdfdest LINKNAME
+'\"
+.de pdfdest
+.pdfmark "/Dest /\\$1 /View [/XYZ -5 PL null] /DEST"
+..
+'\"
+'\" pdfbookmark COUNT LINKNAME STRING
+'\"
+.de pdfbookmark
+. pdfmark "/View [/XYZ 44 730 1.0] /Count \\$1 /Dest /\\$2 /Title (\\$3) /OUT"
+..
+'\"
+'\" Define the SH and SS macros to save pdfmark information
+'\" in "arrays" of numbers and strings.
+'\"
+.if !r rr_n \{\
+.nr rr_n 0 1
+.am SH
+. nr rr_levels!\\n+[rr_n] 2
+. ds rr_labels!\\n[rr_n] \\$*
+. pdfdest Link\\n[rr_n]
+..
+.am SS
+. nr rr_levels!\\n+[rr_n] 3
+. ds rr_labels!\\n[rr_n] \\$*
+. pdfdest Link\\n[rr_n]
+..
+.\}
+'\"
+'\" Called at the end of the document to generate the pdfmark outline
+'\"
+.de pdf_outline
+.nr rr_levels!\\n+[rr_n] 1
+.nr rr_i 0 1
+.while \\n+[rr_i]<\\n[rr_n] \{\
+. nr rr_ip1 \\n[rr_i]+1
+. nr rr_count 0
+. if \\n[rr_levels!\\n[rr_ip1]]>\\n[rr_levels!\\n[rr_i]] \{\
+. nr rr_j \\n[rr_i] 1
+. while \\n+[rr_j]<\\n[rr_n] \{\
+. if \\n[rr_levels!\\n[rr_j]]<=\\n[rr_levels!\\n[rr_i]] \{\
+. break
+. \}
+. if \\n[rr_levels!\\n[rr_j]]==(\\n[rr_levels!\\n[rr_i]]+1) \{\
+. nr rr_count \\n[rr_count]+1
+. \}
+. \}
+. \}
+. ds hhh \\*[rr_labels!\\n[rr_i]]
+. pdfbookmark \\n[rr_count] Link\\n[rr_i] "\\*[hhh]"
+.\}
+..
+'\"
+'\" Some postscript to make pdfmarks harmless on old interpreters...
+'\"
+.specialps "def /pdfmark where {pop} {userdict /pdfmark /cleartomark load put} ifelse"
+'\"
+'\" Force display of Bookmarks in Acrobat when document is viewed.
+'\"
+.pdfmark "[/PageMode /UseOutlines /Page 1 /View [/XYZ null null null] /DOCVIEW"
+'\"
+'\" Output the document info in pdfmarks
+'\"
+.pdfmark "\
+ /Title (\*[an-title](\*[an-section])) \
+ /Subject (foo2oak Manual Page) \
+ /Author (Rick Richardson) \
+ /Keywords (printing, OAKT) \
+ /Creator (groff \n(.x.\n(.y.\n(.Y -man) \
+ /CreationDate (\*[an-extra1]) \
+ /ModDate (\*[an-extra1]) \
+ /DOCINFO"
+\}
+'\"
+'\" The manual page name is only 1st level mark
+'\"
+.nr rr_levels!\n+[rr_n] 1
+.ds rr_labels!\n[rr_n] \*[an-title](\*[an-section])
+.pdfdest Link\n[rr_n]
+'\"==========================================================================
+'\" MANUAL PAGE SOURCE
+'\"==========================================================================
+.SH NAME
+foo2oak \- Convert Ghostscript pbmraw, pgmraw or bitcmyk format into an
+OAKT printer stream
+.SH SYNOPSIS
+.B foo2oak
+.RI [ options "] <" pbmraw-file " >" OAKT-file
+.sp 1
+.B foo2oak
+.RI [ options "] <" pgmraw-file " >" OAKT-file
+.sp 1
+.B foo2oak
+.RI [ options "] <" bitcmyk-file " >" OAKT-file
+.SH DESCRIPTION
+.B foo2oak
+converts Ghostscript pbmraw or bitcmyk output formats to monochrome
+or color OAKT streams,
+for driving the HP color Laserjet 1500 laser printer
+and other OAKT-based printers.
+
+.SH COMMAND LINE OPTIONS
+.SS Normal Options
+These are the options used to select the parameters of a
+print job that are usually controlled on a per job basis.
+.TP
+.BI \-c
+Force color mode if autodetect doesn't work.
+.TP
+.BI \-g\0 xpix x ypix
+Set page dimensions in pixels [10200x6600].
+.TP
+.BI \-m\0 media
+Media code to send to printer [1].
+.TS
+| n l | n l .
+1 standard 259 letterhead
+2 transparency 261 thickstock
+3 glossy 262 postcard
+257 envelope 263 labels
+.TE
+.TP
+.BI \-p\0 paper
+Paper code to send to printer [1].
+.TS
+| n l | n l.
+1 letter 9 A4
+5 legal 11 A5
+7 executive 13 B5
+.TE
+.TP
+.BI \-n\0 copies
+Number of copies [1].
+.TP
+.BI \-r\0 xres x yres
+Set device resolution in pixels/inch [600x600].
+.TP
+.BI \-s\0 source
+Source (InputSlot) code to send to printer [7].
+.TS
+| n l | n l.
+1 tray1 4 manual
+7 auto
+.TE
+.TP
+.BI \-J\0 filename
+Filename string to send to printer.
+.TP
+.BI \-U\0 username
+Username string to send to printer.
+.SS Printer Tweaking Options
+These are the options used to customize the operation of \fBfoo2oak\fP
+for a particular printer.
+.TP
+.BI \-u\0 xoff x yoff
+Set the offset of the start of the printable region from the
+upper left corner, in pixels [0x0].
+.TP
+.BI \-l\0 xoff x yoff
+Set the offset of the end of the printable region from the
+lower right corner, in pixels [0x0].
+.TP
+.BI \-L\0 mask
+Send logical clipping amounts implied by -u/-l in the OAKT stream [3].
+.TS
+l l.
+0 don't send any logical clipping amounts
+1 only send Y clipping amount
+2 only send X clipping amount
+3 send both X and Y clipping amounts
+.TE
+.TP
+.BI \-A
+Turn off: conversion of C=1,M=1,Y=1 to pure black.
+.TP
+.BI \-B
+Turn off: K=1 forces C,M,Y to 0.
+.SS Debugging Options
+These options are used for debugging \fBfoo2oak\fP.
+.TP
+.BI \-S\0 plane
+Output just a single color plane from a color print and print it
+on the black plane. The default is to output all color planes.
+.TS
+l l.
+1 Cyan
+2 Magenta
+3 Yellow
+4 Black
+.TE
+.TP
+.BI \-D\0 level
+Set Debug level [0].
+
+.SH EXAMPLES
+Create a black and white OAKT stream:
+
+.RS
+.nf
+gs -q -dBATCH -dSAFER -dQUIET -dNOPAUSE \
+ -sPAPERSIZE=letter -r600x600 -sDEVICE=pbmraw \
+ -sOutputFile=- - < testpage.ps \
+| foo2oak -r600x600 -g5100x6600 -p1 >testpage.oak
+.fi
+.RE
+.P
+Create a color OAKT stream:
+
+.RS
+.nf
+gs -q -dBATCH -dSAFER -dQUIET -dNOPAUSE \
+ -sPAPERSIZE=letter -g5100x6600 -r600x600 -sDEVICE=bitcmyk \
+ -sOutputFile=- - < testpage.ps \
+| foo2oak -r600x600 -g5100x6600 -p1 >testpage.oak
+.fi
+.RE
+
+.SH FILES
+.BR /usr/bin/foo2oak
+.SH SEE ALSO
+.BR foo2oak-wrapper (1),
+.BR oakdecode (1)
+.SH "AUTHOR"
+Rick Richardson <rick.richardson@comcast.net>
+.br
+${URLOAK}/
+'/"
+'/"
+'/"
+.em pdf_outline
diff --git a/foo2xqx-wrapper.1in b/foo2xqx-wrapper.1in
new file mode 100644
index 0000000..da401af
--- /dev/null
+++ b/foo2xqx-wrapper.1in
@@ -0,0 +1,325 @@
+.TH foo2xqx-wrapper 1 "${MODpage}" "foo2xqx-wrapper ${MODver}"
+'\"==========================================================================
+'\" STRINGS and MACROS
+'\"==========================================================================
+'\"
+'\" Define strings for special characters that nroff doesn't have
+'\"
+'\" N.B. using .if cua to test for special characters did not work.
+'\"
+.if !'\*[.T]'ps' .ds ua up
+.if '\*[.T]'ps' .ds ua \(ua
+.if !'\*[.T]'ps' .ds da down
+.if '\*[.T]'ps' .ds da \(da
+.if !'\*[.T]'ps' .ds <- left
+.if '\*[.T]'ps' .ds <- \(<-
+.if !'\*[.T]'ps' .ds -> right
+.if '\*[.T]'ps' .ds -> \(->
+'\"
+'\" bx - box a Courier string for making keycaps
+'\"
+'\" N.B. this mess is to make the line drawing come out only
+'\" if we are really generating postscript
+'\"
+.de bx
+.ie !'\*[.T]'ps' \{\
+. RB [ \\$1 ]\\$2
+.\}
+.el \{\
+. ie !r ps4html \{\
+'\" \(br\|\s-1\f(CB\\$1\fP\s+1\|\(br\l'|0\(rn'\l'|0\(ul'
+. ft CW
+. nr par*bxw \w'\\$1'+.4m
+\Z'\v'.25m'\D'l 0 -1m'\D'l \\n[par*bxw]u 0'\D'l 0 1m'\D'l -\\n[par*bxw]u 0''\
+\Z'\h'.2m'\s-1\\$1\s+1'\
+\h'\\n[par*bxw]u'\\$2
+. ft P
+. \}
+. el \{\
+. RB [ \\$1 ]\\$2
+. \}
+.\}
+..
+'\"
+'\" strings to set current color (null with old groff)
+'\"
+.if mred .ds red \m[red]
+.if mgreen .ds green \m[green]
+.if mblue .ds blue \m[blue]
+.if mblack .ds black \m[black]
+.if mblack .ds mP \mP
+'\"
+'\" fix for grotty + xterm. We call for orange, grotty outputs yellow,
+'\" but xterm displays yellow as orange. The cycle is complete.
+'\"
+.if n .defcolor orange rgb #ffff00
+'\"
+'\" color <color> - set the current color (ignores request with old groff)
+'\"
+.de color
+.if mred \m[\\$1]\c
+..
+'\"
+'\" colorword <color> <word> - colorize a word (ignored by old groff)
+'\"
+.de colorword
+.ie m\\$1 \m[\\$1]\\$2\mP\c
+.el \\$2\c
+..
+'\"
+'\" colbox <fg> <bg> <word> - colorize a word in a filled box
+'\"
+.de colbox
+.ie mred \M[\\$2]\
+\v'+.167v'\
+\D'P 0 -0.9v \w'\\$3'u 0 0 +0.9v -\w'\\$3'u 0'\
+\v'-.167v'\
+\m[\\$1]\\$3\mP\MP
+.el \\$3\c
+..
+'\"
+'\" Macros for doing pdfmarks
+'\"
+.de specialps
+\\k_\X'ps: \\$*'\h'|\\n_u'\c
+..
+'\"
+'\" pdfmark PDFMARKCODE
+'\"
+.ds pdfmarks
+.if d pdfmarks \{\
+.de pdfmark
+. specialps exec [\\$1 pdfmark
+..
+'\"
+'\" pdfdest LINKNAME
+'\"
+.de pdfdest
+.pdfmark "/Dest /\\$1 /View [/XYZ -5 PL null] /DEST"
+..
+'\"
+'\" pdfbookmark COUNT LINKNAME STRING
+'\"
+.de pdfbookmark
+. pdfmark "/View [/XYZ 44 730 1.0] /Count \\$1 /Dest /\\$2 /Title (\\$3) /OUT"
+..
+'\"
+'\" Define the SH and SS macros to save pdfmark information
+'\" in "arrays" of numbers and strings.
+'\"
+.if !r rr_n \{\
+.nr rr_n 0 1
+.am SH
+. nr rr_levels!\\n+[rr_n] 2
+. ds rr_labels!\\n[rr_n] \\$*
+. pdfdest Link\\n[rr_n]
+..
+.am SS
+. nr rr_levels!\\n+[rr_n] 3
+. ds rr_labels!\\n[rr_n] \\$*
+. pdfdest Link\\n[rr_n]
+..
+.\}
+'\"
+'\" Called at the end of the document to generate the pdfmark outline
+'\"
+.de pdf_outline
+.nr rr_levels!\\n+[rr_n] 1
+.nr rr_i 0 1
+.while \\n+[rr_i]<\\n[rr_n] \{\
+. nr rr_ip1 \\n[rr_i]+1
+. nr rr_count 0
+. if \\n[rr_levels!\\n[rr_ip1]]>\\n[rr_levels!\\n[rr_i]] \{\
+. nr rr_j \\n[rr_i] 1
+. while \\n+[rr_j]<\\n[rr_n] \{\
+. if \\n[rr_levels!\\n[rr_j]]<=\\n[rr_levels!\\n[rr_i]] \{\
+. break
+. \}
+. if \\n[rr_levels!\\n[rr_j]]==(\\n[rr_levels!\\n[rr_i]]+1) \{\
+. nr rr_count \\n[rr_count]+1
+. \}
+. \}
+. \}
+. ds hhh \\*[rr_labels!\\n[rr_i]]
+. pdfbookmark \\n[rr_count] Link\\n[rr_i] "\\*[hhh]"
+.\}
+..
+'\"
+'\" Some postscript to make pdfmarks harmless on old interpreters...
+'\"
+.specialps "def /pdfmark where {pop} {userdict /pdfmark /cleartomark load put} ifelse"
+'\"
+'\" Force display of Bookmarks in Acrobat when document is viewed.
+'\"
+.pdfmark "[/PageMode /UseOutlines /Page 1 /View [/XYZ null null null] /DOCVIEW"
+'\"
+'\" Output the document info in pdfmarks
+'\"
+.pdfmark "\
+ /Title (\*[an-title](\*[an-section])) \
+ /Subject (foo2xqx-wrapper Manual Page) \
+ /Author (Rick Richardson) \
+ /Keywords (printing) \
+ /Creator (groff \n(.x.\n(.y.\n(.Y -man) \
+ /CreationDate (\*[an-extra1]) \
+ /ModDate (\*[an-extra1]) \
+ /DOCINFO"
+\}
+'\"
+'\" The manual page name is only 1st level mark
+'\"
+.nr rr_levels!\n+[rr_n] 1
+.ds rr_labels!\n[rr_n] \*[an-title](\*[an-section])
+.pdfdest Link\n[rr_n]
+'\"==========================================================================
+'\" MANUAL PAGE SOURCE
+'\"==========================================================================
+.SH NAME
+foo2xqx-wrapper \- Convert Postscript into a XQX printer stream
+.SH SYNOPSIS
+.B foo2xqx-wrapper
+.RI [ options "] [" ps-file ]
+.SH DESCRIPTION
+.B foo2xqx-wrapper
+is a Foomatic compatible printer wrapper for the \fBfoo2xqx\fP printer driver.
+This script reads a Postscript \fIps-file\fP or standard input
+and converts it to XQX printer format
+for driving the HP LaserJet M1005 MFP
+and other XQX-based printers.
+.P
+This script can be used in a standalone fashion, but is intended to
+be called from a printer spooler system which uses the Foomatic
+printer database.
+
+.SH COMMAND LINE OPTIONS
+.SS Normal Options
+These are the options used to select the parameters of a
+print job that are usually controlled on a per job basis.
+.TP
+.BI \-d\0 duplex
+Duplex code to send to printer [1].
+.TS
+| n l | n l | n l .
+1 off 2 long edge 3 short edge
+.TE
+.TP
+.BI \-m\0 media
+Media code to send to printer [1].
+.TS
+l l l
+l n n.
+_
+Media M1005
+_
+standard 1
+transparency 2
+envelope 257
+letterhead 259
+thick 261
+postcard 262
+labels 263
+.TE
+.TP
+.BI \-p\0 paper
+Paper size code to send to printer [1].
+.TS
+| n l | n l.
+1 letter 9 A4
+5 legal 11 A5
+7 executive 13 B5
+20 env #10 27 env DL
+28 env C5 34 env B5
+37 env Monarch
+.TE
+.TP
+.BI \-n\0 copies
+Number of copies [1].
+.TP
+.BI \-r\0 xres x yres
+Set device resolution in pixels/inch [1200x600].
+.TP
+.BI \-s\0 source
+Source (Input Slot) code to send to printer [7].
+.TS
+| n l | n l.
+1 upper 4 manual
+2 lower 7 auto
+.TE
+.TP
+.BI \-t
+Draft mode. Every other pixel is white.
+.TP
+.BI "\-2 \-3 \-4 \-5 \-6 \-8 \-9 \-10 \-12 \-14 \-15 \-16 \-18"
+Print in N-up. Requires the \fBpsutils\fP package.
+.TP
+.BI \-o\0 orient
+Orientation used for N-up.
+.TS
+l l l.
+Portrait -op (normal)
+Landscape -ol (rotated 90 degrees anticlockwise)
+Seascape -os (rotated 90 degrees clockwise)
+.TE
+.SS Printer Tweaking Options
+These are the options used to customize the operation of \fBfoo2xqx\fP
+for a particular printer.
+.TP
+.BI \-u\0 xoff x yoff
+Set the offset of the start of the printable region from the
+upper left corner, in pixels [varies with paper size].
+The defaults should work on the 2200DL and 2300DL, and have not
+been tested on any other printers.
+.TP
+.BI \-l\0 xoff x yoff
+Set the offset of the end of the printable region from the
+lower right corner, in pixels [varies with paper size].
+The defaults should work on the 2200DL and 2300DL, and have not
+been tested on any other printers.
+.TP
+.BI \-L\0 mask
+Send the logical clipping values from -u/-l in the ZjStream.
+\fBfoo2xqx-wrapper\fP always runs Ghostscript with the ideal page dimensions,
+so that the scale of the image is correct,
+regardless whether or not the printer has unprintable regions.
+This option is used to move the position of the clipped image
+back to where it belongs on the page. The default is to send
+the amount which was clipped by -u and -l, and should be
+good in most cases.
+.TS
+l l.
+0 don't send any logical clipping amounts
+1 only send Y clipping amount
+2 only send X clipping amount
+3 send both X and Y clipping amounts
+.TE
+.SS Debugging Options
+These options are used for debugging \fBfoo2xqx\fP and its wrapper.
+.TP
+.BI \-D\0 level
+Set Debug level [0].
+
+.SH EXAMPLES
+Create a monochrome ZjStream from a Postscript document,
+examine it, and then print it using a RAW print queue:
+
+.RS
+.nf
+foo2xqx-wrapper testpage.ps > testpage.xqx
+xqxdecode < testpage.xqx
+lpr -P raw testpage.xqx
+.fi
+.RE
+
+.SH FILES
+.BR /usr/bin/foo2xqx-wrapper
+.SH SEE ALSO
+.BR foo2xqx (1),
+.BR xqxdecode (1)
+.SH "AUTHOR"
+Rick Richardson <rick.richardson@comcast.net>
+.br
+${URLXQX}/
+'/"
+'/"
+'/"
+.em pdf_outline
diff --git a/foo2xqx-wrapper.in b/foo2xqx-wrapper.in
new file mode 100755
index 0000000..122d318
--- /dev/null
+++ b/foo2xqx-wrapper.in
@@ -0,0 +1,575 @@
+#!/bin/sh
+
+#* Copyright (C) 2003-2006 Rick Richardson
+#*
+#* 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.
+#*
+#* Authors: Rick Richardson <rick.richardson@comcast.net>
+
+VERSION='$Id: foo2xqx-wrapper.in,v 1.11 2006/12/17 16:00:06 rick Exp $'
+
+#
+# Printer Notes:
+#
+# HP LaserJet M1005 - Same as 2200 DL, plus needs -P
+#
+
+PROGNAME="$0"
+BASENAME=`basename $PROGNAME`
+PREFIX=/usr
+SHARE=$PREFIX/share/foo2zjs
+
+#
+# Log the command line, for debugging and problem reports
+#
+if [ -x /usr/bin/logger ]; then
+ logger -t "$BASENAME" -p lpr.info -- "foo2xqx-wrapper $@" </dev/null
+fi
+
+usage() {
+ cat <<EOF
+Usage:
+ $BASENAME [options] [ps-file]
+
+ Foomatic printer wrapper for the foo2xqx printer driver.
+ This script reads a Postscript ps-file or standard input
+ and converts it to Zenographics ZjStream printer format.
+
+Normal Options:
+-c Print in color (else monochrome)
+-d duplex Duplex code to send to printer [$DUPLEX]
+ 1=off, 2=longedge, 3=shortedge
+-m media Media code to send to printer [$MEDIA]
+ 1=standard, 2=transparency, 3=glossy, 257=envelope,
+ 259=letterhead, 261=thickstock, 262=postcard, 263=labels
+-p paper Paper code [$PAPER]
+ 1=letter, 5=legal, 7=executive, 9=A4, 11=A5, 13=B5
+ 20=env#10, 27=envDL 28=envC5 34=envB5 37=envMonarch
+-n copies Number of copies [$COPIES]
+-r <xres>x<yres> Set device resolution in pixels/inch [$RES]
+-s source Source code to send to printer [$SOURCE]
+ 1=upper, 2=lower, 4=manual, 7=auto
+ Code numbers may vary with printer model.
+-t Draft mode. Every other pixel is white.
+-2/-3/-4/-6/-8/-10/-12/-14/-15/-16/-18
+ Print with N-up (requires psutils)
+-o orient For N-up: -op is portrait, -ol is landscape, -os is seascape.
+
+Printer Tweaking Options:
+-u <xoff>x<yoff> Set offset of upper left printable in pixels [varies]
+-l <xoff>x<yoff> Set offset of lower right printable in pixels [varies]
+-L mask Send logical clipping values from -u/-l in ZjStream [3]
+ 0=no, 1=Y, 2=X, 3=XY
+-P Do not output START_PLANE codes. May be needed by some
+ monochrome-only printers.
+-X padlen Add extra zero padding to the end of BID segments [16]
+-z model Model: 0=2300DL 1=hp1020 [0]
+
+Color Tweaking Options:
+-g gsopts Additional options to pass to Ghostscript, such as
+ -dDITHERPPI=nnn, etc. May appear more than once. []
+-G profile.icm Convert profile.icm to a Postscript CRD using icc2ps and
+ adjust colors using the setcolorrendering PS operator.
+ $SHARE/icm/ will be searched for profile.icm.
+-I intent Select profile intent from ICM file [$INTENT]
+ 0=Perceptual, 1=Colorimetric, 2=Saturation, 3=Absolute
+-G gamma-file.ps Prepend gamma-file to the Postscript input to perform
+ color correction using the setcolortransfer PS operator.
+
+Debugging Options:
+-S plane Output just a single color plane from a color print [all]
+ 1=Cyan, 2=Magenta, 3=Yellow, 4=Black
+-D lvl Set Debug level [$DEBUG]
+-V $VERSION
+EOF
+
+ exit 1
+}
+
+#
+# Report an error and exit
+#
+error() {
+ echo "$BASENAME: $1" >&2
+ exit 1
+}
+
+dbgcmd() {
+ if [ $DEBUG -ge 1 ]; then
+ echo "$@" >&2
+ fi
+ "$@"
+}
+
+#
+# N-up-ify the job. Requires psnup from psutils package
+#
+nup() {
+ case "$NUP" in
+ [2368]|1[0458])
+ tr '\r' '\n' | psnup $NUP_ORIENT -d2 -$NUP -m.3in -p$paper -q
+ ;;
+ [49]|1[26])
+ tr '\r' '\n' | psnup $NUP_ORIENT -d2 -$NUP -m.5in -p$paper -q
+ ;;
+ *)
+ error "Illegal call to nup()."
+ ;;
+ esac
+}
+
+#
+# Process the options
+#
+
+# Try to use a local copy of GhostScript 8.14, if available. Otherwise,
+# fallback to whatever the Linux distro has installed (usually 7.05)
+#
+# N.B. := operator used here, when :- would be better, because "ash"
+# doesn't have :-
+if gs8 -v >/dev/null 2>&1; then
+ GSBIN=${GSBIN:-gs8}
+else
+ GSBIN=${GSBIN:-gs}
+fi
+
+CMDLINE="$*"
+DEBUG=0
+DUPLEX=1
+COLOR=
+COLORMODE=0
+# What mode to use if the user wants us to pick the "best" mode
+case `$GSBIN --version` in
+7*) DEFAULTCOLORMODE=10
+ DEFAULTCOLORMODE=2
+ ;;
+*) DEFAULTCOLORMODE=2
+ ;;
+esac
+QUALITY=1
+MEDIA=1
+COPIES=1
+PAPER=1
+RES=1200x600
+SOURCE=7
+NUP=
+CLIP_UL=
+CLIP_LR=
+CLIP_LOG=
+BC=
+AIB=
+NOPLANES=
+COLOR2MONO=
+GAMMAFILE=
+INTENT=0
+GSOPTS=
+EXTRAPAD=
+SAVETONER=
+NUP_ORIENT=
+GSDEV=-sDEVICE=pbmraw
+while getopts "1:23456789o:b:cC:d:g:l:u:L:m:n:p:q:r:s:tABS:D:G:I:PX:Vh?" opt
+do
+ case $opt in
+ b) GSBIN="$OPTARG";;
+ c) COLOR=-c;;
+ d) DUPLEX="$OPTARG";;
+ g) GSOPTS="$GSOPTS $OPTARG";;
+ m) MEDIA="$OPTARG";;
+ n) COPIES="$OPTARG";;
+ p) PAPER="$OPTARG";;
+ q) QUALITY="$OPTARG";;
+ r) RES="$OPTARG";;
+ s) SOURCE="$OPTARG";;
+ t) SAVETONER="-t";;
+ l) CLIP_LR="-l $OPTARG";;
+ u) CLIP_UL="-u $OPTARG";;
+ L) CLIP_LOG="-L $OPTARG";;
+ A) AIB=-A;;
+ B) BC=-B;;
+ C) COLORMODE="$OPTARG";;
+ S) COLOR2MONO="-S$OPTARG";;
+ D) DEBUG="$OPTARG";;
+ G) GAMMAFILE="$OPTARG";;
+ I) INTENT="$OPTARG";;
+ P) NOPLANES=-P;;
+ X) EXTRAPAD="-X $OPTARG";;
+ [234689]) NUP="$opt";;
+ [57]) error "Can't find acceptable layout for $opt-up";;
+ 1) case "$OPTARG" in
+ [024568]) NUP="1$OPTARG";;
+ *) error "Can't find acceptable layout for 1$OPTARG-up";;
+ esac
+ ;;
+ o) case "$OPTARG" in
+ l*) NUP_ORIENT=-l;;
+ s*) NUP_ORIENT=-r;;
+ p*|*) NUP_ORIENT=;;
+ esac;;
+ V) echo "$VERSION"; foo2xqx -V; exit 0;;
+ h|\?)
+ if [ "$CMDLINE" != "-?" -a "$CMDLINE" != -h ]; then
+ echo "Illegal command:"
+ echo " $0 $CMDLINE"
+ echo
+ fi
+ usage;;
+ esac
+done
+shift `expr $OPTIND - 1`
+
+#
+case "$QUALITY" in
+0)
+ GSOPTS="-dCOLORSCREEN $GSOPTS"
+ ;;
+1)
+ GSOPTS="-dCOLORSCREEN $GSOPTS"
+ ;;
+2)
+ GSOPTS="-dMaxBitMap=500000000 $GSOPTS"
+ ;;
+esac
+
+#
+# Validate media code
+#
+case "$MEDIA" in
+1|standard) MEDIA=1;;
+2|transparency) MEDIA=2;;
+3|glossy) MEDIA=3;;
+257|envelope) MEDIA=257;;
+259|letterhead) MEDIA=259;;
+261|thickstock) MEDIA=261;;
+262|postcard) MEDIA=262;;
+263|labels) MEDIA=263;;
+[0-9]*) ;;
+*) error "Unknown media code $MEDIA";;
+esac
+
+#
+# Validate source (InputSlot) code
+#
+case "$SOURCE" in
+1|upper) SOURCE=1;;
+4|manual) SOURCE=4;;
+7|auto) SOURCE=7;;
+[0-9]*) ;;
+*) error "Unknown source code $SOURCE";;
+esac
+
+#
+# Validate Duplex code
+#
+case "$DUPLEX" in
+1|off|none) DUPLEX=1;;
+2|long*) DUPLEX=2;;
+3|short*) DUPLEX=3;;
+[0-9]*) ;;
+*) error "Unknown duplex code $DUPLEX";;
+esac
+
+#
+# Validate Resolution
+#
+case "$RES" in
+600x600) ;;
+1200x600) ;;
+*) error "Illegal resolution $RES";;
+esac
+
+#
+# Figure out the paper dimensions in pixels/inch, and set the
+# default clipping region. Unfortunately, this is a trouble
+# area for ZjStream printers. Various versions of ZjS print
+# engines react differently when asked to print into their
+# unprintable regions.
+#
+# The Minolta 2200 DL is sensitive to its unprintable regions,
+# and will pixel skew if you try to print there.
+#
+# The HP1000 will print blank pages when asked to print into its
+# unprintable region.
+#
+# The Minolta 2300 DL doesn't care if print into the unprintable
+# region. It will do the clipping itself. This is as it should be.
+# But it won't hurt it if we do the clipping here.
+#
+set_clipping() {
+ ulx=$1; uly=$2
+ lrx=$3; lry=$4
+
+ # Set clipping region if it isn't already set
+ if [ "$CLIP_UL" = "" ]; then
+ case "$RES" in
+ 600x600) ulx=`expr $ulx / 2`;;
+ 2400x600) ulx=`expr $ulx \* 2`;;
+ esac
+ CLIP_UL="-u ${ulx}x${uly}"
+ fi
+ if [ "$CLIP_LR" = "" ]; then
+ case "$RES" in
+ 600x600) lrx=`expr $lrx / 2`;;
+ 2400x600) lrx=`expr $lrx \* 2`;;
+ esac
+ CLIP_LR="-l ${lrx}x${lry}"
+ fi
+}
+
+case "$PAPER" in
+1|letter) PAPER=1; paper=letter; XDIM="10200"; YDIM="6600"
+ set_clipping 177 84 177 84
+ ;;
+5|legal) PAPER=5; paper=legal; XDIM="10200"; YDIM="8400"
+ set_clipping 177 96 177 96
+ ;;
+7|executive) PAPER=7; paper=executive; XDIM="8700"; YDIM="6300"
+ set_clipping 192 96 192 96
+ ;;
+9|a4|A4) PAPER=9; paper=a4; XDIM="9920"; YDIM="7016"
+ set_clipping 176 84 176 84
+ ;;
+11|a5|A5) PAPER=11; paper=a5; XDIM="6992"; YDIM="4960"
+ set_clipping 192 96 192 96
+ ;;
+13|b5|B5) PAPER=13; paper=b5; XDIM="8598"; YDIM="6070"
+ set_clipping 192 96 192 96
+ ;;
+20|"env#10") PAPER=20; paper=env10; XDIM="4950"; YDIM="5700"
+ set_clipping 171 78 171 78
+ ;;
+27|envDL) PAPER=27; paper=envDL; XDIM="5200"; YDIM="5200"
+ set_clipping 176 84 176 84
+ ;;
+28|envC5) PAPER=28; paper=envC5; XDIM="7650"; YDIM="5408"
+ set_clipping 170 80 169 80
+ ;;
+34|envB5) PAPER=34; paper=envB5; XDIM="8316"; YDIM="5892"
+ set_clipping 174 74 174 74
+ ;;
+37|envMonarch) PAPER=37; paper=envMonarch;XDIM="4650"; YDIM="4500"
+ set_clipping 174 78 173 78
+ ;;
+*) error "Unimplemented paper code $PAPER";;
+esac
+PAPERSIZE="-sPAPERSIZE=$paper";
+
+case "$RES" in
+600x600) XDIM=`expr $XDIM / 2`;;
+1200x600) ;;
+2400x600) XDIM=`expr $XDIM \* 2`;;
+esac
+DIM="${XDIM}x${YDIM}"
+
+#
+# If there is an argument left, take it as the file to print.
+# Else, the input comes from stdin.
+#
+if [ $# -ge 1 ]; then
+ if [ "$LPJOB" = "" ]; then
+ : # LPJOB="$1"
+ fi
+ exec < $1
+fi
+
+#
+# Filter thru psnup if N-up printing has been requested
+#
+case $NUP in
+[234689]|1[024568]) PREFILTER="nup";;
+*) PREFILTER=cat;;
+esac
+
+#
+# Overload -G. If the file name ends with ".icm" or ".ICM"
+# then convert the ICC color profile to a Postscript CRD,
+# then prepend it to the users job. Select the intent
+# using the -I option.
+#
+
+create_crd() {
+ #
+ # Create a Postscript CRD
+ #
+ ICC2PS=$PREFIX/bin/foo2zjs-icc2ps
+ if [ -x $ICC2PS ]; then
+ $ICC2PS -o $GAMMAFILE -t$INTENT > $ICCTMP.crd.ps 2>$ICCTMP.log \
+ || error "Problem converting .ICM file to Postscript"
+ cat > $ICCTMP.usecie.ps <<-EOF
+ %!PS-Adobe-3.0
+ <</UseCIEColor true>>setpagedevice
+ EOF
+ cat > $ICCTMP.selcrd.ps <<-EOF
+ /Current /ColorRendering findresource setcolorrendering
+ EOF
+ GAMMAFILE="$ICCTMP.usecie.ps $ICCTMP.crd.ps $ICCTMP.selcrd.ps"
+ else
+ GAMMFILE=
+ fi
+}
+
+if [ $DEBUG -gt 0 ]; then
+ ICCTMP=/tmp/icc
+else
+ ICCTMP=/tmp/icc$$
+fi
+
+if [ "" = "$COLOR" ]; then
+ COLORMODE=
+ GAMMAFILE=
+else
+ case "$COLORMODE" in
+ 0) COLORMODE=$DEFAULTCOLORMODE;;
+ esac
+fi
+
+CRDBASE="$PREFIX/share/foo2zjs/crd"
+case "$RES" in
+ 600x600) COLORMODE=;;
+ 1200x600) SCREEN=screen1200.ps;;
+ 2400x600) SCREEN=screen2400.ps;;
+esac
+
+case "$COLORMODE" in
+"")
+ # Monochrome
+ ;;
+10|icm)
+ # Use old ICM method
+ AIB=-A
+ BC=-B
+ case "$GAMMAFILE" in
+ *.icm|*.ICM|*.icc|*.ICC)
+ #
+ # Its really an .ICM file, not a gamma file.
+ #
+ # The file can be a full path name, or the name of a file in $SHARE/icm/
+ #
+ if [ -r "$GAMMAFILE" ]; then
+ create_crd
+ elif [ -r "$SHARE/icm/$GAMMAFILE" ]; then
+ GAMMAFILE="$SHARE/icm/$GAMMAFILE"
+ create_crd
+ else
+ GAMMAFILE=
+ fi
+ ;;
+ none)
+ GAMMAFILE=
+ ;;
+ esac
+ ;;
+1|photo)
+ # Photo
+ GAMMAFILE="$CRDBASE/prolog.ps"
+ GAMMAFILE="$GAMMAFILE $CRDBASE/2300w-1200@150-l250-kx,ucr125,75-per.crd"
+ GAMMAFILE="$GAMMAFILE $CRDBASE/$SCREEN"
+ ;;
+2|graphics)
+ # Photo and Text
+ GAMMAFILE="$CRDBASE/prolog.ps"
+ #GAMMAFILE="$GAMMAFILE $CRDBASE/2300w-1200@150-l250-kx,ucr100,75-per.crd"
+ GAMMAFILE="$GAMMAFILE $CRDBASE/kh.crd"
+ GAMMAFILE="$GAMMAFILE $CRDBASE/$SCREEN"
+ ;;
+3|text)
+ # Graphic and Text
+ GAMMAFILE="$CRDBASE/prolog.ps"
+ #GAMMAFILE="$GAMMAFILE $CRDBASE/2300w-1200@150-l250-kx,ucr100,50-per.crd"
+ GAMMAFILE="$GAMMAFILE $CRDBASE/kx.crd"
+ GAMMAFILE="$GAMMAFILE $CRDBASE/$SCREEN"
+ ;;
+4|tonersave)
+ # Reduced toner
+ GAMMAFILE="$CRDBASE/prolog.ps"
+ GAMMAFILE="$GAMMAFILE $CRDBASE/2300w-1200@150-l250-kx,ucr100,0-per.crd"
+ GAMMAFILE="$GAMMAFILE $CRDBASE/$SCREEN"
+ ;;
+*.crd)
+ GAMMAFILE="$CRDBASE/prolog.ps"
+ if [ -f $COLORMODE ]; then
+ GAMMAFILE="$GAMMAFILE $COLORMODE"
+ elif [ -f $CRDBASE/$COLORMODE ]; then
+ GAMMAFILE="$GAMMAFILE $CRDBASE/$COLORMODE"
+ else
+ error "Can't find CRD '$COLORMODE' in . or in $CRDBASE"
+ fi
+ GAMMAFILE="$GAMMAFILE $CRDBASE/$SCREEN"
+ ;;
+*)
+ error "Unknown color method '$COLORMODE'"
+ ;;
+esac
+
+if [ "" != "$COLOR" ]; then
+ if [ "" = "$AIB" -a "" = "$BC" ]; then
+ # Faster, but can't handle AllIsBlack or BlackClears
+ GSDEV=-sDEVICE=pksmraw
+ else
+ # Can't handle different size pages
+ GSDEV=-sDEVICE=bitcmyk
+ fi
+fi
+
+#
+# Figure out USERNAME
+#
+if [ "$LPUSER" != "" ]; then
+ USER="$LPUSER@$LPHOST"
+else
+ USER=""
+fi
+
+#
+# Main Program, just cobble together the pipeline and run it
+#
+# The malarky with file descriptors 1 and 3 is to avoid a bug in
+# (some versions?) of Ghostscript where Postscript's stdout gets
+# intermingled with the printer drivers output, resulting in
+# corrupted image data.
+#
+GS="$GSBIN -q -dBATCH -dSAFER -dQUIET -dNOPAUSE"
+
+$PREFILTER \
+| ($GS $PAPERSIZE -g$DIM -r$RES $GSDEV $GSOPTS \
+ -sOutputFile="|cat 1>&3" $GAMMAFILE - >/dev/null) 3>&1 \
+| foo2xqx -r$RES -g$DIM -p$PAPER -m$MEDIA -n$COPIES -d$DUPLEX -s$SOURCE \
+ $COLOR $CLIP_UL $CLIP_LR $CLIP_LOG $SAVETONER \
+ -J "$LPJOB" -U "$USER" \
+ $BC $AIB $COLOR2MONO $NOPLANES $EXTRAPAD -D$DEBUG
+
+#
+# Log the command line, for debugging and problem reports
+#
+if [ -x /usr/bin/logger ]; then
+ logger -t "$BASENAME" -p lpr.info -- \
+ "$GSBIN $PAPERSIZE -g$DIM -r$RES $GSDEV $GSOPT $GAMAFILE"
+ logger -t "$BASENAME" -p lpr.info -- \
+ "foo2xqx -r$RES -g$DIM -p$PAPER -m$MEDIA \
+-n$COPIES -d$DUPLEX -s$SOURCE $COLOR $CLIP_UL $CLIP_LR $CLIP_LOG \
+$SAVETONER $BC $AIB $COLOR2MONO $NOPLANES $EXTRAPAD"
+fi
+
+#
+# Remove cruft
+#
+if [ $DEBUG -eq 0 ]; then
+ for i in crd.ps log usecie.ps selcrd.ps
+ do
+ file="$ICCTMP.$i"
+ [ -f $file ] && rm -f $file
+ done
+fi
+
+exit 0
diff --git a/foo2xqx.1in b/foo2xqx.1in
new file mode 100644
index 0000000..b223018
--- /dev/null
+++ b/foo2xqx.1in
@@ -0,0 +1,324 @@
+.TH foo2xqx 1 "${MODpage}" "foo2xqx ${MODver}"
+'\"==========================================================================
+'\" STRINGS and MACROS
+'\"==========================================================================
+'\"
+'\" Define strings for special characters that nroff doesn't have
+'\"
+'\" N.B. using .if cua to test for special characters did not work.
+'\"
+.if !'\*[.T]'ps' .ds ua up
+.if '\*[.T]'ps' .ds ua \(ua
+.if !'\*[.T]'ps' .ds da down
+.if '\*[.T]'ps' .ds da \(da
+.if !'\*[.T]'ps' .ds <- left
+.if '\*[.T]'ps' .ds <- \(<-
+.if !'\*[.T]'ps' .ds -> right
+.if '\*[.T]'ps' .ds -> \(->
+'\"
+'\" bx - box a Courier string for making keycaps
+'\"
+'\" N.B. this mess is to make the line drawing come out only
+'\" if we are really generating postscript
+'\"
+.de bx
+.ie !'\*[.T]'ps' \{\
+. RB [ \\$1 ]\\$2
+.\}
+.el \{\
+. ie !r ps4html \{\
+'\" \(br\|\s-1\f(CB\\$1\fP\s+1\|\(br\l'|0\(rn'\l'|0\(ul'
+. ft CW
+. nr par*bxw \w'\\$1'+.4m
+\Z'\v'.25m'\D'l 0 -1m'\D'l \\n[par*bxw]u 0'\D'l 0 1m'\D'l -\\n[par*bxw]u 0''\
+\Z'\h'.2m'\s-1\\$1\s+1'\
+\h'\\n[par*bxw]u'\\$2
+. ft P
+. \}
+. el \{\
+. RB [ \\$1 ]\\$2
+. \}
+.\}
+..
+'\"
+'\" strings to set current color (null with old groff)
+'\"
+.if mred .ds red \m[red]
+.if mgreen .ds green \m[green]
+.if mblue .ds blue \m[blue]
+.if mblack .ds black \m[black]
+.if mblack .ds mP \mP
+'\"
+'\" fix for grotty + xterm. We call for orange, grotty outputs yellow,
+'\" but xterm displays yellow as orange. The cycle is complete.
+'\"
+.if n .defcolor orange rgb #ffff00
+'\"
+'\" color <color> - set the current color (ignores request with old groff)
+'\"
+.de color
+.if mred \m[\\$1]\c
+..
+'\"
+'\" colorword <color> <word> - colorize a word (ignored by old groff)
+'\"
+.de colorword
+.ie m\\$1 \m[\\$1]\\$2\mP\c
+.el \\$2\c
+..
+'\"
+'\" colbox <fg> <bg> <word> - colorize a word in a filled box
+'\"
+.de colbox
+.ie mred \M[\\$2]\
+\v'+.167v'\
+\D'P 0 -0.9v \w'\\$3'u 0 0 +0.9v -\w'\\$3'u 0'\
+\v'-.167v'\
+\m[\\$1]\\$3\mP\MP
+.el \\$3\c
+..
+'\"
+'\" Macros for doing pdfmarks
+'\"
+.de specialps
+\\k_\X'ps: \\$*'\h'|\\n_u'\c
+..
+'\"
+'\" pdfmark PDFMARKCODE
+'\"
+.ds pdfmarks
+.if d pdfmarks \{\
+.de pdfmark
+. specialps exec [\\$1 pdfmark
+..
+'\"
+'\" pdfdest LINKNAME
+'\"
+.de pdfdest
+.pdfmark "/Dest /\\$1 /View [/XYZ -5 PL null] /DEST"
+..
+'\"
+'\" pdfbookmark COUNT LINKNAME STRING
+'\"
+.de pdfbookmark
+. pdfmark "/View [/XYZ 44 730 1.0] /Count \\$1 /Dest /\\$2 /Title (\\$3) /OUT"
+..
+'\"
+'\" Define the SH and SS macros to save pdfmark information
+'\" in "arrays" of numbers and strings.
+'\"
+.if !r rr_n \{\
+.nr rr_n 0 1
+.am SH
+. nr rr_levels!\\n+[rr_n] 2
+. ds rr_labels!\\n[rr_n] \\$*
+. pdfdest Link\\n[rr_n]
+..
+.am SS
+. nr rr_levels!\\n+[rr_n] 3
+. ds rr_labels!\\n[rr_n] \\$*
+. pdfdest Link\\n[rr_n]
+..
+.\}
+'\"
+'\" Called at the end of the document to generate the pdfmark outline
+'\"
+.de pdf_outline
+.nr rr_levels!\\n+[rr_n] 1
+.nr rr_i 0 1
+.while \\n+[rr_i]<\\n[rr_n] \{\
+. nr rr_ip1 \\n[rr_i]+1
+. nr rr_count 0
+. if \\n[rr_levels!\\n[rr_ip1]]>\\n[rr_levels!\\n[rr_i]] \{\
+. nr rr_j \\n[rr_i] 1
+. while \\n+[rr_j]<\\n[rr_n] \{\
+. if \\n[rr_levels!\\n[rr_j]]<=\\n[rr_levels!\\n[rr_i]] \{\
+. break
+. \}
+. if \\n[rr_levels!\\n[rr_j]]==(\\n[rr_levels!\\n[rr_i]]+1) \{\
+. nr rr_count \\n[rr_count]+1
+. \}
+. \}
+. \}
+. ds hhh \\*[rr_labels!\\n[rr_i]]
+. pdfbookmark \\n[rr_count] Link\\n[rr_i] "\\*[hhh]"
+.\}
+..
+'\"
+'\" Some postscript to make pdfmarks harmless on old interpreters...
+'\"
+.specialps "def /pdfmark where {pop} {userdict /pdfmark /cleartomark load put} ifelse"
+'\"
+'\" Force display of Bookmarks in Acrobat when document is viewed.
+'\"
+.pdfmark "[/PageMode /UseOutlines /Page 1 /View [/XYZ null null null] /DOCVIEW"
+'\"
+'\" Output the document info in pdfmarks
+'\"
+.pdfmark "\
+ /Title (\*[an-title](\*[an-section])) \
+ /Subject (foo2xqx Manual Page) \
+ /Author (Rick Richardson) \
+ /Keywords (printing, ZjStream) \
+ /Creator (groff \n(.x.\n(.y.\n(.Y -man) \
+ /CreationDate (\*[an-extra1]) \
+ /ModDate (\*[an-extra1]) \
+ /DOCINFO"
+\}
+'\"
+'\" The manual page name is only 1st level mark
+'\"
+.nr rr_levels!\n+[rr_n] 1
+.ds rr_labels!\n[rr_n] \*[an-title](\*[an-section])
+.pdfdest Link\n[rr_n]
+'\"==========================================================================
+'\" MANUAL PAGE SOURCE
+'\"==========================================================================
+.SH NAME
+foo2xqx \- Convert Ghostscript pbmraw into a
+XQX printer stream
+.SH SYNOPSIS
+.B foo2xqx
+.RI [ options "] <" pbmraw-file " >" xqx-file
+.SH DESCRIPTION
+.B foo2xqx
+converts Ghostscript pbmraw to monochrome
+XQX streams,
+for driving the HP LaserJet M1005 MFP
+and other XQX-based printers.
+
+.SH COMMAND LINE OPTIONS
+.SS Normal Options
+These are the options used to select the parameters of a
+print job that are usually controlled on a per job basis.
+.TP
+.BI \-d\0 duplex
+Duplex code to send to printer [1].
+.TS
+| n l | n l | n l .
+1 off 2 long edge 3 short edge
+.TE
+.TP
+.BI \-g\0 xpix x ypix
+Set page dimensions in pixels [10200x6600].
+.TP
+.BI \-m\0 media
+Media code to send to printer [1].
+.TS
+l l l
+l n n.
+_
+Media M1005
+_
+standard 1
+transparency 2
+envelope 257
+letterhead 259
+thick 261
+postcard 262
+labels 263
+.TE
+.TP
+.BI \-p\0 paper
+Paper code to send to printer [1].
+.TS
+| n l | n l.
+1 letter 9 A4
+5 legal 11 A5
+7 executive 13 B5
+20 env #10 27 env DL
+28 env C5 34 env B5
+37 env Monarch
+.TE
+.TP
+.BI \-n\0 copies
+Number of copies [1].
+.TP
+.BI \-r\0 xres x yres
+Set device resolution in pixels/inch [1200x600].
+.TP
+.BI \-s\0 source
+Source (InputSlot) code to send to printer [7].
+.TS
+| n l | n l.
+1 upper 4 manual
+2 lower 7 auto
+.TE
+.TP
+.BI \-t
+Draft mode. Every other pixel is white.
+.TP
+.BI \-J\0 filename
+Filename string to send to printer.
+.TP
+.BI \-U\0 username
+Username string to send to printer.
+.SS Printer Tweaking Options
+These are the options used to customize the operation of \fBfoo2xqx\fP
+for a particular printer.
+.TP
+.BI \-u\0 xoff x yoff
+Set the offset of the start of the printable region from the
+upper left corner, in pixels [0x0].
+.TP
+.BI \-l\0 xoff x yoff
+Set the offset of the end of the printable region from the
+lower right corner, in pixels [0x0].
+.TP
+.BI \-L\0 mask
+Send logical clipping amounts implied by -u/-l in the ZjStream [3].
+.TS
+l l.
+0 don't send any logical clipping amounts
+1 only send Y clipping amount
+2 only send X clipping amount
+3 send both X and Y clipping amounts
+.TE
+.TP
+.BI \-A
+AllIsBlack: convert C=1,M=1,Y=1 to just K=1. Works with bitcmyk input only.
+.TP
+.BI \-B
+BlackClears: K=1 forces C,M,Y to 0. Works with bitcmyk input only.
+.SS Debugging Options
+These options are used for debugging \fBfoo2xqx\fP.
+.TP
+.BI \-S\0 plane
+Output just a single color plane from a color print and print it
+on the black plane. The default is to output all color planes.
+.TS
+l l.
+1 Cyan
+2 Magenta
+3 Yellow
+4 Black
+.TE
+.TP
+.BI \-D\0 level
+Set Debug level [0].
+
+.SH EXAMPLES
+Create a black and white XQX stream:
+
+.RS
+.nf
+gs -q -dBATCH -dSAFER -dQUIET -dNOPAUSE \
+ -sPAPERSIZE=letter -r1200x600 -sDEVICE=pbmraw \
+ -sOutputFile=- - < testpage.ps \
+| foo2xqx -r1200x600 -g10200x6600 -p1 >testpage.zm
+.fi
+.RE
+
+.SH FILES
+.BR /usr/bin/foo2xqx
+.SH SEE ALSO
+.BR foo2xqx-wrapper (1),
+.BR xqxdecode (1)
+.SH "AUTHOR"
+Rick Richardson <rick.richardson@comcast.net>
+.br
+${URLXQX}/
+'/"
+'/"
+'/"
+.em pdf_outline
diff --git a/foo2xqx.c b/foo2xqx.c
new file mode 100644
index 0000000..32cefe3
--- /dev/null
+++ b/foo2xqx.c
@@ -0,0 +1,1483 @@
+/*
+
+GENERAL
+This program converts pbm (B/W) images and 1-bit-per-pixel cmyk images
+(both produced by ghostscript) to Zenographics ZJ-stream format. There
+is some information about the ZJS format at http://ddk.zeno.com.
+
+With this utility, you can print to some HP and Minolta/QMS printers,
+such as these:
+ - Minolta/QMS 2300 DL B/W and color
+ - Minolta/QMS 2200 DL B/W and color
+ - Minolta/QMS 2430 DL B/W and color
+ - HP LaserJet 1000 B/W
+ - HP LaserJet 1005 B/W
+ - HP LaserJet 1018 B/W
+ - HP LaserJet 1020 B/W
+
+AUTHORS
+This program began life as Robert Szalai's 'pbmtozjs' program. It
+also uses Markus Kuhn's jbig-kit compression library (included, but
+also available at http://www.cl.cam.ac.uk/~mgk25/jbigkit/).
+
+The program was overhauled by Rick Richardson to limit data chunk size
+to 65536 bytes, add command line options, add color support for the
+Minolta/QMS 2300DL, and other miscellaneous features.
+
+You can contact the current author at mailto:rick.richardson@comcast.net
+
+LICENSE
+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.
+
+If you want to use this program under different license conditions,
+then contact the author for an arrangement.
+
+It is possible that certain products which can be built using the jbig
+software module might form inventions protected by patent rights in
+some countries (e.g., by patents about arithmetic coding algorithms
+owned by IBM and AT&T in the USA). Provision of this software by the
+author does NOT include any licenses for any patents. In those
+countries where a patent license is required for certain applications
+of this software module, you will have to obtain such a license
+yourself.
+
+*/
+
+static char Version[] = "$Id: foo2xqx.c,v 1.14 2006/12/07 13:24:31 rick Exp $";
+
+#include <stdio.h>
+#include <stdlib.h>
+#include <ctype.h>
+#include <string.h>
+#include <unistd.h>
+#include <stdarg.h>
+#include <time.h>
+#include "jbig.h"
+#include "xqx.h"
+
+/*
+ * Command line options
+ */
+int Debug = 0;
+int ResX = 600;
+int ResY = 600;
+int Bpp = 1;
+int PaperCode = DMPAPER_LETTER;
+int PageWidth = 1200 * 8.5;
+int PageHeight = 600 * 11;
+int UpperLeftX = 0;
+int UpperLeftY = 0;
+int LowerRightX = 0;
+int LowerRightY = 0;
+int Copies = 1;
+int Duplex = DMDUPLEX_OFF;
+int SourceCode = DMBIN_AUTO;
+int MediaCode = DMMEDIA_PLAIN;
+char *Username = NULL;
+char *Filename = NULL;
+int Mode = 0;
+ #define MODE_MONO 1
+ #define MODE_COLOR 2
+
+int Color2Mono = 0;
+int BlackClears = 0;
+int AllIsBlack = 0;
+int OutputStartPlane = 1;
+int ExtraPad = 16;
+
+int LogicalOffsetX = 0;
+int LogicalOffsetY = 0;
+
+#define LOGICAL_CLIP_X 2
+#define LOGICAL_CLIP_Y 1
+int LogicalClip = LOGICAL_CLIP_X | LOGICAL_CLIP_Y;
+int SaveToner = 0;
+int PageNum = 0;
+int RealWidth;
+int EconoMode = 0;
+
+FILE *EvenPages = NULL;
+typedef struct
+{
+ off_t b, e, pause;
+} SEEKREC;
+SEEKREC SeekRec[2000];
+int SeekIndex = 0;
+int DuplexPause = 0;
+
+long JbgOptions[5] =
+{
+ /* Order */
+ JBG_ILEAVE | JBG_SMID,
+ /* Options */
+ JBG_DELAY_AT | JBG_LRLTWO | JBG_TPDON | JBG_TPBON | JBG_DPON,
+ /* L0 */
+ 128,
+ /* MX */
+ 16,
+ /* MY */
+ 0
+};
+
+void
+usage(void)
+{
+ fprintf(stderr,
+"Usage:\n"
+" foo2zjs [options] <pbmraw-file >zjs-file\n"
+"\n"
+" Convert Ghostscript pbmraw format to a monochrome ZJS stream,\n"
+" for driving the Minolta/QMS 2300 DL network color laser printer\n"
+" and other Zenographics-based black and white printers.\n"
+"\n"
+" gs -q -dBATCH -dSAFER -dQUIET -dNOPAUSE \\ \n"
+" -sPAPERSIZE=letter -r1200x600 -sDEVICE=pbmraw \\ \n"
+" -sOutputFile=- - < testpage.ps \\ \n"
+" | foo2zjs -r1200x600 -g10200x6600 -p1 >testpage.zm\n"
+"\n"
+" foo2zjs [options] <bitcmyk-file >zjs-file\n"
+" foo2zjs [options] <pksmraw-file >zjs-file\n"
+"\n"
+" Convert Ghostscript bitcmyk or pksmraw format to a color ZJS stream,\n"
+" for driving the Minolta/QMS 2300 DL network color laser printer\n"
+" N.B. Color correction is expected to be performed by ghostscript.\n"
+"\n"
+" gs -q -dBATCH -dSAFER -dQUIET -dNOPAUSE \\ \n"
+" -sPAPERSIZE=letter -g10200x6600 -r1200x600 -sDEVICE=bitcmyk \\ \n"
+" -sOutputFile=- - < testpage.ps \\ \n"
+" | foo2zjs -r1200x600 -g10200x6600 -p1 >testpage.zc\n"
+"\n"
+"Normal Options:\n"
+"-c Force color mode if autodetect doesn't work\n"
+"-d duplex Duplex code to send to printer [%d]\n"
+" 1=off, 2=longedge, 3=shortedge\n"
+"-g <xpix>x<ypix> Set page dimensions in pixels [%dx%d]\n"
+"-m media Media code to send to printer [%d]\n"
+" 1=standard 2=transparency 3=glossy 257=envelope\n"
+" 259=letterhead 261=thickstock 262=postcard 263=labels\n"
+"-p paper Paper code to send to printer [%d]\n"
+" 1=letter, 5=legal 7=executive 9=A4 11=A5 13=B5\n"
+" 20=env#10, 27=envDL 28=envC5 34=envB5 37=envMonarch\n"
+"-n copies Number of copies [%d]\n"
+"-r <xres>x<yres> Set device resolution in pixels/inch [%dx%d]\n"
+"-s source Source code to send to printer [%d]\n"
+" 1=upper 2=lower 4=manual 7=auto\n"
+" Code numbers may vary with printer model\n"
+"-t Draft mode. Every other pixel is white.\n"
+"-J filename Filename string to send to printer [%s]\n"
+"-U username Username string to send to printer [%s]\n"
+"\n"
+"Printer Tweaking Options:\n"
+"-u <xoff>x<yoff> Set offset of upper left printable in pixels [%dx%d]\n"
+"-l <xoff>x<yoff> Set offset of lower right printable in pixels [%dx%d]\n"
+"-L mask Send logical clipping values from -u/-l in ZjStream [%d]\n"
+" 0=no, 1=Y, 2=X, 3=XY\n"
+"-A AllIsBlack: convert C=1,M=1,Y=1 to just K=1\n"
+"-B BlackClears: K=1 forces C,M,Y to 0\n"
+" -A, -B work with bitcmyk input only\n"
+"-P Do not output START_PLANE codes. May be needed by some\n"
+" some black and white only printers.\n"
+"-X padlen Add extra zero padding to the end of BID segments [%d]\n"
+"\n"
+"Debugging Options:\n"
+"-S plane Output just a single color plane from a color print [all]\n"
+" 1=Cyan, 2=Magenta, 3=Yellow, 4=Black\n"
+"-D lvl Set Debug level [%d]\n"
+"-V Version %s\n"
+ , Duplex
+ , PageWidth , PageHeight
+ , MediaCode
+ , PaperCode
+ , Copies
+ , ResX , ResY
+ , SourceCode
+ , Filename ? Filename : ""
+ , Username ? Username : ""
+ , UpperLeftX , UpperLeftY
+ , LowerRightX , LowerRightY
+ , LogicalClip
+ , ExtraPad
+ , Debug
+ , Version
+ );
+
+ exit(1);
+}
+
+/*
+ * Mirror1: bits 01234567 become 76543210
+ */
+unsigned char Mirror1[256] =
+{
+ 0,128, 64,192, 32,160, 96,224, 16,144, 80,208, 48,176,112,240,
+ 8,136, 72,200, 40,168,104,232, 24,152, 88,216, 56,184,120,248,
+ 4,132, 68,196, 36,164,100,228, 20,148, 84,212, 52,180,116,244,
+ 12,140, 76,204, 44,172,108,236, 28,156, 92,220, 60,188,124,252,
+ 2,130, 66,194, 34,162, 98,226, 18,146, 82,210, 50,178,114,242,
+ 10,138, 74,202, 42,170,106,234, 26,154, 90,218, 58,186,122,250,
+ 6,134, 70,198, 38,166,102,230, 22,150, 86,214, 54,182,118,246,
+ 14,142, 78,206, 46,174,110,238, 30,158, 94,222, 62,190,126,254,
+ 1,129, 65,193, 33,161, 97,225, 17,145, 81,209, 49,177,113,241,
+ 9,137, 73,201, 41,169,105,233, 25,153, 89,217, 57,185,121,249,
+ 5,133, 69,197, 37,165,101,229, 21,149, 85,213, 53,181,117,245,
+ 13,141, 77,205, 45,173,109,237, 29,157, 93,221, 61,189,125,253,
+ 3,131, 67,195, 35,163, 99,227, 19,147, 83,211, 51,179,115,243,
+ 11,139, 75,203, 43,171,107,235, 27,155, 91,219, 59,187,123,251,
+ 7,135, 71,199, 39,167,103,231, 23,151, 87,215, 55,183,119,247,
+ 15,143, 79,207, 47,175,111,239, 31,159, 95,223, 63,191,127,255,
+};
+
+/*
+ * Mirror2: bits 01234567 become 67452301
+ */
+unsigned char Mirror2[256] =
+{
+ 0, 64,128,192, 16, 80,144,208, 32, 96,160,224, 48,112,176,240,
+ 4, 68,132,196, 20, 84,148,212, 36,100,164,228, 52,116,180,244,
+ 8, 72,136,200, 24, 88,152,216, 40,104,168,232, 56,120,184,248,
+ 12, 76,140,204, 28, 92,156,220, 44,108,172,236, 60,124,188,252,
+ 1, 65,129,193, 17, 81,145,209, 33, 97,161,225, 49,113,177,241,
+ 5, 69,133,197, 21, 85,149,213, 37,101,165,229, 53,117,181,245,
+ 9, 73,137,201, 25, 89,153,217, 41,105,169,233, 57,121,185,249,
+ 13, 77,141,205, 29, 93,157,221, 45,109,173,237, 61,125,189,253,
+ 2, 66,130,194, 18, 82,146,210, 34, 98,162,226, 50,114,178,242,
+ 6, 70,134,198, 22, 86,150,214, 38,102,166,230, 54,118,182,246,
+ 10, 74,138,202, 26, 90,154,218, 42,106,170,234, 58,122,186,250,
+ 14, 78,142,206, 30, 94,158,222, 46,110,174,238, 62,126,190,254,
+ 3, 67,131,195, 19, 83,147,211, 35, 99,163,227, 51,115,179,243,
+ 7, 71,135,199, 23, 87,151,215, 39,103,167,231, 55,119,183,247,
+ 11, 75,139,203, 27, 91,155,219, 43,107,171,235, 59,123,187,251,
+ 15, 79,143,207, 31, 95,159,223, 47,111,175,239, 63,127,191,255,
+};
+
+/*
+ * Mirror4: bits 01234567 become 45670123
+ */
+unsigned char Mirror4[256] =
+{
+ 0, 16, 32, 48, 64, 80, 96,112,128,144,160,176,192,208,224,240,
+ 1, 17, 33, 49, 65, 81, 97,113,129,145,161,177,193,209,225,241,
+ 2, 18, 34, 50, 66, 82, 98,114,130,146,162,178,194,210,226,242,
+ 3, 19, 35, 51, 67, 83, 99,115,131,147,163,179,195,211,227,243,
+ 4, 20, 36, 52, 68, 84,100,116,132,148,164,180,196,212,228,244,
+ 5, 21, 37, 53, 69, 85,101,117,133,149,165,181,197,213,229,245,
+ 6, 22, 38, 54, 70, 86,102,118,134,150,166,182,198,214,230,246,
+ 7, 23, 39, 55, 71, 87,103,119,135,151,167,183,199,215,231,247,
+ 8, 24, 40, 56, 72, 88,104,120,136,152,168,184,200,216,232,248,
+ 9, 25, 41, 57, 73, 89,105,121,137,153,169,185,201,217,233,249,
+ 10, 26, 42, 58, 74, 90,106,122,138,154,170,186,202,218,234,250,
+ 11, 27, 43, 59, 75, 91,107,123,139,155,171,187,203,219,235,251,
+ 12, 28, 44, 60, 76, 92,108,124,140,156,172,188,204,220,236,252,
+ 13, 29, 45, 61, 77, 93,109,125,141,157,173,189,205,221,237,253,
+ 14, 30, 46, 62, 78, 94,110,126,142,158,174,190,206,222,238,254,
+ 15, 31, 47, 63, 79, 95,111,127,143,159,175,191,207,223,239,255,
+};
+
+void
+rotate_bytes_180(unsigned char *sp, unsigned char *ep, unsigned char *mirror)
+{
+ unsigned char tmp;
+
+ while (sp < ep)
+ {
+ tmp = mirror[*sp];
+ *sp = mirror[*ep];
+ *ep = tmp;
+ ++sp;
+ --ep;
+ }
+ if (sp == ep)
+ *sp = mirror[*sp];
+}
+
+void
+debug(int level, char *fmt, ...)
+{
+ va_list ap;
+
+ if (Debug < level)
+ return;
+
+ setvbuf(stderr, (char *) NULL, _IOLBF, BUFSIZ);
+ va_start(ap, fmt);
+ vfprintf(stderr, fmt, ap);
+ va_end(ap);
+}
+
+void
+error(int fatal, char *fmt, ...)
+{
+ va_list ap;
+
+ va_start(ap, fmt);
+ vfprintf(stderr, fmt, ap);
+ va_end(ap);
+
+ if (fatal)
+ exit(fatal);
+}
+
+static void
+chunk_write(unsigned long type, unsigned long items, FILE *fp)
+{
+ XQX_HEADER chunk;
+
+ chunk.type = be32(type);
+ chunk.items = be32(items);
+ fwrite(&chunk, 1, sizeof(XQX_HEADER), fp);
+}
+
+static void
+item_uint32_write(unsigned long item, unsigned long value, FILE *fp)
+{
+ XQX_ITEM_UINT32 item_uint32;
+
+ item_uint32.header.type = be32(item);
+ item_uint32.header.size = be32(sizeof(DWORD));
+ item_uint32.value = be32(value);
+ fwrite(&item_uint32, 1, sizeof(XQX_ITEM_UINT32), fp);
+}
+
+static void
+item_bytelut_write(unsigned long item, unsigned long len, BYTE *buf, FILE *fp)
+{
+ XQX_ITEM_HEADER header;
+
+ header.type = be32(item);
+ header.size = be32(len);
+ fwrite(&header, 1, sizeof(XQX_ITEM_HEADER), fp);
+ fwrite(buf, 1, len, fp);
+}
+
+/*
+ * A linked list of compressed data
+ */
+typedef struct _BIE_CHAIN{
+ unsigned char *data;
+ size_t len;
+ struct _BIE_CHAIN *next;
+} BIE_CHAIN;
+
+void
+free_chain(BIE_CHAIN *chain)
+{
+ BIE_CHAIN *next;
+ next = chain;
+ while ((chain = next))
+ {
+ next = chain->next;
+ if (chain->data)
+ free(chain->data);
+ free(chain);
+ }
+}
+
+int
+write_plane(int planeNum, BIE_CHAIN **root, FILE *fp)
+{
+ BIE_CHAIN *current = *root;
+ BIE_CHAIN *next;
+ int len;
+ int first;
+ BYTE *bih;
+
+ debug(3, "Write Plane %d\n", planeNum);
+
+ /* error handling */
+ if (!current)
+ error(1,"There is no JBIG!\n");
+ if (!current->next)
+ error(1,"There is no or wrong JBIG header!\n");
+ if (current->len != 20)
+ error(1,"wrong BIH length\n");
+
+ bih = current->data;
+ first = 1;
+ for (current = *root; current && current->len; current = current->next)
+ {
+ if (current == *root)
+ {
+ }
+ else
+ {
+ len = current->len;
+ next = current->next;
+
+ chunk_write(XQX_START_PLANE, 4, fp);
+ item_uint32_write(0x80000000, first ? 64 : 48, fp);
+ item_uint32_write(0x40000000, 0, fp);
+ if (first)
+ item_bytelut_write(XQXI_BIH, 20, bih, fp);
+ else
+ item_uint32_write(0x40000003, 1, fp);
+ item_uint32_write(XQXI_END, 0xdeadbeef, fp);
+
+ chunk_write(XQX_JBIG, len, fp);
+ fwrite(current->data, 1, len, fp);
+
+ chunk_write(XQX_END_PLANE, 0, fp);
+ first = 0;
+ }
+ }
+
+ free_chain(*root);
+
+ return 0;
+}
+
+void
+start_page(BIE_CHAIN **root, int nbie, FILE *ofp)
+{
+ BIE_CHAIN *current = *root;
+ unsigned long w, h;
+ int nitems;
+ int pause = 0;
+
+ /* error handling */
+ if (!current)
+ error(1, "There is no JBIG!\n");
+ if (!current->next)
+ error(1, "There is no or wrong JBIG header!\n");
+ if (current->len != 20 )
+ error(1,"wrong BIH length\n");
+
+ /* startpage, jbig_bih, jbig_bid, jbig_end, endpage */
+ w = (((long) current->data[ 4] << 24)
+ | ((long) current->data[ 5] << 16)
+ | ((long) current->data[ 6] << 8)
+ | (long) current->data[ 7]);
+ h = (((long) current->data[ 8] << 24)
+ | ((long) current->data[ 9] << 16)
+ | ((long) current->data[10] << 8)
+ | (long) current->data[11]);
+
+ nitems = 15;
+ if (Duplex != DMDUPLEX_OFF)
+ ++nitems;
+ pause = (PageNum == 1) ? 0 : 1;
+
+ chunk_write(XQX_START_PAGE, nitems, ofp);
+ item_uint32_write(0x80000000, (Duplex == DMDUPLEX_OFF) ? 180 : 192, ofp);
+ item_uint32_write(0x20000005, 1, ofp);
+ item_uint32_write(XQXI_DMDEFAULTSOURCE, SourceCode, ofp);
+ item_uint32_write(XQXI_DMMEDIATYPE, MediaCode, ofp);
+ item_uint32_write(0x20000007, 1, ofp);
+
+ item_uint32_write(XQXI_RESOLUTION_X, ResX, ofp);
+ item_uint32_write(XQXI_RESOLUTION_Y, ResY, ofp);
+ item_uint32_write(XQXI_RASTER_X, w, ofp);
+ item_uint32_write(XQXI_RASTER_Y, h, ofp);
+ item_uint32_write(XQXI_VIDEO_BPP, Bpp, ofp);
+
+ item_uint32_write(XQXI_VIDEO_X, RealWidth / Bpp,ofp);
+ item_uint32_write(XQXI_VIDEO_Y, h, ofp);
+ item_uint32_write(XQXI_ECONOMODE, EconoMode, ofp);
+ if (Duplex != DMDUPLEX_OFF)
+ {
+ item_uint32_write(XQXI_DUPLEX_PAUSE, pause, ofp);
+ if ((PageNum & 1) == 0 && EvenPages)
+ {
+ debug(1, "EvenPage: page %d seekindex %d\n", PageNum, SeekIndex);
+ SeekRec[SeekIndex].pause = ftell(EvenPages) - 4;
+ }
+ }
+ item_uint32_write(XQXI_DMPAPER, PaperCode, ofp);
+ item_uint32_write(XQXI_END, 0xdeadbeef, ofp);
+}
+
+void
+end_page(FILE *ofp)
+{
+ chunk_write(XQX_END_PAGE, 0, ofp);
+}
+
+int
+write_page(BIE_CHAIN **root, BIE_CHAIN **root2,
+ BIE_CHAIN **root3, BIE_CHAIN **root4, FILE *ofp)
+{
+ int nbie = root2 ? 4 : 1;
+
+ start_page(root, nbie, ofp);
+
+ if (root3)
+ write_plane(3, root3, ofp);
+ if (root2)
+ write_plane(2, root2, ofp);
+ if (root)
+ {
+ if (OutputStartPlane)
+ write_plane(nbie == 1 ? 4 : 1, root, ofp);
+ else
+ write_plane(nbie == 1 ? 0 : 1, root, ofp);
+ }
+ if (root4)
+ write_plane(4, root4, ofp);
+
+ end_page(ofp);
+ return 0;
+}
+
+/*
+ * This creates a linked list of compressed data. The first item
+ * in the list is the BIH and is always 20 bytes in size. Each following
+ * item is 65536 bytes in length. The last item length is whatever remains.
+ */
+void
+output_jbig(unsigned char *start, size_t len, void *cbarg)
+{
+ BIE_CHAIN *current, **root = (BIE_CHAIN **) cbarg;
+ int size = 65536; // Printer does strange things otherwise.
+
+ if ( (*root) == NULL)
+ {
+ (*root) = malloc(sizeof(BIE_CHAIN));
+ if (!(*root))
+ error(1, "Can't allocate space for chain\n");
+
+ (*root)->data = NULL;
+ (*root)->next = NULL;
+ (*root)->len = 0;
+ size = 20;
+ if (len != 20)
+ error(1, "First chunk must be BIH and 20 bytes long\n");
+ }
+
+ current = *root;
+ while (current->next)
+ current = current->next;
+
+ while (len > 0)
+ {
+ int amt, left;
+
+ if (!current->data)
+ {
+ current->data = malloc(size);
+ if (!current->data)
+ error(1, "Can't allocate space for compressed data\n");
+ }
+
+ left = size - current->len;
+ amt = (len > left) ? left : len;
+ memcpy(current->data + current->len, start, amt);
+ current->len += amt;
+ len -= amt;
+ start += amt;
+
+ if (current->len == size)
+ {
+ current->next = malloc(sizeof(BIE_CHAIN));
+ if (!current->next)
+ error(1, "Can't allocate space for chain\n");
+ current = current->next;
+ current->data = NULL;
+ current->next = NULL;
+ current->len = 0;
+ }
+ }
+}
+
+void
+start_doc(FILE *fp)
+{
+ char header[4] = ",XQX"; // Big-endian data
+ int nitems;
+ time_t now;
+ struct tm *tmp;
+ char datetime[14+1];
+
+ now = time(NULL);
+ tmp = localtime(&now);
+ strftime(datetime, sizeof(datetime), "%Y%m%d%H%M%S", tmp);
+
+ fprintf(fp, "\033%%-12345X@PJL JOB\n");
+ fprintf(fp, "@PJL SET JAMRECOVERY=OFF\n");
+ fprintf(fp, "@PJL SET DENSITY=3\n");
+ fprintf(fp, "@PJL SET ECONOMODE=OFF\n");
+ fprintf(fp, "@PJL SET RET=MEDIUM\n");
+ fprintf(fp, "@PJL INFO STATUS\n");
+ fprintf(fp, "@PJL USTATUS DEVICE = ON\n");
+ fprintf(fp, "@PJL USTATUS JOB = ON\n");
+ fprintf(fp, "@PJL USTATUS PAGE = ON\n");
+ fprintf(fp, "@PJL USTATUS TIMED = 30\n");
+ fprintf(fp, "@PJL SET JOBATTR=\"JobAttr4=%s\"", datetime);
+ fputc(0, fp);
+ fprintf(fp, "\033%%-12345X");
+ fwrite(header, 1, sizeof(header), fp);
+
+ nitems = 7;
+
+ chunk_write(XQX_START_DOC, nitems, fp);
+
+ item_uint32_write(0x80000000, 84, fp);
+ item_uint32_write(0x10000005, 1, fp);
+ item_uint32_write(0x10000001, 0, fp);
+ item_uint32_write(XQXI_DMDUPLEX, (Duplex != DMDUPLEX_OFF)
+ ? 2 : 0, fp);
+ item_uint32_write(0x10000000, 0, fp);
+ item_uint32_write(0x10000003, 1, fp);
+ item_uint32_write(XQXI_END, 0xdeadbeef, fp);
+}
+
+void
+end_doc(FILE *fp)
+{
+ int nitems;
+
+ nitems = 0;
+ chunk_write(XQX_END_DOC , nitems, fp);
+
+ fprintf(fp, "\033%%-12345X@PJL EOJ\n");
+ fprintf(fp, "\033%%-12345X");
+}
+
+static int AnyColor;
+
+void
+cmyk_planes(unsigned char *plane[4], unsigned char *raw, int w, int h)
+{
+ int rawbpl = (w+1) / 2;
+ int bpl = (w + 7) / 8;
+ int i;
+ int x, y;
+ unsigned char byte;
+ unsigned char mask[8] = { 128, 64, 32, 16, 8, 4, 2, 1 };
+ int aib = AllIsBlack;
+ int bc = BlackClears;
+
+ AnyColor = 0;
+ for (i = 0; i < 4; ++i)
+ memset(plane[i], 0, bpl * h);
+
+ //
+ // Unpack the combined plane into individual color planes
+ //
+ // TODO: this can be speeded up using a 256 or 65536 entry lookup table
+ //
+ for (y = 0; y < h; ++y)
+ {
+ for (x = 0; x < w; ++x)
+ {
+ byte = raw[y*rawbpl + x/2];
+
+ if (aib && (byte & 0xE0) == 0xE0)
+ {
+ plane[3][y*bpl + x/8] |= mask[x&7];
+ }
+ else if (byte & 0x10)
+ {
+ plane[3][y*bpl + x/8] |= mask[x&7];
+ if (!bc)
+ {
+ if (byte & 0x80) plane[0][y*bpl + x/8] |= mask[x&7];
+ if (byte & 0x40) plane[1][y*bpl + x/8] |= mask[x&7];
+ if (byte & 0x20) plane[2][y*bpl + x/8] |= mask[x&7];
+ if (byte & 0xE0) AnyColor |= byte;
+ }
+ }
+ else
+ {
+ if (byte & 0x80) plane[0][y*bpl + x/8] |= mask[x&7];
+ if (byte & 0x40) plane[1][y*bpl + x/8] |= mask[x&7];
+ if (byte & 0x20) plane[2][y*bpl + x/8] |= mask[x&7];
+ if (byte & 0xE0) AnyColor |= byte;
+ }
+
+ ++x;
+ if (aib && (byte & 0x0E) == 0x0E)
+ {
+ plane[3][y*bpl + x/8] |= mask[x&7];
+ }
+ else if (byte & 0x1)
+ {
+ plane[3][y*bpl + x/8] |= mask[x&7];
+ if (!bc)
+ {
+ if (byte & 0x8) plane[0][y*bpl + x/8] |= mask[x&7];
+ if (byte & 0x4) plane[1][y*bpl + x/8] |= mask[x&7];
+ if (byte & 0x2) plane[2][y*bpl + x/8] |= mask[x&7];
+ if (byte & 0xE) AnyColor |= byte;
+ }
+ }
+ else
+ {
+ if (byte & 0x8) plane[0][y*bpl + x/8] |= mask[x&7];
+ if (byte & 0x4) plane[1][y*bpl + x/8] |= mask[x&7];
+ if (byte & 0x2) plane[2][y*bpl + x/8] |= mask[x&7];
+ if (byte & 0xE) AnyColor |= byte;
+ }
+ }
+ }
+ debug(2, "BlackClears = %d; AnyColor = %s %s %s\n",
+ BlackClears,
+ (AnyColor & 0x88) ? "Cyan" : "",
+ (AnyColor & 0x44) ? "Magenta" : "",
+ (AnyColor & 0x22) ? "Yellow" : ""
+ );
+}
+
+int
+cmyk_page(unsigned char *raw, int w, int h, FILE *ofp)
+{
+ BIE_CHAIN *chain[4];
+ int i;
+ int bpl = (w + 7) / 8;
+ unsigned char *plane[4], *bitmaps[4][1];
+ struct jbg_enc_state se[4];
+
+ RealWidth = w;
+ for (i = 0; i < 4; ++i)
+ {
+ plane[i] = malloc(bpl * h);
+ if (!plane[i]) error(3, "Cannot allocate space for bit plane\n");
+ chain[i] = NULL;
+ }
+
+ cmyk_planes(plane, raw, w, h);
+ for (i = 0; i < 4; ++i)
+ {
+ if (Debug >= 9)
+ {
+ FILE *dfp;
+ char fname[256];
+ sprintf(fname, "xxxplane%d", i);
+ dfp = fopen(fname, "w");
+ if (dfp)
+ {
+ fwrite(plane[i], bpl*h, 1, dfp);
+ fclose(dfp);
+ }
+ }
+
+ *bitmaps[i] = plane[i];
+
+ jbg_enc_init(&se[i], w, h, 1, bitmaps[i], output_jbig, &chain[i]);
+ jbg_enc_options(&se[i], JbgOptions[0], JbgOptions[1],
+ JbgOptions[2], JbgOptions[3], JbgOptions[4]);
+ jbg_enc_out(&se[i]);
+ jbg_enc_free(&se[i]);
+ }
+
+ if (Color2Mono)
+ write_page(&chain[Color2Mono-1], NULL, NULL, NULL, ofp);
+ else if (AnyColor)
+ write_page(&chain[0], &chain[1], &chain[2], &chain[3], ofp);
+ else
+ write_page(&chain[3], NULL, NULL, NULL, ofp);
+
+ for (i = 0; i < 4; ++i)
+ free(plane[i]);
+ return 0;
+}
+
+int
+pksm_page(unsigned char *plane[4], int w, int h, FILE *ofp)
+{
+ BIE_CHAIN *chain[4];
+ int i;
+ unsigned char *bitmaps[4][1];
+ struct jbg_enc_state se[4];
+
+ RealWidth = w;
+ for (i = 0; i < 4; ++i)
+ chain[i] = NULL;
+
+ for (i = 0; i < 4; ++i)
+ {
+ *bitmaps[i] = plane[i];
+
+ jbg_enc_init(&se[i], w, h, 1, bitmaps[i], output_jbig, &chain[i]);
+ jbg_enc_options(&se[i], JbgOptions[0], JbgOptions[1],
+ JbgOptions[2], JbgOptions[3], JbgOptions[4]);
+ jbg_enc_out(&se[i]);
+ jbg_enc_free(&se[i]);
+ }
+
+ if (Color2Mono)
+ write_page(&chain[Color2Mono-1], NULL, NULL, NULL, ofp);
+ else if (AnyColor)
+ write_page(&chain[0], &chain[1], &chain[2], &chain[3], ofp);
+ else
+ write_page(&chain[3], NULL, NULL, NULL, ofp);
+
+ return 0;
+}
+
+int
+pbm_page(unsigned char *buf, int w, int h, FILE *ofp)
+{
+ BIE_CHAIN *chain = NULL;
+ unsigned char *bitmaps[1];
+ struct jbg_enc_state se;
+
+ RealWidth = w;
+ w = (w + 127) & ~127;
+
+ if (SaveToner)
+ {
+ int x, y;
+ int bpl, bpl16;
+
+ bpl = (w + 7) / 8;
+ bpl16 = (bpl + 15) & ~15;
+
+ for (y = 0; y < h; y += 2)
+ for (x = 0; x < bpl16; ++x)
+ buf[y*bpl16 + x] &= 0x55;
+ for (y = 1; y < h; y += 2)
+ for (x = 0; x < bpl16; ++x)
+ buf[y*bpl16 + x] &= 0xaa;
+ }
+
+ *bitmaps = buf;
+
+ jbg_enc_init(&se, w, h, 1, bitmaps, output_jbig, &chain);
+ jbg_enc_options(&se, JbgOptions[0], JbgOptions[1],
+ JbgOptions[2], JbgOptions[3], JbgOptions[4]);
+ jbg_enc_out(&se);
+ jbg_enc_free(&se);
+
+ write_page(&chain, NULL, NULL, NULL, ofp);
+
+ return 0;
+}
+
+int
+read_and_clip_image(unsigned char *buf,
+ int rawBpl, int rightBpl, int pixelsPerByte,
+ int bpl, int h, int bpl16, FILE *ifp)
+{
+ unsigned char *rowbuf, *rowp;
+ int y;
+ int rc;
+
+ rowbuf = malloc(rawBpl);
+ if (!rowbuf)
+ error(1, "Can't allocate row buffer\n");
+
+ // Clip top rows
+ if (UpperLeftY)
+ {
+ for (y = 0; y < UpperLeftY; ++y)
+ {
+ rc = fread(rowbuf, rawBpl, 1, ifp);
+ if (rc == 0)
+ goto eof;
+ if (rc != 1)
+ error(1, "Premature EOF(1) on input at y=%d\n", y);
+ }
+ }
+
+ // Copy the rows that we want to image
+ rowp = buf;
+ for (y = 0; y < h; ++y, rowp += bpl16)
+ {
+ // Clip left pixel *bytes*
+ if (UpperLeftX)
+ {
+ rc = fread(rowbuf, UpperLeftX / pixelsPerByte, 1, ifp);
+ if (rc == 0 && y == 0 && !UpperLeftY)
+ goto eof;
+ if (rc != 1)
+ error(1, "Premature EOF(2) on input at y=%d\n", y);
+ }
+
+ if (bpl != bpl16)
+ memset(rowp, 0, bpl16);
+ rc = fread(rowp, bpl, 1, ifp);
+ if (rc == 0 && y == 0 && !UpperLeftY && !UpperLeftX)
+ goto eof;
+ if (rc != 1)
+ error(1, "Premature EOF(3) on input at y=%d\n", y);
+
+ // Clip right pixels
+ if (rightBpl != bpl)
+ {
+ rc = fread(rowbuf, rightBpl - bpl, 1, ifp);
+ if (rc != 1)
+ error(1, "Premature EOF(4) on input at y=%d\n", y);
+ }
+ }
+
+ // Clip bottom rows
+ if (LowerRightY)
+ {
+ for (y = 0; y < LowerRightY; ++y)
+ {
+ rc = fread(rowbuf, rawBpl, 1, ifp);
+ if (rc != 1)
+ error(1, "Premature EOF(5) on input at y=%d\n", y);
+ }
+ }
+
+ free(rowbuf);
+ return (0);
+
+eof:
+ free(rowbuf);
+ return (EOF);
+}
+
+int
+cmyk_pages(FILE *ifp, FILE *ofp)
+{
+ unsigned char *buf;
+ int rawW, rawH, rawBpl;
+ int rightBpl;
+ int w, h, bpl;
+ int rc;
+
+ //
+ // Save the original Upper Right clip values as the logical offset,
+ // because we may adjust them slightly below, in the interest of speed.
+ //
+ if (LogicalClip & LOGICAL_CLIP_X)
+ LogicalOffsetX = UpperLeftX;
+ if (LogicalClip & LOGICAL_CLIP_Y)
+ LogicalOffsetY = UpperLeftY;
+
+ rawW = PageWidth;
+ rawH = PageHeight;
+ rawBpl = (PageWidth + 1) / 2;
+
+ // We only clip multiples of 2 pixels off the leading edge, and
+ // add any remainder to the amount we clip from the right edge.
+ // Its fast, and good enough for government work.
+ LowerRightX += UpperLeftX & 1;
+ UpperLeftX &= ~1;
+
+ w = rawW - UpperLeftX - LowerRightX;
+ h = rawH - UpperLeftY - LowerRightY;
+ bpl = (w + 1) / 2;
+ rightBpl = (rawW - UpperLeftX + 1) / 2;
+
+ buf = malloc(bpl * h);
+ if (!buf)
+ error(1, "Unable to allocate page buffer of %d x %d = %d bytes\n",
+ rawW, rawH, rawBpl * rawH);
+
+ for (;;)
+ {
+ rc = read_and_clip_image(buf, rawBpl, rightBpl, 2, bpl, h, bpl, ifp);
+ if (rc == EOF)
+ goto done;
+
+ ++PageNum;
+ if (Duplex == DMDUPLEX_LONGEDGE && (PageNum & 1) == 0)
+ rotate_bytes_180(buf, buf + bpl * h - 1, Mirror4);
+ if (Duplex == DMDUPLEX_MANUALLONG && (PageNum & 1) == 0)
+ rotate_bytes_180(buf, buf + bpl * h - 1, Mirror4);
+
+ if ((PageNum & 1) == 0 && EvenPages)
+ {
+ SeekRec[SeekIndex].b = ftell(EvenPages);
+ cmyk_page(buf, w, h, EvenPages);
+ SeekRec[SeekIndex].e = ftell(EvenPages);
+ debug(1, "CMYK Page: %d %ld %ld\n",
+ PageNum, SeekRec[SeekIndex].b, SeekRec[SeekIndex].e);
+ SeekIndex++;
+ }
+ else
+ cmyk_page(buf, w, h, ofp);
+ }
+
+done:
+ free(buf);
+ return 0;
+}
+
+static unsigned long
+getint(FILE *fp)
+{
+ int c;
+ unsigned long i;
+
+ while ((c = getc(fp)) != EOF && !isdigit(c))
+ if (c == '#')
+ while ((c = getc(fp)) != EOF && !(c == 13 || c == 10)) ;
+ if (c != EOF)
+ {
+ ungetc(c, fp);
+ fscanf(fp, "%lu", &i);
+ }
+ return i;
+}
+
+static void
+skip_to_nl(FILE *fp)
+{
+ for (;;)
+ {
+ int c;
+ c = getc(fp);
+ if (c == EOF)
+ error(1, "Premature EOF on input stream\n");
+ if (c == '\n')
+ return;
+ }
+}
+
+int
+pbm_header(FILE *ifp, int *p4eatenp, int *wp, int *hp)
+{
+ int c1, c2;
+
+ if (*p4eatenp)
+ *p4eatenp = 0; // P4 already eaten in main
+ else
+ {
+ c1 = getc(ifp);
+ if (c1 == EOF)
+ return 0;
+ c2 = getc(ifp);
+ if (c1 != 'P' || c2 != '4')
+ error(1, "Not a pbmraw data stream\n");
+ }
+
+ skip_to_nl(ifp);
+
+ *wp = getint(ifp);
+ *hp = getint(ifp);
+ skip_to_nl(ifp);
+ return 1;
+}
+
+int
+pksm_pages(FILE *ifp, FILE *ofp)
+{
+ unsigned char *plane[4];
+ int rawW, rawH, rawBpl;
+ int saveW = 0, saveH = 0;
+ int rightBpl;
+ int w, h, bpl;
+ int i;
+ int rc;
+ int p4eaten = 1;
+
+ //
+ // Save the original Upper Right clip values as the logical offset,
+ // because we may adjust them slightly below, in the interest of speed.
+ //
+ if (LogicalClip & LOGICAL_CLIP_X)
+ LogicalOffsetX = UpperLeftX;
+ if (LogicalClip & LOGICAL_CLIP_Y)
+ LogicalOffsetY = UpperLeftY;
+
+ for (;;)
+ {
+ ++PageNum;
+ AnyColor = 0;
+
+ for (i = 0; i < 4; ++i)
+ {
+ if (pbm_header(ifp, &p4eaten, &rawW, &rawH) == 0)
+ {
+ if (i == 0)
+ goto eof;
+ else
+ error(1, "Premature EOF(pksm) on page %d hdr, plane %d\n",
+ PageNum, i);
+ }
+ if (i == 0)
+ {
+ saveW = rawW;
+ saveH = rawH;
+ }
+ if (saveW != rawW)
+ error(1, "Image width changed from %d to %d on plane %d\n",
+ saveW, rawW, i);
+ if (saveH != rawH)
+ error(1, "Image height changed from %d to %d on plane %d\n",
+ saveH, rawH, i);
+
+ rawBpl = (rawW + 7) / 8;
+
+ // We only clip multiples of 8 pixels off the leading edge, and
+ // add any remainder to the amount we clip from the right edge.
+ // Its fast, and good enough for government work.
+ LowerRightX += UpperLeftX & 7;
+ UpperLeftX &= ~7;
+
+ w = rawW - UpperLeftX - LowerRightX;
+ h = rawH - UpperLeftY - LowerRightY;
+ bpl = (w + 7) / 8;
+ rightBpl = (rawW - UpperLeftX + 7) / 8;
+
+ plane[i] = malloc(bpl * h);
+ if (!plane[i])
+ error(1, "Can't allocate plane buffer\n");
+
+ rc = read_and_clip_image(plane[i],
+ rawBpl, rightBpl, 8, bpl, h, bpl, ifp);
+ if (rc == EOF)
+ error(1, "Premature EOF(pksm) on page %d data, plane %d\n",
+ PageNum, i);
+
+ if (Debug >= 9)
+ {
+ FILE *dfp;
+ char fname[256];
+ sprintf(fname, "xxxplane%d", i);
+ dfp = fopen(fname, "w");
+ if (dfp)
+ {
+ fwrite(plane[i], bpl*h, 1, dfp);
+ fclose(dfp);
+ }
+ }
+
+ // See if we can optimize this to be a monochrome page
+ if (!AnyColor && i != 3)
+ {
+ unsigned char *p, *e;
+
+ for (p = plane[i], e = p + bpl*h; p < e; ++p)
+ if (*p)
+ {
+ AnyColor |= 1<<i;
+ break;
+ }
+ }
+
+ if (Duplex == DMDUPLEX_LONGEDGE && (PageNum & 1) == 0)
+ rotate_bytes_180(plane[i], plane[i] + bpl * h - 1, Mirror1);
+ if (Duplex == DMDUPLEX_MANUALLONG && (PageNum & 1) == 0)
+ rotate_bytes_180(plane[i], plane[i] + bpl * h - 1, Mirror1);
+ }
+
+ debug(2, "AnyColor = %s %s %s\n",
+ (AnyColor & 0x01) ? "Cyan" : "",
+ (AnyColor & 0x02) ? "Magenta" : "",
+ (AnyColor & 0x04) ? "Yellow" : ""
+ );
+
+ if ((PageNum & 1) == 0 && EvenPages)
+ {
+ SeekRec[SeekIndex].b = ftell(EvenPages);
+ pksm_page(plane, w, h, EvenPages);
+ SeekRec[SeekIndex].e = ftell(EvenPages);
+ debug(1, "PKSM Page: %d %ld %ld\n",
+ PageNum, SeekRec[SeekIndex].b, SeekRec[SeekIndex].e);
+ SeekIndex++;
+ }
+ else
+ pksm_page(plane, w, h, ofp);
+
+ for (i = 0; i < 4; ++i)
+ free(plane[i]);
+ }
+eof:
+ return (0);
+}
+
+int
+pbm_pages(FILE *ifp, FILE *ofp)
+{
+ unsigned char *buf;
+ int rawW, rawH, rawBpl;
+ int rightBpl;
+ int w, h, bpl;
+ int bpl16 = 0;
+ int rc;
+ int p4eaten = 1;
+
+ //
+ // Save the original Upper Right clip values as the logical offset,
+ // because we may adjust them slightly below, in the interest of speed.
+ //
+ if (LogicalClip & LOGICAL_CLIP_X)
+ LogicalOffsetX = UpperLeftX;
+ if (LogicalClip & LOGICAL_CLIP_Y)
+ LogicalOffsetY = UpperLeftY;
+
+ for (;;)
+ {
+ if (pbm_header(ifp, &p4eaten, &rawW, &rawH) == 0)
+ break;
+
+ rawBpl = (rawW + 7) / 8;
+
+ // We only clip multiples of 8 pixels off the leading edge, and
+ // add any remainder to the amount we clip from the right edge.
+ // Its fast, and good enough for government work.
+ LowerRightX += UpperLeftX & 7;
+ UpperLeftX &= ~7;
+
+ w = rawW - UpperLeftX - LowerRightX;
+ h = rawH - UpperLeftY - LowerRightY;
+ bpl = (w + 7) / 8;
+ rightBpl = (rawW - UpperLeftX + 7) / 8;
+
+ bpl16 = (bpl + 15) & ~15;
+ debug(1, "bpl=%d bpl16=%d\n", bpl, bpl16);
+
+ buf = malloc(bpl16 * h);
+ if (!buf)
+ error(1, "Can't allocate page buffer\n");
+
+ rc = read_and_clip_image(buf, rawBpl, rightBpl, 8, bpl, h, bpl16, ifp);
+ if (rc == EOF)
+ error(1, "Premature EOF(pbm) on input stream\n");
+
+ ++PageNum;
+ if (Duplex == DMDUPLEX_LONGEDGE && (PageNum & 1) == 0)
+ rotate_bytes_180(buf, buf + bpl16 * h - 1, Mirror1);
+
+ if ((PageNum & 1) == 0 && EvenPages)
+ {
+ if (Duplex == DMDUPLEX_MANUALLONG)
+ rotate_bytes_180(buf, buf + bpl16 * h - 1, Mirror1);
+ SeekRec[SeekIndex].b = ftell(EvenPages);
+ pbm_page(buf, w, h, EvenPages);
+ SeekRec[SeekIndex].e = ftell(EvenPages);
+ debug(1, "PBM Page: %d %ld %ld\n",
+ PageNum, SeekRec[SeekIndex].b, SeekRec[SeekIndex].e);
+ SeekIndex++;
+ }
+ else
+ pbm_page(buf, w, h, ofp);
+
+ free(buf);
+ }
+ return (0);
+}
+
+void
+blank_page(FILE *ofp)
+{
+ int w, h, bpl, bpl16 = 0;
+ unsigned char *plane;
+
+ w = PageWidth - UpperLeftX - LowerRightX;
+ h = PageHeight - UpperLeftY - LowerRightY;
+ bpl = (w + 7) / 8;
+ bpl16 = (bpl + 15) & ~15;
+
+ plane = malloc(bpl16 * h);
+ if (!plane)
+ error(1, "Unable to allocate blank plane (%d bytes)\n", bpl16*h);
+ memset(plane, 0, bpl16*h);
+
+ pbm_page(plane, w, h, ofp);
+ ++PageNum;
+ free(plane);
+}
+
+int
+parse_xy(char *str, int *xp, int *yp)
+{
+ char *p;
+
+ if (!str || str[0] == 0) return -1;
+
+ *xp = strtoul(str, &p, 0);
+ if (str == p) return -2;
+ while (*p && (*p < '0' || *p > '9'))
+ ++p;
+ str = p;
+ if (str[0] == 0) return -3;
+ *yp = strtoul(str, &p, 0);
+ if (str == p) return -4;
+ return (0);
+}
+
+void
+do_one(FILE *in)
+{
+ int mode;
+
+ if (Mode == MODE_COLOR)
+ {
+ mode = getc(in);
+ if (mode != 'P')
+ {
+ ungetc(mode, in);
+ cmyk_pages(in, stdout);
+ }
+ else
+ {
+ mode = getc(in);
+ if (mode == '4')
+ pksm_pages(in, stdout);
+ else
+ error(1, "Not a pksmraw file!\n");
+ }
+ }
+ else
+ {
+ mode = getc(in);
+ if (mode != 'P')
+ error(1, "Not a pbm file!\n");
+ mode = getc(in);
+ if (mode == '4')
+ pbm_pages(in, stdout);
+ else
+ error(1, "Not a pbmraw file!\n");
+ }
+}
+
+int
+main(int argc, char *argv[])
+{
+ int c;
+ int i, j;
+
+ while ( (c = getopt(argc, argv,
+ "cd:g:n:m:p:r:s:tu:l:L:ABPJ:S:U:X:D:V?h")) != EOF)
+ switch (c)
+ {
+ case 'c': Mode = MODE_COLOR; break;
+ case 'S': Color2Mono = atoi(optarg);
+ Mode = MODE_COLOR;
+ if (Color2Mono < 0 || Color2Mono > 4)
+ error(1, "Illegal value '%s' for -C\n", optarg);
+ break;
+ case 'd': Duplex = atoi(optarg); break;
+ case 'g': if (parse_xy(optarg, &PageWidth, &PageHeight))
+ error(1, "Illegal format '%s' for -g\n", optarg);
+ if (PageWidth < 0 || PageWidth > 1000000)
+ error(1, "Illegal X value '%s' for -g\n", optarg);
+ if (PageHeight < 0 || PageHeight > 1000000)
+ error(1, "Illegal Y value '%s' for -g\n", optarg);
+ break;
+ case 'm': MediaCode = atoi(optarg); break;
+ case 'n': Copies = atoi(optarg); break;
+ case 'p': PaperCode = atoi(optarg); break;
+ case 'r': if (parse_xy(optarg, &ResX, &ResY))
+ error(1, "Illegal format '%s' for -r\n", optarg);
+ break;
+ case 's': SourceCode = atoi(optarg); break;
+ case 't': SaveToner = 1; break;
+ case 'u':
+ if (strcmp(optarg, "0") == 0)
+ break;
+ if (parse_xy(optarg, &UpperLeftX, &UpperLeftY))
+ error(1, "Illegal format '%s' for -u\n", optarg);
+ break;
+ case 'l':
+ if (strcmp(optarg, "0") == 0)
+ break;
+ if (parse_xy(optarg, &LowerRightX, &LowerRightY))
+ error(1, "Illegal format '%s' for -l\n", optarg);
+ break;
+ case 'L': LogicalClip = atoi(optarg);
+ if (LogicalClip < 0 || LogicalClip > 3)
+ error(1, "Illegal value '%s' for -L\n", optarg);
+ break;
+ case 'A': AllIsBlack = !AllIsBlack; break;
+ case 'B': BlackClears = !BlackClears; break;
+ case 'P': OutputStartPlane = !OutputStartPlane; break;
+ case 'J': if (optarg[0]) Filename = optarg; break;
+ case 'U': if (optarg[0]) Username = optarg; break;
+ case 'X': ExtraPad = atoi(optarg); break;
+ case 'D': Debug = atoi(optarg); break;
+ case 'V': printf("%s\n", Version); exit(0);
+ default: usage(); exit(1);
+ }
+
+ if (UpperLeftX < 0 || UpperLeftX >= PageWidth)
+ error(1, "Illegal X value '%d' for -u\n", UpperLeftX);
+ if (UpperLeftY < 0 || UpperLeftY >= PageHeight)
+ error(1, "Illegal Y value '%d' for -u\n", UpperLeftY);
+ if (LowerRightX < 0 || LowerRightX >= PageWidth)
+ error(1, "Illegal X value '%d' for -l\n", LowerRightX);
+ if (LowerRightY < 0 || LowerRightY >= PageHeight)
+ error(1, "Illegal Y value '%d' for -l\n", LowerRightY);
+
+ argc -= optind;
+ argv += optind;
+
+ Bpp = ResX / 600;
+ ResX = 600;
+ if (SaveToner)
+ {
+ SaveToner = 0;
+ EconoMode = 1;
+ }
+
+ switch (Duplex)
+ {
+ case DMDUPLEX_LONGEDGE:
+ case DMDUPLEX_SHORTEDGE:
+ case DMDUPLEX_MANUALLONG:
+ case DMDUPLEX_MANUALSHORT:
+ EvenPages = tmpfile();
+ break;
+ }
+
+ start_doc(stdout);
+
+ if (argc == 0)
+ {
+ do_one(stdin);
+ }
+ else
+ {
+ for (i = 0; i < argc; ++i)
+ {
+ FILE *ifp;
+
+ ifp = fopen(argv[i], "r");
+ if (!ifp)
+ error(1, "Can't open '%s' for reading\n", argv[i]);
+ do_one(ifp);
+ fclose(ifp);
+ }
+ }
+
+ /*
+ * Do manual duplex
+ */
+ if (EvenPages)
+ {
+ DWORD pause;
+
+ // Handle odd page count
+ if ( (PageNum & 1) == 1)
+ {
+ SeekRec[SeekIndex].b = ftell(EvenPages);
+ blank_page(EvenPages);
+ SeekRec[SeekIndex].e = ftell(EvenPages);
+ debug(1, "Blank Page: %d %ld %ld\n",
+ PageNum, SeekRec[SeekIndex].b, SeekRec[SeekIndex].e);
+ SeekIndex++;
+ }
+
+ /*
+ * Manual Pause
+ */
+ // Write even pages in reverse order
+ for (i = SeekIndex-1; i >= 0; --i)
+ {
+ debug(1, "EvenPage: %d %ld %ld %ld\n",
+ i, SeekRec[i].b, SeekRec[i].e, SeekRec[i].pause);
+ fseek(EvenPages, SeekRec[i].pause, 0L);
+ if (i == SeekIndex-1)
+ pause = be32(2);
+ else
+ pause = be32(3);
+ fwrite(&pause, 1, sizeof(DWORD), EvenPages);
+
+ fseek(EvenPages, SeekRec[i].b, 0L);
+ for (j = 0; j < (SeekRec[i].e - SeekRec[i].b); ++j)
+ putc(getc(EvenPages), stdout);
+ }
+ fclose(EvenPages);
+ }
+
+ end_doc(stdout);
+
+ exit(0);
+}
diff --git a/foo2zjs-wrapper.1in b/foo2zjs-wrapper.1in
new file mode 100644
index 0000000..5013e92
--- /dev/null
+++ b/foo2zjs-wrapper.1in
@@ -0,0 +1,398 @@
+.TH foo2zjs-wrapper 1 "${MODpage}" "foo2zjs-wrapper ${MODver}"
+'\"==========================================================================
+'\" STRINGS and MACROS
+'\"==========================================================================
+'\"
+'\" Define strings for special characters that nroff doesn't have
+'\"
+'\" N.B. using .if cua to test for special characters did not work.
+'\"
+.if !'\*[.T]'ps' .ds ua up
+.if '\*[.T]'ps' .ds ua \(ua
+.if !'\*[.T]'ps' .ds da down
+.if '\*[.T]'ps' .ds da \(da
+.if !'\*[.T]'ps' .ds <- left
+.if '\*[.T]'ps' .ds <- \(<-
+.if !'\*[.T]'ps' .ds -> right
+.if '\*[.T]'ps' .ds -> \(->
+'\"
+'\" bx - box a Courier string for making keycaps
+'\"
+'\" N.B. this mess is to make the line drawing come out only
+'\" if we are really generating postscript
+'\"
+.de bx
+.ie !'\*[.T]'ps' \{\
+. RB [ \\$1 ]\\$2
+.\}
+.el \{\
+. ie !r ps4html \{\
+'\" \(br\|\s-1\f(CB\\$1\fP\s+1\|\(br\l'|0\(rn'\l'|0\(ul'
+. ft CW
+. nr par*bxw \w'\\$1'+.4m
+\Z'\v'.25m'\D'l 0 -1m'\D'l \\n[par*bxw]u 0'\D'l 0 1m'\D'l -\\n[par*bxw]u 0''\
+\Z'\h'.2m'\s-1\\$1\s+1'\
+\h'\\n[par*bxw]u'\\$2
+. ft P
+. \}
+. el \{\
+. RB [ \\$1 ]\\$2
+. \}
+.\}
+..
+'\"
+'\" strings to set current color (null with old groff)
+'\"
+.if mred .ds red \m[red]
+.if mgreen .ds green \m[green]
+.if mblue .ds blue \m[blue]
+.if mblack .ds black \m[black]
+.if mblack .ds mP \mP
+'\"
+'\" fix for grotty + xterm. We call for orange, grotty outputs yellow,
+'\" but xterm displays yellow as orange. The cycle is complete.
+'\"
+.if n .defcolor orange rgb #ffff00
+'\"
+'\" color <color> - set the current color (ignores request with old groff)
+'\"
+.de color
+.if mred \m[\\$1]\c
+..
+'\"
+'\" colorword <color> <word> - colorize a word (ignored by old groff)
+'\"
+.de colorword
+.ie m\\$1 \m[\\$1]\\$2\mP\c
+.el \\$2\c
+..
+'\"
+'\" colbox <fg> <bg> <word> - colorize a word in a filled box
+'\"
+.de colbox
+.ie mred \M[\\$2]\
+\v'+.167v'\
+\D'P 0 -0.9v \w'\\$3'u 0 0 +0.9v -\w'\\$3'u 0'\
+\v'-.167v'\
+\m[\\$1]\\$3\mP\MP
+.el \\$3\c
+..
+'\"
+'\" Macros for doing pdfmarks
+'\"
+.de specialps
+\\k_\X'ps: \\$*'\h'|\\n_u'\c
+..
+'\"
+'\" pdfmark PDFMARKCODE
+'\"
+.ds pdfmarks
+.if d pdfmarks \{\
+.de pdfmark
+. specialps exec [\\$1 pdfmark
+..
+'\"
+'\" pdfdest LINKNAME
+'\"
+.de pdfdest
+.pdfmark "/Dest /\\$1 /View [/XYZ -5 PL null] /DEST"
+..
+'\"
+'\" pdfbookmark COUNT LINKNAME STRING
+'\"
+.de pdfbookmark
+. pdfmark "/View [/XYZ 44 730 1.0] /Count \\$1 /Dest /\\$2 /Title (\\$3) /OUT"
+..
+'\"
+'\" Define the SH and SS macros to save pdfmark information
+'\" in "arrays" of numbers and strings.
+'\"
+.if !r rr_n \{\
+.nr rr_n 0 1
+.am SH
+. nr rr_levels!\\n+[rr_n] 2
+. ds rr_labels!\\n[rr_n] \\$*
+. pdfdest Link\\n[rr_n]
+..
+.am SS
+. nr rr_levels!\\n+[rr_n] 3
+. ds rr_labels!\\n[rr_n] \\$*
+. pdfdest Link\\n[rr_n]
+..
+.\}
+'\"
+'\" Called at the end of the document to generate the pdfmark outline
+'\"
+.de pdf_outline
+.nr rr_levels!\\n+[rr_n] 1
+.nr rr_i 0 1
+.while \\n+[rr_i]<\\n[rr_n] \{\
+. nr rr_ip1 \\n[rr_i]+1
+. nr rr_count 0
+. if \\n[rr_levels!\\n[rr_ip1]]>\\n[rr_levels!\\n[rr_i]] \{\
+. nr rr_j \\n[rr_i] 1
+. while \\n+[rr_j]<\\n[rr_n] \{\
+. if \\n[rr_levels!\\n[rr_j]]<=\\n[rr_levels!\\n[rr_i]] \{\
+. break
+. \}
+. if \\n[rr_levels!\\n[rr_j]]==(\\n[rr_levels!\\n[rr_i]]+1) \{\
+. nr rr_count \\n[rr_count]+1
+. \}
+. \}
+. \}
+. ds hhh \\*[rr_labels!\\n[rr_i]]
+. pdfbookmark \\n[rr_count] Link\\n[rr_i] "\\*[hhh]"
+.\}
+..
+'\"
+'\" Some postscript to make pdfmarks harmless on old interpreters...
+'\"
+.specialps "def /pdfmark where {pop} {userdict /pdfmark /cleartomark load put} ifelse"
+'\"
+'\" Force display of Bookmarks in Acrobat when document is viewed.
+'\"
+.pdfmark "[/PageMode /UseOutlines /Page 1 /View [/XYZ null null null] /DOCVIEW"
+'\"
+'\" Output the document info in pdfmarks
+'\"
+.pdfmark "\
+ /Title (\*[an-title](\*[an-section])) \
+ /Subject (foo2zjs-wrapper Manual Page) \
+ /Author (Rick Richardson) \
+ /Keywords (printing) \
+ /Creator (groff \n(.x.\n(.y.\n(.Y -man) \
+ /CreationDate (\*[an-extra1]) \
+ /ModDate (\*[an-extra1]) \
+ /DOCINFO"
+\}
+'\"
+'\" The manual page name is only 1st level mark
+'\"
+.nr rr_levels!\n+[rr_n] 1
+.ds rr_labels!\n[rr_n] \*[an-title](\*[an-section])
+.pdfdest Link\n[rr_n]
+'\"==========================================================================
+'\" MANUAL PAGE SOURCE
+'\"==========================================================================
+.SH NAME
+foo2zjs-wrapper \- Convert Postscript into a ZJS printer stream
+.SH SYNOPSIS
+.B foo2zjs-wrapper
+.RI [ options "] [" ps-file ]
+.SH DESCRIPTION
+.B foo2zjs-wrapper
+is a Foomatic compatible printer wrapper for the \fBfoo2zjs\fP printer driver.
+This script reads a Postscript \fIps-file\fP or standard input
+and converts it to Zenographics ZjStream printer format
+for driving the Minolta/QMS 2300 DL network color laser printer
+and other Zenographics-based printers.
+.P
+This script can be used in a standalone fashion, but is intended to
+be called from a printer spooler system which uses the Foomatic
+printer database.
+
+.SH COMMAND LINE OPTIONS
+.SS Normal Options
+These are the options used to select the parameters of a
+print job that are usually controlled on a per job basis.
+.TP
+.BI \-c
+Print in color (else monochrome).
+.TP
+.BI \-C\0 colormode
+Color correction mode [0].
+.TS
+n l .
+0 Best compromise
+1 Photos (using m2300w CRDs)
+2 Photos and text (using m2300w CRDs)
+3 Graphics and text (using m2300w CRDs)
+10 ICM color profile (using -G *.icm file)
+.TE
+.TP
+.BI \-d\0 duplex
+Duplex code to send to printer [1].
+.TS
+| n l | n l | n l .
+1 off 2 long edge 3 short edge
+.TE
+.TP
+.BI \-m\0 media
+Media code to send to printer [1].
+.TS
+l l l
+l n n.
+_
+Media 2300DL 2200DL
+_
+standard 1 1
+transparency 2 2
+envelope 257 na
+letterhead 259 na
+thick 261 4
+postcard 262 na
+labels 263 3
+.TE
+.TP
+.BI \-p\0 paper
+Paper size code to send to printer [1].
+.TS
+| n l | n l.
+1 letter 9 A4
+5 legal 11 A5
+7 executive 13 B5
+20 env #10 27 env DL
+28 env C5 34 env B5
+37 env Monarch
+.TE
+.TP
+.BI \-n\0 copies
+Number of copies [1].
+.TP
+.BI \-r\0 xres x yres
+Set device resolution in pixels/inch [1200x600].
+.TP
+.BI \-s\0 source
+Source (Input Slot) code to send to printer [7].
+.TS
+| n l | n l.
+1 upper 4 manual
+2 lower 7 auto
+.TE
+.TP
+.BI \-t
+Draft mode. Every other pixel is white.
+.TP
+.BI "\-2 \-3 \-4 \-5 \-6 \-8 \-9 \-10 \-12 \-14 \-15 \-16 \-18"
+Print in N-up. Requires the \fBpsutils\fP package.
+.TP
+.BI \-o\0 orient
+Orientation used for N-up.
+.TS
+l l l.
+Portrait -op (normal)
+Landscape -ol (rotated 90 degrees anticlockwise)
+Seascape -os (rotated 90 degrees clockwise)
+.TE
+.SS Printer Tweaking Options
+These are the options used to customize the operation of \fBfoo2zjs\fP
+for a particular printer.
+.TP
+.BI \-u\0 xoff x yoff
+Set the offset of the start of the printable region from the
+upper left corner, in pixels [varies with paper size].
+The defaults should work on the 2200DL and 2300DL, and have not
+been tested on any other printers.
+.TP
+.BI \-l\0 xoff x yoff
+Set the offset of the end of the printable region from the
+lower right corner, in pixels [varies with paper size].
+The defaults should work on the 2200DL and 2300DL, and have not
+been tested on any other printers.
+.TP
+.BI \-L\0 mask
+Send the logical clipping values from -u/-l in the ZjStream.
+\fBfoo2zjs-wrapper\fP always runs Ghostscript with the ideal page dimensions,
+so that the scale of the image is correct,
+regardless whether or not the printer has unprintable regions.
+This option is used to move the position of the clipped image
+back to where it belongs on the page. The default is to send
+the amount which was clipped by -u and -l, and should be
+good in most cases.
+.TS
+l l.
+0 don't send any logical clipping amounts
+1 only send Y clipping amount
+2 only send X clipping amount
+3 send both X and Y clipping amounts
+.TE
+.TP
+.BI \-P
+Do not send START_PLANE codes on monochrome output. May be
+needed by some monochrome-only printers, such as the
+HP LaserJet 1000.
+.TP
+.BI \-X\0 padlen
+Add extra zero padding to the end of BID segments. The default is
+16 bytes. Padding 16 bytes of zeroes
+is needed for older ZjStream printers, such as the Minolta 2200DL
+and HP LaserJet 1000, and seems harmless to newer ones, such as
+the Minolta 2300DL. So the default should be good for all cases.
+.TP
+.BI \-z\0 model
+Model: 0=2300DL, 1=HP1020. Default is 0.
+.SS Color Tweaking Options
+These are the options used to control the quality of color output.
+Color correction is currently a WORK IN PROGRESS.
+.TP
+.BI \-g\0 gsopts
+Additional options to pass to Ghostscript, such as -g\(lq-dDITHERPPI=nnn\(rq,
+etc. This option may appear more than once.
+.TP
+.BI \-G\0 profile.icm
+Convert \fIprofile.icm\fP to a Postscript color rendering
+dictionary (CRD) using \fBfoo2zjs-icc2ps\fP and
+adjust the printer colors by using the Postscript \fBsetcolorrendering\fP
+operator. (WORK IN PROGRESS).
+.TP
+.BI \-G\0 gamma-file.ps
+Prepend \fIgamma-file.ps\fP to the Postscript input to perform
+color correction using the \fBsetcolortransfer\fP Postscript operator.
+For example, the file might contain:
+.br
+{0.333 exp} {0.333 exp} {0.333 exp} {0.333 exp} setcolortransfer
+.TP
+.BI \-I\0 intent
+Select profile intent from the ICM file.
+0=Perceptual, 1=Colorimetric, 2=Saturation, 3=Absolute.
+Default is 0 (perceptual).
+.SS Debugging Options
+These options are used for debugging \fBfoo2zjs\fP and its wrapper.
+.TP
+.BI \-S\0 plane
+Output just a single color plane from a color print and print it
+on the black plane. The default is to output all color planes.
+.TS
+l l.
+1 Cyan
+2 Magenta
+3 Yellow
+4 Black
+.TE
+.TP
+.BI \-D\0 level
+Set Debug level [0].
+
+.SH EXAMPLES
+Create a monochrome ZjStream from a Postscript document,
+examine it, and then print it using a RAW print queue:
+
+.RS
+.nf
+foo2zjs-wrapper testpage.ps > testpage.zm
+zjsdecode < testpage.zm
+lpr -P raw testpage.zm
+.fi
+.RE
+.P
+Create a color ZjStream stream from a Postscript document:
+
+.RS
+.nf
+foo2zjs-wrapper -c testpage.ps > testpage.zc
+.fi
+.RE
+
+.SH FILES
+.BR /usr/bin/foo2zjs-wrapper
+.SH SEE ALSO
+.BR foo2zjs (1),
+.BR zjsdecode (1)
+.SH "AUTHOR"
+Rick Richardson <rick.richardson@comcast.net>
+.br
+${URLZJS}/
+'/"
+'/"
+'/"
+.em pdf_outline
diff --git a/foo2zjs-wrapper.in b/foo2zjs-wrapper.in
new file mode 100755
index 0000000..0763afa
--- /dev/null
+++ b/foo2zjs-wrapper.in
@@ -0,0 +1,638 @@
+#!/bin/sh
+
+#* Copyright (C) 2003-2006 Rick Richardson
+#*
+#* 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.
+#*
+#* Authors: Rick Richardson <rick.richardson@comcast.net>
+
+VERSION='$Id: foo2zjs-wrapper.in,v 1.100 2006/12/17 16:00:06 rick Exp $'
+
+#
+# Printer Notes:
+#
+# Minolta/QMS 2300 DL - Does not need clipping, -X16, or -P. But it doesn't
+# break anything if you use them.
+#
+# Minolta/QMS 2200 DL - Requires -X16 (which is on by default)
+# - Requires clipping
+#
+# HP LaserJet 1000 - Same as 2200 DL, plus needs -P
+# HP LaserJet 1005 - Same as 2200 DL, plus needs -P
+# HP LaserJet 1018 - Same as 2200 DL, plus needs -P -z1 -L0
+# HP LaserJet 1020 - Same as 2200 DL, plus needs -P -z1 -L0
+#
+
+PROGNAME="$0"
+BASENAME=`basename $PROGNAME`
+PREFIX=/usr
+SHARE=$PREFIX/share/foo2zjs
+
+#
+# Log the command line, for debugging and problem reports
+#
+if [ -x /usr/bin/logger ]; then
+ logger -t "$BASENAME" -p lpr.info -- "foo2zjs-wrapper $@" </dev/null
+fi
+
+usage() {
+ cat <<EOF
+Usage:
+ $BASENAME [options] [ps-file]
+
+ Foomatic printer wrapper for the foo2zjs printer driver.
+ This script reads a Postscript ps-file or standard input
+ and converts it to Zenographics ZjStream printer format.
+
+Normal Options:
+-c Print in color (else monochrome)
+-d duplex Duplex code to send to printer [$DUPLEX]
+ 1=off, 2=longedge, 3=shortedge
+-m media Media code to send to printer [$MEDIA]
+ 1=standard, 2=transparency, 3=glossy, 257=envelope,
+ 259=letterhead, 261=thickstock, 262=postcard, 263=labels
+-p paper Paper code [$PAPER]
+ 1=letter, 5=legal, 7=executive, 9=A4, 11=A5, 13=B5
+ 20=env#10, 27=envDL 28=envC5 34=envB5 37=envMonarch
+-n copies Number of copies [$COPIES]
+-r <xres>x<yres> Set device resolution in pixels/inch [$RES]
+-s source Source code to send to printer [$SOURCE]
+ 1=upper, 2=lower, 4=manual, 7=auto
+ Code numbers may vary with printer model.
+-t Draft mode. Every other pixel is white.
+-2/-3/-4/-6/-8/-10/-12/-14/-15/-16/-18
+ Print with N-up (requires psutils)
+-o orient For N-up: -op is portrait, -ol is landscape, -os is seascape.
+
+Printer Tweaking Options:
+-u <xoff>x<yoff> Set offset of upper left printable in pixels [varies]
+-l <xoff>x<yoff> Set offset of lower right printable in pixels [varies]
+-L mask Send logical clipping values from -u/-l in ZjStream [3]
+ 0=no, 1=Y, 2=X, 3=XY
+-P Do not output START_PLANE codes. May be needed by some
+ monochrome-only printers.
+-X padlen Add extra zero padding to the end of BID segments [16]
+-z model Model: 0=2300DL 1=hp1020 [0]
+
+Color Tweaking Options:
+-g gsopts Additional options to pass to Ghostscript, such as
+ -dDITHERPPI=nnn, etc. May appear more than once. []
+-G profile.icm Convert profile.icm to a Postscript CRD using icc2ps and
+ adjust colors using the setcolorrendering PS operator.
+ $SHARE/icm/ will be searched for profile.icm.
+-I intent Select profile intent from ICM file [$INTENT]
+ 0=Perceptual, 1=Colorimetric, 2=Saturation, 3=Absolute
+-G gamma-file.ps Prepend gamma-file to the Postscript input to perform
+ color correction using the setcolortransfer PS operator.
+
+Debugging Options:
+-S plane Output just a single color plane from a color print [all]
+ 1=Cyan, 2=Magenta, 3=Yellow, 4=Black
+-D lvl Set Debug level [$DEBUG]
+-V $VERSION
+EOF
+
+ exit 1
+}
+
+#
+# Report an error and exit
+#
+error() {
+ echo "$BASENAME: $1" >&2
+ exit 1
+}
+
+dbgcmd() {
+ if [ $DEBUG -ge 1 ]; then
+ echo "$@" >&2
+ fi
+ "$@"
+}
+
+#
+# N-up-ify the job. Requires psnup from psutils package
+#
+nup() {
+ case "$NUP" in
+ [2368]|1[0458])
+ tr '\r' '\n' | psnup $NUP_ORIENT -d2 -$NUP -m.3in -p$paper -q
+ ;;
+ [49]|1[26])
+ tr '\r' '\n' | psnup $NUP_ORIENT -d2 -$NUP -m.5in -p$paper -q
+ ;;
+ *)
+ error "Illegal call to nup()."
+ ;;
+ esac
+}
+
+#
+# Process the options
+#
+
+# Try to use a local copy of GhostScript 8.14, if available. Otherwise,
+# fallback to whatever the Linux distro has installed (usually 7.05)
+#
+# N.B. := operator used here, when :- would be better, because "ash"
+# doesn't have :-
+if gs8 -v >/dev/null 2>&1; then
+ GSBIN=${GSBIN:-gs8}
+else
+ GSBIN=${GSBIN:-gs}
+fi
+
+CMDLINE="$*"
+DEBUG=0
+DUPLEX=1
+COLOR=
+COLORMODE=0
+MODEL=0
+# What mode to use if the user wants us to pick the "best" mode
+case `$GSBIN --version` in
+7*) DEFAULTCOLORMODE=10
+ DEFAULTCOLORMODE=2
+ ;;
+*) DEFAULTCOLORMODE=2
+ ;;
+esac
+QUALITY=1
+MEDIA=1
+COPIES=1
+PAPER=1
+RES=1200x600
+SOURCE=7
+NUP=
+CLIP_UL=
+CLIP_LR=
+CLIP_LOG=
+BC=
+AIB=
+NOPLANES=
+COLOR2MONO=
+GAMMAFILE=
+INTENT=0
+GSOPTS=
+EXTRAPAD=
+SAVETONER=
+NUP_ORIENT=
+GSDEV=-sDEVICE=pbmraw
+while getopts "1:23456789o:b:cC:d:g:l:u:L:m:n:p:q:r:s:tz:ABS:D:G:I:PX:Vh?" opt
+do
+ case $opt in
+ b) GSBIN="$OPTARG";;
+ c) COLOR=-c;;
+ d) DUPLEX="$OPTARG";;
+ g) GSOPTS="$GSOPTS $OPTARG";;
+ m) MEDIA="$OPTARG";;
+ n) COPIES="$OPTARG";;
+ p) PAPER="$OPTARG";;
+ q) QUALITY="$OPTARG";;
+ r) RES="$OPTARG";;
+ s) SOURCE="$OPTARG";;
+ t) SAVETONER="-t";;
+ z) MODEL="$OPTARG";;
+ l) CLIP_LR="-l $OPTARG";;
+ u) CLIP_UL="-u $OPTARG";;
+ L) CLIP_LOG="-L $OPTARG";;
+ A) AIB=-A;;
+ B) BC=-B;;
+ C) COLORMODE="$OPTARG";;
+ S) COLOR2MONO="-S$OPTARG";;
+ D) DEBUG="$OPTARG";;
+ G) GAMMAFILE="$OPTARG";;
+ I) INTENT="$OPTARG";;
+ P) NOPLANES=-P;;
+ X) EXTRAPAD="-X $OPTARG";;
+ [234689]) NUP="$opt";;
+ [57]) error "Can't find acceptable layout for $opt-up";;
+ 1) case "$OPTARG" in
+ [024568]) NUP="1$OPTARG";;
+ *) error "Can't find acceptable layout for 1$OPTARG-up";;
+ esac
+ ;;
+ o) case "$OPTARG" in
+ l*) NUP_ORIENT=-l;;
+ s*) NUP_ORIENT=-r;;
+ p*|*) NUP_ORIENT=;;
+ esac;;
+ V) echo "$VERSION"; foo2zjs -V; exit 0;;
+ h|\?)
+ if [ "$CMDLINE" != "-?" -a "$CMDLINE" != -h ]; then
+ echo "Illegal command:"
+ echo " $0 $CMDLINE"
+ echo
+ fi
+ usage;;
+ esac
+done
+shift `expr $OPTIND - 1`
+
+#
+case "$QUALITY" in
+0)
+ GSOPTS="-dCOLORSCREEN $GSOPTS"
+ ;;
+1)
+ GSOPTS="-dCOLORSCREEN $GSOPTS"
+ ;;
+2)
+ GSOPTS="-dMaxBitMap=500000000 $GSOPTS"
+ ;;
+esac
+
+#
+# Validate model code
+#
+case "$MODEL" in
+0|1) ;;
+*) error "Unknown model code $MODEL";;
+esac
+
+#
+# Validate media code
+#
+case "$MEDIA" in
+1|standard) MEDIA=1;;
+2|transparency) MEDIA=2;;
+3|glossy) MEDIA=3;;
+257|envelope) MEDIA=257;;
+259|letterhead) MEDIA=259;;
+261|thickstock) MEDIA=261;;
+262|postcard) MEDIA=262;;
+263|labels) MEDIA=263;;
+[0-9]*) ;;
+*) error "Unknown media code $MEDIA";;
+esac
+
+#
+# Validate source (InputSlot) code
+#
+case "$SOURCE" in
+1|upper) SOURCE=1;;
+2|lower) SOURCE=2;;
+4|manual) SOURCE=4;;
+7|auto) SOURCE=7;;
+[0-9]*) ;;
+*) error "Unknown source code $SOURCE";;
+esac
+
+#
+# Validate Duplex code
+#
+case "$DUPLEX" in
+1|off|none) DUPLEX=1;;
+2|long*) DUPLEX=2;;
+3|short*) DUPLEX=3;;
+[0-9]*) ;;
+*) error "Unknown duplex code $DUPLEX";;
+esac
+
+#
+# Validate Resolution
+#
+case "$RES" in
+600x600) ;;
+1200x600) ;;
+2400x600) ;;
+*) error "Illegal resolution $RES";;
+esac
+
+#
+# Figure out the paper dimensions in pixels/inch, and set the
+# default clipping region. Unfortunately, this is a trouble
+# area for ZjStream printers. Various versions of ZjS print
+# engines react differently when asked to print into their
+# unprintable regions.
+#
+# The Minolta 2200 DL is sensitive to its unprintable regions,
+# and will pixel skew if you try to print there.
+#
+# The HP1000 will print blank pages when asked to print into its
+# unprintable region.
+#
+# The Minolta 2300 DL doesn't care if print into the unprintable
+# region. It will do the clipping itself. This is as it should be.
+# But it won't hurt it if we do the clipping here.
+#
+set_clipping() {
+ ulx=$1; uly=$2
+ lrx=$3; lry=$4
+
+ # Set clipping region if it isn't already set
+ if [ "$CLIP_UL" = "" ]; then
+ case "$RES" in
+ 600x600) ulx=`expr $ulx / 2`;;
+ 2400x600) ulx=`expr $ulx \* 2`;;
+ esac
+ CLIP_UL="-u ${ulx}x${uly}"
+ fi
+ if [ "$CLIP_LR" = "" ]; then
+ case "$RES" in
+ 600x600) lrx=`expr $lrx / 2`;;
+ 2400x600) lrx=`expr $lrx \* 2`;;
+ esac
+ CLIP_LR="-l ${lrx}x${lry}"
+ fi
+}
+
+case "$PAPER" in
+1|letter) PAPER=1; paper=letter; XDIM="10200"; YDIM="6600"
+ case "$MODEL" in
+ 0) set_clipping 204 102 204 106;;
+ 1) set_clipping 192 96 192 96;;
+ # 1) set_clipping 96 96 288 96;;
+ esac
+ ;;
+5|legal) PAPER=5; paper=legal; XDIM="10200"; YDIM="8400"
+ case "$MODEL" in
+ 0) set_clipping 204 102 204 106;;
+ 1) set_clipping 192 96 192 96;;
+ esac
+ ;;
+7|executive) PAPER=7; paper=executive; XDIM="8700"; YDIM="6300"
+ case "$MODEL" in
+ 0) set_clipping 206 102 206 102;;
+ 1) set_clipping 192 96 192 96;;
+ esac
+ ;;
+9|a4|A4) PAPER=9; paper=a4; XDIM="9920"; YDIM="7016"
+ case "$MODEL" in
+ 0)
+ if [ "$NOPLANES" != "" -a "$RES" = 600x600 ]; then
+ # Hack fix for LJ1000
+ set_clipping 224 100 224 100
+ else
+ # 2200DL
+ set_clipping 200 100 200 100
+ fi
+ ;;
+ 1) set_clipping 192 96 192 96;;
+ esac
+ ;;
+11|a5|A5) PAPER=11; paper=a5; XDIM="6992"; YDIM="4960"
+ case "$MODEL" in
+ 0) set_clipping 200 100 200 100;;
+ 1) set_clipping 192 96 192 96;;
+ esac
+ ;;
+13|b5|B5) PAPER=13; paper=b5; XDIM="8598"; YDIM="6070"
+ case "$MODEL" in
+ 0) set_clipping 207 107 207 107;;
+ 1) set_clipping 192 96 192 96;;
+ esac
+ ;;
+20|"env#10") PAPER=20; paper=env10; XDIM="4950"; YDIM="5700"
+ case "$MODEL" in
+ 0) set_clipping 171 78 171 78;;
+ 1) set_clipping 171 78 171 78;;
+ esac
+ ;;
+27|envDL) PAPER=27; paper=envDL; XDIM="5200"; YDIM="5200"
+ case "$MODEL" in
+ 0) set_clipping 176 84 176 84;;
+ 1) set_clipping 176 84 176 84;;
+ esac
+ ;;
+28|envC5) PAPER=28; paper=envC5; XDIM="7650"; YDIM="5408"
+ case "$MODEL" in
+ 0) set_clipping 170 80 169 80;;
+ 1) set_clipping 170 80 169 80;;
+ esac
+ ;;
+34|envB5) PAPER=34; paper=envB5; XDIM="8316"; YDIM="5892"
+ case "$MODEL" in
+ 0) set_clipping 174 74 174 74;;
+ 1) set_clipping 174 74 174 74;;
+ esac
+ ;;
+37|envMonarch) PAPER=37; paper=envMonarch;XDIM="4650"; YDIM="4500"
+ case "$MODEL" in
+ 0) set_clipping 174 78 173 78;;
+ 1) set_clipping 174 78 173 78;;
+ esac
+ ;;
+*) error "Unimplemented paper code $PAPER";;
+esac
+PAPERSIZE="-sPAPERSIZE=$paper";
+
+case "$RES" in
+600x600) XDIM=`expr $XDIM / 2`;;
+1200x600) ;;
+2400x600) XDIM=`expr $XDIM \* 2`;;
+esac
+DIM="${XDIM}x${YDIM}"
+
+#
+# If there is an argument left, take it as the file to print.
+# Else, the input comes from stdin.
+#
+if [ $# -ge 1 ]; then
+ if [ "$LPJOB" = "" ]; then
+ : # LPJOB="$1"
+ fi
+ exec < $1
+fi
+
+#
+# Filter thru psnup if N-up printing has been requested
+#
+case $NUP in
+[234689]|1[024568]) PREFILTER="nup";;
+*) PREFILTER=cat;;
+esac
+
+#
+# Overload -G. If the file name ends with ".icm" or ".ICM"
+# then convert the ICC color profile to a Postscript CRD,
+# then prepend it to the users job. Select the intent
+# using the -I option.
+#
+
+create_crd() {
+ #
+ # Create a Postscript CRD
+ #
+ ICC2PS=$PREFIX/bin/foo2zjs-icc2ps
+ if [ -x $ICC2PS ]; then
+ $ICC2PS -o $GAMMAFILE -t$INTENT > $ICCTMP.crd.ps 2>$ICCTMP.log \
+ || error "Problem converting .ICM file to Postscript"
+ cat > $ICCTMP.usecie.ps <<-EOF
+ %!PS-Adobe-3.0
+ <</UseCIEColor true>>setpagedevice
+ EOF
+ cat > $ICCTMP.selcrd.ps <<-EOF
+ /Current /ColorRendering findresource setcolorrendering
+ EOF
+ GAMMAFILE="$ICCTMP.usecie.ps $ICCTMP.crd.ps $ICCTMP.selcrd.ps"
+ else
+ GAMMFILE=
+ fi
+}
+
+if [ $DEBUG -gt 0 ]; then
+ ICCTMP=/tmp/icc
+else
+ ICCTMP=/tmp/icc$$
+fi
+
+if [ "" = "$COLOR" ]; then
+ COLORMODE=
+ GAMMAFILE=
+else
+ case "$COLORMODE" in
+ 0) COLORMODE=$DEFAULTCOLORMODE;;
+ esac
+fi
+
+CRDBASE="$PREFIX/share/foo2zjs/crd"
+case "$RES" in
+ 600x600) COLORMODE=;;
+ 1200x600) SCREEN=screen1200.ps;;
+ 2400x600) SCREEN=screen2400.ps;;
+esac
+
+case "$COLORMODE" in
+"")
+ # Monochrome
+ ;;
+10|icm)
+ # Use old ICM method
+ AIB=-A
+ BC=-B
+ case "$GAMMAFILE" in
+ *.icm|*.ICM|*.icc|*.ICC)
+ #
+ # Its really an .ICM file, not a gamma file.
+ #
+ # The file can be a full path name, or the name of a file in $SHARE/icm/
+ #
+ if [ -r "$GAMMAFILE" ]; then
+ create_crd
+ elif [ -r "$SHARE/icm/$GAMMAFILE" ]; then
+ GAMMAFILE="$SHARE/icm/$GAMMAFILE"
+ create_crd
+ else
+ GAMMAFILE=
+ fi
+ ;;
+ none)
+ GAMMAFILE=
+ ;;
+ esac
+ ;;
+1|photo)
+ # Photo
+ GAMMAFILE="$CRDBASE/prolog.ps"
+ GAMMAFILE="$GAMMAFILE $CRDBASE/2300w-1200@150-l250-kx,ucr125,75-per.crd"
+ GAMMAFILE="$GAMMAFILE $CRDBASE/$SCREEN"
+ ;;
+2|graphics)
+ # Photo and Text
+ GAMMAFILE="$CRDBASE/prolog.ps"
+ #GAMMAFILE="$GAMMAFILE $CRDBASE/2300w-1200@150-l250-kx,ucr100,75-per.crd"
+ GAMMAFILE="$GAMMAFILE $CRDBASE/kh.crd"
+ GAMMAFILE="$GAMMAFILE $CRDBASE/$SCREEN"
+ ;;
+3|text)
+ # Graphic and Text
+ GAMMAFILE="$CRDBASE/prolog.ps"
+ #GAMMAFILE="$GAMMAFILE $CRDBASE/2300w-1200@150-l250-kx,ucr100,50-per.crd"
+ GAMMAFILE="$GAMMAFILE $CRDBASE/kx.crd"
+ GAMMAFILE="$GAMMAFILE $CRDBASE/$SCREEN"
+ ;;
+4|tonersave)
+ # Reduced toner
+ GAMMAFILE="$CRDBASE/prolog.ps"
+ GAMMAFILE="$GAMMAFILE $CRDBASE/2300w-1200@150-l250-kx,ucr100,0-per.crd"
+ GAMMAFILE="$GAMMAFILE $CRDBASE/$SCREEN"
+ ;;
+*.crd)
+ GAMMAFILE="$CRDBASE/prolog.ps"
+ if [ -f $COLORMODE ]; then
+ GAMMAFILE="$GAMMAFILE $COLORMODE"
+ elif [ -f $CRDBASE/$COLORMODE ]; then
+ GAMMAFILE="$GAMMAFILE $CRDBASE/$COLORMODE"
+ else
+ error "Can't find CRD '$COLORMODE' in . or in $CRDBASE"
+ fi
+ GAMMAFILE="$GAMMAFILE $CRDBASE/$SCREEN"
+ ;;
+*)
+ error "Unknown color method '$COLORMODE'"
+ ;;
+esac
+
+if [ "" != "$COLOR" ]; then
+ if [ "" = "$AIB" -a "" = "$BC" ]; then
+ # Faster, but can't handle AllIsBlack or BlackClears
+ GSDEV=-sDEVICE=pksmraw
+ else
+ # Can't handle different size pages
+ GSDEV=-sDEVICE=bitcmyk
+ fi
+fi
+
+#
+# Figure out USERNAME
+#
+if [ "$LPUSER" != "" ]; then
+ USER="$LPUSER@$LPHOST"
+else
+ USER=""
+fi
+
+#
+# Main Program, just cobble together the pipeline and run it
+#
+# The malarky with file descriptors 1 and 3 is to avoid a bug in
+# (some versions?) of Ghostscript where Postscript's stdout gets
+# intermingled with the printer drivers output, resulting in
+# corrupted image data.
+#
+GS="$GSBIN -q -dBATCH -dSAFER -dQUIET -dNOPAUSE"
+
+$PREFILTER \
+| ($GS $PAPERSIZE -g$DIM -r$RES $GSDEV $GSOPTS \
+ -sOutputFile="|cat 1>&3" $GAMMAFILE - >/dev/null) 3>&1 \
+| foo2zjs -r$RES -g$DIM -p$PAPER -m$MEDIA -n$COPIES -d$DUPLEX -s$SOURCE \
+ -z$MODEL $COLOR $CLIP_UL $CLIP_LR $CLIP_LOG $SAVETONER \
+ -J "$LPJOB" -U "$USER" \
+ $BC $AIB $COLOR2MONO $NOPLANES $EXTRAPAD -D$DEBUG
+
+#
+# Log the command line, for debugging and problem reports
+#
+if [ -x /usr/bin/logger ]; then
+ logger -t "$BASENAME" -p lpr.info -- \
+ "$GSBIN $PAPERSIZE -g$DIM -r$RES $GSDEV $GSOPT $GAMAFILE"
+ logger -t "$BASENAME" -p lpr.info -- \
+ "foo2zjs -r$RES -g$DIM -p$PAPER -m$MEDIA \
+-n$COPIES -d$DUPLEX -s$SOURCE -z$MODEL $COLOR $CLIP_UL $CLIP_LR $CLIP_LOG \
+$SAVETONER $BC $AIB $COLOR2MONO $NOPLANES $EXTRAPAD"
+fi
+
+#
+# Remove cruft
+#
+if [ $DEBUG -eq 0 ]; then
+ for i in crd.ps log usecie.ps selcrd.ps
+ do
+ file="$ICCTMP.$i"
+ [ -f $file ] && rm -f $file
+ done
+fi
+
+exit 0
diff --git a/foo2zjs.1in b/foo2zjs.1in
new file mode 100644
index 0000000..ae77006
--- /dev/null
+++ b/foo2zjs.1in
@@ -0,0 +1,359 @@
+.TH foo2zjs 1 "${MODpage}" "foo2zjs ${MODver}"
+'\"==========================================================================
+'\" STRINGS and MACROS
+'\"==========================================================================
+'\"
+'\" Define strings for special characters that nroff doesn't have
+'\"
+'\" N.B. using .if cua to test for special characters did not work.
+'\"
+.if !'\*[.T]'ps' .ds ua up
+.if '\*[.T]'ps' .ds ua \(ua
+.if !'\*[.T]'ps' .ds da down
+.if '\*[.T]'ps' .ds da \(da
+.if !'\*[.T]'ps' .ds <- left
+.if '\*[.T]'ps' .ds <- \(<-
+.if !'\*[.T]'ps' .ds -> right
+.if '\*[.T]'ps' .ds -> \(->
+'\"
+'\" bx - box a Courier string for making keycaps
+'\"
+'\" N.B. this mess is to make the line drawing come out only
+'\" if we are really generating postscript
+'\"
+.de bx
+.ie !'\*[.T]'ps' \{\
+. RB [ \\$1 ]\\$2
+.\}
+.el \{\
+. ie !r ps4html \{\
+'\" \(br\|\s-1\f(CB\\$1\fP\s+1\|\(br\l'|0\(rn'\l'|0\(ul'
+. ft CW
+. nr par*bxw \w'\\$1'+.4m
+\Z'\v'.25m'\D'l 0 -1m'\D'l \\n[par*bxw]u 0'\D'l 0 1m'\D'l -\\n[par*bxw]u 0''\
+\Z'\h'.2m'\s-1\\$1\s+1'\
+\h'\\n[par*bxw]u'\\$2
+. ft P
+. \}
+. el \{\
+. RB [ \\$1 ]\\$2
+. \}
+.\}
+..
+'\"
+'\" strings to set current color (null with old groff)
+'\"
+.if mred .ds red \m[red]
+.if mgreen .ds green \m[green]
+.if mblue .ds blue \m[blue]
+.if mblack .ds black \m[black]
+.if mblack .ds mP \mP
+'\"
+'\" fix for grotty + xterm. We call for orange, grotty outputs yellow,
+'\" but xterm displays yellow as orange. The cycle is complete.
+'\"
+.if n .defcolor orange rgb #ffff00
+'\"
+'\" color <color> - set the current color (ignores request with old groff)
+'\"
+.de color
+.if mred \m[\\$1]\c
+..
+'\"
+'\" colorword <color> <word> - colorize a word (ignored by old groff)
+'\"
+.de colorword
+.ie m\\$1 \m[\\$1]\\$2\mP\c
+.el \\$2\c
+..
+'\"
+'\" colbox <fg> <bg> <word> - colorize a word in a filled box
+'\"
+.de colbox
+.ie mred \M[\\$2]\
+\v'+.167v'\
+\D'P 0 -0.9v \w'\\$3'u 0 0 +0.9v -\w'\\$3'u 0'\
+\v'-.167v'\
+\m[\\$1]\\$3\mP\MP
+.el \\$3\c
+..
+'\"
+'\" Macros for doing pdfmarks
+'\"
+.de specialps
+\\k_\X'ps: \\$*'\h'|\\n_u'\c
+..
+'\"
+'\" pdfmark PDFMARKCODE
+'\"
+.ds pdfmarks
+.if d pdfmarks \{\
+.de pdfmark
+. specialps exec [\\$1 pdfmark
+..
+'\"
+'\" pdfdest LINKNAME
+'\"
+.de pdfdest
+.pdfmark "/Dest /\\$1 /View [/XYZ -5 PL null] /DEST"
+..
+'\"
+'\" pdfbookmark COUNT LINKNAME STRING
+'\"
+.de pdfbookmark
+. pdfmark "/View [/XYZ 44 730 1.0] /Count \\$1 /Dest /\\$2 /Title (\\$3) /OUT"
+..
+'\"
+'\" Define the SH and SS macros to save pdfmark information
+'\" in "arrays" of numbers and strings.
+'\"
+.if !r rr_n \{\
+.nr rr_n 0 1
+.am SH
+. nr rr_levels!\\n+[rr_n] 2
+. ds rr_labels!\\n[rr_n] \\$*
+. pdfdest Link\\n[rr_n]
+..
+.am SS
+. nr rr_levels!\\n+[rr_n] 3
+. ds rr_labels!\\n[rr_n] \\$*
+. pdfdest Link\\n[rr_n]
+..
+.\}
+'\"
+'\" Called at the end of the document to generate the pdfmark outline
+'\"
+.de pdf_outline
+.nr rr_levels!\\n+[rr_n] 1
+.nr rr_i 0 1
+.while \\n+[rr_i]<\\n[rr_n] \{\
+. nr rr_ip1 \\n[rr_i]+1
+. nr rr_count 0
+. if \\n[rr_levels!\\n[rr_ip1]]>\\n[rr_levels!\\n[rr_i]] \{\
+. nr rr_j \\n[rr_i] 1
+. while \\n+[rr_j]<\\n[rr_n] \{\
+. if \\n[rr_levels!\\n[rr_j]]<=\\n[rr_levels!\\n[rr_i]] \{\
+. break
+. \}
+. if \\n[rr_levels!\\n[rr_j]]==(\\n[rr_levels!\\n[rr_i]]+1) \{\
+. nr rr_count \\n[rr_count]+1
+. \}
+. \}
+. \}
+. ds hhh \\*[rr_labels!\\n[rr_i]]
+. pdfbookmark \\n[rr_count] Link\\n[rr_i] "\\*[hhh]"
+.\}
+..
+'\"
+'\" Some postscript to make pdfmarks harmless on old interpreters...
+'\"
+.specialps "def /pdfmark where {pop} {userdict /pdfmark /cleartomark load put} ifelse"
+'\"
+'\" Force display of Bookmarks in Acrobat when document is viewed.
+'\"
+.pdfmark "[/PageMode /UseOutlines /Page 1 /View [/XYZ null null null] /DOCVIEW"
+'\"
+'\" Output the document info in pdfmarks
+'\"
+.pdfmark "\
+ /Title (\*[an-title](\*[an-section])) \
+ /Subject (foo2zjs Manual Page) \
+ /Author (Rick Richardson) \
+ /Keywords (printing, ZjStream) \
+ /Creator (groff \n(.x.\n(.y.\n(.Y -man) \
+ /CreationDate (\*[an-extra1]) \
+ /ModDate (\*[an-extra1]) \
+ /DOCINFO"
+\}
+'\"
+'\" The manual page name is only 1st level mark
+'\"
+.nr rr_levels!\n+[rr_n] 1
+.ds rr_labels!\n[rr_n] \*[an-title](\*[an-section])
+.pdfdest Link\n[rr_n]
+'\"==========================================================================
+'\" MANUAL PAGE SOURCE
+'\"==========================================================================
+.SH NAME
+foo2zjs \- Convert Ghostscript pbmraw or bitcmyk format into a
+ZJS printer stream
+.SH SYNOPSIS
+.B foo2zjs
+.RI [ options "] <" pbmraw-file " >" zjs-file
+.sp 1
+.B foo2zjs
+.RI [ options "] <" bitcmyk-file " >" zjs-file
+.sp 1
+.B foo2zjs
+.RI [ options "] <" pksmraw-file " >" zjs-file
+.SH DESCRIPTION
+.B foo2zjs
+converts Ghostscript pbmraw, bitcmyk, or pksmraw output formats to monochrome
+or color ZJS streams,
+for driving the Minolta/QMS 2300 DL network color laser printer
+and other Zenographics-based printers.
+
+.SH COMMAND LINE OPTIONS
+.SS Normal Options
+These are the options used to select the parameters of a
+print job that are usually controlled on a per job basis.
+.TP
+.BI \-c
+Force color mode if autodetect doesn't work.
+.TP
+.BI \-d\0 duplex
+Duplex code to send to printer [1].
+.TS
+| n l | n l | n l .
+1 off 2 long edge 3 short edge
+.TE
+.TP
+.BI \-g\0 xpix x ypix
+Set page dimensions in pixels [10200x6600].
+.TP
+.BI \-m\0 media
+Media code to send to printer [1].
+.TS
+l l l
+l n n.
+_
+Media 2300DL 2200DL
+_
+standard 1 1
+transparency 2 2
+envelope 257 na
+letterhead 259 na
+thick 261 4
+postcard 262 na
+labels 263 3
+.TE
+.TP
+.BI \-p\0 paper
+Paper code to send to printer [1].
+.TS
+| n l | n l.
+1 letter 9 A4
+5 legal 11 A5
+7 executive 13 B5
+20 env #10 27 env DL
+28 env C5 34 env B5
+37 env Monarch
+.TE
+.TP
+.BI \-n\0 copies
+Number of copies [1].
+.TP
+.BI \-r\0 xres x yres
+Set device resolution in pixels/inch [1200x600].
+.TP
+.BI \-s\0 source
+Source (InputSlot) code to send to printer [7].
+.TS
+| n l | n l.
+1 upper 4 manual
+2 lower 7 auto
+.TE
+.TP
+.BI \-t
+Draft mode. Every other pixel is white.
+.TP
+.BI \-J\0 filename
+Filename string to send to printer.
+.TP
+.BI \-U\0 username
+Username string to send to printer.
+.SS Printer Tweaking Options
+These are the options used to customize the operation of \fBfoo2zjs\fP
+for a particular printer.
+.TP
+.BI \-u\0 xoff x yoff
+Set the offset of the start of the printable region from the
+upper left corner, in pixels [0x0].
+.TP
+.BI \-l\0 xoff x yoff
+Set the offset of the end of the printable region from the
+lower right corner, in pixels [0x0].
+.TP
+.BI \-L\0 mask
+Send logical clipping amounts implied by -u/-l in the ZjStream [3].
+.TS
+l l.
+0 don't send any logical clipping amounts
+1 only send Y clipping amount
+2 only send X clipping amount
+3 send both X and Y clipping amounts
+.TE
+.TP
+.BI \-P
+Do not send START_PLANE codes on monochrome output. May be
+needed by some black and white only printers, such as the
+HP LaserJet 1000.
+.TP
+.BI \-A
+AllIsBlack: convert C=1,M=1,Y=1 to just K=1. Works with bitcmyk input only.
+.TP
+.BI \-B
+BlackClears: K=1 forces C,M,Y to 0. Works with bitcmyk input only.
+.TP
+.BI \-X\0 padlen
+Add extra zero padding to the end of BID segments. The default is
+16 bytes. Padding 16 bytes of zeroes
+is needed for older ZjStream printers, such as the Minolta 2200DL
+and HP LaserJet 1000, and seems harmless to newer ones, such as
+the Minolta 2300DL. So the default should be good for all cases.
+.TP
+.BI \-z\0 model
+Model: 0=2300DL, 1=HP1020. Default is 0.
+.SS Debugging Options
+These options are used for debugging \fBfoo2zjs\fP.
+.TP
+.BI \-S\0 plane
+Output just a single color plane from a color print and print it
+on the black plane. The default is to output all color planes.
+.TS
+l l.
+1 Cyan
+2 Magenta
+3 Yellow
+4 Black
+.TE
+.TP
+.BI \-D\0 level
+Set Debug level [0].
+
+.SH EXAMPLES
+Create a black and white ZJS stream:
+
+.RS
+.nf
+gs -q -dBATCH -dSAFER -dQUIET -dNOPAUSE \
+ -sPAPERSIZE=letter -r1200x600 -sDEVICE=pbmraw \
+ -sOutputFile=- - < testpage.ps \
+| foo2zjs -r1200x600 -g10200x6600 -p1 >testpage.zm
+.fi
+.RE
+.P
+Create a color ZJS stream:
+
+.RS
+.nf
+gs -q -dBATCH -dSAFER -dQUIET -dNOPAUSE \
+ -sPAPERSIZE=letter -g10200x6600 -r1200x600 -sDEVICE=bitcmyk \
+ -sOutputFile=- - < testpage.ps \
+| foo2zjs -r1200x600 -g10200x6600 -p1 >testpage.zc
+.fi
+.RE
+
+.SH FILES
+.BR /usr/bin/foo2zjs
+.SH SEE ALSO
+.BR foo2zjs-wrapper (1),
+.BR zjsdecode (1)
+.SH "AUTHOR"
+Rick Richardson <rick.richardson@comcast.net>
+.br
+${URLZJS}/
+'/"
+'/"
+'/"
+.em pdf_outline
diff --git a/foo2zjs.c b/foo2zjs.c
new file mode 100644
index 0000000..99ec1b3
--- /dev/null
+++ b/foo2zjs.c
@@ -0,0 +1,1544 @@
+/*
+
+GENERAL
+This program converts pbm (B/W) images and 1-bit-per-pixel cmyk images
+(both produced by ghostscript) to Zenographics ZJ-stream format. There
+is some information about the ZJS format at http://ddk.zeno.com.
+
+With this utility, you can print to some HP and Minolta/QMS printers,
+such as these:
+ - Minolta/QMS 2300 DL B/W and color
+ - Minolta/QMS 2200 DL B/W and color
+ - Minolta/QMS 2430 DL B/W and color
+ - HP LaserJet 1000 B/W
+ - HP LaserJet 1005 B/W
+ - HP LaserJet 1018 B/W
+ - HP LaserJet 1020 B/W
+
+AUTHORS
+This program began life as Robert Szalai's 'pbmtozjs' program. It
+also uses Markus Kuhn's jbig-kit compression library (included, but
+also available at http://www.cl.cam.ac.uk/~mgk25/jbigkit/).
+
+The program was overhauled by Rick Richardson to limit data chunk size
+to 65536 bytes, add command line options, add color support for the
+Minolta/QMS 2300DL, and other miscellaneous features.
+
+You can contact the current author at mailto:rick.richardson@comcast.net
+
+LICENSE
+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.
+
+If you want to use this program under different license conditions,
+then contact the author for an arrangement.
+
+It is possible that certain products which can be built using the jbig
+software module might form inventions protected by patent rights in
+some countries (e.g., by patents about arithmetic coding algorithms
+owned by IBM and AT&T in the USA). Provision of this software by the
+author does NOT include any licenses for any patents. In those
+countries where a patent license is required for certain applications
+of this software module, you will have to obtain such a license
+yourself.
+
+*/
+
+static char Version[] = "$Id: foo2zjs.c,v 1.77 2006/12/07 13:24:31 rick Exp $";
+
+#include <stdio.h>
+#include <stdlib.h>
+#include <ctype.h>
+#include <string.h>
+#include <unistd.h>
+#include <stdarg.h>
+#include "jbig.h"
+#include "zjs.h"
+
+/*
+ * Command line options
+ */
+int Debug = 0;
+int ResX = 1200;
+int ResY = 600;
+int Bpp = 1;
+int PaperCode = DMPAPER_LETTER;
+int PageWidth = 1200 * 8.5;
+int PageHeight = 600 * 11;
+int UpperLeftX = 0;
+int UpperLeftY = 0;
+int LowerRightX = 0;
+int LowerRightY = 0;
+int Copies = 1;
+int Duplex = DMDUPLEX_OFF;
+int SourceCode = DMBIN_AUTO;
+int MediaCode = DMMEDIA_STANDARD;
+char *Username = NULL;
+char *Filename = NULL;
+int Mode = 0;
+ #define MODE_MONO 1
+ #define MODE_COLOR 2
+int Model = 0;
+ #define MODEL_2300DL 0
+ #define MODEL_HP1020 1
+ #define MODEL_LAST 1
+
+int Color2Mono = 0;
+int BlackClears = 0;
+int AllIsBlack = 0;
+int OutputStartPlane = 1;
+int ExtraPad = 16;
+
+int LogicalOffsetX = 0;
+int LogicalOffsetY = 0;
+
+#define LOGICAL_CLIP_X 2
+#define LOGICAL_CLIP_Y 1
+int LogicalClip = LOGICAL_CLIP_X | LOGICAL_CLIP_Y;
+int SaveToner = 0;
+int PageNum = 0;
+int RealWidth;
+int EconoMode = 0;
+
+FILE *EvenPages = NULL;
+typedef struct
+{
+ off_t b, e;
+} SEEKREC;
+SEEKREC SeekRec[2000];
+int SeekIndex = 0;
+off_t SeekMedia;
+
+long JbgOptions[5] =
+{
+ /* Order */
+ JBG_ILEAVE | JBG_SMID,
+ /* Options */
+ JBG_DELAY_AT | JBG_LRLTWO | JBG_TPDON | JBG_TPBON | JBG_DPON,
+ /* L0 */
+ 128,
+ /* MX */
+ 16,
+ /* MY */
+ 0
+};
+
+void
+usage(void)
+{
+ fprintf(stderr,
+"Usage:\n"
+" foo2zjs [options] <pbmraw-file >zjs-file\n"
+"\n"
+" Convert Ghostscript pbmraw format to a monochrome ZJS stream,\n"
+" for driving the Minolta/QMS 2300 DL network color laser printer\n"
+" and other Zenographics-based black and white printers.\n"
+"\n"
+" gs -q -dBATCH -dSAFER -dQUIET -dNOPAUSE \\ \n"
+" -sPAPERSIZE=letter -r1200x600 -sDEVICE=pbmraw \\ \n"
+" -sOutputFile=- - < testpage.ps \\ \n"
+" | foo2zjs -r1200x600 -g10200x6600 -p1 >testpage.zm\n"
+"\n"
+" foo2zjs [options] <bitcmyk-file >zjs-file\n"
+" foo2zjs [options] <pksmraw-file >zjs-file\n"
+"\n"
+" Convert Ghostscript bitcmyk or pksmraw format to a color ZJS stream,\n"
+" for driving the Minolta/QMS 2300 DL network color laser printer\n"
+" N.B. Color correction is expected to be performed by ghostscript.\n"
+"\n"
+" gs -q -dBATCH -dSAFER -dQUIET -dNOPAUSE \\ \n"
+" -sPAPERSIZE=letter -g10200x6600 -r1200x600 -sDEVICE=bitcmyk \\ \n"
+" -sOutputFile=- - < testpage.ps \\ \n"
+" | foo2zjs -r1200x600 -g10200x6600 -p1 >testpage.zc\n"
+"\n"
+"Normal Options:\n"
+"-c Force color mode if autodetect doesn't work\n"
+"-d duplex Duplex code to send to printer [%d]\n"
+" 1=off, 2=longedge, 3=shortedge\n"
+" 4=manual longedge, 5=manual shortedge\n"
+"-g <xpix>x<ypix> Set page dimensions in pixels [%dx%d]\n"
+"-m media Media code to send to printer [%d]\n"
+" 1=standard 2=transparency 3=glossy 257=envelope\n"
+" 259=letterhead 261=thickstock 262=postcard 263=labels\n"
+"-p paper Paper code to send to printer [%d]\n"
+" 1=letter, 5=legal 7=executive 9=A4 11=A5 13=B5\n"
+" 20=env#10, 27=envDL 28=envC5 34=envB5 37=envMonarch\n"
+"-n copies Number of copies [%d]\n"
+"-r <xres>x<yres> Set device resolution in pixels/inch [%dx%d]\n"
+"-s source Source code to send to printer [%d]\n"
+" 1=upper 2=lower 4=manual 7=auto\n"
+" Code numbers may vary with printer model\n"
+"-t Draft mode. Every other pixel is white.\n"
+"-J filename Filename string to send to printer [%s]\n"
+"-U username Username string to send to printer [%s]\n"
+"\n"
+"Printer Tweaking Options:\n"
+"-u <xoff>x<yoff> Set offset of upper left printable in pixels [%dx%d]\n"
+"-l <xoff>x<yoff> Set offset of lower right printable in pixels [%dx%d]\n"
+"-L mask Send logical clipping values from -u/-l in ZjStream [%d]\n"
+" 0=no, 1=Y, 2=X, 3=XY\n"
+"-A AllIsBlack: convert C=1,M=1,Y=1 to just K=1\n"
+"-B BlackClears: K=1 forces C,M,Y to 0\n"
+" -A, -B work with bitcmyk input only\n"
+"-P Do not output START_PLANE codes. May be needed by some\n"
+" some black and white only printers.\n"
+"-X padlen Add extra zero padding to the end of BID segments [%d]\n"
+"-z model Model: 0=2300DL 1=hp1020 [%d]\n"
+"\n"
+"Debugging Options:\n"
+"-S plane Output just a single color plane from a color print [all]\n"
+" 1=Cyan, 2=Magenta, 3=Yellow, 4=Black\n"
+"-D lvl Set Debug level [%d]\n"
+"-V Version %s\n"
+ , Duplex
+ , PageWidth , PageHeight
+ , MediaCode
+ , PaperCode
+ , Copies
+ , ResX , ResY
+ , SourceCode
+ , Filename ? Filename : ""
+ , Username ? Username : ""
+ , UpperLeftX , UpperLeftY
+ , LowerRightX , LowerRightY
+ , LogicalClip
+ , ExtraPad
+ , Model
+ , Debug
+ , Version
+ );
+
+ exit(1);
+}
+
+/*
+ * Mirror1: bits 01234567 become 76543210
+ */
+unsigned char Mirror1[256] =
+{
+ 0,128, 64,192, 32,160, 96,224, 16,144, 80,208, 48,176,112,240,
+ 8,136, 72,200, 40,168,104,232, 24,152, 88,216, 56,184,120,248,
+ 4,132, 68,196, 36,164,100,228, 20,148, 84,212, 52,180,116,244,
+ 12,140, 76,204, 44,172,108,236, 28,156, 92,220, 60,188,124,252,
+ 2,130, 66,194, 34,162, 98,226, 18,146, 82,210, 50,178,114,242,
+ 10,138, 74,202, 42,170,106,234, 26,154, 90,218, 58,186,122,250,
+ 6,134, 70,198, 38,166,102,230, 22,150, 86,214, 54,182,118,246,
+ 14,142, 78,206, 46,174,110,238, 30,158, 94,222, 62,190,126,254,
+ 1,129, 65,193, 33,161, 97,225, 17,145, 81,209, 49,177,113,241,
+ 9,137, 73,201, 41,169,105,233, 25,153, 89,217, 57,185,121,249,
+ 5,133, 69,197, 37,165,101,229, 21,149, 85,213, 53,181,117,245,
+ 13,141, 77,205, 45,173,109,237, 29,157, 93,221, 61,189,125,253,
+ 3,131, 67,195, 35,163, 99,227, 19,147, 83,211, 51,179,115,243,
+ 11,139, 75,203, 43,171,107,235, 27,155, 91,219, 59,187,123,251,
+ 7,135, 71,199, 39,167,103,231, 23,151, 87,215, 55,183,119,247,
+ 15,143, 79,207, 47,175,111,239, 31,159, 95,223, 63,191,127,255,
+};
+
+/*
+ * Mirror2: bits 01234567 become 67452301
+ */
+unsigned char Mirror2[256] =
+{
+ 0, 64,128,192, 16, 80,144,208, 32, 96,160,224, 48,112,176,240,
+ 4, 68,132,196, 20, 84,148,212, 36,100,164,228, 52,116,180,244,
+ 8, 72,136,200, 24, 88,152,216, 40,104,168,232, 56,120,184,248,
+ 12, 76,140,204, 28, 92,156,220, 44,108,172,236, 60,124,188,252,
+ 1, 65,129,193, 17, 81,145,209, 33, 97,161,225, 49,113,177,241,
+ 5, 69,133,197, 21, 85,149,213, 37,101,165,229, 53,117,181,245,
+ 9, 73,137,201, 25, 89,153,217, 41,105,169,233, 57,121,185,249,
+ 13, 77,141,205, 29, 93,157,221, 45,109,173,237, 61,125,189,253,
+ 2, 66,130,194, 18, 82,146,210, 34, 98,162,226, 50,114,178,242,
+ 6, 70,134,198, 22, 86,150,214, 38,102,166,230, 54,118,182,246,
+ 10, 74,138,202, 26, 90,154,218, 42,106,170,234, 58,122,186,250,
+ 14, 78,142,206, 30, 94,158,222, 46,110,174,238, 62,126,190,254,
+ 3, 67,131,195, 19, 83,147,211, 35, 99,163,227, 51,115,179,243,
+ 7, 71,135,199, 23, 87,151,215, 39,103,167,231, 55,119,183,247,
+ 11, 75,139,203, 27, 91,155,219, 43,107,171,235, 59,123,187,251,
+ 15, 79,143,207, 31, 95,159,223, 47,111,175,239, 63,127,191,255,
+};
+
+/*
+ * Mirror4: bits 01234567 become 45670123
+ */
+unsigned char Mirror4[256] =
+{
+ 0, 16, 32, 48, 64, 80, 96,112,128,144,160,176,192,208,224,240,
+ 1, 17, 33, 49, 65, 81, 97,113,129,145,161,177,193,209,225,241,
+ 2, 18, 34, 50, 66, 82, 98,114,130,146,162,178,194,210,226,242,
+ 3, 19, 35, 51, 67, 83, 99,115,131,147,163,179,195,211,227,243,
+ 4, 20, 36, 52, 68, 84,100,116,132,148,164,180,196,212,228,244,
+ 5, 21, 37, 53, 69, 85,101,117,133,149,165,181,197,213,229,245,
+ 6, 22, 38, 54, 70, 86,102,118,134,150,166,182,198,214,230,246,
+ 7, 23, 39, 55, 71, 87,103,119,135,151,167,183,199,215,231,247,
+ 8, 24, 40, 56, 72, 88,104,120,136,152,168,184,200,216,232,248,
+ 9, 25, 41, 57, 73, 89,105,121,137,153,169,185,201,217,233,249,
+ 10, 26, 42, 58, 74, 90,106,122,138,154,170,186,202,218,234,250,
+ 11, 27, 43, 59, 75, 91,107,123,139,155,171,187,203,219,235,251,
+ 12, 28, 44, 60, 76, 92,108,124,140,156,172,188,204,220,236,252,
+ 13, 29, 45, 61, 77, 93,109,125,141,157,173,189,205,221,237,253,
+ 14, 30, 46, 62, 78, 94,110,126,142,158,174,190,206,222,238,254,
+ 15, 31, 47, 63, 79, 95,111,127,143,159,175,191,207,223,239,255,
+};
+
+void
+rotate_bytes_180(unsigned char *sp, unsigned char *ep, unsigned char *mirror)
+{
+ unsigned char tmp;
+
+ while (sp < ep)
+ {
+ tmp = mirror[*sp];
+ *sp = mirror[*ep];
+ *ep = tmp;
+ ++sp;
+ --ep;
+ }
+ if (sp == ep)
+ *sp = mirror[*sp];
+}
+
+void
+debug(int level, char *fmt, ...)
+{
+ va_list ap;
+
+ if (Debug < level)
+ return;
+
+ setvbuf(stderr, (char *) NULL, _IOLBF, BUFSIZ);
+ va_start(ap, fmt);
+ vfprintf(stderr, fmt, ap);
+ va_end(ap);
+}
+
+void
+error(int fatal, char *fmt, ...)
+{
+ va_list ap;
+
+ va_start(ap, fmt);
+ vfprintf(stderr, fmt, ap);
+ va_end(ap);
+
+ if (fatal)
+ exit(fatal);
+}
+
+static void
+chunk_write_rsvd(unsigned long type, unsigned int rsvd,
+ unsigned long items, unsigned long size, FILE *fp)
+{
+ ZJ_HEADER chunk;
+
+ chunk.type = be32(type);
+ chunk.items = be32(items);
+ chunk.size = be32(sizeof(ZJ_HEADER) + size);
+ chunk.reserved = be16(rsvd);
+ chunk.signature = 0x5a5a;
+ fwrite(&chunk, 1, sizeof(ZJ_HEADER), fp);
+}
+
+static void
+chunk_write(unsigned long type, unsigned long items, unsigned long size,
+ FILE *fp)
+{
+ chunk_write_rsvd(type, 0, items, size, fp);
+}
+
+static void
+item_uint32_write(unsigned short item, unsigned long value, FILE *fp)
+{
+ ZJ_ITEM_UINT32 item_uint32;
+
+ item_uint32.header.size = be32(sizeof(ZJ_ITEM_UINT32));
+ item_uint32.header.item = be16(item);
+ item_uint32.header.type = ZJIT_UINT32;
+ item_uint32.header.param = 0;
+ item_uint32.value = be32(value);
+ fwrite(&item_uint32, 1, sizeof(ZJ_ITEM_UINT32), fp);
+}
+
+static int
+item_str_write(unsigned short item, char *str, FILE *fp)
+{
+ int lenpadded;
+ ZJ_ITEM_HEADER hdr;
+
+ lenpadded = 4 * ((strlen(str)+1 + 3) / 4);
+
+ hdr.size = be32(sizeof(hdr) + lenpadded);
+ hdr.item = be16(item);
+ hdr.type = ZJIT_STRING;
+ hdr.param = 0;
+ if (fp)
+ {
+ fwrite(&hdr, sizeof(hdr), 1, fp);
+ fwrite(str, lenpadded, 1, fp);
+ }
+ return (sizeof(hdr) + lenpadded);
+}
+
+/*
+ * A linked list of compressed data
+ */
+typedef struct _BIE_CHAIN{
+ unsigned char *data;
+ size_t len;
+ struct _BIE_CHAIN *next;
+} BIE_CHAIN;
+
+void
+free_chain(BIE_CHAIN *chain)
+{
+ BIE_CHAIN *next;
+ next = chain;
+ while ((chain = next))
+ {
+ next = chain->next;
+ if (chain->data)
+ free(chain->data);
+ free(chain);
+ }
+}
+
+int
+write_plane(int planeNum, BIE_CHAIN **root, FILE *fp)
+{
+ BIE_CHAIN *current = *root;
+ BIE_CHAIN *next;
+ int i, len, pad_len;
+ #define PADTO 4
+
+ debug(3, "Write Plane %d\n", planeNum);
+
+ /* error handling */
+ if (!current)
+ error(1,"There is no JBIG!\n");
+ if (!current->next)
+ error(1,"There is no or wrong JBIG header!\n");
+ if (current->len != 20)
+ error(1,"wrong BIH length\n");
+
+ if (planeNum)
+ {
+ chunk_write(ZJT_START_PLANE, 1, 1*sizeof(ZJ_ITEM_UINT32), fp);
+ item_uint32_write(ZJI_PLANE, planeNum, fp);
+ }
+
+ for (current = *root; current && current->len; current = current->next)
+ {
+ if (current == *root)
+ {
+ chunk_write(ZJT_JBIG_BIH, 0, current->len, fp);
+ fwrite(current->data, 1, current->len, fp);
+ }
+ else
+ {
+ len = current->len;
+ next = current->next;
+ if (!next || !next->len)
+ pad_len = ExtraPad + PADTO * ((len+PADTO-1)/PADTO) - len;
+ else
+ pad_len = 0;
+ chunk_write(ZJT_JBIG_BID, 0, len + pad_len, fp);
+ fwrite(current->data, 1, len, fp);
+ for (i = 0; i < pad_len; i++ )
+ putc(0, fp);
+ }
+ }
+
+ free_chain(*root);
+
+ chunk_write(ZJT_END_JBIG, 0, 0, fp);
+ if (planeNum)
+ chunk_write(ZJT_END_PLANE, 0, 0, fp);
+ return 0;
+}
+
+void
+start_page(BIE_CHAIN **root, int nbie, FILE *ofp)
+{
+ BIE_CHAIN *current = *root;
+ unsigned long w, h;
+ static int pageno = 0;
+ int nitems;
+
+ /* error handling */
+ if (!current)
+ error(1, "There is no JBIG!\n");
+ if (!current->next)
+ error(1, "There is no or wrong JBIG header!\n");
+ if (current->len != 20 )
+ error(1,"wrong BIH length\n");
+
+ /* startpage, jbig_bih, jbig_bid, jbig_end, endpage */
+ w = (((long) current->data[ 4] << 24)
+ | ((long) current->data[ 5] << 16)
+ | ((long) current->data[ 6] << 8)
+ | (long) current->data[ 7]);
+ h = (((long) current->data[ 8] << 24)
+ | ((long) current->data[ 9] << 16)
+ | ((long) current->data[10] << 8)
+ | (long) current->data[11]);
+
+ nitems = 13;
+ if (LogicalOffsetX != 0)
+ ++nitems;
+ if (LogicalOffsetY != 0)
+ ++nitems;
+ if (Model == MODEL_2300DL)
+ nitems += 2;
+
+ if (Model == MODEL_2300DL)
+ chunk_write(ZJT_START_PAGE,
+ nitems, nitems * sizeof(ZJ_ITEM_UINT32), ofp);
+ else
+ chunk_write_rsvd(ZJT_START_PAGE, 0x9c,
+ nitems, nitems * sizeof(ZJ_ITEM_UINT32), ofp);
+ item_uint32_write(ZJI_ECONOMODE, EconoMode, ofp);
+ if (Model == MODEL_2300DL)
+ item_uint32_write(22, 1, ofp);
+ item_uint32_write(ZJI_VIDEO_X, RealWidth / Bpp,ofp);
+ item_uint32_write(ZJI_VIDEO_Y, h, ofp);
+ item_uint32_write(ZJI_VIDEO_BPP, Bpp, ofp);
+ item_uint32_write(ZJI_RASTER_X, RealWidth, ofp);
+ item_uint32_write(ZJI_RASTER_Y, h, ofp);
+ if (LogicalOffsetX != 0)
+ item_uint32_write(ZJI_OFFSET_X, LogicalOffsetX, ofp);
+ if (LogicalOffsetY != 0)
+ item_uint32_write(ZJI_OFFSET_Y, LogicalOffsetY, ofp);
+ item_uint32_write(ZJI_NBIE, nbie, ofp);
+ item_uint32_write(ZJI_RESOLUTION_X, ResX, ofp);
+ item_uint32_write(ZJI_RESOLUTION_Y, ResY, ofp);
+ item_uint32_write(ZJI_DMDEFAULTSOURCE, SourceCode, ofp);
+ item_uint32_write(ZJI_DMCOPIES, Copies, ofp);
+ item_uint32_write(ZJI_DMPAPER, PaperCode, ofp);
+ item_uint32_write(ZJI_DMMEDIATYPE, MediaCode, ofp);
+ if ((PageNum & 1) == 0 && EvenPages)
+ SeekMedia = ftell(EvenPages) - 4;
+ if (Model == MODEL_2300DL)
+ item_uint32_write(ZJI_MINOLTA_PAGE_NUMBER, ++pageno, ofp);
+}
+
+void
+end_page(FILE *ofp)
+{
+ chunk_write(ZJT_END_PAGE, 0, 0, ofp);
+}
+
+int
+write_page(BIE_CHAIN **root, BIE_CHAIN **root2,
+ BIE_CHAIN **root3, BIE_CHAIN **root4, FILE *ofp)
+{
+ int nbie = root2 ? 4 : 1;
+
+ start_page(root, nbie, ofp);
+
+ if (root3)
+ write_plane(3, root3, ofp);
+ if (root2)
+ write_plane(2, root2, ofp);
+ if (root)
+ {
+ if (OutputStartPlane)
+ write_plane(nbie == 1 ? 4 : 1, root, ofp);
+ else
+ write_plane(nbie == 1 ? 0 : 1, root, ofp);
+ }
+ if (root4)
+ write_plane(4, root4, ofp);
+
+ end_page(ofp);
+ return 0;
+}
+
+/*
+ * This creates a linked list of compressed data. The first item
+ * in the list is the BIH and is always 20 bytes in size. Each following
+ * item is 65536 bytes in length. The last item length is whatever remains.
+ */
+void
+output_jbig(unsigned char *start, size_t len, void *cbarg)
+{
+ BIE_CHAIN *current, **root = (BIE_CHAIN **) cbarg;
+ int size = 65536; // Printer does strange things otherwise.
+
+ if ( (*root) == NULL)
+ {
+ (*root) = malloc(sizeof(BIE_CHAIN));
+ if (!(*root))
+ error(1, "Can't allocate space for chain\n");
+
+ (*root)->data = NULL;
+ (*root)->next = NULL;
+ (*root)->len = 0;
+ size = 20;
+ if (len != 20)
+ error(1, "First chunk must be BIH and 20 bytes long\n");
+ }
+
+ current = *root;
+ while (current->next)
+ current = current->next;
+
+ while (len > 0)
+ {
+ int amt, left;
+
+ if (!current->data)
+ {
+ current->data = malloc(size);
+ if (!current->data)
+ error(1, "Can't allocate space for compressed data\n");
+ }
+
+ left = size - current->len;
+ amt = (len > left) ? left : len;
+ memcpy(current->data + current->len, start, amt);
+ current->len += amt;
+ len -= amt;
+ start += amt;
+
+ if (current->len == size)
+ {
+ current->next = malloc(sizeof(BIE_CHAIN));
+ if (!current->next)
+ error(1, "Can't allocate space for chain\n");
+ current = current->next;
+ current->data = NULL;
+ current->next = NULL;
+ current->len = 0;
+ }
+ }
+}
+
+void
+start_doc(FILE *fp)
+{
+ char header[4] = "JZJZ"; // Big-endian data
+ int nitems;
+ int size;
+
+ fwrite(header, 1, sizeof(header), fp);
+
+ nitems = 3;
+ if (Model == MODEL_2300DL)
+ ++nitems;
+ size = nitems * sizeof(ZJ_ITEM_UINT32);
+ if (Username)
+ {
+ ++nitems;
+ size += item_str_write(0, Username, NULL);
+ }
+ if (Filename)
+ {
+ ++nitems;
+ size += item_str_write(0, Filename, NULL);
+ }
+
+ if (Model == MODEL_2300DL)
+ chunk_write(ZJT_START_DOC, nitems, size, fp);
+ else
+ chunk_write_rsvd(ZJT_START_DOC, 0x24, nitems, size, fp);
+
+ item_uint32_write(ZJI_DMCOLLATE, 0, fp);
+ item_uint32_write(ZJI_DMDUPLEX, (Duplex <= 3) ? Duplex : 1, fp);
+ item_uint32_write(ZJI_PAGECOUNT, 0, fp);
+ if (Model == MODEL_2300DL)
+ item_uint32_write(ZJI_QUANTITY, 1, fp);
+ // item_uint32_write(ZJI_QMS_FINEMODE, 0, fp);
+ // item_uint32_write(ZJI_QMS_OUTBIN, 1, fp);
+
+ if (Username)
+ item_str_write(ZJI_MINOLTA_USERNAME, Username, fp);
+ if (Filename)
+ item_str_write(ZJI_MINOLTA_FILENAME, Filename, fp);
+}
+
+void
+end_doc(FILE *fp)
+{
+ int nitems;
+
+ nitems = 0;
+ chunk_write(ZJT_END_DOC , nitems, nitems * sizeof(ZJ_ITEM_UINT32), fp);
+
+ // item_uint32_write(0x8112, 1, fp);
+}
+
+void
+load_tray2(FILE *fp)
+{
+ int nitems;
+
+ nitems = 0;
+ chunk_write(ZJT_2600N_PAUSE, nitems, nitems * sizeof(ZJ_ITEM_UINT32), fp);
+}
+
+static int AnyColor;
+
+void
+cmyk_planes(unsigned char *plane[4], unsigned char *raw, int w, int h)
+{
+ int rawbpl = (w+1) / 2;
+ int bpl = (w + 7) / 8;
+ int i;
+ int x, y;
+ unsigned char byte;
+ unsigned char mask[8] = { 128, 64, 32, 16, 8, 4, 2, 1 };
+ int aib = AllIsBlack;
+ int bc = BlackClears;
+
+ AnyColor = 0;
+ for (i = 0; i < 4; ++i)
+ memset(plane[i], 0, bpl * h);
+
+ //
+ // Unpack the combined plane into individual color planes
+ //
+ // TODO: this can be speeded up using a 256 or 65536 entry lookup table
+ //
+ for (y = 0; y < h; ++y)
+ {
+ for (x = 0; x < w; ++x)
+ {
+ byte = raw[y*rawbpl + x/2];
+
+ if (aib && (byte & 0xE0) == 0xE0)
+ {
+ plane[3][y*bpl + x/8] |= mask[x&7];
+ }
+ else if (byte & 0x10)
+ {
+ plane[3][y*bpl + x/8] |= mask[x&7];
+ if (!bc)
+ {
+ if (byte & 0x80) plane[0][y*bpl + x/8] |= mask[x&7];
+ if (byte & 0x40) plane[1][y*bpl + x/8] |= mask[x&7];
+ if (byte & 0x20) plane[2][y*bpl + x/8] |= mask[x&7];
+ if (byte & 0xE0) AnyColor |= byte;
+ }
+ }
+ else
+ {
+ if (byte & 0x80) plane[0][y*bpl + x/8] |= mask[x&7];
+ if (byte & 0x40) plane[1][y*bpl + x/8] |= mask[x&7];
+ if (byte & 0x20) plane[2][y*bpl + x/8] |= mask[x&7];
+ if (byte & 0xE0) AnyColor |= byte;
+ }
+
+ ++x;
+ if (aib && (byte & 0x0E) == 0x0E)
+ {
+ plane[3][y*bpl + x/8] |= mask[x&7];
+ }
+ else if (byte & 0x1)
+ {
+ plane[3][y*bpl + x/8] |= mask[x&7];
+ if (!bc)
+ {
+ if (byte & 0x8) plane[0][y*bpl + x/8] |= mask[x&7];
+ if (byte & 0x4) plane[1][y*bpl + x/8] |= mask[x&7];
+ if (byte & 0x2) plane[2][y*bpl + x/8] |= mask[x&7];
+ if (byte & 0xE) AnyColor |= byte;
+ }
+ }
+ else
+ {
+ if (byte & 0x8) plane[0][y*bpl + x/8] |= mask[x&7];
+ if (byte & 0x4) plane[1][y*bpl + x/8] |= mask[x&7];
+ if (byte & 0x2) plane[2][y*bpl + x/8] |= mask[x&7];
+ if (byte & 0xE) AnyColor |= byte;
+ }
+ }
+ }
+ debug(2, "BlackClears = %d; AnyColor = %s %s %s\n",
+ BlackClears,
+ (AnyColor & 0x88) ? "Cyan" : "",
+ (AnyColor & 0x44) ? "Magenta" : "",
+ (AnyColor & 0x22) ? "Yellow" : ""
+ );
+}
+
+int
+cmyk_page(unsigned char *raw, int w, int h, FILE *ofp)
+{
+ BIE_CHAIN *chain[4];
+ int i;
+ int bpl = (w + 7) / 8;
+ unsigned char *plane[4], *bitmaps[4][1];
+ struct jbg_enc_state se[4];
+
+ RealWidth = w;
+ for (i = 0; i < 4; ++i)
+ {
+ plane[i] = malloc(bpl * h);
+ if (!plane[i]) error(3, "Cannot allocate space for bit plane\n");
+ chain[i] = NULL;
+ }
+
+ cmyk_planes(plane, raw, w, h);
+ for (i = 0; i < 4; ++i)
+ {
+ if (Debug >= 9)
+ {
+ FILE *dfp;
+ char fname[256];
+ sprintf(fname, "xxxplane%d", i);
+ dfp = fopen(fname, "w");
+ if (dfp)
+ {
+ fwrite(plane[i], bpl*h, 1, dfp);
+ fclose(dfp);
+ }
+ }
+
+ *bitmaps[i] = plane[i];
+
+ jbg_enc_init(&se[i], w, h, 1, bitmaps[i], output_jbig, &chain[i]);
+ jbg_enc_options(&se[i], JbgOptions[0], JbgOptions[1],
+ JbgOptions[2], JbgOptions[3], JbgOptions[4]);
+ jbg_enc_out(&se[i]);
+ jbg_enc_free(&se[i]);
+ }
+
+ if (Color2Mono)
+ write_page(&chain[Color2Mono-1], NULL, NULL, NULL, ofp);
+ else if (AnyColor)
+ write_page(&chain[0], &chain[1], &chain[2], &chain[3], ofp);
+ else
+ write_page(&chain[3], NULL, NULL, NULL, ofp);
+
+ for (i = 0; i < 4; ++i)
+ free(plane[i]);
+ return 0;
+}
+
+int
+pksm_page(unsigned char *plane[4], int w, int h, FILE *ofp)
+{
+ BIE_CHAIN *chain[4];
+ int i;
+ unsigned char *bitmaps[4][1];
+ struct jbg_enc_state se[4];
+
+ RealWidth = w;
+ for (i = 0; i < 4; ++i)
+ chain[i] = NULL;
+
+ for (i = 0; i < 4; ++i)
+ {
+ *bitmaps[i] = plane[i];
+
+ jbg_enc_init(&se[i], w, h, 1, bitmaps[i], output_jbig, &chain[i]);
+ jbg_enc_options(&se[i], JbgOptions[0], JbgOptions[1],
+ JbgOptions[2], JbgOptions[3], JbgOptions[4]);
+ jbg_enc_out(&se[i]);
+ jbg_enc_free(&se[i]);
+ }
+
+ if (Color2Mono)
+ write_page(&chain[Color2Mono-1], NULL, NULL, NULL, ofp);
+ else if (AnyColor)
+ write_page(&chain[0], &chain[1], &chain[2], &chain[3], ofp);
+ else
+ write_page(&chain[3], NULL, NULL, NULL, ofp);
+
+ return 0;
+}
+
+int
+pbm_page(unsigned char *buf, int w, int h, FILE *ofp)
+{
+ BIE_CHAIN *chain = NULL;
+ unsigned char *bitmaps[1];
+ struct jbg_enc_state se;
+
+ RealWidth = w;
+ if (Model == MODEL_HP1020)
+ w = (w + 127) & ~127;
+
+ if (SaveToner)
+ {
+ int x, y;
+ int bpl, bpl16;
+
+ bpl = (w + 7) / 8;
+ if (Model == MODEL_2300DL)
+ bpl16 = bpl;
+ else
+ bpl16 = (bpl + 15) & ~15;
+
+ for (y = 0; y < h; y += 2)
+ for (x = 0; x < bpl16; ++x)
+ buf[y*bpl16 + x] &= 0x55;
+ for (y = 1; y < h; y += 2)
+ for (x = 0; x < bpl16; ++x)
+ buf[y*bpl16 + x] &= 0xaa;
+ }
+
+ *bitmaps = buf;
+
+ jbg_enc_init(&se, w, h, 1, bitmaps, output_jbig, &chain);
+ jbg_enc_options(&se, JbgOptions[0], JbgOptions[1],
+ JbgOptions[2], JbgOptions[3], JbgOptions[4]);
+ jbg_enc_out(&se);
+ jbg_enc_free(&se);
+
+ write_page(&chain, NULL, NULL, NULL, ofp);
+
+ return 0;
+}
+
+int
+read_and_clip_image(unsigned char *buf,
+ int rawBpl, int rightBpl, int pixelsPerByte,
+ int bpl, int h, int bpl16, FILE *ifp)
+{
+ unsigned char *rowbuf, *rowp;
+ int y;
+ int rc;
+
+ rowbuf = malloc(rawBpl);
+ if (!rowbuf)
+ error(1, "Can't allocate row buffer\n");
+
+ // Clip top rows
+ if (UpperLeftY)
+ {
+ for (y = 0; y < UpperLeftY; ++y)
+ {
+ rc = fread(rowbuf, rawBpl, 1, ifp);
+ if (rc == 0)
+ goto eof;
+ if (rc != 1)
+ error(1, "Premature EOF(1) on input at y=%d\n", y);
+ }
+ }
+
+ // Copy the rows that we want to image
+ rowp = buf;
+ for (y = 0; y < h; ++y, rowp += bpl16)
+ {
+ // Clip left pixel *bytes*
+ if (UpperLeftX)
+ {
+ rc = fread(rowbuf, UpperLeftX / pixelsPerByte, 1, ifp);
+ if (rc == 0 && y == 0 && !UpperLeftY)
+ goto eof;
+ if (rc != 1)
+ error(1, "Premature EOF(2) on input at y=%d\n", y);
+ }
+
+ if (bpl != bpl16)
+ memset(rowp, 0, bpl16);
+ rc = fread(rowp, bpl, 1, ifp);
+ if (rc == 0 && y == 0 && !UpperLeftY && !UpperLeftX)
+ goto eof;
+ if (rc != 1)
+ error(1, "Premature EOF(3) on input at y=%d\n", y);
+
+ // Clip right pixels
+ if (rightBpl != bpl)
+ {
+ rc = fread(rowbuf, rightBpl - bpl, 1, ifp);
+ if (rc != 1)
+ error(1, "Premature EOF(4) on input at y=%d\n", y);
+ }
+ }
+
+ // Clip bottom rows
+ if (LowerRightY)
+ {
+ for (y = 0; y < LowerRightY; ++y)
+ {
+ rc = fread(rowbuf, rawBpl, 1, ifp);
+ if (rc != 1)
+ error(1, "Premature EOF(5) on input at y=%d\n", y);
+ }
+ }
+
+ free(rowbuf);
+ return (0);
+
+eof:
+ free(rowbuf);
+ return (EOF);
+}
+
+int
+cmyk_pages(FILE *ifp, FILE *ofp)
+{
+ unsigned char *buf;
+ int rawW, rawH, rawBpl;
+ int rightBpl;
+ int w, h, bpl;
+ int rc;
+
+ //
+ // Save the original Upper Right clip values as the logical offset,
+ // because we may adjust them slightly below, in the interest of speed.
+ //
+ if (LogicalClip & LOGICAL_CLIP_X)
+ LogicalOffsetX = UpperLeftX;
+ if (LogicalClip & LOGICAL_CLIP_Y)
+ LogicalOffsetY = UpperLeftY;
+
+ rawW = PageWidth;
+ rawH = PageHeight;
+ rawBpl = (PageWidth + 1) / 2;
+
+ // We only clip multiples of 2 pixels off the leading edge, and
+ // add any remainder to the amount we clip from the right edge.
+ // Its fast, and good enough for government work.
+ LowerRightX += UpperLeftX & 1;
+ UpperLeftX &= ~1;
+
+ w = rawW - UpperLeftX - LowerRightX;
+ h = rawH - UpperLeftY - LowerRightY;
+ bpl = (w + 1) / 2;
+ rightBpl = (rawW - UpperLeftX + 1) / 2;
+
+ buf = malloc(bpl * h);
+ if (!buf)
+ error(1, "Unable to allocate page buffer of %d x %d = %d bytes\n",
+ rawW, rawH, rawBpl * rawH);
+
+ for (;;)
+ {
+ rc = read_and_clip_image(buf, rawBpl, rightBpl, 2, bpl, h, bpl, ifp);
+ if (rc == EOF)
+ goto done;
+
+ ++PageNum;
+ if (Duplex == DMDUPLEX_LONGEDGE && (PageNum & 1) == 0)
+ rotate_bytes_180(buf, buf + bpl * h - 1, Mirror4);
+ if (Duplex == DMDUPLEX_MANUALLONG && (PageNum & 1) == 0)
+ rotate_bytes_180(buf, buf + bpl * h - 1, Mirror4);
+
+ if ((PageNum & 1) == 0 && EvenPages)
+ {
+ SeekRec[SeekIndex].b = ftell(EvenPages);
+ cmyk_page(buf, w, h, EvenPages);
+ SeekRec[SeekIndex].e = ftell(EvenPages);
+ debug(1, "CMYK Page: %d %ld %ld\n",
+ PageNum, SeekRec[SeekIndex].b, SeekRec[SeekIndex].e);
+ SeekIndex++;
+ }
+ else
+ cmyk_page(buf, w, h, ofp);
+ }
+
+done:
+ free(buf);
+ return 0;
+}
+
+static unsigned long
+getint(FILE *fp)
+{
+ int c;
+ unsigned long i;
+
+ while ((c = getc(fp)) != EOF && !isdigit(c))
+ if (c == '#')
+ while ((c = getc(fp)) != EOF && !(c == 13 || c == 10)) ;
+ if (c != EOF)
+ {
+ ungetc(c, fp);
+ fscanf(fp, "%lu", &i);
+ }
+ return i;
+}
+
+static void
+skip_to_nl(FILE *fp)
+{
+ for (;;)
+ {
+ int c;
+ c = getc(fp);
+ if (c == EOF)
+ error(1, "Premature EOF on input stream\n");
+ if (c == '\n')
+ return;
+ }
+}
+
+int
+pbm_header(FILE *ifp, int *p4eatenp, int *wp, int *hp)
+{
+ int c1, c2;
+
+ if (*p4eatenp)
+ *p4eatenp = 0; // P4 already eaten in main
+ else
+ {
+ c1 = getc(ifp);
+ if (c1 == EOF)
+ return 0;
+ c2 = getc(ifp);
+ if (c1 != 'P' || c2 != '4')
+ error(1, "Not a pbmraw data stream\n");
+ }
+
+ skip_to_nl(ifp);
+
+ *wp = getint(ifp);
+ *hp = getint(ifp);
+ skip_to_nl(ifp);
+ return 1;
+}
+
+int
+pksm_pages(FILE *ifp, FILE *ofp)
+{
+ unsigned char *plane[4];
+ int rawW, rawH, rawBpl;
+ int saveW = 0, saveH = 0;
+ int rightBpl;
+ int w, h, bpl;
+ int i;
+ int rc;
+ int p4eaten = 1;
+
+ //
+ // Save the original Upper Right clip values as the logical offset,
+ // because we may adjust them slightly below, in the interest of speed.
+ //
+ if (LogicalClip & LOGICAL_CLIP_X)
+ LogicalOffsetX = UpperLeftX;
+ if (LogicalClip & LOGICAL_CLIP_Y)
+ LogicalOffsetY = UpperLeftY;
+
+ for (;;)
+ {
+ ++PageNum;
+ AnyColor = 0;
+
+ for (i = 0; i < 4; ++i)
+ {
+ if (pbm_header(ifp, &p4eaten, &rawW, &rawH) == 0)
+ {
+ if (i == 0)
+ goto eof;
+ else
+ error(1, "Premature EOF(pksm) on page %d hdr, plane %d\n",
+ PageNum, i);
+ }
+ if (i == 0)
+ {
+ saveW = rawW;
+ saveH = rawH;
+ }
+ if (saveW != rawW)
+ error(1, "Image width changed from %d to %d on plane %d\n",
+ saveW, rawW, i);
+ if (saveH != rawH)
+ error(1, "Image height changed from %d to %d on plane %d\n",
+ saveH, rawH, i);
+
+ rawBpl = (rawW + 7) / 8;
+
+ // We only clip multiples of 8 pixels off the leading edge, and
+ // add any remainder to the amount we clip from the right edge.
+ // Its fast, and good enough for government work.
+ LowerRightX += UpperLeftX & 7;
+ UpperLeftX &= ~7;
+
+ w = rawW - UpperLeftX - LowerRightX;
+ h = rawH - UpperLeftY - LowerRightY;
+ bpl = (w + 7) / 8;
+ rightBpl = (rawW - UpperLeftX + 7) / 8;
+
+ plane[i] = malloc(bpl * h);
+ if (!plane[i])
+ error(1, "Can't allocate plane buffer\n");
+
+ rc = read_and_clip_image(plane[i],
+ rawBpl, rightBpl, 8, bpl, h, bpl, ifp);
+ if (rc == EOF)
+ error(1, "Premature EOF(pksm) on page %d data, plane %d\n",
+ PageNum, i);
+
+ if (Debug >= 9)
+ {
+ FILE *dfp;
+ char fname[256];
+ sprintf(fname, "xxxplane%d", i);
+ dfp = fopen(fname, "w");
+ if (dfp)
+ {
+ fwrite(plane[i], bpl*h, 1, dfp);
+ fclose(dfp);
+ }
+ }
+
+ // See if we can optimize this to be a monochrome page
+ if (!AnyColor && i != 3)
+ {
+ unsigned char *p, *e;
+
+ for (p = plane[i], e = p + bpl*h; p < e; ++p)
+ if (*p)
+ {
+ AnyColor |= 1<<i;
+ break;
+ }
+ }
+
+ if (Duplex == DMDUPLEX_LONGEDGE && (PageNum & 1) == 0)
+ rotate_bytes_180(plane[i], plane[i] + bpl * h - 1, Mirror1);
+ if (Duplex == DMDUPLEX_MANUALLONG && (PageNum & 1) == 0)
+ rotate_bytes_180(plane[i], plane[i] + bpl * h - 1, Mirror1);
+ }
+
+ debug(2, "AnyColor = %s %s %s\n",
+ (AnyColor & 0x01) ? "Cyan" : "",
+ (AnyColor & 0x02) ? "Magenta" : "",
+ (AnyColor & 0x04) ? "Yellow" : ""
+ );
+
+ if ((PageNum & 1) == 0 && EvenPages)
+ {
+ SeekRec[SeekIndex].b = ftell(EvenPages);
+ pksm_page(plane, w, h, EvenPages);
+ SeekRec[SeekIndex].e = ftell(EvenPages);
+ debug(1, "PKSM Page: %d %ld %ld\n",
+ PageNum, SeekRec[SeekIndex].b, SeekRec[SeekIndex].e);
+ SeekIndex++;
+ }
+ else
+ pksm_page(plane, w, h, ofp);
+
+ for (i = 0; i < 4; ++i)
+ free(plane[i]);
+ }
+eof:
+ return (0);
+}
+
+int
+pbm_pages(FILE *ifp, FILE *ofp)
+{
+ unsigned char *buf;
+ int rawW, rawH, rawBpl;
+ int rightBpl;
+ int w, h, bpl;
+ int bpl16 = 0;
+ int rc;
+ int p4eaten = 1;
+
+ //
+ // Save the original Upper Right clip values as the logical offset,
+ // because we may adjust them slightly below, in the interest of speed.
+ //
+ if (LogicalClip & LOGICAL_CLIP_X)
+ LogicalOffsetX = UpperLeftX;
+ if (LogicalClip & LOGICAL_CLIP_Y)
+ LogicalOffsetY = UpperLeftY;
+
+ for (;;)
+ {
+ if (pbm_header(ifp, &p4eaten, &rawW, &rawH) == 0)
+ break;
+
+ rawBpl = (rawW + 7) / 8;
+
+ // We only clip multiples of 8 pixels off the leading edge, and
+ // add any remainder to the amount we clip from the right edge.
+ // Its fast, and good enough for government work.
+ LowerRightX += UpperLeftX & 7;
+ UpperLeftX &= ~7;
+
+ w = rawW - UpperLeftX - LowerRightX;
+ h = rawH - UpperLeftY - LowerRightY;
+ bpl = (w + 7) / 8;
+ rightBpl = (rawW - UpperLeftX + 7) / 8;
+
+ switch (Model)
+ {
+ case MODEL_2300DL: bpl16 = bpl; break;
+ case MODEL_HP1020: bpl16 = (bpl + 15) & ~15; break;
+ default: error(1, "Bad model %d\n", Model); break;
+ }
+
+ buf = malloc(bpl16 * h);
+ if (!buf)
+ error(1, "Can't allocate page buffer\n");
+
+ rc = read_and_clip_image(buf, rawBpl, rightBpl, 8, bpl, h, bpl16, ifp);
+ if (rc == EOF)
+ error(1, "Premature EOF(pbm) on input stream\n");
+
+ ++PageNum;
+ if (Duplex == DMDUPLEX_LONGEDGE && (PageNum & 1) == 0)
+ rotate_bytes_180(buf, buf + bpl16 * h - 1, Mirror1);
+
+ if ((PageNum & 1) == 0 && EvenPages)
+ {
+ if (Duplex == DMDUPLEX_MANUALLONG)
+ rotate_bytes_180(buf, buf + bpl16 * h - 1, Mirror1);
+ SeekRec[SeekIndex].b = ftell(EvenPages);
+ pbm_page(buf, w, h, EvenPages);
+ SeekRec[SeekIndex].e = ftell(EvenPages);
+ debug(1, "PBM Page: %d %ld %ld\n",
+ PageNum, SeekRec[SeekIndex].b, SeekRec[SeekIndex].e);
+ SeekIndex++;
+ }
+ else
+ pbm_page(buf, w, h, ofp);
+
+ free(buf);
+ }
+ return (0);
+}
+
+void
+blank_page(FILE *ofp)
+{
+ int w, h, bpl, bpl16 = 0;
+ unsigned char *plane;
+
+ w = PageWidth - UpperLeftX - LowerRightX;
+ h = PageHeight - UpperLeftY - LowerRightY;
+ bpl = (w + 7) / 8;
+ switch (Model)
+ {
+ case MODEL_2300DL: bpl16 = bpl; break;
+ case MODEL_HP1020: bpl16 = (bpl + 15) & ~15; break;
+ default: error(1, "Bad model %d\n", Model); break;
+ }
+
+ plane = malloc(bpl16 * h);
+ if (!plane)
+ error(1, "Unable to allocate blank plane (%d bytes)\n", bpl16*h);
+ memset(plane, 0, bpl16*h);
+
+ pbm_page(plane, w, h, ofp);
+ ++PageNum;
+ free(plane);
+}
+
+int
+parse_xy(char *str, int *xp, int *yp)
+{
+ char *p;
+
+ if (!str || str[0] == 0) return -1;
+
+ *xp = strtoul(str, &p, 0);
+ if (str == p) return -2;
+ while (*p && (*p < '0' || *p > '9'))
+ ++p;
+ str = p;
+ if (str[0] == 0) return -3;
+ *yp = strtoul(str, &p, 0);
+ if (str == p) return -4;
+ return (0);
+}
+
+void
+do_one(FILE *in)
+{
+ int mode;
+
+ if (Mode == MODE_COLOR)
+ {
+ mode = getc(in);
+ if (mode != 'P')
+ {
+ ungetc(mode, in);
+ cmyk_pages(in, stdout);
+ }
+ else
+ {
+ mode = getc(in);
+ if (mode == '4')
+ pksm_pages(in, stdout);
+ else
+ error(1, "Not a pksmraw file!\n");
+ }
+ }
+ else
+ {
+ mode = getc(in);
+ if (mode != 'P')
+ error(1, "Not a pbm file!\n");
+ mode = getc(in);
+ if (mode == '4')
+ pbm_pages(in, stdout);
+ else
+ error(1, "Not a pbmraw file!\n");
+ }
+}
+
+int
+main(int argc, char *argv[])
+{
+ int c;
+ int i, j;
+
+ while ( (c = getopt(argc, argv,
+ "cd:g:n:m:p:r:s:tu:l:z:L:ABPJ:S:U:X:D:V?h")) != EOF)
+ switch (c)
+ {
+ case 'c': Mode = MODE_COLOR; break;
+ case 'S': Color2Mono = atoi(optarg);
+ Mode = MODE_COLOR;
+ if (Color2Mono < 0 || Color2Mono > 4)
+ error(1, "Illegal value '%s' for -C\n", optarg);
+ break;
+ case 'd': Duplex = atoi(optarg); break;
+ case 'g': if (parse_xy(optarg, &PageWidth, &PageHeight))
+ error(1, "Illegal format '%s' for -g\n", optarg);
+ if (PageWidth < 0 || PageWidth > 1000000)
+ error(1, "Illegal X value '%s' for -g\n", optarg);
+ if (PageHeight < 0 || PageHeight > 1000000)
+ error(1, "Illegal Y value '%s' for -g\n", optarg);
+ break;
+ case 'm': MediaCode = atoi(optarg); break;
+ case 'n': Copies = atoi(optarg); break;
+ case 'p': PaperCode = atoi(optarg); break;
+ case 'r': if (parse_xy(optarg, &ResX, &ResY))
+ error(1, "Illegal format '%s' for -r\n", optarg);
+ break;
+ case 's': SourceCode = atoi(optarg); break;
+ case 't': SaveToner = 1; break;
+ case 'u':
+ if (strcmp(optarg, "0") == 0)
+ break;
+ if (parse_xy(optarg, &UpperLeftX, &UpperLeftY))
+ error(1, "Illegal format '%s' for -u\n", optarg);
+ break;
+ case 'l':
+ if (strcmp(optarg, "0") == 0)
+ break;
+ if (parse_xy(optarg, &LowerRightX, &LowerRightY))
+ error(1, "Illegal format '%s' for -l\n", optarg);
+ break;
+ case 'z': Model = atoi(optarg);
+ if (Model < 0 || Model > MODEL_LAST)
+ error(1, "Illegal value '%s' for -z\n", optarg);
+ break;
+ case 'L': LogicalClip = atoi(optarg);
+ if (LogicalClip < 0 || LogicalClip > 3)
+ error(1, "Illegal value '%s' for -L\n", optarg);
+ break;
+ case 'A': AllIsBlack = !AllIsBlack; break;
+ case 'B': BlackClears = !BlackClears; break;
+ case 'P': OutputStartPlane = !OutputStartPlane; break;
+ case 'J': if (optarg[0]) Filename = optarg; break;
+ case 'U': if (optarg[0]) Username = optarg; break;
+ case 'X': ExtraPad = atoi(optarg); break;
+ case 'D': Debug = atoi(optarg); break;
+ case 'V': printf("%s\n", Version); exit(0);
+ default: usage(); exit(1);
+ }
+
+ if (UpperLeftX < 0 || UpperLeftX >= PageWidth)
+ error(1, "Illegal X value '%d' for -u\n", UpperLeftX);
+ if (UpperLeftY < 0 || UpperLeftY >= PageHeight)
+ error(1, "Illegal Y value '%d' for -u\n", UpperLeftY);
+ if (LowerRightX < 0 || LowerRightX >= PageWidth)
+ error(1, "Illegal X value '%d' for -l\n", LowerRightX);
+ if (LowerRightY < 0 || LowerRightY >= PageHeight)
+ error(1, "Illegal Y value '%d' for -l\n", LowerRightY);
+
+ argc -= optind;
+ argv += optind;
+
+ if (Model == MODEL_HP1020)
+ {
+ Bpp = ResX / 600;
+ ResX = 600;
+ if (SaveToner)
+ {
+ SaveToner = 0;
+ EconoMode = 1;
+ }
+ }
+
+ switch (Duplex)
+ {
+ case DMDUPLEX_MANUALLONG:
+ case DMDUPLEX_MANUALSHORT:
+ EvenPages = tmpfile();
+ break;
+ }
+
+ start_doc(stdout);
+
+ if (argc == 0)
+ {
+ do_one(stdin);
+ }
+ else
+ {
+ for (i = 0; i < argc; ++i)
+ {
+ FILE *ifp;
+
+ ifp = fopen(argv[i], "r");
+ if (!ifp)
+ error(1, "Can't open '%s' for reading\n", argv[i]);
+ do_one(ifp);
+ fclose(ifp);
+ }
+ }
+
+ /*
+ * Do manual duplex
+ */
+ if (EvenPages)
+ {
+ DWORD media;
+
+ // Handle odd page count
+ if ( (PageNum & 1) == 1)
+ {
+ SeekRec[SeekIndex].b = ftell(EvenPages);
+ blank_page(EvenPages);
+ SeekRec[SeekIndex].e = ftell(EvenPages);
+ debug(1, "Blank Page: %d %ld %ld\n",
+ PageNum, SeekRec[SeekIndex].b, SeekRec[SeekIndex].e);
+ SeekIndex++;
+ }
+
+ /*
+ * Manual Pause
+ */
+ if (Model == MODEL_HP1020)
+ load_tray2(stdout);
+
+ fseek(EvenPages, SeekMedia, 0L);
+ media = be32(DMMEDIA_LETTERHEAD);
+ fwrite(&media, 1, sizeof(DWORD), EvenPages);
+
+ // Write even pages in reverse order
+ for (i = SeekIndex-1; i >= 0; --i)
+ {
+ debug(1, "EvenPage: %d %ld %ld\n",
+ i, SeekRec[i].b, SeekRec[i].e);
+ fseek(EvenPages, SeekRec[i].b, 0L);
+ for (j = 0; j < (SeekRec[i].e - SeekRec[i].b); ++j)
+ putc(getc(EvenPages), stdout);
+ }
+ fclose(EvenPages);
+ }
+
+ end_doc(stdout);
+
+ exit(0);
+}
diff --git a/foomatic-db/driver/foo2hp.xml b/foomatic-db/driver/foo2hp.xml
new file mode 100644
index 0000000..95775ff
--- /dev/null
+++ b/foomatic-db/driver/foo2hp.xml
@@ -0,0 +1,23 @@
+<driver id="driver/foo2hp">
+ <name>foo2hp</name>
+ <url>http://foo2hp.rkkda.com/</url>
+ <execution>
+ <filter />
+ <prototype>foo2hp2600-wrapper %A</prototype>
+ </execution>
+ <comments> <en>
+
+ This is a driver developed for the HP Color LaserJet 2600n printer.
+
+ The driver supports 1-bit or 2-bit per pixel monochrome and
+ color output, but none of these have been tuned for grayscale
+ or color correction.
+
+ </en> </comments>
+ <printers>
+ <printer><id>printer/HP-Color_LaserJet_2600n</id></printer>
+ <printer><id>printer/HP-Color_LaserJet_1600</id></printer>
+ <printer><id>printer/Generic-ZJS</id></printer>
+ <printer><id>printer/Generic-GDI_Printer</id></printer>
+ </printers>
+</driver>
diff --git a/foomatic-db/driver/foo2lava.xml b/foomatic-db/driver/foo2lava.xml
new file mode 100644
index 0000000..4adf7a2
--- /dev/null
+++ b/foomatic-db/driver/foo2lava.xml
@@ -0,0 +1,20 @@
+<driver id="driver/foo2lava">
+ <name>foo2lava</name>
+ <url>http://foo2lava.rkkda.com/</url>
+ <execution>
+ <filter />
+ <prototype>foo2lava-wrapper %A</prototype>
+ </execution>
+ <comments> <en>
+
+ This is a driver developed for the Konica Minolta magicolor 2530 DL.
+
+ It also works with Konica Minolta magicolor 2490 MF (printer only).
+
+ </en> </comments>
+ <printers>
+ <printer><id>printer/KonicaMinolta-magicolor_2490_MF</id></printer>
+ <printer><id>printer/KonicaMinolta-magicolor_2530_DL</id></printer>
+ <printer><id>printer/Generic-GDI_Printer</id></printer>
+ </printers>
+</driver>
diff --git a/foomatic-db/driver/foo2oak.xml b/foomatic-db/driver/foo2oak.xml
new file mode 100644
index 0000000..ea005e3
--- /dev/null
+++ b/foomatic-db/driver/foo2oak.xml
@@ -0,0 +1,25 @@
+<driver id="driver/foo2oak">
+ <name>foo2oak</name>
+ <url>http://foo2oak.rkkda.com/</url>
+ <execution>
+ <filter />
+ <prototype>foo2oak-wrapper %A</prototype>
+ </execution>
+ <comments> <en>
+
+ This is a driver developed for the HP Color LaserJet 1500 laser printer.
+
+ It is possible that this driver will also work for other Oak
+ Technologies OAKT-based printers, but the author cannot test this.
+
+ The driver supports 1-bit or 2-bit per pixel monochrome and
+ color output, but none of these have been tuned for grayscale
+ or color correction.
+
+ </en> </comments>
+ <printers>
+ <printer><id>printer/HP-Color_LaserJet_1500</id></printer>
+ <printer><id>printer/Generic-OAKT_Printer</id></printer>
+ <printer><id>printer/Generic-GDI_Printer</id></printer>
+ </printers>
+</driver>
diff --git a/foomatic-db/driver/foo2xqx.xml b/foomatic-db/driver/foo2xqx.xml
new file mode 100644
index 0000000..107593a
--- /dev/null
+++ b/foomatic-db/driver/foo2xqx.xml
@@ -0,0 +1,19 @@
+<driver id="driver/foo2xqx">
+ <name>foo2xqx</name>
+ <url>http://foo2xqx.rkkda.com/</url>
+ <execution>
+ <filter />
+ <prototype>foo2xqx-wrapper %A</prototype>
+ </execution>
+ <comments> <en>
+
+ This is a driver developed for the HP LaserJet M1005 MFP.
+
+ &lt;p&gt;
+
+ </en> </comments>
+ <printers>
+ <printer><id>printer/HP-LaserJet_M1005_MFP</id></printer>
+ <printer><id>printer/Generic-GDI_Printer</id></printer>
+ </printers>
+</driver>
diff --git a/foomatic-db/driver/foo2zjs.xml b/foomatic-db/driver/foo2zjs.xml
new file mode 100644
index 0000000..5d78520
--- /dev/null
+++ b/foomatic-db/driver/foo2zjs.xml
@@ -0,0 +1,33 @@
+<driver id="driver/foo2zjs">
+ <name>foo2zjs</name>
+ <url>http://foo2zjs.rkkda.com/</url>
+ <execution>
+ <filter />
+ <prototype>foo2zjs-wrapper %A</prototype>
+ </execution>
+ <comments> <en>
+
+ This is a driver developed for the Minolta magicolor 2300 DL
+ network color laser printer.
+
+ &lt;p&gt;
+
+ It is possible that this driver will also work for the HP LaserJet
+ 1000, 1005, 1018, 1020 and other Zenographics-based printers, but the
+ author cannot test this.
+
+ </en> </comments>
+ <printers>
+ <printer><id>printer/Minolta-magicolor_2430_DL</id></printer>
+ <printer><id>printer/Minolta-magicolor_2300_DL</id></printer>
+ <printer><id>printer/Minolta-magicolor_2200_DL</id></printer>
+ <printer><id>printer/Minolta-Color_PageWorks_Pro_L</id></printer>
+ <printer><id>printer/HP-LaserJet_1000</id></printer>
+ <printer><id>printer/HP-LaserJet_1005</id></printer>
+ <printer><id>printer/HP-LaserJet_1018</id></printer>
+ <printer><id>printer/HP-LaserJet_1020</id></printer>
+ <printer><id>printer/HP-LaserJet_1022</id></printer>
+ <printer><id>printer/Generic-ZjStream_Printer</id></printer>
+ <printer><id>printer/Generic-GDI_Printer</id></printer>
+ </printers>
+</driver>
diff --git a/foomatic-db/opt/foo2hp-BitsPerPlane.xml b/foomatic-db/opt/foo2hp-BitsPerPlane.xml
new file mode 100644
index 0000000..aef8581
--- /dev/null
+++ b/foomatic-db/opt/foo2hp-BitsPerPlane.xml
@@ -0,0 +1,36 @@
+<option type="enum" id="opt/foo2hp-BitsPerPlane">
+ <!-- A multilingual <comments> block can appear here, too;
+ it should be treated as documentation for the user. -->
+ <arg_longname> <en>Bits Per Plane</en> </arg_longname>
+ <arg_shortname> <en>BitsPerPlane</en> </arg_shortname>
+ <arg_execution>
+ <arg_group>General</arg_group>
+ <arg_order>120</arg_order>
+ <arg_spot>A</arg_spot>
+ <arg_required />
+ <arg_substitution />
+ <arg_proto>-b%s </arg_proto>
+ </arg_execution>
+ <constraints>
+ <constraint sense="true">
+ <driver>foo2hp</driver>
+ <arg_defval>ev/foo2hp-BitsPerPlane-1</arg_defval>
+ </constraint>
+ </constraints>
+ <enum_vals>
+ <enum_val id="ev/foo2hp-BitsPerPlane-1">
+ <ev_longname> <en>1 Bit Per Plane</en> </ev_longname>
+ <!-- A multilingual <comments> block can appear here, too;
+ it should be treated as documentation for the user. -->
+ <ev_shortname> <en>1-BPP</en> </ev_shortname>
+ <ev_driverval>1</ev_driverval>
+ </enum_val>
+ <enum_val id="ev/foo2hp-BitsPerPlane-2">
+ <ev_longname> <en>2 Bits Per Plane</en> </ev_longname>
+ <!-- A multilingual <comments> block can appear here, too;
+ it should be treated as documentation for the user. -->
+ <ev_shortname> <en>2-BPP</en> </ev_shortname>
+ <ev_driverval>2</ev_driverval>
+ </enum_val>
+ </enum_vals>
+</option>
diff --git a/foomatic-db/opt/foo2hp-ColorMode.xml b/foomatic-db/opt/foo2hp-ColorMode.xml
new file mode 100644
index 0000000..17b10ab
--- /dev/null
+++ b/foomatic-db/opt/foo2hp-ColorMode.xml
@@ -0,0 +1,38 @@
+<option type="enum" id="opt/foo2hp-ColorMode">
+ <!-- A multilingual <comments> block can appear here, too;
+ it should be treated as documentation for the user. -->
+ <arg_longname> <en>Color Mode</en> </arg_longname>
+ <arg_shortname> <en>ColorMode</en> </arg_shortname>
+ <arg_execution>
+ <arg_group>General</arg_group>
+ <arg_order>120</arg_order>
+ <arg_spot>A</arg_spot>
+ <arg_required />
+ <arg_substitution />
+ <arg_proto>%s </arg_proto>
+ </arg_execution>
+ <constraints>
+ <constraint sense="true">
+ <driver>foo2hp</driver>
+ <arg_defval>ev/foo2hp-ColorMode-mono</arg_defval>
+ </constraint>
+ </constraints>
+ <enum_vals>
+ <enum_val id="ev/foo2hp-ColorMode-mono">
+ <ev_longname> <en>Monochrome</en> </ev_longname>
+ <comments><en>
+ Prints in monochrome only
+ </en></comments>
+ <ev_shortname> <en>Monochrome</en> </ev_shortname>
+ <ev_driverval></ev_driverval>
+ </enum_val>
+ <enum_val id="ev/foo2hp-ColorMode-color">
+ <ev_longname> <en>Color</en> </ev_longname>
+ <comments><en>
+ Prints in color using the best compromise setting.
+ </en></comments>
+ <ev_shortname> <en>Color</en> </ev_shortname>
+ <ev_driverval>-c</ev_driverval>
+ </enum_val>
+ </enum_vals>
+</option>
diff --git a/foomatic-db/opt/foo2hp-Duplex.xml b/foomatic-db/opt/foo2hp-Duplex.xml
new file mode 100644
index 0000000..6e792be
--- /dev/null
+++ b/foomatic-db/opt/foo2hp-Duplex.xml
@@ -0,0 +1,37 @@
+<option type="enum" id="opt/foo2hp-Duplex">
+ <!-- A multilingual <comments> block can appear here, too;
+ it should be treated as documentation for the user. -->
+ <arg_longname> <en>Duplex Printing</en> </arg_longname>
+ <arg_shortname> <en>Duplex</en> </arg_shortname>
+ <arg_execution>
+ <arg_group>General</arg_group>
+ <arg_order>210</arg_order>
+ <arg_spot>A</arg_spot>
+ <arg_required />
+ <arg_substitution />
+ <arg_proto>-d%s </arg_proto>
+ </arg_execution>
+ <constraints>
+ <constraint sense="true">
+ <driver>foo2hp</driver>
+ <arg_defval>ev/foo2hp-Duplex-1</arg_defval>
+ </constraint>
+ </constraints>
+ <enum_vals>
+ <enum_val id="ev/foo2hp-Duplex-1">
+ <ev_longname> <en>Off</en> </ev_longname>
+ <ev_shortname> <en>None</en> </ev_shortname>
+ <ev_driverval>1</ev_driverval>
+ </enum_val>
+ <enum_val id="ev/foo2hp-Duplex-2">
+ <ev_longname> <en>Long Edge (Standard)</en> </ev_longname>
+ <ev_shortname> <en>DuplexNoTumble</en> </ev_shortname>
+ <ev_driverval>2</ev_driverval>
+ </enum_val>
+ <enum_val id="ev/foo2hp-Duplex-3">
+ <ev_longname> <en>Short Edge (Flip)</en> </ev_longname>
+ <ev_shortname> <en>DuplexTumble</en> </ev_shortname>
+ <ev_driverval>3</ev_driverval>
+ </enum_val>
+ </enum_vals>
+</option>
diff --git a/foomatic-db/opt/foo2hp-ICM.xml b/foomatic-db/opt/foo2hp-ICM.xml
new file mode 100644
index 0000000..a33e34e
--- /dev/null
+++ b/foomatic-db/opt/foo2hp-ICM.xml
@@ -0,0 +1,101 @@
+<option type="enum" id="opt/foo2hp-ICM">
+ <comments>
+ <en>
+ This option controls which .ICM file to use for color correction.
+ ICM files are stored in directory /usr/share/foo2hp/icm/.
+ </en>
+ </comments>
+ <arg_longname> <en>ICM Color Profile</en> </arg_longname>
+ <arg_shortname> <en>ICM</en> </arg_shortname>
+ <arg_execution>
+ <arg_group>Adjustment</arg_group>
+ <arg_order>300</arg_order>
+ <arg_spot>A</arg_spot>
+ <arg_required />
+ <arg_substitution />
+ <arg_proto>%s </arg_proto>
+ </arg_execution>
+ <constraints>
+ <constraint sense="true">
+ <driver>foo2hp</driver>
+ <arg_defval>ev/foo2hp-ICM-default</arg_defval>
+ </constraint>
+ </constraints>
+ <enum_vals>
+ <enum_val id="ev/foo2hp-ICM-default">
+ <ev_longname> <en>Default ICM color correction</en> </ev_longname>
+ <!-- A multilingual <comments> block can appear here, too;
+ it should be treated as documentation for the user. -->
+ <ev_shortname> <en>default</en> </ev_shortname>
+ <ev_driverval>-Gdefault</ev_driverval>
+ </enum_val>
+
+ <enum_val id="ev/foo2hp-ICM-none">
+ <ev_longname> <en>No ICM color correction</en> </ev_longname>
+ <!-- A multilingual <comments> block can appear here, too;
+ it should be treated as documentation for the user. -->
+ <ev_shortname> <en>none</en> </ev_shortname>
+ <ev_driverval>-Gnone</ev_driverval>
+ </enum_val>
+
+ <enum_val id="ev/foo2hp-ICM-hpclj2600n-0">
+ <ev_longname> <en>File hpclj2600n-0.icm</en> </ev_longname>
+ <!-- A multilingual <comments> block can appear here, too;
+ it should be treated as documentation for the user. -->
+ <ev_shortname> <en>hpclj2600n-0</en> </ev_shortname>
+ <ev_driverval>-Ghpclj2600n-0.icm</ev_driverval>
+ </enum_val>
+
+ <enum_val id="ev/foo2hp-ICM-hpclj2600n-1">
+ <ev_longname> <en>File ICCFactory 1</en> </ev_longname>
+ <!-- A multilingual <comments> block can appear here, too;
+ it should be treated as documentation for the user. -->
+ <ev_shortname> <en>hpclj2600n-1</en> </ev_shortname>
+ <ev_driverval>-Ghpclj2600n-1.icm</ev_driverval>
+ </enum_val>
+
+ <enum_val id="ev/foo2hp-ICM-km2430_2">
+ <ev_longname> <en>File km2430_2.icm</en> </ev_longname>
+ <!-- A multilingual <comments> block can appear here, too;
+ it should be treated as documentation for the user. -->
+ <ev_shortname> <en>km2430_2</en> </ev_shortname>
+ <ev_driverval>-Gkm2430_2.icm</ev_driverval>
+ </enum_val>
+
+ <enum_val id="ev/foo2hp-ICM-testing">
+ <ev_longname> <en>File testing.icm</en> </ev_longname>
+ <!-- A multilingual <comments> block can appear here, too;
+ it should be treated as documentation for the user. -->
+ <ev_shortname> <en>testing</en> </ev_shortname>
+ <ev_driverval>-Gtesting.icm</ev_driverval>
+ </enum_val>
+ <enum_val id="ev/foo2hp-ICM-user1">
+ <ev_longname> <en>File user1.icm</en> </ev_longname>
+ <!-- A multilingual <comments> block can appear here, too;
+ it should be treated as documentation for the user. -->
+ <ev_shortname> <en>user1</en> </ev_shortname>
+ <ev_driverval>-Guser1.icm</ev_driverval>
+ </enum_val>
+ <enum_val id="ev/foo2hp-ICM-user2">
+ <ev_longname> <en>File user2.icm</en> </ev_longname>
+ <!-- A multilingual <comments> block can appear here, too;
+ it should be treated as documentation for the user. -->
+ <ev_shortname> <en>user2</en> </ev_shortname>
+ <ev_driverval>-Guser2.icm</ev_driverval>
+ </enum_val>
+ <enum_val id="ev/foo2hp-ICM-user3">
+ <ev_longname> <en>File user3.icm</en> </ev_longname>
+ <!-- A multilingual <comments> block can appear here, too;
+ it should be treated as documentation for the user. -->
+ <ev_shortname> <en>user3</en> </ev_shortname>
+ <ev_driverval>-Guser3.icm</ev_driverval>
+ </enum_val>
+ <enum_val id="ev/foo2hp-ICM-user4">
+ <ev_longname> <en>File user4.icm</en> </ev_longname>
+ <!-- A multilingual <comments> block can appear here, too;
+ it should be treated as documentation for the user. -->
+ <ev_shortname> <en>user4</en> </ev_shortname>
+ <ev_driverval>-Guser4.icm</ev_driverval>
+ </enum_val>
+ </enum_vals>
+</option>
diff --git a/foomatic-db/opt/foo2hp-InputSlot.xml b/foomatic-db/opt/foo2hp-InputSlot.xml
new file mode 100644
index 0000000..dad3caa
--- /dev/null
+++ b/foomatic-db/opt/foo2hp-InputSlot.xml
@@ -0,0 +1,42 @@
+<option type="enum" id="opt/foo2hp-InputSlot">
+ <!-- A multilingual <comments> block can appear here, too;
+ it should be treated as documentation for the user. -->
+ <arg_longname> <en>Media Source</en> </arg_longname>
+ <arg_shortname> <en>InputSlot</en> </arg_shortname>
+ <arg_execution>
+ <arg_group>General</arg_group>
+ <arg_order>150</arg_order>
+ <arg_spot>A</arg_spot>
+ <arg_required />
+ <arg_substitution />
+ <arg_proto>-s%s </arg_proto>
+ </arg_execution>
+ <constraints>
+ <constraint sense="true">
+ <driver>foo2hp</driver>
+ <arg_defval>ev/foo2hp-InputSlot-7</arg_defval>
+ </constraint>
+ </constraints>
+ <enum_vals>
+ <enum_val id="ev/foo2hp-InputSlot-1">
+ <ev_longname> <en>Tray 1</en> </ev_longname>
+ <ev_shortname> <en>Tray1</en> </ev_shortname>
+ <ev_driverval>4</ev_driverval>
+ </enum_val>
+ <enum_val id="ev/foo2hp-InputSlot-2">
+ <ev_longname> <en>Tray 2</en> </ev_longname>
+ <ev_shortname> <en>Tray2</en> </ev_shortname>
+ <ev_driverval>1</ev_driverval>
+ </enum_val>
+ <enum_val id="ev/foo2hp-InputSlot-3">
+ <ev_longname> <en>Tray 3</en> </ev_longname>
+ <ev_shortname> <en>Tray3</en> </ev_shortname>
+ <ev_driverval>2</ev_driverval>
+ </enum_val>
+ <enum_val id="ev/foo2hp-InputSlot-7">
+ <ev_longname> <en>Auto Select</en> </ev_longname>
+ <ev_shortname> <en>Auto</en> </ev_shortname>
+ <ev_driverval>7</ev_driverval>
+ </enum_val>
+ </enum_vals>
+</option>
diff --git a/foomatic-db/opt/foo2hp-MediaType.xml b/foomatic-db/opt/foo2hp-MediaType.xml
new file mode 100644
index 0000000..7d563bf
--- /dev/null
+++ b/foomatic-db/opt/foo2hp-MediaType.xml
@@ -0,0 +1,117 @@
+<option type="enum" id="opt/foo2hp-MediaType">
+ <!-- A multilingual <comments> block can appear here, too;
+ it should be treated as documentation for the user. -->
+ <arg_longname> <en>Media Type</en> </arg_longname>
+ <arg_shortname> <en>MediaType</en> </arg_shortname>
+ <arg_execution>
+ <arg_group>General</arg_group>
+ <arg_order>150</arg_order>
+ <arg_spot>A</arg_spot>
+ <arg_required />
+ <arg_substitution />
+ <arg_proto>-m%s </arg_proto>
+ </arg_execution>
+ <constraints>
+ <constraint sense="true">
+ <driver>foo2hp</driver>
+ <arg_defval>ev/foo2hp-MediaType-1</arg_defval>
+ </constraint>
+ </constraints>
+ <enum_vals>
+ <enum_val id="ev/foo2hp-MediaType-1">
+ <ev_longname> <en>Plain</en> </ev_longname>
+ <ev_shortname> <en>Plain</en> </ev_shortname>
+ <ev_driverval>1</ev_driverval>
+ </enum_val>
+ <enum_val id="ev/foo2hp-MediaType-514">
+ <ev_longname> <en>Preprinted</en> </ev_longname>
+ <ev_shortname> <en>Preprinted</en> </ev_shortname>
+ <ev_driverval>514</ev_driverval>
+ </enum_val>
+ <enum_val id="ev/foo2hp-MediaType-513">
+ <ev_longname> <en>Letterhead</en> </ev_longname>
+ <ev_shortname> <en>Letterhead</en> </ev_shortname>
+ <ev_driverval>513</ev_driverval>
+ </enum_val>
+ <enum_val id="ev/foo2hp-MediaType-2">
+ <ev_longname> <en>Transparency</en> </ev_longname>
+ <ev_shortname> <en>Transparency</en> </ev_shortname>
+ <ev_driverval>2</ev_driverval>
+ </enum_val>
+ <enum_val id="ev/foo2hp-MediaType-515">
+ <ev_longname> <en>Prepunched</en> </ev_longname>
+ <ev_shortname> <en>Prepunched</en> </ev_shortname>
+ <ev_driverval>515</ev_driverval>
+ </enum_val>
+ <enum_val id="ev/foo2hp-MediaType-265">
+ <ev_longname> <en>Labels</en> </ev_longname>
+ <ev_shortname> <en>Labels</en> </ev_shortname>
+ <ev_driverval>265</ev_driverval>
+ </enum_val>
+ <enum_val id="ev/foo2hp-MediaType-260">
+ <ev_longname> <en>Bond</en> </ev_longname>
+ <ev_shortname> <en>Bond</en> </ev_shortname>
+ <ev_driverval>260</ev_driverval>
+ </enum_val>
+ <enum_val id="ev/foo2hp-MediaType-516">
+ <ev_longname> <en>Recycled</en> </ev_longname>
+ <ev_shortname> <en>Recycled</en> </ev_shortname>
+ <ev_driverval>516</ev_driverval>
+ </enum_val>
+ <enum_val id="ev/foo2hp-MediaType-512">
+ <ev_longname> <en>Color</en> </ev_longname>
+ <ev_shortname> <en>Color</en> </ev_shortname>
+ <ev_driverval>512</ev_driverval>
+ </enum_val>
+ <enum_val id="ev/foo2hp-MediaType-276">
+ <ev_longname> <en>Tough</en> </ev_longname>
+ <ev_shortname> <en>Tough</en> </ev_shortname>
+ <ev_driverval>276</ev_driverval>
+ </enum_val>
+ <enum_val id="ev/foo2hp-MediaType-267">
+ <ev_longname> <en>Envelope</en> </ev_longname>
+ <ev_shortname> <en>Envelope</en> </ev_shortname>
+ <ev_driverval>267</ev_driverval>
+ </enum_val>
+ <enum_val id="ev/foo2hp-MediaType-258">
+ <ev_longname> <en>Light</en> </ev_longname>
+ <ev_shortname> <en>Light</en> </ev_shortname>
+ <ev_driverval>258</ev_driverval>
+ </enum_val>
+ <enum_val id="ev/foo2hp-MediaType-262">
+ <ev_longname> <en>Heavy</en> </ev_longname>
+ <ev_shortname> <en>Heavy</en> </ev_shortname>
+ <ev_driverval>262</ev_driverval>
+ </enum_val>
+ <enum_val id="ev/foo2hp-MediaType-261">
+ <ev_longname> <en>Cardstock</en> </ev_longname>
+ <ev_shortname> <en>Cardstock</en> </ev_shortname>
+ <ev_driverval>261</ev_driverval>
+ </enum_val>
+ <enum_val id="ev/foo2hp-MediaType-268">
+ <ev_longname> <en>Light Glossy</en> </ev_longname>
+ <ev_shortname> <en>LightGlossy</en> </ev_shortname>
+ <ev_driverval>268</ev_driverval>
+ </enum_val>
+ <enum_val id="ev/foo2hp-MediaType-269">
+ <ev_longname> <en>Glossy</en> </ev_longname>
+ <ev_shortname> <en>Glossy</en> </ev_shortname>
+ <ev_driverval>269</ev_driverval>
+ </enum_val>
+ <enum_val id="ev/foo2hp-MediaType-270">
+ <ev_longname> <en>Heavy Glossy</en> </ev_longname>
+ <ev_shortname> <en>HeavyGlossy</en> </ev_shortname>
+ <ev_driverval>270</ev_driverval>
+ </enum_val>
+ <enum_val id="ev/foo2hp-MediaType-277">
+ <ev_longname> <en>HP Premium Cover</en> </ev_longname>
+ <ev_shortname> <en>Cover</en> </ev_shortname>
+ <ev_driverval>277</ev_driverval>
+ </enum_val>
+ <enum_val id="ev/foo2hp-MediaType-278">
+ <ev_longname> <en>HP Color Laser Photo Paper</en> </ev_longname>
+ <ev_shortname> <en>photo</en> </ev_shortname>
+ <ev_driverval>278</ev_driverval>
+ </enum_val>
+ </enum_vals>
+</option>
diff --git a/foomatic-db/opt/foo2hp-Quality.xml b/foomatic-db/opt/foo2hp-Quality.xml
new file mode 100644
index 0000000..53e0684
--- /dev/null
+++ b/foomatic-db/opt/foo2hp-Quality.xml
@@ -0,0 +1,32 @@
+<option type="enum" id="opt/foo2hp-Quality">
+ <!-- A multilingual <comments> block can appear here, too;
+ it should be treated as documentation for the user. -->
+ <arg_longname> <en>Printing Quality</en> </arg_longname>
+ <arg_shortname> <en>Quality</en> </arg_shortname>
+ <arg_execution>
+ <arg_group>General</arg_group>
+ <arg_order>110</arg_order>
+ <arg_spot>A</arg_spot>
+ <arg_required />
+ <arg_substitution />
+ <arg_proto> %s </arg_proto>
+ </arg_execution>
+ <constraints>
+ <constraint sense="true">
+ <driver>foo2hp</driver>
+ <arg_defval>ev/foo2hp-Quality-Normal</arg_defval>
+ </constraint>
+ </constraints>
+ <enum_vals>
+ <enum_val id="ev/foo2hp-Quality-Normal">
+ <ev_longname> <en>Normal Mode</en> </ev_longname>
+ <ev_shortname> <en>normal</en> </ev_shortname>
+ <ev_driverval></ev_driverval>
+ </enum_val>
+ <enum_val id="ev/foo2hp-Quality-Draft">
+ <ev_longname> <en>Draft Mode</en> </ev_longname>
+ <ev_shortname> <en>draft</en> </ev_shortname>
+ <ev_driverval>-t </ev_driverval>
+ </enum_val>
+ </enum_vals>
+</option>
diff --git a/foomatic-db/opt/foo2lava-ColorMode.xml b/foomatic-db/opt/foo2lava-ColorMode.xml
new file mode 100644
index 0000000..07cef3c
--- /dev/null
+++ b/foomatic-db/opt/foo2lava-ColorMode.xml
@@ -0,0 +1,38 @@
+<option type="enum" id="opt/foo2lava-ColorMode">
+ <!-- A multilingual <comments> block can appear here, too;
+ it should be treated as documentation for the user. -->
+ <arg_longname> <en>Color Mode</en> </arg_longname>
+ <arg_shortname> <en>ColorMode</en> </arg_shortname>
+ <arg_execution>
+ <arg_group>General</arg_group>
+ <arg_order>120</arg_order>
+ <arg_spot>A</arg_spot>
+ <arg_required />
+ <arg_substitution />
+ <arg_proto>%s </arg_proto>
+ </arg_execution>
+ <constraints>
+ <constraint sense="true">
+ <driver>foo2lava</driver>
+ <arg_defval>ev/foo2lava-ColorMode-mono</arg_defval>
+ </constraint>
+ </constraints>
+ <enum_vals>
+ <enum_val id="ev/foo2lava-ColorMode-mono">
+ <ev_longname> <en>Monochrome</en> </ev_longname>
+ <comments><en>
+ Prints in monochrome only
+ </en></comments>
+ <ev_shortname> <en>Monochrome</en> </ev_shortname>
+ <ev_driverval></ev_driverval>
+ </enum_val>
+ <enum_val id="ev/foo2lava-ColorMode-color">
+ <ev_longname> <en>Color</en> </ev_longname>
+ <comments><en>
+ Prints in color using the best compromise setting.
+ </en></comments>
+ <ev_shortname> <en>Color</en> </ev_shortname>
+ <ev_driverval>-c</ev_driverval>
+ </enum_val>
+ </enum_vals>
+</option>
diff --git a/foomatic-db/opt/foo2lava-Duplex.xml b/foomatic-db/opt/foo2lava-Duplex.xml
new file mode 100644
index 0000000..c047e8f
--- /dev/null
+++ b/foomatic-db/opt/foo2lava-Duplex.xml
@@ -0,0 +1,37 @@
+<option type="enum" id="opt/foo2lava-Duplex">
+ <!-- A multilingual <comments> block can appear here, too;
+ it should be treated as documentation for the user. -->
+ <arg_longname> <en>Duplex Printing</en> </arg_longname>
+ <arg_shortname> <en>Duplex</en> </arg_shortname>
+ <arg_execution>
+ <arg_group>General</arg_group>
+ <arg_order>210</arg_order>
+ <arg_spot>A</arg_spot>
+ <arg_required />
+ <arg_substitution />
+ <arg_proto>-d%s </arg_proto>
+ </arg_execution>
+ <constraints>
+ <constraint sense="true">
+ <driver>foo2lava</driver>
+ <arg_defval>ev/foo2lava-Duplex-1</arg_defval>
+ </constraint>
+ </constraints>
+ <enum_vals>
+ <enum_val id="ev/foo2lava-Duplex-1">
+ <ev_longname> <en>Off</en> </ev_longname>
+ <ev_shortname> <en>None</en> </ev_shortname>
+ <ev_driverval>1</ev_driverval>
+ </enum_val>
+ <enum_val id="ev/foo2lava-Duplex-2">
+ <ev_longname> <en>Long Edge (Standard)</en> </ev_longname>
+ <ev_shortname> <en>DuplexNoTumble</en> </ev_shortname>
+ <ev_driverval>2</ev_driverval>
+ </enum_val>
+ <enum_val id="ev/foo2lava-Duplex-3">
+ <ev_longname> <en>Short Edge (Flip)</en> </ev_longname>
+ <ev_shortname> <en>DuplexTumble</en> </ev_shortname>
+ <ev_driverval>3</ev_driverval>
+ </enum_val>
+ </enum_vals>
+</option>
diff --git a/foomatic-db/opt/foo2lava-InputSlot.xml b/foomatic-db/opt/foo2lava-InputSlot.xml
new file mode 100644
index 0000000..2197358
--- /dev/null
+++ b/foomatic-db/opt/foo2lava-InputSlot.xml
@@ -0,0 +1,37 @@
+<option type="enum" id="opt/foo2lava-InputSlot">
+ <!-- A multilingual <comments> block can appear here, too;
+ it should be treated as documentation for the user. -->
+ <arg_longname> <en>Media Source</en> </arg_longname>
+ <arg_shortname> <en>InputSlot</en> </arg_shortname>
+ <arg_execution>
+ <arg_group>General</arg_group>
+ <arg_order>150</arg_order>
+ <arg_spot>A</arg_spot>
+ <arg_required />
+ <arg_substitution />
+ <arg_proto>-s%s </arg_proto>
+ </arg_execution>
+ <constraints>
+ <constraint sense="true">
+ <driver>foo2lava</driver>
+ <arg_defval>ev/foo2lava-InputSlot-255</arg_defval>
+ </constraint>
+ </constraints>
+ <enum_vals>
+ <enum_val id="ev/foo2lava-InputSlot-1">
+ <ev_longname> <en>Tray 1 (Multipurpose)</en> </ev_longname>
+ <ev_shortname> <en>Tray1</en> </ev_shortname>
+ <ev_driverval>1</ev_driverval>
+ </enum_val>
+ <enum_val id="ev/foo2lava-InputSlot-4">
+ <ev_longname> <en>Tray 2</en> </ev_longname>
+ <ev_shortname> <en>Tray2</en> </ev_shortname>
+ <ev_driverval>4</ev_driverval>
+ </enum_val>
+ <enum_val id="ev/foo2lava-InputSlot-255">
+ <ev_longname> <en>Auto Select</en> </ev_longname>
+ <ev_shortname> <en>Auto</en> </ev_shortname>
+ <ev_driverval>255</ev_driverval>
+ </enum_val>
+ </enum_vals>
+</option>
diff --git a/foomatic-db/opt/foo2lava-MediaType.xml b/foomatic-db/opt/foo2lava-MediaType.xml
new file mode 100644
index 0000000..f3097f5
--- /dev/null
+++ b/foomatic-db/opt/foo2lava-MediaType.xml
@@ -0,0 +1,67 @@
+<option type="enum" id="opt/foo2lava-MediaType">
+ <!-- A multilingual <comments> block can appear here, too;
+ it should be treated as documentation for the user. -->
+ <arg_longname> <en>Media Type</en> </arg_longname>
+ <arg_shortname> <en>MediaType</en> </arg_shortname>
+ <arg_execution>
+ <arg_group>General</arg_group>
+ <arg_order>150</arg_order>
+ <arg_spot>A</arg_spot>
+ <arg_required />
+ <arg_substitution />
+ <arg_proto>-m%s </arg_proto>
+ </arg_execution>
+ <constraints>
+ <constraint sense="true">
+ <driver>foo2lava</driver>
+ <arg_defval>ev/foo2lava-MediaType-1</arg_defval>
+ </constraint>
+ </constraints>
+ <enum_vals>
+ <enum_val id="ev/foo2lava-MediaType-1">
+ <ev_longname> <en>Plain Paper</en> </ev_longname>
+ <ev_shortname> <en>plain</en> </ev_shortname>
+ <ev_driverval>1</ev_driverval>
+ </enum_val>
+ <enum_val id="ev/foo2lava-MediaType-4">
+ <ev_longname> <en>Transparency</en> </ev_longname>
+ <ev_shortname> <en>transparency</en> </ev_shortname>
+ <ev_driverval>4</ev_driverval>
+ </enum_val>
+ <enum_val id="ev/foo2lava-MediaType-20">
+ <ev_longname> <en>Thick Stock</en> </ev_longname>
+ <ev_shortname> <en>thick</en> </ev_shortname>
+ <ev_driverval>20</ev_driverval>
+ </enum_val>
+ <enum_val id="ev/foo2lava-MediaType-22">
+ <ev_longname> <en>Envelope</en> </ev_longname>
+ <ev_shortname> <en>envelope</en> </ev_shortname>
+ <ev_driverval>22</ev_driverval>
+ </enum_val>
+ <enum_val id="ev/foo2lava-MediaType-23">
+ <ev_longname> <en>Letterhead</en> </ev_longname>
+ <ev_shortname> <en>letterhead</en> </ev_shortname>
+ <ev_driverval>23</ev_driverval>
+ </enum_val>
+ <enum_val id="ev/foo2lava-MediaType-25">
+ <ev_longname> <en>Postcard</en> </ev_longname>
+ <ev_shortname> <en>postcard</en> </ev_shortname>
+ <ev_driverval>25</ev_driverval>
+ </enum_val>
+ <enum_val id="ev/foo2lava-MediaType-26">
+ <ev_longname> <en>Labels</en> </ev_longname>
+ <ev_shortname> <en>labels</en> </ev_shortname>
+ <ev_driverval>26</ev_driverval>
+ </enum_val>
+ <enum_val id="ev/foo2lava-MediaType-27">
+ <ev_longname> <en>Recycled Paper</en> </ev_longname>
+ <ev_shortname> <en>recycled</en> </ev_shortname>
+ <ev_driverval>27</ev_driverval>
+ </enum_val>
+ <enum_val id="ev/foo2lava-MediaType-28">
+ <ev_longname> <en>Glossy</en> </ev_longname>
+ <ev_shortname> <en>glossy</en> </ev_shortname>
+ <ev_driverval>28</ev_driverval>
+ </enum_val>
+ </enum_vals>
+</option>
diff --git a/foomatic-db/opt/foo2lava-PageSize.xml b/foomatic-db/opt/foo2lava-PageSize.xml
new file mode 100644
index 0000000..d2aebc0
--- /dev/null
+++ b/foomatic-db/opt/foo2lava-PageSize.xml
@@ -0,0 +1,92 @@
+<option type="enum" id="opt/foo2lava-PageSize">
+ <!-- A multilingual <comments> block can appear here, too;
+ it should be treated as documentation for the user. -->
+ <arg_longname> <en>Page Size</en> </arg_longname>
+ <arg_shortname> <en>PageSize</en> </arg_shortname>
+ <arg_execution>
+ <arg_group>General</arg_group>
+ <arg_order>135</arg_order>
+ <arg_spot>A</arg_spot>
+ <arg_required />
+ <arg_substitution />
+ <arg_proto>-p%s </arg_proto>
+ </arg_execution>
+ <constraints>
+ <constraint sense="true">
+ <driver>foo2lava</driver>
+ <arg_defval>ev/foo2lava-PageSize-2</arg_defval>
+ </constraint>
+ </constraints>
+ <enum_vals>
+ <enum_val id="ev/foo2lava-PageSize-1">
+ <ev_longname> <en>Executive</en> </ev_longname>
+ <ev_shortname> <en>Executive</en> </ev_shortname>
+ <ev_driverval>1</ev_driverval>
+ </enum_val>
+ <enum_val id="ev/foo2lava-PageSize-2">
+ <ev_longname> <en>Letter</en> </ev_longname>
+ <ev_shortname> <en>Letter</en> </ev_shortname>
+ <ev_driverval>2</ev_driverval>
+ </enum_val>
+ <enum_val id="ev/foo2lava-PageSize-3">
+ <ev_longname> <en>Legal</en> </ev_longname>
+ <ev_shortname> <en>Legal</en> </ev_shortname>
+ <ev_driverval>3</ev_driverval>
+ </enum_val>
+ <enum_val id="ev/foo2lava-PageSize-25">
+ <ev_longname> <en>A5</en> </ev_longname>
+ <ev_shortname> <en>A5</en> </ev_shortname>
+ <ev_driverval>25</ev_driverval>
+ </enum_val>
+ <enum_val id="ev/foo2lava-PageSize-26">
+ <ev_longname> <en>A4</en> </ev_longname>
+ <ev_shortname> <en>A4</en> </ev_shortname>
+ <ev_driverval>26</ev_driverval>
+ </enum_val>
+ <enum_val id="ev/foo2lava-PageSize-45">
+ <ev_longname> <en>B5 (JIS)</en> </ev_longname>
+ <ev_shortname> <en>B5jis</en> </ev_shortname>
+ <ev_driverval>45</ev_driverval>
+ </enum_val>
+ <enum_val id="ev/foo2lava-PageSize-65">
+ <ev_longname> <en>B5 (ISO)</en> </ev_longname>
+ <ev_shortname> <en>B5iso</en> </ev_shortname>
+ <ev_driverval>65</ev_driverval>
+ </enum_val>
+ <enum_val id="ev/foo2lava-PageSize-80">
+ <ev_longname> <en>Env Monarch</en> </ev_longname>
+ <ev_shortname> <en>EnvMonarch</en> </ev_shortname>
+ <ev_driverval>80</ev_driverval>
+ </enum_val>
+ <enum_val id="ev/foo2lava-PageSize-81">
+ <ev_longname> <en>Env #10</en> </ev_longname>
+ <ev_shortname> <en>Env10</en> </ev_shortname>
+ <ev_driverval>81</ev_driverval>
+ </enum_val>
+ <enum_val id="ev/foo2lava-PageSize-90">
+ <ev_longname> <en>Env DL</en> </ev_longname>
+ <ev_shortname> <en>EnvDL</en> </ev_shortname>
+ <ev_driverval>90</ev_driverval>
+ </enum_val>
+ <enum_val id="ev/foo2lava-PageSize-91">
+ <ev_longname> <en>Env C5</en> </ev_longname>
+ <ev_shortname> <en>EnvC5</en> </ev_shortname>
+ <ev_driverval>91</ev_driverval>
+ </enum_val>
+ <enum_val id="ev/foo2lava-PageSize-92">
+ <ev_longname> <en>Env C6</en> </ev_longname>
+ <ev_shortname> <en>EnvC6</en> </ev_shortname>
+ <ev_driverval>92</ev_driverval>
+ </enum_val>
+ <enum_val id="ev/foo2lava-PageSize-835">
+ <ev_longname> <en>Photo Size 4x6 in</en> </ev_longname>
+ <ev_shortname> <en>Photo4x6</en> </ev_shortname>
+ <ev_driverval>835</ev_driverval>
+ </enum_val>
+ <enum_val id="ev/foo2lava-PageSize-837">
+ <ev_longname> <en>Photo Size 10x15 cm</en> </ev_longname>
+ <ev_shortname> <en>Photo10x15</en> </ev_shortname>
+ <ev_driverval>837</ev_driverval>
+ </enum_val>
+ </enum_vals>
+</option>
diff --git a/foomatic-db/opt/foo2lava-Quality.xml b/foomatic-db/opt/foo2lava-Quality.xml
new file mode 100644
index 0000000..df631c9
--- /dev/null
+++ b/foomatic-db/opt/foo2lava-Quality.xml
@@ -0,0 +1,32 @@
+<option type="enum" id="opt/foo2lava-Quality">
+ <!-- A multilingual <comments> block can appear here, too;
+ it should be treated as documentation for the user. -->
+ <arg_longname> <en>Printing Quality</en> </arg_longname>
+ <arg_shortname> <en>Quality</en> </arg_shortname>
+ <arg_execution>
+ <arg_group>General</arg_group>
+ <arg_order>110</arg_order>
+ <arg_spot>A</arg_spot>
+ <arg_required />
+ <arg_substitution />
+ <arg_proto> %s </arg_proto>
+ </arg_execution>
+ <constraints>
+ <constraint sense="true">
+ <driver>foo2lava</driver>
+ <arg_defval>ev/foo2lava-Quality-Normal</arg_defval>
+ </constraint>
+ </constraints>
+ <enum_vals>
+ <enum_val id="ev/foo2lava-Quality-Normal">
+ <ev_longname> <en>Normal</en> </ev_longname>
+ <ev_shortname> <en>normal</en> </ev_shortname>
+ <ev_driverval></ev_driverval>
+ </enum_val>
+ <enum_val id="ev/foo2lava-Quality-Draft">
+ <ev_longname> <en>Draft</en> </ev_longname>
+ <ev_shortname> <en>draft</en> </ev_shortname>
+ <ev_driverval>-t </ev_driverval>
+ </enum_val>
+ </enum_vals>
+</option>
diff --git a/foomatic-db/opt/foo2lava-Resolution.xml b/foomatic-db/opt/foo2lava-Resolution.xml
new file mode 100644
index 0000000..5585f87
--- /dev/null
+++ b/foomatic-db/opt/foo2lava-Resolution.xml
@@ -0,0 +1,43 @@
+<option type="enum" id="opt/foo2lava-Resolution">
+ <!-- A multilingual <comments> block can appear here, too;
+ it should be treated as documentation for the user. -->
+ <arg_longname> <en>Resolution</en> </arg_longname>
+ <arg_shortname> <en>Resolution</en> </arg_shortname>
+ <arg_execution>
+ <arg_group>General</arg_group>
+ <arg_order>130</arg_order>
+ <arg_spot>A</arg_spot>
+ <arg_required />
+ <arg_substitution />
+ <arg_proto>-r%s </arg_proto>
+ </arg_execution>
+ <constraints>
+ <constraint sense="true">
+ <driver>foo2lava</driver>
+ <arg_defval>ev/foo2lava-Resolution-1200x600</arg_defval>
+ </constraint>
+ </constraints>
+ <enum_vals>
+ <enum_val id="ev/foo2lava-Resolution-600x600">
+ <ev_longname> <en>600x600 dpi</en> </ev_longname>
+ <!-- A multilingual <comments> block can appear here, too;
+ it should be treated as documentation for the user. -->
+ <ev_shortname> <en>600x600dpi</en> </ev_shortname>
+ <ev_driverval>600x600</ev_driverval>
+ </enum_val>
+ <enum_val id="ev/foo2lava-Resolution-1200x600">
+ <ev_longname> <en>1200x600 dpi</en> </ev_longname>
+ <!-- A multilingual <comments> block can appear here, too;
+ it should be treated as documentation for the user. -->
+ <ev_shortname> <en>1200x600dpi</en> </ev_shortname>
+ <ev_driverval>1200x600</ev_driverval>
+ </enum_val>
+ <enum_val id="ev/foo2lava-Resolution-2400x600">
+ <ev_longname> <en>2400x600 dpi</en> </ev_longname>
+ <!-- A multilingual <comments> block can appear here, too;
+ it should be treated as documentation for the user. -->
+ <ev_shortname> <en>2400x600dpi</en> </ev_shortname>
+ <ev_driverval>2400x600</ev_driverval>
+ </enum_val>
+ </enum_vals>
+</option>
diff --git a/foomatic-db/opt/foo2oak-BitsPerPlane.xml b/foomatic-db/opt/foo2oak-BitsPerPlane.xml
new file mode 100644
index 0000000..b719d88
--- /dev/null
+++ b/foomatic-db/opt/foo2oak-BitsPerPlane.xml
@@ -0,0 +1,36 @@
+<option type="enum" id="opt/foo2oak-BitsPerPlane">
+ <!-- A multilingual <comments> block can appear here, too;
+ it should be treated as documentation for the user. -->
+ <arg_longname> <en>Bits Per Plane</en> </arg_longname>
+ <arg_shortname> <en>BitsPerPlane</en> </arg_shortname>
+ <arg_execution>
+ <arg_group>General</arg_group>
+ <arg_order>120</arg_order>
+ <arg_spot>A</arg_spot>
+ <arg_required />
+ <arg_substitution />
+ <arg_proto>-b%s </arg_proto>
+ </arg_execution>
+ <constraints>
+ <constraint sense="true">
+ <driver>foo2oak</driver>
+ <arg_defval>ev/foo2oak-BitsPerPlane-1</arg_defval>
+ </constraint>
+ </constraints>
+ <enum_vals>
+ <enum_val id="ev/foo2oak-BitsPerPlane-1">
+ <ev_longname> <en>1 Bit Per Plane</en> </ev_longname>
+ <!-- A multilingual <comments> block can appear here, too;
+ it should be treated as documentation for the user. -->
+ <ev_shortname> <en>1-BPP</en> </ev_shortname>
+ <ev_driverval>1</ev_driverval>
+ </enum_val>
+ <enum_val id="ev/foo2oak-BitsPerPlane-2">
+ <ev_longname> <en>2 Bits Per Plane</en> </ev_longname>
+ <!-- A multilingual <comments> block can appear here, too;
+ it should be treated as documentation for the user. -->
+ <ev_shortname> <en>2-BPP</en> </ev_shortname>
+ <ev_driverval>2</ev_driverval>
+ </enum_val>
+ </enum_vals>
+</option>
diff --git a/foomatic-db/opt/foo2oak-ColorMode.xml b/foomatic-db/opt/foo2oak-ColorMode.xml
new file mode 100644
index 0000000..43b11a7
--- /dev/null
+++ b/foomatic-db/opt/foo2oak-ColorMode.xml
@@ -0,0 +1,38 @@
+<option type="enum" id="opt/foo2oak-ColorMode">
+ <!-- A multilingual <comments> block can appear here, too;
+ it should be treated as documentation for the user. -->
+ <arg_longname> <en>Color Mode</en> </arg_longname>
+ <arg_shortname> <en>ColorMode</en> </arg_shortname>
+ <arg_execution>
+ <arg_group>General</arg_group>
+ <arg_order>120</arg_order>
+ <arg_spot>A</arg_spot>
+ <arg_required />
+ <arg_substitution />
+ <arg_proto>%s </arg_proto>
+ </arg_execution>
+ <constraints>
+ <constraint sense="true">
+ <driver>foo2oak</driver>
+ <arg_defval>ev/foo2oak-ColorMode-mono</arg_defval>
+ </constraint>
+ </constraints>
+ <enum_vals>
+ <enum_val id="ev/foo2oak-ColorMode-mono">
+ <ev_longname> <en>Monochrome</en> </ev_longname>
+ <comments><en>
+ Prints in monochrome only
+ </en></comments>
+ <ev_shortname> <en>Monochrome</en> </ev_shortname>
+ <ev_driverval></ev_driverval>
+ </enum_val>
+ <enum_val id="ev/foo2oak-ColorMode-color">
+ <ev_longname> <en>Color</en> </ev_longname>
+ <comments><en>
+ Prints in color using the best compromise setting.
+ </en></comments>
+ <ev_shortname> <en>Color</en> </ev_shortname>
+ <ev_driverval>-c</ev_driverval>
+ </enum_val>
+ </enum_vals>
+</option>
diff --git a/foomatic-db/opt/foo2oak-ICM.xml b/foomatic-db/opt/foo2oak-ICM.xml
new file mode 100644
index 0000000..9f45fc0
--- /dev/null
+++ b/foomatic-db/opt/foo2oak-ICM.xml
@@ -0,0 +1,69 @@
+<option type="enum" id="opt/foo2oak-ICM">
+ <comments>
+ <en>
+ This option controls which .ICM file to use for color correction.
+ ICM files are stored in directory /usr/share/foo2oak/icm/.
+ </en>
+ </comments>
+ <arg_longname> <en>ICM Color Profile</en> </arg_longname>
+ <arg_shortname> <en>ICM</en> </arg_shortname>
+ <arg_execution>
+ <arg_group>Adjustment</arg_group>
+ <arg_order>300</arg_order>
+ <arg_spot>A</arg_spot>
+ <arg_required />
+ <arg_substitution />
+ <arg_proto>%s </arg_proto>
+ </arg_execution>
+ <constraints>
+ <constraint sense="true">
+ <driver>foo2oak</driver>
+ <arg_defval>ev/foo2oak-ICM-none</arg_defval>
+ </constraint>
+ </constraints>
+ <enum_vals>
+ <enum_val id="ev/foo2oak-ICM-none">
+ <ev_longname> <en>No ICM color correction</en> </ev_longname>
+ <!-- A multilingual <comments> block can appear here, too;
+ it should be treated as documentation for the user. -->
+ <ev_shortname> <en>none</en> </ev_shortname>
+ <ev_driverval></ev_driverval>
+ </enum_val>
+
+ <enum_val id="ev/foo2oak-ICM-testing">
+ <ev_longname> <en>File testing.icm</en> </ev_longname>
+ <!-- A multilingual <comments> block can appear here, too;
+ it should be treated as documentation for the user. -->
+ <ev_shortname> <en>testing</en> </ev_shortname>
+ <ev_driverval>-Gtesting.icm</ev_driverval>
+ </enum_val>
+ <enum_val id="ev/foo2oak-ICM-user1">
+ <ev_longname> <en>File user1.icm</en> </ev_longname>
+ <!-- A multilingual <comments> block can appear here, too;
+ it should be treated as documentation for the user. -->
+ <ev_shortname> <en>user1</en> </ev_shortname>
+ <ev_driverval>-Guser1.icm</ev_driverval>
+ </enum_val>
+ <enum_val id="ev/foo2oak-ICM-user2">
+ <ev_longname> <en>File user2.icm</en> </ev_longname>
+ <!-- A multilingual <comments> block can appear here, too;
+ it should be treated as documentation for the user. -->
+ <ev_shortname> <en>user2</en> </ev_shortname>
+ <ev_driverval>-Guser2.icm</ev_driverval>
+ </enum_val>
+ <enum_val id="ev/foo2oak-ICM-user3">
+ <ev_longname> <en>File user3.icm</en> </ev_longname>
+ <!-- A multilingual <comments> block can appear here, too;
+ it should be treated as documentation for the user. -->
+ <ev_shortname> <en>user3</en> </ev_shortname>
+ <ev_driverval>-Guser3.icm</ev_driverval>
+ </enum_val>
+ <enum_val id="ev/foo2oak-ICM-user4">
+ <ev_longname> <en>File user4.icm</en> </ev_longname>
+ <!-- A multilingual <comments> block can appear here, too;
+ it should be treated as documentation for the user. -->
+ <ev_shortname> <en>user4</en> </ev_shortname>
+ <ev_driverval>-Guser4.icm</ev_driverval>
+ </enum_val>
+ </enum_vals>
+</option>
diff --git a/foomatic-db/opt/foo2oak-InputSlot.xml b/foomatic-db/opt/foo2oak-InputSlot.xml
new file mode 100644
index 0000000..2bce889
--- /dev/null
+++ b/foomatic-db/opt/foo2oak-InputSlot.xml
@@ -0,0 +1,37 @@
+<option type="enum" id="opt/foo2oak-InputSlot">
+ <!-- A multilingual <comments> block can appear here, too;
+ it should be treated as documentation for the user. -->
+ <arg_longname> <en>Media Source</en> </arg_longname>
+ <arg_shortname> <en>InputSlot</en> </arg_shortname>
+ <arg_execution>
+ <arg_group>General</arg_group>
+ <arg_order>150</arg_order>
+ <arg_spot>A</arg_spot>
+ <arg_required />
+ <arg_substitution />
+ <arg_proto>-s%s </arg_proto>
+ </arg_execution>
+ <constraints>
+ <constraint sense="true">
+ <driver>foo2oak</driver>
+ <arg_defval>ev/foo2oak-InputSlot-7</arg_defval>
+ </constraint>
+ </constraints>
+ <enum_vals>
+ <enum_val id="ev/foo2oak-InputSlot-1">
+ <ev_longname> <en>Tray 1</en> </ev_longname>
+ <ev_shortname> <en>Tray1</en> </ev_shortname>
+ <ev_driverval>1</ev_driverval>
+ </enum_val>
+ <enum_val id="ev/foo2oak-InputSlot-4">
+ <ev_longname> <en>Manual Feed</en> </ev_longname>
+ <ev_shortname> <en>Manual</en> </ev_shortname>
+ <ev_driverval>4</ev_driverval>
+ </enum_val>
+ <enum_val id="ev/foo2oak-InputSlot-7">
+ <ev_longname> <en>Auto Select</en> </ev_longname>
+ <ev_shortname> <en>Auto</en> </ev_shortname>
+ <ev_driverval>7</ev_driverval>
+ </enum_val>
+ </enum_vals>
+</option>
diff --git a/foomatic-db/opt/foo2oak-MediaType.xml b/foomatic-db/opt/foo2oak-MediaType.xml
new file mode 100644
index 0000000..f033b4c
--- /dev/null
+++ b/foomatic-db/opt/foo2oak-MediaType.xml
@@ -0,0 +1,97 @@
+<option type="enum" id="opt/foo2oak-MediaType">
+ <!-- A multilingual <comments> block can appear here, too;
+ it should be treated as documentation for the user. -->
+ <arg_longname> <en>Media Type</en> </arg_longname>
+ <arg_shortname> <en>MediaType</en> </arg_shortname>
+ <arg_execution>
+ <arg_group>General</arg_group>
+ <arg_order>150</arg_order>
+ <arg_spot>A</arg_spot>
+ <arg_required />
+ <arg_substitution />
+ <arg_proto>-m%s </arg_proto>
+ </arg_execution>
+ <constraints>
+ <constraint sense="true">
+ <driver>foo2oak</driver>
+ <arg_defval>ev/foo2oak-MediaType-0</arg_defval>
+ </constraint>
+ </constraints>
+ <enum_vals>
+ <enum_val id="ev/foo2oak-MediaType-0">
+ <ev_longname> <en>Auto Select</en> </ev_longname>
+ <ev_shortname> <en>Auto</en> </ev_shortname>
+ <ev_driverval>0</ev_driverval>
+ </enum_val>
+ <enum_val id="ev/foo2oak-MediaType-1">
+ <ev_longname> <en>Plain</en> </ev_longname>
+ <ev_shortname> <en>Plain</en> </ev_shortname>
+ <ev_driverval>1</ev_driverval>
+ </enum_val>
+ <enum_val id="ev/foo2oak-MediaType-2">
+ <ev_longname> <en>Preprinted</en> </ev_longname>
+ <ev_shortname> <en>Preprinted</en> </ev_shortname>
+ <ev_driverval>2</ev_driverval>
+ </enum_val>
+ <enum_val id="ev/foo2oak-MediaType-3">
+ <ev_longname> <en>Letterhead</en> </ev_longname>
+ <ev_shortname> <en>Letterhead</en> </ev_shortname>
+ <ev_driverval>3</ev_driverval>
+ </enum_val>
+ <enum_val id="ev/foo2oak-MediaType-4">
+ <ev_longname> <en>Grayscale Transparency</en> </ev_longname>
+ <ev_shortname> <en>Graytrans</en> </ev_shortname>
+ <ev_driverval>4</ev_driverval>
+ </enum_val>
+ <enum_val id="ev/foo2oak-MediaType-5">
+ <ev_longname> <en>Prepunched</en> </ev_longname>
+ <ev_shortname> <en>Prepunched</en> </ev_shortname>
+ <ev_driverval>5</ev_driverval>
+ </enum_val>
+ <enum_val id="ev/foo2oak-MediaType-6">
+ <ev_longname> <en>Labels</en> </ev_longname>
+ <ev_shortname> <en>Labels</en> </ev_shortname>
+ <ev_driverval>6</ev_driverval>
+ </enum_val>
+ <enum_val id="ev/foo2oak-MediaType-7">
+ <ev_longname> <en>Bond</en> </ev_longname>
+ <ev_shortname> <en>Bond</en> </ev_shortname>
+ <ev_driverval>7</ev_driverval>
+ </enum_val>
+ <enum_val id="ev/foo2oak-MediaType-8">
+ <ev_longname> <en>Recycled</en> </ev_longname>
+ <ev_shortname> <en>Recycled</en> </ev_shortname>
+ <ev_driverval>8</ev_driverval>
+ </enum_val>
+ <enum_val id="ev/foo2oak-MediaType-9">
+ <ev_longname> <en>Color</en> </ev_longname>
+ <ev_shortname> <en>Color</en> </ev_shortname>
+ <ev_driverval>9</ev_driverval>
+ </enum_val>
+ <enum_val id="ev/foo2oak-MediaType-10">
+ <ev_longname> <en>Cardstock</en> </ev_longname>
+ <ev_shortname> <en>Cardstock</en> </ev_shortname>
+ <ev_driverval>10</ev_driverval>
+ </enum_val>
+ <enum_val id="ev/foo2oak-MediaType-11">
+ <ev_longname> <en>Heavy</en> </ev_longname>
+ <ev_shortname> <en>Heavy</en> </ev_shortname>
+ <ev_driverval>11</ev_driverval>
+ </enum_val>
+ <enum_val id="ev/foo2oak-MediaType-12">
+ <ev_longname> <en>Envelope</en> </ev_longname>
+ <ev_shortname> <en>Envelope</en> </ev_shortname>
+ <ev_driverval>12</ev_driverval>
+ </enum_val>
+ <enum_val id="ev/foo2oak-MediaType-13">
+ <ev_longname> <en>Light</en> </ev_longname>
+ <ev_shortname> <en>Light</en> </ev_shortname>
+ <ev_driverval>13</ev_driverval>
+ </enum_val>
+ <enum_val id="ev/foo2oak-MediaType-14">
+ <ev_longname> <en>Tough</en> </ev_longname>
+ <ev_shortname> <en>Tough</en> </ev_shortname>
+ <ev_driverval>14</ev_driverval>
+ </enum_val>
+ </enum_vals>
+</option>
diff --git a/foomatic-db/opt/foo2xqx-Duplex.xml b/foomatic-db/opt/foo2xqx-Duplex.xml
new file mode 100644
index 0000000..4dcdf2a
--- /dev/null
+++ b/foomatic-db/opt/foo2xqx-Duplex.xml
@@ -0,0 +1,37 @@
+<option type="enum" id="opt/foo2xqx-Duplex">
+ <!-- A multilingual <comments> block can appear here, too;
+ it should be treated as documentation for the user. -->
+ <arg_longname> <en>Duplex Printing</en> </arg_longname>
+ <arg_shortname> <en>Duplex</en> </arg_shortname>
+ <arg_execution>
+ <arg_group>General</arg_group>
+ <arg_order>210</arg_order>
+ <arg_spot>A</arg_spot>
+ <arg_required />
+ <arg_substitution />
+ <arg_proto>-d%s </arg_proto>
+ </arg_execution>
+ <constraints>
+ <constraint sense="true">
+ <driver>foo2xqx</driver>
+ <arg_defval>ev/foo2xqx-Duplex-1</arg_defval>
+ </constraint>
+ </constraints>
+ <enum_vals>
+ <enum_val id="ev/foo2xqx-Duplex-1">
+ <ev_longname> <en>Off</en> </ev_longname>
+ <ev_shortname> <en>None</en> </ev_shortname>
+ <ev_driverval>1</ev_driverval>
+ </enum_val>
+ <enum_val id="ev/foo2xqx-Duplex-2">
+ <ev_longname> <en>Long Edge (Standard)</en> </ev_longname>
+ <ev_shortname> <en>DuplexNoTumble</en> </ev_shortname>
+ <ev_driverval>2</ev_driverval>
+ </enum_val>
+ <enum_val id="ev/foo2xqx-Duplex-3">
+ <ev_longname> <en>Short Edge (Flip)</en> </ev_longname>
+ <ev_shortname> <en>DuplexTumble</en> </ev_shortname>
+ <ev_driverval>3</ev_driverval>
+ </enum_val>
+ </enum_vals>
+</option>
diff --git a/foomatic-db/opt/foo2xqx-InputSlot.xml b/foomatic-db/opt/foo2xqx-InputSlot.xml
new file mode 100644
index 0000000..25c7329
--- /dev/null
+++ b/foomatic-db/opt/foo2xqx-InputSlot.xml
@@ -0,0 +1,37 @@
+<option type="enum" id="opt/foo2xqx-InputSlot">
+ <!-- A multilingual <comments> block can appear here, too;
+ it should be treated as documentation for the user. -->
+ <arg_longname> <en>Media Source</en> </arg_longname>
+ <arg_shortname> <en>InputSlot</en> </arg_shortname>
+ <arg_execution>
+ <arg_group>General</arg_group>
+ <arg_order>150</arg_order>
+ <arg_spot>A</arg_spot>
+ <arg_required />
+ <arg_substitution />
+ <arg_proto>-s%s </arg_proto>
+ </arg_execution>
+ <constraints>
+ <constraint sense="true">
+ <driver>foo2xqx</driver>
+ <arg_defval>ev/foo2xqx-InputSlot-7</arg_defval>
+ </constraint>
+ </constraints>
+ <enum_vals>
+ <enum_val id="ev/foo2xqx-InputSlot-1">
+ <ev_longname> <en>Tray 1</en> </ev_longname>
+ <ev_shortname> <en>Tray1</en> </ev_shortname>
+ <ev_driverval>1</ev_driverval>
+ </enum_val>
+ <enum_val id="ev/foo2xqx-InputSlot-4">
+ <ev_longname> <en>Manual Feed</en> </ev_longname>
+ <ev_shortname> <en>Manual</en> </ev_shortname>
+ <ev_driverval>4</ev_driverval>
+ </enum_val>
+ <enum_val id="ev/foo2xqx-InputSlot-7">
+ <ev_longname> <en>Auto Select</en> </ev_longname>
+ <ev_shortname> <en>Auto</en> </ev_shortname>
+ <ev_driverval>7</ev_driverval>
+ </enum_val>
+ </enum_vals>
+</option>
diff --git a/foomatic-db/opt/foo2xqx-MediaType.xml b/foomatic-db/opt/foo2xqx-MediaType.xml
new file mode 100644
index 0000000..128ff57
--- /dev/null
+++ b/foomatic-db/opt/foo2xqx-MediaType.xml
@@ -0,0 +1,122 @@
+<option type="enum" id="opt/foo2xqx-MediaType">
+ <!-- A multilingual <comments> block can appear here, too;
+ it should be treated as documentation for the user. -->
+ <arg_longname> <en>Media Type</en> </arg_longname>
+ <arg_shortname> <en>MediaType</en> </arg_shortname>
+ <arg_execution>
+ <arg_group>General</arg_group>
+ <arg_order>150</arg_order>
+ <arg_spot>A</arg_spot>
+ <arg_required />
+ <arg_substitution />
+ <arg_proto>-m%s </arg_proto>
+ </arg_execution>
+ <constraints>
+ <constraint sense="true">
+ <driver>foo2xqx</driver>
+ <arg_defval>ev/foo2xqx-MediaType-1</arg_defval>
+ </constraint>
+ </constraints>
+ <enum_vals>
+ <enum_val id="ev/foo2xqx-MediaType-0">
+ <ev_longname> <en>Unspecified Paper</en> </ev_longname>
+ <ev_shortname> <en>Unspecified</en> </ev_shortname>
+ <ev_driverval>0</ev_driverval>
+ </enum_val>
+ <enum_val id="ev/foo2xqx-MediaType-1">
+ <ev_longname> <en>Plain Paper</en> </ev_longname>
+ <ev_shortname> <en>Plain</en> </ev_shortname>
+ <ev_driverval>1</ev_driverval>
+ </enum_val>
+ <enum_val id="ev/foo2xqx-MediaType-301">
+ <ev_longname> <en>HP Multipurpose Paper</en> </ev_longname>
+ <ev_shortname> <en>Multipurpose</en> </ev_shortname>
+ <ev_driverval>301</ev_driverval>
+ </enum_val>
+ <enum_val id="ev/foo2xqx-MediaType-300">
+ <ev_longname> <en>HP Office Paper</en> </ev_longname>
+ <ev_shortname> <en>Office</en> </ev_shortname>
+ <ev_driverval>300</ev_driverval>
+ </enum_val>
+ <enum_val id="ev/foo2xqx-MediaType-303">
+ <ev_longname> <en>HP All-in-one Printing Paper</en> </ev_longname>
+ <ev_shortname> <en>All-in-one</en> </ev_shortname>
+ <ev_driverval>303</ev_driverval>
+ </enum_val>
+ <enum_val id="ev/foo2xqx-MediaType-302">
+ <ev_longname> <en>HP LaserJet Paper</en> </ev_longname>
+ <ev_shortname> <en>LaserJet</en> </ev_shortname>
+ <ev_driverval>302</ev_driverval>
+ </enum_val>
+ <enum_val id="ev/foo2xqx-MediaType-304">
+ <ev_longname> <en>HP Premium Choice LaserJet Paper</en> </ev_longname>
+ <ev_shortname> <en>PremiumLaserJet</en> </ev_shortname>
+ <ev_driverval>302</ev_driverval>
+ </enum_val>
+ <enum_val id="ev/foo2xqx-MediaType-514">
+ <ev_longname> <en>Preprinted Paper</en> </ev_longname>
+ <ev_shortname> <en>Preprinted</en> </ev_shortname>
+ <ev_driverval>514</ev_driverval>
+ </enum_val>
+ <enum_val id="ev/foo2xqx-MediaType-513">
+ <ev_longname> <en>Letterhead</en> </ev_longname>
+ <ev_shortname> <en>Letterhead</en> </ev_shortname>
+ <ev_driverval>513</ev_driverval>
+ </enum_val>
+ <enum_val id="ev/foo2xqx-MediaType-2">
+ <ev_longname> <en>Transparency</en> </ev_longname>
+ <ev_shortname> <en>Transparency</en> </ev_shortname>
+ <ev_driverval>2</ev_driverval>
+ </enum_val>
+ <enum_val id="ev/foo2xqx-MediaType-515">
+ <ev_longname> <en>Prepunched Paper</en> </ev_longname>
+ <ev_shortname> <en>Prepunched</en> </ev_shortname>
+ <ev_driverval>515</ev_driverval>
+ </enum_val>
+ <enum_val id="ev/foo2xqx-MediaType-265">
+ <ev_longname> <en>Labels</en> </ev_longname>
+ <ev_shortname> <en>Labels</en> </ev_shortname>
+ <ev_driverval>265</ev_driverval>
+ </enum_val>
+ <enum_val id="ev/foo2xqx-MediaType-260">
+ <ev_longname> <en>Bond</en> </ev_longname>
+ <ev_shortname> <en>Bond</en> </ev_shortname>
+ <ev_driverval>260</ev_driverval>
+ </enum_val>
+ <enum_val id="ev/foo2xqx-MediaType-516">
+ <ev_longname> <en>Recycled Paper</en> </ev_longname>
+ <ev_shortname> <en>Recycled</en> </ev_shortname>
+ <ev_driverval>516</ev_driverval>
+ </enum_val>
+ <enum_val id="ev/foo2xqx-MediaType-512">
+ <ev_longname> <en>Color</en> </ev_longname>
+ <ev_shortname> <en>Color</en> </ev_shortname>
+ <ev_driverval>512</ev_driverval>
+ </enum_val>
+ <enum_val id="ev/foo2xqx-MediaType-258">
+ <ev_longname> <en>Light</en> </ev_longname>
+ <ev_shortname> <en>Light</en> </ev_shortname>
+ <ev_driverval>258</ev_driverval>
+ </enum_val>
+ <enum_val id="ev/foo2xqx-MediaType-262">
+ <ev_longname> <en>Heavy</en> </ev_longname>
+ <ev_shortname> <en>Heavy</en> </ev_shortname>
+ <ev_driverval>262</ev_driverval>
+ </enum_val>
+ <enum_val id="ev/foo2xqx-MediaType-261">
+ <ev_longname> <en>Cardstock</en> </ev_longname>
+ <ev_shortname> <en>Cardstock</en> </ev_shortname>
+ <ev_driverval>261</ev_driverval>
+ </enum_val>
+ <enum_val id="ev/foo2xqx-MediaType-267">
+ <ev_longname> <en>Envelope</en> </ev_longname>
+ <ev_shortname> <en>Envelope</en> </ev_shortname>
+ <ev_driverval>267</ev_driverval>
+ </enum_val>
+ <enum_val id="ev/foo2xqx-MediaType-263">
+ <ev_longname> <en>Rough</en> </ev_longname>
+ <ev_shortname> <en>Rough</en> </ev_shortname>
+ <ev_driverval>263</ev_driverval>
+ </enum_val>
+ </enum_vals>
+</option>
diff --git a/foomatic-db/opt/foo2xqx-Quality.xml b/foomatic-db/opt/foo2xqx-Quality.xml
new file mode 100644
index 0000000..d71a502
--- /dev/null
+++ b/foomatic-db/opt/foo2xqx-Quality.xml
@@ -0,0 +1,32 @@
+<option type="enum" id="opt/foo2xqx-Quality">
+ <!-- A multilingual <comments> block can appear here, too;
+ it should be treated as documentation for the user. -->
+ <arg_longname> <en>Printing Quality</en> </arg_longname>
+ <arg_shortname> <en>Quality</en> </arg_shortname>
+ <arg_execution>
+ <arg_group>General</arg_group>
+ <arg_order>110</arg_order>
+ <arg_spot>A</arg_spot>
+ <arg_required />
+ <arg_substitution />
+ <arg_proto> %s </arg_proto>
+ </arg_execution>
+ <constraints>
+ <constraint sense="true">
+ <driver>foo2xqx</driver>
+ <arg_defval>ev/foo2xqx-Quality-Normal</arg_defval>
+ </constraint>
+ </constraints>
+ <enum_vals>
+ <enum_val id="ev/foo2xqx-Quality-Normal">
+ <ev_longname> <en>Normal</en> </ev_longname>
+ <ev_shortname> <en>normal</en> </ev_shortname>
+ <ev_driverval></ev_driverval>
+ </enum_val>
+ <enum_val id="ev/foo2xqx-Quality-Draft">
+ <ev_longname> <en>Draft</en> </ev_longname>
+ <ev_shortname> <en>draft</en> </ev_shortname>
+ <ev_driverval>-t </ev_driverval>
+ </enum_val>
+ </enum_vals>
+</option>
diff --git a/foomatic-db/opt/foo2xqx-Resolution.xml b/foomatic-db/opt/foo2xqx-Resolution.xml
new file mode 100644
index 0000000..1ed3385
--- /dev/null
+++ b/foomatic-db/opt/foo2xqx-Resolution.xml
@@ -0,0 +1,36 @@
+<option type="enum" id="opt/foo2xqx-Resolution">
+ <!-- A multilingual <comments> block can appear here, too;
+ it should be treated as documentation for the user. -->
+ <arg_longname> <en>Resolution</en> </arg_longname>
+ <arg_shortname> <en>Resolution</en> </arg_shortname>
+ <arg_execution>
+ <arg_group>General</arg_group>
+ <arg_order>130</arg_order>
+ <arg_spot>A</arg_spot>
+ <arg_required />
+ <arg_substitution />
+ <arg_proto>-r%s </arg_proto>
+ </arg_execution>
+ <constraints>
+ <constraint sense="true">
+ <driver>foo2xqx</driver>
+ <arg_defval>ev/foo2xqx-Resolution-1200x600</arg_defval>
+ </constraint>
+ </constraints>
+ <enum_vals>
+ <enum_val id="ev/foo2xqx-Resolution-600x600">
+ <ev_longname> <en>600x600 dpi</en> </ev_longname>
+ <!-- A multilingual <comments> block can appear here, too;
+ it should be treated as documentation for the user. -->
+ <ev_shortname> <en>600x600dpi</en> </ev_shortname>
+ <ev_driverval>600x600</ev_driverval>
+ </enum_val>
+ <enum_val id="ev/foo2xqx-Resolution-1200x600">
+ <ev_longname> <en>1200x600 dpi</en> </ev_longname>
+ <!-- A multilingual <comments> block can appear here, too;
+ it should be treated as documentation for the user. -->
+ <ev_shortname> <en>1200x600dpi</en> </ev_shortname>
+ <ev_driverval>1200x600</ev_driverval>
+ </enum_val>
+ </enum_vals>
+</option>
diff --git a/foomatic-db/opt/foo2zjs-ColorMode.xml b/foomatic-db/opt/foo2zjs-ColorMode.xml
new file mode 100644
index 0000000..afef585
--- /dev/null
+++ b/foomatic-db/opt/foo2zjs-ColorMode.xml
@@ -0,0 +1,186 @@
+<option type="enum" id="opt/foo2zjs-ColorMode">
+ <!-- A multilingual <comments> block can appear here, too;
+ it should be treated as documentation for the user. -->
+ <arg_longname> <en>Color Mode</en> </arg_longname>
+ <arg_shortname> <en>ColorMode</en> </arg_shortname>
+ <arg_execution>
+ <arg_group>General</arg_group>
+ <arg_order>120</arg_order>
+ <arg_spot>A</arg_spot>
+ <arg_required />
+ <arg_substitution />
+ <arg_proto>%s </arg_proto>
+ </arg_execution>
+ <constraints>
+ <constraint sense="true">
+ <driver>foo2zjs</driver>
+ <arg_defval>ev/foo2zjs-ColorMode-mono</arg_defval>
+ </constraint>
+ </constraints>
+ <enum_vals>
+ <enum_val id="ev/foo2zjs-ColorMode-mono">
+ <ev_longname> <en>Monochrome</en> </ev_longname>
+ <comments><en>
+ Prints in monochrome only
+ </en></comments>
+ <ev_shortname> <en>Monochrome</en> </ev_shortname>
+ <ev_driverval></ev_driverval>
+ </enum_val>
+ <enum_val id="ev/foo2zjs-ColorMode-color">
+ <ev_longname> <en>Color</en> </ev_longname>
+ <comments><en>
+ Prints in color using the best compromise setting.
+ </en></comments>
+ <ev_shortname> <en>Color</en> </ev_shortname>
+ <ev_driverval>-c</ev_driverval>
+ <constraints>
+ <constraint sense="false">
+ <make>HP</make> <model>LaserJet 1000</model>
+ </constraint>
+ <constraint sense="false">
+ <make>HP</make> <model>LaserJet 1005</model>
+ </constraint>
+ <constraint sense="false">
+ <make>HP</make> <model>LaserJet 1018</model>
+ </constraint>
+ <constraint sense="false">
+ <make>HP</make> <model>LaserJet 1020</model>
+ </constraint>
+ <constraint sense="false">
+ <make>HP</make> <model>LaserJet 1022</model>
+ </constraint>
+ </constraints>
+ </enum_val>
+ <enum_val id="ev/foo2zjs-ColorMode-color">
+ <ev_longname> <en>Color</en> </ev_longname>
+ <comments><en>
+ Prints in color using the best compromise setting.
+ </en></comments>
+ <ev_shortname> <en>Color</en> </ev_shortname>
+ <ev_driverval>-c</ev_driverval>
+ <constraints>
+ <constraint sense="false">
+ <make>HP</make> <model>LaserJet 1000</model>
+ </constraint>
+ <constraint sense="false">
+ <make>HP</make> <model>LaserJet 1005</model>
+ </constraint>
+ <constraint sense="false">
+ <make>HP</make> <model>LaserJet 1018</model>
+ </constraint>
+ <constraint sense="false">
+ <make>HP</make> <model>LaserJet 1020</model>
+ </constraint>
+ <constraint sense="false">
+ <make>HP</make> <model>LaserJet 1022</model>
+ </constraint>
+ </constraints>
+ </enum_val>
+ <enum_val id="ev/foo2zjs-ColorMode-PhotoOnly">
+ <ev_longname> <en>Color - Photo Only</en> </ev_longname>
+ <comments><en>
+ Prints with full usage of color.
+ Black will be mixed with color toner.
+ Not useful for text or large black areas.
+ </en></comments>
+ <ev_shortname> <en>PhotoOnly</en> </ev_shortname>
+ <ev_driverval>-c -C1</ev_driverval>
+ <constraints>
+ <constraint sense="false">
+ <make>HP</make> <model>LaserJet 1000</model>
+ </constraint>
+ <constraint sense="false">
+ <make>HP</make> <model>LaserJet 1005</model>
+ </constraint>
+ <constraint sense="false">
+ <make>HP</make> <model>LaserJet 1018</model>
+ </constraint>
+ <constraint sense="false">
+ <make>HP</make> <model>LaserJet 1020</model>
+ </constraint>
+ <constraint sense="false">
+ <make>HP</make> <model>LaserJet 1022</model>
+ </constraint>
+ </constraints>
+ </enum_val>
+ <enum_val id="ev/foo2zjs-ColorMode-PhotoAndText">
+ <ev_longname> <en>Color - Photos and Text</en> </ev_longname>
+ <comments><en>
+ Prints without adding color to black.
+ Makes sharp text and colorful photos.
+ </en></comments>
+ <ev_shortname> <en>PhotosAndText</en> </ev_shortname>
+ <ev_driverval>-c -C2</ev_driverval>
+ <constraints>
+ <constraint sense="false">
+ <make>HP</make> <model>LaserJet 1000</model>
+ </constraint>
+ <constraint sense="false">
+ <make>HP</make> <model>LaserJet 1005</model>
+ </constraint>
+ <constraint sense="false">
+ <make>HP</make> <model>LaserJet 1018</model>
+ </constraint>
+ <constraint sense="false">
+ <make>HP</make> <model>LaserJet 1020</model>
+ </constraint>
+ <constraint sense="false">
+ <make>HP</make> <model>LaserJet 1022</model>
+ </constraint>
+ </constraints>
+ </enum_val>
+ <enum_val id="ev/foo2zjs-ColorMode-GraphicAndText">
+ <ev_longname> <en>Color - Graphics and Text</en> </ev_longname>
+ <comments><en>
+ Best mode for everyday printing.
+ Also usable for photos, but reduces color under black pixels.
+ Very dark areas will printed with black only.
+ Produces nice Gray without Color shining.
+ </en></comments>
+ <ev_shortname> <en>GraphicsAndText</en> </ev_shortname>
+ <ev_driverval>-c -C3</ev_driverval>
+ <constraints>
+ <constraint sense="false">
+ <make>HP</make> <model>LaserJet 1000</model>
+ </constraint>
+ <constraint sense="false">
+ <make>HP</make> <model>LaserJet 1005</model>
+ </constraint>
+ <constraint sense="false">
+ <make>HP</make> <model>LaserJet 1018</model>
+ </constraint>
+ <constraint sense="false">
+ <make>HP</make> <model>LaserJet 1020</model>
+ </constraint>
+ <constraint sense="false">
+ <make>HP</make> <model>LaserJet 1022</model>
+ </constraint>
+ </constraints>
+ </enum_val>
+ <enum_val id="ev/foo2zjs-ColorMode-ICM">
+ <ev_longname> <en>Color - use ICM color profile</en> </ev_longname>
+ <comments><en>
+ Uses the selected ICM color profile file and intent.
+ </en></comments>
+ <ev_shortname> <en>ICM</en> </ev_shortname>
+ <ev_driverval>-c -C10</ev_driverval>
+ <constraints>
+ <constraint sense="false">
+ <make>HP</make> <model>LaserJet 1000</model>
+ </constraint>
+ <constraint sense="false">
+ <make>HP</make> <model>LaserJet 1005</model>
+ </constraint>
+ <constraint sense="false">
+ <make>HP</make> <model>LaserJet 1018</model>
+ </constraint>
+ <constraint sense="false">
+ <make>HP</make> <model>LaserJet 1020</model>
+ </constraint>
+ <constraint sense="false">
+ <make>HP</make> <model>LaserJet 1022</model>
+ </constraint>
+ </constraints>
+ </enum_val>
+ </enum_vals>
+</option>
diff --git a/foomatic-db/opt/foo2zjs-Copies.xml b/foomatic-db/opt/foo2zjs-Copies.xml
new file mode 100644
index 0000000..29a1c1b
--- /dev/null
+++ b/foomatic-db/opt/foo2zjs-Copies.xml
@@ -0,0 +1,38 @@
+<option type="int" id="opt/foo2oakzjs-Copies">
+ <!-- A multilingual <comments> block can appear here, too;
+ it should be treated as documentation for the user. -->
+ <arg_longname> <en>Copies</en> </arg_longname>
+ <arg_shortname> <en>Copies</en> </arg_shortname>
+ <arg_execution>
+ <arg_group>General</arg_group>
+ <arg_order>220</arg_order>
+ <arg_spot>A</arg_spot>
+ <arg_required />
+ <arg_substitution />
+ <arg_proto>-n%s </arg_proto>
+ </arg_execution>
+ <constraints>
+ <constraint sense="true">
+ <driver>foo2zjs</driver>
+ <arg_defval>1</arg_defval>
+ </constraint>
+ <constraint sense="true">
+ <driver>foo2oak</driver>
+ <arg_defval>1</arg_defval>
+ </constraint>
+ <constraint sense="true">
+ <driver>foo2hp</driver>
+ <arg_defval>1</arg_defval>
+ </constraint>
+ <constraint sense="true">
+ <driver>foo2xqx</driver>
+ <arg_defval>1</arg_defval>
+ </constraint>
+ <constraint sense="true">
+ <driver>foo2lava</driver>
+ <arg_defval>1</arg_defval>
+ </constraint>
+ </constraints>
+ <arg_max>100</arg_max>
+ <arg_min>1</arg_min>
+</option>
diff --git a/foomatic-db/opt/foo2zjs-Duplex.xml b/foomatic-db/opt/foo2zjs-Duplex.xml
new file mode 100644
index 0000000..c14d699
--- /dev/null
+++ b/foomatic-db/opt/foo2zjs-Duplex.xml
@@ -0,0 +1,59 @@
+<option type="enum" id="opt/foo2zjs-Duplex">
+ <!-- A multilingual <comments> block can appear here, too;
+ it should be treated as documentation for the user. -->
+ <arg_longname> <en>Duplex Printing</en> </arg_longname>
+ <arg_shortname> <en>Duplex</en> </arg_shortname>
+ <arg_execution>
+ <arg_group>General</arg_group>
+ <arg_order>210</arg_order>
+ <arg_spot>A</arg_spot>
+ <arg_required />
+ <arg_substitution />
+ <arg_proto>-d%s </arg_proto>
+ </arg_execution>
+ <constraints>
+ <constraint sense="true">
+ <driver>foo2zjs</driver>
+ <arg_defval>ev/foo2zjs-Duplex-1</arg_defval>
+ </constraint>
+ <constraint sense="false">
+ <make>HP</make> <model>LaserJet 1000</model>
+ </constraint>
+ <constraint sense="false">
+ <make>HP</make> <model>LaserJet 1005</model>
+ </constraint>
+ <constraint sense="false">
+ <make>HP</make> <model>LaserJet 1018</model>
+ </constraint>
+ <constraint sense="false">
+ <make>HP</make> <model>LaserJet 1020</model>
+ </constraint>
+ </constraints>
+ <enum_vals>
+ <enum_val id="ev/foo2zjs-Duplex-1">
+ <ev_longname> <en>Off</en> </ev_longname>
+ <ev_shortname> <en>None</en> </ev_shortname>
+ <ev_driverval>1</ev_driverval>
+ </enum_val>
+ <enum_val id="ev/foo2zjs-Duplex-2">
+ <ev_longname> <en>Long Edge (Standard)</en> </ev_longname>
+ <ev_shortname> <en>DuplexNoTumble</en> </ev_shortname>
+ <ev_driverval>2</ev_driverval>
+ </enum_val>
+ <enum_val id="ev/foo2zjs-Duplex-3">
+ <ev_longname> <en>Short Edge (Flip)</en> </ev_longname>
+ <ev_shortname> <en>DuplexTumble</en> </ev_shortname>
+ <ev_driverval>3</ev_driverval>
+ </enum_val>
+ <enum_val id="ev/foo2zjs-Duplex-4">
+ <ev_longname> <en>Manual Long Edge (Standard)</en> </ev_longname>
+ <ev_shortname> <en>ManualDuplexNoTumble</en> </ev_shortname>
+ <ev_driverval>4</ev_driverval>
+ </enum_val>
+ <enum_val id="ev/foo2zjs-Duplex-5">
+ <ev_longname> <en>Manual Short Edge (Flip)</en> </ev_longname>
+ <ev_shortname> <en>ManualDuplexTumble</en> </ev_shortname>
+ <ev_driverval>5</ev_driverval>
+ </enum_val>
+ </enum_vals>
+</option>
diff --git a/foomatic-db/opt/foo2zjs-ICM.xml b/foomatic-db/opt/foo2zjs-ICM.xml
new file mode 100644
index 0000000..90fa813
--- /dev/null
+++ b/foomatic-db/opt/foo2zjs-ICM.xml
@@ -0,0 +1,304 @@
+<option type="enum" id="opt/foo2zjs-ICM">
+ <comments>
+ <en>
+ This option controls which .ICM file to use for color correction.
+ ICM files are stored in directory /usr/share/foo2zjs/icm/.
+ </en>
+ </comments>
+ <arg_longname> <en>ICM Color Profile</en> </arg_longname>
+ <arg_shortname> <en>ICM</en> </arg_shortname>
+ <arg_execution>
+ <arg_group>Adjustment</arg_group>
+ <arg_order>300</arg_order>
+ <arg_spot>A</arg_spot>
+ <arg_required />
+ <arg_substitution />
+ <arg_proto>%s </arg_proto>
+ </arg_execution>
+ <constraints>
+ <constraint sense="true">
+ <driver>foo2zjs</driver>
+ <arg_defval>ev/foo2zjs-ICM-none</arg_defval>
+ </constraint>
+ <constraint sense="true">
+ <make>Minolta</make>
+ <model>magicolor 2430 DL</model>
+ <driver>foo2zjs</driver>
+ <arg_defval>ev/foo2zjs-ICM-DL2312</arg_defval>
+ </constraint>
+ <constraint sense="true">
+ <make>Minolta</make>
+ <model>magicolor 2300 DL</model>
+ <driver>foo2zjs</driver>
+ <arg_defval>ev/foo2zjs-ICM-DL2312</arg_defval>
+ </constraint>
+ <constraint sense="true">
+ <make>Minolta</make>
+ <model>magicolor 2200 DL</model>
+ <driver>foo2zjs</driver>
+ <arg_defval>ev/foo2zjs-ICM-DL2200RGB</arg_defval>
+ </constraint>
+ <constraint sense="false">
+ <make>HP</make> <model>LaserJet 1000</model>
+ </constraint>
+ <constraint sense="false">
+ <make>HP</make> <model>LaserJet 1005</model>
+ </constraint>
+ <constraint sense="false">
+ <make>HP</make> <model>LaserJet 1018</model>
+ </constraint>
+ <constraint sense="false">
+ <make>HP</make> <model>LaserJet 1020</model>
+ </constraint>
+ <constraint sense="false">
+ <make>HP</make> <model>LaserJet 1022</model>
+ </constraint>
+ </constraints>
+ <enum_vals>
+ <enum_val id="ev/foo2zjs-ICM-none">
+ <ev_longname> <en>No ICM color correction</en> </ev_longname>
+ <!-- A multilingual <comments> block can appear here, too;
+ it should be treated as documentation for the user. -->
+ <ev_shortname> <en>none</en> </ev_shortname>
+ <ev_driverval></ev_driverval>
+ </enum_val>
+
+ <enum_val id="ev/foo2zjs-ICM-DL2312">
+ <ev_longname> <en>File DL2312.icm</en> </ev_longname>
+ <!-- A multilingual <comments> block can appear here, too;
+ it should be treated as documentation for the user. -->
+ <ev_shortname> <en>DL2312</en> </ev_shortname>
+ <ev_driverval>-GDL2312.icm</ev_driverval>
+ <constraints>
+ <constraint sense="false">
+ <driver>foo2zjs</driver>
+ </constraint>
+ <constraint sense="true">
+ <printer>Minolta-magicolor_2430_DL</printer>
+ </constraint>
+ <constraint sense="true">
+ <printer>Minolta-magicolor_2300_DL</printer>
+ </constraint>
+ </constraints>
+ </enum_val>
+ <enum_val id="ev/foo2zjs-ICM-DL2324">
+ <ev_longname> <en>File DL2324.icm</en> </ev_longname>
+ <!-- A multilingual <comments> block can appear here, too;
+ it should be treated as documentation for the user. -->
+ <ev_shortname> <en>DL2324</en> </ev_shortname>
+ <ev_driverval>-GDL2324.icm</ev_driverval>
+ <constraints>
+ <constraint sense="false">
+ <driver>foo2zjs</driver>
+ </constraint>
+ <constraint sense="true">
+ <printer>Minolta-magicolor_2430_DL</printer>
+ </constraint>
+ <constraint sense="true">
+ <printer>Minolta-magicolor_2300_DL</printer>
+ </constraint>
+ </constraints>
+ </enum_val>
+ <enum_val id="ev/foo2zjs-ICM-km2430_2">
+ <ev_longname> <en>File km2430_2.icm</en> </ev_longname>
+ <!-- A multilingual <comments> block can appear here, too;
+ it should be treated as documentation for the user. -->
+ <ev_shortname> <en>km2430_2</en> </ev_shortname>
+ <ev_driverval>-Gkm2430_2.icm</ev_driverval>
+ <constraints>
+ <constraint sense="false">
+ <driver>foo2zjs</driver>
+ </constraint>
+ <constraint sense="true">
+ <printer>Minolta-magicolor_2430_DL</printer>
+ </constraint>
+ <constraint sense="true">
+ <printer>Minolta-magicolor_2300_DL</printer>
+ </constraint>
+ </constraints>
+ </enum_val>
+
+ <enum_val id="ev/foo2zjs-ICM-DL2200RGB">
+ <ev_longname> <en>File DL2200RGB.icm</en> </ev_longname>
+ <!-- A multilingual <comments> block can appear here, too;
+ it should be treated as documentation for the user. -->
+ <ev_shortname> <en>DL2200RGB</en> </ev_shortname>
+ <ev_driverval>-GDL2200RGB.icm</ev_driverval>
+ <constraints>
+ <constraint sense="false">
+ <driver>foo2zjs</driver>
+ </constraint>
+ <constraint sense="true">
+ <printer>Minolta-magicolor_2200_DL</printer>
+ </constraint>
+ </constraints>
+ </enum_val>
+
+ <enum_val id="ev/foo2zjs-ICM-CPWL6W">
+ <ev_longname> <en>File CPWL6W.icm</en> </ev_longname>
+ <!-- A multilingual <comments> block can appear here, too;
+ it should be treated as documentation for the user. -->
+ <ev_shortname> <en>CPWL6W</en> </ev_shortname>
+ <ev_driverval>-GCPWL6W.icm</ev_driverval>
+ <constraints>
+ <constraint sense="false">
+ <driver>foo2zjs</driver>
+ </constraint>
+ <constraint sense="true">
+ <printer>Minolta-Color_PageWorks_Pro_L</printer>
+ </constraint>
+ </constraints>
+ </enum_val>
+ <enum_val id="ev/foo2zjs-ICM-CPWL12W">
+ <ev_longname> <en>File CPWL12W.icm</en> </ev_longname>
+ <!-- A multilingual <comments> block can appear here, too;
+ it should be treated as documentation for the user. -->
+ <ev_shortname> <en>CPWL12W</en> </ev_shortname>
+ <ev_driverval>-GCPWL12W.icm</ev_driverval>
+ <constraints>
+ <constraint sense="false">
+ <driver>foo2zjs</driver>
+ </constraint>
+ <constraint sense="true">
+ <printer>Minolta-Color_PageWorks_Pro_L</printer>
+ </constraint>
+ </constraints>
+ </enum_val>
+ <enum_val id="ev/foo2zjs-ICM-CPWL24W">
+ <ev_longname> <en>File CPWL24W.icm</en> </ev_longname>
+ <!-- A multilingual <comments> block can appear here, too;
+ it should be treated as documentation for the user. -->
+ <ev_shortname> <en>CPWL24W</en> </ev_shortname>
+ <ev_driverval>-GCPWL24W.icm</ev_driverval>
+ <constraints>
+ <constraint sense="false">
+ <driver>foo2zjs</driver>
+ </constraint>
+ <constraint sense="true">
+ <printer>Minolta-Color_PageWorks_Pro_L</printer>
+ </constraint>
+ </constraints>
+ </enum_val>
+
+ <enum_val id="ev/foo2zjs-ICM-testing">
+ <ev_longname> <en>File testing.icm</en> </ev_longname>
+ <!-- A multilingual <comments> block can appear here, too;
+ it should be treated as documentation for the user. -->
+ <ev_shortname> <en>testing</en> </ev_shortname>
+ <ev_driverval>-Gtesting.icm</ev_driverval>
+ <constraints>
+ <constraint sense="false">
+ <make>HP</make> <model>LaserJet 1000</model>
+ </constraint>
+ <constraint sense="false">
+ <make>HP</make> <model>LaserJet 1005</model>
+ </constraint>
+ <constraint sense="false">
+ <make>HP</make> <model>LaserJet 1018</model>
+ </constraint>
+ <constraint sense="false">
+ <make>HP</make> <model>LaserJet 1020</model>
+ </constraint>
+ <constraint sense="false">
+ <make>HP</make> <model>LaserJet 1022</model>
+ </constraint>
+ </constraints>
+ </enum_val>
+ <enum_val id="ev/foo2zjs-ICM-user1">
+ <ev_longname> <en>File user1.icm</en> </ev_longname>
+ <!-- A multilingual <comments> block can appear here, too;
+ it should be treated as documentation for the user. -->
+ <ev_shortname> <en>user1</en> </ev_shortname>
+ <ev_driverval>-Guser1.icm</ev_driverval>
+ <constraints>
+ <constraint sense="false">
+ <make>HP</make> <model>LaserJet 1000</model>
+ </constraint>
+ <constraint sense="false">
+ <make>HP</make> <model>LaserJet 1005</model>
+ </constraint>
+ <constraint sense="false">
+ <make>HP</make> <model>LaserJet 1018</model>
+ </constraint>
+ <constraint sense="false">
+ <make>HP</make> <model>LaserJet 1020</model>
+ </constraint>
+ <constraint sense="false">
+ <make>HP</make> <model>LaserJet 1022</model>
+ </constraint>
+ </constraints>
+ </enum_val>
+ <enum_val id="ev/foo2zjs-ICM-user2">
+ <ev_longname> <en>File user2.icm</en> </ev_longname>
+ <!-- A multilingual <comments> block can appear here, too;
+ it should be treated as documentation for the user. -->
+ <ev_shortname> <en>user2</en> </ev_shortname>
+ <ev_driverval>-Guser2.icm</ev_driverval>
+ <constraints>
+ <constraint sense="false">
+ <make>HP</make> <model>LaserJet 1000</model>
+ </constraint>
+ <constraint sense="false">
+ <make>HP</make> <model>LaserJet 1005</model>
+ </constraint>
+ <constraint sense="false">
+ <make>HP</make> <model>LaserJet 1018</model>
+ </constraint>
+ <constraint sense="false">
+ <make>HP</make> <model>LaserJet 1020</model>
+ </constraint>
+ <constraint sense="false">
+ <make>HP</make> <model>LaserJet 1022</model>
+ </constraint>
+ </constraints>
+ </enum_val>
+ <enum_val id="ev/foo2zjs-ICM-user3">
+ <ev_longname> <en>File user3.icm</en> </ev_longname>
+ <!-- A multilingual <comments> block can appear here, too;
+ it should be treated as documentation for the user. -->
+ <ev_shortname> <en>user3</en> </ev_shortname>
+ <ev_driverval>-Guser3.icm</ev_driverval>
+ <constraints>
+ <constraint sense="false">
+ <make>HP</make> <model>LaserJet 1000</model>
+ </constraint>
+ <constraint sense="false">
+ <make>HP</make> <model>LaserJet 1005</model>
+ </constraint>
+ <constraint sense="false">
+ <make>HP</make> <model>LaserJet 1018</model>
+ </constraint>
+ <constraint sense="false">
+ <make>HP</make> <model>LaserJet 1020</model>
+ </constraint>
+ <constraint sense="false">
+ <make>HP</make> <model>LaserJet 1022</model>
+ </constraint>
+ </constraints>
+ </enum_val>
+ <enum_val id="ev/foo2zjs-ICM-user4">
+ <ev_longname> <en>File user4.icm</en> </ev_longname>
+ <!-- A multilingual <comments> block can appear here, too;
+ it should be treated as documentation for the user. -->
+ <ev_shortname> <en>user4</en> </ev_shortname>
+ <ev_driverval>-Guser4.icm</ev_driverval>
+ <constraints>
+ <constraint sense="false">
+ <make>HP</make> <model>LaserJet 1000</model>
+ </constraint>
+ <constraint sense="false">
+ <make>HP</make> <model>LaserJet 1005</model>
+ </constraint>
+ <constraint sense="false">
+ <make>HP</make> <model>LaserJet 1018</model>
+ </constraint>
+ <constraint sense="false">
+ <make>HP</make> <model>LaserJet 1020</model>
+ </constraint>
+ <constraint sense="false">
+ <make>HP</make> <model>LaserJet 1022</model>
+ </constraint>
+ </constraints>
+ </enum_val>
+ </enum_vals>
+</option>
diff --git a/foomatic-db/opt/foo2zjs-InputSlot.xml b/foomatic-db/opt/foo2zjs-InputSlot.xml
new file mode 100644
index 0000000..1accae9
--- /dev/null
+++ b/foomatic-db/opt/foo2zjs-InputSlot.xml
@@ -0,0 +1,195 @@
+<option type="enum" id="opt/foo2zjs-InputSlot">
+ <!-- A multilingual <comments> block can appear here, too;
+ it should be treated as documentation for the user. -->
+ <arg_longname> <en>Media Source</en> </arg_longname>
+ <arg_shortname> <en>InputSlot</en> </arg_shortname>
+ <arg_execution>
+ <arg_group>General</arg_group>
+ <arg_order>150</arg_order>
+ <arg_spot>A</arg_spot>
+ <arg_required />
+ <arg_substitution />
+ <arg_proto>-s%s </arg_proto>
+ </arg_execution>
+ <constraints>
+ <constraint sense="true">
+ <driver>foo2zjs</driver>
+ <arg_defval>ev/foo2zjs-InputSlot-7</arg_defval>
+ </constraint>
+ </constraints>
+ <enum_vals>
+ <enum_val id="ev/foo2zjs-InputSlot-1">
+ <ev_longname> <en>Upper or Only One InputSlot</en> </ev_longname>
+ <ev_shortname> <en>Upper</en> </ev_shortname>
+ <ev_driverval>1</ev_driverval>
+ <constraints>
+ <constraint sense="false">
+ <printer>Minolta-magicolor_2200_DL</printer>
+ </constraint>
+ <constraint sense="false">
+ <printer>Minolta-magicolor_2300_DL</printer>
+ </constraint>
+ <constraint sense="false">
+ <printer>Minolta-magicolor_2430_DL</printer>
+ </constraint>
+ <constraint sense="false">
+ <printer>Minolta-Color_PageWorks_Pro_L</printer>
+ </constraint>
+ </constraints>
+ </enum_val>
+ <enum_val id="ev/foo2zjs-InputSlot-1-2X00">
+ <ev_longname> <en>Multipurpose Tray</en> </ev_longname>
+ <ev_shortname> <en>Multipurpose</en> </ev_shortname>
+ <ev_driverval>1</ev_driverval>
+ <constraints>
+ <constraint sense="false">
+ <driver>foo2zjs</driver>
+ </constraint>
+ <constraint sense="true">
+ <printer>Minolta-magicolor_2200_DL</printer>
+ </constraint>
+ <constraint sense="true">
+ <printer>Minolta-magicolor_2300_DL</printer>
+ </constraint>
+ <constraint sense="true">
+ <printer>Minolta-magicolor_2430_DL</printer>
+ </constraint>
+ </constraints>
+ </enum_val>
+ <enum_val id="ev/foo2zjs-InputSlot-1-PageWorks">
+ <ev_longname> <en>Tray 1</en> </ev_longname>
+ <ev_shortname> <en>Tray1</en> </ev_shortname>
+ <ev_driverval>1</ev_driverval>
+ <constraints>
+ <constraint sense="false">
+ <driver>foo2zjs</driver>
+ </constraint>
+ <constraint sense="true">
+ <printer>Minolta-Color_PageWorks_Pro_L</printer>
+ </constraint>
+ </constraints>
+ </enum_val>
+ <enum_val id="ev/foo2zjs-InputSlot-2">
+ <ev_longname> <en>Lower Tray</en> </ev_longname>
+ <ev_shortname> <en>Lower</en> </ev_shortname>
+ <ev_driverval>2</ev_driverval>
+ <constraints>
+ <constraint sense="false">
+ <printer>Minolta-magicolor_2200_DL</printer>
+ </constraint>
+ <constraint sense="false">
+ <printer>Minolta-magicolor_2300_DL</printer>
+ </constraint>
+ <constraint sense="false">
+ <printer>Minolta-magicolor_2430_DL</printer>
+ </constraint>
+ <constraint sense="false">
+ <printer>Minolta-Color_PageWorks_Pro_L</printer>
+ </constraint>
+ </constraints>
+ </enum_val>
+ <enum_val id="ev/foo2zjs-InputSlot-2-2200">
+ <ev_longname> <en>Upper Tray</en> </ev_longname>
+ <ev_shortname> <en>Upper</en> </ev_shortname>
+ <ev_driverval>2</ev_driverval>
+ <constraints>
+ <constraint sense="false">
+ <driver>foo2zjs</driver>
+ </constraint>
+ <constraint sense="true">
+ <printer>Minolta-magicolor_2200_DL</printer>
+ </constraint>
+ </constraints>
+ </enum_val>
+ <enum_val id="ev/foo2zjs-InputSlot-3">
+ <ev_longname> <en>Middle Tray</en> </ev_longname>
+ <ev_shortname> <en>Middle</en> </ev_shortname>
+ <ev_driverval>3</ev_driverval>
+ <constraints>
+ <constraint sense="false">
+ <printer>Minolta-magicolor_2200_DL</printer>
+ </constraint>
+ <constraint sense="false">
+ <printer>Minolta-magicolor_2300_DL</printer>
+ </constraint>
+ <constraint sense="false">
+ <printer>Minolta-magicolor_2430_DL</printer>
+ </constraint>
+ <constraint sense="false">
+ <printer>Minolta-Color_PageWorks_Pro_L</printer>
+ </constraint>
+ </constraints>
+ </enum_val>
+ <enum_val id="ev/foo2zjs-InputSlot-3-2300">
+ <ev_longname> <en>Optional Lower Tray</en> </ev_longname>
+ <ev_shortname> <en>Lower</en> </ev_shortname>
+ <ev_driverval>3</ev_driverval>
+ <constraints>
+ <constraint sense="false">
+ <driver>foo2zjs</driver>
+ </constraint>
+ <constraint sense="true">
+ <printer>Minolta-magicolor_2300_DL</printer>
+ </constraint>
+ <constraint sense="true">
+ <printer>Minolta-magicolor_2430_DL</printer>
+ </constraint>
+ </constraints>
+ </enum_val>
+ <enum_val id="ev/foo2zjs-InputSlot-3-PageWorks">
+ <ev_longname> <en>Tray 2</en> </ev_longname>
+ <ev_shortname> <en>Tray2</en> </ev_shortname>
+ <ev_driverval>3</ev_driverval>
+ <constraints>
+ <constraint sense="false">
+ <driver>foo2zjs</driver>
+ </constraint>
+ <constraint sense="true">
+ <printer>Minolta-Color_PageWorks_Pro_L</printer>
+ </constraint>
+ </constraints>
+ </enum_val>
+ <enum_val id="ev/foo2zjs-InputSlot-4">
+ <ev_longname> <en>Manual Feed</en> </ev_longname>
+ <ev_shortname> <en>Manual</en> </ev_shortname>
+ <ev_driverval>4</ev_driverval>
+ </enum_val>
+ <enum_val id="ev/foo2zjs-InputSlot-5">
+ <ev_longname> <en>Envelope</en> </ev_longname>
+ <ev_shortname> <en>Envelope</en> </ev_shortname>
+ <ev_driverval>5</ev_driverval>
+ <constraints>
+ <constraint sense="false">
+ <printer>Minolta-magicolor_2200_DL</printer>
+ </constraint>
+ <constraint sense="false">
+ <printer>Minolta-magicolor_2300_DL</printer>
+ </constraint>
+ <constraint sense="false">
+ <printer>Minolta-magicolor_2430_DL</printer>
+ </constraint>
+ <constraint sense="false">
+ <printer>Minolta-Color_PageWorks_Pro_L</printer>
+ </constraint>
+ </constraints>
+ </enum_val>
+ <enum_val id="ev/foo2zjs-InputSlot-5-2200">
+ <ev_longname> <en>Optional Lower Tray</en> </ev_longname>
+ <ev_shortname> <en>Lower</en> </ev_shortname>
+ <ev_driverval>5</ev_driverval>
+ <constraints>
+ <constraint sense="false">
+ <driver>foo2zjs</driver>
+ </constraint>
+ <constraint sense="true">
+ <printer>Minolta-magicolor_2200_DL</printer>
+ </constraint>
+ </constraints>
+ </enum_val>
+ <enum_val id="ev/foo2zjs-InputSlot-7">
+ <ev_longname> <en>Auto Source</en> </ev_longname>
+ <ev_shortname> <en>Auto</en> </ev_shortname>
+ <ev_driverval>7</ev_driverval>
+ </enum_val>
+ </enum_vals>
+</option>
diff --git a/foomatic-db/opt/foo2zjs-Intent.xml b/foomatic-db/opt/foo2zjs-Intent.xml
new file mode 100644
index 0000000..b2e3973
--- /dev/null
+++ b/foomatic-db/opt/foo2zjs-Intent.xml
@@ -0,0 +1,57 @@
+<option type="enum" id="opt/foo2zjs-Intent">
+ <!-- A multilingual <comments> block can appear here, too;
+ it should be treated as documentation for the user. -->
+ <arg_longname> <en>ICM Color Profile Intent</en> </arg_longname>
+ <arg_shortname> <en>Intent</en> </arg_shortname>
+ <arg_execution>
+ <arg_group>Adjustment</arg_group>
+ <arg_order>310</arg_order>
+ <arg_spot>A</arg_spot>
+ <arg_required />
+ <arg_substitution />
+ <arg_proto>-I%s </arg_proto>
+ </arg_execution>
+ <constraints>
+ <constraint sense="true">
+ <driver>foo2zjs</driver>
+ <arg_defval>ev/foo2zjs-Intent-0</arg_defval>
+ </constraint>
+ <constraint sense="false">
+ <make>HP</make> <model>LaserJet 1000</model>
+ </constraint>
+ <constraint sense="false">
+ <make>HP</make> <model>LaserJet 1005</model>
+ </constraint>
+ <constraint sense="false">
+ <make>HP</make> <model>LaserJet 1018</model>
+ </constraint>
+ <constraint sense="false">
+ <make>HP</make> <model>LaserJet 1020</model>
+ </constraint>
+ <constraint sense="false">
+ <make>HP</make> <model>LaserJet 1022</model>
+ </constraint>
+ </constraints>
+ <enum_vals>
+ <enum_val id="ev/foo2zjs-Intent-0">
+ <ev_longname> <en>Perceptual Intent</en> </ev_longname>
+ <ev_shortname> <en>Perceptual</en> </ev_shortname>
+ <ev_driverval>0</ev_driverval>
+ </enum_val>
+ <enum_val id="ev/foo2zjs-Intent-2">
+ <ev_longname> <en>Colorimetric Intent</en> </ev_longname>
+ <ev_shortname> <en>Colorimetric</en> </ev_shortname>
+ <ev_driverval>1</ev_driverval>
+ </enum_val>
+ <enum_val id="ev/foo2zjs-Intent-3">
+ <ev_longname> <en>Saturation Intent</en> </ev_longname>
+ <ev_shortname> <en>Saturation</en> </ev_shortname>
+ <ev_driverval>2</ev_driverval>
+ </enum_val>
+ <enum_val id="ev/foo2zjs-Intent-4">
+ <ev_longname> <en>Absolute Intent</en> </ev_longname>
+ <ev_shortname> <en>Absolute</en> </ev_shortname>
+ <ev_driverval>3</ev_driverval>
+ </enum_val>
+ </enum_vals>
+</option>
diff --git a/foomatic-db/opt/foo2zjs-MediaType.xml b/foomatic-db/opt/foo2zjs-MediaType.xml
new file mode 100644
index 0000000..511eb4c
--- /dev/null
+++ b/foomatic-db/opt/foo2zjs-MediaType.xml
@@ -0,0 +1,57 @@
+<option type="enum" id="opt/foo2zjs-MediaType">
+ <!-- A multilingual <comments> block can appear here, too;
+ it should be treated as documentation for the user. -->
+ <arg_longname> <en>Media Type</en> </arg_longname>
+ <arg_shortname> <en>MediaType</en> </arg_shortname>
+ <arg_execution>
+ <arg_group>General</arg_group>
+ <arg_order>150</arg_order>
+ <arg_spot>A</arg_spot>
+ <arg_required />
+ <arg_substitution />
+ <arg_proto>-m%s </arg_proto>
+ </arg_execution>
+ <constraints>
+ <constraint sense="true">
+ <driver>foo2zjs</driver>
+ <arg_defval>ev/foo2zjs-MediaType-1</arg_defval>
+ </constraint>
+ </constraints>
+ <enum_vals>
+ <enum_val id="ev/foo2zjs-MediaType-1">
+ <ev_longname> <en>Standard Paper</en> </ev_longname>
+ <ev_shortname> <en>Standard</en> </ev_shortname>
+ <ev_driverval>1</ev_driverval>
+ </enum_val>
+ <enum_val id="ev/foo2zjs-MediaType-2">
+ <ev_longname> <en>Transparency</en> </ev_longname>
+ <ev_shortname> <en>Transparency</en> </ev_shortname>
+ <ev_driverval>2</ev_driverval>
+ </enum_val>
+ <enum_val id="ev/foo2zjs-MediaType-257">
+ <ev_longname> <en>Envelope</en> </ev_longname>
+ <ev_shortname> <en>Envelope</en> </ev_shortname>
+ <ev_driverval>257</ev_driverval>
+ </enum_val>
+ <enum_val id="ev/foo2zjs-MediaType-259">
+ <ev_longname> <en>Letterhead</en> </ev_longname>
+ <ev_shortname> <en>Letterhead</en> </ev_shortname>
+ <ev_driverval>259</ev_driverval>
+ </enum_val>
+ <enum_val id="ev/foo2zjs-MediaType-261">
+ <ev_longname> <en>Thick Stock</en> </ev_longname>
+ <ev_shortname> <en>ThickStock</en> </ev_shortname>
+ <ev_driverval>261</ev_driverval>
+ </enum_val>
+ <enum_val id="ev/foo2zjs-MediaType-262">
+ <ev_longname> <en>Postcard</en> </ev_longname>
+ <ev_shortname> <en>Postcard</en> </ev_shortname>
+ <ev_driverval>262</ev_driverval>
+ </enum_val>
+ <enum_val id="ev/foo2zjs-MediaType-263">
+ <ev_longname> <en>Labels</en> </ev_longname>
+ <ev_shortname> <en>Labels</en> </ev_shortname>
+ <ev_driverval>263</ev_driverval>
+ </enum_val>
+ </enum_vals>
+</option>
diff --git a/foomatic-db/opt/foo2zjs-Nup.xml b/foomatic-db/opt/foo2zjs-Nup.xml
new file mode 100644
index 0000000..1c720ec
--- /dev/null
+++ b/foomatic-db/opt/foo2zjs-Nup.xml
@@ -0,0 +1,100 @@
+<option type="enum" id="opt/foo2oakzjs-Nup">
+ <!-- A multilingual <comments> block can appear here, too;
+ it should be treated as documentation for the user. -->
+ <arg_longname> <en>N-up Printing</en> </arg_longname>
+ <arg_shortname> <en>Nup</en> </arg_shortname>
+ <arg_execution>
+ <arg_group>Miscellaneous</arg_group>
+ <arg_order>200</arg_order>
+ <arg_spot>A</arg_spot>
+ <arg_required />
+ <arg_substitution />
+ <arg_proto>%s </arg_proto>
+ </arg_execution>
+ <constraints>
+ <constraint sense="true">
+ <driver>foo2zjs</driver>
+ <arg_defval>ev/foo2oakzjs-Nup-1</arg_defval>
+ </constraint>
+ <constraint sense="true">
+ <driver>foo2oak</driver>
+ <arg_defval>ev/foo2oakzjs-Nup-1</arg_defval>
+ </constraint>
+ <constraint sense="true">
+ <driver>foo2hp</driver>
+ <arg_defval>ev/foo2oakzjs-Nup-1</arg_defval>
+ </constraint>
+ <constraint sense="true">
+ <driver>foo2xqx</driver>
+ <arg_defval>ev/foo2oakzjs-Nup-1</arg_defval>
+ </constraint>
+ <constraint sense="true">
+ <driver>foo2lava</driver>
+ <arg_defval>ev/foo2oakzjs-Nup-1</arg_defval>
+ </constraint>
+ </constraints>
+ <enum_vals>
+ <enum_val id="ev/foo2oakzjs-Nup-1">
+ <ev_longname> <en>1-up</en> </ev_longname>
+ <!-- A multilingual <comments> block can appear here, too;
+ it should be treated as documentation for the user. -->
+ <ev_shortname> <en>1up</en> </ev_shortname>
+ <ev_driverval></ev_driverval>
+ </enum_val>
+ <enum_val id="ev/foo2oakzjs-Nup-2">
+ <ev_longname> <en>2-up</en> </ev_longname>
+ <ev_shortname> <en>2up</en> </ev_shortname>
+ <ev_driverval>-2</ev_driverval>
+ </enum_val>
+ <enum_val id="ev/foo2oakzjs-Nup-3">
+ <ev_longname> <en>3-up</en> </ev_longname>
+ <ev_shortname> <en>3up</en> </ev_shortname>
+ <ev_driverval>-3</ev_driverval>
+ </enum_val>
+ <enum_val id="ev/foo2oakzjs-Nup-4">
+ <ev_longname> <en>4-up</en> </ev_longname>
+ <ev_shortname> <en>4up</en> </ev_shortname>
+ <ev_driverval>-4</ev_driverval>
+ </enum_val>
+ <enum_val id="ev/foo2oakzjs-Nup-6">
+ <ev_longname> <en>6-up</en> </ev_longname>
+ <ev_shortname> <en>6up</en> </ev_shortname>
+ <ev_driverval>-6</ev_driverval>
+ </enum_val>
+ <enum_val id="ev/foo2oakzjs-Nup-8">
+ <ev_longname> <en>8-up</en> </ev_longname>
+ <ev_shortname> <en>8up</en> </ev_shortname>
+ <ev_driverval>-8</ev_driverval>
+ </enum_val>
+ <enum_val id="ev/foo2oakzjs-Nup-10">
+ <ev_longname> <en>10-up</en> </ev_longname>
+ <ev_shortname> <en>10up</en> </ev_shortname>
+ <ev_driverval>-10</ev_driverval>
+ </enum_val>
+ <enum_val id="ev/foo2oakzjs-Nup-12">
+ <ev_longname> <en>12-up</en> </ev_longname>
+ <ev_shortname> <en>12up</en> </ev_shortname>
+ <ev_driverval>-12</ev_driverval>
+ </enum_val>
+ <enum_val id="ev/foo2oakzjs-Nup-14">
+ <ev_longname> <en>14-up</en> </ev_longname>
+ <ev_shortname> <en>14up</en> </ev_shortname>
+ <ev_driverval>-14</ev_driverval>
+ </enum_val>
+ <enum_val id="ev/foo2oakzjs-Nup-15">
+ <ev_longname> <en>15-up</en> </ev_longname>
+ <ev_shortname> <en>15up</en> </ev_shortname>
+ <ev_driverval>-15</ev_driverval>
+ </enum_val>
+ <enum_val id="ev/foo2oakzjs-Nup-16">
+ <ev_longname> <en>16-up</en> </ev_longname>
+ <ev_shortname> <en>16up</en> </ev_shortname>
+ <ev_driverval>-16</ev_driverval>
+ </enum_val>
+ <enum_val id="ev/foo2oakzjs-Nup-18">
+ <ev_longname> <en>18-up</en> </ev_longname>
+ <ev_shortname> <en>18up</en> </ev_shortname>
+ <ev_driverval>-18</ev_driverval>
+ </enum_val>
+ </enum_vals>
+</option>
diff --git a/foomatic-db/opt/foo2zjs-NupOrient.xml b/foomatic-db/opt/foo2zjs-NupOrient.xml
new file mode 100644
index 0000000..7b99d56
--- /dev/null
+++ b/foomatic-db/opt/foo2zjs-NupOrient.xml
@@ -0,0 +1,59 @@
+<option type="enum" id="opt/foo2oakzjs-NupOrient">
+ <!-- A multilingual <comments> block can appear here, too;
+ it should be treated as documentation for the user. -->
+ <arg_longname> <en>N-up Orientation</en> </arg_longname>
+ <arg_shortname> <en>NupOrient</en> </arg_shortname>
+ <arg_execution>
+ <arg_group>Miscellaneous</arg_group>
+ <arg_order>200</arg_order>
+ <arg_spot>A</arg_spot>
+ <arg_required />
+ <arg_substitution />
+ <arg_proto>%s </arg_proto>
+ </arg_execution>
+ <constraints>
+ <constraint sense="true">
+ <driver>foo2zjs</driver>
+ <arg_defval>ev/foo2oakzjs-NupOrient-port</arg_defval>
+ </constraint>
+ <constraint sense="true">
+ <driver>foo2oak</driver>
+ <arg_defval>ev/foo2oakzjs-NupOrient-port</arg_defval>
+ </constraint>
+ <constraint sense="true">
+ <driver>foo2hp</driver>
+ <arg_defval>ev/foo2oakzjs-NupOrient-port</arg_defval>
+ </constraint>
+ <constraint sense="true">
+ <driver>foo2xqx</driver>
+ <arg_defval>ev/foo2oakzjs-NupOrient-port</arg_defval>
+ </constraint>
+ <constraint sense="true">
+ <driver>foo2lava</driver>
+ <arg_defval>ev/foo2oakzjs-NupOrient-port</arg_defval>
+ </constraint>
+ </constraints>
+ <enum_vals>
+ <enum_val id="ev/foo2oakzjs-NupOrient-port">
+ <ev_longname> <en>Portrait</en> </ev_longname>
+ <!-- A multilingual <comments> block can appear here, too;
+ it should be treated as documentation for the user. -->
+ <ev_shortname> <en>port</en> </ev_shortname>
+ <ev_driverval></ev_driverval>
+ </enum_val>
+ <enum_val id="ev/foo2oakzjs-NupOrient-land">
+ <ev_longname> <en>Landscape</en> </ev_longname>
+ <!-- A multilingual <comments> block can appear here, too;
+ it should be treated as documentation for the user. -->
+ <ev_shortname> <en>land</en> </ev_shortname>
+ <ev_driverval>-ol</ev_driverval>
+ </enum_val>
+ <enum_val id="ev/foo2oakzjs-NupOrient-sea">
+ <ev_longname> <en>Seascape</en> </ev_longname>
+ <!-- A multilingual <comments> block can appear here, too;
+ it should be treated as documentation for the user. -->
+ <ev_shortname> <en>sea</en> </ev_shortname>
+ <ev_driverval>-os</ev_driverval>
+ </enum_val>
+ </enum_vals>
+</option>
diff --git a/foomatic-db/opt/foo2zjs-PageSize.xml b/foomatic-db/opt/foo2zjs-PageSize.xml
new file mode 100644
index 0000000..d6b8546
--- /dev/null
+++ b/foomatic-db/opt/foo2zjs-PageSize.xml
@@ -0,0 +1,89 @@
+<option type="enum" id="opt/foo2oakzjs-PageSize">
+ <!-- A multilingual <comments> block can appear here, too;
+ it should be treated as documentation for the user. -->
+ <arg_longname> <en>Page Size</en> </arg_longname>
+ <arg_shortname> <en>PageSize</en> </arg_shortname>
+ <arg_execution>
+ <arg_group>General</arg_group>
+ <arg_order>135</arg_order>
+ <arg_spot>A</arg_spot>
+ <arg_required />
+ <arg_substitution />
+ <arg_proto>-p%s </arg_proto>
+ </arg_execution>
+ <constraints>
+ <constraint sense="true">
+ <driver>foo2zjs</driver>
+ <arg_defval>ev/foo2oakzjs-PageSize-1</arg_defval>
+ </constraint>
+ <constraint sense="true">
+ <driver>foo2oak</driver>
+ <arg_defval>ev/foo2oakzjs-PageSize-1</arg_defval>
+ </constraint>
+ <constraint sense="true">
+ <driver>foo2hp</driver>
+ <arg_defval>ev/foo2oakzjs-PageSize-1</arg_defval>
+ </constraint>
+ <constraint sense="true">
+ <driver>foo2xqx</driver>
+ <arg_defval>ev/foo2oakzjs-PageSize-1</arg_defval>
+ </constraint>
+ </constraints>
+ <enum_vals>
+ <enum_val id="ev/foo2oakzjs-PageSize-1">
+ <ev_longname> <en>Letter</en> </ev_longname>
+ <ev_shortname> <en>Letter</en> </ev_shortname>
+ <ev_driverval>1</ev_driverval>
+ </enum_val>
+ <enum_val id="ev/foo2oakzjs-PageSize-5">
+ <ev_longname> <en>Legal</en> </ev_longname>
+ <ev_shortname> <en>Legal</en> </ev_shortname>
+ <ev_driverval>5</ev_driverval>
+ </enum_val>
+ <enum_val id="ev/foo2oakzjs-PageSize-7">
+ <ev_longname> <en>Executive</en> </ev_longname>
+ <ev_shortname> <en>Executive</en> </ev_shortname>
+ <ev_driverval>7</ev_driverval>
+ </enum_val>
+ <enum_val id="ev/foo2oakzjs-PageSize-9">
+ <ev_longname> <en>A4</en> </ev_longname>
+ <ev_shortname> <en>A4</en> </ev_shortname>
+ <ev_driverval>9</ev_driverval>
+ </enum_val>
+ <enum_val id="ev/foo2oakzjs-PageSize-11">
+ <ev_longname> <en>A5</en> </ev_longname>
+ <ev_shortname> <en>A5</en> </ev_shortname>
+ <ev_driverval>11</ev_driverval>
+ </enum_val>
+ <enum_val id="ev/foo2oakzjs-PageSize-13">
+ <ev_longname> <en>B5</en> </ev_longname>
+ <ev_shortname> <en>B5</en> </ev_shortname>
+ <ev_driverval>13</ev_driverval>
+ </enum_val>
+ <enum_val id="ev/foo2oakzjs-PageSize-20">
+ <ev_longname> <en>Env #10</en> </ev_longname>
+ <ev_shortname> <en>Env10</en> </ev_shortname>
+ <ev_driverval>20</ev_driverval>
+ </enum_val>
+ <enum_val id="ev/foo2oakzjs-PageSize-27">
+ <ev_longname> <en>Env DL</en> </ev_longname>
+ <ev_shortname> <en>EnvDL</en> </ev_shortname>
+ <ev_driverval>27</ev_driverval>
+ </enum_val>
+ <enum_val id="ev/foo2oakzjs-PageSize-28">
+ <ev_longname> <en>Env C5</en> </ev_longname>
+ <ev_shortname> <en>EnvC5</en> </ev_shortname>
+ <ev_driverval>28</ev_driverval>
+ </enum_val>
+ <enum_val id="ev/foo2oakzjs-PageSize-34">
+ <ev_longname> <en>Env B5</en> </ev_longname>
+ <ev_shortname> <en>EnvB5</en> </ev_shortname>
+ <ev_driverval>34</ev_driverval>
+ </enum_val>
+ <enum_val id="ev/foo2oakzjs-PageSize-37">
+ <ev_longname> <en>Env Monarch</en> </ev_longname>
+ <ev_shortname> <en>EnvMonarch</en> </ev_shortname>
+ <ev_driverval>37</ev_driverval>
+ </enum_val>
+ </enum_vals>
+</option>
diff --git a/foomatic-db/opt/foo2zjs-PrinterType.xml b/foomatic-db/opt/foo2zjs-PrinterType.xml
new file mode 100644
index 0000000..17731cc
--- /dev/null
+++ b/foomatic-db/opt/foo2zjs-PrinterType.xml
@@ -0,0 +1,148 @@
+<option type="enum" id="opt/foo2zjs-PrinterType">
+ <!-- A multilingual <comments> block can appear here, too;
+ it should be treated as documentation for the user. -->
+ <arg_longname> <en>Printer Type</en> </arg_longname>
+ <arg_shortname> <en>PrinterType</en> </arg_shortname>
+ <arg_execution>
+ <arg_group>General</arg_group>
+ <arg_order>110</arg_order>
+ <arg_spot>A</arg_spot>
+ <arg_required />
+ <arg_substitution />
+ <arg_proto>%s </arg_proto>
+ </arg_execution>
+ <constraints>
+ <constraint sense="true">
+ <driver>foo2zjs</driver>
+ <arg_defval>ev/foo2zjs-PrinterType-Color</arg_defval>
+ </constraint>
+ <constraint sense="true">
+ <make>HP</make>
+ <model>LaserJet 1000</model>
+ <driver>foo2zjs</driver>
+ <arg_defval>ev/foo2zjs-PrinterType-BW</arg_defval>
+ </constraint>
+ <constraint sense="true">
+ <make>HP</make>
+ <model>LaserJet 1005</model>
+ <driver>foo2zjs</driver>
+ <arg_defval>ev/foo2zjs-PrinterType-BW</arg_defval>
+ </constraint>
+ <constraint sense="true">
+ <make>HP</make>
+ <model>LaserJet 1018</model>
+ <driver>foo2zjs</driver>
+ <arg_defval>ev/foo2zjs-PrinterType-BW-z1</arg_defval>
+ </constraint>
+ <constraint sense="true">
+ <make>HP</make>
+ <model>LaserJet 1020</model>
+ <driver>foo2zjs</driver>
+ <arg_defval>ev/foo2zjs-PrinterType-BW-z1</arg_defval>
+ </constraint>
+ <constraint sense="true">
+ <make>HP</make>
+ <model>LaserJet 1022</model>
+ <driver>foo2zjs</driver>
+ <arg_defval>ev/foo2zjs-PrinterType-BW-z1</arg_defval>
+ </constraint>
+ </constraints>
+ <enum_vals>
+ <enum_val id="ev/foo2zjs-PrinterType-BW">
+ <ev_longname> <en>Black-and-white printer</en> </ev_longname>
+ <!-- A multilingual <comments> block can appear here, too;
+ it should be treated as documentation for the user. -->
+ <ev_shortname> <en>BW</en> </ev_shortname>
+ <ev_driverval>-P</ev_driverval>
+ <constraints>
+ <constraint sense="false">
+ <driver>foo2zjs</driver>
+ </constraint>
+ <constraint sense="true">
+ <driver>foo2zjs</driver>
+ <make>HP</make>
+ <model>LaserJet 1000</model>
+ </constraint>
+ <constraint sense="true">
+ <driver>foo2zjs</driver>
+ <make>HP</make>
+ <model>LaserJet 1005</model>
+ </constraint>
+ <constraint sense="true">
+ <driver>foo2zjs</driver>
+ <make>Generic</make>
+ <model>GDI Printer</model>
+ </constraint>
+ <constraint sense="true">
+ <driver>foo2zjs</driver>
+ <make>Generic</make>
+ <model>ZjStream Printer</model>
+ </constraint>
+ </constraints>
+ </enum_val>
+ <enum_val id="ev/foo2zjs-PrinterType-BW-z1">
+ <ev_longname> <en>Black-and-white printer</en> </ev_longname>
+ <!-- A multilingual <comments> block can appear here, too;
+ it should be treated as documentation for the user. -->
+ <ev_shortname> <en>BWz1</en> </ev_shortname>
+ <ev_driverval>-P -z1 -L0</ev_driverval>
+ <constraints>
+ <constraint sense="false">
+ <driver>foo2zjs</driver>
+ </constraint>
+ <constraint sense="true">
+ <driver>foo2zjs</driver>
+ <make>HP</make>
+ <model>LaserJet 1018</model>
+ </constraint>
+ <constraint sense="true">
+ <driver>foo2zjs</driver>
+ <make>HP</make>
+ <model>LaserJet 1020</model>
+ </constraint>
+ <constraint sense="true">
+ <driver>foo2zjs</driver>
+ <make>HP</make>
+ <model>LaserJet 1022</model>
+ </constraint>
+ </constraints>
+ </enum_val>
+ <enum_val id="ev/foo2zjs-PrinterType-Color">
+ <ev_longname> <en>Color printer</en> </ev_longname>
+ <!-- A multilingual <comments> block can appear here, too;
+ it should be treated as documentation for the user. -->
+ <ev_shortname> <en>Color</en> </ev_shortname>
+ <ev_driverval></ev_driverval>
+ <constraints>
+ <constraint sense="false">
+ <driver>foo2zjs</driver>
+ </constraint>
+ <constraint sense="true">
+ <driver>foo2zjs</driver>
+ <make>Minolta</make>
+ <model>magicolor 2200 DL</model>
+ </constraint>
+ <constraint sense="true">
+ <driver>foo2zjs</driver>
+ <make>Minolta</make>
+ <model>magicolor 2300 DL</model>
+ </constraint>
+ <constraint sense="true">
+ <driver>foo2zjs</driver>
+ <make>Minolta</make>
+ <model>magicolor 2430 DL</model>
+ </constraint>
+ <constraint sense="true">
+ <driver>foo2zjs</driver>
+ <make>Generic</make>
+ <model>GDI Printer</model>
+ </constraint>
+ <constraint sense="true">
+ <driver>foo2zjs</driver>
+ <make>Generic</make>
+ <model>ZjStream Printer</model>
+ </constraint>
+ </constraints>
+ </enum_val>
+ </enum_vals>
+</option>
diff --git a/foomatic-db/opt/foo2zjs-Quality.xml b/foomatic-db/opt/foo2zjs-Quality.xml
new file mode 100644
index 0000000..9c32a4f
--- /dev/null
+++ b/foomatic-db/opt/foo2zjs-Quality.xml
@@ -0,0 +1,32 @@
+<option type="enum" id="opt/foo2zjs-Quality">
+ <!-- A multilingual <comments> block can appear here, too;
+ it should be treated as documentation for the user. -->
+ <arg_longname> <en>Printing Quality</en> </arg_longname>
+ <arg_shortname> <en>Quality</en> </arg_shortname>
+ <arg_execution>
+ <arg_group>General</arg_group>
+ <arg_order>110</arg_order>
+ <arg_spot>A</arg_spot>
+ <arg_required />
+ <arg_substitution />
+ <arg_proto> %s </arg_proto>
+ </arg_execution>
+ <constraints>
+ <constraint sense="true">
+ <driver>foo2zjs</driver>
+ <arg_defval>ev/foo2zjs-Quality-Normal</arg_defval>
+ </constraint>
+ </constraints>
+ <enum_vals>
+ <enum_val id="ev/foo2zjs-Quality-Normal">
+ <ev_longname> <en>Normal</en> </ev_longname>
+ <ev_shortname> <en>normal</en> </ev_shortname>
+ <ev_driverval></ev_driverval>
+ </enum_val>
+ <enum_val id="ev/foo2zjs-Quality-Draft">
+ <ev_longname> <en>Draft</en> </ev_longname>
+ <ev_shortname> <en>draft</en> </ev_shortname>
+ <ev_driverval>-t </ev_driverval>
+ </enum_val>
+ </enum_vals>
+</option>
diff --git a/foomatic-db/opt/foo2zjs-Resolution.xml b/foomatic-db/opt/foo2zjs-Resolution.xml
new file mode 100644
index 0000000..e39b062
--- /dev/null
+++ b/foomatic-db/opt/foo2zjs-Resolution.xml
@@ -0,0 +1,91 @@
+<option type="enum" id="opt/foo2zjs-Resolution">
+ <!-- A multilingual <comments> block can appear here, too;
+ it should be treated as documentation for the user. -->
+ <arg_longname> <en>Resolution</en> </arg_longname>
+ <arg_shortname> <en>Resolution</en> </arg_shortname>
+ <arg_execution>
+ <arg_group>General</arg_group>
+ <arg_order>130</arg_order>
+ <arg_spot>A</arg_spot>
+ <arg_required />
+ <arg_substitution />
+ <arg_proto>-r%s </arg_proto>
+ </arg_execution>
+ <constraints>
+ <constraint sense="true">
+ <driver>foo2zjs</driver>
+ <arg_defval>ev/foo2zjs-Resolution-1200x600</arg_defval>
+ </constraint>
+ <constraint sense="true">
+ <make>HP</make>
+ <model>LaserJet 1000</model>
+ <driver>foo2zjs</driver>
+ <arg_defval>ev/foo2zjs-Resolution-600x600</arg_defval>
+ </constraint>
+ <constraint sense="true">
+ <make>HP</make>
+ <model>LaserJet 1005</model>
+ <driver>foo2zjs</driver>
+ <arg_defval>ev/foo2zjs-Resolution-600x600</arg_defval>
+ </constraint>
+ </constraints>
+ <enum_vals>
+ <enum_val id="ev/foo2zjs-Resolution-600x600">
+ <ev_longname> <en>600x600 dpi</en> </ev_longname>
+ <!-- A multilingual <comments> block can appear here, too;
+ it should be treated as documentation for the user. -->
+ <ev_shortname> <en>600x600dpi</en> </ev_shortname>
+ <ev_driverval>600x600</ev_driverval>
+ </enum_val>
+ <enum_val id="ev/foo2zjs-Resolution-1200x600">
+ <ev_longname> <en>1200x600 dpi</en> </ev_longname>
+ <!-- A multilingual <comments> block can appear here, too;
+ it should be treated as documentation for the user. -->
+ <ev_shortname> <en>1200x600dpi</en> </ev_shortname>
+ <ev_driverval>1200x600</ev_driverval>
+ <constraints>
+ <constraint sense="false">
+ <make>HP</make>
+ <model>LaserJet 1000</model>
+ </constraint>
+ <constraint sense="false">
+ <make>HP</make>
+ <model>LaserJet 1005</model>
+ </constraint>
+ </constraints>
+ </enum_val>
+ <enum_val id="ev/foo2zjs-Resolution-2400x600">
+ <ev_longname> <en>2400x600 dpi</en> </ev_longname>
+ <!-- A multilingual <comments> block can appear here, too;
+ it should be treated as documentation for the user. -->
+ <ev_shortname> <en>2400x600dpi</en> </ev_shortname>
+ <ev_driverval>2400x600</ev_driverval>
+ <constraints>
+ <constraint sense="false">
+ <make>HP</make>
+ <model>LaserJet 1000</model>
+ </constraint>
+ <constraint sense="false">
+ <make>HP</make>
+ <model>LaserJet 1005</model>
+ </constraint>
+ <constraint sense="false">
+ <make>HP</make>
+ <model>LaserJet 1018</model>
+ </constraint>
+ <constraint sense="false">
+ <make>HP</make>
+ <model>LaserJet 1020</model>
+ </constraint>
+ <constraint sense="false">
+ <make>HP</make>
+ <model>LaserJet 1022</model>
+ </constraint>
+ <constraint sense="false">
+ <make>Minolta</make>
+ <model>magicolor 2200 DL</model>
+ </constraint>
+ </constraints>
+ </enum_val>
+ </enum_vals>
+</option>
diff --git a/foomatic-db/printer/Generic-OAKT_Printer.xml b/foomatic-db/printer/Generic-OAKT_Printer.xml
new file mode 100644
index 0000000..da20df2
--- /dev/null
+++ b/foomatic-db/printer/Generic-OAKT_Printer.xml
@@ -0,0 +1,55 @@
+<printer id="printer/Generic-OAKT_Printer">
+ <make>Generic</make>
+ <model>OAKT Printer</model>
+ <mechanism>
+ <!-- laser/ -->
+ <color/>
+ <resolution>
+ <dpi>
+ <x></x>
+ <y></y>
+ </dpi>
+ </resolution>
+ <consumables>
+ <comments>
+ <en></en>
+ </comments>
+ <!--one or more "partno" elements.--></consumables>
+ </mechanism>
+ <url></url>
+ <lang>
+ <proprietary />
+ </lang>
+ <autodetect>
+ <!--no known parport probe information--></autodetect>
+ <functionality>D</functionality>
+ <driver>foo2oak</driver><!--verified--><!--no "contrib_url"-->
+ <comments>
+ <en>
+
+ OAKT printers understand a simple printer language that uses JBIG
+ compression to send a bitmap (raster) image of the printed page to the
+ printer. This printer language was designed by Oak Technology (now Zoran)
+ and is licensed by (at least) HP for the Color LaserJet 1500. The printer
+ language is highly efficient, but requires the host computer to render
+ characters, halftones, etc.
+
+ If you have a Windows driver for your printer and the "About" panel
+ for the driver lists Copyright Oak Technology or Zoran, then you may have
+ a printer that understands the OAKT language. If you print to a file
+ and the first four characters of the file are "OAKT", then you have
+ a printer that understands the OAKT language.
+
+ There doesn't seem to be an official name for this language. Oak
+ Technology calls it simply "Raster Driver". That name is not specific
+ enough, so we have named it "OAKT", which are the first 4 characters
+ found in the printer stream.
+
+ There exists a development stage decoder and a printer driver for
+ this language. However, it is untested and unreleased. If someone
+ is willing to donate a HP Laserjet 1500 printer and fund the development
+ of the driver, please contact rickr@mn.rr.com.
+
+ </en>
+ </comments>
+</printer>
diff --git a/foomatic-db/printer/Generic-ZjStream_Printer.xml b/foomatic-db/printer/Generic-ZjStream_Printer.xml
new file mode 100644
index 0000000..0752d05
--- /dev/null
+++ b/foomatic-db/printer/Generic-ZjStream_Printer.xml
@@ -0,0 +1,46 @@
+<printer id="printer/Generic-ZjStream_Printer">
+ <make>Generic</make>
+ <model>ZjStream Printer</model>
+ <mechanism>
+ <!-- laser/ -->
+ <color/>
+ <resolution>
+ <dpi>
+ <x></x>
+ <y></y>
+ </dpi>
+ </resolution>
+ <consumables>
+ <comments>
+ <en></en>
+ </comments>
+ <!--one or more "partno" elements.--></consumables>
+ </mechanism>
+ <url></url>
+ <lang>
+ <proprietary />
+ </lang>
+ <autodetect>
+ <!--no known parport probe information--></autodetect>
+ <functionality>D</functionality>
+ <driver>foo2zjs</driver><!--verified--><!--no "contrib_url"-->
+ <comments>
+ <en>
+
+ ZjStream printers understand a simple printer language that uses JBIG
+ compression to send a bitmap (raster) image of the printed page to
+ the printer. This printer language was designed by Zenographics and
+ licensed by most major printer manufacturers for at least some of
+ their product line. The printer language is highly efficient, but
+ requires the host computer to render characters, halftones, etc.
+
+ If you have a Windows driver for your printer and the "About" panel
+ for the driver lists Copyright Zenographics, then you probably have a
+ printer that understands the ZjStream language.
+
+ The &quot;foo2zjs&quot; driver in combination with Ghostscript might
+ possibly be made to work with these kinds of printers.
+
+ </en>
+ </comments>
+</printer>
diff --git a/foomatic-db/printer/HP-Color_LaserJet_1500.xml b/foomatic-db/printer/HP-Color_LaserJet_1500.xml
new file mode 100644
index 0000000..5f0501f
--- /dev/null
+++ b/foomatic-db/printer/HP-Color_LaserJet_1500.xml
@@ -0,0 +1,63 @@
+<printer id="printer/HP-Color_LaserJet_1500">
+ <make>HP</make>
+ <model>Color LaserJet 1500</model>
+ <mechanism>
+ <laser/>
+ <color/>
+ <resolution>
+ <dpi>
+ <x>600</x>
+ <y>600</y>
+ </dpi>
+ </resolution>
+ <margins>
+ <general>
+ <unit>inch</unit>
+ <top>0.166666</top>
+ <bottom>0.166666</bottom>
+ <left>0.166666</left>
+ <right>0.166666</right>
+ </general>
+ </margins>
+ <consumables>
+ <comments> <en>
+ Toner Black (5000 prints) - $70
+ Toner Cyan (4000 prints) - $90
+ Toner Magenta (4000 prints) - $90
+ Toner Yellow (4000 prints) - $90
+ Imaging Drum (20000 prints) - $160
+ </en> </comments>
+ <partno>C9700A</partno>
+ <partno>C9701A</partno>
+ <partno>C9703A</partno>
+ <partno>C9702A</partno>
+ <partno>C9704A</partno>
+ </consumables>
+ </mechanism>
+ <url>http://www.hp-expo.com/uk/eng/products/laserjet/q2489a.html</url>
+ <lang>
+ <proprietary/>
+ <!--no pjl--><!--No "text"?-->
+ </lang>
+ <autodetect>
+ <parallel>
+ <ieee1284>CLS:PRINTER;MDL:hp color LaserJet 1500;MFG:Hewlett-Packard;CMD:OAKRAS;</ieee1284>
+ <manufacturer>Hewlett-Packard</manufacturer>
+ <model>hp color LaserJet 1500</model>
+ <commandset>OAKRAS</commandset>
+ </parallel>
+ </autodetect>
+ <functionality>C</functionality>
+ <driver>foo2oak</driver>
+ <!--not "unverified"--><!--no "contrib_url"-->
+ <comments> <en>
+
+ The Color LaserJet 1500 is a USB laser printer with a 2003 street
+ price of $600-$800 USD. This printer is supported by the foo2oak
+ printer driver.
+
+ The Color LaserJet 1500L comes with a multi-purpose tray only,
+ the Color LaserJet 1500 comes with an additional 250-sheet tray.
+
+ </en> </comments>
+</printer>
diff --git a/foomatic-db/printer/HP-Color_LaserJet_1600.xml b/foomatic-db/printer/HP-Color_LaserJet_1600.xml
new file mode 100644
index 0000000..2fc7ae9
--- /dev/null
+++ b/foomatic-db/printer/HP-Color_LaserJet_1600.xml
@@ -0,0 +1,58 @@
+<printer id="printer/HP-Color_LaserJet_1600">
+ <make>HP</make>
+ <model>Color LaserJet 1600</model>
+ <mechanism>
+ <laser/>
+ <color/>
+ <resolution>
+ <dpi>
+ <x>600</x>
+ <y>600</y>
+ </dpi>
+ </resolution>
+ <margins>
+ <general>
+ <unit>inch</unit>
+ <top>0.166666</top>
+ <bottom>0.166666</bottom>
+ <left>0.166666</left>
+ <right>0.166666</right>
+ </general>
+ </margins>
+ <consumables>
+ <comments> <en>
+ Q6000A HP Color LaserJet black print cartridge [Add $75.00]
+ Q6001A HP Color LaserJet cyan print cartridge [Add $82.00]
+ Q6002A HP Color LaserJet yellow print cartridge [Add $82.00]
+ Q6003A HP Color LaserJet magenta print cartridge [Add $82.00]
+ </en> </comments>
+ <partno>Q6000A</partno>
+ <partno>Q6001A</partno>
+ <partno>Q6002A</partno>
+ <partno>Q6003A</partno>
+ </consumables>
+ </mechanism>
+ <url>http://h50025.www5.hp.com/hpcom/au_en/10_25_102_4870summary.html</url>
+ <lang>
+ <proprietary/>
+ <!--no pjl--><!--No "text"?-->
+ </lang>
+ <autodetect>
+ <parallel>
+ <ieee1284>MFG:Hewlett-Packard;MDL:HP Color LaserJet 1600;CMD:ACL;CLS:PRINTER;DES:HP Color LaserJet 1600;</ieee1284>
+ <manufacturer>Hewlett-Packard</manufacturer>
+ <model>HP Color LaserJet 1600</model>
+ <commandset>ACL</commandset>
+ </parallel>
+ </autodetect>
+ <functionality>C</functionality>
+ <driver>foo2hp</driver>
+ <!--not "unverified"--><!--no "contrib_url"-->
+ <comments> <en>
+
+ The Color LaserJet 1600 is color laser printer with a 2005 street
+ price of $360 USD. This printer is supported by the foo2hp
+ printer driver.
+
+ </en> </comments>
+</printer>
diff --git a/foomatic-db/printer/HP-Color_LaserJet_2600n.xml b/foomatic-db/printer/HP-Color_LaserJet_2600n.xml
new file mode 100644
index 0000000..d224fc3
--- /dev/null
+++ b/foomatic-db/printer/HP-Color_LaserJet_2600n.xml
@@ -0,0 +1,58 @@
+<printer id="printer/HP-Color_LaserJet_2600n">
+ <make>HP</make>
+ <model>Color LaserJet 2600n</model>
+ <mechanism>
+ <laser/>
+ <color/>
+ <resolution>
+ <dpi>
+ <x>600</x>
+ <y>600</y>
+ </dpi>
+ </resolution>
+ <margins>
+ <general>
+ <unit>inch</unit>
+ <top>0.166666</top>
+ <bottom>0.166666</bottom>
+ <left>0.166666</left>
+ <right>0.166666</right>
+ </general>
+ </margins>
+ <consumables>
+ <comments> <en>
+ Q6000A HP Color LaserJet black print cartridge [Add $75.00]
+ Q6001A HP Color LaserJet cyan print cartridge [Add $82.00]
+ Q6002A HP Color LaserJet yellow print cartridge [Add $82.00]
+ Q6003A HP Color LaserJet magenta print cartridge [Add $82.00]
+ </en> </comments>
+ <partno>Q6000A</partno>
+ <partno>Q6001A</partno>
+ <partno>Q6002A</partno>
+ <partno>Q6003A</partno>
+ </consumables>
+ </mechanism>
+ <url>http://h10010.www1.hp.com/wwpc/us/en/sm/WF05a/18972-236251-236268-15077-f51-446153.html</url>
+ <lang>
+ <proprietary/>
+ <!--no pjl--><!--No "text"?-->
+ </lang>
+ <autodetect>
+ <parallel>
+ <ieee1284>MFG:Hewlett-Packard;MDL:HP Color LaserJet 2600n;CMD:ACL;CLS:PRINTER;DES:HP Color LaserJet 2600n;</ieee1284>
+ <manufacturer>Hewlett-Packard</manufacturer>
+ <model>HP Color LaserJet 2600n</model>
+ <commandset>ACL</commandset>
+ </parallel>
+ </autodetect>
+ <functionality>C</functionality>
+ <driver>foo2hp</driver>
+ <!--not "unverified"--><!--no "contrib_url"-->
+ <comments> <en>
+
+ The Color LaserJet 2600n is color laser printer with a 2005 street
+ price of $360 USD. This printer is supported by the foo2hp
+ printer driver.
+
+ </en> </comments>
+</printer>
diff --git a/foomatic-db/printer/HP-LaserJet_1000.xml b/foomatic-db/printer/HP-LaserJet_1000.xml
new file mode 100644
index 0000000..8771b63
--- /dev/null
+++ b/foomatic-db/printer/HP-LaserJet_1000.xml
@@ -0,0 +1,60 @@
+<printer id="printer/HP-LaserJet_1000">
+ <make>HP</make>
+ <model>LaserJet 1000</model>
+ <mechanism>
+ <laser/><!--not "color"-->
+ <resolution>
+ <dpi>
+ <x>600</x>
+ <y>600</y>
+ </dpi>
+ </resolution>
+ <margins>
+ <general>
+ <unit>mm</unit>
+ <top>4</top>
+ <bottom>4</bottom>
+ <left>4</left>
+ <right>4</right>
+ </general>
+ </margins>
+ <consumables>
+ <comments>
+ <en>Cartridge containing toner and imaging drum</en>
+ </comments>
+ <!--one or more "partno" elements.--></consumables>
+ </mechanism>
+ <url>http://www.hp.com/cposupport/prodhome/hplaserjet45675.html
+</url>
+ <lang>
+ <proprietary/>
+ <!--no pjl--><!--No "text"?--></lang>
+ <autodetect>
+ <parallel>
+ <ieee1284>MFG:Hewlett-Packard;MDL:hp LaserJet 1000;CMD:ZJS;CLS:PRINTER;DES:hp LaserJet 1000;</ieee1284>
+ <manufacturer>Hewlett-Packard</manufacturer>
+ <model>hp LaserJet 1000</model>
+ <commandset>ZJS</commandset>
+ </parallel>
+ </autodetect>
+ <functionality>B</functionality>
+ <driver>foo2zjs</driver>
+ <!--no "contrib_url"-->
+ <comments>
+ <en>
+
+ This printer is supported by the foo2zjs free software printer driver.
+ &lt;p&gt;
+
+ The printer has a USB
+ connection. It has only 1 MB of RAM and 32 kB of ROM.&lt;p&gt;
+
+ The firmware of the printer must be uploaded after turning it
+ on. You can use a hotplug/udev script which comes with foo2zjs,
+ or do it manually:
+ &quot;&lt;tt&gt;cat /usr/share/foo2zjs/firmware/sihp1000.dl >
+ /dev/usb/lp0&lt;/tt&gt;&quot;.
+
+ </en>
+ </comments>
+</printer>
diff --git a/foomatic-db/printer/HP-LaserJet_1005.xml b/foomatic-db/printer/HP-LaserJet_1005.xml
new file mode 100644
index 0000000..9f0d803
--- /dev/null
+++ b/foomatic-db/printer/HP-LaserJet_1005.xml
@@ -0,0 +1,58 @@
+<printer id="printer/HP-LaserJet_1005">
+ <make>HP</make>
+ <model>LaserJet 1005</model>
+ <mechanism>
+ <laser/><!--not "color"-->
+ <resolution>
+ <dpi>
+ <x>600</x>
+ <y>600</y>
+ </dpi>
+ </resolution>
+ <margins>
+ <general>
+ <unit>mm</unit>
+ <top>4</top>
+ <bottom>4</bottom>
+ <left>4</left>
+ <right>4</right>
+ </general>
+ </margins>
+ <consumables>
+ <comments>
+ <en>Cartridge containing toner and imaging drum</en>
+ </comments>
+ <!--one or more "partno" elements.--></consumables>
+ </mechanism>
+ <url>http://h20015.www2.hp.com/en/document.jhtml?lc=en&amp;docName=bpl12705</url>
+ <lang>
+ <proprietary/>
+ <!--no pjl--><!--No "text"?--></lang>
+ <autodetect>
+ <parallel>
+ <ieee1284>MFG:Hewlett-Packard;MDL:hp LaserJet 1005 series;CMD:ZJS;CLS:PRINTER;DES:hp LaserJet 1005 series;</ieee1284>
+ <manufacturer>Hewlett-Packard</manufacturer>
+ <model>hp LaserJet 1005 series</model>
+ <commandset>ZJS</commandset>
+ </parallel>
+ </autodetect>
+ <functionality>B</functionality>
+ <driver>foo2zjs</driver>
+ <!--no "contrib_url"-->
+ <comments>
+ <en>
+
+ This printer is supported by the foo2zjs free software printer driver.
+ &lt;p&gt;
+
+ The printer is faster than the LaserJet 1000 and has both USB and
+ parallel connections. It has only 1 MB of RAM and 32 kB of ROM.&lt;p&gt;
+
+ The firmware of the printer must be uploaded after turning it
+ on. You can use a hotplug/udev script which comes with foo2zjs,
+ or do it manually:
+ &quot;&lt;tt&gt;cat /usr/share/foo2zjs/firmware/sihp1005.dl >
+ /dev/usb/lp0&lt;/tt&gt;&quot;.
+ </en>
+ </comments>
+</printer>
diff --git a/foomatic-db/printer/HP-LaserJet_1018.xml b/foomatic-db/printer/HP-LaserJet_1018.xml
new file mode 100644
index 0000000..64c0763
--- /dev/null
+++ b/foomatic-db/printer/HP-LaserJet_1018.xml
@@ -0,0 +1,61 @@
+<printer id="printer/HP-LaserJet_1018">
+ <make>HP</make>
+ <model>LaserJet 1018</model>
+ <mechanism>
+ <laser/><!--not "color"-->
+ <resolution>
+ <dpi>
+ <x>600</x>
+ <y>600</y>
+ </dpi>
+ </resolution>
+ <margins>
+ <general>
+ <unit>mm</unit>
+ <top>4</top>
+ <bottom>4</bottom>
+ <left>4</left>
+ <right>4</right>
+ </general>
+ </margins>
+ <consumables>
+ <comments> <en>
+ Print cartridge (2000 prints) - $65
+ </en></comments>
+ <partno>Q2612A</partno>
+ </consumables>
+ </mechanism>
+ <url>http://h10010.www1.hp.com/wwpc/us/en/sm/WF05a/18972-236251-236263-14638-f51-439423.html</url>
+ <lang>
+ <proprietary/>
+ <!--no pjl--><!--No "text"?-->
+ </lang>
+ <autodetect>
+ <parallel>
+ <ieee1284>MFG:Hewlett-Packard;MDL:HP LaserJet 1018;CMD:ACL;CLS:PRINTER;DES:HP LaserJet 1018;</ieee1284>
+ <manufacturer>Hewlett-Packard</manufacturer>
+ <model>HP LaserJet 1018</model>
+ <commandset>ACL</commandset>
+ </parallel>
+ </autodetect>
+ <functionality>B</functionality>
+ <driver>foo2zjs</driver>
+ <!--no "contrib_url"-->
+ <comments>
+ <en>
+
+ This printer is supported by the foo2zjs free software printer driver.
+ &lt;p&gt;
+
+ The printer is faster than the LaserJet 1000 and has a USB
+ connection. It has only 2 MB of RAM and 32 kB of ROM.&lt;p&gt;
+
+ The firmware of the printer must be uploaded after turning it
+ on. You can use a hotplug/udev script which comes with foo2zjs,
+ or do it manually:
+ &quot;&lt;tt&gt;cat /usr/share/foo2zjs/firmware/sihp1018.dl >
+ /dev/usb/lp0&lt;/tt&gt;&quot;.
+
+ </en>
+ </comments>
+</printer>
diff --git a/foomatic-db/printer/HP-LaserJet_1020.xml b/foomatic-db/printer/HP-LaserJet_1020.xml
new file mode 100644
index 0000000..b87ee12
--- /dev/null
+++ b/foomatic-db/printer/HP-LaserJet_1020.xml
@@ -0,0 +1,61 @@
+<printer id="printer/HP-LaserJet_1020">
+ <make>HP</make>
+ <model>LaserJet 1020</model>
+ <mechanism>
+ <laser/><!--not "color"-->
+ <resolution>
+ <dpi>
+ <x>600</x>
+ <y>600</y>
+ </dpi>
+ </resolution>
+ <margins>
+ <general>
+ <unit>mm</unit>
+ <top>4</top>
+ <bottom>4</bottom>
+ <left>4</left>
+ <right>4</right>
+ </general>
+ </margins>
+ <consumables>
+ <comments> <en>
+ Print cartridge (2000 prints) - $65
+ </en></comments>
+ <partno>Q2612A</partno>
+ </consumables>
+ </mechanism>
+ <url>http://h10010.www1.hp.com/wwpc/us/en/sm/WF05a/18972-236251-236263-14638-f51-439423.html</url>
+ <lang>
+ <proprietary/>
+ <!--no pjl--><!--No "text"?-->
+ </lang>
+ <autodetect>
+ <parallel>
+ <ieee1284>MFG:Hewlett-Packard;MDL:HP LaserJet 1020;CMD:ACL;CLS:PRINTER;DES:HP LaserJet 1020;</ieee1284>
+ <manufacturer>Hewlett-Packard</manufacturer>
+ <model>HP LaserJet 1020</model>
+ <commandset>ACL</commandset>
+ </parallel>
+ </autodetect>
+ <functionality>B</functionality>
+ <driver>foo2zjs</driver>
+ <!--no "contrib_url"-->
+ <comments>
+ <en>
+
+ This printer is supported by the foo2zjs free software printer driver.
+ &lt;p&gt;
+
+ The printer is faster than the LaserJet 1000 and has a USB
+ connection. It has only 2 MB of RAM and 32 kB of ROM.&lt;p&gt;
+
+ The firmware of the printer must be uploaded after turning it
+ on. You can use a hotplug/udev script which comes with foo2zjs,
+ or do it manually:
+ &quot;&lt;tt&gt;cat /usr/share/foo2zjs/firmware/sihp1020.dl >
+ /dev/usb/lp0&lt;/tt&gt;&quot;.
+
+ </en>
+ </comments>
+</printer>
diff --git a/foomatic-db/printer/HP-LaserJet_1022.xml b/foomatic-db/printer/HP-LaserJet_1022.xml
new file mode 100644
index 0000000..8268c49
--- /dev/null
+++ b/foomatic-db/printer/HP-LaserJet_1022.xml
@@ -0,0 +1,55 @@
+<printer id="printer/HP-LaserJet_1022">
+ <make>HP</make>
+ <model>LaserJet 1022</model>
+ <mechanism>
+ <laser/><!--not "color"-->
+ <resolution>
+ <dpi>
+ <x>600</x>
+ <y>600</y>
+ </dpi>
+ </resolution>
+ <margins>
+ <general>
+ <unit>mm</unit>
+ <top>4</top>
+ <bottom>4</bottom>
+ <left>4</left>
+ <right>4</right>
+ </general>
+ </margins>
+ <consumables>
+ <comments> <en>
+ Print cartridge (2000 prints) - $65
+ </en></comments>
+ <partno>Q2612A</partno>
+ </consumables>
+ </mechanism>
+ <url>http://h10010.www1.hp.com/wwpc/us/en/sm/WF05a/18972-236251-236263-14638-f51-439423.html</url>
+ <lang>
+ <proprietary/>
+ <!--no pjl--><!--No "text"?-->
+ </lang>
+ <autodetect>
+ <parallel>
+ <ieee1284>MFG:Hewlett-Packard;MDL:HP LaserJet 1022;CMD:ACL;CLS:PRINTER;DES:HP LaserJet 1022;</ieee1284>
+ <manufacturer>Hewlett-Packard</manufacturer>
+ <model>HP LaserJet 1022</model>
+ <commandset>ACL</commandset>
+ </parallel>
+ </autodetect>
+ <functionality>B</functionality>
+ <driver>foo2zjs</driver>
+ <!--no "contrib_url"-->
+ <comments>
+ <en>
+
+ This printer is supported by the foo2zjs free software printer driver.
+ &lt;p&gt;
+
+ The printer is faster than the LaserJet 1000 and has a USB
+ connection. It has only 8 MB of RAM and 32 kB of ROM.&lt;p&gt;
+
+ </en>
+ </comments>
+</printer>
diff --git a/foomatic-db/printer/HP-LaserJet_M1005_MFP.xml b/foomatic-db/printer/HP-LaserJet_M1005_MFP.xml
new file mode 100644
index 0000000..eda4d07
--- /dev/null
+++ b/foomatic-db/printer/HP-LaserJet_M1005_MFP.xml
@@ -0,0 +1,50 @@
+<printer id="printer/HP-LaserJet_M1005_MFP">
+ <make>HP</make>
+ <model>LaserJet M1005 MFP</model>
+ <mechanism>
+ <laser/><!--not "color"-->
+ <resolution>
+ <dpi>
+ <x>600</x>
+ <y>600</y>
+ </dpi>
+ </resolution>
+ <margins>
+ <general>
+ <unit>mm</unit>
+ <top>4</top>
+ <bottom>4</bottom>
+ <left>4</left>
+ <right>4</right>
+ </general>
+ </margins>
+ <consumables>
+ <comments>
+ <en>Cartridge containing toner and imaging drum</en>
+ </comments>
+ <!--one or more "partno" elements.--></consumables>
+ </mechanism>
+ <url>http://h20015.www2.hp.com/en/document.jhtml?lc=en&amp;docName=bpl12705</url>
+ <lang>
+ <proprietary/>
+ <!--no pjl--><!--No "text"?--></lang>
+ <autodetect>
+ <parallel>
+ <ieee1284>MFG:Hewlett-Packard;MDL:HP LaserJet M1005;CMD:ACL;CLS:PRINTER;DES:HP LaserJet M1005;FWVER:20060721;</ieee1284>
+ <manufacturer>Hewlett-Packard</manufacturer>
+ <model>HP LaserJet M1005</model>
+ <commandset>XQX</commandset>
+ </parallel>
+ </autodetect>
+ <functionality>B</functionality>
+ <driver>foo2xqx</driver>
+ <!--no "contrib_url"-->
+ <comments>
+ <en>
+
+ This printer is supported by the foo2xqx free software printer driver.
+ &lt;p&gt;
+
+ </en>
+ </comments>
+</printer>
diff --git a/foomatic-db/printer/KonicaMinolta-magicolor_2490_MF.xml b/foomatic-db/printer/KonicaMinolta-magicolor_2490_MF.xml
new file mode 100644
index 0000000..5d8024c
--- /dev/null
+++ b/foomatic-db/printer/KonicaMinolta-magicolor_2490_MF.xml
@@ -0,0 +1,61 @@
+<printer id="printer/KonicaMinolta-magicolor_2490_MF">
+ <make>KonicaMinolta</make>
+ <model>magicolor 2490 MF</model>
+ <mechanism>
+ <laser/>
+ <color/>
+ <resolution>
+ <dpi>
+ <x>2400</x>
+ <y>600</y>
+ </dpi>
+ </resolution>
+ <margins>
+ <general>
+ <unit>mm</unit>
+ <top>4</top>
+ <bottom>4</bottom>
+ <left>4</left>
+ <right>4</right>
+ </general>
+ </margins>
+ <consumables>
+ <comments> <en>
+ Toner Black (4500 prints) - $79
+ Toner Yellow (4500 prints) - $119
+ Toner Magenta (4500 prints) - $119
+ Toner Cyan (4500 prints) - $119
+ Drum Catridge (45000 prints) - $149
+ </en> </comments>
+ <partno>1710587-004</partno>
+ <partno>1710587-005</partno>
+ <partno>1710587-006</partno>
+ <partno>1710587-007</partno>
+ <partno>1710591-001</partno>
+ </consumables>
+ </mechanism>
+ <url>http://www.minolta-qms.com/products/mfp/mc2490MF/index.asp</url>
+ <lang>
+ <proprietary/>
+ <!--no pjl--><!--No "text"?-->
+ </lang>
+ <autodetect>
+ <parallel>
+ <ieee1284>CLASS:PRINTER;MODEL:magicolor 2490 MF;MANUFACTURER:KONICA MINOLTA;COMMAND SET:ZJS,PJL;</ieee1284>
+ <manufacturer>KONICA MINOLTA</manufacturer>
+ <model>magicolor 2490 MF</model>
+ <commandset>ZJS,PJL</commandset>
+ </parallel>
+ <snmp>
+ <description>KONICA MINOLTA magicolor 2490 MF</description>
+ </snmp>
+ </autodetect>
+ <functionality>B</functionality>
+ <driver>foo2lava</driver>
+ <!--not "unverified"--><!--no "contrib_url"-->
+ <comments> <en>
+ The magicolor 2490 MF is a network color all-in-one printer/scanner.
+ The printer *only* is supported by the foo2lava open software printer
+ driver.
+ </en> </comments>
+</printer>
diff --git a/foomatic-db/printer/KonicaMinolta-magicolor_2530_DL.xml b/foomatic-db/printer/KonicaMinolta-magicolor_2530_DL.xml
new file mode 100644
index 0000000..9b20bd3
--- /dev/null
+++ b/foomatic-db/printer/KonicaMinolta-magicolor_2530_DL.xml
@@ -0,0 +1,63 @@
+<printer id="printer/KonicaMinolta-magicolor_2530_DL">
+ <make>KonicaMinolta</make>
+ <model>magicolor 2530 DL</model>
+ <mechanism>
+ <laser/>
+ <color/>
+ <resolution>
+ <dpi>
+ <x>2400</x>
+ <y>600</y>
+ </dpi>
+ </resolution>
+ <margins>
+ <general>
+ <unit>mm</unit>
+ <top>4</top>
+ <bottom>4</bottom>
+ <left>4</left>
+ <right>4</right>
+ </general>
+ </margins>
+ <consumables>
+ <comments> <en>
+ Toner Black (4500 prints) - $79
+ Toner Yellow (4500 prints) - $119
+ Toner Magenta (4500 prints) - $119
+ Toner Cyan (4500 prints) - $119
+ Drum Catridge (45000 prints) - $149
+ </en> </comments>
+ <partno>1710587-004</partno>
+ <partno>1710587-005</partno>
+ <partno>1710587-006</partno>
+ <partno>1710587-007</partno>
+ <partno>1710591-001</partno>
+ </consumables>
+ </mechanism>
+ <url>http://www.minolta-qms.com/products/color/mc2530DL/index.asp</url>
+ <lang>
+ <proprietary/>
+ <!--no pjl--><!--No "text"?-->
+ </lang>
+ <autodetect>
+ <parallel>
+ <ieee1284>CLASS:PRINTER;MODEL:magicolor 2530 DL;MANUFACTURER:KONICA MINOLTA;COMMAND SET:ZJS,PJL;</ieee1284>
+ <manufacturer>KONICA MINOLTA</manufacturer>
+ <model>magicolor 2530 DL</model>
+ <commandset>ZJS,PJL</commandset>
+ </parallel>
+ <snmp>
+ <description>KONICA MINOLTA magicolor 2530 DL</description>
+ </snmp>
+ </autodetect>
+ <functionality>B</functionality>
+ <driver>foo2lava</driver>
+ <!--not "unverified"--><!--no "contrib_url"-->
+ <comments> <en>
+
+ The magicolor 2530 DL is a network color laser printer with a
+ 2006 street price of $399 USD. This printer is supported
+ by the foo2lava open software printer driver.
+
+ </en> </comments>
+</printer>
diff --git a/foomatic-db/printer/Minolta-Color_PageWorks_Pro_L.xml b/foomatic-db/printer/Minolta-Color_PageWorks_Pro_L.xml
new file mode 100644
index 0000000..d2b6338
--- /dev/null
+++ b/foomatic-db/printer/Minolta-Color_PageWorks_Pro_L.xml
@@ -0,0 +1,40 @@
+<printer id="printer/Minolta-Color_PageWorks_Pro_L">
+ <make>Minolta</make>
+ <model>Color PageWorks/Pro L</model>
+ <mechanism>
+ <laser/>
+ <color/>
+ <resolution>
+ <dpi>
+ <x>2400</x>
+ <y>600</y>
+ </dpi>
+ </resolution>
+ <margins>
+ <general>
+ <unit>mm</unit>
+ <top>4</top>
+ <bottom>4</bottom>
+ <left>4</left>
+ <right>4</right>
+ </general>
+ </margins>
+ </mechanism>
+ <url>http://www.minolta-qms.com/support/current_printers/color_pwpro_L_sup.htm</url>
+ <lang>
+ <proprietary/>
+ <!--no pjl--><!--No "text"?-->
+ </lang>
+ <functionality>B</functionality>
+ <driver>foo2zjs</driver>
+ <!--not "unverified"--><!--no "contrib_url"-->
+ <comments> <en>
+
+ The Minolta Color PageWorks/Pro L is a color laser printer which
+ uses the Zenographics ZjStream printer language.
+
+ This printer is supported by the foo2zjs free software printer
+ driver.
+
+ </en> </comments>
+</printer>
diff --git a/foomatic-db/printer/Minolta-magicolor_2200_DL.xml b/foomatic-db/printer/Minolta-magicolor_2200_DL.xml
new file mode 100644
index 0000000..c4b5a80
--- /dev/null
+++ b/foomatic-db/printer/Minolta-magicolor_2200_DL.xml
@@ -0,0 +1,66 @@
+<printer id="printer/Minolta-magicolor_2200_DL">
+ <make>Minolta</make>
+ <model>magicolor 2200 DL</model>
+ <mechanism>
+ <laser/>
+ <color/>
+ <resolution>
+ <dpi>
+ <x>1200</x>
+ <y>600</y>
+ </dpi>
+ </resolution>
+ <margins>
+ <general>
+ <unit>mm</unit>
+ <top>4</top>
+ <bottom>4</bottom>
+ <left>4</left>
+ <right>4</right>
+ </general>
+ </margins>
+ <consumables>
+ <comments> <en>
+ Toner Black (6000 prints) - $77
+ Toner Yellow (6000 prints) - $143
+ Toner Magenta (6000 prints) - $143
+ Toner Cyan (6000 prints) - $143
+ OPC Drum Catridge (30000 prints) - $99
+ Transfer Belt (100K prints) - $349
+ Fuser Oil Roller (21K prints) - $49
+ Fuser Unit/Transfer Roller Kit (100K prints) - $499
+ Waste Toner Bottle (30000 prints) - $29
+ </en> </comments>
+ <partno>1710471-001</partno>
+ <partno>1710471-002</partno>
+ <partno>1710471-003</partno>
+ <partno>1710471-004</partno>
+ <partno>1710476-001</partno>
+ <partno>1710478-001</partno>
+ <partno>1710475-001</partno>
+ <partno>1710483-001</partno>
+ <partno>1710477-001</partno>
+ <!--one or more "partno" elements.-->
+ </consumables>
+ </mechanism>
+ <url>http://www.minolta-qms.com/products/color/mc2200DL/index.asp</url>
+ <lang>
+ <proprietary/>
+ <!--no pjl--><!--No "text"?-->
+ </lang>
+ <autodetect>
+ <!-- HOW DO I SPECIFY SNMP AUTODETECT???????? -->
+ </autodetect>
+ <functionality>B</functionality>
+ <driver>foo2zjs</driver>
+ <!--not "unverified"--><!--no "contrib_url"-->
+ <comments> <en>
+
+ The magicolor 2200 DL is a network color laser printer which
+ uses the Zenographics ZjStream printer language.
+
+ This printer is supported by the foo2zjs free software printer
+ driver.
+
+ </en> </comments>
+</printer>
diff --git a/foomatic-db/printer/Minolta-magicolor_2300_DL.xml b/foomatic-db/printer/Minolta-magicolor_2300_DL.xml
new file mode 100644
index 0000000..fd6e316
--- /dev/null
+++ b/foomatic-db/printer/Minolta-magicolor_2300_DL.xml
@@ -0,0 +1,65 @@
+<printer id="printer/Minolta-magicolor_2300_DL">
+ <make>Minolta</make>
+ <model>magicolor 2300 DL</model>
+ <mechanism>
+ <laser/>
+ <color/>
+ <resolution>
+ <dpi>
+ <x>2400</x>
+ <y>600</y>
+ </dpi>
+ </resolution>
+ <margins>
+ <general>
+ <unit>mm</unit>
+ <top>4</top>
+ <bottom>4</bottom>
+ <left>4</left>
+ <right>4</right>
+ </general>
+ </margins>
+ <consumables>
+ <comments> <en>
+ Toner Black (4500 prints) - $79
+ Toner Yellow (4500 prints) - $119
+ Toner Magenta (4500 prints) - $119
+ Toner Cyan (4500 prints) - $119
+ Waste Toner Box (25000 prints) - $19
+ OPC Drum Catridge (45000 prints) - $149
+ </en> </comments>
+ <partno>1710517-005</partno>
+ <partno>1710517-006</partno>
+ <partno>1710517-007</partno>
+ <partno>1710517-008</partno>
+ <partno>1710522-001</partno>
+ <partno>1710520-001</partno>
+ </consumables>
+ </mechanism>
+ <url>http://www.minolta-qms.com/products/color/mc2300DL/index.asp</url>
+ <lang>
+ <proprietary/>
+ <!--no pjl--><!--No "text"?-->
+ </lang>
+ <autodetect>
+ <parallel>
+ <ieee1284>CLASS:PRINTER;MODEL:magicolor 2300 DL;MANUFACTURER:MINOLTA-QMS;COMMAND SET:ZJS,PJL;</ieee1284>
+ <manufacturer>MINOLTA-QMS</manufacturer>
+ <model>magicolor 2300 DL</model>
+ <commandset>ZJS,PJL</commandset>
+ </parallel>
+ <snmp>
+ <description>MINOLTA-QMS magicolor 2300 DL</description>
+ </snmp>
+ </autodetect>
+ <functionality>B</functionality>
+ <driver>foo2zjs</driver>
+ <!--not "unverified"--><!--no "contrib_url"-->
+ <comments> <en>
+
+ The magicolor 2300 DL is a network color laser printer with a
+ 2003 street price of $600-$800 USD. This printer is supported
+ by the foo2zjs free software printer driver.
+
+ </en> </comments>
+</printer>
diff --git a/foomatic-db/printer/Minolta-magicolor_2430_DL.xml b/foomatic-db/printer/Minolta-magicolor_2430_DL.xml
new file mode 100644
index 0000000..8438805
--- /dev/null
+++ b/foomatic-db/printer/Minolta-magicolor_2430_DL.xml
@@ -0,0 +1,63 @@
+<printer id="printer/Minolta-magicolor_2430_DL">
+ <make>Minolta</make>
+ <model>magicolor 2430 DL</model>
+ <mechanism>
+ <laser/>
+ <color/>
+ <resolution>
+ <dpi>
+ <x>2400</x>
+ <y>600</y>
+ </dpi>
+ </resolution>
+ <margins>
+ <general>
+ <unit>mm</unit>
+ <top>4</top>
+ <bottom>4</bottom>
+ <left>4</left>
+ <right>4</right>
+ </general>
+ </margins>
+ <consumables>
+ <comments> <en>
+ Toner Black (4500 prints) - $79
+ Toner Yellow (4500 prints) - $119
+ Toner Magenta (4500 prints) - $119
+ Toner Cyan (4500 prints) - $119
+ Drum Catridge (45000 prints) - $149
+ </en> </comments>
+ <partno>1710587-004</partno>
+ <partno>1710587-005</partno>
+ <partno>1710587-006</partno>
+ <partno>1710587-007</partno>
+ <partno>1710591-001</partno>
+ </consumables>
+ </mechanism>
+ <url>http://www.minolta-qms.com/products/color/mc2430DL/index.asp</url>
+ <lang>
+ <proprietary/>
+ <!--no pjl--><!--No "text"?-->
+ </lang>
+ <autodetect>
+ <parallel>
+ <ieee1284>CLASS:PRINTER;MODEL:magicolor 2430 DL;MANUFACTURER:MINOLTA-QMS;COMMAND SET:ZJS,PJL;</ieee1284>
+ <manufacturer>KONICA MINOLTA</manufacturer>
+ <model>magicolor 2430 DL</model>
+ <commandset>ZJS,PJL</commandset>
+ </parallel>
+ <snmp>
+ <description>MINOLTA-QMS magicolor 2430 DL</description>
+ </snmp>
+ </autodetect>
+ <functionality>B</functionality>
+ <driver>foo2zjs</driver>
+ <!--not "unverified"--><!--no "contrib_url"-->
+ <comments> <en>
+
+ The magicolor 2430 DL is a network color laser printer with a
+ 2005 street price of $500 USD. This printer is supported
+ by the foo2zjs free software printer driver.
+
+ </en> </comments>
+</printer>
diff --git a/foomatic-test b/foomatic-test
new file mode 100755
index 0000000..fc34836
--- /dev/null
+++ b/foomatic-test
@@ -0,0 +1,42 @@
+#!/bin/sh
+
+#
+# Test a new foomatic printer entry.
+#
+
+# This stuff should be passable on the command line to make this script generic
+# TODO
+MAINDB=/usr/share/foomatic/db/source
+NEWDB=./foomatic-db
+
+PRINTER="Lexmark-Z43"
+DRIVER=drv_z42
+PRINTER="Minolta-magicolor_2300_DL"
+DRIVER=foo2zjs
+OPTIONS="-o Resolution=600x600"
+OPTIONS=
+OPTIONS="-o ColorMode=Color -o Nup=2up"
+
+# Copy the new DB XML files into the main database
+for dir in driver printer opt; do
+ root cp $NEWDB/$dir/*.xml $MAINDB/$dir
+done
+
+# Issue a command to make foomatic recognize the new DB entries
+root rm -rf /var/cache/foomatic/*/*
+(cd /var/cache/foomatic/compiled; root foomatic-combo-xml -O >overview.xml)
+
+# Create the perl script that drives the printer with the above options
+foomatic-datafile -t direct -p $PRINTER -d $DRIVER > xxx.foo
+
+# Fix the directomatic script so it produces useful information
+sed < /usr/bin/directomatic > xxxomatic \
+ -e 's/debug=0/debug=1/' \
+ -e 's#/tmp/prnlog#xxx.prnlog#'
+chmod +x xxxomatic
+
+# Run the script
+./xxxomatic -P xxx.foo $OPTIONS testpage.ps > xxx.prn
+
+# Ferret out the useful information
+sed -n 's/.*running: \(.*\)/\1/p' xxx.prnlog
diff --git a/gamma-lookup.ps b/gamma-lookup.ps
new file mode 100644
index 0000000..5b88ce5
--- /dev/null
+++ b/gamma-lookup.ps
@@ -0,0 +1,117 @@
+%%
+%% Here is some Postscript for setting the gamma values using table lookup
+%%
+%% These tables don't do anything currently. Its a straight 1-1 mapping.
+%%
+%% But maybe somebody will figure out some tables if I provide the template :-)
+%%
+%% This is for fooling around with color correction. None of the
+%% values in this file are tuned for the 2300 DL yet. So far, I
+%% have not come across a *process* for determining what should go
+%% into this file.
+%%
+%% This defines a set of four PS procedures, one for each of C, M, Y, and K,
+%% whose input is a value in the range 0.0..1.0, and whose output should be
+%% a corrected value in the same range.
+%%
+
+%%
+%% Lookup table for Cyan
+%%
+/c_lut [
+%The first value is for the level 0 (darker) %levels...
+0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 %0 ... 15
+16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 32 %16 ... 31
+32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 %32 ... 47
+48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 %48 ... 63
+64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 %64 ... 79
+80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 %80 ... 95
+96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 %96 ... 111
+112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 %112 ... 127
+128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 %128 ... 143
+144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 %144 ... 159
+160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 %160 ... 175
+176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 %176 ... 191
+192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 %192 ... 207
+208 209 210 211 212 213 214 215 216 217 218 219 220 221 222 223 %208 ... 223
+224 225 226 227 228 229 230 231 232 233 234 235 236 237 238 239 %224 ... 239
+240 241 242 243 244 245 246 247 248 249 250 251 252 253 254 255 %240 ... 255
+%The last value is for level 255 (lighter).
+] def
+
+%%
+%% Lookup table for Magenta
+%%
+/m_lut [
+%The first value is for the level 0 (darker) %levels...
+0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 %0 ... 15
+16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 32 %16 ... 31
+32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 %32 ... 47
+48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 %48 ... 63
+64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 %64 ... 79
+80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 %80 ... 95
+96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 %96 ... 111
+112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 %112 ... 127
+128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 %128 ... 143
+144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 %144 ... 159
+160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 %160 ... 175
+176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 %176 ... 191
+192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 %192 ... 207
+208 209 210 211 212 213 214 215 216 217 218 219 220 221 222 223 %208 ... 223
+224 225 226 227 228 229 230 231 232 233 234 235 236 237 238 239 %224 ... 239
+240 241 242 243 244 245 246 247 248 249 250 251 252 253 254 255 %240 ... 255
+%The last value is for level 255 (lighter).
+] def
+
+%%
+%% Lookup table for Yellow
+%%
+/y_lut [
+%The first value is for the level 0 (darker) %levels...
+0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 %0 ... 15
+16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 32 %16 ... 31
+32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 %32 ... 47
+48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 %48 ... 63
+64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 %64 ... 79
+80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 %80 ... 95
+96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 %96 ... 111
+112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 %112 ... 127
+128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 %128 ... 143
+144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 %144 ... 159
+160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 %160 ... 175
+176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 %176 ... 191
+192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 %192 ... 207
+208 209 210 211 212 213 214 215 216 217 218 219 220 221 222 223 %208 ... 223
+224 225 226 227 228 229 230 231 232 233 234 235 236 237 238 239 %224 ... 239
+240 241 242 243 244 245 246 247 248 249 250 251 252 253 254 255 %240 ... 255
+%The last value is for level 255 (lighter).
+] def
+
+%%
+%% Lookup table for Black
+%%
+/k_lut [
+%The first value is for the level 0 (darker) %levels...
+0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 %0 ... 15
+16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 32 %16 ... 31
+32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 %32 ... 47
+48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 %48 ... 63
+64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 %64 ... 79
+80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 %80 ... 95
+96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 %96 ... 111
+112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 %112 ... 127
+128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 %128 ... 143
+144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 %144 ... 159
+160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 %160 ... 175
+176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 %176 ... 191
+192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 %192 ... 207
+208 209 210 211 212 213 214 215 216 217 218 219 220 221 222 223 %208 ... 223
+224 225 226 227 228 229 230 231 232 233 234 235 236 237 238 239 %224 ... 239
+240 241 242 243 244 245 246 247 248 249 250 251 252 253 254 255 %240 ... 255
+%The last value is for level 255 (lighter).
+] def
+{255 mul 0.5 add cvi c_lut exch get 255 div}
+{255 mul 0.5 add cvi m_lut exch get 255 div}
+{255 mul 0.5 add cvi y_lut exch get 255 div}
+{255 mul 0.5 add cvi k_lut exch get 255 div}
+setcolortransfer
diff --git a/gamma.ps b/gamma.ps
new file mode 100644
index 0000000..50eb0bc
--- /dev/null
+++ b/gamma.ps
@@ -0,0 +1,15 @@
+%%
+%% This is for fooling around with color correction. None of the
+%% values in this file are tuned for the 2300 DL yet. So far, I
+%% have not come across a *process* for determining what should go
+%% into this file. Also see "gamma-lookup.ps" for another approach.
+%%
+%% This defines a set of four PS procedures, one for each of C, M, Y, and K,
+%% whose input is a value in the range 0.0..1.0, and whose output should be
+%% a corrected value in the same range.
+%%
+%% CYAN MAGENTA YELLOW BLACK
+%{0.217 exp} {0.217 exp} {0.217 exp} {0.217 exp} setcolortransfer
+%{0.256 exp} {0.256 exp} {0.256 exp} {0.256 exp} setcolortransfer
+{0.333 exp} {0.333 exp} {0.333 exp} {0.333 exp} setcolortransfer
+%{0.450 exp} {0.450 exp} {0.450 exp} {0.450 exp} setcolortransfer
diff --git a/getweb.in b/getweb.in
new file mode 100755
index 0000000..2b904a4
--- /dev/null
+++ b/getweb.in
@@ -0,0 +1,247 @@
+#!/bin/sh
+
+WGETOPTS=--passive-ftp
+
+usage() {
+cat <<EOF
+Usage:
+ ./getweb something
+
+ Convenience script to get extra somethings from the web,
+ such as ICC color profiles, firmware, PPD files, etc.
+
+ $ ./getweb 2600n # Get HP Color LaserJet 2600n .ICM files
+ $ ./getweb 1600 # Get HP Color LaserJet 1600 .ICM files
+ $ ./getweb 2530 # Get Konica Minolta 2530 DL .ICM files
+ $ ./getweb 2490 # Get Konica Minolta 2490 MF .ICM files
+ $ ./getweb 2430 # Get Konica Minolta 2430 DL .ICM files
+ $ ./getweb 2300 # Get Minolta 2300 DL .ICM files
+ $ ./getweb 2200 # Get Minolta 2200 DL .ICM files
+ $ ./getweb cpwl # Get Minolta Color PageWorks/Pro L .ICM files
+
+ $ ./getweb 1020 # Get HP LJ1020 firmware file
+ $ ./getweb 1018 # Get HP LJ1005 firmware file
+ $ ./getweb 1005 # Get HP LJ1005 firmware file
+ $ ./getweb 1000 # Get HP LJ1000 firmware file
+
+ $ ./getweb all # Get everything above
+
+ $ ./getweb 2300dl_fw # Get Minolta 2300DL v2.55 firmware (experts only)
+
+ $ ./getweb update # Get latest version of this software.
+EOF
+ exit 1
+}
+
+#
+# Report an error and exit
+#
+PROGNAME=$0
+error() {
+ echo "`basename $PROGNAME`: $1" >&2
+ exit 1
+}
+
+#
+# Download a .EXE file from the web, unzip it, and extract the
+# files we want
+getexe() {
+ url="$1"
+ exefile="$2"
+ what="$3"
+
+ wget $WGETOPTS -O $exefile "$url/$exefile" ||
+ error "Couldn't download $url/$exefile"
+ unzip -o $exefile "$what"
+ rm $exefile
+}
+
+#
+# Download a .tar.gz file from the web, untar it, and extract the
+# files we want
+gettgz() {
+ url="$1"
+ file="$2"
+ what="$3"
+
+ wget $WGETOPTS -O $file "$url/$file" ||
+ error "Couldn't download $url/$file"
+ gunzip <$file | tar xvf - $what
+ rm $file
+}
+
+getone() {
+ case "$1" in
+ lj1000|1000)
+ gettgz \
+ http://foo2zjs.rkkda.com sihp1000.tar.gz \
+ ""
+ #echo "provided"
+ #getexe \
+ #ftp://ftp.hp.com/pub/softlib/software1/lj1488/lj-1145-2 \
+ #lj1488en.exe \
+ #sihp1000.img
+ ;;
+ lj1005|1005)
+ gettgz \
+ http://foo2zjs.rkkda.com sihp1005.tar.gz \
+ ""
+ #echo "provided"
+ #getexe \
+ #ftp://ftp.hp.com/pub/softlib/software2/COL2222/lj-10067-2 \
+ #lj1005hostbased-en.exe \
+ #sihp1005.img
+ ;;
+ lj1018|1018)
+ gettgz \
+ http://foo2zjs.rkkda.com sihp1018.tar.gz \
+ ""
+ ;;
+ lj1020|1020)
+ gettgz \
+ http://foo2zjs.rkkda.com sihp1020.tar.gz \
+ ""
+ ;;
+ 2200dl|2200)
+ getexe \
+ ftp://ftp.minolta-qms.com/pub/crc/out_going/win2000 m22dlicc.exe \
+ "*.icm"
+ ;;
+ 2300dl|2300)
+ getexe \
+ ftp://ftp.minolta-qms.com/pub/crc/out_going/win m23dlicc.exe \
+ "*.icm"
+ gettgz \
+ http://foo2zjs.rkkda.com km2430.tar.gz \
+ ""
+ ;;
+ 2300dl_fw)
+ # 2300DL firmware upgrade to v2.55
+ BASE="http://crm01.minoltaeurope.com"
+ BASE="$BASE/openmind/technic/swfw/mswprtdl.nsf/logdwl"
+ FILE="MC2300DL_v255.zip"
+ URL="$BASE?openagent&4CE486C20839C75AC1256D9E001EBD1F/\$File/$FILE"
+ wget $WGETOPTS "$URL" || error "Couldn't download $URL"
+ echo "*** Now use a windows box to unzip and install $FILE ***"
+ ;;
+ cpwl|pageworks)
+ getexe \
+ ftp://ftp.minolta-qms.com/pub/crc/out_going/windows cpplxp.exe \
+ "*.IC_"
+ for i in C*.IC_
+ do
+ base=`basename $i .IC_`
+ mv $base.IC_ $base.ic_
+ ./msexpand $base.ic_
+ rm -f $base.ic_
+ done
+ ;;
+ 2430)
+ gettgz \
+ http://foo2zjs.rkkda.com km2430.tar.gz \
+ ""
+ ;;
+ 2530|2490)
+ gettgz \
+ http://foo2lava.rkkda.com km2530.tar.gz \
+ ""
+ ;;
+ 1600|2600n)
+ gettgz \
+ http://foo2hp.rkkda.com hpclj2600n.tar.gz \
+ ""
+ gettgz \
+ http://foo2zjs.rkkda.com km2430.tar.gz \
+ "km2430_2.icm"
+ ;;
+ xPPD)
+ # Snarf PPD files from linuxprinting
+ [ -d PPD ] || mkdir PPD
+ for i in foomatic-db/printer/*.xml
+ do
+ case "$i" in
+ */Gen*) continue;;
+ esac
+ printer=`basename $i .xml`
+ echo $printer
+ case "$printer" in
+ *1500*|*oak*) driver=foo2oak;;
+ *) driver=foo2zjs;;
+ esac
+ URL="http://www.linuxprinting.org/ppd-o-matic.cgi"
+ URL="$URL?driver=$driver&printer=$printer"
+ URL="$URL&.submit=Generate+PPD+file"
+ URL="$URL&show=1&.cgifields=shortgui&.cgifields=show"
+ wget $WGETOPTS -O PPD/$printer.ppd "$URL" ||
+ error "Couldn't dowload $URL"
+ done
+ ;;
+ ppd)
+ # Generate PPD files using local tools
+ [ -d PPD ] || mkdir PPD
+ for i in foomatic-db/printer/*.xml
+ do
+ printer=`basename $i .xml`
+ echo $printer
+ case "$printer" in
+ *M1005*) driver=foo2xqx;;
+ *1500*|*OAKT*) driver=foo2oak;;
+ *1600*|*2600*) driver=foo2hp;;
+ *2530*|*2490*) driver=foo2lava;;
+ *) driver=foo2zjs;;
+ esac
+ ENGINE=../foomatic/foomatic-db-engine
+ PERL5LIB=$ENGINE/lib $ENGINE/foomatic-ppdfile \
+ -d $driver -p $printer > PPD/$printer.ppd
+ done
+ ;;
+ update)
+ url=${URLZJS}
+ file=foo2zjs.tar.gz
+ wget $WGETOPTS -O $file $url/$file ||
+ error "Couldn't download $url/$exefile"
+ mv getweb getweb.old
+ HERE=`pwd`
+ cd ..
+ tar zxf $HERE/$file
+ cd $HERE
+ echo "The tarball is extracted and the current directory is up to date."
+ echo -e "Remove the tarball (y/n)? \c"
+ read ans
+ if [ "$ans" = y ]; then
+ rm -f $file
+ fi
+ ;;
+ "")
+ usage
+ ;;
+ *)
+ error "Don't know how to get extra stuff for printer $1"
+ ;;
+ esac
+}
+
+if [ $# = 0 ]; then
+ usage
+fi
+
+for i in $*
+do
+ case "$1" in
+ all)
+ getone 1000
+ getone 1005
+ getone 1018
+ getone 1020
+ getone 2200
+ getone 2300
+ # getone 2430 already done
+ getone cpwl
+ getone 2600n
+ getone 2530
+ ;;
+ *)
+ getone $i
+ ;;
+ esac
+done
diff --git a/hplj1000 b/hplj1000
new file mode 100755
index 0000000..99cd8bd
--- /dev/null
+++ b/hplj1000
@@ -0,0 +1,184 @@
+#!/bin/sh
+
+# hplj1000:
+# hplj1005:
+# hplj1020:
+#
+# Hotplug script for HP1000/1005 USB laser printers. The model number
+# that this script deals with is determined from the script name.
+#
+# Used to download firmware automatically into the printer when it
+# is powered up or plugged into the USB port.
+#
+# Also, run this script once with the magic argument "install-usermap"
+# to create the proper entry in the /etc/hotplug/usb.usermap file.
+#
+# The inspiration fo this script is from:
+# Oscar Santacreu. Alicante-Spain (2002)
+# Mike Morgan (2004)
+#
+
+# udev calls us twice on FC4! Just want /dev/usb/lp<N>
+case "$DEVNAME" in
+/dev/usb/usb*) exit;;
+esac
+
+PROGNAME="$0"
+
+#
+# Set $DEV to, e.g. /dev/usb/lp0, to force the device you want
+# Else, leave it null to automatically detect the device
+#
+DEV=/dev/usb/lp0
+DEV=""
+
+#
+# Directory to find downloadable HP firmware files sihpMMMM.dl
+#
+FWDIR=/usr/share/foo2zjs/firmware
+
+#
+# Program used to determine USB id information
+#
+USBID=/bin/usb_printerid
+
+#
+# Figure out how to log our messages
+#
+if [ -t 1 ]; then
+ # Running from a tty...
+ log() {
+ echo "$PROGNAME: $@"
+ }
+elif [ -x /usr/bin/logger ]; then
+ # Have logger...
+ log() {
+ logger -t "$PROGNAME" -- "$@"
+ }
+else
+ # No logger...
+ log() {
+ echo "$PROGNAME: $@" >> /var/log/messages
+ }
+fi
+
+#
+# Figure out the model number from the name of this script
+#
+case "$0" in
+*1000)
+ MODEL=1000
+ USB1=0x03f0 #Vendor
+ USB2=0x0517 #Model
+ ;;
+*1005)
+ MODEL=1005
+ USB1=0x03f0 #Vendor
+ USB2=0x1317 #Model
+ ;;
+*1018)
+ MODEL=1018
+ USB1=0x03f0 #Vendor
+ USB2=0x4117 #Model
+ ;;
+*1020)
+ MODEL=1020
+ USB1=0x03f0 #Vendor
+ USB2=0x2b17 #Model
+ ;;
+*)
+ log "Only HP LaserJet 1000, 1005, 1018, and 1020 are supported"
+ exit
+ ;;
+esac
+
+#
+# The special command line argument "install-usermap" will install
+# the proper entry into the /etc/hotplug/usb.usermap file
+#
+case "$1" in
+install-usermap)
+ if [ "$USB2" != "" ]; then
+ if [ -w /etc/hotplug/usb.usermap ]; then
+ USERMAP=/etc/hotplug/usb.usermap
+ elif [ -d /etc/hotplug/usb/ ]; then
+ USERMAP=/etc/hotplug/usb/foo2zjs.usermap
+ if [ ! -s $USERMAP ]; then
+ echo > $USERMAP
+ fi
+ else
+ log "No /etc/hotplug usermap!"
+ exit
+ fi
+ ex - $USERMAP <<-EOF
+ g/^hplj$MODEL/d
+ \$a
+ hplj$MODEL 0x0003 $USB1 $USB2 0x0000 0x0000 0x00 0x00 0x00 0x00 0x00 0x00 0x00000000
+ .
+ w
+ q
+ EOF
+ else
+ log "I don't know the USB info for this model yet. Please run"
+ log "usb_printerid on the usb device and send the output to:"
+ log "rick.richardson@comcast.net"
+ fi
+ exit
+ ;;
+esac
+
+#
+# Procedure to load a single device with firmware
+#
+load1() {
+ _dev="$1"
+ fw="$FWDIR/sihp$MODEL.dl"
+ if [ ! -f "$fw" ]; then
+ log "Missing HP LaserJet $MODEL firmware file $fw"
+ log "...read foo2zjs installation instructions and run ./getweb $MODEL"
+ return 1
+ fi
+
+ log "loading HP LaserJet $MODEL firmware $fw to $_dev ..."
+ # There is a timeout problem with udev and FC4, so spin it off.
+ (
+ if cat $fw > $_dev; then
+ log "... download successful."
+ else
+ log "... download failed."
+ fi
+ ) &
+ return 0
+}
+
+#
+# OK, now download firmware to any printers that need it
+#
+if [ "$DEV" != "" ]; then
+ #
+ # force downloading to a specific device
+ #
+ load1 "$DEV"
+elif [ -x $USBID ]; then
+ #
+ # Sniff around for printers that need a firmware download
+ #
+ usblps=`find /dev/usb -name lp*`" "`find /dev -name usblp*`
+ for dev in $usblps; do
+ status=`$USBID $dev 2>/dev/null | grep -y "hp LaserJet $MODEL"`
+ if [ "$status" != "" ]; then
+ # This is a LaserJet 100x
+ chmod 0666 $dev
+ status=`$USBID $dev | grep 'FWVER'`
+ if [ "$status" = "" ]; then
+ # Firmware is not yet loaded
+ load1 "$dev"
+ else
+ log "HP LaserJet $MODEL firmware already loaded into $dev"
+ fi
+ fi
+ done
+else
+ log "HP LaserJet $MODEL firmware was not downloaded..."
+ log "...couldn't find $USBID and DEV is not set"
+fi
diff --git a/hplj10xx.rules b/hplj10xx.rules
new file mode 100644
index 0000000..85c0ed0
--- /dev/null
+++ b/hplj10xx.rules
@@ -0,0 +1,8 @@
+#Own udev rule for HP Laserjet 1000
+KERNEL=="lp*", BUS=="usb", SYSFS{idVendor}=="03f0", SYSFS{product}=="hp LaserJet 1000", NAME="usb/%k", SYMLINK="hplj1000%e", MODE="0666", RUN+="/etc/hotplug/usb/hplj1000"
+#Own udev rule for HP Laserjet 1005
+KERNEL=="lp*", BUS=="usb", SYSFS{idVendor}=="03f0", SYSFS{product}=="hp LaserJet 1005 series", NAME="usb/%k", SYMLINK="hplj1005%e", MODE="0666", RUN+="/etc/hotplug/usb/hplj1005"
+#Own udev rule for HP Laserjet 1018
+KERNEL=="lp*", BUS=="usb", SYSFS{idVendor}=="03f0", SYSFS{product}=="HP LaserJet 1018", NAME="usb/%k", SYMLINK="hplj1018%e", MODE="0666", RUN+="/etc/hotplug/usb/hplj1018"
+#Own udev rule for HP Laserjet 1020
+KERNEL=="lp*", BUS=="usb", SYSFS{idVendor}=="03f0", SYSFS{product}=="HP LaserJet 1020", NAME="usb/%k", SYMLINK="hplj1020%e", MODE="0666", RUN+="/etc/hotplug/usb/hplj1020"
diff --git a/icc2ps/AUTHORS b/icc2ps/AUTHORS
new file mode 100644
index 0000000..c2fa8a7
--- /dev/null
+++ b/icc2ps/AUTHORS
@@ -0,0 +1,4 @@
+Main Author:
+------------
+Marti Maria <info@littlecms.com>
+
diff --git a/icc2ps/COPYING b/icc2ps/COPYING
new file mode 100644
index 0000000..ef5dab3
--- /dev/null
+++ b/icc2ps/COPYING
@@ -0,0 +1,8 @@
+Little cms
+Copyright (C) 1998-2004 Marti Maria
+
+Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions:
+
+The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software.
+
+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
diff --git a/icc2ps/Makefile b/icc2ps/Makefile
new file mode 100644
index 0000000..e899212
--- /dev/null
+++ b/icc2ps/Makefile
@@ -0,0 +1,20 @@
+PREFIX= /usr
+BIN= $(PREFIX)/bin
+SRC= icc2ps.c xgetopt.c
+LIB= cmscam97.c cmscnvrt.c cmserr.c cmsgamma.c cmsgmt.c cmsintrp.c cmsio1.c \
+ cmslut.c cmsmatsh.c cmsmtrx.c cmsnamed.c cmspack.c cmspcs.c cmsps2.c \
+ cmssamp.c cmswtpnt.c cmsxform.c cmsio0.c cmsvirt.c
+CFLAGS= -O3
+
+all: foo2zjs-icc2ps
+
+foo2zjs-icc2ps: $(SRC) $(LIB)
+ $(CC) $(CFLAGS) $(SRC) $(LIB) -lm -o $@
+
+install: all
+ install -c foo2zjs-icc2ps $(BIN)
+
+clean:
+ rm -f *.o foo2zjs-icc2ps
+
+foo2zjs-icc2ps: icc34.h lcms.h
diff --git a/icc2ps/README b/icc2ps/README
new file mode 100644
index 0000000..a4a2164
--- /dev/null
+++ b/icc2ps/README
@@ -0,0 +1,94 @@
+
+ Read.me for release 1.15
+ ========================
+
+ Little cms
+ Copyright (C) 1998-2005 Marti Maria
+
+ Permission is hereby granted, free of charge, to any person
+ obtaining a copy of this software and associated documentation
+ files (the "Software"), to deal in the Software without restriction,
+ including without limitation the rights to use, copy, modify, merge,
+ publish, distribute, sublicense, and/or sell copies of the Software,
+ and to permit persons to whom the Software is furnished to do so, subject
+ to the following conditions:
+
+ The above copyright notice and this permission notice shall be included
+ in all copies or substantial portions of the Software.
+
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
+ OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+ FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+ AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY,
+ WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
+ CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
+
+
+ The lcms library is now distributed under
+
+ MIT PUBLIC LICENSE
+
+ See file COPYING. for details
+
+
+ This is the 14th. public release the engine. It has been tested
+ across several versions before, but it is possible some
+ bugs still arises. If so, sorry for the inconvenience, and
+ please feel free to submit any suggestion/solution (if you can
+ found it) at:
+
+ info@littlecms.com
+
+
+ Note that the aesthetics of resulting colors are due only to
+ profiles, and not as consequence of the lcms package.
+
+ The main site for the package is located at
+
+ http://www.littlecms.com
+ or
+ http://www.lcms.coloraid.de
+
+
+ Littlecms has also a mailing list on:
+
+ http://lists.sourceforge.net/lists/listinfo/lcms-user
+
+
+ Looking forward the lcms project would grow in future, I will
+ welcome any contribution/optimization/enhancement.
+
+ Enjoy!
+
+
+ About profiles
+ ==============
+
+ The demo of this package includes some profiles for colorspace
+ conversions. I figure all of them are in public domain, but
+ since some contains copyright notice, I will enumerate here
+ the sources:
+
+ Sun Microsystems Java SDK (widely available)
+ Kodak public FTP site: ftp.kodak.com
+ ICM Stress demo from microsoft. www.microsoft.com
+ sRGB from sRGB site www.srgb.com
+
+ If you found some profile of these not to be in public domain,
+ please notify me. I will remove the offending profile as soon as
+ posible.
+
+
+
+ Additional files
+ ================
+
+ ICC34.h is the header file the International Color Consortium
+ has posted for version spec 3.4, with some minor modifications
+ for improving portability.
+
+ You can reach it at
+
+ http://www.color.org
+
+
diff --git a/icc2ps/README.foo2zjs b/icc2ps/README.foo2zjs
new file mode 100644
index 0000000..b762ff2
--- /dev/null
+++ b/icc2ps/README.foo2zjs
@@ -0,0 +1,7 @@
+This is a small piece of "Little CMS" (lcms), v1.15, repackaged for use with
+foo2zjs, but otherwise unmodified.
+
+If you would like the full lcms package, get it from here:
+ http://www.littlecms.com
+
+-Rick
diff --git a/icc2ps/cmscam02.c b/icc2ps/cmscam02.c
new file mode 100644
index 0000000..ae6f2eb
--- /dev/null
+++ b/icc2ps/cmscam02.c
@@ -0,0 +1,484 @@
+//
+// Little cms
+// Copyright (C) 1998-2005 Marti Maria
+//
+// Permission is hereby granted, free of charge, to any person obtaining
+// a copy of this software and associated documentation files (the "Software"),
+// to deal in the Software without restriction, including without limitation
+// the rights to use, copy, modify, merge, publish, distribute, sublicense,
+// and/or sell copies of the Software, and to permit persons to whom the Software
+// is furnished to do so, subject to the following conditions:
+//
+// The above copyright notice and this permission notice shall be included in
+// all copies or substantial portions of the Software.
+//
+// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
+// EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO
+// THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
+// NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
+// LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
+// OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
+// WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
+
+
+
+// CIECAM 02 appearance model
+
+#include "lcms.h"
+
+
+LCMSAPI LCMSHANDLE LCMSEXPORT cmsCIECAM02Init(LPcmsViewingConditions pVC);
+LCMSAPI void LCMSEXPORT cmsCIECAM02Done(LCMSHANDLE hModel);
+LCMSAPI void LCMSEXPORT cmsCIECAM02Forward(LCMSHANDLE hModel, LPcmsCIEXYZ pIn, LPcmsJCh pOut);
+LCMSAPI void LCMSEXPORT cmsCIECAM02Reverse(LCMSHANDLE hModel, LPcmsJCh pIn, LPcmsCIEXYZ pOut);
+
+
+// ---------- Implementation --------------------------------------------
+
+typedef struct {
+
+ double XYZ[3];
+ double RGB[3];
+ double RGBc[3];
+ double RGBp[3];
+ double RGBpa[3];
+ double a, b, h, e, H, A, J, Q, s, t, C, M;
+ double abC[2];
+ double abs[2];
+ double abM[2];
+
+} CAM02COLOR, *LPCAM02COLOR;
+
+typedef struct {
+
+ CAM02COLOR adoptedWhite;
+ double LA, Yb;
+ double F, c, Nc;
+ int surround;
+ double n, Nbb, Ncb, z, FL, D;
+
+} cmsCIECAM02, *LPcmsCIECAM02;
+
+
+static
+double compute_n(LPcmsCIECAM02 pMod)
+{
+ return(pMod -> Yb / pMod -> adoptedWhite.XYZ[1]);
+}
+
+static
+double compute_z(LPcmsCIECAM02 pMod)
+{
+ return(1.48 + pow(pMod -> n, 0.5));
+}
+
+static
+double computeNbb(LPcmsCIECAM02 pMod)
+{
+ return(0.725 * pow((1.0 / pMod -> n), 0.2));
+}
+
+static
+double computeFL(LPcmsCIECAM02 pMod)
+{
+ double k, FL;
+
+ k = 1.0 / ((5.0 * pMod->LA) + 1.0);
+ FL = 0.2 * pow(k, 4.0) * (5.0 * pMod->LA) + 0.1 *
+ (pow((1.0 - pow(k, 4.0)), 2.0)) *
+ (pow((5.0 * pMod->LA), (1.0 / 3.0)));
+
+ return FL;
+}
+
+static
+double computeD(LPcmsCIECAM02 pMod)
+{
+ double D;
+
+ D = pMod->F - (1.0/3.6)*(exp(((-pMod ->LA-42) / 92.0)));
+
+ return D;
+}
+
+
+static
+CAM02COLOR XYZtoCAT02(CAM02COLOR clr)
+{
+ clr.RGB[0] = (clr.XYZ[0] * 0.7328) + (clr.XYZ[1] * 0.4296) + (clr.XYZ[2] * -0.1624);
+ clr.RGB[1] = (clr.XYZ[0] * -0.7036) + (clr.XYZ[1] * 1.6975) + (clr.XYZ[2] * 0.0061);
+ clr.RGB[2] = (clr.XYZ[0] * 0.0030) + (clr.XYZ[1] * 0.0136) + (clr.XYZ[2] * 0.9834);
+
+ return clr;
+}
+
+static
+CAM02COLOR ChromaticAdaptation(CAM02COLOR clr, LPcmsCIECAM02 pMod)
+{
+ int i;
+ for (i = 0; i < 3; i++) {
+ clr.RGBc[i] = ((pMod -> adoptedWhite.XYZ[1] *
+ (pMod->D / pMod -> adoptedWhite.RGB[i])) +
+ (1.0 - pMod->D)) * clr.RGB[i];
+ }
+
+ return clr;
+}
+
+
+static
+CAM02COLOR CAT02toHPE (CAM02COLOR clr)
+{
+
+ double M[9];
+
+
+ M[0] =(( 0.38971 * 1.096124) + (0.68898 * 0.454369) + (-0.07868 * -0.009628));
+ M[1] =(( 0.38971 * -0.278869) + (0.68898 * 0.473533) + (-0.07868 * -0.005698));
+ M[2] =(( 0.38971 * 0.182745) + (0.68898 * 0.072098) + (-0.07868 * 1.015326));
+ M[3] =((-0.22981 * 1.096124) + (1.18340 * 0.454369) + ( 0.04641 * -0.009628));
+ M[4] =((-0.22981 * -0.278869) + (1.18340 * 0.473533) + ( 0.04641 * -0.005698));
+ M[5] =((-0.22981 * 0.182745) + (1.18340 * 0.072098) + ( 0.04641 * 1.015326));
+ M[6] =(-0.009628);
+ M[7] =(-0.005698);
+ M[8] =( 1.015326);
+
+ clr.RGBp[0] = (clr.RGBc[0] * M[0]) + (clr.RGBc[1] * M[1]) + (clr.RGBc[2] * M[2]);
+ clr.RGBp[1] = (clr.RGBc[0] * M[3]) + (clr.RGBc[1] * M[4]) + (clr.RGBc[2] * M[5]);
+ clr.RGBp[2] = (clr.RGBc[0] * M[6]) + (clr.RGBc[1] * M[7]) + (clr.RGBc[2] * M[8]);
+
+ return clr;
+}
+
+static
+CAM02COLOR NonlinearCompression(CAM02COLOR clr, LPcmsCIECAM02 pMod)
+{
+ int i;
+ double temp;
+
+ for (i = 0; i < 3; i++) {
+ if (clr.RGBp[i] < 0) {
+
+ temp = pow((-1.0 * pMod->FL * clr.RGBp[i] / 100.0), 0.42);
+ clr.RGBpa[i] = (-1.0 * 400.0 * temp) / (temp + 27.13) + 0.1;
+ }
+ else {
+ temp = pow((pMod->FL * clr.RGBp[i] / 100.0), 0.42);
+ clr.RGBpa[i] = (400.0 * temp) / (temp + 27.13) + 0.1;
+ }
+ }
+ return clr;
+}
+
+static
+CAM02COLOR ComputeCorrelates(CAM02COLOR clr, LPcmsCIECAM02 pMod)
+{
+ double a, b, temp, e, t, r2d, d2r;
+
+ a = clr.RGBpa[0] - (12.0 * clr.RGBpa[1] / 11.0) + (clr.RGBpa[2] / 11.0);
+ b = (clr.RGBpa[0] + clr.RGBpa[1] - (2.0 * clr.RGBpa[2])) / 9.0;
+
+ r2d = (180.0 / 3.141592654);
+ if (a == 0) {
+ if (b == 0) clr.h = 0;
+ else if (b > 0) clr.h = 90;
+ else clr.h = 270;
+ }
+ else if (a > 0) {
+ temp = b / a;
+ if (b > 0) clr.h = (r2d * atan(temp));
+ else if (b == 0) clr.h = 0;
+ else clr.h = (r2d * atan(temp)) + 360;
+ }
+ else {
+ temp = b / a;
+ clr.h = (r2d * atan(temp)) + 180;
+ }
+
+ d2r = (3.141592654 / 180.0);
+ e = ((12500.0 / 13.0) * pMod->Nc * pMod->Ncb) *
+ (cos((clr.h * d2r + 2.0)) + 3.8);
+
+ if (clr.h < 20.14) {
+ temp = ((clr.h + 122.47)/1.2) + ((20.14 - clr.h)/0.8);
+ clr.H = 300 + (100*((clr.h + 122.47)/1.2)) / temp;
+ }
+ else if (clr.h < 90.0) {
+ temp = ((clr.h - 20.14)/0.8) + ((90.00 - clr.h)/0.7);
+ clr.H = (100*((clr.h - 20.14)/0.8)) / temp;
+ }
+ else if (clr.h < 164.25) {
+ temp = ((clr.h - 90.00)/0.7) + ((164.25 - clr.h)/1.0);
+ clr.H = 100 + ((100*((clr.h - 90.00)/0.7)) / temp);
+ }
+ else if (clr.h < 237.53) {
+ temp = ((clr.h - 164.25)/1.0) + ((237.53 - clr.h)/1.2);
+ clr.H = 200 + ((100*((clr.h - 164.25)/1.0)) / temp);
+ }
+ else {
+ temp = ((clr.h - 237.53)/1.2) + ((360 - clr.h + 20.14)/0.8);
+ clr.H = 300 + ((100*((clr.h - 237.53)/1.2)) / temp);
+ }
+
+ clr.A = (((2.0 * clr.RGBpa[0]) + clr.RGBpa[1] +
+ (clr.RGBpa[2] / 20.0)) - 0.305) * pMod->Nbb;
+
+ clr.J = 100.0 * pow((clr.A / pMod->adoptedWhite.A),
+ (pMod->c * pMod->z));
+
+ clr.Q = (4.0 / pMod->c) * pow((clr.J / 100.0), 0.5) *
+ (pMod->adoptedWhite.A + 4.0) * pow(pMod->FL, 0.25);
+
+ t = (e * pow(((a * a) + (b * b)), 0.5)) /
+ (clr.RGBpa[0] + clr.RGBpa[1] +
+ ((21.0 / 20.0) * clr.RGBpa[2]));
+
+ clr.C = pow(t, 0.9) * pow((clr.J / 100.0), 0.5) *
+ pow((1.64 - pow(0.29, pMod->n)), 0.73);
+
+ clr.M = clr.C * pow(pMod->FL, 0.25);
+ clr.s = 100.0 * pow((clr.M / clr.Q), 0.5);
+
+ return clr;
+}
+
+
+static
+CAM02COLOR InverseCorrelates(CAM02COLOR clr, LPcmsCIECAM02 pMod)
+{
+
+ double t, e, p1, p2, p3, p4, p5, hr, d2r;
+ d2r = 3.141592654 / 180.0;
+
+ t = pow( (clr.C / (pow((clr.J / 100.0), 0.5) *
+ (pow((1.64 - pow(0.29, pMod->n)), 0.73)))),
+ (1.0 / 0.9) );
+ e = ((12500.0 / 13.0) * pMod->Nc * pMod->Ncb) *
+ (cos((clr.h * d2r + 2.0)) + 3.8);
+
+ clr.A = pMod->adoptedWhite.A * pow(
+ (clr.J / 100.0),
+ (1.0 / (pMod->c * pMod->z)));
+
+ p1 = e / t;
+ p2 = (clr.A / pMod->Nbb) + 0.305;
+ p3 = 21.0 / 20.0;
+
+ hr = clr.h * d2r;
+
+ if (fabs(sin(hr)) >= fabs(cos(hr))) {
+ p4 = p1 / sin(hr);
+ clr.b = (p2 * (2.0 + p3) * (460.0 / 1403.0)) /
+ (p4 + (2.0 + p3) * (220.0 / 1403.0) *
+ (cos(hr) / sin(hr)) - (27.0 / 1403.0) +
+ p3 * (6300.0 / 1403.0));
+ clr.a = clr.b * (cos(hr) / sin(hr));
+ }
+ else {
+ p5 = p1 / cos(hr);
+ clr.a = (p2 * (2.0 + p3) * (460.0 / 1403.0)) /
+ (p5 + (2.0 + p3) * (220.0 / 1403.0) -
+ ((27.0 / 1403.0) - p3 * (6300.0 / 1403.0)) *
+ (sin(hr) / cos(hr)));
+ clr.b = clr.a * (sin(hr) / cos(hr));
+ }
+
+ clr.RGBpa[0] = ((460.0 / 1403.0) * p2) +
+ ((451.0 / 1403.0) * clr.a) +
+ ((288.0 / 1403.0) * clr.b);
+ clr.RGBpa[1] = ((460.0 / 1403.0) * p2) -
+ ((891.0 / 1403.0) * clr.a) -
+ ((261.0 / 1403.0) * clr.b);
+ clr.RGBpa[2] = ((460.0 / 1403.0) * p2) -
+ ((220.0 / 1403.0) * clr.a) -
+ ((6300.0 / 1403.0) * clr.b);
+
+ return clr;
+}
+
+static
+CAM02COLOR InverseNonlinearity(CAM02COLOR clr, LPcmsCIECAM02 pMod)
+{
+ int i;
+ double c1;
+
+ for (i = 0; i < 3; i++) {
+ if ((clr.RGBpa[i] - 0.1) < 0) c1 = -1;
+ else c1 = 1;
+ clr.RGBp[i] = c1 * (100.0 / pMod->FL) *
+ pow(((27.13 * fabs(clr.RGBpa[i] - 0.1)) /
+ (400.0 - fabs(clr.RGBpa[i] - 0.1))),
+ (1.0 / 0.42));
+ }
+
+ return clr;
+}
+
+static
+CAM02COLOR HPEtoCAT02(CAM02COLOR clr)
+{
+ double M[9];
+
+ M[0] = (( 0.7328 * 1.910197) + (0.4296 * 0.370950));
+ M[1] = (( 0.7328 * -1.112124) + (0.4296 * 0.629054));
+ M[2] = (( 0.7328 * 0.201908) + (0.4296 * 0.000008) - 0.1624);
+ M[3] = ((-0.7036 * 1.910197) + (1.6975 * 0.370950));
+ M[4] = ((-0.7036 * -1.112124) + (1.6975 * 0.629054));
+ M[5] = ((-0.7036 * 0.201908) + (1.6975 * 0.000008) + 0.0061);
+ M[6] = (( 0.0030 * 1.910197) + (0.0136 * 0.370950));
+ M[7] = (( 0.0030 * -1.112124) + (0.0136 * 0.629054));
+ M[8] = (( 0.0030 * 0.201908) + (0.0136 * 0.000008) + 0.9834);;
+
+ clr.RGBc[0] = (clr.RGBp[0] * M[0]) + (clr.RGBp[1] * M[1]) + (clr.RGBp[2] * M[2]);
+ clr.RGBc[1] = (clr.RGBp[0] * M[3]) + (clr.RGBp[1] * M[4]) + (clr.RGBp[2] * M[5]);
+ clr.RGBc[2] = (clr.RGBp[0] * M[6]) + (clr.RGBp[1] * M[7]) + (clr.RGBp[2] * M[8]);
+ return (clr);
+}
+
+
+static
+CAM02COLOR InverseChromaticAdaptation(CAM02COLOR clr, LPcmsCIECAM02 pMod)
+{
+ int i;
+ for (i = 0; i < 3; i++) {
+ clr.RGB[i] = clr.RGBc[i] /
+ ((pMod->adoptedWhite.XYZ[1] * pMod->D / pMod->adoptedWhite.RGB[i]) + 1.0 - pMod->D);
+ }
+ return(clr);
+}
+
+
+static
+CAM02COLOR CAT02toXYZ(CAM02COLOR clr)
+{
+ clr.XYZ[0] = (clr.RGB[0] * 1.096124) + (clr.RGB[1] * -0.278869) + (clr.RGB[2] * 0.182745);
+ clr.XYZ[1] = (clr.RGB[0] * 0.454369) + (clr.RGB[1] * 0.473533) + (clr.RGB[2] * 0.072098);
+ clr.XYZ[2] = (clr.RGB[0] * -0.009628) + (clr.RGB[1] * -0.005698) + (clr.RGB[2] * 1.015326);
+
+ return(clr);
+}
+
+
+
+
+LCMSHANDLE LCMSEXPORT cmsCIECAM02Init(LPcmsViewingConditions pVC)
+{
+ LPcmsCIECAM02 lpMod;
+
+
+ if((lpMod = (LPcmsCIECAM02) malloc(sizeof(cmsCIECAM02))) == NULL) {
+ return (LCMSHANDLE) NULL;
+ }
+
+
+ ZeroMemory(lpMod, sizeof(cmsCIECAM02));
+
+ lpMod ->adoptedWhite.XYZ[0] = pVC ->whitePoint.X;
+ lpMod ->adoptedWhite.XYZ[1] = pVC ->whitePoint.Y;
+ lpMod ->adoptedWhite.XYZ[2] = pVC ->whitePoint.Z;
+
+ lpMod -> LA = pVC ->La;
+ lpMod -> Yb = pVC ->Yb;
+ lpMod -> D = pVC ->D_value;
+ lpMod -> surround = pVC ->surround;
+
+ switch (lpMod -> surround) {
+
+ case AVG_SURROUND_4:
+ lpMod->F = 1.0; // Not included in CAM02
+ lpMod->c = 0.69;
+ lpMod->Nc = 1.0;
+ break;
+
+ case CUTSHEET_SURROUND:
+ lpMod->F = 0.8;
+ lpMod->c = 0.41;
+ lpMod->Nc = 0.8;
+ break;
+
+ case DARK_SURROUND:
+ lpMod -> F = 0.8;
+ lpMod -> c = 0.525;
+ lpMod -> Nc = 0.8;
+ break;
+
+
+ case DIM_SURROUND:
+ lpMod -> F = 0.9;
+ lpMod -> c = 0.59;
+ lpMod -> Nc = 0.95;
+ break;
+
+ default:
+ // Average surround
+ lpMod -> F = 1.0;
+ lpMod -> c = 0.69;
+ lpMod -> Nc = 1.0;
+ }
+
+ lpMod -> n = compute_n(lpMod);
+ lpMod -> z = compute_z(lpMod);
+ lpMod -> Nbb = computeNbb(lpMod);
+ lpMod -> FL = computeFL(lpMod);
+ lpMod -> D = computeD(lpMod);
+ lpMod -> Ncb = lpMod -> Nbb;
+
+ lpMod -> adoptedWhite = XYZtoCAT02(lpMod -> adoptedWhite);
+ lpMod -> adoptedWhite = ChromaticAdaptation(lpMod -> adoptedWhite, lpMod);
+ lpMod -> adoptedWhite = CAT02toHPE(lpMod -> adoptedWhite);
+ lpMod -> adoptedWhite = NonlinearCompression(lpMod -> adoptedWhite, lpMod);
+ lpMod -> adoptedWhite = ComputeCorrelates(lpMod -> adoptedWhite, lpMod);
+
+ return (LCMSHANDLE) lpMod;
+
+}
+
+void LCMSEXPORT cmsCIECAM02Done(LCMSHANDLE hModel)
+{
+ LPcmsCIECAM02 lpMod = (LPcmsCIECAM02) (LPSTR) hModel;
+ if (lpMod) free(lpMod);
+}
+
+
+void LCMSEXPORT cmsCIECAM02Forward(LCMSHANDLE hModel, LPcmsCIEXYZ pIn, LPcmsJCh pOut)
+{
+ CAM02COLOR clr;
+ LPcmsCIECAM02 lpMod = (LPcmsCIECAM02) (LPSTR) hModel;
+
+ clr.XYZ[0] = pIn ->X;
+ clr.XYZ[1] = pIn ->Y;
+ clr.XYZ[2] = pIn ->Z;
+
+ clr = XYZtoCAT02(clr);
+ clr = ChromaticAdaptation(clr, lpMod);
+ clr = CAT02toHPE(clr);
+ clr = NonlinearCompression(clr, lpMod);
+ clr = ComputeCorrelates(clr, lpMod);
+
+ pOut ->J = clr.J;
+ pOut ->C = clr.C;
+ pOut ->h = clr.h;
+}
+
+void LCMSEXPORT cmsCIECAM02Reverse(LCMSHANDLE hModel, LPcmsJCh pIn, LPcmsCIEXYZ pOut)
+{
+ CAM02COLOR clr;
+ LPcmsCIECAM02 lpMod = (LPcmsCIECAM02) (LPSTR) hModel;
+
+
+ clr.J = pIn -> J;
+ clr.C = pIn -> C;
+ clr.h = pIn -> h;
+
+ clr = InverseCorrelates(clr, lpMod);
+ clr = InverseNonlinearity(clr, lpMod);
+ clr = HPEtoCAT02(clr);
+ clr = InverseChromaticAdaptation(clr, lpMod);
+ clr = CAT02toXYZ(clr);
+
+ pOut ->X = clr.XYZ[0];
+ pOut ->Y = clr.XYZ[1];
+ pOut ->Z = clr.XYZ[2];
+
+}
+
diff --git a/icc2ps/cmscam97.c b/icc2ps/cmscam97.c
new file mode 100644
index 0000000..494fab0
--- /dev/null
+++ b/icc2ps/cmscam97.c
@@ -0,0 +1,721 @@
+//
+// Little cms
+// Copyright (C) 1998-2005 Marti Maria
+//
+// Permission is hereby granted, free of charge, to any person obtaining
+// a copy of this software and associated documentation files (the "Software"),
+// to deal in the Software without restriction, including without limitation
+// the rights to use, copy, modify, merge, publish, distribute, sublicense,
+// and/or sell copies of the Software, and to permit persons to whom the Software
+// is furnished to do so, subject to the following conditions:
+//
+// The above copyright notice and this permission notice shall be included in
+// all copies or substantial portions of the Software.
+//
+// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
+// EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO
+// THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
+// NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
+// LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
+// OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
+// WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
+
+
+#include "lcms.h"
+
+
+/*
+typedef struct {
+ double J;
+ double C;
+ double h;
+
+ } cmsJCh, FAR* LPcmsJCh;
+
+
+#define AVG_SURROUND_4 0
+#define AVG_SURROUND 1
+#define DIM_SURROUND 2
+#define DARK_SURROUND 3
+#define CUTSHEET_SURROUND 4
+
+
+typedef struct {
+
+ cmsCIEXYZ whitePoint;
+ double Yb;
+ double La;
+ int surround;
+ double D_value;
+
+ } cmsViewingConditions, FAR* LPcmsViewingConditions;
+
+
+
+LCMSAPI LCMSHANDLE LCMSEXPORT cmsCIECAM97sInit(LPcmsViewingConditions pVC);
+LCMSAPI void LCMSEXPORT cmsCIECAM97sDone(LCMSHANDLE hModel);
+LCMSAPI void LCMSEXPORT cmsCIECAM97sForward(LCMSHANDLE hModel, LPcmsCIEXYZ pIn, LPcmsJCh pOut);
+LCMSAPI void LCMSEXPORT cmsCIECAM97sReverse(LCMSHANDLE hModel, LPcmsJCh pIn, LPcmsCIEXYZ pOut);
+
+*/
+
+// ---------- Implementation --------------------------------------------
+
+// #define USE_CIECAM97s2 1
+
+#ifdef USE_CIECAM97s2
+
+# define NOISE_CONSTANT 3.05
+#else
+# define NOISE_CONSTANT 2.05
+#endif
+
+
+/*
+ The model input data are the adapting field luminance in cd/m2
+ (normally taken to be 20% of the luminance of white in the adapting field),
+ LA , the relative tristimulus values of the stimulus, XYZ, the relative
+ tristimulus values of white in the same viewing conditions, Xw Yw Zw ,
+ and the relative luminance of the background, Yb . Relative tristimulus
+ values should be expressed on a scale from Y = 0 for a perfect black
+ to Y = 100 for a perfect reflecting diffuser. Additionally, the
+ parameters c, for the impact of surround, Nc , a chromatic induction factor,
+ and F, a factor for degree of adaptation, must be selected according to the
+ guidelines in table
+
+ All CIE tristimulus values are obtained using the CIE 1931
+ Standard Colorimetric Observer (2°).
+
+*/
+
+typedef struct {
+
+ cmsCIEXYZ WP;
+ int surround;
+ int calculate_D;
+
+ double Yb; // rel. luminance of background
+
+ cmsCIEXYZ RefWhite;
+
+ double La; // The adapting field luminance in cd/m2
+
+ double c; // Impact of surround
+ double Nc; // Chromatic induction factor
+ double Fll; // Lightness contrast factor (Removed on rev 2)
+ double F; // Degree of adaptation
+
+
+ double k;
+ double Fl;
+
+ double Nbb; // The background and chromatic brightness induction factors.
+ double Ncb;
+ double z; // base exponential nonlinearity
+ double n; // background induction factor
+ double D;
+
+ MAT3 MlamRigg;
+ MAT3 MlamRigg_1;
+
+ MAT3 Mhunt;
+ MAT3 Mhunt_1;
+
+ MAT3 Mhunt_x_MlamRigg_1;
+ MAT3 MlamRigg_x_Mhunt_1;
+
+
+ VEC3 RGB_subw;
+ VEC3 RGB_subw_prime;
+
+ double p;
+
+ VEC3 RGB_subwc;
+
+ VEC3 RGB_subaw_prime;
+ double A_subw;
+ double Q_subw;
+
+ } cmsCIECAM97s,FAR *LPcmsCIECAM97s;
+
+
+
+// Free model structure
+
+LCMSAPI void LCMSEXPORT cmsCIECAM97sDone(LCMSHANDLE hModel)
+{
+ LPcmsCIECAM97s lpMod = (LPcmsCIECAM97s) (LPSTR) hModel;
+ if (lpMod) free(lpMod);
+}
+
+// Partial discounting for adaptation degree computation
+
+static
+double discount(double d, double chan)
+{
+ return (d * chan + 1 - d);
+}
+
+
+// This routine does model exponential nonlinearity on the short wavelenght
+// sensitive channel. On CIECAM97s rev 2 this has been reverted to linear.
+
+static
+void FwAdaptationDegree(LPcmsCIECAM97s lpMod, LPVEC3 RGBc, LPVEC3 RGB)
+{
+
+
+#ifdef USE_CIECAM97s2
+ RGBc->n[0] = RGB->n[0]* discount(lpMod->D, 100.0/lpMod->RGB_subw.n[0]);
+ RGBc->n[1] = RGB->n[1]* discount(lpMod->D, 100.0/lpMod->RGB_subw.n[1]);
+ RGBc->n[2] = RGB->n[2]* discount(lpMod->D, 100.0/lpMod->RGB_subw.n[2]);
+#else
+
+ RGBc->n[0] = RGB->n[0]* discount(lpMod->D, 1.0/lpMod->RGB_subw.n[0]);
+ RGBc->n[1] = RGB->n[1]* discount(lpMod->D, 1.0/lpMod->RGB_subw.n[1]);
+
+ RGBc->n[2] = pow(fabs(RGB->n[2]), lpMod ->p) * discount(lpMod->D, (1.0/pow(lpMod->RGB_subw.n[2], lpMod->p)));
+
+ // If B happens to be negative, Then Bc is also set to be negative
+
+ if (RGB->n[2] < 0)
+ RGBc->n[2] = -RGBc->n[2];
+#endif
+}
+
+
+static
+void RvAdaptationDegree(LPcmsCIECAM97s lpMod, LPVEC3 RGBc, LPVEC3 RGB)
+{
+
+
+#ifdef USE_CIECAM97s2
+ RGBc->n[0] = RGB->n[0]/discount(lpMod->D, 100.0/lpMod->RGB_subw.n[0]);
+ RGBc->n[1] = RGB->n[1]/discount(lpMod->D, 100.0/lpMod->RGB_subw.n[1]);
+ RGBc->n[2] = RGB->n[2]/discount(lpMod->D, 100.0/lpMod->RGB_subw.n[2]);
+#else
+
+ RGBc->n[0] = RGB->n[0]/discount(lpMod->D, 1.0/lpMod->RGB_subw.n[0]);
+ RGBc->n[1] = RGB->n[1]/discount(lpMod->D, 1.0/lpMod->RGB_subw.n[1]);
+ RGBc->n[2] = pow(fabs(RGB->n[2]), 1.0/lpMod->p)/pow(discount(lpMod->D, 1.0/pow(lpMod->RGB_subw.n[2], lpMod->p)), 1.0/lpMod->p);
+ if (RGB->n[2] < 0)
+ RGBc->n[2] = -RGBc->n[2];
+#endif
+}
+
+
+
+static
+void PostAdaptationConeResponses(LPcmsCIECAM97s lpMod, LPVEC3 RGBa_prime, LPVEC3 RGBprime)
+{
+ if (RGBprime->n[0]>=0.0) {
+
+ RGBa_prime->n[0]=((40.0*pow(lpMod -> Fl * RGBprime->n[0]/100.0, 0.73))/(pow(lpMod -> Fl * RGBprime->n[0]/100.0, 0.73)+2))+1;
+ }
+ else
+ {
+ RGBa_prime->n[0]=((-40.0*pow((-lpMod -> Fl * RGBprime->n[0])/100.0, 0.73))/(pow((-lpMod -> Fl * RGBprime->n[0])/100.0, 0.73)+2))+1;
+ }
+
+ if (RGBprime->n[1]>=0.0)
+ {
+ RGBa_prime->n[1]=((40.0*pow(lpMod -> Fl * RGBprime->n[1]/100.0, 0.73))/(pow(lpMod -> Fl * RGBprime->n[1]/100.0, 0.73)+2))+1;
+ }
+ else
+ {
+ RGBa_prime->n[1]=((-40.0*pow((-lpMod -> Fl * RGBprime->n[1])/100.0, 0.73))/(pow((-lpMod -> Fl * RGBprime->n[1])/100.0, 0.73)+2))+1;
+ }
+
+ if (RGBprime->n[2]>=0.0)
+ {
+ RGBa_prime->n[2]=((40.0*pow(lpMod -> Fl * RGBprime->n[2]/100.0, 0.73))/(pow(lpMod -> Fl * RGBprime->n[2]/100.0, 0.73)+2))+1;
+ }
+ else
+ {
+ RGBa_prime->n[2]=((-40.0*pow((-lpMod -> Fl * RGBprime->n[2])/100.0, 0.73))/(pow((-lpMod -> Fl * RGBprime->n[2])/100.0, 0.73)+2))+1;
+ }
+}
+
+
+// Compute hue quadrature, eccentricity factor, e
+
+static
+void ComputeHueQuadrature(double h, double* H, double* e)
+{
+
+
+#define IRED 0
+#define IYELLOW 1
+#define IGREEN 2
+#define IBLUE 3
+
+ double e_tab[] = {0.8, 0.7, 1.0, 1.2};
+ double H_tab[] = { 0, 100, 200, 300};
+ int p1, p2;
+ double e1, e2, h1, h2;
+
+
+ if (h >= 20.14 && h < 90.0) { // Red
+
+ p1 = IRED;
+ p2 = IYELLOW;
+ }
+ else
+ if (h >= 90.0 && h < 164.25) { // Yellow
+
+ p1 = IYELLOW;
+ p2 = IGREEN;
+ }
+ else
+ if (h >= 164.25 && h < 237.53) { // Green
+
+ p1 = IGREEN;
+ p2 = IBLUE; }
+ else { // Blue
+
+ p1 = IBLUE;
+ p2 = IRED;
+ }
+
+ e1 = e_tab[p1]; e2 = e_tab[p2];
+ h1 = H_tab[p1]; h2 = H_tab[p2];
+
+
+
+ *e = e1 + ((e2-e1)*(h-h1)/(h2 - h1));
+ *H = h1 + (100. * (h - h1) / e1) / ((h - h1)/e1 + (h2 - h) / e2);
+
+#undef IRED
+#undef IYELLOW
+#undef IGREEN
+#undef IBLUE
+
+}
+
+
+
+
+
+
+LCMSAPI LCMSHANDLE LCMSEXPORT cmsCIECAM97sInit(LPcmsViewingConditions pVC)
+{
+ LPcmsCIECAM97s lpMod;
+ VEC3 tmp;
+
+ if((lpMod = (LPcmsCIECAM97s) malloc(sizeof(cmsCIECAM97s))) == NULL) {
+ return (LCMSHANDLE) NULL;
+ }
+
+
+ lpMod->WP.X = pVC->whitePoint.X;
+ lpMod->WP.Y = pVC->whitePoint.Y;
+ lpMod->WP.Z = pVC->whitePoint.Z;
+
+ lpMod->Yb = pVC->Yb;
+ lpMod->La = pVC->La;
+
+ lpMod->surround = pVC->surround;
+
+ lpMod->RefWhite.X = 100.0;
+ lpMod->RefWhite.Y = 100.0;
+ lpMod->RefWhite.Z = 100.0;
+
+#ifdef USE_CIECAM97s2
+
+ VEC3init(&lpMod->MlamRigg.v[0], 0.8562, 0.3372, -0.1934);
+ VEC3init(&lpMod->MlamRigg.v[1], -0.8360, 1.8327, 0.0033);
+ VEC3init(&lpMod->MlamRigg.v[2], 0.0357,-0.0469, 1.0112);
+
+ VEC3init(&lpMod->MlamRigg_1.v[0], 0.9874, -0.1768, 0.1894);
+ VEC3init(&lpMod->MlamRigg_1.v[1], 0.4504, 0.4649, 0.0846);
+ VEC3init(&lpMod->MlamRigg_1.v[2],-0.0139, 0.0278, 0.9861);
+
+#else
+ // Bradford transform: Lam-Rigg cone responses
+ VEC3init(&lpMod->MlamRigg.v[0], 0.8951, 0.2664, -0.1614);
+ VEC3init(&lpMod->MlamRigg.v[1], -0.7502, 1.7135, 0.0367);
+ VEC3init(&lpMod->MlamRigg.v[2], 0.0389, -0.0685, 1.0296);
+
+
+ // Inverse of Lam-Rigg
+ VEC3init(&lpMod->MlamRigg_1.v[0], 0.98699, -0.14705, 0.15996);
+ VEC3init(&lpMod->MlamRigg_1.v[1], 0.43231, 0.51836, 0.04929);
+ VEC3init(&lpMod->MlamRigg_1.v[2], -0.00853, 0.04004, 0.96849);
+
+#endif
+
+ // Hunt-Pointer-Estevez cone responses
+ VEC3init(&lpMod->Mhunt.v[0], 0.38971, 0.68898, -0.07868);
+ VEC3init(&lpMod->Mhunt.v[1], -0.22981, 1.18340, 0.04641);
+ VEC3init(&lpMod->Mhunt.v[2], 0.0, 0.0, 1.0);
+
+ // Inverse of Hunt-Pointer-Estevez
+ VEC3init(&lpMod->Mhunt_1.v[0], 1.91019, -1.11214, 0.20195);
+ VEC3init(&lpMod->Mhunt_1.v[1], 0.37095, 0.62905, 0.0);
+ VEC3init(&lpMod->Mhunt_1.v[2], 0.0, 0.0, 1.0);
+
+
+ if (pVC->D_value == -1.0)
+ lpMod->calculate_D = 1;
+ else
+ if (pVC->D_value == -2.0)
+ lpMod->calculate_D = 2;
+ else {
+ lpMod->calculate_D = 0;
+ lpMod->D = pVC->D_value;
+ }
+
+ // Table I (revised)
+
+ switch (lpMod->surround) {
+
+ case AVG_SURROUND_4:
+ lpMod->F = 1.0;
+ lpMod->c = 0.69;
+ lpMod->Fll = 0.0; // Not included on Rev 2
+ lpMod->Nc = 1.0;
+ break;
+ case AVG_SURROUND:
+ lpMod->F = 1.0;
+ lpMod->c = 0.69;
+ lpMod->Fll = 1.0;
+ lpMod->Nc = 1.0;
+ break;
+ case DIM_SURROUND:
+ lpMod->F = 0.99;
+ lpMod->c = 0.59;
+ lpMod->Fll = 1.0;
+ lpMod->Nc = 0.95;
+ break;
+ case DARK_SURROUND:
+ lpMod->F = 0.9;
+ lpMod->c = 0.525;
+ lpMod->Fll = 1.0;
+ lpMod->Nc = 0.8;
+ break;
+ case CUTSHEET_SURROUND:
+ lpMod->F = 0.9;
+ lpMod->c = 0.41;
+ lpMod->Fll = 1.0;
+ lpMod->Nc = 0.8;
+ break;
+ default:
+ lpMod->F = 1.0;
+ lpMod->c = 0.69;
+ lpMod->Fll = 1.0;
+ lpMod->Nc = 1.0;
+ break;
+ }
+
+ lpMod->k = 1 / (5 * lpMod->La + 1);
+ lpMod->Fl = lpMod->La * pow(lpMod->k, 4) + 0.1*pow(1 - pow(lpMod->k, 4), 2.0) * pow(5*lpMod->La, 1.0/3.0);
+
+ if (lpMod->calculate_D > 0) {
+
+ lpMod->D = lpMod->F * (1 - 1 / (1 + 2*pow(lpMod->La, 0.25) + pow(lpMod->La, 2)/300.0));
+ if (lpMod->calculate_D > 1)
+ lpMod->D = (lpMod->D + 1.0) / 2;
+ }
+
+
+ // RGB_subw = [MlamRigg][WP/YWp]
+#ifdef USE_CIECAM97s2
+ MAT3eval(&lpMod -> RGB_subw, &lpMod -> MlamRigg, (LPVEC3) &lpMod -> WP);
+#else
+ VEC3divK(&tmp, (LPVEC3) &lpMod -> WP, lpMod->WP.Y);
+ MAT3eval(&lpMod -> RGB_subw, &lpMod -> MlamRigg, &tmp);
+#endif
+
+
+
+ MAT3per(&lpMod -> Mhunt_x_MlamRigg_1, &lpMod -> Mhunt, &lpMod->MlamRigg_1 );
+ MAT3per(&lpMod -> MlamRigg_x_Mhunt_1, &lpMod -> MlamRigg, &lpMod -> Mhunt_1 );
+
+ // p is used on forward model
+ lpMod->p = pow(lpMod->RGB_subw.n[2], 0.0834);
+
+ FwAdaptationDegree(lpMod, &lpMod->RGB_subwc, &lpMod->RGB_subw);
+
+#if USE_CIECAM97s2
+ MAT3eval(&lpMod->RGB_subw_prime, &lpMod->Mhunt_x_MlamRigg_1, &lpMod -> RGB_subwc);
+#else
+ VEC3perK(&tmp, &lpMod -> RGB_subwc, lpMod->WP.Y);
+ MAT3eval(&lpMod->RGB_subw_prime, &lpMod->Mhunt_x_MlamRigg_1, &tmp);
+#endif
+
+ lpMod->n = lpMod-> Yb / lpMod-> WP.Y;
+
+ lpMod->z = 1 + lpMod->Fll * sqrt(lpMod->n);
+ lpMod->Nbb = lpMod->Ncb = 0.725 / pow(lpMod->n, 0.2);
+
+ PostAdaptationConeResponses(lpMod, &lpMod->RGB_subaw_prime, &lpMod->RGB_subw_prime);
+
+ lpMod->A_subw=lpMod->Nbb*(2.0*lpMod->RGB_subaw_prime.n[0]+lpMod->RGB_subaw_prime.n[1]+lpMod->RGB_subaw_prime.n[2]/20.0-NOISE_CONSTANT);
+
+ return (LCMSHANDLE) lpMod;
+}
+
+
+
+
+//
+// The forward model: XYZ -> JCh
+//
+
+LCMSAPI void LCMSEXPORT cmsCIECAM97sForward(LCMSHANDLE hModel, LPcmsCIEXYZ inPtr, LPcmsJCh outPtr)
+{
+
+ LPcmsCIECAM97s lpMod = (LPcmsCIECAM97s) (LPSTR) hModel;
+ double a, b, h, s, H1val, es, A;
+ VEC3 In, RGB, RGBc, RGBprime, RGBa_prime;
+
+ if (inPtr -> Y <= 0.0) {
+
+ outPtr -> J = outPtr -> C = outPtr -> h = 0.0;
+ return;
+ }
+
+ // An initial chromatic adaptation transform is used to go from the source
+ // viewing conditions to corresponding colours under the equal-energy-illuminant
+ // reference viewing conditions. This is handled differently on rev 2
+
+ VEC3init(&In, inPtr -> X, inPtr -> Y, inPtr -> Z); // 2.1
+
+#ifdef USE_CIECAM97s2
+ // Since the chromatic adaptation transform has been linearized, it
+ // is no longer required to divide the stimulus tristimulus values
+ // by their own Y tristimulus value prior to the chromatic adaptation.
+#else
+ VEC3divK(&In, &In, inPtr -> Y);
+#endif
+
+ MAT3eval(&RGB, &lpMod -> MlamRigg, &In); // 2.2
+
+ FwAdaptationDegree(lpMod, &RGBc, &RGB);
+
+ // The post-adaptation signals for both the sample and the white are then
+ // transformed from the sharpened cone responses to the Hunt-Pointer-Estevez
+ // cone responses.
+#ifdef USE_CIECAM97s2
+#else
+ VEC3perK(&RGBc, &RGBc, inPtr->Y);
+#endif
+
+ MAT3eval(&RGBprime, &lpMod->Mhunt_x_MlamRigg_1, &RGBc);
+
+ // The post-adaptation cone responses (for both the stimulus and the white)
+ // are then calculated.
+
+ PostAdaptationConeResponses(lpMod, &RGBa_prime, &RGBprime);
+
+ // Preliminary red-green and yellow-blue opponent dimensions are calculated
+
+ a = RGBa_prime.n[0] - (12.0 * RGBa_prime.n[1] / 11.0) + RGBa_prime.n[2]/11.0;
+ b = (RGBa_prime.n[0] + RGBa_prime.n[1] - 2.0 * RGBa_prime.n[2]) / 9.0;
+
+
+ // The CIECAM97s hue angle, h, is then calculated
+ h = (180.0/M_PI)*(atan2(b, a));
+
+
+ while (h < 0)
+ h += 360.0;
+
+ outPtr->h = h;
+
+ // hue quadrature and eccentricity factors, e, are calculated
+
+ ComputeHueQuadrature(h, &H1val, &es);
+
+ // ComputeHueQuadrature(h, &H1val, &h1, &e1, &h2, &e2, &es);
+
+
+ // The achromatic response A
+ A = lpMod->Nbb * (2.0 * RGBa_prime.n[0] + RGBa_prime.n[1] + RGBa_prime.n[2]/20.0 - NOISE_CONSTANT);
+
+ // CIECAM97s Lightness J
+ outPtr -> J = 100.0 * pow(A / lpMod->A_subw, lpMod->c * lpMod->z);
+
+ // CIECAM97s saturation s
+ s = (50 * hypot (a, b) * 100 * es * (10.0/13.0) * lpMod-> Nc * lpMod->Ncb) / (RGBa_prime.n[0] + RGBa_prime.n[1] + 1.05 * RGBa_prime.n[2]);
+
+ // CIECAM97s Chroma C
+
+#ifdef USE_CIECAM97s2
+ // Eq. 26 has been modified to allow accurate prediction of the Munsell chroma scales.
+ outPtr->C = 0.7487 * pow(s, 0.973) * pow(outPtr->J/100.0, 0.945 * lpMod->n) * (1.64 - pow(0.29, lpMod->n));
+
+#else
+ outPtr->C = 2.44 * pow(s, 0.69) * pow(outPtr->J/100.0, 0.67 * lpMod->n) * (1.64 - pow(0.29, lpMod->n));
+#endif
+}
+
+
+//
+// The reverse model JCh -> XYZ
+//
+
+
+LCMSAPI void LCMSEXPORT cmsCIECAM97sReverse(LCMSHANDLE hModel, LPcmsJCh inPtr, LPcmsCIEXYZ outPtr)
+{
+ LPcmsCIECAM97s lpMod = (LPcmsCIECAM97s) (LPSTR) hModel;
+ double J, C, h, A, H1val, es, s, a, b;
+ double tan_h, sec_h;
+ double R_suba_prime, G_suba_prime, B_suba_prime;
+ double R_prime, G_prime, B_prime;
+ double Y_subc, Y_prime, B_term;
+ VEC3 tmp;
+ VEC3 RGB_prime, RGB_subc_Y;
+ VEC3 Y_over_Y_subc_RGB;
+ VEC3 XYZ_primeprime_over_Y_subc;
+#ifdef USE_CIECAM92s2
+ VEC3 RGBY;
+ VEC3 Out;
+#endif
+
+ J = inPtr->J;
+ h = inPtr->h;
+ C = inPtr->C;
+
+ if (J <= 0) {
+
+ outPtr->X = 0.0;
+ outPtr->Y = 0.0;
+ outPtr->Z = 0.0;
+ return;
+ }
+
+
+
+ // (2) From J Obtain A
+
+ A = pow(J/100.0, 1/(lpMod->c * lpMod->z)) * lpMod->A_subw;
+
+
+ // (3), (4), (5) Using H Determine h1, h2, e1, e2
+ // e1 and h1 are the values of e and h for the unique hue having the
+ // nearest lower valur of h and e2 and h2 are the values of e and h for
+ // the unique hue having the nearest higher value of h.
+
+
+ ComputeHueQuadrature(h, &H1val, &es);
+
+ // (7) Calculate s
+
+ s = pow(C / (2.44 * pow(J/100.0, 0.67*lpMod->n) * (1.64 - pow(0.29, lpMod->n))) , (1./0.69));
+
+
+ // (8) Calculate a and b.
+ // NOTE: sqrt(1 + tan^2) == sec(h)
+
+ tan_h = tan ((M_PI/180.)*(h));
+ sec_h = sqrt(1 + tan_h * tan_h);
+
+ if ((h > 90) && (h < 270))
+ sec_h = -sec_h;
+
+ a = s * ( A/lpMod->Nbb + NOISE_CONSTANT) / ( sec_h * 50000.0 * es * lpMod->Nc * lpMod->Ncb/ 13.0 +
+ s * (11.0 / 23.0 + (108.0/23.0) * tan_h));
+
+ b = a * tan_h;
+
+ //(9) Calculate R'a G'a and B'a
+
+ R_suba_prime = (20.0/61.0) * (A/lpMod->Nbb + NOISE_CONSTANT) + (41.0/61.0) * (11.0/23.0) * a + (288.0/61.0) / 23.0 * b;
+ G_suba_prime = (20.0/61.0) * (A/lpMod->Nbb + NOISE_CONSTANT) - (81.0/61.0) * (11.0/23.0) * a - (261.0/61.0) / 23.0 * b;
+ B_suba_prime = (20.0/61.0) * (A/lpMod->Nbb + NOISE_CONSTANT) - (20.0/61.0) * (11.0/23.0) * a - (20.0/61.0) * (315.0/23.0) * b;
+
+ // (10) Calculate R', G' and B'
+
+ if ((R_suba_prime - 1) < 0) {
+
+ R_prime = -100.0 * pow((2.0 - 2.0 * R_suba_prime) /
+ (39.0 + R_suba_prime), 1.0/0.73);
+ }
+ else
+ {
+ R_prime = 100.0 * pow((2.0 * R_suba_prime - 2.0) /
+ (41.0 - R_suba_prime), 1.0/0.73);
+ }
+
+ if ((G_suba_prime - 1) < 0)
+ {
+ G_prime = -100.0 * pow((2.0 - 2.0 * G_suba_prime) /
+ (39.0 + G_suba_prime), 1.0/0.73);
+ }
+ else
+ {
+ G_prime = 100.0 * pow((2.0 * G_suba_prime - 2.0) /
+ (41.0 - G_suba_prime), 1.0/0.73);
+ }
+
+ if ((B_suba_prime - 1) < 0)
+ {
+ B_prime = -100.0 * pow((2.0 - 2.0 * B_suba_prime) /
+ (39.0 + B_suba_prime), 1.0/0.73);
+ }
+ else
+ {
+ B_prime = 100.0 * pow((2.0 * B_suba_prime - 2.0) /
+ (41.0 - B_suba_prime), 1.0/0.73);
+ }
+
+
+ // (11) Calculate RcY, GcY and BcY
+
+ VEC3init(&RGB_prime, R_prime, G_prime, B_prime);
+ VEC3divK(&tmp, &RGB_prime, lpMod -> Fl);
+
+ MAT3eval(&RGB_subc_Y, &lpMod->MlamRigg_x_Mhunt_1, &tmp);
+
+
+
+
+#ifdef USE_CIECAM97s2
+
+ // (12)
+
+
+ RvAdaptationDegree(lpMod, &RGBY, &RGB_subc_Y);
+ MAT3eval(&Out, &lpMod->MlamRigg_1, &RGBY);
+
+ outPtr -> X = Out.n[0];
+ outPtr -> Y = Out.n[1];
+ outPtr -> Z = Out.n[2];
+
+#else
+
+ // (12) Calculate Yc
+
+ Y_subc = 0.43231*RGB_subc_Y.n[0]+0.51836*RGB_subc_Y.n[1]+0.04929*RGB_subc_Y.n[2];
+
+ // (13) Calculate (Y/Yc)R, (Y/Yc)G and (Y/Yc)B
+
+ VEC3divK(&RGB_subc_Y, &RGB_subc_Y, Y_subc);
+ RvAdaptationDegree(lpMod, &Y_over_Y_subc_RGB, &RGB_subc_Y);
+
+ // (14) Calculate Y'
+ Y_prime = 0.43231*(Y_over_Y_subc_RGB.n[0]*Y_subc) + 0.51836*(Y_over_Y_subc_RGB.n[1]*Y_subc) + 0.04929 * (Y_over_Y_subc_RGB.n[2]*Y_subc);
+
+ if (Y_prime < 0 || Y_subc < 0)
+ {
+ // Discard to near black point
+
+ outPtr -> X = 0;
+ outPtr -> Y = 0;
+ outPtr -> Z = 0;
+ return;
+ }
+
+ B_term = pow(Y_prime / Y_subc, (1.0 / lpMod->p) - 1);
+
+ // (15) Calculate X'', Y'' and Z''
+ Y_over_Y_subc_RGB.n[2] /= B_term;
+ MAT3eval(&XYZ_primeprime_over_Y_subc, &lpMod->MlamRigg_1, &Y_over_Y_subc_RGB);
+
+ outPtr->X = XYZ_primeprime_over_Y_subc.n[0] * Y_subc;
+ outPtr->Y = XYZ_primeprime_over_Y_subc.n[1] * Y_subc;
+ outPtr->Z = XYZ_primeprime_over_Y_subc.n[2] * Y_subc;
+#endif
+
+}
diff --git a/icc2ps/cmscgats.c b/icc2ps/cmscgats.c
new file mode 100644
index 0000000..7c8f52c
--- /dev/null
+++ b/icc2ps/cmscgats.c
@@ -0,0 +1,2348 @@
+//
+// Little cms
+// Copyright (C) 1998-2005 Marti Maria
+//
+// Permission is hereby granted, free of charge, to any person obtaining
+// a copy of this software and associated documentation files (the "Software"),
+// to deal in the Software without restriction, including without limitation
+// the rights to use, copy, modify, merge, publish, distribute, sublicense,
+// and/or sell copies of the Software, and to permit persons to whom the Software
+// is furnished to do so, subject to the following conditions:
+//
+// The above copyright notice and this permission notice shall be included in
+// all copies or substantial portions of the Software.
+//
+// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
+// EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO
+// THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
+// NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
+// LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
+// OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
+// WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
+//
+// IT8.7 / CGATS.17-200x handling
+
+#include "lcms.h"
+
+
+LCMSAPI LCMSHANDLE LCMSEXPORT cmsIT8Alloc(void);
+LCMSAPI void LCMSEXPORT cmsIT8Free(LCMSHANDLE IT8);
+
+// Tables
+
+LCMSAPI int LCMSEXPORT cmsIT8TableCount(LCMSHANDLE IT8);
+LCMSAPI int LCMSEXPORT cmsIT8SetTable(LCMSHANDLE IT8, int nTable);
+
+// Persistence
+LCMSAPI LCMSHANDLE LCMSEXPORT cmsIT8LoadFromFile(const char* cFileName);
+LCMSAPI LCMSHANDLE LCMSEXPORT cmsIT8LoadFromMem(void *Ptr, size_t len);
+LCMSAPI BOOL LCMSEXPORT cmsIT8SaveToFile(LCMSHANDLE IT8, const char* cFileName);
+
+// Properties
+LCMSAPI const char* LCMSEXPORT cmsIT8GetSheetType(LCMSHANDLE hIT8);
+LCMSAPI BOOL LCMSEXPORT cmsIT8SetSheetType(LCMSHANDLE hIT8, const char* Type);
+
+LCMSAPI BOOL LCMSEXPORT cmsIT8SetComment(LCMSHANDLE hIT8, const char* cComment);
+
+LCMSAPI BOOL LCMSEXPORT cmsIT8SetPropertyStr(LCMSHANDLE hIT8, const char* cProp, const char *Str);
+LCMSAPI BOOL LCMSEXPORT cmsIT8SetPropertyDbl(LCMSHANDLE hIT8, const char* cProp, double Val);
+LCMSAPI BOOL LCMSEXPORT cmsIT8SetPropertyHex(LCMSHANDLE hIT8, const char* cProp, int Val);
+LCMSAPI BOOL LCMSEXPORT cmsIT8SetPropertyUncooked(LCMSHANDLE hIT8, const char* Key, const char* Buffer);
+
+LCMSAPI const char* LCMSEXPORT cmsIT8GetProperty(LCMSHANDLE hIT8, const char* cProp);
+LCMSAPI double LCMSEXPORT cmsIT8GetPropertyDbl(LCMSHANDLE hIT8, const char* cProp);
+LCMSAPI int LCMSEXPORT cmsIT8EnumProperties(LCMSHANDLE IT8, char ***PropertyNames);
+
+// Datasets
+
+LCMSAPI const char* LCMSEXPORT cmsIT8GetPatchName(LCMSHANDLE hIT8, int nPatch, char* buffer);
+
+LCMSAPI const char* LCMSEXPORT cmsIT8GetDataRowCol(LCMSHANDLE IT8, int row, int col);
+LCMSAPI double LCMSEXPORT cmsIT8GetDataRowColDbl(LCMSHANDLE IT8, int col, int row);
+
+LCMSAPI BOOL LCMSEXPORT cmsIT8SetDataRowCol(LCMSHANDLE hIT8, int row, int col,
+ const char* Val);
+
+LCMSAPI BOOL LCMSEXPORT cmsIT8SetDataRowColDbl(LCMSHANDLE hIT8, int row, int col,
+ double Val);
+
+LCMSAPI const char* LCMSEXPORT cmsIT8GetData(LCMSHANDLE IT8, const char* cPatch, const char* cSample);
+
+
+LCMSAPI double LCMSEXPORT cmsIT8GetDataDbl(LCMSHANDLE IT8, const char* cPatch, const char* cSample);
+
+LCMSAPI BOOL LCMSEXPORT cmsIT8SetData(LCMSHANDLE IT8, const char* cPatch,
+ const char* cSample,
+ const char *Val);
+
+LCMSAPI BOOL LCMSEXPORT cmsIT8SetDataDbl(LCMSHANDLE hIT8, const char* cPatch,
+ const char* cSample,
+ double Val);
+
+LCMSAPI BOOL LCMSEXPORT cmsIT8SetDataFormat(LCMSHANDLE IT8, int n, const char *Sample);
+LCMSAPI int LCMSEXPORT cmsIT8EnumDataFormat(LCMSHANDLE IT8, char ***SampleNames);
+
+LCMSAPI void LCMSEXPORT cmsIT8DefineDblFormat(LCMSHANDLE IT8, const char* Formatter);
+
+LCMSAPI int LCMSEXPORT cmsIT8SetTableByLabel(LCMSHANDLE hIT8, const char* cSet,
+ const char* cField,
+ const char* ExpectedType);
+
+// ------------------------------------------------------------- Implementation
+
+
+#define SIZEOFLONGMINUS1 (sizeof(long)-1)
+#define ALIGNLONG(x) (((x)+SIZEOFLONGMINUS1) & ~(SIZEOFLONGMINUS1))
+
+// #define STRICT_CGATS 1
+
+#define MAXID 128 // Max lenght of identifier
+#define MAXSTR 255 // Max lenght of string
+#define MAXTABLES 255 // Max Number of tables in a single stream
+#define MAXINCLUDE 20 // Max number of nested includes
+
+#define DEFAULT_DBL_FORMAT "%.10g" // Double formatting
+
+#include <ctype.h>
+#include <limits.h>
+
+#ifndef NON_WINDOWS
+#include <io.h>
+#endif
+
+// Symbols
+
+typedef enum {
+
+ SNONE,
+ SINUM, // Integer
+ SDNUM, // Real
+ SIDENT, // Identifier
+ SSTRING, // string
+ SCOMMENT, // comment
+ SEOLN, // End of line
+ SEOF, // End of stream
+ SSYNERROR, // Syntax error found on stream
+
+ // Keywords
+
+ SBEGIN_DATA,
+ SBEGIN_DATA_FORMAT,
+ SEND_DATA,
+ SEND_DATA_FORMAT,
+ SKEYWORD,
+ SINCLUDE
+
+ } SYMBOL;
+
+
+// How to write the value
+
+typedef enum {
+ WRITE_UNCOOKED,
+ WRITE_STRINGIFY,
+ WRITE_HEXADECIMAL,
+ WRITE_BINARY
+
+ } WRITEMODE;
+
+// Linked list of variable names
+
+typedef struct _KeyVal {
+
+ struct _KeyVal* Next;
+ char* Keyword; // Name of variable
+ char* Value; // Points to value
+ WRITEMODE WriteAs; // How to write the value
+
+ } KEYVALUE, *LPKEYVALUE;
+
+
+// Linked list of memory chunks (Memory sink)
+
+typedef struct _OwnedMem {
+
+ struct _OwnedMem* Next;
+ void * Ptr; // Point to value
+
+ } OWNEDMEM, *LPOWNEDMEM;
+
+// Suballocator
+
+typedef struct _SubAllocator {
+
+ LPBYTE Block;
+ size_t BlockSize;
+ size_t Used;
+
+ } SUBALLOCATOR, *LPSUBALLOCATOR;
+
+// Table. Each individual table can hold properties and rows & cols
+
+typedef struct _Table {
+
+ int nSamples, nPatches; // Cols, Rows
+ int SampleID; // Pos of ID
+
+ LPKEYVALUE HeaderList; // The properties
+
+ char** DataFormat; // The binary stream descriptor
+ char** Data; // The binary stream
+
+ } TABLE, *LPTABLE;
+
+
+
+// This struct hold all information about an openened
+// IT8 handler. Only one dataset is allowed.
+
+typedef struct {
+
+ char SheetType[MAXSTR];
+
+ int TablesCount; // How many tables in this stream
+ int nTable; // The actual table
+
+ TABLE Tab[MAXTABLES];
+
+ // Memory management
+
+ LPOWNEDMEM MemorySink; // The storage backend
+ SUBALLOCATOR Allocator; // String suballocator -- just to keep it fast
+
+ // Parser state machine
+
+ SYMBOL sy; // Current symbol
+ int ch; // Current character
+
+ int inum; // integer value
+ double dnum; // real value
+ char id[MAXID]; // identifier
+ char str[MAXSTR]; // string
+
+ // Allowed keywords & datasets. They have visibility on whole stream
+
+ LPKEYVALUE ValidKeywords;
+ LPKEYVALUE ValidSampleID;
+
+ char* Source; // Points to loc. being parsed
+ int lineno; // line counter for error reporting
+
+ char FileName[MAX_PATH]; // File name if being readed from file
+ FILE* Stream[MAXINCLUDE]; // File stream or NULL if holded in memory
+ int IncludeSP; // Include Stack Pointer
+ char* MemoryBlock; // The stream if holded in memory
+
+ char DoubleFormatter[MAXID]; // Printf-like 'double' formatter
+
+ } IT8, *LPIT8;
+
+
+
+typedef struct {
+
+ FILE* stream; // For save-to-file behaviour
+
+ LPBYTE Base;
+ LPBYTE Ptr; // For save-to-mem behaviour
+ size_t Used;
+ size_t Max;
+
+ } SAVESTREAM, FAR* LPSAVESTREAM;
+
+
+// ------------------------------------------------------ IT8 parsing routines
+
+
+// A keyword
+typedef struct {
+
+ const char *id;
+ SYMBOL sy;
+
+ } KEYWORD;
+
+// The keyword->symbol translation table. Sorting is required.
+static const KEYWORD TabKeys[] = {
+
+ {"$INCLUDE", SINCLUDE},
+ {".INCLUDE", SINCLUDE},
+ {"BEGIN_DATA", SBEGIN_DATA },
+ {"BEGIN_DATA_FORMAT", SBEGIN_DATA_FORMAT },
+ {"END_DATA", SEND_DATA},
+ {"END_DATA_FORMAT", SEND_DATA_FORMAT},
+ {"KEYWORD", SKEYWORD}
+
+ };
+
+#define NUMKEYS (sizeof(TabKeys)/sizeof(KEYWORD))
+
+// Predefined properties
+
+static const char* PredefinedProperties[] = {
+
+ "NUMBER_OF_FIELDS", // Required - NUMBER OF FIELDS
+ "NUMBER_OF_SETS", // Required - NUMBER OF SETS
+ "ORIGINATOR", // Required - Identifies the specific system, organization or individual that created the data file.
+ "CREATED", // Required - Indicates date of creation of the data file.
+ "DESCRIPTOR", // Required - Describes the purpose or contents of the data file.
+ "DIFFUSE_GEOMETRY", // The diffuse geometry used. Allowed values are "sphere" or "opal".
+ "MANUFACTURER",
+ "MANUFACTURE", // Some broken Fuji targets does store this value
+ "PROD_DATE", // Identifies year and month of production of the target in the form yyyy:mm.
+ "SERIAL", // Uniquely identifies individual physical target.
+
+ "MATERIAL", // Identifies the material on which the target was produced using a code
+ // uniquely identifying th e material. This is intend ed to be used for IT8.7
+ // physical targets only (i.e . IT8.7/1 a nd IT8.7/2).
+
+ "INSTRUMENTATION", // Used to report the specific instrumentation used (manufacturer and
+ // model number) to generate the data reported. This data will often
+ // provide more information about the particular data collected than an
+ // extensive list of specific details. This is particularly important for
+ // spectral data or data derived from spectrophotometry.
+
+ "MEASUREMENT_SOURCE", // Illumination used for spectral measurements. This data helps provide
+ // a guide to the potential for issues of paper fluorescence, etc.
+
+ "PRINT_CONDITIONS", // Used to define the characteristics of the printed sheet being reported.
+ // Where standard conditions have been defined (e.g., SWOP at nominal)
+ // named conditions may suffice. Otherwise, detailed information is
+ // needed.
+
+ "SAMPLE_BACKING", // Identifies the backing material used behind the sample during
+ // measurement. Allowed values are “black”, “white”, or "na".
+
+ "CHISQ_DOF" // Degrees of freedom associated with the Chi squared statistic
+};
+
+#define NUMPREDEFINEDPROPS (sizeof(PredefinedProperties)/sizeof(char *))
+
+
+// Predefined sample types on dataset
+static const char* PredefinedSampleID[] = {
+
+ "CMYK_C", // Cyan component of CMYK data expressed as a percentage
+ "CMYK_M", // Magenta component of CMYK data expressed as a percentage
+ "CMYK_Y", // Yellow component of CMYK data expressed as a percentage
+ "CMYK_K", // Black component of CMYK data expressed as a percentage
+ "D_RED", // Red filter density
+ "D_GREEN", // Green filter density
+ "D_BLUE", // Blue filter density
+ "D_VIS", // Visual filter density
+ "D_MAJOR_FILTER", // Major filter d ensity
+ "RGB_R", // Red component of RGB data
+ "RGB_G", // Green component of RGB data
+ "RGB_B", // Blue com ponent of RGB data
+ "SPECTRAL_NM", // Wavelength of measurement expressed in nanometers
+ "SPECTRAL_PCT", // Percentage reflectance/transmittance
+ "SPECTRAL_DEC", // Reflectance/transmittance
+ "XYZ_X", // X component of tristimulus data
+ "XYZ_Y", // Y component of tristimulus data
+ "XYZ_Z", // Z component of tristimulus data
+ "XYY_X" // x component of chromaticity data
+ "XYY_Y", // y component of chromaticity data
+ "XYY_CAPY", // Y component of tristimulus data
+ "LAB_L", // L* component of Lab data
+ "LAB_A", // a* component of Lab data
+ "LAB_B", // b* component of Lab data
+ "LAB_C", // C*ab component of Lab data
+ "LAB_H", // hab component of Lab data
+ "LAB_DE" // CIE dE
+ "LAB_DE_94", // CIE dE using CIE 94
+ "LAB_DE_CMC", // dE using CMC
+ "LAB_DE_2000", // CIE dE using CIE DE 2000
+ "MEAN_DE", // Mean Delta E (LAB_DE) of samples compared to batch average
+ // (Used for data files for ANSI IT8.7/1 and IT8.7/2 targets)
+ "STDEV_X", // Standard deviation of X (tristimulus data)
+ "STDEV_Y", // Standard deviation of Y (tristimulus data)
+ "STDEV_Z", // Standard deviation of Z (tristimulus data)
+ "STDEV_L", // Standard deviation of L*
+ "STDEV_A" // Standard deviation of a*
+ "STDEV_B", // Standard deviation of b*
+ "STDEV_DE", // Standard deviation of CIE dE
+ "CHI_SQD_PAR"}; // The average of the standard deviations of L*, a* and b*. It is
+ // used to derive an estimate of the chi-squared parameter which is
+ // recommended as the predictor of the variability of dE
+
+#define NUMPREDEFINEDSAMPLEID (sizeof(PredefinedSampleID)/sizeof(char *))
+
+
+// Checks whatsever if c is a valid identifier middle char.
+static
+BOOL isidchar(int c)
+{
+ return (isalnum(c) || c == '$' || c == '%' || c == '&' || c == '/' || c == '.' || c == '_');
+
+}
+
+// Checks whatsever if c is a valid identifier first char.
+static
+BOOL isfirstidchar(int c)
+{
+ return !isdigit(c) && isidchar(c);
+}
+
+// Checks if c is a separator
+static
+BOOL isseparator(int c)
+{
+ return (c == ' ' || c == '\t' || c == '\r');
+}
+
+
+
+static
+BOOL SynError(LPIT8 it8, const char *Txt, ...)
+{
+ char Buffer[256], ErrMsg[1024];
+ va_list args;
+
+ va_start(args, Txt);
+ vsprintf(Buffer, Txt, args);
+ va_end(args);
+
+ sprintf(ErrMsg, "%s: Line %d, %s", it8->FileName, it8->lineno, Buffer);
+ it8->sy = SSYNERROR;
+ cmsSignalError(LCMS_ERRC_ABORTED, ErrMsg);
+ return FALSE;
+}
+
+static
+BOOL Check(LPIT8 it8, SYMBOL sy, const char* Err)
+{
+ if (it8 -> sy != sy)
+ return SynError(it8, Err);
+ return TRUE;
+}
+
+
+
+// Read Next character from stream
+static
+void NextCh(LPIT8 it8)
+{
+ if (it8 -> Stream[it8 ->IncludeSP]) {
+
+ it8 ->ch = fgetc(it8 ->Stream[it8 ->IncludeSP]);
+
+ if (feof(it8 -> Stream[it8 ->IncludeSP])) {
+
+ if (it8 ->IncludeSP > 0) {
+
+ fclose(it8 ->Stream[it8->IncludeSP--]);
+ it8 -> ch = ' '; // Whitespace to be ignored
+
+ } else
+ it8 ->ch = 0; // EOF
+ }
+
+
+
+ }
+ else {
+
+ it8->ch = *it8->Source;
+ if (it8->ch) it8->Source++;
+ }
+}
+
+
+// Try to see if current identifier is a keyword, if so return the referred symbol
+static
+SYMBOL BinSrchKey(const char *id)
+{
+ int l = 1;
+ int r = NUMKEYS;
+ int x, res;
+
+ while (r >= l)
+ {
+ x = (l+r)/2;
+ res = stricmp(id, TabKeys[x-1].id);
+ if (res == 0) return TabKeys[x-1].sy;
+ if (res < 0) r = x - 1;
+ else l = x + 1;
+ }
+
+ return SNONE;
+}
+
+
+// 10 ^n
+static
+double xpow10(int n)
+{
+ return pow(10, (double) n);
+}
+
+
+// Reads a Real number, tries to follow from integer number
+static
+void ReadReal(LPIT8 it8, int inum)
+{
+ it8->dnum = (double) inum;
+
+ while (isdigit(it8->ch)) {
+
+ it8->dnum = it8->dnum * 10.0 + (it8->ch - '0');
+ NextCh(it8);
+ }
+
+ if (it8->ch == '.') { // Decimal point
+
+ double frac = 0.0; // fraction
+ int prec = 0; // precission
+
+ NextCh(it8); // Eats dec. point
+
+ while (isdigit(it8->ch)) {
+
+ frac = frac * 10.0 + (it8->ch - '0');
+ prec++;
+ NextCh(it8);
+ }
+
+ it8->dnum = it8->dnum + (frac / xpow10(prec));
+ }
+
+ // Exponent, example 34.00E+20
+ if (toupper(it8->ch) == 'E') {
+
+ int e;
+ int sgn;
+
+ NextCh(it8); sgn = 1;
+
+ if (it8->ch == '-') {
+
+ sgn = -1; NextCh(it8);
+ }
+ else
+ if (it8->ch == '+') {
+
+ sgn = +1;
+ NextCh(it8);
+ }
+
+
+ e = 0;
+ while (isdigit(it8->ch)) {
+
+ if ((double) e * 10L < INT_MAX)
+ e = e * 10 + (it8->ch - '0');
+
+ NextCh(it8);
+ }
+
+ e = sgn*e;
+
+ it8 -> dnum = it8 -> dnum * xpow10(e);
+ }
+}
+
+
+
+// Reads next symbol
+static
+void InSymbol(LPIT8 it8)
+{
+ register char *idptr;
+ register int k;
+ SYMBOL key;
+ int sng;
+
+ do {
+
+ while (isseparator(it8->ch))
+ NextCh(it8);
+
+ if (isfirstidchar(it8->ch)) { // Identifier
+
+
+ k = 0;
+ idptr = it8->id;
+
+ do {
+
+ if (++k < MAXID) *idptr++ = (char) it8->ch;
+
+ NextCh(it8);
+
+ } while (isidchar(it8->ch));
+
+ *idptr = '\0';
+
+
+ key = BinSrchKey(it8->id);
+ if (key == SNONE) it8->sy = SIDENT;
+ else it8->sy = key;
+
+ }
+ else // Is a number?
+ if (isdigit(it8->ch) || it8->ch == '.' || it8->ch == '-' || it8->ch == '+')
+ {
+ int sign = 1;
+
+ if (it8->ch == '-') {
+ sign = -1;
+ NextCh(it8);
+ }
+
+ it8->inum = 0;
+ it8->sy = SINUM;
+
+ if (it8->ch == '0') { // 0xnnnn (Hexa) or 0bnnnn (Binary)
+
+ NextCh(it8);
+ if (toupper(it8->ch) == 'X') {
+
+ int j;
+
+ NextCh(it8);
+ while (isxdigit(it8->ch))
+ {
+ it8->ch = toupper(it8->ch);
+ if (it8->ch >= 'A' && it8->ch <= 'F') j = it8->ch -'A'+10;
+ else j = it8->ch - '0';
+
+ if ((long) it8->inum * 16L > (long) INT_MAX)
+ {
+ SynError(it8, "Invalid hexadecimal number");
+ return;
+ }
+
+ it8->inum = it8->inum * 16 + j;
+ NextCh(it8);
+ }
+ return;
+ }
+
+ if (toupper(it8->ch) == 'B') { // Binary
+
+ int j;
+
+ NextCh(it8);
+ while (it8->ch == '0' || it8->ch == '1')
+ {
+ j = it8->ch - '0';
+
+ if ((long) it8->inum * 2L > (long) INT_MAX)
+ {
+ SynError(it8, "Invalid binary number");
+ return;
+ }
+
+ it8->inum = it8->inum * 2 + j;
+ NextCh(it8);
+ }
+ return;
+ }
+ }
+
+
+ while (isdigit(it8->ch)) {
+
+ if ((long) it8->inum * 10L > (long) INT_MAX) {
+ ReadReal(it8, it8->inum);
+ it8->sy = SDNUM;
+ it8->dnum *= sign;
+ return;
+ }
+
+ it8->inum = it8->inum * 10 + (it8->ch - '0');
+ NextCh(it8);
+ }
+
+ if (it8->ch == '.') {
+
+ ReadReal(it8, it8->inum);
+ it8->sy = SDNUM;
+ it8->dnum *= sign;
+ return;
+ }
+
+ it8 -> inum *= sign;
+
+ // Special case. Numbers followed by letters are taken as identifiers
+
+ if (isidchar(it8 ->ch)) {
+
+ if (it8 ->sy == SINUM) {
+
+ sprintf(it8->id, "%d", it8->inum);
+ }
+ else {
+
+ sprintf(it8->id, it8 ->DoubleFormatter, it8->dnum);
+ }
+
+ k = (int) strlen(it8 ->id);
+ idptr = it8 ->id + k;
+ do {
+
+ if (++k < MAXID) *idptr++ = (char) it8->ch;
+
+ NextCh(it8);
+
+ } while (isidchar(it8->ch));
+
+ *idptr = '\0';
+
+ it8->sy = SIDENT;
+ }
+ return;
+
+ }
+ else
+ switch ((int) it8->ch) {
+
+ // EOF marker -- ignore it
+ case '\x1a':
+ NextCh(it8);
+ break;
+
+ // Eof stream markers
+
+ case 0:
+ case -1:
+ it8->sy = SEOF;
+ break;
+
+
+ // Next line
+
+ case '\n':
+ NextCh(it8);
+ it8->sy = SEOLN;
+ it8->lineno++;
+ break;
+
+ // Comment
+
+ case '#':
+ NextCh(it8);
+ while (it8->ch && it8->ch != '\n')
+ NextCh(it8);
+
+ it8->sy = SCOMMENT;
+ break;
+
+ // String.
+
+ case '\'':
+ case '\"':
+ idptr = it8->str;
+ sng = it8->ch;
+ k = 0;
+ NextCh(it8);
+
+ while (k < MAXSTR && it8->ch != sng) {
+
+ if (it8->ch == '\n'|| it8->ch == '\r') k = MAXSTR+1;
+ else {
+ *idptr++ = (char) it8->ch;
+ NextCh(it8);
+ k++;
+ }
+ }
+
+ it8->sy = SSTRING;
+ *idptr = '\0';
+ NextCh(it8);
+ break;
+
+
+ default:
+ SynError(it8, "Unrecognized character: 0x%x", it8 ->ch);
+ return;
+ }
+
+ } while (it8->sy == SCOMMENT);
+
+ // Handle the include special token
+
+ if (it8 -> sy == SINCLUDE) {
+
+ FILE* IncludeFile;
+
+ InSymbol(it8);
+ if (!Check(it8, SSTRING, "Filename expected")) return;
+ IncludeFile = fopen(it8 -> str, "rt");
+ if (IncludeFile == NULL) {
+
+ SynError(it8, "File %s not found", it8 ->str);
+ return;
+ }
+
+ it8 -> Stream[++it8 -> IncludeSP] = IncludeFile;
+ it8 ->ch = ' ';
+ InSymbol(it8);
+ }
+
+}
+
+// Checks end of line separator
+static
+BOOL CheckEOLN(LPIT8 it8)
+{
+ if (!Check(it8, SEOLN, "Expected separator")) return FALSE;
+ while (it8 -> sy == SEOLN)
+ InSymbol(it8);
+ return TRUE;
+
+}
+
+// Skip a symbol
+
+static
+void Skip(LPIT8 it8, SYMBOL sy)
+{
+ if (it8->sy == sy && it8->sy != SEOF)
+ InSymbol(it8);
+}
+
+
+// Skip multiple EOLN
+static
+void SkipEOLN(LPIT8 it8)
+{
+ while (it8->sy == SEOLN) {
+ InSymbol(it8);
+ }
+}
+
+
+// Returns a string holding current value
+static
+BOOL GetVal(LPIT8 it8, char* Buffer, const char* ErrorTitle)
+{
+ switch (it8->sy) {
+
+ case SIDENT: strncpy(Buffer, it8->id, MAXID-1); break;
+ case SINUM: sprintf(Buffer, "%d", it8 -> inum); break;
+ case SDNUM: sprintf(Buffer, it8->DoubleFormatter, it8 -> dnum); break;
+ case SSTRING: strncpy(Buffer, it8->str, MAXSTR-1); break;
+
+
+ default:
+ return SynError(it8, ErrorTitle);
+ }
+
+ return TRUE;
+}
+
+// ---------------------------------------------------------- Table
+
+static
+LPTABLE GetTable(LPIT8 it8)
+{
+ return it8 ->Tab + it8 ->nTable;
+}
+
+// ---------------------------------------------------------- Memory management
+
+
+
+// Frees an allocator and owned memory
+void LCMSEXPORT cmsIT8Free(LCMSHANDLE hIT8)
+{
+ LPIT8 it8 = (LPIT8) hIT8;
+
+ if (it8 == NULL)
+ return;
+
+
+ if (it8->MemorySink) {
+
+ LPOWNEDMEM p;
+ LPOWNEDMEM n;
+
+ for (p = it8->MemorySink; p != NULL; p = n) {
+
+ n = p->Next;
+ if (p->Ptr) free(p->Ptr);
+ free(p);
+ }
+ }
+
+ if (it8->MemoryBlock)
+ free(it8->MemoryBlock);
+
+ free(it8);
+}
+
+
+// Allocates a chunk of data, keep linked list
+static
+void* AllocBigBlock(LPIT8 it8, size_t size)
+{
+ LPOWNEDMEM ptr1;
+ void* ptr = malloc(size);
+
+ if (ptr) {
+
+ ZeroMemory(ptr, size);
+ ptr1 = (LPOWNEDMEM) malloc(sizeof(OWNEDMEM));
+
+ if (ptr1 == NULL) {
+
+ free(ptr);
+ return NULL;
+ }
+
+ ZeroMemory(ptr1, sizeof(OWNEDMEM));
+
+ ptr1-> Ptr = ptr;
+ ptr1-> Next = it8 -> MemorySink;
+ it8 -> MemorySink = ptr1;
+ }
+
+ return ptr;
+}
+
+
+// Suballocator.
+static
+void* AllocChunk(LPIT8 it8, size_t size)
+{
+ size_t free = it8 ->Allocator.BlockSize - it8 ->Allocator.Used;
+ LPBYTE ptr;
+
+ size = ALIGNLONG(size);
+
+ if (size > free) {
+
+ if (it8 -> Allocator.BlockSize == 0)
+
+ it8 -> Allocator.BlockSize = 20*1024;
+ else
+ it8 ->Allocator.BlockSize *= 2;
+
+ if (it8 ->Allocator.BlockSize < size)
+ it8 ->Allocator.BlockSize = size;
+
+ it8 ->Allocator.Used = 0;
+ it8 ->Allocator.Block = (LPBYTE) AllocBigBlock(it8, it8 ->Allocator.BlockSize);
+ }
+
+ ptr = it8 ->Allocator.Block + it8 ->Allocator.Used;
+ it8 ->Allocator.Used += size;
+
+ return (void*) ptr;
+
+}
+
+
+// Allocates a string
+static
+char *AllocString(LPIT8 it8, const char* str)
+{
+ size_t Size = strlen(str)+1;
+ char *ptr;
+
+
+ ptr = (char *) AllocChunk(it8, Size);
+ if (ptr) strncpy (ptr, str, Size-1);
+
+ return ptr;
+}
+
+// Searches through linked list
+
+static
+BOOL IsAvailableOnList(LPKEYVALUE p, const char* Key, LPKEYVALUE* LastPtr)
+{
+
+ for (; p != NULL; p = p->Next) {
+
+ if (LastPtr) *LastPtr = p;
+
+ if (*Key != '#') { // Comments are ignored
+
+ if (stricmp(Key, p->Keyword) == 0)
+ return TRUE;
+ }
+ }
+
+ return FALSE;
+}
+
+
+
+// Add a property into a linked list
+static
+BOOL AddToList(LPIT8 it8, LPKEYVALUE* Head, const char *Key, const char* xValue, WRITEMODE WriteAs)
+{
+ LPKEYVALUE p;
+ LPKEYVALUE last;
+
+
+ // Check if property is already in list (this is an error)
+
+ if (IsAvailableOnList(*Head, Key, &last)) {
+
+ // This may work for editing properties
+
+ last->Value = AllocString(it8, xValue);
+ last->WriteAs = WriteAs;
+ return TRUE;
+
+ // return SynError(it8, "duplicate key <%s>", Key);
+ }
+
+ // Allocate the container
+ p = (LPKEYVALUE) AllocChunk(it8, sizeof(KEYVALUE));
+ if (p == NULL)
+ {
+ return SynError(it8, "AddToList: out of memory");
+ }
+
+ // Store name and value
+ p->Keyword = AllocString(it8, Key);
+
+ if (xValue != NULL) {
+
+ p->Value = AllocString(it8, xValue);
+ }
+ else {
+ p->Value = NULL;
+ }
+
+ p->Next = NULL;
+ p->WriteAs = WriteAs;
+
+ // Keep the container in our list
+ if (*Head == NULL)
+ *Head = p;
+ else
+ last->Next = p;
+
+ return TRUE;
+}
+
+static
+BOOL AddAvailableProperty(LPIT8 it8, const char* Key)
+{
+ return AddToList(it8, &it8->ValidKeywords, Key, NULL, WRITE_UNCOOKED);
+}
+
+
+static
+BOOL AddAvailableSampleID(LPIT8 it8, const char* Key)
+{
+ return AddToList(it8, &it8->ValidSampleID, Key, NULL, WRITE_UNCOOKED);
+}
+
+
+static
+void AllocTable(LPIT8 it8)
+{
+ LPTABLE t;
+
+ t = it8 ->Tab + it8 ->TablesCount;
+
+ t->HeaderList = NULL;
+ t->DataFormat = NULL;
+ t->Data = NULL;
+
+ it8 ->TablesCount++;
+}
+
+
+int LCMSEXPORT cmsIT8SetTable(LCMSHANDLE IT8, int nTable)
+{
+ LPIT8 it8 = (LPIT8) IT8;
+
+ if (nTable >= it8 ->TablesCount) {
+
+ if (nTable == it8 ->TablesCount) {
+
+ AllocTable(it8);
+ }
+ else {
+ SynError(it8, "Table %d is out of sequence", nTable);
+ return -1;
+ }
+ }
+
+ it8 ->nTable = nTable;
+
+ return nTable;
+}
+
+
+
+// Init an empty container
+LCMSHANDLE LCMSEXPORT cmsIT8Alloc(void)
+{
+ LPIT8 it8;
+ int i;
+
+ it8 = (LPIT8) malloc(sizeof(IT8));
+ if (it8 == NULL) return NULL;
+
+ ZeroMemory(it8, sizeof(IT8));
+
+ AllocTable(it8);
+
+ it8->MemoryBlock = NULL;
+ it8->Stream[0] = NULL;
+ it8->IncludeSP = 0;
+ it8->MemorySink = NULL;
+
+ it8 ->nTable = 0;
+
+ it8->Allocator.Used = 0;
+ it8->Allocator.Block = NULL;
+ it8->Allocator.BlockSize = 0;
+
+ it8->ValidKeywords = NULL;
+ it8->ValidSampleID = NULL;
+
+ it8 -> sy = SNONE;
+ it8 -> ch = ' ';
+ it8 -> Source = NULL;
+ it8 -> inum = 0;
+ it8 -> dnum = 0.0;
+
+ it8 -> lineno = 1;
+
+ strcpy(it8->DoubleFormatter, DEFAULT_DBL_FORMAT);
+ strcpy(it8->SheetType, "CGATS.17");
+
+ // Initialize predefined properties & data
+
+ for (i=0; i < NUMPREDEFINEDPROPS; i++)
+ AddAvailableProperty(it8, PredefinedProperties[i]);
+
+ for (i=0; i < NUMPREDEFINEDSAMPLEID; i++)
+ AddAvailableSampleID(it8, PredefinedSampleID[i]);
+
+
+ return (LCMSHANDLE) it8;
+}
+
+
+const char* LCMSEXPORT cmsIT8GetSheetType(LCMSHANDLE hIT8)
+{
+ LPIT8 it8 = (LPIT8) hIT8;
+
+ return it8 ->SheetType;
+
+}
+
+BOOL LCMSEXPORT cmsIT8SetSheetType(LCMSHANDLE hIT8, const char* Type)
+{
+ LPIT8 it8 = (LPIT8) hIT8;
+
+ strncpy(it8 ->SheetType, Type, MAXSTR-1);
+ return TRUE;
+}
+
+BOOL LCMSEXPORT cmsIT8SetComment(LCMSHANDLE hIT8, const char* Val)
+{
+ LPIT8 it8 = (LPIT8) hIT8;
+
+ if (!Val) return FALSE;
+ if (!*Val) return FALSE;
+
+ return AddToList(it8, &GetTable(it8)->HeaderList, "# ", Val, WRITE_UNCOOKED);
+}
+
+
+
+// Sets a property
+BOOL LCMSEXPORT cmsIT8SetPropertyStr(LCMSHANDLE hIT8, const char* Key, const char *Val)
+{
+ LPIT8 it8 = (LPIT8) hIT8;
+
+ if (!Val) return FALSE;
+ if (!*Val) return FALSE;
+
+ return AddToList(it8, &GetTable(it8)->HeaderList, Key, Val, WRITE_STRINGIFY);
+}
+
+
+BOOL LCMSEXPORT cmsIT8SetPropertyDbl(LCMSHANDLE hIT8, const char* cProp, double Val)
+{
+ LPIT8 it8 = (LPIT8) hIT8;
+ char Buffer[1024];
+
+ sprintf(Buffer, it8->DoubleFormatter, Val);
+
+ return AddToList(it8, &GetTable(it8)->HeaderList, cProp, Buffer, WRITE_UNCOOKED);
+}
+
+BOOL LCMSEXPORT cmsIT8SetPropertyHex(LCMSHANDLE hIT8, const char* cProp, int Val)
+{
+ LPIT8 it8 = (LPIT8) hIT8;
+ char Buffer[1024];
+
+ sprintf(Buffer, "%d", Val);
+
+ return AddToList(it8, &GetTable(it8)->HeaderList, cProp, Buffer, WRITE_HEXADECIMAL);
+}
+
+BOOL LCMSEXPORT cmsIT8SetPropertyUncooked(LCMSHANDLE hIT8, const char* Key, const char* Buffer)
+{
+ LPIT8 it8 = (LPIT8) hIT8;
+
+ return AddToList(it8, &GetTable(it8)->HeaderList, Key, Buffer, WRITE_UNCOOKED);
+}
+
+
+// Gets a property
+const char* LCMSEXPORT cmsIT8GetProperty(LCMSHANDLE hIT8, const char* Key)
+{
+ LPIT8 it8 = (LPIT8) hIT8;
+ LPKEYVALUE p;
+
+ if (IsAvailableOnList(GetTable(it8) -> HeaderList, Key, &p))
+ {
+ return p -> Value;
+ }
+ return NULL;
+}
+
+
+double LCMSEXPORT cmsIT8GetPropertyDbl(LCMSHANDLE hIT8, const char* cProp)
+{
+ const char *v = cmsIT8GetProperty(hIT8, cProp);
+
+ if (v) return atof(v);
+ else return 0.0;
+}
+
+// ----------------------------------------------------------------- Datasets
+
+
+static
+void AllocateDataFormat(LPIT8 it8)
+{
+ LPTABLE t = GetTable(it8);
+
+ if (t -> DataFormat) return; // Already allocated
+
+ t -> nSamples = (int) cmsIT8GetPropertyDbl(it8, "NUMBER_OF_FIELDS");
+
+ if (t -> nSamples <= 0) {
+
+ SynError(it8, "AllocateDataFormat: Unknown NUMBER_OF_FIELDS");
+ t -> nSamples = 10;
+ }
+
+ t -> DataFormat = (char**) AllocChunk (it8, (t->nSamples + 1) * sizeof(char *));
+ if (t->DataFormat == NULL)
+ {
+ SynError(it8, "AllocateDataFormat: Unable to allocate dataFormat array");
+ }
+
+}
+
+static
+const char *GetDataFormat(LPIT8 it8, int n)
+{
+ LPTABLE t = GetTable(it8);
+
+ if (t->DataFormat)
+ return t->DataFormat[n];
+
+ return NULL;
+}
+
+static
+BOOL SetDataFormat(LPIT8 it8, int n, const char *label)
+{
+ LPTABLE t = GetTable(it8);
+
+ if (!t->DataFormat)
+ AllocateDataFormat(it8);
+
+ if (n > t -> nSamples) {
+ SynError(it8, "More than NUMBER_OF_FIELDS fields.");
+ return FALSE;
+ }
+
+
+ if (t->DataFormat) {
+ t->DataFormat[n] = AllocString(it8, label);
+ }
+
+ return TRUE;
+}
+
+
+BOOL LCMSEXPORT cmsIT8SetDataFormat(LCMSHANDLE h, int n, const char *Sample)
+{
+ LPIT8 it8 = (LPIT8) h;
+ return SetDataFormat(it8, n, Sample);
+}
+
+static
+void AllocateDataSet(LPIT8 it8)
+{
+ LPTABLE t = GetTable(it8);
+
+ if (t -> Data) return; // Already allocated
+
+ t-> nSamples = atoi(cmsIT8GetProperty(it8, "NUMBER_OF_FIELDS"));
+ t-> nPatches = atoi(cmsIT8GetProperty(it8, "NUMBER_OF_SETS"));
+
+ t-> Data = (char**)AllocChunk (it8, (t->nSamples + 1) * (t->nPatches + 1) *sizeof (char*));
+ if (t->Data == NULL)
+ {
+ SynError(it8, "AllocateDataSet: Unable to allocate data array");
+ }
+
+}
+
+static
+char* GetData(LPIT8 it8, int nSet, int nField)
+{
+ LPTABLE t = GetTable(it8);
+ int nSamples = t -> nSamples;
+ int nPatches = t -> nPatches;
+
+
+ if (nSet >= nPatches || nField >= nSamples)
+ return NULL;
+
+ if (!t->Data) return NULL;
+ return t->Data [nSet * nSamples + nField];
+}
+
+static
+BOOL SetData(LPIT8 it8, int nSet, int nField, const char *Val)
+{
+ LPTABLE t = GetTable(it8);
+
+ if (!t->Data)
+ AllocateDataSet(it8);
+
+ if (!t->Data) return FALSE;
+
+
+
+ if (nSet > t -> nPatches || nSet < 0) {
+
+ return SynError(it8, "Patch %d out of range, there are %d patches", nSet, t -> nPatches);
+ }
+
+ if (nField > t ->nSamples || nField < 0) {
+ return SynError(it8, "Sample %d out of range, there are %d samples", nField, t ->nSamples);
+
+ }
+
+
+ t->Data [nSet * t -> nSamples + nField] = AllocString(it8, Val);
+ return TRUE;
+}
+
+
+// --------------------------------------------------------------- File I/O
+
+
+// Writes a string to file
+static
+void WriteStr(LPSAVESTREAM f, const char *str)
+{
+
+ size_t len;
+
+ if (str == NULL)
+ str = " ";
+
+ // Lenghth to write
+ len = strlen(str);
+ f ->Used += len;
+
+
+ if (f ->stream) { // Should I write it to a file?
+
+ fwrite(str, 1, len, f->stream);
+
+ }
+ else { // Or to a memory block?
+
+
+ if (f ->Base) { // Am I just counting the bytes?
+
+ if (f ->Used > f ->Max) {
+
+ cmsSignalError(LCMS_ERRC_ABORTED, "Write to memory overflows in CGATS parser");
+ return;
+ }
+
+ CopyMemory(f ->Ptr, str, len);
+ f->Ptr += len;
+
+ }
+
+ }
+}
+
+
+//
+static
+void Writef(LPSAVESTREAM f, const char* frm, ...)
+{
+ char Buffer[4096];
+ va_list args;
+
+ va_start(args, frm);
+ vsprintf(Buffer, frm, args);
+ WriteStr(f, Buffer);
+ va_end(args);
+
+}
+
+// Writes full header
+static
+void WriteHeader(LPIT8 it8, LPSAVESTREAM fp)
+{
+ LPKEYVALUE p;
+ LPTABLE t = GetTable(it8);
+
+
+ for (p = t->HeaderList; (p != NULL); p = p->Next)
+ {
+ if (*p ->Keyword == '#') {
+
+ char* Pt;
+
+ WriteStr(fp, "#\n# ");
+ for (Pt = p ->Value; *Pt; Pt++) {
+
+
+ Writef(fp, "%c", *Pt);
+
+ if (*Pt == '\n') {
+ WriteStr(fp, "# ");
+ }
+ }
+
+ WriteStr(fp, "\n#\n");
+ continue;
+ }
+
+
+ if (!IsAvailableOnList(it8-> ValidKeywords, p->Keyword, NULL)) {
+
+#ifdef STRICT_CGATS
+ WriteStr(fp, "KEYWORD\t\"");
+ WriteStr(fp, p->Keyword);
+ WriteStr(fp, "\"\n");
+#endif
+
+ AddAvailableProperty(it8, p->Keyword);
+
+ }
+
+ WriteStr(fp, p->Keyword);
+ if (p->Value) {
+
+ switch (p ->WriteAs) {
+
+ case WRITE_UNCOOKED:
+ Writef(fp, "\t%s", p ->Value);
+ break;
+
+ case WRITE_STRINGIFY:
+ Writef(fp, "\t\"%s\"", p->Value );
+ break;
+
+ case WRITE_HEXADECIMAL:
+ Writef(fp, "\t0x%X", atoi(p ->Value));
+ break;
+
+ case WRITE_BINARY:
+ Writef(fp, "\t0x%B", atoi(p ->Value));
+ break;
+
+ default: SynError(it8, "Unknown write mode %d", p ->WriteAs);
+ return;
+ }
+ }
+
+ WriteStr (fp, "\n");
+ }
+
+}
+
+
+// Writes the data format
+static
+void WriteDataFormat(LPSAVESTREAM fp, LPIT8 it8)
+{
+ int i, nSamples;
+ LPTABLE t = GetTable(it8);
+
+ if (!t -> DataFormat) return;
+
+ WriteStr(fp, "BEGIN_DATA_FORMAT\n");
+ WriteStr(fp, " ");
+ nSamples = atoi(cmsIT8GetProperty(it8, "NUMBER_OF_FIELDS"));
+
+ for (i = 0; i < nSamples; i++) {
+
+ WriteStr(fp, t->DataFormat[i]);
+ WriteStr(fp, ((i == (nSamples-1)) ? "\n" : "\t"));
+ }
+
+ WriteStr (fp, "END_DATA_FORMAT\n");
+}
+
+
+// Writes data array
+static
+void WriteData(LPSAVESTREAM fp, LPIT8 it8)
+{
+ int i, j;
+ LPTABLE t = GetTable(it8);
+
+ if (!t->Data) return;
+
+ WriteStr (fp, "BEGIN_DATA\n");
+
+ t->nPatches = atoi(cmsIT8GetProperty(it8, "NUMBER_OF_SETS"));
+
+ for (i = 0; i < t-> nPatches; i++) {
+
+ WriteStr(fp, " ");
+
+ for (j = 0; j < t->nSamples; j++) {
+
+ char *ptr = t->Data[i*t->nSamples+j];
+
+ if (ptr == NULL) WriteStr(fp, "\"\"");
+ else {
+ // If value contains whitespace, enclose within quote
+
+ if (strchr(ptr, ' ') != NULL) {
+
+ WriteStr(fp, "\"");
+ WriteStr(fp, ptr);
+ WriteStr(fp, "\"");
+ }
+ else
+ WriteStr(fp, ptr);
+ }
+
+ WriteStr(fp, ((j == (t->nSamples-1)) ? "\n" : "\t"));
+ }
+ }
+ WriteStr (fp, "END_DATA\n");
+}
+
+
+
+// Saves whole file
+BOOL LCMSEXPORT cmsIT8SaveToFile(LCMSHANDLE hIT8, const char* cFileName)
+{
+ SAVESTREAM sd;
+ int i;
+ LPIT8 it8 = (LPIT8) hIT8;
+
+ ZeroMemory(&sd, sizeof(SAVESTREAM));
+
+ sd.stream = fopen(cFileName, "wt");
+ if (!sd.stream) return FALSE;
+
+ WriteStr(&sd, it8->SheetType);
+ WriteStr(&sd, "\n");
+ for (i=0; i < it8 ->TablesCount; i++) {
+
+ cmsIT8SetTable(hIT8, i);
+ WriteHeader(it8, &sd);
+ WriteDataFormat(&sd, it8);
+ WriteData(&sd, it8);
+ }
+
+ fclose(sd.stream);
+
+ return TRUE;
+}
+
+
+// Saves to memory
+BOOL LCMSEXPORT cmsIT8SaveToMem(LCMSHANDLE hIT8, void *MemPtr, size_t* BytesNeeded)
+{
+ SAVESTREAM sd;
+ int i;
+ LPIT8 it8 = (LPIT8) hIT8;
+
+ ZeroMemory(&sd, sizeof(SAVESTREAM));
+
+ sd.stream = NULL;
+ sd.Base = MemPtr;
+ sd.Ptr = sd.Base;
+
+ sd.Used = 0;
+
+ if (sd.Base)
+ sd.Max = *BytesNeeded; // Write to memory?
+ else
+ sd.Max = 0; // Just counting the needed bytes
+
+ WriteStr(&sd, it8->SheetType);
+ WriteStr(&sd, "\n");
+ for (i=0; i < it8 ->TablesCount; i++) {
+
+ cmsIT8SetTable(hIT8, i);
+ WriteHeader(it8, &sd);
+ WriteDataFormat(&sd, it8);
+ WriteData(&sd, it8);
+ }
+
+ sd.Used++; // The \0 at the very end
+
+ if (sd.Base)
+ sd.Ptr = 0;
+
+ *BytesNeeded = sd.Used;
+
+ return TRUE;
+}
+
+
+// -------------------------------------------------------------- Higer level parsing
+
+static
+BOOL DataFormatSection(LPIT8 it8)
+{
+ int iField = 0;
+ LPTABLE t = GetTable(it8);
+
+ InSymbol(it8); // Eats "BEGIN_DATA_FORMAT"
+ CheckEOLN(it8);
+
+ while (it8->sy != SEND_DATA_FORMAT &&
+ it8->sy != SEOLN &&
+ it8->sy != SEOF &&
+ it8->sy != SSYNERROR) {
+
+ if (it8->sy != SIDENT) {
+
+ return SynError(it8, "Sample type expected");
+ }
+
+ if (!SetDataFormat(it8, iField, it8->id)) return FALSE;
+ iField++;
+
+ InSymbol(it8);
+ SkipEOLN(it8);
+ }
+
+ SkipEOLN(it8);
+ Skip(it8, SEND_DATA_FORMAT);
+ SkipEOLN(it8);
+
+ if (iField != t ->nSamples) {
+ SynError(it8, "Count mismatch. NUMBER_OF_FIELDS was %d, found %d\n", t ->nSamples, iField);
+
+
+ }
+
+ return TRUE;
+}
+
+
+
+static
+BOOL DataSection (LPIT8 it8)
+{
+ int iField = 0;
+ int iSet = 0;
+ char Buffer[256];
+ LPTABLE t = GetTable(it8);
+
+ InSymbol(it8); // Eats "BEGIN_DATA"
+ CheckEOLN(it8);
+
+ while (it8->sy != SEND_DATA && it8->sy != SEOF)
+ {
+ if (iField >= t -> nSamples) {
+ iField = 0;
+ iSet++;
+
+ }
+
+ if (it8->sy != SEND_DATA && it8->sy != SEOF) {
+
+ if (!GetVal(it8, Buffer, "Sample data expected"))
+ return FALSE;
+
+ if (!SetData(it8, iSet, iField, Buffer))
+ return FALSE;
+
+ iField++;
+
+ InSymbol(it8);
+ SkipEOLN(it8);
+ }
+ }
+
+ SkipEOLN(it8);
+ Skip(it8, SEND_DATA);
+ SkipEOLN(it8);
+
+ // Check for data completion.
+
+ if ((iSet+1) != t -> nPatches)
+ return SynError(it8, "Count mismatch. NUMBER_OF_SETS was %d, found %d\n", t ->nPatches, iSet+1);
+
+ return TRUE;
+}
+
+
+
+
+static
+BOOL HeaderSection(LPIT8 it8)
+{
+ char VarName[MAXID];
+ char Buffer[MAXSTR];
+
+ while (it8->sy != SEOF &&
+ it8->sy != SSYNERROR &&
+ it8->sy != SBEGIN_DATA_FORMAT &&
+ it8->sy != SBEGIN_DATA) {
+
+
+ switch (it8 -> sy) {
+
+ case SKEYWORD:
+ InSymbol(it8);
+ if (!GetVal(it8, Buffer, "Keyword expected")) return FALSE;
+ if (!AddAvailableProperty(it8, Buffer)) return FALSE;
+ InSymbol(it8);
+ break;
+
+
+ case SIDENT:
+ strncpy(VarName, it8->id, MAXID-1);
+
+ if (!IsAvailableOnList(it8-> ValidKeywords, VarName, NULL)) {
+
+#ifdef STRICT_CGATS
+ return SynError(it8, "Undefined keyword '%s'", VarName);
+#else
+ if (!AddAvailableProperty(it8, VarName)) return FALSE;
+#endif
+ }
+
+ InSymbol(it8);
+ if (!GetVal(it8, Buffer, "Property data expected")) return FALSE;
+
+
+ AddToList(it8, &GetTable(it8)->HeaderList, VarName, Buffer,
+ (it8->sy == SSTRING) ? WRITE_STRINGIFY : WRITE_UNCOOKED);
+
+ InSymbol(it8);
+ break;
+
+
+ case SEOLN: break;
+
+ default:
+ return SynError(it8, "expected keyword or identifier");
+ }
+
+ SkipEOLN(it8);
+ }
+
+ return TRUE;
+
+}
+
+
+static
+BOOL ParseIT8(LPIT8 it8)
+{
+ char* SheetTypePtr;
+
+ // First line is a very special case.
+
+ while (isseparator(it8->ch))
+ NextCh(it8);
+
+ SheetTypePtr = it8 ->SheetType;
+
+ while (it8->ch != '\r' && it8 ->ch != '\n' && it8 -> ch != -1) {
+
+ *SheetTypePtr++= (char) it8 ->ch;
+ NextCh(it8);
+ }
+
+ *SheetTypePtr = 0;
+ InSymbol(it8);
+
+ SkipEOLN(it8);
+
+ while (it8-> sy != SEOF &&
+ it8-> sy != SSYNERROR) {
+
+ switch (it8 -> sy) {
+
+ case SBEGIN_DATA_FORMAT:
+ if (!DataFormatSection(it8)) return FALSE;
+ break;
+
+ case SBEGIN_DATA:
+
+ if (!DataSection(it8)) return FALSE;
+
+ if (it8 -> sy != SEOF) {
+
+ AllocTable(it8);
+ it8 ->nTable = it8 ->TablesCount - 1;
+ }
+ break;
+
+ case SEOLN:
+ SkipEOLN(it8);
+ break;
+
+ default:
+ if (!HeaderSection(it8)) return FALSE;
+ }
+
+ }
+
+ return (it8 -> sy != SSYNERROR);
+}
+
+
+
+// Init usefull pointers
+
+static
+void CookPointers(LPIT8 it8)
+{
+ int idField, i;
+ char* Fld;
+ int j;
+ int nOldTable = it8 ->nTable;
+
+ for (j=0; j < it8 ->TablesCount; j++) {
+
+ LPTABLE t = it8 ->Tab + j;
+
+ t -> SampleID = 0;
+ it8 ->nTable = j;
+
+ for (idField = 0; idField < t -> nSamples; idField++)
+ {
+ Fld = t->DataFormat[idField];
+ if (!Fld) continue;
+
+
+ if (stricmp(Fld, "SAMPLE_ID") == 0) {
+
+ t -> SampleID = idField;
+
+ for (i=0; i < t -> nPatches; i++) {
+
+ char *Data = GetData(it8, i, idField);
+ if (Data) {
+ char Buffer[256];
+
+ strncpy(Buffer, Data, 255);
+
+ if (strlen(Buffer) <= strlen(Data))
+ strcpy(Data, Buffer);
+ else
+ SetData(it8, i, idField, Buffer);
+
+ }
+ }
+
+ }
+
+ // "LABEL" is an extension. It keeps references to forward tables
+
+ if ((stricmp(Fld, "LABEL") == 0) || Fld[0] == '$' ) {
+
+ // Search for table references...
+ for (i=0; i < t -> nPatches; i++) {
+
+ char *Label = GetData(it8, i, idField);
+
+ if (Label) {
+
+ int k;
+
+ // This is the label, search for a table containing
+ // this property
+
+ for (k=0; k < it8 ->TablesCount; k++) {
+
+ LPTABLE Table = it8 ->Tab + k;
+ LPKEYVALUE p;
+
+ if (IsAvailableOnList(Table->HeaderList, Label, &p)) {
+
+ // Available, keep type and table
+ char Buffer[256];
+
+ char *Type = p ->Value;
+ int nTable = k;
+
+ sprintf(Buffer, "%s %d %s", Label, nTable, Type );
+
+ SetData(it8, i, idField, Buffer);
+ }
+ }
+
+
+ }
+
+ }
+
+
+ }
+
+ }
+ }
+
+ it8 ->nTable = nOldTable;
+}
+
+// Try to infere if the file is a CGATS/IT8 file at all. Read first line
+// that should be something like some printable characters plus a \n
+
+static
+BOOL IsMyBlock(LPBYTE Buffer, size_t n)
+{
+ size_t i;
+
+ if (n < 10) return FALSE; // Too small
+
+ if (n > 132)
+ n = 132;
+
+ for (i = 1; i < n; i++) {
+
+ if (Buffer[i] == '\n' || Buffer[i] == '\r') return TRUE;
+ if (Buffer[i] < 32) return FALSE;
+
+ }
+
+ return FALSE;
+
+}
+
+
+static
+BOOL IsMyFile(const char* FileName)
+{
+ FILE *fp;
+ size_t Size;
+ BYTE Ptr[133];
+
+ fp = fopen(FileName, "rt");
+ if (!fp) {
+ cmsSignalError(LCMS_ERRC_ABORTED, "File '%s' not found", FileName);
+ return FALSE;
+ }
+
+ Size = fread(Ptr, 1, 132, fp);
+ fclose(fp);
+
+ Ptr[Size] = '\0';
+
+ return IsMyBlock(Ptr, Size);
+}
+
+// ---------------------------------------------------------- Exported routines
+
+
+LCMSHANDLE LCMSEXPORT cmsIT8LoadFromMem(void *Ptr, size_t len)
+{
+ LCMSHANDLE hIT8;
+ LPIT8 it8;
+
+ if (!IsMyBlock((LPBYTE) Ptr, len)) return NULL;
+
+ hIT8 = cmsIT8Alloc();
+ if (!hIT8) return NULL;
+
+ it8 = (LPIT8) hIT8;
+ it8 ->MemoryBlock = (char*) malloc(len + 1);
+
+ strncpy(it8 ->MemoryBlock, (const char*) Ptr, len);
+ it8 ->MemoryBlock[len] = 0;
+
+ strncpy(it8->FileName, "", MAX_PATH-1);
+ it8-> Source = it8 -> MemoryBlock;
+
+ if (!ParseIT8(it8)) {
+
+ cmsIT8Free(hIT8);
+ return FALSE;
+ }
+
+ CookPointers(it8);
+ it8 ->nTable = 0;
+
+ free(it8->MemoryBlock);
+ it8 -> MemoryBlock = NULL;
+
+ return hIT8;
+
+
+}
+
+
+LCMSHANDLE LCMSEXPORT cmsIT8LoadFromFile(const char* cFileName)
+{
+
+ LCMSHANDLE hIT8;
+ LPIT8 it8;
+
+ if (!IsMyFile(cFileName)) return NULL;
+
+ hIT8 = cmsIT8Alloc();
+ it8 = (LPIT8) hIT8;
+ if (!hIT8) return NULL;
+
+
+ it8 ->Stream[0] = fopen(cFileName, "rt");
+
+ if (!it8 ->Stream[0]) {
+ cmsIT8Free(hIT8);
+ return NULL;
+ }
+
+
+ strncpy(it8->FileName, cFileName, MAX_PATH-1);
+
+ if (!ParseIT8(it8)) {
+
+ fclose(it8 ->Stream[0]);
+ cmsIT8Free(hIT8);
+ return NULL;
+ }
+
+ CookPointers(it8);
+ it8 ->nTable = 0;
+
+ fclose(it8 ->Stream[0]);
+ return hIT8;
+
+}
+
+int LCMSEXPORT cmsIT8EnumDataFormat(LCMSHANDLE hIT8, char ***SampleNames)
+{
+ LPIT8 it8 = (LPIT8) hIT8;
+ LPTABLE t = GetTable(it8);
+
+ *SampleNames = t -> DataFormat;
+ return t -> nSamples;
+}
+
+
+int LCMSEXPORT cmsIT8EnumProperties(LCMSHANDLE hIT8, char ***PropertyNames)
+{
+ LPIT8 it8 = (LPIT8) hIT8;
+ LPKEYVALUE p;
+ int n;
+ char **Props;
+ LPTABLE t = GetTable(it8);
+
+ // Pass#1 - count properties
+
+ n = 0;
+ for (p = t -> HeaderList; p != NULL; p = p->Next) {
+ n++;
+ }
+
+
+ Props = (char **) malloc(sizeof(char *) * n);
+
+ // Pass#2 - Fill pointers
+ n = 0;
+ for (p = t -> HeaderList; p != NULL; p = p->Next) {
+ Props[n++] = p -> Keyword;
+ }
+
+ *PropertyNames = Props;
+ return n;
+}
+
+static
+int LocatePatch(LPIT8 it8, const char* cPatch)
+{
+ int i;
+ const char *data;
+ LPTABLE t = GetTable(it8);
+
+ for (i=0; i < t-> nPatches; i++) {
+
+ data = GetData(it8, i, t->SampleID);
+
+ if (data != NULL) {
+
+ if (stricmp(data, cPatch) == 0)
+ return i;
+ }
+ }
+
+ // SynError(it8, "Couldn't find patch '%s'\n", cPatch);
+ return -1;
+}
+
+
+static
+int LocateEmptyPatch(LPIT8 it8)
+{
+ int i;
+ const char *data;
+ LPTABLE t = GetTable(it8);
+
+ for (i=0; i < t-> nPatches; i++) {
+
+ data = GetData(it8, i, t->SampleID);
+
+ if (data == NULL)
+ return i;
+
+ }
+
+ return -1;
+}
+
+static
+int LocateSample(LPIT8 it8, const char* cSample)
+{
+ int i;
+ const char *fld;
+ LPTABLE t = GetTable(it8);
+
+ for (i=0; i < t->nSamples; i++) {
+
+ fld = GetDataFormat(it8, i);
+ if (stricmp(fld, cSample) == 0)
+ return i;
+ }
+
+
+ // SynError(it8, "Couldn't find data field %s\n", cSample);
+ return -1;
+
+}
+
+
+int LCMSEXPORT cmsIT8GetDataFormat(LCMSHANDLE hIT8, const char* cSample)
+{
+ LPIT8 it8 = (LPIT8) hIT8;
+ return LocateSample(it8, cSample);
+}
+
+
+
+const char* LCMSEXPORT cmsIT8GetDataRowCol(LCMSHANDLE hIT8, int row, int col)
+{
+ LPIT8 it8 = (LPIT8) hIT8;
+
+ return GetData(it8, row, col);
+}
+
+
+double LCMSEXPORT cmsIT8GetDataRowColDbl(LCMSHANDLE hIT8, int row, int col)
+{
+ const char* Buffer;
+
+ Buffer = cmsIT8GetDataRowCol(hIT8, row, col);
+
+ if (Buffer) {
+
+ return atof(Buffer);
+
+ } else
+ return 0;
+
+}
+
+
+BOOL LCMSEXPORT cmsIT8SetDataRowCol(LCMSHANDLE hIT8, int row, int col, const char* Val)
+{
+ LPIT8 it8 = (LPIT8) hIT8;
+
+ return SetData(it8, row, col, Val);
+}
+
+
+BOOL LCMSEXPORT cmsIT8SetDataRowColDbl(LCMSHANDLE hIT8, int row, int col, double Val)
+{
+ LPIT8 it8 = (LPIT8) hIT8;
+ char Buff[256];
+
+ sprintf(Buff, it8->DoubleFormatter, Val);
+
+ return SetData(it8, row, col, Buff);
+}
+
+
+
+const char* LCMSEXPORT cmsIT8GetData(LCMSHANDLE hIT8, const char* cPatch, const char* cSample)
+{
+ LPIT8 it8 = (LPIT8) hIT8;
+ int iField, iSet;
+
+
+ iField = LocateSample(it8, cSample);
+ if (iField < 0) {
+ return NULL;
+ }
+
+
+ iSet = LocatePatch(it8, cPatch);
+ if (iSet < 0) {
+ return NULL;
+ }
+
+ return GetData(it8, iSet, iField);
+}
+
+
+double LCMSEXPORT cmsIT8GetDataDbl(LCMSHANDLE it8, const char* cPatch, const char* cSample)
+{
+ const char* Buffer;
+
+ Buffer = cmsIT8GetData(it8, cPatch, cSample);
+
+ if (Buffer) {
+
+ return atof(Buffer);
+
+ } else {
+
+ return 0;
+ }
+}
+
+
+
+BOOL LCMSEXPORT cmsIT8SetData(LCMSHANDLE hIT8, const char* cPatch,
+ const char* cSample,
+ const char *Val)
+{
+ LPIT8 it8 = (LPIT8) hIT8;
+ int iField, iSet;
+ LPTABLE t = GetTable(it8);
+
+
+ iField = LocateSample(it8, cSample);
+
+ if (iField < 0)
+ return FALSE;
+
+
+
+ if (t-> nPatches == 0) {
+
+ AllocateDataFormat(it8);
+ AllocateDataSet(it8);
+ CookPointers(it8);
+ }
+
+
+ if (stricmp(cSample, "SAMPLE_ID") == 0)
+ {
+
+ iSet = LocateEmptyPatch(it8);
+ if (iSet < 0) {
+ return SynError(it8, "Couldn't add more patches '%s'\n", cPatch);
+ }
+
+ iField = t -> SampleID;
+ }
+ else {
+ iSet = LocatePatch(it8, cPatch);
+ if (iSet < 0) {
+ return FALSE;
+ }
+ }
+
+ return SetData(it8, iSet, iField, Val);
+}
+
+
+BOOL LCMSEXPORT cmsIT8SetDataDbl(LCMSHANDLE hIT8, const char* cPatch,
+ const char* cSample,
+ double Val)
+{
+ LPIT8 it8 = (LPIT8) hIT8;
+ char Buff[256];
+
+ sprintf(Buff, it8->DoubleFormatter, Val);
+ return cmsIT8SetData(hIT8, cPatch, cSample, Buff);
+
+}
+
+
+const char* LCMSEXPORT cmsIT8GetPatchName(LCMSHANDLE hIT8, int nPatch, char* buffer)
+{
+ LPIT8 it8 = (LPIT8) hIT8;
+ LPTABLE t = GetTable(it8);
+ char* Data = GetData(it8, nPatch, t->SampleID);
+
+ if (!Data) return NULL;
+ if (!buffer) return Data;
+
+ strcpy(buffer, Data);
+ return buffer;
+}
+
+int LCMSEXPORT cmsIT8TableCount(LCMSHANDLE hIT8)
+{
+ LPIT8 it8 = (LPIT8) hIT8;
+
+ return it8 ->TablesCount;
+}
+
+// This handles the "LABEL" extension.
+// Label, nTable, Type
+
+int LCMSEXPORT cmsIT8SetTableByLabel(LCMSHANDLE hIT8, const char* cSet, const char* cField, const char* ExpectedType)
+{
+ const char* cLabelFld;
+ char Type[256], Label[256];
+ int nTable;
+
+ if (cField != NULL && *cField == 0)
+ cField = "LABEL";
+
+ if (cField == NULL)
+ cField = "LABEL";
+
+ cLabelFld = cmsIT8GetData(hIT8, cSet, cField);
+ if (!cLabelFld) return -1;
+
+ if (sscanf(cLabelFld, "%s %d %s", Label, &nTable, Type) != 3)
+ return -1;
+
+ if (ExpectedType != NULL && *ExpectedType == 0)
+ ExpectedType = NULL;
+
+ if (ExpectedType) {
+
+ if (stricmp(Type, ExpectedType) != 0) return -1;
+ }
+
+ return cmsIT8SetTable(hIT8, nTable);
+}
+
+
+void LCMSEXPORT cmsIT8DefineDblFormat(LCMSHANDLE hIT8, const char* Formatter)
+{
+ LPIT8 it8 = (LPIT8) hIT8;
+
+ if (Formatter == NULL)
+ strcpy(it8->DoubleFormatter, DEFAULT_DBL_FORMAT);
+ else
+ strcpy(it8->DoubleFormatter, Formatter);
+}
+
diff --git a/icc2ps/cmscnvrt.c b/icc2ps/cmscnvrt.c
new file mode 100644
index 0000000..587ac57
--- /dev/null
+++ b/icc2ps/cmscnvrt.c
@@ -0,0 +1,637 @@
+//
+// Little cms
+// Copyright (C) 1998-2005 Marti Maria
+//
+// Permission is hereby granted, free of charge, to any person obtaining
+// a copy of this software and associated documentation files (the "Software"),
+// to deal in the Software without restriction, including without limitation
+// the rights to use, copy, modify, merge, publish, distribute, sublicense,
+// and/or sell copies of the Software, and to permit persons to whom the Software
+// is furnished to do so, subject to the following conditions:
+//
+// The above copyright notice and this permission notice shall be included in
+// all copies or substantial portions of the Software.
+//
+// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
+// EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO
+// THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
+// NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
+// LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
+// OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
+// WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
+
+#include "lcms.h"
+
+
+
+
+/*
+ This module provides conversion stages for handling intents.
+
+The chain of evaluation in a transform is:
+
+ PCS1 PCS2 PCS3 PCS4
+
+|From | |From | |Conversion | |Preview | |Gamut | |Conversion | |To | |To |
+|Input|->|Device|->|Stage 1 |->|handling|->|Checking|->|Stage 2 |->|Device|->|output |
+
+-------- ------- ------------- --------- ---------- ------------- ------- ---------
+
+ AToB0 prew0 gamut BToA0
+Formatting LUT Adjusting LUT LUT Adjusting LUT Formatting
+ Intent Intent 1 intent intent Intent 2 Intent
+
+
+Some of these LUT may be missing
+
+There are two intents involved here, the intent of the transform itself, and the
+intent the proof is being done, if is the case. Since the first intent is to be
+applied to preview, is the proofing intent. The second intent identifies the
+transform intent. Input data of any stage is taked as relative colorimetric
+always.
+
+
+NOTES: V4 states than perceptual & saturation intents between mixed v2 & v4 profiles should
+scale PCS from a black point equal to ZERO in v2 profiles to the reference media black of
+perceptual v4 PCS. Since I found many v2 profiles to be using a perceptual intent with black
+point not zero at all, I'm implementing that as a black point compensation from whatever
+black from perceptal intent to the reference media black for v4 profiles.
+
+*/
+
+
+
+
+int cdecl cmsChooseCnvrt(int Absolute,
+ int Phase1, LPcmsCIEXYZ BlackPointIn,
+ LPcmsCIEXYZ WhitePointIn,
+ LPcmsCIEXYZ IlluminantIn,
+ LPMAT3 ChromaticAdaptationMatrixIn,
+
+ int Phase2, LPcmsCIEXYZ BlackPointOut,
+ LPcmsCIEXYZ WhitePointOut,
+ LPcmsCIEXYZ IlluminantOut,
+ LPMAT3 ChromaticAdaptationMatrixOut,
+
+ int DoBlackPointCompensation,
+ double AdaptationState,
+ _cmsADJFN *fn1,
+ LPWMAT3 wm, LPWVEC3 wof);
+
+
+// -------------------------------------------------------------------------
+
+// D50 - Widely used
+
+LCMSAPI LPcmsCIEXYZ LCMSEXPORT cmsD50_XYZ(void)
+{
+ static cmsCIEXYZ D50XYZ = {D50X, D50Y, D50Z};
+
+ return &D50XYZ;
+}
+
+LCMSAPI LPcmsCIExyY LCMSEXPORT cmsD50_xyY(void)
+{
+ static cmsCIExyY D50xyY;
+ cmsXYZ2xyY(&D50xyY, cmsD50_XYZ());
+
+ return &D50xyY;
+}
+
+
+// ---------------- From LUT to LUT --------------------------
+
+
+// Calculate m, offset Relativ -> Absolute undoing any chromatic
+// adaptation done by the profile.
+
+#ifdef _MSC_VER
+#pragma warning(disable : 4100 4505)
+#endif
+
+
+
+// join scalings to obtain:
+// relative input to absolute and then to relative output
+
+static
+void Rel2RelStepAbsCoefs(double AdaptationState,
+
+ LPcmsCIEXYZ BlackPointIn,
+ LPcmsCIEXYZ WhitePointIn,
+ LPcmsCIEXYZ IlluminantIn,
+ LPMAT3 ChromaticAdaptationMatrixIn,
+
+ LPcmsCIEXYZ BlackPointOut,
+ LPcmsCIEXYZ WhitePointOut,
+ LPcmsCIEXYZ IlluminantOut,
+ LPMAT3 ChromaticAdaptationMatrixOut,
+
+ LPMAT3 m, LPVEC3 of)
+{
+
+ VEC3 WtPtIn, WtPtInAdapted;
+ VEC3 WtPtOut, WtPtOutAdapted;
+ MAT3 Scale, m1, m2, m3;
+
+ VEC3init(&WtPtIn, WhitePointIn->X, WhitePointIn->Y, WhitePointIn->Z);
+ MAT3eval(&WtPtInAdapted, ChromaticAdaptationMatrixIn, &WtPtIn);
+
+ VEC3init(&WtPtOut, WhitePointOut->X, WhitePointOut->Y, WhitePointOut->Z);
+ MAT3eval(&WtPtOutAdapted, ChromaticAdaptationMatrixOut, &WtPtOut);
+
+ VEC3init(&Scale.v[0], WtPtInAdapted.n[0] / WtPtOutAdapted.n[0], 0, 0);
+ VEC3init(&Scale.v[1], 0, WtPtInAdapted.n[1] / WtPtOutAdapted.n[1], 0);
+ VEC3init(&Scale.v[2], 0, 0, WtPtInAdapted.n[2] / WtPtOutAdapted.n[2]);
+
+
+ // Adaptation state
+
+ if (AdaptationState == 1.0) {
+
+ // Observer is fully adapted. Keep chromatic adaptation
+
+ CopyMemory(m, &Scale, sizeof(MAT3));
+
+ }
+ else {
+
+ // Observer is not adapted, undo the chromatic adaptation
+ m1 = *ChromaticAdaptationMatrixIn;
+ MAT3inverse(&m1, &m2);
+
+ MAT3per(&m3, &m2, &Scale);
+ MAT3per(m, &m3, ChromaticAdaptationMatrixOut);
+ }
+
+
+ VEC3init(of, 0.0, 0.0, 0.0);
+
+}
+
+
+// The (in)famous black point compensation. Right now implemented as
+// a linear scaling in XYZ
+
+static
+void ComputeBlackPointCompensationFactors(LPcmsCIEXYZ BlackPointIn,
+ LPcmsCIEXYZ WhitePointIn,
+ LPcmsCIEXYZ IlluminantIn,
+ LPcmsCIEXYZ BlackPointOut,
+ LPcmsCIEXYZ WhitePointOut,
+ LPcmsCIEXYZ IlluminantOut,
+ LPMAT3 m, LPVEC3 of)
+{
+
+
+ cmsCIEXYZ RelativeBlackPointIn, RelativeBlackPointOut;
+ double ax, ay, az, bx, by, bz, tx, ty, tz;
+
+ // At first, convert both black points to relative.
+
+ cmsAdaptToIlluminant(&RelativeBlackPointIn, WhitePointIn, IlluminantIn, BlackPointIn);
+ cmsAdaptToIlluminant(&RelativeBlackPointOut, WhitePointOut, IlluminantOut, BlackPointOut);
+
+ // Now we need to compute a matrix plus an offset m and of such of
+ // [m]*bpin + off = bpout
+ // [m]*D50 + off = D50
+ //
+ // This is a linear scaling in the form ax+b, where
+ // a = (bpout - D50) / (bpin - D50)
+ // b = - D50* (bpout - bpin) / (bpin - D50)
+
+
+ tx = RelativeBlackPointIn.X - IlluminantIn ->X;
+ ty = RelativeBlackPointIn.Y - IlluminantIn ->Y;
+ tz = RelativeBlackPointIn.Z - IlluminantIn ->Z;
+
+ ax = (RelativeBlackPointOut.X - IlluminantOut ->X) / tx;
+ ay = (RelativeBlackPointOut.Y - IlluminantOut ->Y) / ty;
+ az = (RelativeBlackPointOut.Z - IlluminantOut ->Z) / tz;
+
+ bx = - IlluminantOut -> X * (RelativeBlackPointOut.X - RelativeBlackPointIn.X) / tx;
+ by = - IlluminantOut -> Y * (RelativeBlackPointOut.Y - RelativeBlackPointIn.Y) / ty;
+ bz = - IlluminantOut -> Z * (RelativeBlackPointOut.Z - RelativeBlackPointIn.Z) / tz;
+
+
+ MAT3identity(m);
+
+ m->v[VX].n[0] = ax;
+ m->v[VY].n[1] = ay;
+ m->v[VZ].n[2] = az;
+
+ VEC3init(of, bx, by, bz);
+
+}
+
+// Return TRUE if both m and of are empy -- "m" being identity and "of" being 0
+
+static
+BOOL IdentityParameters(LPWMAT3 m, LPWVEC3 of)
+{
+ WVEC3 wv0;
+
+ VEC3initF(&wv0, 0, 0, 0);
+
+ if (!MAT3isIdentity(m, 0.00001)) return FALSE;
+ if (!VEC3equal(of, &wv0, 0.00001)) return FALSE;
+
+ return TRUE;
+}
+
+
+
+
+// ----------------------------------------- Inter PCS conversions
+
+// XYZ to XYZ linear scaling. Aso used on Black point compensation
+
+static
+void XYZ2XYZ(WORD In[], WORD Out[], LPWMAT3 m, LPWVEC3 of)
+{
+
+ WVEC3 a, r;
+
+ a.n[0] = In[0] << 1;
+ a.n[1] = In[1] << 1;
+ a.n[2] = In[2] << 1;
+
+ MAT3evalW(&r, m, &a);
+
+ Out[0] = _cmsClampWord((r.n[VX] + of->n[VX]) >> 1);
+ Out[1] = _cmsClampWord((r.n[VY] + of->n[VY]) >> 1);
+ Out[2] = _cmsClampWord((r.n[VZ] + of->n[VZ]) >> 1);
+}
+
+
+// XYZ to Lab, scaling first
+
+static
+void XYZ2Lab(WORD In[], WORD Out[], LPWMAT3 m, LPWVEC3 of)
+{
+ WORD XYZ[3];
+
+ XYZ2XYZ(In, XYZ, m, of);
+ cmsXYZ2LabEncoded(XYZ, Out);
+}
+
+// Lab to XYZ, then scalling
+
+static
+void Lab2XYZ(WORD In[], WORD Out[], LPWMAT3 m, LPWVEC3 of)
+{
+ WORD XYZ[3];
+
+ cmsLab2XYZEncoded(In, XYZ);
+ XYZ2XYZ(XYZ, Out, m, of);
+}
+
+// Lab to XYZ, scalling and then, back to Lab
+
+static
+void Lab2XYZ2Lab(WORD In[], WORD Out[], LPWMAT3 m, LPWVEC3 of)
+{
+ WORD XYZ[3], XYZ2[3];
+
+ cmsLab2XYZEncoded(In, XYZ);
+ XYZ2XYZ(XYZ, XYZ2, m, of);
+ cmsXYZ2LabEncoded(XYZ2, Out);
+}
+
+// ------------------------------------------------------------------
+
+// Dispatcher for XYZ Relative LUT
+
+static
+int FromXYZRelLUT(int Absolute,
+ LPcmsCIEXYZ BlackPointIn,
+ LPcmsCIEXYZ WhitePointIn,
+ LPcmsCIEXYZ IlluminantIn,
+ LPMAT3 ChromaticAdaptationMatrixIn,
+
+ int Phase2, LPcmsCIEXYZ BlackPointOut,
+ LPcmsCIEXYZ WhitePointOut,
+ LPcmsCIEXYZ IlluminantOut,
+ LPMAT3 ChromaticAdaptationMatrixOut,
+
+ int DoBlackPointCompensation,
+ double AdaptationState,
+ _cmsADJFN *fn1,
+ LPMAT3 m, LPVEC3 of)
+
+{
+ switch (Phase2) {
+
+ // From relative XYZ to Relative XYZ.
+
+ case XYZRel:
+
+ if (Absolute)
+ {
+ // From input relative to absolute, and then
+ // back to output relative
+
+ Rel2RelStepAbsCoefs(AdaptationState,
+ BlackPointIn,
+ WhitePointIn,
+ IlluminantIn,
+ ChromaticAdaptationMatrixIn,
+ BlackPointOut,
+ WhitePointOut,
+ IlluminantOut,
+ ChromaticAdaptationMatrixOut,
+ m, of);
+ *fn1 = XYZ2XYZ;
+
+ }
+ else
+ {
+ // XYZ Relative to XYZ relative, no op required
+ *fn1 = NULL;
+ if (DoBlackPointCompensation) {
+
+ *fn1 = XYZ2XYZ;
+ ComputeBlackPointCompensationFactors(BlackPointIn,
+ WhitePointIn,
+ IlluminantIn,
+ BlackPointOut,
+ WhitePointOut,
+ IlluminantOut,
+ m, of);
+
+ }
+ }
+ break;
+
+
+ // From relative XYZ to Relative Lab
+
+ case LabRel:
+
+ // First pass XYZ to absolute, then to relative and
+ // finally to Lab. I use here D50 for output in order
+ // to prepare the "to Lab" conversion.
+
+ if (Absolute)
+ {
+
+ Rel2RelStepAbsCoefs(AdaptationState,
+ BlackPointIn,
+ WhitePointIn,
+ IlluminantIn,
+ ChromaticAdaptationMatrixIn,
+ BlackPointOut,
+ WhitePointOut,
+ IlluminantOut,
+ ChromaticAdaptationMatrixOut,
+ m, of);
+
+ *fn1 = XYZ2Lab;
+
+ }
+ else
+ {
+ // Just Convert to Lab
+
+ MAT3identity(m);
+ VEC3init(of, 0, 0, 0);
+ *fn1 = XYZ2Lab;
+
+ if (DoBlackPointCompensation) {
+
+ ComputeBlackPointCompensationFactors(BlackPointIn,
+ WhitePointIn,
+ IlluminantIn,
+ BlackPointOut,
+ WhitePointOut,
+ IlluminantOut,
+ m, of);
+ }
+ }
+ break;
+
+
+ default: return FALSE;
+ }
+
+ return TRUE;
+}
+
+
+
+
+// From Lab Relative type LUT
+
+static
+int FromLabRelLUT(int Absolute,
+ LPcmsCIEXYZ BlackPointIn,
+ LPcmsCIEXYZ WhitePointIn,
+ LPcmsCIEXYZ IlluminantIn,
+ LPMAT3 ChromaticAdaptationMatrixIn,
+
+ int Phase2, LPcmsCIEXYZ BlackPointOut,
+ LPcmsCIEXYZ WhitePointOut,
+ LPcmsCIEXYZ IlluminantOut,
+ LPMAT3 ChromaticAdaptationMatrixOut,
+
+ int DoBlackPointCompensation,
+ double AdaptationState,
+
+ _cmsADJFN *fn1,
+ LPMAT3 m, LPVEC3 of)
+{
+
+ switch (Phase2) {
+
+ // From Lab Relative to XYZ Relative, very usual case
+
+ case XYZRel:
+
+ if (Absolute) { // Absolute intent
+
+ // From lab relative, to XYZ absolute, and then,
+ // back to XYZ relative
+
+ Rel2RelStepAbsCoefs(AdaptationState,
+ BlackPointIn,
+ WhitePointIn,
+ cmsD50_XYZ(),
+ ChromaticAdaptationMatrixIn,
+ BlackPointOut,
+ WhitePointOut,
+ IlluminantOut,
+ ChromaticAdaptationMatrixOut,
+ m, of);
+
+ *fn1 = Lab2XYZ;
+
+ }
+ else
+ {
+ // From Lab relative, to XYZ relative.
+
+ *fn1 = Lab2XYZ;
+ if (DoBlackPointCompensation) {
+
+ ComputeBlackPointCompensationFactors(BlackPointIn,
+ WhitePointIn,
+ IlluminantIn,
+ BlackPointOut,
+ WhitePointOut,
+ IlluminantOut,
+ m, of);
+
+ }
+ }
+ break;
+
+
+
+ case LabRel:
+
+ if (Absolute) {
+
+ // First pass to XYZ using the input illuminant
+ // * InIlluminant / D50, then to absolute. Then
+ // to relative, but for input
+
+ Rel2RelStepAbsCoefs(AdaptationState,
+ BlackPointIn,
+ WhitePointIn, IlluminantIn,
+ ChromaticAdaptationMatrixIn,
+ BlackPointOut,
+ WhitePointOut, cmsD50_XYZ(),
+ ChromaticAdaptationMatrixOut,
+ m, of);
+ *fn1 = Lab2XYZ2Lab;
+ }
+ else
+ { // Lab -> Lab relative don't need any adjust unless
+ // black point compensation
+
+ *fn1 = NULL;
+ if (DoBlackPointCompensation) {
+
+ *fn1 = Lab2XYZ2Lab;
+ ComputeBlackPointCompensationFactors(BlackPointIn,
+ WhitePointIn,
+ IlluminantIn,
+ BlackPointOut,
+ WhitePointOut,
+ IlluminantOut,
+ m, of);
+
+
+ }
+ }
+ break;
+
+
+ default: return FALSE;
+ }
+
+ return TRUE;
+}
+
+
+// This function does calculate the necessary conversion operations
+// needed from transpassing data from a LUT to a LUT. The conversion
+// is modeled as a pointer of function and two coefficients, a and b
+// The function is actually called only if not null pointer is provided,
+// and the two paramaters are passed in. There are several types of
+// conversions, but basically they do a linear scalling and a interchange
+
+
+
+// Main dispatcher
+
+int cmsChooseCnvrt(int Absolute,
+ int Phase1, LPcmsCIEXYZ BlackPointIn,
+ LPcmsCIEXYZ WhitePointIn,
+ LPcmsCIEXYZ IlluminantIn,
+ LPMAT3 ChromaticAdaptationMatrixIn,
+
+ int Phase2, LPcmsCIEXYZ BlackPointOut,
+ LPcmsCIEXYZ WhitePointOut,
+ LPcmsCIEXYZ IlluminantOut,
+ LPMAT3 ChromaticAdaptationMatrixOut,
+
+ int DoBlackPointCompensation,
+ double AdaptationState,
+ _cmsADJFN *fn1,
+ LPWMAT3 wm, LPWVEC3 wof)
+{
+
+ int rc;
+ MAT3 m;
+ VEC3 of;
+
+
+ MAT3identity(&m);
+ VEC3init(&of, 0, 0, 0);
+
+ switch (Phase1) {
+
+ // Input LUT is giving XYZ relative values.
+
+ case XYZRel: rc = FromXYZRelLUT(Absolute,
+ BlackPointIn,
+ WhitePointIn,
+ IlluminantIn,
+ ChromaticAdaptationMatrixIn,
+ Phase2,
+ BlackPointOut,
+ WhitePointOut,
+ IlluminantOut,
+ ChromaticAdaptationMatrixOut,
+ DoBlackPointCompensation,
+ AdaptationState,
+ fn1, &m, &of);
+ break;
+
+
+
+ // Input LUT is giving Lab relative values
+
+ case LabRel: rc = FromLabRelLUT(Absolute,
+ BlackPointIn,
+ WhitePointIn,
+ IlluminantIn,
+ ChromaticAdaptationMatrixIn,
+ Phase2,
+ BlackPointOut,
+ WhitePointOut,
+ IlluminantOut,
+ ChromaticAdaptationMatrixOut,
+ DoBlackPointCompensation,
+ AdaptationState,
+ fn1, &m, &of);
+ break;
+
+
+
+
+ // Unrecognized combination
+
+ default: cmsSignalError(LCMS_ERRC_ABORTED, "(internal) Phase error");
+ return FALSE;
+
+ }
+
+ MAT3toFix(wm, &m);
+ VEC3toFix(wof, &of);
+
+ // Do some optimization -- discard conversion if identity parameters.
+
+ if (*fn1 == XYZ2XYZ || *fn1 == Lab2XYZ2Lab) {
+
+ if (IdentityParameters(wm, wof))
+ *fn1 = NULL;
+ }
+
+
+ return rc;
+}
+
+
+
diff --git a/icc2ps/cmserr.c b/icc2ps/cmserr.c
new file mode 100644
index 0000000..16a1fa2
--- /dev/null
+++ b/icc2ps/cmserr.c
@@ -0,0 +1,110 @@
+//
+// Little cms
+// Copyright (C) 1998-2005 Marti Maria
+//
+// Permission is hereby granted, free of charge, to any person obtaining
+// a copy of this software and associated documentation files (the "Software"),
+// to deal in the Software without restriction, including without limitation
+// the rights to use, copy, modify, merge, publish, distribute, sublicense,
+// and/or sell copies of the Software, and to permit persons to whom the Software
+// is furnished to do so, subject to the following conditions:
+//
+// The above copyright notice and this permission notice shall be included in
+// all copies or substantial portions of the Software.
+//
+// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
+// EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO
+// THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
+// NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
+// LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
+// OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
+// WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
+
+
+#include "lcms.h"
+
+
+// As a rule, only the functions visible from API can signal
+// errors.
+
+void cdecl cmsSignalError(int ErrorCode, const char *ErrorText, ...);
+int LCMSEXPORT cmsErrorAction(int lAbort);
+
+
+// ******************************************************************
+
+static int nDoAbort = LCMS_ERROR_ABORT;
+static cmsErrorHandlerFunction UserErrorHandler = (cmsErrorHandlerFunction) NULL;
+
+
+int LCMSEXPORT cmsErrorAction(int nAction)
+{
+ int nOld = nDoAbort;
+ nDoAbort = nAction;
+
+ return nOld;
+}
+
+void LCMSEXPORT cmsSetErrorHandler(cmsErrorHandlerFunction Fn)
+{
+ UserErrorHandler = Fn;
+}
+
+
+// Default error handler
+
+
+void cmsSignalError(int ErrorCode, const char *ErrorText, ...)
+{
+ va_list args;
+
+
+ if (nDoAbort == LCMS_ERROR_IGNORE) return;
+
+ va_start(args, ErrorText);
+
+ if (UserErrorHandler != NULL) {
+
+ char Buffer[1024];
+
+ vsprintf(Buffer, ErrorText, args);
+ va_end(args);
+
+ if (UserErrorHandler(ErrorCode, Buffer)) {
+
+ return;
+ }
+ }
+
+#if defined( __CONSOLE__ ) || defined( NON_WINDOWS )
+
+ fprintf(stderr, "lcms: Error #%d; ", ErrorCode);
+ vfprintf(stderr, ErrorText, args);
+ fprintf(stderr, "\n");
+ va_end(args);
+
+ if (nDoAbort == LCMS_ERROR_ABORT) exit(1);
+#else
+ {
+ char Buffer1[1024];
+ char Buffer2[256];
+
+ sprintf(Buffer1, "Error #%x; ", ErrorCode);
+ vsprintf(Buffer2, ErrorText, args);
+ strcat(Buffer1, Buffer2);
+ MessageBox(NULL, Buffer1, "Little cms",
+ MB_OK|MB_ICONSTOP|MB_TASKMODAL);
+ va_end(args);
+
+ if (nDoAbort == LCMS_ERROR_ABORT) {
+
+#ifdef __BORLANDC__
+ _cexit();
+#endif
+
+ FatalAppExit(0, "lcms is terminating application");
+ }
+
+ }
+#endif
+}
diff --git a/icc2ps/cmsgamma.c b/icc2ps/cmsgamma.c
new file mode 100644
index 0000000..d74bfe8
--- /dev/null
+++ b/icc2ps/cmsgamma.c
@@ -0,0 +1,949 @@
+//
+// Little cms
+// Copyright (C) 1998-2005 Marti Maria
+//
+// Permission is hereby granted, free of charge, to any person obtaining
+// a copy of this software and associated documentation files (the "Software"),
+// to deal in the Software without restriction, including without limitation
+// the rights to use, copy, modify, merge, publish, distribute, sublicense,
+// and/or sell copies of the Software, and to permit persons to whom the Software
+// is furnished to do so, subject to the following conditions:
+//
+// The above copyright notice and this permission notice shall be included in
+// all copies or substantial portions of the Software.
+//
+// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
+// EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO
+// THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
+// NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
+// LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
+// OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
+// WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
+
+
+#include "lcms.h"
+
+// Gamma handling.
+
+LPGAMMATABLE LCMSEXPORT cmsAllocGamma(int nEntries);
+void LCMSEXPORT cmsFreeGamma(LPGAMMATABLE Gamma);
+void LCMSEXPORT cmsFreeGammaTriple(LPGAMMATABLE Gamma[3]);
+LPGAMMATABLE LCMSEXPORT cmsBuildGamma(int nEntries, double Gamma);
+LPGAMMATABLE LCMSEXPORT cmsDupGamma(LPGAMMATABLE Src);
+LPGAMMATABLE LCMSEXPORT cmsReverseGamma(int nResultSamples, LPGAMMATABLE InGamma);
+LPGAMMATABLE LCMSEXPORT cmsBuildParametricGamma(int nEntries, int Type, double Params[]);
+LPGAMMATABLE LCMSEXPORT cmsJoinGamma(LPGAMMATABLE InGamma, LPGAMMATABLE OutGamma);
+LPGAMMATABLE LCMSEXPORT cmsJoinGammaEx(LPGAMMATABLE InGamma, LPGAMMATABLE OutGamma, int nPoints);
+BOOL LCMSEXPORT cmsSmoothGamma(LPGAMMATABLE Tab, double lambda);
+
+BOOL cdecl _cmsSmoothEndpoints(LPWORD Table, int nPoints);
+
+
+// Sampled curves
+
+LPSAMPLEDCURVE cdecl cmsAllocSampledCurve(int nItems);
+void cdecl cmsFreeSampledCurve(LPSAMPLEDCURVE p);
+void cdecl cmsEndpointsOfSampledCurve(LPSAMPLEDCURVE p, double* Min, double* Max);
+void cdecl cmsClampSampledCurve(LPSAMPLEDCURVE p, double Min, double Max);
+BOOL cdecl cmsSmoothSampledCurve(LPSAMPLEDCURVE Tab, double SmoothingLambda);
+void cdecl cmsRescaleSampledCurve(LPSAMPLEDCURVE p, double Min, double Max, int nPoints);
+
+LPSAMPLEDCURVE cdecl cmsJoinSampledCurves(LPSAMPLEDCURVE X, LPSAMPLEDCURVE Y, int nResultingPoints);
+
+double LCMSEXPORT cmsEstimateGamma(LPGAMMATABLE t);
+double LCMSEXPORT cmsEstimateGammaEx(LPWORD GammaTable, int nEntries, double Thereshold);
+
+// ----------------------------------------------------------------------------------------
+
+// #define DEBUG 1
+
+#define MAX_KNOTS 4096
+typedef float vec[MAX_KNOTS+1];
+
+
+// Ciclic-redundant-check for assuring table is a true representation of parametric curve
+
+// The usual polynomial, which is used for AAL5, FDDI, and probably Ethernet
+#define QUOTIENT 0x04c11db7
+
+static
+unsigned int Crc32(unsigned int result, LPVOID ptr, int len)
+{
+ int i,j;
+ BYTE octet;
+ LPBYTE data = (LPBYTE) ptr;
+
+ for (i=0; i < len; i++) {
+
+ octet = *data++;
+
+ for (j=0; j < 8; j++) {
+
+ if (result & 0x80000000) {
+
+ result = (result << 1) ^ QUOTIENT ^ (octet >> 7);
+ }
+ else
+ {
+ result = (result << 1) ^ (octet >> 7);
+ }
+ octet <<= 1;
+ }
+ }
+
+ return result;
+}
+
+// Get CRC of gamma table
+
+unsigned int _cmsCrc32OfGammaTable(LPGAMMATABLE Table)
+{
+ unsigned int crc = ~0U;
+
+ crc = Crc32(crc, &Table -> Birth.Type, sizeof(int));
+ crc = Crc32(crc, Table ->Birth.Params, sizeof(double)*10);
+ crc = Crc32(crc, &Table ->nEntries, sizeof(int));
+ crc = Crc32(crc, Table ->GammaTable, sizeof(WORD) * Table -> nEntries);
+
+ return ~crc;
+
+}
+
+
+LPGAMMATABLE LCMSEXPORT cmsAllocGamma(int nEntries)
+{
+ LPGAMMATABLE p;
+ size_t size;
+
+ if (nEntries > 65530) {
+ cmsSignalError(LCMS_ERRC_WARNING, "Couldn't create gammatable of more than 65530 entries; 65530 assumed");
+ nEntries = 65530;
+ }
+
+ size = sizeof(GAMMATABLE) + (sizeof(WORD) * (nEntries-1));
+
+ p = (LPGAMMATABLE) malloc(size);
+ if (!p) return NULL;
+
+ ZeroMemory(p, size);
+
+ p -> Birth.Type = 0;
+ p -> nEntries = nEntries;
+
+ return p;
+}
+
+void LCMSEXPORT cmsFreeGamma(LPGAMMATABLE Gamma)
+{
+ if (Gamma) free(Gamma);
+}
+
+
+
+void LCMSEXPORT cmsFreeGammaTriple(LPGAMMATABLE Gamma[3])
+{
+ cmsFreeGamma(Gamma[0]);
+ cmsFreeGamma(Gamma[1]);
+ cmsFreeGamma(Gamma[2]);
+ Gamma[0] = Gamma[1] = Gamma[2] = NULL;
+}
+
+
+
+// Duplicate a gamma table
+
+LPGAMMATABLE LCMSEXPORT cmsDupGamma(LPGAMMATABLE In)
+{
+ LPGAMMATABLE Ptr;
+ size_t size;
+
+ Ptr = cmsAllocGamma(In -> nEntries);
+ if (Ptr == NULL) return NULL;
+
+ size = sizeof(GAMMATABLE) + (sizeof(WORD) * (In -> nEntries-1));
+
+ CopyMemory(Ptr, In, size);
+ return Ptr;
+}
+
+
+// Handle gamma using interpolation tables. The resulting curves can become
+// very stange, but are pleasent to eye.
+
+LPGAMMATABLE LCMSEXPORT cmsJoinGamma(LPGAMMATABLE InGamma,
+ LPGAMMATABLE OutGamma)
+{
+ register int i;
+ L16PARAMS L16In, L16Out;
+ LPWORD InPtr, OutPtr;
+ LPGAMMATABLE p;
+
+ p = cmsAllocGamma(256);
+ if (!p) return NULL;
+
+ cmsCalcL16Params(InGamma -> nEntries, &L16In);
+ InPtr = InGamma -> GammaTable;
+
+ cmsCalcL16Params(OutGamma -> nEntries, &L16Out);
+ OutPtr = OutGamma-> GammaTable;
+
+ for (i=0; i < 256; i++)
+ {
+ WORD wValIn, wValOut;
+
+ wValIn = cmsLinearInterpLUT16(RGB_8_TO_16(i), InPtr, &L16In);
+ wValOut = cmsReverseLinearInterpLUT16(wValIn, OutPtr, &L16Out);
+
+ p -> GammaTable[i] = wValOut;
+ }
+
+ return p;
+}
+
+
+
+// New method, using smoothed parametric curves. This works FAR better.
+// We want to get
+//
+// y = f(g^-1(x)) ; f = ingamma, g = outgamma
+//
+// And this can be parametrized as
+//
+// y = f(t)
+// x = g(t)
+
+
+LPGAMMATABLE LCMSEXPORT cmsJoinGammaEx(LPGAMMATABLE InGamma,
+ LPGAMMATABLE OutGamma, int nPoints)
+{
+
+ LPSAMPLEDCURVE x, y, r;
+ LPGAMMATABLE res;
+
+ x = cmsConvertGammaToSampledCurve(InGamma, nPoints);
+ y = cmsConvertGammaToSampledCurve(OutGamma, nPoints);
+ r = cmsJoinSampledCurves(y, x, nPoints);
+
+ // Does clean "hair"
+ cmsSmoothSampledCurve(r, 0.001);
+
+ cmsClampSampledCurve(r, 0.0, 65535.0);
+
+ cmsFreeSampledCurve(x);
+ cmsFreeSampledCurve(y);
+
+ res = cmsConvertSampledCurveToGamma(r, 65535.0);
+ cmsFreeSampledCurve(r);
+
+ return res;
+}
+
+
+
+// Reverse a gamma table
+
+LPGAMMATABLE LCMSEXPORT cmsReverseGamma(int nResultSamples, LPGAMMATABLE InGamma)
+{
+ register int i;
+ L16PARAMS L16In;
+ LPWORD InPtr;
+ LPGAMMATABLE p;
+
+ p = cmsAllocGamma(nResultSamples);
+ if (!p) return NULL;
+
+ cmsCalcL16Params(InGamma -> nEntries, &L16In);
+ InPtr = InGamma -> GammaTable;
+
+ for (i=0; i < nResultSamples; i++)
+ {
+ WORD wValIn, wValOut;
+
+ wValIn = _cmsQuantizeVal(i, nResultSamples);
+ wValOut = cmsReverseLinearInterpLUT16(wValIn, InPtr, &L16In);
+ p -> GammaTable[i] = wValOut;
+ }
+
+
+ return p;
+}
+
+
+
+// Parametric curves
+//
+// Parameters goes as: Gamma, a, b, c, d, e, f
+// Type is the ICC type +1
+// if type is negative, then the curve is analyticaly inverted
+
+LPGAMMATABLE LCMSEXPORT cmsBuildParametricGamma(int nEntries, int Type, double Params[])
+{
+ LPGAMMATABLE Table;
+ double R, Val, dval, e;
+ int i;
+ int ParamsByType[] = { 0, 1, 3, 4, 5, 7 };
+
+ Table = cmsAllocGamma(nEntries);
+ if (NULL == Table) return NULL;
+
+ Table -> Birth.Type = Type;
+
+ CopyMemory(Table ->Birth.Params, Params, ParamsByType[abs(Type)] * sizeof(double));
+
+
+ for (i=0; i < nEntries; i++) {
+
+ R = (double) i / (nEntries-1);
+
+ switch (Type) {
+
+ // X = Y ^ Gamma
+ case 1:
+ Val = pow(R, Params[0]);
+ break;
+
+ // Type 1 Reversed: X = Y ^1/gamma
+ case -1:
+ Val = pow(R, 1/Params[0]);
+ break;
+
+ // CIE 122-1966
+ // Y = (aX + b)^Gamma | X >= -b/a
+ // Y = 0 | else
+ case 2:
+ if (R >= -Params[2] / Params[1]) {
+
+ e = Params[1]*R + Params[2];
+
+ if (e > 0)
+ Val = pow(e, Params[0]);
+ else
+ Val = 0;
+ }
+ else
+ Val = 0;
+ break;
+
+ // Type 2 Reversed
+ // X = (Y ^1/g - b) / a
+ case -2:
+
+ Val = (pow(R, 1.0/Params[0]) - Params[2]) / Params[1];
+ if (Val < 0)
+ Val = 0;
+ break;
+
+
+ // IEC 61966-3
+ // Y = (aX + b)^Gamma | X <= -b/a
+ // Y = c | else
+ case 3:
+ if (R >= -Params[2] / Params[1]) {
+
+ e = Params[1]*R + Params[2];
+ Val = pow(e, Params[0]) + Params[3];
+ }
+ else
+ Val = Params[3];
+ break;
+
+
+ // Type 3 reversed
+ // X=((Y-c)^1/g - b)/a | (Y>=c)
+ // X=-b/a | (Y<c)
+
+ case -3:
+ if (R >= Params[3]) {
+ e = R - Params[3];
+ Val = (pow(e, 1/Params[0]) - Params[2]) / Params[1];
+ if (Val < 0) Val = 0;
+ }
+ else {
+ Val = -Params[2] / Params[1];
+ }
+ break;
+
+
+ // IEC 61966-2.1 (sRGB)
+ // Y = (aX + b)^Gamma | X >= d
+ // Y = cX | X < d
+ case 4:
+ if (R >= Params[4]) {
+
+ e = Params[1]*R + Params[2];
+ if (e > 0)
+ Val = pow(e, Params[0]);
+ else
+ Val = 0;
+ }
+ else
+ Val = R * Params[3];
+ break;
+
+ // Type 4 reversed
+ // X=((Y^1/g-b)/a) | Y >= (ad+b)^g
+ // X=Y/c | Y< (ad+b)^g
+
+ case -4:
+ if (R >= pow(Params[1] * Params[4] + Params[2], Params[0])) {
+
+ Val = (pow(R, 1.0/Params[0]) - Params[2]) / Params[1];
+ }
+ else {
+ Val = R / Params[3];
+ }
+ break;
+
+
+
+ // Y = (aX + b)^Gamma + e | X <= d
+ // Y = cX + f | else
+ case 5:
+ if (R >= Params[4]) {
+
+ e = Params[1]*R + Params[2];
+ Val = pow(e, Params[0]) + Params[5];
+ }
+ else
+ Val = R*Params[3] + Params[6];
+ break;
+
+
+ // Reversed type 5
+ // X=((Y-e)1/g-b)/a | Y >=(ad+b)^g+e)
+ // X=(Y-f)/c | else
+ case -5:
+
+ if (R >= pow(Params[1] * Params[4], Params[0]) + Params[5]) {
+
+ Val = pow(R - Params[5], 1/Params[0]) - Params[2] / Params[1];
+ }
+ else {
+ Val = (R - Params[6]) / Params[3];
+ }
+ break;
+
+ default:
+ cmsSignalError(LCMS_ERRC_ABORTED, "Unsupported parametric curve type=%d", abs(Type)-1);
+ cmsFreeGamma(Table);
+ return NULL;
+ }
+
+
+ // Saturate
+
+ dval = Val * 65535.0 + .5;
+ if (dval > 65535.) dval = 65535.0;
+ if (dval < 0) dval = 0;
+
+ Table->GammaTable[i] = (WORD) floor(dval);
+ }
+
+ Table -> Birth.Crc32 = _cmsCrc32OfGammaTable(Table);
+
+ return Table;
+}
+
+// Build a gamma table based on gamma constant
+
+LPGAMMATABLE LCMSEXPORT cmsBuildGamma(int nEntries, double Gamma)
+{
+ return cmsBuildParametricGamma(nEntries, 1, &Gamma);
+}
+
+
+
+// From: Eilers, P.H.C. (1994) Smoothing and interpolation with finite
+// differences. in: Graphic Gems IV, Heckbert, P.S. (ed.), Academic press.
+//
+// Smoothing and interpolation with second differences.
+//
+// Input: weights (w), data (y): vector from 1 to m.
+// Input: smoothing parameter (lambda), length (m).
+// Output: smoothed vector (z): vector from 1 to m.
+
+
+static
+void smooth2(vec w, vec y, vec z, float lambda, int m)
+{
+ int i, i1, i2;
+ vec c, d, e;
+ d[1] = w[1] + lambda;
+ c[1] = -2 * lambda / d[1];
+ e[1] = lambda /d[1];
+ z[1] = w[1] * y[1];
+ d[2] = w[2] + 5 * lambda - d[1] * c[1] * c[1];
+ c[2] = (-4 * lambda - d[1] * c[1] * e[1]) / d[2];
+ e[2] = lambda / d[2];
+ z[2] = w[2] * y[2] - c[1] * z[1];
+ for (i = 3; i < m - 1; i++) {
+ i1 = i - 1; i2 = i - 2;
+ d[i]= w[i] + 6 * lambda - c[i1] * c[i1] * d[i1] - e[i2] * e[i2] * d[i2];
+ c[i] = (-4 * lambda -d[i1] * c[i1] * e[i1])/ d[i];
+ e[i] = lambda / d[i];
+ z[i] = w[i] * y[i] - c[i1] * z[i1] - e[i2] * z[i2];
+ }
+ i1 = m - 2; i2 = m - 3;
+ d[m - 1] = w[m - 1] + 5 * lambda -c[i1] * c[i1] * d[i1] - e[i2] * e[i2] * d[i2];
+ c[m - 1] = (-2 * lambda - d[i1] * c[i1] * e[i1]) / d[m - 1];
+ z[m - 1] = w[m - 1] * y[m - 1] - c[i1] * z[i1] - e[i2] * z[i2];
+ i1 = m - 1; i2 = m - 2;
+ d[m] = w[m] + lambda - c[i1] * c[i1] * d[i1] - e[i2] * e[i2] * d[i2];
+ z[m] = (w[m] * y[m] - c[i1] * z[i1] - e[i2] * z[i2]) / d[m];
+ z[m - 1] = z[m - 1] / d[m - 1] - c[m - 1] * z[m];
+ for (i = m - 2; 1<= i; i--)
+ z[i] = z[i] / d[i] - c[i] * z[i + 1] - e[i] * z[i + 2];
+}
+
+
+
+// Smooths a curve sampled at regular intervals
+
+BOOL LCMSEXPORT cmsSmoothGamma(LPGAMMATABLE Tab, double lambda)
+
+{
+ vec w, y, z;
+ int i, nItems, Zeros, Poles;
+
+
+ if (cmsIsLinear(Tab->GammaTable, Tab->nEntries)) return FALSE; // Nothing to do
+
+ nItems = Tab -> nEntries;
+
+ if (nItems > MAX_KNOTS) {
+ cmsSignalError(LCMS_ERRC_ABORTED, "cmsSmoothGamma: too many points.");
+ return FALSE;
+ }
+
+ ZeroMemory(w, nItems * sizeof(float));
+ ZeroMemory(y, nItems * sizeof(float));
+ ZeroMemory(z, nItems * sizeof(float));
+
+ for (i=0; i < nItems; i++)
+ {
+ y[i+1] = (float) Tab -> GammaTable[i];
+ w[i+1] = 1.0;
+ }
+
+ smooth2(w, y, z, (float) lambda, nItems);
+
+ // Do some reality - checking...
+ Zeros = Poles = 0;
+ for (i=nItems; i > 1; --i) {
+
+ if (z[i] == 0.) Zeros++;
+ if (z[i] >= 65535.) Poles++;
+ if (z[i] < z[i-1]) return FALSE; // Non-Monotonic
+ }
+
+ if (Zeros > (nItems / 3)) return FALSE; // Degenerated, mostly zeros
+ if (Poles > (nItems / 3)) return FALSE; // Degenerated, mostly poles
+
+ // Seems ok
+
+ for (i=0; i < nItems; i++) {
+
+ // Clamp to WORD
+
+ float v = z[i+1];
+
+ if (v < 0) v = 0;
+ if (v > 65535.) v = 65535.;
+
+ Tab -> GammaTable[i] = (WORD) floor(v + .5);
+ }
+
+ return TRUE;
+}
+
+
+// Check if curve is exponential, return gamma if so.
+
+double LCMSEXPORT cmsEstimateGammaEx(LPWORD GammaTable, int nEntries, double Thereshold)
+{
+ double gamma, sum, sum2;
+ double n, x, y, Std;
+ int i;
+
+ sum = sum2 = n = 0;
+
+ // Does exclude endpoints
+ for (i=1; i < nEntries - 1; i++) {
+
+ x = (double) i / (nEntries - 1);
+ y = (double) GammaTable[i] / 65535.;
+
+ // Avoid 7% on lower part to prevent
+ // artifacts due to linear ramps
+
+ if (y > 0. && y < 1. && x > 0.07) {
+
+ gamma = log(y) / log(x);
+ sum += gamma;
+ sum2 += gamma * gamma;
+ n++;
+ }
+
+ }
+
+ // Take a look on SD to see if gamma isn't exponential at all
+ Std = sqrt((n * sum2 - sum * sum) / (n*(n-1)));
+
+
+ if (Std > Thereshold)
+ return -1.0;
+
+ return (sum / n); // The mean
+}
+
+
+double LCMSEXPORT cmsEstimateGamma(LPGAMMATABLE t)
+{
+ return cmsEstimateGammaEx(t->GammaTable, t->nEntries, 0.7);
+}
+
+
+// -----------------------------------------------------------------Sampled curves
+
+// Allocate a empty curve
+
+LPSAMPLEDCURVE cmsAllocSampledCurve(int nItems)
+{
+ LPSAMPLEDCURVE pOut;
+
+ pOut = (LPSAMPLEDCURVE) malloc(sizeof(SAMPLEDCURVE));
+ if (pOut == NULL)
+ return NULL;
+
+ if((pOut->Values = (double *) malloc(nItems * sizeof(double))) == NULL)
+ {
+ free(pOut);
+ return NULL;
+ }
+
+ pOut->nItems = nItems;
+ ZeroMemory(pOut->Values, nItems * sizeof(double));
+
+ return pOut;
+}
+
+
+void cmsFreeSampledCurve(LPSAMPLEDCURVE p)
+{
+ free((LPVOID) p -> Values);
+ free((LPVOID) p);
+}
+
+
+
+// Does duplicate a sampled curve
+
+LPSAMPLEDCURVE cmsDupSampledCurve(LPSAMPLEDCURVE p)
+{
+ LPSAMPLEDCURVE out;
+
+ out = cmsAllocSampledCurve(p -> nItems);
+ if (!out) return NULL;
+
+ CopyMemory(out ->Values, p ->Values, p->nItems * sizeof(double));
+
+ return out;
+}
+
+
+// Take min, max of curve
+
+void cmsEndpointsOfSampledCurve(LPSAMPLEDCURVE p, double* Min, double* Max)
+{
+ int i;
+
+ *Min = 65536.;
+ *Max = 0.;
+
+ for (i=0; i < p -> nItems; i++) {
+
+ double v = p -> Values[i];
+
+ if (v < *Min)
+ *Min = v;
+
+ if (v > *Max)
+ *Max = v;
+ }
+
+ if (*Min < 0) *Min = 0;
+ if (*Max > 65535.0) *Max = 65535.0;
+}
+
+// Clamps to Min, Max
+
+void cmsClampSampledCurve(LPSAMPLEDCURVE p, double Min, double Max)
+{
+
+ int i;
+
+ for (i=0; i < p -> nItems; i++) {
+
+ double v = p -> Values[i];
+
+ if (v < Min)
+ v = Min;
+
+ if (v > Max)
+ v = Max;
+
+ p -> Values[i] = v;
+
+ }
+
+}
+
+
+
+// Smooths a curve sampled at regular intervals
+
+BOOL cmsSmoothSampledCurve(LPSAMPLEDCURVE Tab, double lambda)
+{
+ vec w, y, z;
+ int i, nItems;
+
+ nItems = Tab -> nItems;
+
+ if (nItems > MAX_KNOTS) {
+ cmsSignalError(LCMS_ERRC_ABORTED, "cmsSmoothSampledCurve: too many points.");
+ return FALSE;
+ }
+
+ ZeroMemory(w, nItems * sizeof(float));
+ ZeroMemory(y, nItems * sizeof(float));
+ ZeroMemory(z, nItems * sizeof(float));
+
+ for (i=0; i < nItems; i++)
+ {
+ float value = (float) Tab -> Values[i];
+
+ y[i+1] = value;
+ w[i+1] = (float) ((value < 0.0) ? 0 : 1);
+ }
+
+
+ smooth2(w, y, z, (float) lambda, nItems);
+
+ for (i=0; i < nItems; i++) {
+
+ Tab -> Values[i] = z[i+1];;
+ }
+
+ return TRUE;
+
+}
+
+
+// Scale a value v, within domain Min .. Max
+// to a domain 0..(nPoints-1)
+
+static
+double ScaleVal(double v, double Min, double Max, int nPoints)
+{
+
+ double a, b;
+
+ if (v <= Min) return 0;
+ if (v >= Max) return (nPoints-1);
+
+ a = (double) (nPoints - 1) / (Max - Min);
+ b = a * Min;
+
+ return (a * v) - b;
+
+}
+
+
+// Does rescale a sampled curve to fit in a 0..(nPoints-1) domain
+
+void cmsRescaleSampledCurve(LPSAMPLEDCURVE p, double Min, double Max, int nPoints)
+{
+
+ int i;
+
+ for (i=0; i < p -> nItems; i++) {
+
+ double v = p -> Values[i];
+
+ p -> Values[i] = ScaleVal(v, Min, Max, nPoints);
+ }
+
+}
+
+
+// Joins two sampled curves for X and Y. Curves should be sorted.
+
+LPSAMPLEDCURVE cmsJoinSampledCurves(LPSAMPLEDCURVE X, LPSAMPLEDCURVE Y, int nResultingPoints)
+{
+ int i, j;
+ LPSAMPLEDCURVE out;
+ double MinX, MinY, MaxX, MaxY;
+ double x, y, x1, y1, x2, y2, a, b;
+
+ out = cmsAllocSampledCurve(nResultingPoints);
+ if (out == NULL)
+ return NULL;
+
+ if (X -> nItems != Y -> nItems) {
+
+ cmsSignalError(LCMS_ERRC_ABORTED, "cmsJoinSampledCurves: invalid curve.");
+ cmsFreeSampledCurve(out);
+ return NULL;
+ }
+
+ // Get endpoints of sampled curves
+ cmsEndpointsOfSampledCurve(X, &MinX, &MaxX);
+ cmsEndpointsOfSampledCurve(Y, &MinY, &MaxY);
+
+
+ // Set our points
+ out ->Values[0] = MinY;
+ for (i=1; i < nResultingPoints; i++) {
+
+ // Scale t to x domain
+ x = (i * (MaxX - MinX) / (nResultingPoints-1)) + MinX;
+
+ // Find interval in which j is within (always up,
+ // since fn should be monotonic at all)
+
+ j = 1;
+ while ((j < X ->nItems - 1) && X ->Values[j] < x)
+ j++;
+
+ // Now x is within X[j-1], X[j]
+ x1 = X ->Values[j-1]; x2 = X ->Values[j];
+ y1 = Y ->Values[j-1]; y2 = Y ->Values[j];
+
+ // Interpolate the value
+ a = (y1 - y2) / (x1 - x2);
+ b = y1 - a * x1;
+ y = a* x + b;
+
+ out ->Values[i] = y;
+ }
+
+
+ cmsClampSampledCurve(out, MinY, MaxY);
+ return out;
+}
+
+
+
+// Convert between curve types
+
+LPGAMMATABLE cmsConvertSampledCurveToGamma(LPSAMPLEDCURVE Sampled, double Max)
+{
+ LPGAMMATABLE Gamma;
+ int i, nPoints;
+
+
+ nPoints = Sampled ->nItems;
+
+ Gamma = cmsAllocGamma(nPoints);
+ for (i=0; i < nPoints; i++) {
+
+ Gamma->GammaTable[i] = (WORD) floor(ScaleVal(Sampled ->Values[i], 0, Max, 65536) + .5);
+ }
+
+ return Gamma;
+
+}
+
+// Inverse of anterior
+
+LPSAMPLEDCURVE cmsConvertGammaToSampledCurve(LPGAMMATABLE Gamma, int nPoints)
+{
+ LPSAMPLEDCURVE Sampled;
+ L16PARAMS L16;
+ int i;
+ WORD wQuant, wValIn;
+
+ if (nPoints > 4096) {
+
+ cmsSignalError(LCMS_ERRC_ABORTED, "cmsConvertGammaToSampledCurve: too many points (max=4096)");
+ return NULL;
+ }
+
+ cmsCalcL16Params(Gamma -> nEntries, &L16);
+
+ Sampled = cmsAllocSampledCurve(nPoints);
+ for (i=0; i < nPoints; i++) {
+ wQuant = _cmsQuantizeVal(i, nPoints);
+ wValIn = cmsLinearInterpLUT16(wQuant, Gamma ->GammaTable, &L16);
+ Sampled ->Values[i] = (float) wValIn;
+ }
+
+ return Sampled;
+}
+
+
+
+
+// Smooth endpoints (used in Black/White compensation)
+
+BOOL _cmsSmoothEndpoints(LPWORD Table, int nEntries)
+{
+ vec w, y, z;
+ int i, Zeros, Poles;
+
+#ifdef DEBUG
+ ASAVE(Table, nEntries, "nonsmt.txt");
+#endif
+
+
+ if (cmsIsLinear(Table, nEntries)) return FALSE; // Nothing to do
+
+
+ if (nEntries > MAX_KNOTS) {
+ cmsSignalError(LCMS_ERRC_ABORTED, "_cmsSmoothEndpoints: too many points.");
+ return FALSE;
+ }
+
+ ZeroMemory(w, nEntries * sizeof(float));
+ ZeroMemory(y, nEntries * sizeof(float));
+ ZeroMemory(z, nEntries * sizeof(float));
+
+ for (i=0; i < nEntries; i++)
+ {
+ y[i+1] = (float) Table[i];
+ w[i+1] = 1.0;
+ }
+
+ w[1] = 65535.0;
+ w[nEntries] = 65535.0;
+
+ smooth2(w, y, z, (float) nEntries, nEntries);
+
+ // Do some reality - checking...
+ Zeros = Poles = 0;
+ for (i=nEntries; i > 1; --i) {
+
+ if (z[i] == 0.) Zeros++;
+ if (z[i] >= 65535.) Poles++;
+ if (z[i] < z[i-1]) return FALSE; // Non-Monotonic
+ }
+
+ if (Zeros > (nEntries / 3)) return FALSE; // Degenerated, mostly zeros
+ if (Poles > (nEntries / 3)) return FALSE; // Degenerated, mostly poles
+
+ // Seems ok
+
+ for (i=0; i < nEntries; i++) {
+
+ // Clamp to WORD
+
+ float v = z[i+1];
+
+ if (v < 0) v = 0;
+ if (v > 65535.) v = 65535.;
+
+ Table[i] = (WORD) floor(v + .5);
+ }
+
+ return TRUE;
+}
diff --git a/icc2ps/cmsgmt.c b/icc2ps/cmsgmt.c
new file mode 100644
index 0000000..a9ca80b
--- /dev/null
+++ b/icc2ps/cmsgmt.c
@@ -0,0 +1,1280 @@
+//
+// Little cms
+// Copyright (C) 1998-2005 Marti Maria
+//
+// Permission is hereby granted, free of charge, to any person obtaining
+// a copy of this software and associated documentation files (the "Software"),
+// to deal in the Software without restriction, including without limitation
+// the rights to use, copy, modify, merge, publish, distribute, sublicense,
+// and/or sell copies of the Software, and to permit persons to whom the Software
+// is furnished to do so, subject to the following conditions:
+//
+// The above copyright notice and this permission notice shall be included in
+// all copies or substantial portions of the Software.
+//
+// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
+// EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO
+// THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
+// NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
+// LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
+// OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
+// WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
+
+
+#include "lcms.h"
+
+// #define DEBUG 1
+
+/*
+Gamut check by default is a catching of 0xFFFF/0xFFFF/0xFFFF PCS values, used
+internally by lcms to hold invalid values. Matrix LUT's, operates in a way that
+unencodeable values are marked as this combination, if PCS is XYZ, this is a very
+high value since encoding is a 1.15 fixed point, something like 1.9997, 1.9997, 1.9997
+not a very common color after all. Lab PCS is not to be a problem, since L>100 are truely
+undefined. There is a posibility than ICC comitee defines L>100 as a valid means
+to use highlights, then it will be lost.
+
+(1.10 - Actually ICC did it, so this should be checked for full ICC 4.0 support)
+
+*/
+
+
+BOOL _cmsEndPointsBySpace(icColorSpaceSignature Space, WORD **White, WORD **Black,
+ int *nOutputs)
+{
+ // Only most common spaces
+
+ static WORD RGBblack[4] = { 0, 0, 0 };
+ static WORD RGBwhite[4] = { 0xffff, 0xffff, 0xffff };
+ static WORD CMYKblack[4] = { 0xffff, 0xffff, 0xffff, 0xffff }; // 400% of ink
+ static WORD CMYKwhite[4] = { 0, 0, 0, 0 };
+ static WORD LABblack[4] = { 0, 0x8000, 0x8000 };
+ static WORD LABwhite[4] = { 0xFF00, 0x8000, 0x8000 };
+ static WORD CMYblack[4] = { 0xffff, 0xffff, 0xffff };
+ static WORD CMYwhite[4] = { 0, 0, 0 };
+ static WORD Grayblack[4] = { 0 };
+ static WORD GrayWhite[4] = { 0xffff };
+
+ switch (Space) {
+
+ case icSigGrayData: if (White) *White = GrayWhite;
+ if (Black) *Black = Grayblack;
+ if (nOutputs) *nOutputs = 1;
+ return TRUE;
+
+ case icSigRgbData: if (White) *White = RGBwhite;
+ if (Black) *Black = RGBblack;
+ if (nOutputs) *nOutputs = 3;
+ return TRUE;
+
+ case icSigLabData: if (White) *White = LABwhite;
+ if (Black) *Black = LABblack;
+ if (nOutputs) *nOutputs = 3;
+ return TRUE;
+
+ case icSigCmykData: if (White) *White = CMYKwhite;
+ if (Black) *Black = CMYKblack;
+ if (nOutputs) *nOutputs = 4;
+ return TRUE;
+
+ case icSigCmyData: if (White) *White = CMYwhite;
+ if (Black) *Black = CMYblack;
+ if (nOutputs) *nOutputs = 3;
+ return TRUE;
+
+ default:;
+ }
+
+ return FALSE;
+}
+
+
+WORD *_cmsWhiteBySpace(icColorSpaceSignature Space)
+{
+ WORD *White= NULL, *Black = NULL;
+ int Dummy;
+ static WORD Default[MAXCHANNELS];
+
+ if (_cmsEndPointsBySpace(Space, &White, &Black, &Dummy))
+ return White;
+
+ return Default;
+
+}
+
+
+
+
+WORD Clamp_L(Fixed32 in)
+{
+ if (in == 0xFFFF) return 0xFFFFU; // Marker
+
+ if (in > 0xFF00) return 0xFF00U; // L* = 100.0
+ return (WORD) in;
+}
+
+
+#define ENCODE_AB(x) (WORD) (((x) + 128.0) * 256.0 + 0.5)
+
+WORD Clamp_ab(Fixed32 in)
+{
+ if (in == 0xFFFF) return 0xFFFFU; // Marker
+
+ if (in < 0) return ENCODE_AB(-128.0); // Max negative number
+ if (in > 0xFFFF) return ENCODE_AB(+127.9961); // Max positive number
+ return (WORD) in;
+}
+
+
+
+// Returns dE on two Lab values
+
+double LCMSEXPORT cmsDeltaE(LPcmsCIELab Lab1, LPcmsCIELab Lab2)
+{
+ double dL, da, db;
+
+ if (Lab1 -> L < 0 ||
+ Lab2 -> L < 0) return 65536.;
+
+ if (Lab1 -> a < -200 || Lab1 -> a > 200) return 65536.;
+ if (Lab1 -> b < -200 || Lab1 -> b > 200) return 65536.;
+
+ if (Lab2 -> a < -200 || Lab2 -> a > 200) return 65536.;
+ if (Lab2 -> b < -200 || Lab2 -> b > 200) return 65536.;
+
+ if (Lab1 ->L == 0 && Lab2 ->L == 0) return 0;
+
+ dL = fabs(Lab1 -> L - Lab2 -> L);
+ da = fabs(Lab1 -> a - Lab2 -> a);
+ db = fabs(Lab1 -> b - Lab2 -> b);
+
+ return pow(dL*dL + da * da + db * db, 0.5);
+
+}
+
+
+// Square
+static
+double Sqr(double v)
+{
+ return v * v;
+}
+
+// Return the CIE94 Delta E
+double LCMSEXPORT cmsCIE94DeltaE(LPcmsCIELab Lab1, LPcmsCIELab Lab2)
+{
+ cmsCIELCh LCh1, LCh2;
+ double dE, dL, dC, dh, dhsq;
+ double c12, sc, sh;
+
+ if (Lab1 ->L == 0 && Lab2 ->L == 0) return 0;
+
+ dL = fabs(Lab1 ->L - Lab2 ->L);
+
+ cmsLab2LCh(&LCh1, Lab1);
+ cmsLab2LCh(&LCh2, Lab2);
+
+ dC = fabs(LCh1.C - LCh2.C);
+ dE = cmsDeltaE(Lab1, Lab2);
+
+ dhsq = Sqr(dE) - Sqr(dL) - Sqr(dC);
+ if (dhsq < 0)
+ dh = 0;
+ else
+ dh = pow(dhsq, 0.5);
+
+ c12 = sqrt(LCh1.C * LCh2.C);
+
+ sc = 1.0 + (0.048 * c12);
+ sh = 1.0 + (0.014 * c12);
+
+ return sqrt(Sqr(dL) + Sqr(dC) / Sqr(sc) + Sqr(dh) / Sqr(sh));
+}
+
+
+// Auxiliary
+
+static
+double ComputeLBFD(LPcmsCIELab Lab)
+{
+ double yt;
+
+ if (Lab->L > 7.996969)
+ yt = (Sqr((Lab->L+16)/116)*((Lab->L+16)/116))*100;
+ else
+ yt = 100 * (Lab->L / 903.3);
+
+ return (54.6 * (LOGE * (log(yt + 1.5))) - 9.6);
+}
+
+
+
+// bfd - gets BFD(1:1) difference between Lab1, Lab2
+double LCMSEXPORT cmsBFDdeltaE(LPcmsCIELab Lab1, LPcmsCIELab Lab2)
+{
+ double lbfd1,lbfd2,AveC,Aveh,dE,deltaL,
+ deltaC,deltah,dc,t,g,dh,rh,rc,rt,bfd;
+ cmsCIELCh LCh1, LCh2;
+
+
+ if (Lab1 ->L == 0 && Lab2 ->L == 0) return 0;
+
+ lbfd1 = ComputeLBFD(Lab1);
+ lbfd2 = ComputeLBFD(Lab2);
+ deltaL = lbfd2 - lbfd1;
+
+ cmsLab2LCh(&LCh1, Lab1);
+ cmsLab2LCh(&LCh2, Lab2);
+
+ deltaC = LCh2.C - LCh1.C;
+ AveC = (LCh1.C+LCh2.C)/2;
+ Aveh = (LCh1.h+LCh2.h)/2;
+
+ dE = cmsDeltaE(Lab1, Lab2);
+
+ if (Sqr(dE)>(Sqr(Lab2->L-Lab1->L)+Sqr(deltaC)))
+ deltah = sqrt(Sqr(dE)-Sqr(Lab2->L-Lab1->L)-Sqr(deltaC));
+ else
+ deltah =0;
+
+
+ dc = 0.035 * AveC / (1 + 0.00365 * AveC)+0.521;
+ g = sqrt(Sqr(Sqr(AveC))/(Sqr(Sqr(AveC))+14000));
+ t = 0.627+(0.055*cos((Aveh-254)/(180/M_PI))-
+ 0.040*cos((2*Aveh-136)/(180/M_PI))+
+ 0.070*cos((3*Aveh-31)/(180/M_PI))+
+ 0.049*cos((4*Aveh+114)/(180/M_PI))-
+ 0.015*cos((5*Aveh-103)/(180/M_PI)));
+
+ dh = dc*(g*t+1-g);
+ rh = -0.260*cos((Aveh-308)/(180/M_PI))-
+ 0.379*cos((2*Aveh-160)/(180/M_PI))-
+ 0.636*cos((3*Aveh+254)/(180/M_PI))+
+ 0.226*cos((4*Aveh+140)/(180/M_PI))-
+ 0.194*cos((5*Aveh+280)/(180/M_PI));
+
+ rc = sqrt((AveC*AveC*AveC*AveC*AveC*AveC)/((AveC*AveC*AveC*AveC*AveC*AveC)+70000000));
+ rt = rh*rc;
+
+ bfd = sqrt(Sqr(deltaL)+Sqr(deltaC/dc)+Sqr(deltah/dh)+(rt*(deltaC/dc)*(deltah/dh)));
+
+ return bfd;
+}
+
+
+// cmc - CMC(1:1) difference between Lab1, Lab2
+double LCMSEXPORT cmsCMCdeltaE(LPcmsCIELab Lab1, LPcmsCIELab Lab2)
+{
+ double dE,dL,dC,dh,sl,sc,sh,t,f,cmc;
+ cmsCIELCh LCh1, LCh2;
+
+ if (Lab1 ->L == 0 && Lab2 ->L == 0) return 0;
+
+ cmsLab2LCh(&LCh1, Lab1);
+ cmsLab2LCh(&LCh2, Lab2);
+
+
+ dL = Lab2->L-Lab1->L;
+ dC = LCh2.C-LCh1.C;
+
+ dE = cmsDeltaE(Lab1, Lab2);
+ if (Sqr(dE)>(Sqr(dL)+Sqr(dC)))
+ dh = sqrt(Sqr(dE)-Sqr(dL)-Sqr(dC));
+ else
+ dh =0;
+
+ if ((LCh1.h > 164) && (LCh1.h<345))
+ t = 0.56 + fabs(0.2 * cos(((LCh1.h + 168)/(180/M_PI))));
+ else
+ t = 0.36 + fabs(0.4 * cos(((LCh1.h + 35 )/(180/M_PI))));
+
+ sc = 0.0638 * LCh1.C / (1 + 0.0131 * LCh1.C) + 0.638;
+ sl = 0.040975 * Lab1->L /(1 + 0.01765 * Lab1->L);
+
+ if (Lab1->L<16)
+ sl = 0.511;
+
+ f = sqrt((LCh1.C * LCh1.C * LCh1.C * LCh1.C)/((LCh1.C * LCh1.C * LCh1.C * LCh1.C)+1900));
+ sh = sc*(t*f+1-f);
+ cmc = sqrt(Sqr(dL/sl)+Sqr(dC/sc)+Sqr(dh/sh));
+
+ return cmc;
+}
+
+
+
+static
+double atan2deg(double b, double a)
+{
+ double h;
+
+ if (a == 0 && b == 0)
+ h = 0;
+ else
+ h = atan2(a, b);
+
+ h *= (180. / M_PI);
+
+ while (h > 360.)
+ h -= 360.;
+
+ while ( h < 0)
+ h += 360.;
+
+ return h;
+
+}
+
+
+static
+double RADIANES(double deg)
+{
+ return (deg * M_PI) / 180.;
+}
+
+
+// dE2000 The weightings KL, KC and KH can be modified to reflect the relative
+// importance of lightness, chroma and hue in different industrial applications
+
+double LCMSEXPORT cmsCIE2000DeltaE(LPcmsCIELab Lab1, LPcmsCIELab Lab2,
+ double Kl, double Kc, double Kh)
+{
+ double L1 = Lab1->L;
+ double a1 = Lab1->a;
+ double b1 = Lab1->b;
+ double C = sqrt( Sqr(a1) + Sqr(b1) );
+
+ double Ls = Lab2 ->L;
+ double as = Lab2 ->a;
+ double bs = Lab2 ->b;
+ double Cs = sqrt( Sqr(as) + Sqr(bs) );
+
+
+ double G = 0.5 * ( 1 - sqrt(pow((C + Cs) / 2 , 7) / (pow((C + Cs) / 2, 7) + pow(25, 7) ) ));
+
+ double a_p = (1 + G ) * a1;
+ double b_p = b1;
+ double C_p = sqrt( Sqr(a_p) + Sqr(b_p));
+ double h_p = atan2deg(a_p, b_p);
+
+
+ double a_ps = (1 + G) * as;
+ double b_ps = bs;
+ double C_ps = sqrt(Sqr(a_ps) + Sqr(b_ps));
+ double h_ps = atan2deg(a_ps, b_ps);
+
+
+
+ double meanC_p =(C_p + C_ps) / 2;
+
+ double meanh_p = fabs(h_ps-h_p) <= 180 ? (h_ps + h_p)/2 : (h_ps+h_p-360)/2;
+
+ double delta_h = fabs(h_p - h_ps) <= 180 ? fabs(h_p - h_ps) : 360 - fabs(h_p - h_ps);
+ double delta_L = fabs(L1 - Ls);
+ double delta_C = fabs(C_p - C_ps);
+
+ double delta_H =2 * sqrt(C_ps*C_p) * sin(RADIANES(delta_h) / 2);
+
+ double T = 1 - 0.17 * cos(RADIANES(meanh_p-30))
+ + 0.24 * cos(RADIANES(2*meanh_p))
+ + 0.32 * cos(RADIANES(3*meanh_p + 6))
+ - 0.2 * cos(RADIANES(4*meanh_p - 63));
+
+ double Sl = 1 + (0.015 * Sqr((Ls + L1) /2- 50) )/ sqrt(20 + Sqr( (Ls+L1)/2 - 50) );
+
+ double Sc = 1 + 0.045 * (C_p + C_ps)/2;
+ double Sh = 1 + 0.015 * ((C_ps + C_p)/2) * T;
+
+ double delta_ro = 30 * exp( -Sqr(((meanh_p - 275 ) / 25)));
+
+ double Rc = 2 * sqrt(( pow(meanC_p, 7) )/( pow(meanC_p , 7 ) + pow(25, 7)));
+
+ double Rt = -sin(2 * RADIANES(delta_ro)) * Rc;
+
+ double deltaE00 = sqrt( Sqr(delta_L /(Sl * Kl)) +
+ Sqr(delta_C/(Sc * Kc)) +
+ Sqr(delta_H/(Sh * Kh)) +
+ Rt*(delta_C/(Sc * Kc)) * (delta_H / (Sh * Kh)));
+
+ return deltaE00;
+}
+
+
+
+// Carefully, clamp on CIELab space.
+
+void LCMSEXPORT cmsClampLab(LPcmsCIELab Lab, double amax, double amin,
+ double bmax, double bmin)
+{
+
+ // Whole Luma surface to zero
+
+ if (Lab -> L < 0) {
+
+ Lab-> L = Lab->a = Lab-> b = 0.0;
+ return;
+ }
+
+ // Clamp white, DISCARD HIGHLIGHTS. This is done
+ // in such way because icc spec doesn't allow the
+ // use of L>100 as a highlight means.
+
+ if (Lab->L > 100)
+ Lab -> L = 100;
+
+ // Check out gamut prism, on a, b faces
+
+ if (Lab -> a < amin || Lab->a > amax||
+ Lab -> b < bmin || Lab->b > bmax) {
+
+ cmsCIELCh LCh;
+ double h, slope;
+
+ // Falls outside a, b limits. Transports to LCh space,
+ // and then do the clipping
+
+
+ if (Lab -> a == 0.0) { // Is hue exactly 90?
+
+ // atan will not work, so clamp here
+ Lab -> b = Lab->b < 0 ? bmin : bmax;
+ return;
+ }
+
+ cmsLab2LCh(&LCh, Lab);
+
+ slope = Lab -> b / Lab -> a;
+ h = LCh.h;
+
+ // There are 4 zones
+
+ if ((h >= 0. && h < 45.) ||
+ (h >= 315 && h <= 360.)) {
+
+ // clip by amax
+ Lab -> a = amax;
+ Lab -> b = amax * slope;
+ }
+ else
+ if (h >= 45. && h < 135)
+ {
+ // clip by bmax
+ Lab -> b = bmax;
+ Lab -> a = bmax / slope;
+ }
+ else
+ if (h >= 135 && h < 225) {
+ // clip by amin
+ Lab -> a = amin;
+ Lab -> b = amin * slope;
+
+ }
+ else
+ if (h >= 225 && h < 315) {
+ // clip by bmin
+ Lab -> b = bmin;
+ Lab -> a = bmin / slope;
+ }
+ else
+ cmsSignalError(LCMS_ERRC_ABORTED, "Invalid angle");
+
+ }
+}
+
+// Several utilities -------------------------------------------------------
+
+// Translate from our colorspace to ICC representation
+
+icColorSpaceSignature LCMSEXPORT _cmsICCcolorSpace(int OurNotation)
+{
+ switch (OurNotation) {
+
+ case 1:
+ case PT_GRAY: return icSigGrayData;
+
+ case 2:
+ case PT_RGB: return icSigRgbData;
+
+ case PT_CMY: return icSigCmyData;
+ case PT_CMYK: return icSigCmykData;
+ case PT_YCbCr:return icSigYCbCrData;
+ case PT_YUV: return icSigLuvData;
+ case PT_XYZ: return icSigXYZData;
+ case PT_Lab: return icSigLabData;
+ case PT_YUVK: return icSigLuvKData;
+ case PT_HSV: return icSigHsvData;
+ case PT_HLS: return icSigHlsData;
+ case PT_Yxy: return icSigYxyData;
+ case PT_HiFi: return icSigHexachromeData;
+ case PT_HiFi7: return icSigHeptachromeData;
+ case PT_HiFi8: return icSigOctachromeData;
+
+ case PT_HiFi9: return icSigMCH9Data;
+ case PT_HiFi10: return icSigMCHAData;
+ case PT_HiFi11: return icSigMCHBData;
+ case PT_HiFi12: return icSigMCHCData;
+ case PT_HiFi13: return icSigMCHDData;
+ case PT_HiFi14: return icSigMCHEData;
+ case PT_HiFi15: return icSigMCHFData;
+
+ default: return icMaxEnumData;
+ }
+}
+
+
+int LCMSEXPORT _cmsLCMScolorSpace(icColorSpaceSignature ProfileSpace)
+{
+ switch (ProfileSpace) {
+
+ case icSigGrayData: return PT_GRAY;
+ case icSigRgbData: return PT_RGB;
+ case icSigCmyData: return PT_CMY;
+ case icSigCmykData: return PT_CMYK;
+ case icSigYCbCrData:return PT_YCbCr;
+ case icSigLuvData: return PT_YUV;
+ case icSigXYZData: return PT_XYZ;
+ case icSigLabData: return PT_Lab;
+ case icSigLuvKData: return PT_YUVK;
+ case icSigHsvData: return PT_HSV;
+ case icSigHlsData: return PT_HLS;
+ case icSigYxyData: return PT_Yxy;
+
+ case icSig6colorData:
+ case icSigHexachromeData: return PT_HiFi;
+
+ case icSigHeptachromeData:
+ case icSig7colorData: return PT_HiFi7;
+
+ case icSigOctachromeData:
+ case icSig8colorData: return PT_HiFi8;
+
+ case icSigMCH9Data:
+ case icSig9colorData: return PT_HiFi9;
+
+ case icSigMCHAData:
+ case icSig10colorData: return PT_HiFi10;
+
+ case icSigMCHBData:
+ case icSig11colorData: return PT_HiFi11;
+
+ case icSigMCHCData:
+ case icSig12colorData: return PT_HiFi12;
+
+ case icSigMCHDData:
+ case icSig13colorData: return PT_HiFi13;
+
+ case icSigMCHEData:
+ case icSig14colorData: return PT_HiFi14;
+
+ case icSigMCHFData:
+ case icSig15colorData: return PT_HiFi15;
+
+ default: return icMaxEnumData;
+ }
+}
+
+
+int LCMSEXPORT _cmsChannelsOf(icColorSpaceSignature ColorSpace)
+{
+
+ switch (ColorSpace) {
+
+ case icSigGrayData: return 1;
+
+ case icSig2colorData: return 2;
+
+ case icSigXYZData:
+ case icSigLabData:
+ case icSigLuvData:
+ case icSigYCbCrData:
+ case icSigYxyData:
+ case icSigRgbData:
+ case icSigHsvData:
+ case icSigHlsData:
+ case icSigCmyData:
+ case icSig3colorData: return 3;
+
+ case icSigLuvKData:
+ case icSigCmykData:
+ case icSig4colorData: return 4;
+
+ case icSigMCH5Data:
+ case icSig5colorData: return 5;
+
+ case icSigHexachromeData:
+ case icSig6colorData: return 6;
+
+ case icSigHeptachromeData:
+ case icSig7colorData: return 7;
+
+ case icSigOctachromeData:
+ case icSig8colorData: return 8;
+
+ case icSigMCH9Data:
+ case icSig9colorData: return 9;
+
+ case icSigMCHAData:
+ case icSig10colorData: return 10;
+
+ case icSigMCHBData:
+ case icSig11colorData: return 11;
+
+ case icSigMCHCData:
+ case icSig12colorData: return 12;
+
+ case icSigMCHDData:
+ case icSig13colorData: return 13;
+
+ case icSigMCHEData:
+ case icSig14colorData: return 14;
+
+ case icSigMCHFData:
+ case icSig15colorData: return 15;
+
+ default: return 3;
+ }
+
+}
+
+
+// v2 L=100 is supposed to be placed on 0xFF00. There is no reasonable
+// number of gridpoints that would make exact match. However, a
+// prelinearization of 258 entries, would map 0xFF00 on entry 257.
+// This is almost what we need, unfortunately, the rest of entries
+// should be scaled by (255*257/256) and this is not exact.
+//
+// An intermediate solution would be to use 257 entries. This does not
+// map 0xFF00 exactly on a node, but so close that the dE induced is
+// negligible. AND the rest of curve is exact.
+
+static
+void CreateLabPrelinearization(LPGAMMATABLE LabTable[])
+{
+ int i;
+
+ LabTable[0] = cmsAllocGamma(257);
+ LabTable[1] = cmsBuildGamma(257, 1.0);
+ LabTable[2] = cmsBuildGamma(257, 1.0);
+
+ // L* uses 257 entries. Entry 256 holds 0xFFFF, so, the effective range
+ // is 0..0xFF00. Last entry (257) is also collapsed to 0xFFFF
+
+ // From 0 to 0xFF00
+ for (i=0; i < 256; i++)
+ LabTable[0]->GammaTable[i] = RGB_8_TO_16(i);
+
+ // Repeat last for 0xFFFF
+ LabTable[0] ->GammaTable[256] = 0xFFFF;
+}
+
+
+// Used by gamut & softproofing
+
+typedef struct {
+
+ cmsHTRANSFORM hInput; // From whatever input color space. NULL for Lab
+ cmsHTRANSFORM hForward, hReverse; // Transforms going from Lab to colorant and back
+ double Thereshold; // The thereshold after which is considered out of gamut
+
+ } GAMUTCHAIN,FAR* LPGAMUTCHAIN;
+
+// This sampler does compute gamut boundaries by comparing original
+// values with a transform going back and forth. Values above ERR_THERESHOLD
+// of maximum are considered out of gamut.
+
+
+#define ERR_THERESHOLD 5
+
+
+static
+int GamutSampler(register WORD In[], register WORD Out[], register LPVOID Cargo)
+{
+ LPGAMUTCHAIN t = (LPGAMUTCHAIN) Cargo;
+ WORD Proof[MAXCHANNELS], Check[MAXCHANNELS];
+ WORD Proof2[MAXCHANNELS], Check2[MAXCHANNELS];
+ cmsCIELab LabIn1, LabOut1;
+ cmsCIELab LabIn2, LabOut2;
+ double dE1, dE2, ErrorRatio;
+
+ // Assume in-gamut by default.
+ dE1 = 0.;
+ dE2 = 0;
+ ErrorRatio = 1.0;
+
+
+ // Any input space? I can use In[] no matter channels
+ // because is just one pixel
+
+ if (t -> hInput != NULL) cmsDoTransform(t -> hInput, In, In, 1);
+
+ // converts from PCS to colorant. This always
+ // does return in-gamut values,
+ cmsDoTransform(t -> hForward, In, Proof, 1);
+
+ // Now, do the inverse, from colorant to PCS.
+ cmsDoTransform(t -> hReverse, Proof, Check, 1);
+
+
+ // Try again, but this time taking Check as input
+ cmsDoTransform(t -> hForward, Check, Proof2, 1);
+ cmsDoTransform(t -> hReverse, Proof2, Check2, 1);
+
+
+
+ // Does the transform returns out-of-gamut?
+ if (Check[0] == 0xFFFF &&
+ Check[1] == 0xFFFF &&
+ Check[2] == 0xFFFF)
+
+ Out[0] = 0xFF00; // Out of gamut!
+ else {
+
+ // Transport encoded values
+ cmsLabEncoded2Float(&LabIn1, In);
+ cmsLabEncoded2Float(&LabOut1, Check);
+
+ // Take difference of direct value
+ dE1 = cmsDeltaE(&LabIn1, &LabOut1);
+
+ cmsLabEncoded2Float(&LabIn2, Check);
+ cmsLabEncoded2Float(&LabOut2, Check2);
+
+ // Take difference of converted value
+ dE2 = cmsDeltaE(&LabIn2, &LabOut2);
+
+
+ // if dE1 is small and dE2 is small, value is likely to be in gamut
+ if (dE1 < t->Thereshold && dE2 < t->Thereshold)
+ Out[0] = 0;
+ else
+ // if dE1 is small and dE2 is big, undefined. Assume in gamut
+ if (dE1 < t->Thereshold && dE2 > t->Thereshold)
+ Out[0] = 0;
+ else
+ // dE1 is big and dE2 is small, clearly out of gamut
+ if (dE1 > t->Thereshold && dE2 < t->Thereshold)
+ Out[0] = (WORD) _cmsQuickFloor((dE1 - t->Thereshold) + .5);
+ else {
+
+ // dE1 is big and dE2 is also big, could be due to perceptual mapping
+ // so take error ratio
+ if (dE2 == 0.0)
+ ErrorRatio = dE1;
+ else
+ ErrorRatio = dE1 / dE2;
+
+ if (ErrorRatio > t->Thereshold)
+ Out[0] = (WORD) _cmsQuickFloor((ErrorRatio - t->Thereshold) + .5);
+ else
+ Out[0] = 0;
+ }
+
+ }
+
+ return TRUE;
+}
+
+
+// Does compute a gamut LUT going back and forth across
+// pcs -> relativ. colorimetric intent -> pcs
+// the dE obtained is then annotated on the LUT.
+// values truely out of gamut, are clipped to dE = 0xFFFE
+// and values changed are supposed to be handled by
+// any gamut remapping, so, are out of gamut as well.
+//
+// **WARNING: This algorithm does assume that gamut
+// remapping algorithms does NOT move in-gamut colors,
+// of course, many perceptual and saturation intents does
+// not work in such way, but relativ. ones should.
+
+static
+LPLUT ComputeGamutWithInput(cmsHPROFILE hInput, cmsHPROFILE hProfile, int Intent)
+{
+ cmsHPROFILE hLab;
+ LPLUT Gamut;
+ DWORD dwFormat;
+ GAMUTCHAIN Chain;
+ int nErrState, nChannels, nGridpoints;
+ LPGAMMATABLE Trans[3];
+ icColorSpaceSignature ColorSpace;
+
+
+ ZeroMemory(&Chain, sizeof(GAMUTCHAIN));
+
+ hLab = cmsCreateLabProfile(NULL);
+
+ // Safeguard against early abortion
+ nErrState = cmsErrorAction(LCMS_ERROR_IGNORE);
+
+ // The figure of merit. On matrix-shaper profiles, should be almost zero as
+ // the conversion is pretty exact. On LUT based profiles, different resolutions
+ // of input and output CLUT may result in differences.
+
+ if (!cmsIsIntentSupported(hProfile, Intent, LCMS_USED_AS_INPUT) &&
+ !cmsIsIntentSupported(hProfile, Intent, LCMS_USED_AS_OUTPUT))
+
+ Chain.Thereshold = 1.0;
+ else
+ Chain.Thereshold = ERR_THERESHOLD;
+
+ ColorSpace = cmsGetColorSpace(hProfile);
+
+ // If input profile specified, create a transform from such profile to Lab
+ if (hInput != NULL) {
+
+ nChannels = _cmsChannelsOf(ColorSpace);
+ nGridpoints = _cmsReasonableGridpointsByColorspace(ColorSpace, cmsFLAGS_HIGHRESPRECALC);
+ dwFormat = (CHANNELS_SH(nChannels)|BYTES_SH(2));
+
+ Chain.hInput = cmsCreateTransform(hInput, dwFormat,
+ hLab, TYPE_Lab_16,
+ Intent,
+ cmsFLAGS_NOTPRECALC);
+ }
+ else {
+ // Input transform=NULL (Lab) Used to compute the gamut tag
+ // This table will take 53 points to give some accurancy,
+ // 53 * 53 * 53 * 2 = 291K
+
+ nChannels = 3; // For Lab
+ nGridpoints = 53;
+ Chain.hInput = NULL;
+ dwFormat = (CHANNELS_SH(_cmsChannelsOf(ColorSpace))|BYTES_SH(2));
+ }
+
+
+ // Does create the forward step
+ Chain.hForward = cmsCreateTransform(hLab, TYPE_Lab_16,
+ hProfile, dwFormat,
+ INTENT_RELATIVE_COLORIMETRIC,
+ cmsFLAGS_NOTPRECALC);
+
+ // Does create the backwards step
+ Chain.hReverse = cmsCreateTransform(hProfile, dwFormat,
+ hLab, TYPE_Lab_16,
+ INTENT_RELATIVE_COLORIMETRIC,
+ cmsFLAGS_NOTPRECALC);
+
+ // Restores error handler previous state
+ cmsErrorAction(nErrState);
+
+
+ // All ok?
+ if (Chain.hForward && Chain.hReverse) {
+
+ // Go on, try to compute gamut LUT from PCS.
+ // This consist on a single channel containing
+ // dE when doing a transform back and forth on
+ // the colorimetric intent.
+
+ Gamut = cmsAllocLUT();
+ Gamut = cmsAlloc3DGrid(Gamut, nGridpoints, nChannels, 1);
+
+ // If no input, then this is a gamut tag operated by Lab,
+ // so include pertinent prelinearization
+ if (hInput == NULL) {
+
+ CreateLabPrelinearization(Trans);
+ cmsAllocLinearTable(Gamut, Trans, 1);
+ cmsFreeGammaTriple(Trans);
+ }
+
+
+ cmsSample3DGrid(Gamut, GamutSampler, (LPVOID) &Chain, Gamut ->wFlags);
+ }
+ else
+ Gamut = NULL; // Didn't work...
+
+ // Free all needed stuff.
+ if (Chain.hInput) cmsDeleteTransform(Chain.hInput);
+ if (Chain.hForward) cmsDeleteTransform(Chain.hForward);
+ if (Chain.hReverse) cmsDeleteTransform(Chain.hReverse);
+
+ cmsCloseProfile(hLab);
+
+ // And return computed hull
+ return Gamut;
+}
+
+
+// Wrapper
+
+LPLUT _cmsComputeGamutLUT(cmsHPROFILE hProfile, int Intent)
+{
+ return ComputeGamutWithInput(NULL, hProfile, Intent);
+}
+
+
+// This routine does compute the gamut check CLUT. This CLUT goes from whatever
+// input space to the 0 or != 0 gamut check.
+
+LPLUT _cmsPrecalculateGamutCheck(cmsHTRANSFORM h)
+{
+ _LPcmsTRANSFORM p = (_LPcmsTRANSFORM) h;
+
+ return ComputeGamutWithInput(p->InputProfile, p ->PreviewProfile, p->Intent);
+}
+
+
+// SoftProofing. Convert from Lab to device, then back to Lab,
+// any gamut remapping is applied
+
+static
+int SoftProofSampler(register WORD In[], register WORD Out[], register LPVOID Cargo)
+{
+ LPGAMUTCHAIN t = (LPGAMUTCHAIN) Cargo;
+ WORD Colorant[MAXCHANNELS];
+
+ // From pcs to colorant
+ cmsDoTransform(t -> hForward, In, Colorant, 1);
+
+ // Now, do the inverse, from colorant to pcs.
+ cmsDoTransform(t -> hReverse, Colorant, Out, 1);
+
+ return TRUE;
+}
+
+// Does return Softproofing LUT on desired intent
+
+LPLUT _cmsComputeSoftProofLUT(cmsHPROFILE hProfile, int nIntent)
+{
+ cmsHPROFILE hLab;
+ LPLUT SoftProof;
+ DWORD dwFormat;
+ GAMUTCHAIN Chain;
+ int nErrState;
+ LPGAMMATABLE Trans[3];
+
+
+ // LUTs are never abs. colorimetric, is the transform who
+ // is responsible of generating white point displacement
+ if (nIntent == INTENT_ABSOLUTE_COLORIMETRIC)
+ nIntent = INTENT_RELATIVE_COLORIMETRIC;
+
+ ZeroMemory(&Chain, sizeof(GAMUTCHAIN));
+
+ hLab = cmsCreateLabProfile(NULL);
+
+ // ONLY 4 channels
+ dwFormat = (CHANNELS_SH(4)|BYTES_SH(2));
+
+ // Safeguard against early abortion
+ nErrState = cmsErrorAction(LCMS_ERROR_IGNORE);
+
+ // Does create the first step
+ Chain.hForward = cmsCreateTransform(hLab, TYPE_Lab_16,
+ hProfile, dwFormat,
+ nIntent,
+ cmsFLAGS_NOTPRECALC);
+
+ // Does create the last step
+ Chain.hReverse = cmsCreateTransform(hProfile, dwFormat,
+ hLab, TYPE_Lab_16,
+ INTENT_RELATIVE_COLORIMETRIC,
+ cmsFLAGS_NOTPRECALC);
+
+ // Restores error handler previous state
+ cmsErrorAction(nErrState);
+
+ // All ok?
+ if (Chain.hForward && Chain.hReverse) {
+
+ // This is Lab -> Lab, so 33 point should hold anything
+ SoftProof = cmsAllocLUT();
+ SoftProof = cmsAlloc3DGrid(SoftProof, 33, 3, 3);
+
+ CreateLabPrelinearization(Trans);
+ cmsAllocLinearTable(SoftProof, Trans, 1);
+ cmsFreeGammaTriple(Trans);
+
+ cmsSample3DGrid(SoftProof, SoftProofSampler, (LPVOID) &Chain, SoftProof->wFlags);
+ }
+ else
+ SoftProof = NULL; // Didn't work...
+
+ // Free all needed stuff.
+ if (Chain.hForward) cmsDeleteTransform(Chain.hForward);
+ if (Chain.hReverse) cmsDeleteTransform(Chain.hReverse);
+
+ cmsCloseProfile(hLab);
+
+ return SoftProof;
+}
+
+
+
+#ifdef DEBUG
+static
+void ASAVE(LPGAMMATABLE p, const char* dump)
+{
+ FILE* f;
+ int i;
+
+ f = fopen(dump, "wt");
+ if (!f)
+ return;
+
+ if (p) {
+
+ for (i=0; i < p -> nEntries; i++)
+ fprintf(f, "%g\n", (double) p -> GammaTable[i]);
+ }
+
+ fclose(f);
+}
+#endif
+
+
+static
+int MostlyLinear(WORD Table[], int nEntries)
+{
+ register int i;
+ int diff;
+
+ for (i=5; i < nEntries; i++) {
+
+ diff = abs((int) Table[i] - (int) _cmsQuantizeVal(i, nEntries));
+ if (diff > 0x0300)
+ return 0;
+ }
+
+ return 1;
+}
+
+
+static
+void SlopeLimiting(WORD Table[], int nEntries)
+{
+ int At = (int) floor((double) nEntries * 0.02 + 0.5); // Cutoff at 2%
+ double Val, Slope;
+ int i;
+
+ Val = Table[At];
+ Slope = Val / At;
+
+ for (i=0; i < At; i++)
+ Table[i] = (WORD) floor(i * Slope + 0.5);
+
+}
+
+
+// Check for monotonicity.
+
+static
+BOOL IsMonotonic(LPGAMMATABLE t)
+{
+ int n = t -> nEntries;
+ int i, last;
+
+ last = t ->GammaTable[n-1];
+
+ for (i = n-2; i >= 0; --i) {
+
+ if (t ->GammaTable[i] > last)
+
+ return FALSE;
+ else
+ last = t ->GammaTable[i];
+
+ }
+
+ return TRUE;
+}
+
+// Check for endpoints
+
+static
+BOOL HasProperEndpoints(LPGAMMATABLE t)
+{
+ if (t ->GammaTable[0] != 0) return FALSE;
+ if (t ->GammaTable[t ->nEntries-1] != 0xFFFF) return FALSE;
+
+ return TRUE;
+}
+
+
+
+#define PRELINEARIZATION_POINTS 4096
+
+// Fixes the gamma balancing of transform. Thanks to Mike Chaney
+// for pointing this subtle bug.
+
+void _cmsComputePrelinearizationTablesFromXFORM(cmsHTRANSFORM h[], int nTransforms, LPLUT Grid)
+{
+ LPGAMMATABLE Trans[MAXCHANNELS];
+ unsigned int t, i, v;
+ int j;
+ WORD In[MAXCHANNELS], Out[MAXCHANNELS];
+ BOOL lIsSuitable;
+ _LPcmsTRANSFORM InputXForm = (_LPcmsTRANSFORM) h[0];
+ _LPcmsTRANSFORM OutputXForm = (_LPcmsTRANSFORM) h[nTransforms-1];
+
+
+ // First space is *Lab, use our specialized curves for v2 Lab
+
+ if (InputXForm ->EntryColorSpace == icSigLabData &&
+ OutputXForm->ExitColorSpace != icSigLabData) {
+
+ CreateLabPrelinearization(Trans);
+ cmsAllocLinearTable(Grid, Trans, 1);
+ cmsFreeGammaTriple(Trans);
+ return;
+ }
+
+
+ // Do nothing on all but RGB to RGB transforms
+
+ if ((InputXForm ->EntryColorSpace != icSigRgbData) ||
+ (OutputXForm->ExitColorSpace != icSigRgbData)) return;
+
+
+ for (t = 0; t < Grid -> InputChan; t++)
+ Trans[t] = cmsAllocGamma(PRELINEARIZATION_POINTS);
+
+ for (i=0; i < PRELINEARIZATION_POINTS; i++) {
+
+ v = _cmsQuantizeVal(i, PRELINEARIZATION_POINTS);
+
+ for (t=0; t < Grid -> InputChan; t++)
+ In[t] = (WORD) v;
+
+ cmsDoTransform(h[0], In, Out, 1);
+ for (j=1; j < nTransforms; j++)
+ cmsDoTransform(h[j], Out, Out, 1);
+
+ for (t=0; t < Grid -> InputChan; t++)
+ Trans[t] ->GammaTable[i] = Out[t];
+
+ }
+
+
+ // Check transfer curves
+ lIsSuitable = TRUE;
+ for (t=0; (lIsSuitable && (t < Grid->InputChan)); t++) {
+
+
+ // Exclude if already linear
+ if (MostlyLinear(Trans[t]->GammaTable, PRELINEARIZATION_POINTS))
+ lIsSuitable = FALSE;
+
+ // Exclude if non-monotonic
+ if (!IsMonotonic(Trans[t]))
+ lIsSuitable = FALSE;
+
+ // Exclude if weird endpoints
+ if (!HasProperEndpoints(Trans[t]))
+ lIsSuitable = FALSE;
+
+ // Exclude if transfer function is not smooth enough
+ // to be modelled as a gamma function, or the gamma is reversed
+
+ if (cmsEstimateGamma(Trans[t]) < 1.0)
+ lIsSuitable = FALSE;
+
+ }
+
+ if (lIsSuitable) {
+
+
+ for (t = 0; t < Grid ->InputChan; t++)
+ SlopeLimiting(Trans[t]->GammaTable, Trans[t]->nEntries);
+ }
+
+
+
+
+#ifdef DEBUG
+ if (lIsSuitable) {
+ ASAVE(Trans[0], "\\gammar.txt");
+ ASAVE(Trans[1], "\\gammag.txt");
+ ASAVE(Trans[2], "\\gammab.txt");
+ }
+#endif
+
+
+ if (lIsSuitable) cmsAllocLinearTable(Grid, Trans, 1);
+
+
+ for (t = 0; t < Grid ->InputChan; t++)
+ cmsFreeGamma(Trans[t]);
+
+
+}
+
+
+// Compute K -> L* relationship
+static
+LPGAMMATABLE ComputeKToLstar(cmsHPROFILE hProfile, int nPoints, int Intent)
+{
+ LPGAMMATABLE out;
+ int i;
+ WORD cmyk[4], wLab[3];
+ cmsHPROFILE hLab = cmsCreateLabProfile(NULL);
+ cmsHTRANSFORM xform = cmsCreateTransform(hProfile, TYPE_CMYK_16,
+ hLab, TYPE_Lab_16,
+ Intent, cmsFLAGS_NOTPRECALC);
+
+
+ out = cmsAllocGamma(nPoints);
+ for (i=0; i < nPoints; i++) {
+
+ cmyk[0] = 0;
+ cmyk[1] = 0;
+ cmyk[2] = 0;
+ cmyk[3] = _cmsQuantizeVal(i, nPoints);
+
+ cmsDoTransform(xform, cmyk, wLab, 1);
+ out->GammaTable[i] = (WORD) (0xFFFF - wLab[0]);
+ }
+
+ cmsDeleteTransform(xform);
+ cmsCloseProfile(hLab);
+
+ return out;
+}
+
+
+
+// Compute Black tone curve on a CMYK -> CMYK transform. This is done by
+// using the proof direction on both profiles to find K->L* relationship
+// then joining both curves
+
+LPGAMMATABLE _cmsBuildKToneCurve(cmsHTRANSFORM hCMYK2CMYK, int nPoints)
+{
+ LPGAMMATABLE in, out;
+ LPGAMMATABLE KTone;
+ _LPcmsTRANSFORM p = (_LPcmsTRANSFORM) hCMYK2CMYK;
+
+
+ // Make sure CMYK -> CMYK
+ if (p -> EntryColorSpace != icSigCmykData ||
+ p -> ExitColorSpace != icSigCmykData) return NULL;
+
+ // Create individual curves
+ in = ComputeKToLstar(p ->InputProfile, nPoints, p->Intent);
+ out = ComputeKToLstar(p ->OutputProfile, nPoints, p->Intent);
+
+ // Build the relationship
+ KTone = cmsJoinGamma(in, out);
+
+#ifdef DEBUG
+ ASAVE(in, "\\in.txt");
+ ASAVE(out, "\\out.txt");
+ ASAVE(KTone, "\\KTone.txt");
+#endif
+
+ cmsFreeGamma(in); cmsFreeGamma(out);
+
+ // Make sure it is monotonic
+
+ if (!IsMonotonic(KTone)) {
+
+ cmsFreeGamma(KTone);
+ return NULL;
+ }
+
+
+
+
+ return KTone;
+}
diff --git a/icc2ps/cmsintrp.c b/icc2ps/cmsintrp.c
new file mode 100644
index 0000000..d9dc95f
--- /dev/null
+++ b/icc2ps/cmsintrp.c
@@ -0,0 +1,1099 @@
+//
+// Little cms
+// Copyright (C) 1998-2005 Marti Maria
+//
+// Permission is hereby granted, free of charge, to any person obtaining
+// a copy of this software and associated documentation files (the "Software"),
+// to deal in the Software without restriction, including without limitation
+// the rights to use, copy, modify, merge, publish, distribute, sublicense,
+// and/or sell copies of the Software, and to permit persons to whom the Software
+// is furnished to do so, subject to the following conditions:
+//
+// The above copyright notice and this permission notice shall be included in
+// all copies or substantial portions of the Software.
+//
+// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
+// EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO
+// THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
+// NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
+// LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
+// OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
+// WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
+
+// Interpolation
+
+#include "lcms.h"
+
+void cmsCalcL16Params(int nSamples, LPL16PARAMS p)
+{
+ p -> nSamples = nSamples;
+ p -> Domain = (WORD) (nSamples - 1);
+ p -> nInputs = p -> nOutputs = 1;
+
+}
+
+
+
+// Eval gray LUT having only one input channel
+
+static
+void Eval1Input(WORD StageABC[], WORD StageLMN[], WORD LutTable[], LPL16PARAMS p16)
+{
+ Fixed32 fk;
+ Fixed32 k0, k1, rk, K0, K1;
+ int OutChan;
+
+ fk = ToFixedDomain((Fixed32) StageABC[0] * p16 -> Domain);
+ k0 = FIXED_TO_INT(fk);
+ rk = (WORD) FIXED_REST_TO_INT(fk);
+
+ k1 = k0 + (StageABC[0] != 0xFFFFU ? 1 : 0);
+
+ K0 = p16 -> opta1 * k0;
+ K1 = p16 -> opta1 * k1;
+
+ for (OutChan=0; OutChan < p16->nOutputs; OutChan++) {
+
+ StageLMN[OutChan] = (WORD) FixedLERP(rk, LutTable[K0+OutChan],
+ LutTable[K1+OutChan]);
+ }
+}
+
+
+
+// For more that 3 inputs (i.e., CMYK)
+// evaluate two 3-dimensional interpolations and then linearly interpolate between them.
+static
+void Eval4Inputs(WORD StageABC[], WORD StageLMN[], WORD LutTable[], LPL16PARAMS p16)
+{
+ Fixed32 fk;
+ Fixed32 k0, rk;
+ int K0, K1;
+ LPWORD T;
+ int i;
+ WORD Tmp1[MAXCHANNELS], Tmp2[MAXCHANNELS];
+
+
+ fk = ToFixedDomain((Fixed32) StageABC[0] * p16 -> Domain);
+ k0 = FIXED_TO_INT(fk);
+ rk = FIXED_REST_TO_INT(fk);
+
+ K0 = p16 -> opta4 * k0;
+ K1 = p16 -> opta4 * (k0 + (StageABC[0] != 0xFFFFU ? 1 : 0));
+
+ p16 -> nInputs = 3;
+
+ T = LutTable + K0;
+
+ cmsTetrahedralInterp16(StageABC + 1, Tmp1, T, p16);
+
+
+ T = LutTable + K1;
+
+ cmsTetrahedralInterp16(StageABC + 1, Tmp2, T, p16);
+
+
+ p16 -> nInputs = 4;
+ for (i=0; i < p16 -> nOutputs; i++)
+ {
+ StageLMN[i] = (WORD) FixedLERP(rk, Tmp1[i], Tmp2[i]);
+
+ }
+
+}
+
+
+static
+void Eval5Inputs(WORD StageABC[], WORD StageLMN[], WORD LutTable[], LPL16PARAMS p16)
+{
+ Fixed32 fk;
+ Fixed32 k0, rk;
+ int K0, K1;
+ LPWORD T;
+ int i;
+ WORD Tmp1[MAXCHANNELS], Tmp2[MAXCHANNELS];
+
+
+ fk = ToFixedDomain((Fixed32) StageABC[0] * p16 -> Domain);
+ k0 = FIXED_TO_INT(fk);
+ rk = FIXED_REST_TO_INT(fk);
+
+ K0 = p16 -> opta5 * k0;
+ K1 = p16 -> opta5 * (k0 + (StageABC[0] != 0xFFFFU ? 1 : 0));
+
+ p16 -> nInputs = 4;
+
+ T = LutTable + K0;
+
+ Eval4Inputs(StageABC + 1, Tmp1, T, p16);
+
+ T = LutTable + K1;
+
+ Eval4Inputs(StageABC + 1, Tmp2, T, p16);
+
+ p16 -> nInputs = 5;
+ for (i=0; i < p16 -> nOutputs; i++)
+ {
+ StageLMN[i] = (WORD) FixedLERP(rk, Tmp1[i], Tmp2[i]);
+
+ }
+
+}
+
+
+static
+void Eval6Inputs(WORD StageABC[], WORD StageLMN[], WORD LutTable[], LPL16PARAMS p16)
+{
+ Fixed32 fk;
+ Fixed32 k0, rk;
+ int K0, K1;
+ LPWORD T;
+ int i;
+ WORD Tmp1[MAXCHANNELS], Tmp2[MAXCHANNELS];
+
+
+ fk = ToFixedDomain((Fixed32) StageABC[0] * p16 -> Domain);
+ k0 = FIXED_TO_INT(fk);
+ rk = FIXED_REST_TO_INT(fk);
+
+ K0 = p16 -> opta6 * k0;
+ K1 = p16 -> opta6 * (k0 + (StageABC[0] != 0xFFFFU ? 1 : 0));
+
+ p16 -> nInputs = 5;
+
+ T = LutTable + K0;
+
+ Eval5Inputs(StageABC + 1, Tmp1, T, p16);
+
+ T = LutTable + K1;
+
+ Eval5Inputs(StageABC + 1, Tmp2, T, p16);
+
+ p16 -> nInputs = 6;
+ for (i=0; i < p16 -> nOutputs; i++)
+ {
+ StageLMN[i] = (WORD) FixedLERP(rk, Tmp1[i], Tmp2[i]);
+ }
+
+}
+
+static
+void Eval7Inputs(WORD StageABC[], WORD StageLMN[], WORD LutTable[], LPL16PARAMS p16)
+{
+ Fixed32 fk;
+ Fixed32 k0, rk;
+ int K0, K1;
+ LPWORD T;
+ int i;
+ WORD Tmp1[MAXCHANNELS], Tmp2[MAXCHANNELS];
+
+
+ fk = ToFixedDomain((Fixed32) StageABC[0] * p16 -> Domain);
+ k0 = FIXED_TO_INT(fk);
+ rk = FIXED_REST_TO_INT(fk);
+
+ K0 = p16 -> opta7 * k0;
+ K1 = p16 -> opta7 * (k0 + (StageABC[0] != 0xFFFFU ? 1 : 0));
+
+ p16 -> nInputs = 6;
+
+ T = LutTable + K0;
+
+ Eval6Inputs(StageABC + 1, Tmp1, T, p16);
+
+ T = LutTable + K1;
+
+ Eval6Inputs(StageABC + 1, Tmp2, T, p16);
+
+ p16 -> nInputs = 7;
+ for (i=0; i < p16 -> nOutputs; i++)
+ {
+ StageLMN[i] = (WORD) FixedLERP(rk, Tmp1[i], Tmp2[i]);
+ }
+
+}
+
+static
+void Eval8Inputs(WORD StageABC[], WORD StageLMN[], WORD LutTable[], LPL16PARAMS p16)
+{
+ Fixed32 fk;
+ Fixed32 k0, rk;
+ int K0, K1;
+ LPWORD T;
+ int i;
+ WORD Tmp1[MAXCHANNELS], Tmp2[MAXCHANNELS];
+
+
+ fk = ToFixedDomain((Fixed32) StageABC[0] * p16 -> Domain);
+ k0 = FIXED_TO_INT(fk);
+ rk = FIXED_REST_TO_INT(fk);
+
+ K0 = p16 -> opta8 * k0;
+ K1 = p16 -> opta8 * (k0 + (StageABC[0] != 0xFFFFU ? 1 : 0));
+
+ p16 -> nInputs = 7;
+
+ T = LutTable + K0;
+
+ Eval7Inputs(StageABC + 1, Tmp1, T, p16);
+
+ T = LutTable + K1;
+
+ Eval7Inputs(StageABC + 1, Tmp2, T, p16);
+
+ p16 -> nInputs = 8;
+ for (i=0; i < p16 -> nOutputs; i++)
+ {
+ StageLMN[i] = (WORD) FixedLERP(rk, Tmp1[i], Tmp2[i]);
+ }
+
+}
+
+
+// Fills optimization parameters
+
+void cmsCalcCLUT16ParamsEx(int nSamples, int InputChan, int OutputChan,
+ BOOL lUseTetrahedral, LPL16PARAMS p)
+{
+ int clutPoints;
+
+ cmsCalcL16Params(nSamples, p);
+
+ p -> nInputs = InputChan;
+ p -> nOutputs = OutputChan;
+
+ clutPoints = p -> Domain + 1;
+
+ p -> opta1 = p -> nOutputs; // Z
+ p -> opta2 = p -> opta1 * clutPoints; // Y
+ p -> opta3 = p -> opta2 * clutPoints; // X
+ p -> opta4 = p -> opta3 * clutPoints; // Used only in 4 inputs LUT
+ p -> opta5 = p -> opta4 * clutPoints; // Used only in 5 inputs LUT
+ p -> opta6 = p -> opta5 * clutPoints; // Used only on 6 inputs LUT
+ p -> opta7 = p -> opta6 * clutPoints; // Used only on 7 inputs LUT
+ p -> opta8 = p -> opta7 * clutPoints; // Used only on 8 inputs LUT
+
+
+ switch (InputChan) {
+
+
+ case 1: // Gray LUT
+
+ p ->Interp3D = Eval1Input;
+ break;
+
+ case 3: // RGB et al
+ if (lUseTetrahedral) {
+ p ->Interp3D = cmsTetrahedralInterp16;
+ }
+ else
+ p ->Interp3D = cmsTrilinearInterp16;
+ break;
+
+ case 4: // CMYK LUT
+ p ->Interp3D = Eval4Inputs;
+ break;
+
+ case 5: // 5 Inks
+ p ->Interp3D = Eval5Inputs;
+ break;
+
+ case 6: // 6 Inks
+ p -> Interp3D = Eval6Inputs;
+ break;
+
+ case 7: // 7 inks
+ p ->Interp3D = Eval7Inputs;
+ break;
+
+ case 8: // 8 inks
+ p ->Interp3D = Eval8Inputs;
+ break;
+
+ default:
+ cmsSignalError(LCMS_ERRC_ABORTED, "Unsupported restoration (%d channels)", InputChan);
+ }
+
+}
+
+
+void cmsCalcCLUT16Params(int nSamples, int InputChan, int OutputChan, LPL16PARAMS p)
+{
+ cmsCalcCLUT16ParamsEx(nSamples, InputChan, OutputChan, FALSE, p);
+}
+
+
+
+#ifdef USE_FLOAT
+
+
+// Floating-point version
+
+WORD cmsLinearInterpLUT16(WORD Value, WORD LutTable[], LPL16PARAMS p)
+{
+ double y1, y0;
+ double y;
+ double val2, rest;
+ int cell0, cell1;
+
+ // if last value...
+
+ if (Value == 0xffff) return LutTable[p -> Domain];
+
+ val2 = p -> Domain * ((double) Value / 65535.0);
+
+ cell0 = (int) floor(val2);
+ cell1 = (int) ceil(val2);
+
+ // Rest is 16 LSB bits
+
+ rest = val2 - cell0;
+
+ y0 = LutTable[cell0] ;
+ y1 = LutTable[cell1] ;
+
+ y = y0 + (y1 - y0) * rest;
+
+
+ return (WORD) floor(y+.5);
+}
+
+#endif
+
+
+//
+// Linear interpolation (Fixed-point optimized, but C source)
+//
+
+
+#ifdef USE_C
+
+WORD cmsLinearInterpLUT16(WORD Value1, WORD LutTable[], LPL16PARAMS p)
+{
+ WORD y1, y0;
+ WORD y;
+ int dif, a1;
+ int cell0, rest;
+ int val3, Value;
+
+ // if last value...
+
+
+ Value = Value1;
+ if (Value == 0xffff) return LutTable[p -> Domain];
+
+ val3 = p -> Domain * Value;
+ val3 = ToFixedDomain(val3); // To fixed 15.16
+
+ cell0 = FIXED_TO_INT(val3); // Cell is 16 MSB bits
+ rest = FIXED_REST_TO_INT(val3); // Rest is 16 LSB bits
+
+ y0 = LutTable[cell0] ;
+ y1 = LutTable[cell0+1] ;
+
+ dif = (int) y1 - y0; // dif is in domain -ffff ... ffff
+
+ if (dif >= 0)
+ {
+ a1 = ToFixedDomain(dif * rest);
+ a1 += 0x8000;
+ }
+ else
+ {
+ a1 = ToFixedDomain((- dif) * rest);
+ a1 -= 0x8000;
+ a1 = -a1;
+ }
+
+ y = (WORD) (y0 + FIXED_TO_INT(a1));
+
+ return y;
+}
+
+#endif
+
+// Linear interpolation (asm by hand optimized)
+
+#ifdef USE_ASSEMBLER
+
+#ifdef _MSC_VER
+#pragma warning(disable : 4033)
+#endif
+
+WORD cmsLinearInterpLUT16(WORD Value, WORD LutTable[], LPL16PARAMS p)
+{
+ int xDomain = p -> Domain;
+
+
+ if (Value == 0xffff) return LutTable[p -> Domain];
+ else
+ ASM {
+ xor eax, eax
+ mov ax, word ptr ss:Value
+ mov edx, ss:xDomain
+ mul edx // val3 = p -> Domain * Value;
+ shld edx, eax, 16 // Convert it to fixed 15.16
+ shl eax, 16 // * 65536 / 65535
+ mov ebx, 0x0000ffff
+ div ebx
+ mov ecx, eax
+ sar ecx, 16 // ecx = cell0
+ mov edx, eax // rest = (val2 & 0xFFFFU)
+ and edx, 0x0000ffff // edx = rest
+ mov ebx, ss:LutTable
+ lea eax, dword ptr [ebx+2*ecx] // Ptr to LUT
+ xor ebx, ebx
+ mov bx, word ptr [eax] // EBX = y0
+ movzx eax, word ptr [eax+2] // EAX = y1
+ sub eax, ebx // EAX = y1-y0
+ js IsNegative
+ mul edx // EAX = EAX * rest
+ shld edx, eax, 16 // Pass it to fixed
+ sal eax, 16 // * 65536 / 65535
+ mov ecx, 0x0000ffff
+ div ecx
+ add eax, 0x8000 // Rounding
+ sar eax, 16
+ add eax, ebx // Done!
+ }
+
+ RET((WORD) _EAX);
+
+ IsNegative:
+
+ ASM {
+ neg eax
+ mul edx // EAX = EAX * rest
+ shld edx, eax, 16 // Pass it to fixed
+ sal eax, 16 // * 65536 / 65535
+ mov ecx, 0x0000ffff
+ div ecx
+ sub eax, 0x8000
+ neg eax
+ sar eax, 16
+ add eax, ebx // Done!
+ }
+
+ RET((WORD) _EAX);
+}
+
+#ifndef __BORLANDC__
+#pragma warning(default : 4033)
+#endif
+
+#endif
+
+Fixed32 cmsLinearInterpFixed(WORD Value1, WORD LutTable[], LPL16PARAMS p)
+{
+ Fixed32 y1, y0;
+ int cell0;
+ int val3, Value;
+
+ // if last value...
+
+
+ Value = Value1;
+ if (Value == 0xffffU) return LutTable[p -> Domain];
+
+ val3 = p -> Domain * Value;
+ val3 = ToFixedDomain(val3); // To fixed 15.16
+
+ cell0 = FIXED_TO_INT(val3); // Cell is 16 MSB bits
+
+ y0 = LutTable[cell0] ;
+ y1 = LutTable[cell0+1] ;
+
+
+ return y0 + FixedMul((y1 - y0), (val3 & 0xFFFFL));
+}
+
+
+// Reverse Lineal interpolation (16 bits)
+// Im using a sort of binary search here, this is not a time-critical function
+
+WORD cmsReverseLinearInterpLUT16(WORD Value, WORD LutTable[], LPL16PARAMS p)
+{
+ register int l = 1;
+ register int r = 0x10000;
+ register int x = 0, res; // 'int' Give spacing for negative values
+ int NumZeroes, NumPoles;
+ int cell0, cell1;
+ double val2;
+ double y0, y1, x0, x1;
+ double a, b, f;
+
+ // July/27 2001 - Expanded to handle degenerated curves with an arbitrary
+ // number of elements containing 0 at the begining of the table (Zeroes)
+ // and another arbitrary number of poles (FFFFh) at the end.
+ // First the zero and pole extents are computed, then value is compared.
+
+ NumZeroes = 0;
+ while (LutTable[NumZeroes] == 0 && NumZeroes < p -> Domain)
+ NumZeroes++;
+
+ // There are no zeros at the beginning and we are trying to find a zero, so
+ // return anything. It seems zero would be the less destructive choice
+
+ if (NumZeroes == 0 && Value == 0)
+ return 0;
+
+ NumPoles = 0;
+ while (LutTable[p -> Domain - NumPoles] == 0xFFFF && NumPoles < p -> Domain)
+ NumPoles++;
+
+ // Does the curve belong to this case?
+ if (NumZeroes > 1 || NumPoles > 1)
+ {
+ int a, b;
+
+ // Identify if value fall downto 0 or FFFF zone
+ if (Value == 0) return 0;
+ if (Value == 0xFFFF) return 0xFFFF;
+
+ // else restrict to valid zone
+
+ a = ((NumZeroes-1) * 0xFFFF) / p->Domain;
+ b = ((p -> Domain - NumPoles) * 0xFFFF) / p ->Domain;
+
+ l = a - 1;
+ r = b + 1;
+ }
+
+
+ // Seems not a degenerated case... apply binary search
+
+ while (r > l) {
+
+ x = (l + r) / 2;
+
+ res = (int) cmsLinearInterpLUT16((WORD) (x - 1), LutTable, p);
+
+ if (res == Value) {
+
+ // Found exact match.
+
+ return (WORD) (x - 1);
+ }
+
+ if (res > Value) r = x - 1;
+ else l = x + 1;
+ }
+
+ // Not found, should we interpolate?
+
+
+ // Get surrounding nodes
+
+ val2 = p -> Domain * ((double) (x - 1) / 65535.0);
+
+ cell0 = (int) floor(val2);
+ cell1 = (int) ceil(val2);
+
+ if (cell0 == cell1) return (WORD) x;
+
+ y0 = LutTable[cell0] ;
+ x0 = (65535.0 * cell0) / p ->Domain;
+
+ y1 = LutTable[cell1] ;
+ x1 = (65535.0 * cell1) / p ->Domain;
+
+ a = (y1 - y0) / (x1 - x0);
+ b = y0 - a * x0;
+
+ if (a == 0) return (WORD) x;
+
+ f = ((Value - b) / a);
+
+ if (f < 0.0) return (WORD) 0;
+ if (f >= 65535.0) return (WORD) 0xFFFF;
+
+ return (WORD) floor(f + 0.5);
+
+}
+
+
+
+
+// Trilinear interpolation (16 bits) - float version
+
+#ifdef USE_FLOAT
+void cmsTrilinearInterp16(WORD Input[], WORD Output[],
+ WORD LutTable[], LPL16PARAMS p)
+
+{
+# define LERP(a,l,h) (double) ((l)+(((h)-(l))*(a)))
+# define DENS(X, Y, Z) (double) (LutTable[TotalOut*((Z)+clutPoints*((Y)+clutPoints*(X)))+OutChan])
+
+
+
+ double px, py, pz;
+ int x0, y0, z0,
+ x1, y1, z1;
+ int clutPoints, TotalOut, OutChan;
+ double fx, fy, fz,
+ d000, d001, d010, d011,
+ d100, d101, d110, d111,
+ dx00, dx01, dx10, dx11,
+ dxy0, dxy1, dxyz;
+
+
+ clutPoints = p -> Domain + 1;
+ TotalOut = p -> nOutputs;
+
+ px = ((double) Input[0] * (p->Domain)) / 65535.0;
+ py = ((double) Input[1] * (p->Domain)) / 65535.0;
+ pz = ((double) Input[2] * (p->Domain)) / 65535.0;
+
+ x0 = (int) _cmsQuickFloor(px); fx = px - (double) x0;
+ y0 = (int) _cmsQuickFloor(py); fy = py - (double) y0;
+ z0 = (int) _cmsQuickFloor(pz); fz = pz - (double) z0;
+
+ x1 = x0 + (Input[0] != 0xFFFFU ? 1 : 0);
+ y1 = y0 + (Input[1] != 0xFFFFU ? 1 : 0);
+ z1 = z0 + (Input[2] != 0xFFFFU ? 1 : 0);
+
+
+ for (OutChan = 0; OutChan < TotalOut; OutChan++)
+ {
+
+ d000 = DENS(x0, y0, z0);
+ d001 = DENS(x0, y0, z1);
+ d010 = DENS(x0, y1, z0);
+ d011 = DENS(x0, y1, z1);
+
+ d100 = DENS(x1, y0, z0);
+ d101 = DENS(x1, y0, z1);
+ d110 = DENS(x1, y1, z0);
+ d111 = DENS(x1, y1, z1);
+
+
+ dx00 = LERP(fx, d000, d100);
+ dx01 = LERP(fx, d001, d101);
+ dx10 = LERP(fx, d010, d110);
+ dx11 = LERP(fx, d011, d111);
+
+ dxy0 = LERP(fy, dx00, dx10);
+ dxy1 = LERP(fy, dx01, dx11);
+
+ dxyz = LERP(fz, dxy0, dxy1);
+
+ Output[OutChan] = (WORD) floor(dxyz + .5);
+ }
+
+
+# undef LERP
+# undef DENS
+}
+
+
+#endif
+
+
+#ifndef USE_FLOAT
+
+// Trilinear interpolation (16 bits) - optimized version
+
+void cmsTrilinearInterp16(WORD Input[], WORD Output[],
+ WORD LutTable[], LPL16PARAMS p)
+
+{
+#define DENS(i,j,k) (LutTable[(i)+(j)+(k)+OutChan])
+#define LERP(a,l,h) (WORD) (l+ ROUND_FIXED_TO_INT(((h-l)*a)))
+
+
+ int OutChan, TotalOut;
+ Fixed32 fx, fy, fz;
+ register int rx, ry, rz;
+ int x0, y0, z0;
+ register int X0, X1, Y0, Y1, Z0, Z1;
+ int d000, d001, d010, d011,
+ d100, d101, d110, d111,
+ dx00, dx01, dx10, dx11,
+ dxy0, dxy1, dxyz;
+
+
+ TotalOut = p -> nOutputs;
+
+ fx = ToFixedDomain((int) Input[0] * p -> Domain);
+ x0 = FIXED_TO_INT(fx);
+ rx = FIXED_REST_TO_INT(fx); // Rest in 0..1.0 domain
+
+
+ fy = ToFixedDomain((int) Input[1] * p -> Domain);
+ y0 = FIXED_TO_INT(fy);
+ ry = FIXED_REST_TO_INT(fy);
+
+ fz = ToFixedDomain((int) Input[2] * p -> Domain);
+ z0 = FIXED_TO_INT(fz);
+ rz = FIXED_REST_TO_INT(fz);
+
+
+
+ X0 = p -> opta3 * x0;
+ X1 = X0 + (Input[0] == 0xFFFFU ? 0 : p->opta3);
+
+ Y0 = p -> opta2 * y0;
+ Y1 = Y0 + (Input[1] == 0xFFFFU ? 0 : p->opta2);
+
+ Z0 = p -> opta1 * z0;
+ Z1 = Z0 + (Input[2] == 0xFFFFU ? 0 : p->opta1);
+
+
+
+ for (OutChan = 0; OutChan < TotalOut; OutChan++)
+ {
+
+ d000 = DENS(X0, Y0, Z0);
+ d001 = DENS(X0, Y0, Z1);
+ d010 = DENS(X0, Y1, Z0);
+ d011 = DENS(X0, Y1, Z1);
+
+ d100 = DENS(X1, Y0, Z0);
+ d101 = DENS(X1, Y0, Z1);
+ d110 = DENS(X1, Y1, Z0);
+ d111 = DENS(X1, Y1, Z1);
+
+
+ dx00 = LERP(rx, d000, d100);
+ dx01 = LERP(rx, d001, d101);
+ dx10 = LERP(rx, d010, d110);
+ dx11 = LERP(rx, d011, d111);
+
+ dxy0 = LERP(ry, dx00, dx10);
+ dxy1 = LERP(ry, dx01, dx11);
+
+ dxyz = LERP(rz, dxy0, dxy1);
+
+ Output[OutChan] = (WORD) dxyz;
+ }
+
+
+# undef LERP
+# undef DENS
+}
+
+#endif
+
+
+#ifdef USE_FLOAT
+
+#define DENS(X, Y, Z) (double) (LutTable[TotalOut*((Z)+clutPoints*((Y)+clutPoints*(X)))+OutChan])
+
+
+// Tetrahedral interpolation, using Sakamoto algorithm.
+
+void cmsTetrahedralInterp16(WORD Input[],
+ WORD Output[],
+ WORD LutTable[],
+ LPL16PARAMS p)
+{
+ double px, py, pz;
+ int x0, y0, z0,
+ x1, y1, z1;
+ double fx, fy, fz;
+ double c1=0, c2=0, c3=0;
+ int clutPoints, OutChan, TotalOut;
+
+
+ clutPoints = p -> Domain + 1;
+ TotalOut = p -> nOutputs;
+
+
+ px = ((double) Input[0] * p->Domain) / 65535.0;
+ py = ((double) Input[1] * p->Domain) / 65535.0;
+ pz = ((double) Input[2] * p->Domain) / 65535.0;
+
+ x0 = (int) _cmsQuickFloor(px); fx = (px - (double) x0);
+ y0 = (int) _cmsQuickFloor(py); fy = (py - (double) y0);
+ z0 = (int) _cmsQuickFloor(pz); fz = (pz - (double) z0);
+
+
+ x1 = x0 + (Input[0] != 0xFFFFU ? 1 : 0);
+ y1 = y0 + (Input[1] != 0xFFFFU ? 1 : 0);
+ z1 = z0 + (Input[2] != 0xFFFFU ? 1 : 0);
+
+
+ for (OutChan=0; OutChan < TotalOut; OutChan++)
+ {
+
+ // These are the 6 Tetrahedral
+
+ if (fx >= fy && fy >= fz)
+ {
+ c1 = DENS(x1, y0, z0) - DENS(x0, y0, z0);
+ c2 = DENS(x1, y1, z0) - DENS(x1, y0, z0);
+ c3 = DENS(x1, y1, z1) - DENS(x1, y1, z0);
+ }
+ else
+ if (fx >= fz && fz >= fy)
+ {
+ c1 = DENS(x1, y0, z0) - DENS(x0, y0, z0);
+ c2 = DENS(x1, y1, z1) - DENS(x1, y0, z1);
+ c3 = DENS(x1, y0, z1) - DENS(x1, y0, z0);
+ }
+ else
+ if (fz >= fx && fx >= fy)
+ {
+ c1 = DENS(x1, y0, z1) - DENS(x0, y0, z1);
+ c2 = DENS(x1, y1, z1) - DENS(x1, y0, z1);
+ c3 = DENS(x0, y0, z1) - DENS(x0, y0, z0);
+ }
+ else
+ if (fy >= fx && fx >= fz)
+ {
+ c1 = DENS(x1, y1, z0) - DENS(x0, y1, z0);
+ c2 = DENS(x0, y1, z0) - DENS(x0, y0, z0);
+ c3 = DENS(x1, y1, z1) - DENS(x1, y1, z0);
+
+ }
+ else
+ if (fy >= fz && fz >= fx)
+ {
+ c1 = DENS(x1, y1, z1) - DENS(x0, y1, z1);
+ c2 = DENS(x0, y1, z0) - DENS(x0, y0, z0);
+ c3 = DENS(x0, y1, z1) - DENS(x0, y1, z0);
+ }
+ else
+ if (fz >= fy && fy >= fx)
+ {
+ c1 = DENS(x1, y1, z1) - DENS(x0, y1, z1);
+ c2 = DENS(x0, y1, z1) - DENS(x0, y0, z1);
+ c3 = DENS(x0, y0, z1) - DENS(x0, y0, z0);
+ }
+ else
+ {
+ c1 = c2 = c3 = 0;
+ // assert(FALSE);
+ }
+
+
+ Output[OutChan] = (WORD) floor((double) DENS(x0,y0,z0) + c1 * fx + c2 * fy + c3 * fz + .5);
+ }
+
+}
+
+#undef DENS
+
+#else
+
+#define DENS(i,j,k) (LutTable[(i)+(j)+(k)+OutChan])
+
+void cmsTetrahedralInterp16(WORD Input[],
+ WORD Output[],
+ WORD LutTable[],
+ LPL16PARAMS p)
+{
+
+ Fixed32 fx, fy, fz;
+ Fixed32 rx, ry, rz;
+ int x0, y0, z0;
+ Fixed32 c1, c2, c3, Rest;
+ int OutChan;
+ register Fixed32 X0, X1, Y0, Y1, Z0, Z1;
+ int TotalOut = p -> nOutputs;
+
+
+
+ fx = ToFixedDomain((int) Input[0] * p -> Domain);
+ fy = ToFixedDomain((int) Input[1] * p -> Domain);
+ fz = ToFixedDomain((int) Input[2] * p -> Domain);
+
+ x0 = FIXED_TO_INT(fx);
+ y0 = FIXED_TO_INT(fy);
+ z0 = FIXED_TO_INT(fz);
+
+ rx = FIXED_REST_TO_INT(fx);
+ ry = FIXED_REST_TO_INT(fy);
+ rz = FIXED_REST_TO_INT(fz);
+
+ X0 = p -> opta3 * x0;
+ X1 = X0 + (Input[0] == 0xFFFFU ? 0 : p->opta3);
+
+ Y0 = p -> opta2 * y0;
+ Y1 = Y0 + (Input[1] == 0xFFFFU ? 0 : p->opta2);
+
+ Z0 = p -> opta1 * z0;
+ Z1 = Z0 + (Input[2] == 0xFFFFU ? 0 : p->opta1);
+
+
+
+ // These are the 6 Tetrahedral
+ for (OutChan=0; OutChan < TotalOut; OutChan++) {
+
+ if (rx >= ry && ry >= rz) {
+
+ c1 = DENS(X1, Y0, Z0) - DENS(X0, Y0, Z0);
+ c2 = DENS(X1, Y1, Z0) - DENS(X1, Y0, Z0);
+ c3 = DENS(X1, Y1, Z1) - DENS(X1, Y1, Z0);
+
+ }
+ else
+ if (rx >= rz && rz >= ry) {
+
+ c1 = DENS(X1, Y0, Z0) - DENS(X0, Y0, Z0);
+ c2 = DENS(X1, Y1, Z1) - DENS(X1, Y0, Z1);
+ c3 = DENS(X1, Y0, Z1) - DENS(X1, Y0, Z0);
+
+ }
+ else
+ if (rz >= rx && rx >= ry) {
+
+ c1 = DENS(X1, Y0, Z1) - DENS(X0, Y0, Z1);
+ c2 = DENS(X1, Y1, Z1) - DENS(X1, Y0, Z1);
+ c3 = DENS(X0, Y0, Z1) - DENS(X0, Y0, Z0);
+
+ }
+ else
+ if (ry >= rx && rx >= rz) {
+
+ c1 = DENS(X1, Y1, Z0) - DENS(X0, Y1, Z0);
+ c2 = DENS(X0, Y1, Z0) - DENS(X0, Y0, Z0);
+ c3 = DENS(X1, Y1, Z1) - DENS(X1, Y1, Z0);
+
+ }
+ else
+ if (ry >= rz && rz >= rx) {
+
+ c1 = DENS(X1, Y1, Z1) - DENS(X0, Y1, Z1);
+ c2 = DENS(X0, Y1, Z0) - DENS(X0, Y0, Z0);
+ c3 = DENS(X0, Y1, Z1) - DENS(X0, Y1, Z0);
+
+ }
+ else
+ if (rz >= ry && ry >= rx) {
+
+ c1 = DENS(X1, Y1, Z1) - DENS(X0, Y1, Z1);
+ c2 = DENS(X0, Y1, Z1) - DENS(X0, Y0, Z1);
+ c3 = DENS(X0, Y0, Z1) - DENS(X0, Y0, Z0);
+
+ }
+ else {
+ c1 = c2 = c3 = 0;
+ // assert(FALSE);
+ }
+
+ Rest = c1 * rx + c2 * ry + c3 * rz;
+
+ // There is a lot of math hidden in this expression. The rest is in fixed domain
+ // and the result in 0..ffff domain. So the complete expression should be
+ // ROUND_FIXED_TO_INT(ToFixedDomain(Rest)) But that can be optimized as (Rest + 0x7FFF) / 0xFFFF
+
+ Output[OutChan] = (WORD) (DENS(X0,Y0,Z0) + ((Rest + 0x7FFF) / 0xFFFF));
+
+ }
+
+}
+
+
+
+#undef DENS
+
+#endif
+
+
+// A optimized interpolation for 8-bit input.
+
+#define DENS(i,j,k) (LutTable[(i)+(j)+(k)+OutChan])
+
+void cmsTetrahedralInterp8(WORD Input[],
+ WORD Output[],
+ WORD LutTable[],
+ LPL16PARAMS p)
+{
+
+ int r, g, b;
+ Fixed32 rx, ry, rz;
+ Fixed32 c1, c2, c3, Rest;
+ int OutChan;
+ register Fixed32 X0, X1, Y0, Y1, Z0, Z1;
+ int TotalOut = p -> nOutputs;
+ register LPL8PARAMS p8 = p ->p8;
+
+
+
+ r = Input[0] >> 8;
+ g = Input[1] >> 8;
+ b = Input[2] >> 8;
+
+ X0 = X1 = p8->X0[r];
+ Y0 = Y1 = p8->Y0[g];
+ Z0 = Z1 = p8->Z0[b];
+
+ X1 += (r == 255) ? 0 : p ->opta3;
+ Y1 += (g == 255) ? 0 : p ->opta2;
+ Z1 += (b == 255) ? 0 : p ->opta1;
+
+ rx = p8 ->rx[r];
+ ry = p8 ->ry[g];
+ rz = p8 ->rz[b];
+
+
+ // These are the 6 Tetrahedral
+ for (OutChan=0; OutChan < TotalOut; OutChan++) {
+
+ if (rx >= ry && ry >= rz)
+ {
+
+ c1 = DENS(X1, Y0, Z0) - DENS(X0, Y0, Z0);
+ c2 = DENS(X1, Y1, Z0) - DENS(X1, Y0, Z0);
+ c3 = DENS(X1, Y1, Z1) - DENS(X1, Y1, Z0);
+
+ }
+ else
+ if (rx >= rz && rz >= ry)
+ {
+ c1 = DENS(X1, Y0, Z0) - DENS(X0, Y0, Z0);
+ c2 = DENS(X1, Y1, Z1) - DENS(X1, Y0, Z1);
+ c3 = DENS(X1, Y0, Z1) - DENS(X1, Y0, Z0);
+
+ }
+ else
+ if (rz >= rx && rx >= ry)
+ {
+
+ c1 = DENS(X1, Y0, Z1) - DENS(X0, Y0, Z1);
+ c2 = DENS(X1, Y1, Z1) - DENS(X1, Y0, Z1);
+ c3 = DENS(X0, Y0, Z1) - DENS(X0, Y0, Z0);
+
+ }
+ else
+ if (ry >= rx && rx >= rz)
+ {
+
+ c1 = DENS(X1, Y1, Z0) - DENS(X0, Y1, Z0);
+ c2 = DENS(X0, Y1, Z0) - DENS(X0, Y0, Z0);
+ c3 = DENS(X1, Y1, Z1) - DENS(X1, Y1, Z0);
+
+ }
+ else
+ if (ry >= rz && rz >= rx)
+ {
+
+ c1 = DENS(X1, Y1, Z1) - DENS(X0, Y1, Z1);
+ c2 = DENS(X0, Y1, Z0) - DENS(X0, Y0, Z0);
+ c3 = DENS(X0, Y1, Z1) - DENS(X0, Y1, Z0);
+
+ }
+ else
+ if (rz >= ry && ry >= rx)
+ {
+ c1 = DENS(X1, Y1, Z1) - DENS(X0, Y1, Z1);
+ c2 = DENS(X0, Y1, Z1) - DENS(X0, Y0, Z1);
+ c3 = DENS(X0, Y0, Z1) - DENS(X0, Y0, Z0);
+
+ }
+ else {
+ c1 = c2 = c3 = 0;
+ // assert(FALSE);
+ }
+
+
+ Rest = c1 * rx + c2 * ry + c3 * rz;
+
+ Output[OutChan] = (WORD) (DENS(X0,Y0,Z0) + ((Rest + 0x7FFF) / 0xFFFF));
+ }
+
+}
+
+#undef DENS
+
diff --git a/icc2ps/cmsio0.c b/icc2ps/cmsio0.c
new file mode 100644
index 0000000..8925468
--- /dev/null
+++ b/icc2ps/cmsio0.c
@@ -0,0 +1,707 @@
+//
+// Little cms
+// Copyright (C) 1998-2005 Marti Maria
+//
+// Permission is hereby granted, free of charge, to any person obtaining
+// a copy of this software and associated documentation files (the "Software"),
+// to deal in the Software without restriction, including without limitation
+// the rights to use, copy, modify, merge, publish, distribute, sublicense,
+// and/or sell copies of the Software, and to permit persons to whom the Software
+// is furnished to do so, subject to the following conditions:
+//
+// The above copyright notice and this permission notice shall be included in
+// all copies or substantial portions of the Software.
+//
+// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
+// EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO
+// THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
+// NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
+// LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
+// OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
+// WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
+//
+
+// Generic I/O, tag dictionary management, profile struct
+
+
+
+#include "lcms.h"
+
+
+// Memory-based stream ---------------------------------------------------
+
+typedef struct {
+ LPBYTE Block; // Points to allocated memory
+ size_t Size; // Size of allocated memory
+ int Pointer; // Points to current location
+ int FreeBlockOnClose; // As title
+
+ } FILEMEM;
+
+static
+LPVOID MemoryOpen(LPBYTE Block, size_t Size, char Mode)
+{
+ FILEMEM* fm = (FILEMEM*) malloc(sizeof(FILEMEM));
+ ZeroMemory(fm, sizeof(FILEMEM));
+
+ if (Mode == 'r') {
+
+ fm ->Block = (LPBYTE) malloc(Size);
+ if (fm ->Block == NULL) {
+ free(fm);
+ return NULL;
+ }
+
+
+ CopyMemory(fm->Block, Block, Size);
+ fm ->FreeBlockOnClose = TRUE;
+ }
+ else {
+ fm ->Block = Block;
+ fm ->FreeBlockOnClose = FALSE;
+ }
+
+ fm ->Size = Size;
+ fm ->Pointer = 0;
+
+ return (LPVOID) fm;
+}
+
+
+static
+size_t MemoryRead(LPVOID buffer, size_t size, size_t count, struct _lcms_iccprofile_struct* Icc)
+{
+ FILEMEM* ResData = (FILEMEM*) Icc ->stream;
+ LPBYTE Ptr;
+ size_t len = size * count;
+
+
+ if (ResData -> Pointer + len > ResData -> Size){
+
+ len = (ResData -> Size - ResData -> Pointer);
+ cmsSignalError(LCMS_ERRC_WARNING, "Read from memory error. Got %d bytes, block should be of %d bytes", len * size, count * size);
+
+ }
+
+ Ptr = ResData -> Block;
+ Ptr += ResData -> Pointer;
+ CopyMemory(buffer, Ptr, len);
+ ResData -> Pointer += (int) len;
+
+ return count;
+}
+
+// SEEK_CUR is assumed
+
+static
+BOOL MemorySeek(struct _lcms_iccprofile_struct* Icc, size_t offset)
+{
+ FILEMEM* ResData = (FILEMEM*) Icc ->stream;
+
+ if (offset > ResData ->Size)
+ cmsSignalError(LCMS_ERRC_ABORTED, "Pointer error; probably corrupted file");
+
+ ResData ->Pointer = (DWORD) offset;
+ return FALSE;
+}
+
+// FTell
+
+static
+size_t MemoryTell(struct _lcms_iccprofile_struct* Icc)
+{
+ FILEMEM* ResData = (FILEMEM*) Icc ->stream;
+
+ return ResData -> Pointer;
+}
+
+
+// Writes data to memory, also keeps used space for further reference
+
+static
+BOOL MemoryWrite(struct _lcms_iccprofile_struct* Icc, size_t size, void *Ptr)
+{
+ FILEMEM* ResData = (FILEMEM*) Icc ->stream;
+
+ if (size == 0) return TRUE;
+
+ if (ResData != NULL)
+ CopyMemory(ResData ->Block + Icc ->UsedSpace, Ptr, size);
+
+ Icc->UsedSpace += size;
+
+ return TRUE;
+}
+
+
+static
+BOOL MemoryClose(struct _lcms_iccprofile_struct* Icc)
+{
+ FILEMEM* ResData = (FILEMEM*) Icc ->stream;
+
+ if (ResData ->FreeBlockOnClose) {
+
+ if (ResData ->Block) free(ResData ->Block);
+ }
+ free(ResData);
+ return 0;
+}
+
+
+// File-based stream -------------------------------------------------------
+
+static
+LPVOID FileOpen(const char* filename)
+{
+ return (void*) fopen(filename, "rb");
+}
+
+static
+size_t FileRead(void *buffer, size_t size, size_t count, struct _lcms_iccprofile_struct* Icc)
+{
+ size_t nReaded = fread(buffer, size, count, (FILE*) Icc->stream);
+ if (nReaded != count) {
+ cmsSignalError(LCMS_ERRC_WARNING, "Read error. Got %d bytes, block should be of %d bytes", nReaded * size, count * size);
+ }
+
+ return nReaded;
+}
+
+
+static
+BOOL FileSeek(struct _lcms_iccprofile_struct* Icc, size_t offset)
+{
+ if (fseek((FILE*) Icc ->stream, (long) offset, SEEK_SET) != 0) {
+
+ cmsSignalError(LCMS_ERRC_ABORTED, "Seek error; probably corrupted file");
+ return TRUE;
+ }
+
+ return FALSE;
+}
+
+
+static
+size_t FileTell(struct _lcms_iccprofile_struct* Icc)
+{
+ return ftell((FILE*) Icc ->stream);
+}
+
+// Writes data to stream, also keeps used space for further reference
+
+
+static
+BOOL FileWrite(struct _lcms_iccprofile_struct* Icc, size_t size, LPVOID Ptr)
+{
+ if (size == 0) return TRUE;
+
+ Icc->UsedSpace += size;
+
+ if (Icc->stream == NULL) {
+
+ return TRUE;
+ }
+
+ return (fwrite(Ptr, size, 1, (FILE*) Icc->stream) == 1);
+}
+
+
+static
+BOOL FileClose(struct _lcms_iccprofile_struct* Icc)
+{
+ return fclose((FILE*) Icc ->stream);
+}
+
+// ----------------------------------------------------------------------------------------------------
+
+
+// Creates an empty structure holding all required parameters
+
+cmsHPROFILE _cmsCreateProfilePlaceholder(void)
+{
+
+ LPLCMSICCPROFILE Icc = (LPLCMSICCPROFILE) malloc(sizeof(LCMSICCPROFILE));
+ if (Icc == NULL) return NULL;
+
+ // Empty values
+ ZeroMemory(Icc, sizeof(LCMSICCPROFILE));
+
+ // Make sure illuminant is correct
+ Icc ->Illuminant = *cmsD50_XYZ();
+
+ // Set it to empty
+ Icc -> TagCount = 0;
+
+ // Return the handle
+ return (cmsHPROFILE) Icc;
+}
+
+
+// Return the number of tags
+icInt32Number LCMSEXPORT cmsGetTagCount(cmsHPROFILE hProfile)
+{
+ LPLCMSICCPROFILE Icc = (LPLCMSICCPROFILE) hProfile;
+ return Icc->TagCount;
+}
+
+// Return the tag signature of a given tag number
+icTagSignature LCMSEXPORT cmsGetTagSignature(cmsHPROFILE hProfile, icInt32Number n)
+{
+ LPLCMSICCPROFILE Icc = (LPLCMSICCPROFILE) hProfile;
+
+ if (n < 0 || n > Icc->TagCount) return (icTagSignature) 0; // Mark as not available
+
+ return Icc ->TagNames[n];
+}
+
+
+// Search for a specific tag in tag dictionary
+// Returns position or -1 if tag not found
+
+icInt32Number _cmsSearchTag(LPLCMSICCPROFILE Profile, icTagSignature sig, BOOL lSignalError)
+{
+ icInt32Number i;
+
+ if (sig == 0) return -1; // 0 identifies a special tag holding raw memory.
+
+ for (i=0; i < Profile -> TagCount; i++) {
+
+ if (sig == Profile -> TagNames[i])
+ return i;
+ }
+
+ if (lSignalError)
+ cmsSignalError(LCMS_ERRC_ABORTED, "Tag '%lx' not found", sig);
+
+ return -1;
+}
+
+
+// Check existance
+
+BOOL LCMSEXPORT cmsIsTag(cmsHPROFILE hProfile, icTagSignature sig)
+{
+ LPLCMSICCPROFILE Icc = (LPLCMSICCPROFILE) (LPSTR) hProfile;
+ return _cmsSearchTag(Icc, sig, FALSE) >= 0;
+}
+
+
+
+// Search for a particular tag, replace if found or add new one else
+
+LPVOID _cmsInitTag(LPLCMSICCPROFILE Icc, icTagSignature sig, size_t size, const void* Init)
+{
+ LPVOID Ptr;
+ icInt32Number i;
+
+ i = _cmsSearchTag(Icc, sig, FALSE);
+
+ if (i >=0) {
+
+ if (Icc -> TagPtrs[i]) free(Icc -> TagPtrs[i]);
+ }
+ else {
+
+ i = Icc -> TagCount;
+ Icc -> TagCount++;
+
+ if (Icc ->TagCount >= MAX_TABLE_TAG) {
+
+ cmsSignalError(LCMS_ERRC_ABORTED, "Too many tags (%d)", MAX_TABLE_TAG);
+ Icc ->TagCount = MAX_TABLE_TAG-1;
+ }
+ }
+
+
+ Ptr = malloc(size);
+ CopyMemory(Ptr, Init, size);
+
+ Icc ->TagNames[i] = sig;
+ Icc ->TagSizes[i] = size;
+ Icc ->TagPtrs[i] = Ptr;
+
+ return Ptr;
+}
+
+
+
+
+
+// Creates a profile from file read placeholder
+
+LPLCMSICCPROFILE _cmsCreateProfileFromFilePlaceholder(const char* FileName)
+{
+ LPLCMSICCPROFILE NewIcc;
+ LPVOID ICCfile = FileOpen(FileName);
+
+ if (ICCfile == NULL) {
+
+ cmsSignalError(LCMS_ERRC_ABORTED, "File '%s' not found", FileName);
+ return NULL;
+ }
+
+ NewIcc = (LPLCMSICCPROFILE) _cmsCreateProfilePlaceholder();
+ if (NewIcc == NULL) return NULL;
+
+ strncpy(NewIcc -> PhysicalFile, FileName, MAX_PATH-1);
+ NewIcc ->stream = ICCfile;
+
+ NewIcc ->Read = FileRead;
+ NewIcc ->Seek = FileSeek;
+ NewIcc ->Tell = FileTell;
+ NewIcc ->Close = FileClose;
+ NewIcc ->Write = NULL;
+
+ NewIcc ->IsWrite = FALSE;
+
+
+
+
+ return NewIcc;
+}
+
+
+// Creates a profile from memory read placeholder
+
+LPLCMSICCPROFILE _cmsCreateProfileFromMemPlaceholder(LPVOID MemPtr, DWORD dwSize)
+{
+
+ LPLCMSICCPROFILE NewIcc;
+ LPVOID ICCfile = MemoryOpen((LPBYTE) MemPtr, (size_t) dwSize, 'r');
+
+
+ if (ICCfile == NULL) {
+
+ cmsSignalError(LCMS_ERRC_ABORTED, "Couldn't allocate %ld bytes for profile", dwSize);
+ return NULL;
+ }
+
+
+ NewIcc = (LPLCMSICCPROFILE) _cmsCreateProfilePlaceholder();
+ if (NewIcc == NULL) return NULL;
+
+ NewIcc -> PhysicalFile[0] = 0;
+ NewIcc ->stream = ICCfile;
+
+ NewIcc ->Read = MemoryRead;
+ NewIcc ->Seek = MemorySeek;
+ NewIcc ->Tell = MemoryTell;
+ NewIcc ->Close = MemoryClose;
+ NewIcc ->Write = NULL;
+
+ NewIcc ->IsWrite = FALSE;
+
+
+ return NewIcc;
+}
+
+
+// Turn a placeholder into file writter
+
+void _cmsSetSaveToDisk(LPLCMSICCPROFILE Icc, const char* FileName)
+{
+
+ if (FileName == NULL) {
+
+ Icc ->stream = NULL;
+ }
+ else {
+
+ Icc ->stream = fopen(FileName, "wb");
+ if (Icc ->stream == NULL)
+ cmsSignalError(LCMS_ERRC_ABORTED, "Couldn't write to file '%s'", FileName);
+ }
+
+ Icc ->Write = FileWrite; // Save to disk
+ Icc ->Close = FileClose;
+}
+
+
+
+// Turn a placeholder into memory writter
+
+void _cmsSetSaveToMemory(LPLCMSICCPROFILE Icc, LPVOID MemPtr, size_t dwSize)
+{
+
+ if (MemPtr == NULL) {
+
+ Icc ->stream = NULL;
+ }
+ else {
+
+ Icc ->stream = (FILEMEM*) MemoryOpen((LPBYTE) MemPtr, dwSize, 'w');
+ if (Icc ->stream == NULL)
+ cmsSignalError(LCMS_ERRC_ABORTED, "Couldn't write to memory");
+ }
+
+ Icc ->Write = MemoryWrite;
+ Icc ->Close = MemoryClose;
+}
+
+
+// ----------------------------------------------------------------------- Set/Get several struct members
+
+
+
+
+BOOL LCMSEXPORT cmsTakeMediaWhitePoint(LPcmsCIEXYZ Dest, cmsHPROFILE hProfile)
+{
+ LPLCMSICCPROFILE Icc = (LPLCMSICCPROFILE) hProfile;
+ *Dest = Icc -> MediaWhitePoint;
+ return TRUE;
+}
+
+
+BOOL LCMSEXPORT cmsTakeMediaBlackPoint(LPcmsCIEXYZ Dest, cmsHPROFILE hProfile)
+{
+ LPLCMSICCPROFILE Icc = (LPLCMSICCPROFILE) hProfile;
+ *Dest = Icc -> MediaBlackPoint;
+ return TRUE;
+}
+
+BOOL LCMSEXPORT cmsTakeIluminant(LPcmsCIEXYZ Dest, cmsHPROFILE hProfile)
+{
+ LPLCMSICCPROFILE Icc = (LPLCMSICCPROFILE) hProfile;
+ *Dest = Icc -> Illuminant;
+ return TRUE;
+}
+
+int LCMSEXPORT cmsTakeRenderingIntent(cmsHPROFILE hProfile)
+{
+ LPLCMSICCPROFILE Icc = (LPLCMSICCPROFILE) hProfile;
+ return (int) Icc -> RenderingIntent;
+}
+
+void LCMSEXPORT cmsSetRenderingIntent(cmsHPROFILE hProfile, int RenderingIntent)
+{
+ LPLCMSICCPROFILE Icc = (LPLCMSICCPROFILE) hProfile;
+ Icc -> RenderingIntent = (icRenderingIntent) RenderingIntent;
+}
+
+
+DWORD LCMSEXPORT cmsTakeHeaderFlags(cmsHPROFILE hProfile)
+{
+ LPLCMSICCPROFILE Icc = (LPLCMSICCPROFILE) hProfile;
+ return (DWORD) Icc -> flags;
+}
+
+void LCMSEXPORT cmsSetHeaderFlags(cmsHPROFILE hProfile, DWORD Flags)
+{
+ LPLCMSICCPROFILE Icc = (LPLCMSICCPROFILE) hProfile;
+ Icc -> flags = (icUInt32Number) Flags;
+}
+
+DWORD LCMSEXPORT cmsTakeHeaderAttributes(cmsHPROFILE hProfile)
+{
+ LPLCMSICCPROFILE Icc = (LPLCMSICCPROFILE) hProfile;
+ return (DWORD) Icc -> attributes;
+}
+
+void LCMSEXPORT cmsSetHeaderAttributes(cmsHPROFILE hProfile, DWORD Flags)
+{
+ LPLCMSICCPROFILE Icc = (LPLCMSICCPROFILE) hProfile;
+ Icc -> attributes = (icUInt32Number) Flags;
+}
+
+
+const BYTE* LCMSEXPORT cmsTakeProfileID(cmsHPROFILE hProfile)
+{
+ LPLCMSICCPROFILE Icc = (LPLCMSICCPROFILE) hProfile;
+ return Icc ->ProfileID;
+}
+
+void LCMSEXPORT cmsSetProfileID(cmsHPROFILE hProfile, LPBYTE ProfileID)
+{
+ LPLCMSICCPROFILE Icc = (LPLCMSICCPROFILE) hProfile;
+ CopyMemory(Icc -> ProfileID, ProfileID, 16);
+}
+
+
+BOOL LCMSEXPORT cmsTakeCreationDateTime(struct tm *Dest, cmsHPROFILE hProfile)
+{
+ LPLCMSICCPROFILE Icc = (LPLCMSICCPROFILE) (LPSTR) hProfile;
+ CopyMemory(Dest, &Icc ->Created, sizeof(struct tm));
+ return TRUE;
+}
+
+
+icColorSpaceSignature LCMSEXPORT cmsGetPCS(cmsHPROFILE hProfile)
+{
+ LPLCMSICCPROFILE Icc = (LPLCMSICCPROFILE) hProfile;
+ return Icc -> PCS;
+}
+
+
+void LCMSEXPORT cmsSetPCS(cmsHPROFILE hProfile, icColorSpaceSignature pcs)
+{
+ LPLCMSICCPROFILE Icc = (LPLCMSICCPROFILE) hProfile;
+ Icc -> PCS = pcs;
+}
+
+
+
+icColorSpaceSignature LCMSEXPORT cmsGetColorSpace(cmsHPROFILE hProfile)
+{
+ LPLCMSICCPROFILE Icc = (LPLCMSICCPROFILE) hProfile;
+ return Icc -> ColorSpace;
+}
+
+
+
+void LCMSEXPORT cmsSetColorSpace(cmsHPROFILE hProfile, icColorSpaceSignature sig)
+{
+ LPLCMSICCPROFILE Icc = (LPLCMSICCPROFILE) hProfile;
+ Icc -> ColorSpace = sig;
+}
+
+
+icProfileClassSignature LCMSEXPORT cmsGetDeviceClass(cmsHPROFILE hProfile)
+{
+ LPLCMSICCPROFILE Icc = (LPLCMSICCPROFILE) hProfile;
+ return Icc -> DeviceClass;
+}
+
+DWORD LCMSEXPORT cmsGetProfileICCversion(cmsHPROFILE hProfile)
+{
+ LPLCMSICCPROFILE Icc = (LPLCMSICCPROFILE) hProfile;
+ return (DWORD) Icc -> Version;
+}
+
+
+void LCMSEXPORT cmsSetProfileICCversion(cmsHPROFILE hProfile, DWORD Version)
+{
+ LPLCMSICCPROFILE Icc = (LPLCMSICCPROFILE) hProfile;
+ Icc -> Version = Version;
+}
+
+
+void LCMSEXPORT cmsSetDeviceClass(cmsHPROFILE hProfile, icProfileClassSignature sig)
+{
+ LPLCMSICCPROFILE Icc = (LPLCMSICCPROFILE) hProfile;
+ Icc -> DeviceClass = sig;
+}
+
+
+// --------------------------------------------------------------------------------------------------------------
+
+
+static
+int SizeOfGammaTab(LPGAMMATABLE In)
+{
+ return sizeof(GAMMATABLE) + (In -> nEntries - 1)*sizeof(WORD);
+}
+
+
+// Creates a phantom tag holding a memory block
+
+static
+LPVOID DupBlock(LPLCMSICCPROFILE Icc, LPVOID Block, size_t size)
+{
+ if (Block != NULL && size > 0)
+ return _cmsInitTag(Icc, (icTagSignature) 0, size, Block);
+ else
+ return NULL;
+
+}
+
+// This is tricky, since LUT structs does have pointers
+
+BOOL LCMSEXPORT _cmsAddLUTTag(cmsHPROFILE hProfile, icTagSignature sig, LPVOID lut)
+{
+ LPLCMSICCPROFILE Icc = (LPLCMSICCPROFILE) (LPSTR) hProfile;
+ LPLUT Orig, Stored;
+ unsigned int i;
+
+ // The struct itself
+
+ Orig = (LPLUT) lut;
+ Stored = (LPLUT) _cmsInitTag(Icc, (icTagSignature) sig, sizeof(LUT), lut);
+
+ // dup' the memory blocks
+ for (i=0; i < Orig ->InputChan; i++)
+ Stored -> L1[i] = (LPWORD) DupBlock(Icc, (LPWORD) Orig ->L1[i],
+ sizeof(WORD) * Orig ->In16params.nSamples);
+
+ for (i=0; i < Orig ->OutputChan; i++)
+ Stored -> L2[i] = (LPWORD) DupBlock(Icc, (LPWORD) Orig ->L2[i],
+ sizeof(WORD) * Orig ->Out16params.nSamples);
+
+ Stored -> T = (LPWORD) DupBlock(Icc, (LPWORD) Orig ->T, Orig -> Tsize);
+
+ // Zero any additional pointer
+ Stored ->CLut16params.p8 = NULL;
+ return TRUE;
+}
+
+
+BOOL LCMSEXPORT _cmsAddXYZTag(cmsHPROFILE hProfile, icTagSignature sig, const cmsCIEXYZ* XYZ)
+{
+ LPLCMSICCPROFILE Icc = (LPLCMSICCPROFILE) (LPSTR) hProfile;
+
+ _cmsInitTag(Icc, sig, sizeof(cmsCIEXYZ), XYZ);
+ return TRUE;
+}
+
+
+BOOL LCMSEXPORT _cmsAddTextTag(cmsHPROFILE hProfile, icTagSignature sig, const char* Text)
+{
+ LPLCMSICCPROFILE Icc = (LPLCMSICCPROFILE) (LPSTR) hProfile;
+
+ _cmsInitTag(Icc, sig, strlen(Text)+1, (LPVOID) Text);
+ return TRUE;
+}
+
+BOOL LCMSEXPORT _cmsAddGammaTag(cmsHPROFILE hProfile, icTagSignature sig, LPGAMMATABLE TransferFunction)
+{
+ LPLCMSICCPROFILE Icc = (LPLCMSICCPROFILE) (LPSTR) hProfile;
+
+ _cmsInitTag(Icc, sig, SizeOfGammaTab(TransferFunction), TransferFunction);
+ return TRUE;
+}
+
+
+BOOL LCMSEXPORT _cmsAddChromaticityTag(cmsHPROFILE hProfile, icTagSignature sig, LPcmsCIExyYTRIPLE Chrm)
+{
+ LPLCMSICCPROFILE Icc = (LPLCMSICCPROFILE) (LPSTR) hProfile;
+
+ _cmsInitTag(Icc, sig, sizeof(cmsCIExyYTRIPLE), Chrm);
+ return TRUE;
+}
+
+
+BOOL LCMSEXPORT _cmsAddSequenceDescriptionTag(cmsHPROFILE hProfile, icTagSignature sig, LPcmsSEQ pseq)
+{
+ LPLCMSICCPROFILE Icc = (LPLCMSICCPROFILE) (LPSTR) hProfile;
+
+ _cmsInitTag(Icc, sig, sizeof(int) + pseq -> n * sizeof(cmsPSEQDESC), pseq);
+ return TRUE;
+
+}
+
+
+BOOL LCMSEXPORT _cmsAddNamedColorTag(cmsHPROFILE hProfile, icTagSignature sig, LPcmsNAMEDCOLORLIST nc)
+{
+ LPLCMSICCPROFILE Icc = (LPLCMSICCPROFILE) (LPSTR) hProfile;
+
+ _cmsInitTag(Icc, sig, sizeof(cmsNAMEDCOLORLIST) + (nc ->nColors - 1) * sizeof(cmsNAMEDCOLOR), nc);
+ return FALSE;
+}
+
+
+BOOL LCMSEXPORT _cmsAddDateTimeTag(cmsHPROFILE hProfile, icTagSignature sig, struct tm *DateTime)
+{
+ LPLCMSICCPROFILE Icc = (LPLCMSICCPROFILE) (LPSTR) hProfile;
+
+ _cmsInitTag(Icc, sig, sizeof(struct tm), DateTime);
+ return FALSE;
+}
+
+
+BOOL LCMSEXPORT _cmsAddColorantTableTag(cmsHPROFILE hProfile, icTagSignature sig, LPcmsNAMEDCOLORLIST nc)
+{
+ LPLCMSICCPROFILE Icc = (LPLCMSICCPROFILE) (LPSTR) hProfile;
+
+ _cmsInitTag(Icc, sig, sizeof(cmsNAMEDCOLORLIST) + (nc ->nColors - 1) * sizeof(cmsNAMEDCOLOR), nc);
+ return FALSE;
+}
+
diff --git a/icc2ps/cmsio1.c b/icc2ps/cmsio1.c
new file mode 100755
index 0000000..d5f38b8
--- /dev/null
+++ b/icc2ps/cmsio1.c
@@ -0,0 +1,3599 @@
+//
+// Little cms
+// Copyright (C) 1998-2005 Marti Maria
+//
+// Permission is hereby granted, free of charge, to any person obtaining
+// a copy of this software and associated documentation files (the "Software"),
+// to deal in the Software without restriction, including without limitation
+// the rights to use, copy, modify, merge, publish, distribute, sublicense,
+// and/or sell copies of the Software, and to permit persons to whom the Software
+// is furnished to do so, subject to the following conditions:
+//
+// The above copyright notice and this permission notice shall be included in
+// all copies or substantial portions of the Software.
+//
+// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
+// EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO
+// THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
+// NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
+// LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
+// OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
+// WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
+
+// ICC profile serialization
+
+
+#include "lcms.h"
+
+// ----------------------------------------------------------------- Tag Serialization
+
+// Alignment of ICC file format uses 4 bytes DWORD
+
+#define ALIGNLONG(x) (((x)+3) & ~(3)) // Aligns to DWORD boundary
+
+
+static int GlobalLanguageCode; // Language & country descriptors, for ICC 4.0 support
+static int GlobalCountryCode;
+
+
+#ifdef __BEOS__
+# define USE_CUSTOM_SWAB 1
+#endif
+
+
+#ifdef USE_CUSTOM_SWAB
+
+// Replacement to swab function, thanks to YNOP
+// for providing the BeOS port
+//
+// from: @(#)swab.c 5.10 (Berkeley) 3/6/91
+
+static
+void xswab(const void *from, void *to, size_t len)
+{
+ register unsigned long temp;
+ register int n;
+ register char *fp, *tp;
+
+ n = (len >> 1) + 1;
+ fp = (char *)from;
+ tp = (char *)to;
+#define STEP temp = *fp++,*tp++ = *fp++,*tp++ = temp
+ /* round to multiple of 8 */
+ while ((--n) & 07)
+ STEP;
+ n >>= 3;
+ while (--n >= 0) {
+
+ STEP; STEP; STEP; STEP;
+ STEP; STEP; STEP; STEP;
+ }
+#undef STEP
+}
+#else
+#define xswab swab
+#endif
+
+
+//
+// Little-Endian to Big-Endian
+//
+
+#ifdef USE_BIG_ENDIAN
+#define AdjustEndianess16(a)
+#define AdjustEndianess32(a)
+#define AdjustEndianessArray16(a, b)
+#else
+
+static
+void AdjustEndianess16(LPBYTE pByte)
+{
+ BYTE tmp;
+
+ tmp = pByte[0];
+ pByte[0] = pByte[1];
+ pByte[1] = tmp;
+}
+
+static
+void AdjustEndianess32(LPBYTE pByte)
+{
+ BYTE temp1;
+ BYTE temp2;
+
+ temp1 = *pByte++;
+ temp2 = *pByte++;
+ *(pByte-1) = *pByte;
+ *pByte++ = temp2;
+ *(pByte-3) = *pByte;
+ *pByte = temp1;
+}
+
+
+// swap bytes in a array of words
+
+static
+void AdjustEndianessArray16(LPWORD p, size_t num_words)
+{
+ xswab((char*) p, (char*)p, (int) num_words * sizeof(WORD));
+}
+
+#endif
+
+// Transports to properly encoded values - note that icc profiles does use
+// big endian notation.
+
+static
+icInt32Number TransportValue32(icInt32Number Value)
+{
+ icInt32Number Temp = Value;
+
+ AdjustEndianess32((LPBYTE) &Temp);
+ return Temp;
+}
+
+static
+WORD TransportValue16(WORD Value)
+{
+ WORD Temp = Value;
+
+ AdjustEndianess16((LPBYTE) &Temp);
+ return Temp;
+}
+
+
+// from Fixed point 8.8 to double
+
+static
+double Convert8Fixed8(WORD fixed8)
+{
+ BYTE msb, lsb;
+
+ lsb = (BYTE) (fixed8 & 0xff);
+ msb = (BYTE) (((WORD) fixed8 >> 8) & 0xff);
+
+ return (double) ((double) msb + ((double) lsb / 256.0));
+}
+
+
+// from Fixed point 15.16 to double
+static
+double Convert15Fixed16(icS15Fixed16Number fix32)
+{
+ double floater, sign, mid, hack;
+ int Whole, FracPart;
+
+
+ AdjustEndianess32((LPBYTE) &fix32);
+
+ sign = (fix32 < 0 ? -1 : 1);
+ fix32 = abs(fix32);
+
+ Whole = LOWORD(fix32 >> 16);
+ FracPart = LOWORD(fix32 & 0x0000ffffL);
+
+ hack = 65536.0;
+ mid = (double) FracPart / hack;
+ floater = (double) Whole + mid;
+
+ return sign * floater;
+}
+
+
+// Auxiliar-- read base and return type
+
+static
+icTagTypeSignature ReadBase(LPLCMSICCPROFILE Icc)
+{
+ icTagBase Base;
+
+ Icc -> Read(&Base, sizeof(icTagBase), 1, Icc);
+ AdjustEndianess32((LPBYTE) &Base.sig);
+
+ return Base.sig;
+}
+
+
+static
+void DecodeDateTimeNumber(const icDateTimeNumber *Source, struct tm *Dest)
+{
+ Dest->tm_sec = TransportValue16(Source->seconds);
+ Dest->tm_min = TransportValue16(Source->minutes);
+ Dest->tm_hour = TransportValue16(Source->hours);
+ Dest->tm_mday = TransportValue16(Source->day);
+ Dest->tm_mon = TransportValue16(Source->month) - 1;
+ Dest->tm_year = TransportValue16(Source->year) - 1900;
+ Dest->tm_wday = -1;
+ Dest->tm_yday = -1;
+ Dest->tm_isdst = 0;
+}
+
+static
+void EncodeDateTimeNumber(icDateTimeNumber *Dest, const struct tm *Source)
+{
+ Dest->seconds = TransportValue16((WORD) Source->tm_sec);
+ Dest->minutes = TransportValue16((WORD) Source->tm_min);
+ Dest->hours = TransportValue16((WORD) Source->tm_hour);
+ Dest->day = TransportValue16((WORD) Source->tm_mday);
+ Dest->month = TransportValue16((WORD) (Source->tm_mon + 1));
+ Dest->year = TransportValue16((WORD) (Source->tm_year + 1900));
+}
+
+
+// Jun-21-2000: Some profiles (those that comes with W2K) comes
+// with the media white (media black?) x 100. Add a sanity check
+
+static
+void NormalizeXYZ(LPcmsCIEXYZ Dest)
+{
+ while (Dest -> X > 2. &&
+ Dest -> Y > 2. &&
+ Dest -> Z > 2.) {
+
+ Dest -> X /= 10.;
+ Dest -> Y /= 10.;
+ Dest -> Z /= 10.;
+ }
+}
+
+// Evaluates a XYZ tristimulous across chromatic adaptation matrix
+
+static
+void EvalCHRM(LPcmsCIEXYZ Dest, LPMAT3 Chrm, LPcmsCIEXYZ Src)
+{
+ VEC3 d, s;
+
+ s.n[VX] = Src -> X;
+ s.n[VY] = Src -> Y;
+ s.n[VZ] = Src -> Z;
+
+ MAT3eval(&d, Chrm, &s);
+
+ Dest ->X = d.n[VX];
+ Dest ->Y = d.n[VY];
+ Dest ->Z = d.n[VZ];
+
+}
+
+
+// Read profile header and validate it
+
+static
+LPLCMSICCPROFILE ReadHeader(LPLCMSICCPROFILE Icc, BOOL lIsFromMemory)
+{
+ icTag Tag;
+ icHeader Header;
+ icInt32Number TagCount, i;
+
+ Icc -> Read(&Header, sizeof(icHeader), 1, Icc);
+
+ // Convert endian
+
+ AdjustEndianess32((LPBYTE) &Header.size);
+ AdjustEndianess32((LPBYTE) &Header.cmmId);
+ AdjustEndianess32((LPBYTE) &Header.version);
+ AdjustEndianess32((LPBYTE) &Header.deviceClass);
+ AdjustEndianess32((LPBYTE) &Header.colorSpace);
+ AdjustEndianess32((LPBYTE) &Header.pcs);
+ AdjustEndianess32((LPBYTE) &Header.magic);
+ AdjustEndianess32((LPBYTE) &Header.flags);
+ AdjustEndianess32((LPBYTE) &Header.attributes[0]);
+ AdjustEndianess32((LPBYTE) &Header.renderingIntent);
+
+ // Validate it
+
+ if (Header.magic != icMagicNumber) goto ErrorCleanup;
+
+
+ if (Icc ->Read(&TagCount, sizeof(icInt32Number), 1, Icc) != 1)
+ goto ErrorCleanup;
+
+ AdjustEndianess32((LPBYTE) &TagCount);
+
+ Icc -> DeviceClass = Header.deviceClass;
+ Icc -> ColorSpace = Header.colorSpace;
+ Icc -> PCS = Header.pcs;
+ Icc -> RenderingIntent = (icRenderingIntent) Header.renderingIntent;
+ Icc -> flags = Header.flags;
+ Icc -> attributes = Header.attributes[0];
+ Icc -> Illuminant.X = Convert15Fixed16(Header.illuminant.X);
+ Icc -> Illuminant.Y = Convert15Fixed16(Header.illuminant.Y);
+ Icc -> Illuminant.Z = Convert15Fixed16(Header.illuminant.Z);
+ Icc -> Version = Header.version;
+
+ // Get creation date/time
+
+ DecodeDateTimeNumber(&Header.date, &Icc ->Created);
+
+ // Fix illuminant, some profiles are broken in this field!
+
+ Icc ->Illuminant = *cmsD50_XYZ();
+
+ // The profile ID are 16 raw bytes
+
+ CopyMemory(Icc ->ProfileID, Header.reserved, 16);
+
+ // Get rid of possible wrong profiles
+
+ NormalizeXYZ(&Icc -> Illuminant);
+
+ // Read tag directory
+
+ if (TagCount > MAX_TABLE_TAG) {
+
+ cmsSignalError(LCMS_ERRC_ABORTED, "Too many tags (%d)", TagCount);
+ goto ErrorCleanup;
+ }
+
+ Icc -> TagCount = TagCount;
+ for (i=0; i < TagCount; i++) {
+
+ Icc ->Read(&Tag, sizeof(icTag), 1, Icc);
+
+ AdjustEndianess32((LPBYTE) &Tag.offset);
+ AdjustEndianess32((LPBYTE) &Tag.size);
+ AdjustEndianess32((LPBYTE) &Tag.sig); // Signature
+
+ Icc -> TagNames[i] = Tag.sig;
+ Icc -> TagOffsets[i] = Tag.offset;
+ Icc -> TagSizes[i] = Tag.size;
+ }
+
+ return Icc;
+
+
+ErrorCleanup:
+
+ Icc ->Close(Icc);
+ free(Icc);
+
+ if (lIsFromMemory)
+ cmsSignalError(LCMS_ERRC_ABORTED, "Corrupted memory profile");
+ else
+ cmsSignalError(LCMS_ERRC_ABORTED, "Corrupted profile: '%s'", Icc->PhysicalFile);
+
+ return NULL;
+}
+
+
+
+
+static
+unsigned int uipow(unsigned int a, unsigned int b) {
+ unsigned int rv = 1;
+ for (; b > 0; b--)
+ rv *= a;
+ return rv;
+}
+
+
+
+// Convert between notations.
+
+#define TO16_TAB(x) (WORD) (((x) << 8) | (x))
+
+
+// LUT8 can come only in Lab space. There is a fatal flaw in
+// converting from Lut8 to Lut16. Due to particular encoding
+// of Lab, different actions should be taken from input and
+// output Lab8 LUTS. For input, is as easy as applying a << 8,
+// since numbers comes in fixed point. However, for output LUT
+// things goes a bit more complex.... LUT 16 is supposed to
+// have a domain of 0..ff00, so we should remap the LUT in order
+// to get things working. Affected signatures are B2Axx tags,
+// preview and gamut.
+
+// I do solve it by multiplying input matrix by:
+//
+// | 0xffff/0xff00 0 0 |
+// | 0 0xffff/0xff00 0 |
+// | 0 0 0xffff/0xff00 |
+//
+// The input values got then remapped to adequate domain
+
+static
+void FixLUT8(LPLUT Lut, icTagSignature sig, size_t nTabSize)
+{
+ MAT3 Fixup, Original, Result;
+ LPWORD PtrW;
+ size_t i;
+
+ switch (sig) {
+
+
+ case icSigBToA0Tag:
+ case icSigBToA1Tag:
+ case icSigBToA2Tag:
+ case icSigGamutTag:
+ case icSigPreview0Tag:
+ case icSigPreview1Tag:
+ case icSigPreview2Tag:
+
+
+ VEC3init(&Fixup.v[0], (double) 0xFFFF/0xFF00, 0, 0);
+ VEC3init(&Fixup.v[1], 0, (double) 0xFFFF/0xFF00, 0);
+ VEC3init(&Fixup.v[2], 0, 0, (double) 0xFFFF/0xFF00);
+
+
+ MAT3fromFix(&Original, &Lut->Matrix);
+ MAT3per(&Result, &Original, &Fixup);
+ MAT3toFix(&Lut->Matrix, &Result);
+
+ Lut -> wFlags |= LUT_HASMATRIX;
+ break;
+
+ // For input, clear low part since this has to be
+ // Lab in fixed point
+
+ default:
+
+ PtrW = Lut -> T;
+ for (i = 0; i < nTabSize; i++) {
+
+ *PtrW++ &= 0xFF00;
+ }
+ }
+
+}
+
+// On Lab -> Lab abstract or Lab identities, fix both sides of LUT
+
+static
+void FixLUT8bothSides(LPLUT Lut, size_t nTabSize)
+{
+ MAT3 Fixup, Original, Result;
+ LPWORD PtrW;
+ size_t i;
+
+ VEC3init(&Fixup.v[0], (double) 0xFFFF/0xFF00, 0, 0);
+ VEC3init(&Fixup.v[1], 0, (double) 0xFFFF/0xFF00, 0);
+ VEC3init(&Fixup.v[2], 0, 0, (double) 0xFFFF/0xFF00);
+
+ MAT3fromFix(&Original, &Lut->Matrix);
+ MAT3per(&Result, &Original, &Fixup);
+ MAT3toFix(&Lut->Matrix, &Result);
+
+ Lut -> wFlags |= LUT_HASMATRIX;
+
+ PtrW = Lut -> T;
+ for (i = 0; i < nTabSize; i++) {
+
+ *PtrW++ &= 0xFF00;
+ }
+
+}
+
+
+// The infamous LUT 8
+
+static
+void ReadLUT8(LPLCMSICCPROFILE Icc, LPLUT NewLUT, icTagSignature sig)
+{
+ icLut8 LUT8;
+ LPBYTE Temp;
+ size_t nTabSize;
+ unsigned int i, j;
+ unsigned int AllLinear;
+ LPWORD PtrW;
+
+ Icc ->Read(&LUT8, sizeof(icLut8) - SIZEOF_UINT8_ALIGNED, 1, Icc);
+
+ NewLUT -> wFlags = LUT_HASTL1|LUT_HASTL2|LUT_HAS3DGRID;
+ NewLUT -> cLutPoints = LUT8.clutPoints;
+ NewLUT -> InputChan = LUT8.inputChan;
+ NewLUT -> OutputChan = LUT8.outputChan;
+ NewLUT -> InputEntries = 256;
+ NewLUT -> OutputEntries = 256;
+
+
+ AdjustEndianess32((LPBYTE) &LUT8.e00);
+ AdjustEndianess32((LPBYTE) &LUT8.e01);
+ AdjustEndianess32((LPBYTE) &LUT8.e02);
+ AdjustEndianess32((LPBYTE) &LUT8.e10);
+ AdjustEndianess32((LPBYTE) &LUT8.e11);
+ AdjustEndianess32((LPBYTE) &LUT8.e12);
+ AdjustEndianess32((LPBYTE) &LUT8.e20);
+ AdjustEndianess32((LPBYTE) &LUT8.e21);
+ AdjustEndianess32((LPBYTE) &LUT8.e22);
+
+
+ // Matrix handling
+
+ NewLUT -> Matrix.v[0].n[0] = (Fixed32) LUT8.e00;
+ NewLUT -> Matrix.v[0].n[1] = (Fixed32) LUT8.e01;
+ NewLUT -> Matrix.v[0].n[2] = (Fixed32) LUT8.e02;
+ NewLUT -> Matrix.v[1].n[0] = (Fixed32) LUT8.e10;
+ NewLUT -> Matrix.v[1].n[1] = (Fixed32) LUT8.e11;
+ NewLUT -> Matrix.v[1].n[2] = (Fixed32) LUT8.e12;
+ NewLUT -> Matrix.v[2].n[0] = (Fixed32) LUT8.e20;
+ NewLUT -> Matrix.v[2].n[1] = (Fixed32) LUT8.e21;
+ NewLUT -> Matrix.v[2].n[2] = (Fixed32) LUT8.e22;
+
+
+ // Only operates if not identity...
+
+ if (!MAT3isIdentity(&NewLUT -> Matrix, 0.0001)) {
+
+ NewLUT -> wFlags |= LUT_HASMATRIX;
+ }
+
+
+ // Copy input tables
+
+ Temp = (LPBYTE) malloc(256);
+ AllLinear = 0;
+ for (i=0; i < NewLUT -> InputChan; i++) {
+
+ PtrW = (LPWORD) malloc(sizeof(WORD) * 256);
+ NewLUT -> L1[i] = PtrW;
+ Icc ->Read(Temp, 1, 256, Icc);
+ for (j=0; j < 256; j++)
+ PtrW[j] = TO16_TAB(Temp[j]);
+ AllLinear += cmsIsLinear(NewLUT -> L1[i], NewLUT -> InputEntries);
+ }
+
+ // Linear input, so ignore full step
+
+ if (AllLinear == NewLUT -> InputChan) {
+
+ NewLUT -> wFlags &= ~LUT_HASTL1;
+ }
+
+ free(Temp);
+
+ // Copy 3D CLUT
+
+ nTabSize = (NewLUT -> OutputChan * uipow(NewLUT->cLutPoints,
+ NewLUT->InputChan));
+
+ if (nTabSize > 0) {
+
+ PtrW = (LPWORD) malloc(sizeof(WORD) * nTabSize);
+ Temp = (LPBYTE) malloc(nTabSize);
+ Icc ->Read(Temp, 1, nTabSize, Icc);
+
+ NewLUT -> T = PtrW;
+ NewLUT -> Tsize = (unsigned int) (nTabSize * sizeof(WORD));
+
+ for (i = 0; i < nTabSize; i++) {
+
+ *PtrW++ = TO16_TAB(Temp[i]);
+ }
+ free(Temp);
+ }
+ else {
+ NewLUT ->T = NULL;
+ NewLUT ->Tsize = 0;
+ NewLUT -> wFlags &= ~LUT_HAS3DGRID;
+ }
+
+
+
+ // Copy output tables
+
+ Temp = (LPBYTE) malloc(256);
+ AllLinear = 0;
+ for (i=0; i < NewLUT -> OutputChan; i++) {
+
+ PtrW = (LPWORD) malloc(sizeof(WORD) * 256);
+ NewLUT -> L2[i] = PtrW;
+ Icc ->Read(Temp, 1, 256, Icc);
+ for (j=0; j < 256; j++)
+ PtrW[j] = TO16_TAB(Temp[j]);
+ AllLinear += cmsIsLinear(NewLUT -> L2[i], 256);
+ }
+
+ // Linear input, so ignore full step
+
+ if (AllLinear == NewLUT -> OutputChan) {
+
+ NewLUT -> wFlags &= ~LUT_HASTL2;
+ }
+
+
+ free(Temp);
+
+ cmsCalcL16Params(NewLUT -> InputEntries, &NewLUT -> In16params);
+ cmsCalcL16Params(NewLUT -> OutputEntries, &NewLUT -> Out16params);
+ cmsCalcCLUT16Params(NewLUT -> cLutPoints, NewLUT -> InputChan,
+ NewLUT -> OutputChan,
+ &NewLUT -> CLut16params);
+ // Fixup
+
+ if (Icc ->PCS == icSigLabData) {
+
+ // Abstract or Lab identity
+
+ if (Icc -> ColorSpace == icSigLabData)
+
+ FixLUT8bothSides(NewLUT, nTabSize);
+ else
+ FixLUT8(NewLUT, sig, nTabSize);
+
+
+ // Now some additional fixup. Lab encoding on 8 bit makes
+ // impossible to place gray axis on a exact node. However,
+ // some profiles does claim to do that. Poor lcms will try
+ // to detect such condition and fix up "on the fly".
+
+ {
+ LPWORD WhiteLab, ExpectedWhite;
+ WORD WhiteFixed[MAXCHANNELS], WhiteUnfixed[MAXCHANNELS];
+ int j, nChannels;
+ double Dist, DistFixed, DistUnfixed;
+
+ _cmsEndPointsBySpace(icSigLabData, &WhiteLab, NULL, NULL);
+
+ if (_cmsEndPointsBySpace(Icc -> ColorSpace,
+ &ExpectedWhite, NULL, &nChannels)) {
+
+ // 1.- Find white obtained by both combinations
+
+ NewLUT -> FixGrayAxes = FALSE;
+ cmsEvalLUT(NewLUT, WhiteLab, WhiteUnfixed);
+
+ NewLUT -> FixGrayAxes = TRUE;
+ cmsEvalLUT(NewLUT, WhiteLab, WhiteFixed);
+
+ // 2.- Which method gives closer white?
+
+ DistFixed = DistUnfixed = 0;
+ for (j=0; j < nChannels; j++) {
+
+ Dist = ExpectedWhite[j] - WhiteFixed[j];
+ DistFixed += Dist*Dist;
+ Dist = ExpectedWhite[j] - WhiteUnfixed[j];
+ DistUnfixed += Dist*Dist;
+ }
+
+ // 3.- Decide method
+
+ if (sqrt(DistFixed) < sqrt(DistUnfixed))
+ NewLUT -> FixGrayAxes = TRUE;
+ else
+ NewLUT -> FixGrayAxes = FALSE;
+ }
+
+ }
+
+ }
+
+}
+
+
+
+
+// Case LUT 16
+
+static
+void ReadLUT16(LPLCMSICCPROFILE Icc, LPLUT NewLUT)
+{
+ icLut16 LUT16;
+ size_t nTabSize;
+ unsigned int i;
+ unsigned int AllLinear;
+ LPWORD PtrW;
+
+
+ Icc ->Read(&LUT16, sizeof(icLut16)- SIZEOF_UINT16_ALIGNED, 1, Icc);
+
+ NewLUT -> wFlags = LUT_HASTL1 | LUT_HASTL2 | LUT_HAS3DGRID;
+ NewLUT -> cLutPoints = LUT16.clutPoints;
+ NewLUT -> InputChan = LUT16.inputChan;
+ NewLUT -> OutputChan = LUT16.outputChan;
+
+ AdjustEndianess16((LPBYTE) &LUT16.inputEnt);
+ AdjustEndianess16((LPBYTE) &LUT16.outputEnt);
+
+ NewLUT -> InputEntries = LUT16.inputEnt;
+ NewLUT -> OutputEntries = LUT16.outputEnt;
+
+
+ // Matrix handling
+
+ AdjustEndianess32((LPBYTE) &LUT16.e00);
+ AdjustEndianess32((LPBYTE) &LUT16.e01);
+ AdjustEndianess32((LPBYTE) &LUT16.e02);
+ AdjustEndianess32((LPBYTE) &LUT16.e10);
+ AdjustEndianess32((LPBYTE) &LUT16.e11);
+ AdjustEndianess32((LPBYTE) &LUT16.e12);
+ AdjustEndianess32((LPBYTE) &LUT16.e20);
+ AdjustEndianess32((LPBYTE) &LUT16.e21);
+ AdjustEndianess32((LPBYTE) &LUT16.e22);
+
+ NewLUT -> Matrix.v[0].n[0] = (Fixed32) LUT16.e00;
+ NewLUT -> Matrix.v[0].n[1] = (Fixed32) LUT16.e01;
+ NewLUT -> Matrix.v[0].n[2] = (Fixed32) LUT16.e02;
+ NewLUT -> Matrix.v[1].n[0] = (Fixed32) LUT16.e10;
+ NewLUT -> Matrix.v[1].n[1] = (Fixed32) LUT16.e11;
+ NewLUT -> Matrix.v[1].n[2] = (Fixed32) LUT16.e12;
+ NewLUT -> Matrix.v[2].n[0] = (Fixed32) LUT16.e20;
+ NewLUT -> Matrix.v[2].n[1] = (Fixed32) LUT16.e21;
+ NewLUT -> Matrix.v[2].n[2] = (Fixed32) LUT16.e22;
+
+ // Only operates if not identity...
+
+ if (!MAT3isIdentity(&NewLUT -> Matrix, 0.0001)) {
+
+ NewLUT -> wFlags |= LUT_HASMATRIX;
+ }
+
+
+ // Copy input tables
+
+ AllLinear = 0;
+ for (i=0; i < NewLUT -> InputChan; i++) {
+
+ PtrW = (LPWORD) malloc(sizeof(WORD) * NewLUT -> InputEntries);
+ NewLUT -> L1[i] = PtrW;
+ Icc ->Read(PtrW, sizeof(WORD), NewLUT -> InputEntries, Icc);
+ AdjustEndianessArray16(PtrW, NewLUT -> InputEntries);
+ AllLinear += cmsIsLinear(NewLUT -> L1[i], NewLUT -> InputEntries);
+ }
+
+ // Linear input, so ignore full step
+
+ if (AllLinear == NewLUT -> InputChan) {
+
+ NewLUT -> wFlags &= ~LUT_HASTL1;
+ }
+
+
+ // Copy 3D CLUT
+
+ nTabSize = (NewLUT -> OutputChan * uipow(NewLUT->cLutPoints,
+ NewLUT->InputChan));
+ if (nTabSize > 0) {
+
+ PtrW = (LPWORD) malloc(sizeof(WORD) * nTabSize);
+
+ NewLUT -> T = PtrW;
+ NewLUT -> Tsize = (unsigned int) (nTabSize * sizeof(WORD));
+
+ Icc -> Read(PtrW, sizeof(WORD), nTabSize, Icc);
+ AdjustEndianessArray16(NewLUT -> T, nTabSize);
+ }
+ else {
+ NewLUT ->T = NULL;
+ NewLUT ->Tsize = 0;
+ NewLUT -> wFlags &= ~LUT_HAS3DGRID;
+ }
+
+ // Copy output tables
+
+ AllLinear = 0;
+ for (i=0; i < NewLUT -> OutputChan; i++) {
+
+ PtrW = (LPWORD) malloc(sizeof(WORD) * NewLUT -> OutputEntries);
+ NewLUT -> L2[i] = PtrW;
+ Icc ->Read(PtrW, sizeof(WORD), NewLUT -> OutputEntries, Icc);
+ AdjustEndianessArray16(PtrW, NewLUT -> OutputEntries);
+ AllLinear += cmsIsLinear(NewLUT -> L2[i], NewLUT -> OutputEntries);
+ }
+
+ // Linear output, ignore step
+
+ if (AllLinear == NewLUT -> OutputChan)
+ {
+ NewLUT -> wFlags &= ~LUT_HASTL2;
+ }
+
+
+ cmsCalcL16Params(NewLUT -> InputEntries, &NewLUT -> In16params);
+ cmsCalcL16Params(NewLUT -> OutputEntries, &NewLUT -> Out16params);
+ cmsCalcCLUT16Params(NewLUT -> cLutPoints, NewLUT -> InputChan,
+ NewLUT -> OutputChan,
+ &NewLUT -> CLut16params);
+}
+
+
+// This is a shared routine for reading curves. It can handle v2 curves
+// as linear, single gamma and table-based as well as v4 parametric curves.
+
+static
+LPGAMMATABLE ReadCurve(LPLCMSICCPROFILE Icc)
+{
+ icUInt32Number Count;
+ LPGAMMATABLE NewGamma;
+ icTagTypeSignature BaseType;
+ int n;
+
+
+ BaseType = ReadBase(Icc);
+
+ switch (BaseType) {
+
+
+ case 0x9478ee00L: // Monaco 2 profiler is BROKEN!
+ case icSigCurveType:
+
+ Icc ->Read(&Count, sizeof(icUInt32Number), 1, Icc);
+ AdjustEndianess32((LPBYTE) &Count);
+
+
+ switch (Count) {
+
+ case 0: // Linear.
+
+ NewGamma = cmsAllocGamma(2);
+ if (!NewGamma) return NULL;
+ NewGamma -> GammaTable[0] = 0;
+ NewGamma -> GammaTable[1] = 0xFFFF;
+ return NewGamma;
+
+ case 1: // Specified as the exponent of gamma function
+ {
+ WORD SingleGammaFixed;
+
+ Icc ->Read(&SingleGammaFixed, sizeof(WORD), 1, Icc);
+ AdjustEndianess16((LPBYTE) &SingleGammaFixed);
+ return cmsBuildGamma(4096, Convert8Fixed8(SingleGammaFixed));
+ }
+
+ default: { // Curve
+
+ NewGamma = cmsAllocGamma(Count);
+ if (!NewGamma) return NULL;
+
+ Icc ->Read(NewGamma -> GammaTable, sizeof(WORD), Count, Icc);
+
+ AdjustEndianessArray16(NewGamma -> GammaTable, Count);
+
+ return NewGamma;
+ }
+ }
+ break;
+
+
+ // Parametric curves
+ case icSigParametricCurveType: {
+
+ int ParamsByType[] = { 1, 3, 4, 5, 7 };
+ double Params[10];
+ icS15Fixed16Number Num;
+ icUInt32Number Reserved;
+ icUInt16Number Type;
+ int i;
+
+ Icc -> Read(&Type, sizeof(icUInt16Number), 1, Icc);
+ Icc -> Read(&Reserved, sizeof(icUInt16Number), 1, Icc);
+
+ AdjustEndianess16((LPBYTE) &Type);
+ if (Type > 5) {
+
+ cmsSignalError(LCMS_ERRC_ABORTED, "Unknown parametric curve type '%d' found.", Type);
+ return NULL;
+ }
+
+ ZeroMemory(Params, 10* sizeof(double));
+ n = ParamsByType[Type];
+
+ for (i=0; i < n; i++) {
+ Num = 0;
+ Icc -> Read(&Num, sizeof(icS15Fixed16Number), 1, Icc);
+ Params[i] = Convert15Fixed16(Num);
+ }
+
+
+ NewGamma = cmsBuildParametricGamma(4096, Type+1, Params);
+ return NewGamma;
+ }
+
+
+ default:
+ cmsSignalError(LCMS_ERRC_ABORTED, "Bad tag signature '%lx' found.", BaseType);
+ return NULL;
+ }
+
+}
+
+
+// Similar to anterior, but curve is reversed
+
+static
+LPGAMMATABLE ReadCurveReversed(LPLCMSICCPROFILE Icc)
+{
+
+ icTagTypeSignature BaseType;
+ LPGAMMATABLE NewGamma, ReturnGamma;
+ icUInt32Number Count;
+ int n;
+
+
+ BaseType = ReadBase(Icc);
+
+ switch (BaseType) {
+
+
+ case 0x9478ee00L: // Monaco 2 profiler is BROKEN!
+ case icSigCurveType:
+
+ Icc -> Read(&Count, sizeof(icUInt32Number), 1, Icc);
+ AdjustEndianess32((LPBYTE) &Count);
+
+
+ switch (Count) {
+
+ case 0: // Linear, reverse is same.
+
+ NewGamma = cmsAllocGamma(2);
+ if (!NewGamma) return NULL;
+ NewGamma -> GammaTable[0] = 0;
+ NewGamma -> GammaTable[1] = 0xFFFF;
+ return NewGamma;
+
+ case 1: {
+ WORD SingleGammaFixed;
+
+ Icc -> Read(&SingleGammaFixed, sizeof(WORD), 1, Icc);
+ AdjustEndianess16((LPBYTE) &SingleGammaFixed);
+ return cmsBuildGamma(4096, 1./Convert8Fixed8(SingleGammaFixed));
+ }
+
+ default: { // Curve. Do our best to trying to reverse the curve
+
+ NewGamma = cmsAllocGamma(Count);
+ if (!NewGamma) return NULL;
+
+ Icc -> Read(NewGamma -> GammaTable, sizeof(WORD), Count, Icc);
+
+ AdjustEndianessArray16(NewGamma -> GammaTable, Count);
+
+ if (Count < 256)
+ Count = 256; // Reverse of simple curve has not necesarely to be simple
+
+ ReturnGamma = cmsReverseGamma(Count, NewGamma);
+ cmsFreeGamma(NewGamma);
+
+ return ReturnGamma;
+ }
+ }
+ break;
+
+
+ // Parametric curves
+ case icSigParametricCurveType: {
+
+ int ParamsByType[] = { 1, 3, 4, 5, 7 };
+ double Params[10];
+ icS15Fixed16Number Num;
+ icUInt32Number Reserved;
+ icUInt16Number Type;
+ int i;
+
+
+ Icc -> Read(&Type, sizeof(icUInt16Number), 1, Icc);
+ Icc -> Read(&Reserved, sizeof(icUInt16Number), 1, Icc);
+
+ AdjustEndianess16((LPBYTE) &Type);
+ if (Type > 5) {
+
+ cmsSignalError(LCMS_ERRC_ABORTED, "Unknown parametric curve type '%d' found.", Type);
+ return NULL;
+ }
+
+ ZeroMemory(Params, 10* sizeof(double));
+ n = ParamsByType[Type];
+
+ for (i=0; i < n; i++) {
+ Icc -> Read(&Num, sizeof(icS15Fixed16Number), 1, Icc);
+ Params[i] = Convert15Fixed16(Num);
+ }
+
+
+ // Negative type as a mark of reversed curve
+ NewGamma = cmsBuildParametricGamma(4096, -(Type+1), Params);
+ return NewGamma;
+ }
+
+
+ default:
+ cmsSignalError(LCMS_ERRC_ABORTED, "Bad tag signature '%lx' found.", BaseType);
+ return NULL;
+ }
+
+}
+
+
+// V4 stuff. Read matrix for LutAtoB and LutBtoA
+
+static
+BOOL ReadMatrixOffset(LPLCMSICCPROFILE Icc, size_t Offset, LPLUT NewLUT, DWORD dwFlags)
+{
+
+ icS15Fixed16Number All[12];
+ int i;
+ MAT3 m;
+ VEC3 o;
+
+ if (Icc -> Seek(Icc, Offset)) return FALSE;
+
+ Icc ->Read(All, sizeof(icS15Fixed16Number), 12, Icc);
+
+ for (i=0; i < 12; i++)
+ AdjustEndianess32((LPBYTE) &All[i]);
+
+
+ m.v[0].n[0] = FIXED_TO_DOUBLE((Fixed32) All[0]);
+ m.v[0].n[1] = FIXED_TO_DOUBLE((Fixed32) All[1]);
+ m.v[0].n[2] = FIXED_TO_DOUBLE((Fixed32) All[2]);
+ m.v[1].n[0] = FIXED_TO_DOUBLE((Fixed32) All[3]);
+ m.v[1].n[1] = FIXED_TO_DOUBLE((Fixed32) All[4]);
+ m.v[1].n[2] = FIXED_TO_DOUBLE((Fixed32) All[5]);
+ m.v[2].n[0] = FIXED_TO_DOUBLE((Fixed32) All[6]);
+ m.v[2].n[1] = FIXED_TO_DOUBLE((Fixed32) All[7]);
+ m.v[2].n[2] = FIXED_TO_DOUBLE((Fixed32) All[8]);
+
+ o.n[0] = FIXED_TO_DOUBLE((Fixed32) All[9]);
+ o.n[1] = FIXED_TO_DOUBLE((Fixed32) All[10]);
+ o.n[2] = FIXED_TO_DOUBLE((Fixed32) All[11]);
+
+ cmsSetMatrixLUT4(NewLUT, &m, &o, dwFlags);
+
+ return TRUE;
+}
+
+
+// V4 stuff. Read CLUT part for LutAtoB and LutBtoA
+
+static
+BOOL ReadCLUT(LPLCMSICCPROFILE Icc, size_t Offset, LPLUT NewLUT)
+{
+
+ icCLutStruct CLUT;
+
+ if (Icc -> Seek(Icc, Offset)) return FALSE;
+ Icc ->Read(&CLUT, sizeof(icCLutStruct), 1, Icc);
+
+
+ cmsAlloc3DGrid(NewLUT, CLUT.gridPoints[0], NewLUT ->InputChan,
+ NewLUT ->OutputChan);
+
+ // Precission can be 1 or 2 bytes
+
+ if (CLUT.prec == 1) {
+
+ BYTE v;
+ unsigned int i;
+
+ for (i=0; i < NewLUT->Tsize / sizeof(WORD); i++) {
+ Icc ->Read(&v, sizeof(BYTE), 1, Icc);
+ NewLUT->T[i] = TO16_TAB(v);
+ }
+
+ }
+ else
+ if (CLUT.prec == 2) {
+
+ Icc ->Read(NewLUT ->T, sizeof(WORD),
+ NewLUT->Tsize / sizeof(WORD), Icc);
+
+ AdjustEndianessArray16(NewLUT ->T, NewLUT->Tsize / sizeof(WORD));
+ }
+ else {
+ cmsSignalError(LCMS_ERRC_ABORTED, "Unknow precission of '%d'", CLUT.prec);
+ return FALSE;
+ }
+
+ return TRUE;
+}
+
+
+static
+void SkipAlignment(LPLCMSICCPROFILE Icc)
+{
+ BYTE Buffer[4];
+ size_t At = Icc ->Tell(Icc);
+ int BytesToNextAlignedPos = (int) (At % 4);
+
+ Icc ->Read(Buffer, 1, BytesToNextAlignedPos, Icc);
+}
+
+// Read a set of curves from specific offset
+static
+BOOL ReadSetOfCurves(LPLCMSICCPROFILE Icc, size_t Offset, LPLUT NewLUT, int nLocation)
+{
+ LPGAMMATABLE Curves[MAXCHANNELS];
+ unsigned int i, nCurves;
+
+ if (Icc -> Seek(Icc, Offset)) return FALSE;
+
+ if (nLocation == 1 || nLocation == 3)
+
+ nCurves = NewLUT ->InputChan;
+ else
+ nCurves = NewLUT ->OutputChan;
+
+ for (i=0; i < nCurves; i++) {
+
+ Curves[i] = ReadCurve(Icc);
+ SkipAlignment(Icc);
+
+ }
+
+ NewLUT = cmsAllocLinearTable(NewLUT, Curves, nLocation);
+
+ for (i=0; i < nCurves; i++)
+ cmsFreeGamma(Curves[i]);
+
+ return TRUE;
+
+}
+
+// V4 stuff. LutAtoB type
+//
+// [L1] -> [CLUT] -> [L4] -> [Mat4] -> [Ofs4] -> [L2]
+//
+// Mat, Mat3, Ofs3, L3 are missing
+// L1 = A curves
+// L4 = M curves
+// L2 = B curves
+
+static
+BOOL ReadLUT_A2B(LPLCMSICCPROFILE Icc, LPLUT NewLUT, size_t BaseOffset, icTagSignature sig)
+{
+ icLutAtoB LUT16;
+
+ Icc ->Read(&LUT16, sizeof(icLutAtoB), 1, Icc);
+
+ NewLUT -> InputChan = LUT16.inputChan;
+ NewLUT -> OutputChan = LUT16.outputChan;
+
+ AdjustEndianess32((LPBYTE) &LUT16.offsetB);
+ AdjustEndianess32((LPBYTE) &LUT16.offsetMat);
+ AdjustEndianess32((LPBYTE) &LUT16.offsetM);
+ AdjustEndianess32((LPBYTE) &LUT16.offsetC);
+ AdjustEndianess32((LPBYTE) &LUT16.offsetA);
+
+
+ if (LUT16.offsetB != 0)
+ ReadSetOfCurves(Icc, BaseOffset + LUT16.offsetB, NewLUT, 2);
+
+ if (LUT16.offsetMat != 0)
+ ReadMatrixOffset(Icc, BaseOffset + LUT16.offsetMat, NewLUT, LUT_HASMATRIX4);
+
+
+ if (LUT16.offsetM != 0)
+ ReadSetOfCurves(Icc, BaseOffset + LUT16.offsetM, NewLUT, 4);
+
+ if (LUT16.offsetC != 0)
+ ReadCLUT(Icc, BaseOffset + LUT16.offsetC, NewLUT);
+
+ if (LUT16.offsetA!= 0)
+ ReadSetOfCurves(Icc, BaseOffset + LUT16.offsetA, NewLUT, 1);
+
+ // Convert to v2 PCS
+
+ if (Icc ->PCS == icSigLabData) {
+
+ switch (sig) {
+
+ case icSigAToB0Tag:
+ case icSigAToB1Tag:
+ case icSigAToB2Tag:
+ case icSigGamutTag:
+ case icSigPreview0Tag:
+ case icSigPreview1Tag:
+ case icSigPreview2Tag:
+
+ NewLUT ->wFlags |= LUT_V4_INPUT_EMULATE_V2;
+ break;
+
+ default:;
+ }
+ }
+
+
+ return TRUE;
+}
+
+// V4 stuff. LutBtoA type
+
+static
+BOOL ReadLUT_B2A(LPLCMSICCPROFILE Icc, LPLUT NewLUT, size_t BaseOffset, icTagSignature sig)
+{
+ icLutBtoA LUT16;
+
+ Icc ->Read(&LUT16, sizeof(icLutBtoA), 1, Icc);
+
+ NewLUT -> InputChan = LUT16.inputChan;
+ NewLUT -> OutputChan = LUT16.outputChan;
+
+ AdjustEndianess32((LPBYTE) &LUT16.offsetB);
+ AdjustEndianess32((LPBYTE) &LUT16.offsetMat);
+ AdjustEndianess32((LPBYTE) &LUT16.offsetM);
+ AdjustEndianess32((LPBYTE) &LUT16.offsetC);
+ AdjustEndianess32((LPBYTE) &LUT16.offsetA);
+
+
+ if (LUT16.offsetB != 0)
+ ReadSetOfCurves(Icc, BaseOffset + LUT16.offsetB, NewLUT, 1);
+
+ if (LUT16.offsetMat != 0)
+ ReadMatrixOffset(Icc, BaseOffset + LUT16.offsetMat, NewLUT, LUT_HASMATRIX3);
+
+
+ if (LUT16.offsetM != 0)
+ ReadSetOfCurves(Icc, BaseOffset + LUT16.offsetM, NewLUT, 3);
+
+ if (LUT16.offsetC != 0)
+ ReadCLUT(Icc, BaseOffset + LUT16.offsetC, NewLUT);
+
+ if (LUT16.offsetA!= 0)
+ ReadSetOfCurves(Icc, BaseOffset + LUT16.offsetA, NewLUT, 2);
+
+
+ // Convert to v2 PCS
+
+ if (Icc ->PCS == icSigLabData) {
+
+ switch (sig) {
+
+ case icSigBToA0Tag:
+ case icSigBToA1Tag:
+ case icSigBToA2Tag:
+ case icSigGamutTag:
+ case icSigPreview0Tag:
+ case icSigPreview1Tag:
+ case icSigPreview2Tag:
+
+ NewLUT ->wFlags |= LUT_V4_OUTPUT_EMULATE_V2;
+ break;
+
+ default:;
+ }
+ }
+
+ return TRUE;
+}
+
+// CLUT main reader
+
+LPLUT LCMSEXPORT cmsReadICCLut(cmsHPROFILE hProfile, icTagSignature sig)
+{
+
+ LPLCMSICCPROFILE Icc = (LPLCMSICCPROFILE) (LPSTR) hProfile;
+ icTagTypeSignature BaseType;
+ int n;
+ size_t offset;
+ LPLUT NewLUT;
+
+ n = _cmsSearchTag(Icc, sig, TRUE);
+ if (n < 0)
+ return NULL;
+
+
+ // If is in memory, the LUT is already there, so throw a copy
+ if (!Icc -> stream) {
+
+ return cmsDupLUT((LPLUT) Icc ->TagPtrs[n]);
+ }
+
+ offset = Icc -> TagOffsets[n];
+
+ if (Icc -> Seek(Icc, offset))
+ return NULL;
+
+ BaseType = ReadBase(Icc);
+
+
+ NewLUT = cmsAllocLUT();
+ if (!NewLUT)
+ {
+ cmsSignalError(LCMS_ERRC_ABORTED, "cmsAllocLUT() failed");
+ return NULL;
+ }
+
+
+ switch (BaseType) {
+
+ case icSigLut8Type: ReadLUT8(Icc, NewLUT, sig); break;
+ case icSigLut16Type: ReadLUT16(Icc, NewLUT); break;
+
+ case icSiglutAtoBType: ReadLUT_A2B(Icc, NewLUT, offset, sig); break;
+ case icSiglutBtoAType: ReadLUT_B2A(Icc, NewLUT, offset, sig); break;
+
+ default: cmsSignalError(LCMS_ERRC_ABORTED, "Bad tag signature %lx found.", BaseType);
+ cmsFreeLUT(NewLUT);
+ return NULL;
+ }
+
+
+ return NewLUT;
+}
+
+
+// Sets the language & country preferences. Used only in ICC 4.0 profiles
+
+void LCMSEXPORT cmsSetLanguage(int LanguageCode, int CountryCode)
+{
+ GlobalLanguageCode = LanguageCode;
+ GlobalCountryCode = CountryCode;
+}
+
+
+
+// Some tags (e.g, 'pseq') can have text tags embedded. This function
+// handles such special case.
+
+static
+int ReadEmbeddedTextTag(LPLCMSICCPROFILE Icc, size_t size, char* Name)
+{
+ icTagTypeSignature BaseType;
+
+
+ BaseType = ReadBase(Icc);
+
+ size -= sizeof(icTagBase);
+
+ switch (BaseType) {
+
+ case icSigTextDescriptionType: {
+
+ icUInt32Number AsciiCount;
+ icUInt32Number i, UnicodeCode, UnicodeCount;
+ icUInt16Number ScriptCodeCode, Dummy;
+ icUInt8Number ScriptCodeCount;
+
+ Icc ->Read(&AsciiCount, sizeof(icUInt32Number), 1, Icc);
+ size -= sizeof(icUInt32Number);
+
+ AdjustEndianess32((LPBYTE) &AsciiCount);
+ Icc ->Read(Name, 1, AsciiCount, Icc);
+ size -= AsciiCount;
+
+ // Skip Unicode code
+
+ Icc ->Read(&UnicodeCode, sizeof(icUInt32Number), 1, Icc);
+ size -= sizeof(icUInt32Number);
+
+ Icc ->Read(&UnicodeCount, sizeof(icUInt32Number), 1, Icc);
+ size -= sizeof(icUInt32Number);
+
+ AdjustEndianess32((LPBYTE) &UnicodeCount);
+
+ if (UnicodeCount > size) return (int) size;
+
+ for (i=0; i < UnicodeCount; i++)
+ Icc ->Read(&Dummy, sizeof(icUInt16Number), 1, Icc);
+
+ size -= UnicodeCount * sizeof(icUInt16Number);
+
+ // Skip ScriptCode code
+
+ Icc ->Read(&ScriptCodeCode, sizeof(icUInt16Number), 1, Icc);
+ size -= sizeof(icUInt16Number);
+ Icc ->Read(&ScriptCodeCount, sizeof(icUInt8Number), 1, Icc);
+ size -= sizeof(icUInt8Number);
+
+ if (size < 67) return (int) size;
+
+ for (i=0; i < 67; i++)
+ Icc ->Read(&Dummy, sizeof(icUInt8Number), 1, Icc);
+
+ size -= 67;
+ }
+ break;
+
+
+ case icSigCopyrightTag: // Broken profiles from agfa does store copyright info in such type
+ case icSigTextType:
+
+ Icc -> Read(Name, 1, size, Icc);
+ break;
+
+ // MultiLocalizedUnicodeType, V4 only
+
+ case icSigMultiLocalizedUnicodeType: {
+
+ icUInt32Number Count, RecLen;
+ icUInt16Number Language, Country;
+ icUInt32Number ThisLen, ThisOffset;
+ size_t Offset = 0;
+ size_t Len = 0;
+ size_t i;
+ wchar_t* wchar = L"";
+
+
+ Icc ->Read(&Count, sizeof(icUInt32Number), 1, Icc);
+ AdjustEndianess32((LPBYTE) &Count);
+ Icc ->Read(&RecLen, sizeof(icUInt32Number), 1, Icc);
+ AdjustEndianess32((LPBYTE) &RecLen);
+
+ if (RecLen != 12) {
+
+ cmsSignalError(LCMS_ERRC_ABORTED, "multiLocalizedUnicodeType of len != 12 is not supported.");
+ return -1;
+ }
+
+ for (i=0; i < Count; i++) {
+
+ Icc ->Read(&Language, sizeof(icUInt16Number), 1, Icc);
+ AdjustEndianess16((LPBYTE) &Language);
+ Icc ->Read(&Country, sizeof(icUInt16Number), 1, Icc);
+ AdjustEndianess16((LPBYTE) &Country);
+
+ Icc ->Read(&ThisLen, sizeof(icUInt32Number), 1, Icc);
+ AdjustEndianess32((LPBYTE) &ThisLen);
+
+ Icc ->Read(&ThisOffset, sizeof(icUInt32Number), 1, Icc);
+ AdjustEndianess32((LPBYTE) &ThisOffset);
+
+ if (Language == GlobalLanguageCode || Offset == 0) {
+
+ Len = ThisLen; Offset = ThisOffset;
+ if (Country == GlobalCountryCode)
+ break; // Found
+ }
+
+ }
+
+
+ if (Offset == 0) {
+
+ strcpy(Name, "(no info)");
+ break;
+ }
+
+ // Compute true offset
+ Offset -= 12 * Count + 8 + sizeof(icTagBase);
+
+ // Skip unused bytes
+ for (i=0; i < Offset; i++) {
+
+ char Discard;
+
+ Icc ->Read(&Discard, 1, 1, Icc);
+ }
+
+ wchar = (wchar_t*) malloc(Len+2);
+ if (!wchar) return -1;
+
+ Icc ->Read(wchar, 1, Len, Icc);
+ AdjustEndianessArray16((LPWORD) wchar, Len / 2);
+
+ wchar[Len / 2] = L'\0';
+ i = wcstombs(Name, wchar, 2047 );
+ if (i == ((size_t) -1)) {
+
+ Name[0] = 0; // Error
+ }
+
+ free((void*) wchar);
+ }
+ break;
+
+ default:
+ cmsSignalError(LCMS_ERRC_ABORTED, "Bad tag signature %lx found.", BaseType);
+ return -1;
+ }
+
+ return (int) size;
+}
+
+
+// Take an ASCII item
+
+
+int LCMSEXPORT cmsReadICCText(cmsHPROFILE hProfile, icTagSignature sig, char *Name)
+{
+ LPLCMSICCPROFILE Icc = (LPLCMSICCPROFILE) (LPSTR) hProfile;
+ size_t offset, size;
+ int n;
+
+ n = _cmsSearchTag(Icc, sig, TRUE);
+ if (n < 0)
+ return -1;
+
+ if (!Icc -> stream) {
+
+ CopyMemory(Name, Icc -> TagPtrs[n], Icc -> TagSizes[n]);
+ return (int) Icc -> TagSizes[n];
+ }
+
+ offset = Icc -> TagOffsets[n];
+ size = Icc -> TagSizes[n];
+
+ if (Icc -> Seek(Icc, offset))
+ return -1;
+
+ return ReadEmbeddedTextTag(Icc, size, Name);
+
+}
+
+
+
+// Take an XYZ item
+
+static
+int ReadICCXYZ(cmsHPROFILE hProfile, icTagSignature sig, LPcmsCIEXYZ Value, BOOL lIsFatal)
+{
+ LPLCMSICCPROFILE Icc = (LPLCMSICCPROFILE) (LPSTR) hProfile;
+ icTagTypeSignature BaseType;
+ size_t offset;
+ int n;
+ icXYZNumber XYZ;
+
+ n = _cmsSearchTag(Icc, sig, FALSE);
+ if (n < 0)
+ return -1;
+
+ if (!Icc -> stream) {
+
+ CopyMemory(Value, Icc -> TagPtrs[n], Icc -> TagSizes[n]);
+ return (int) Icc -> TagSizes[n];
+ }
+
+ offset = Icc -> TagOffsets[n];
+
+ if (Icc -> Seek(Icc, offset))
+ return -1;
+
+
+ BaseType = ReadBase(Icc);
+
+ switch (BaseType) {
+
+
+ case 0x7c3b10cL: // Some apple broken embedded profiles does not have correct type
+ case icSigXYZType:
+
+ Icc ->Read(&XYZ, sizeof(icXYZNumber), 1, Icc);
+ Value -> X = Convert15Fixed16(XYZ.X);
+ Value -> Y = Convert15Fixed16(XYZ.Y);
+ Value -> Z = Convert15Fixed16(XYZ.Z);
+ break;
+
+ // Aug/21-2001 - Monaco 2 does have WRONG values.
+
+ default:
+ if (lIsFatal)
+ cmsSignalError(LCMS_ERRC_ABORTED, "Bad tag signature %lx found.", BaseType);
+ return -1;
+ }
+
+ return 1;
+}
+
+
+// Read a icSigS15Fixed16ArrayType (currently only a 3x3 matrix)
+
+static
+int ReadICCXYZArray(cmsHPROFILE hProfile, icTagSignature sig, LPMAT3 v)
+{
+ LPLCMSICCPROFILE Icc = (LPLCMSICCPROFILE) (LPSTR) hProfile;
+ icTagTypeSignature BaseType;
+ size_t offset, sz;
+ int i, n;
+ icXYZNumber XYZ[3];
+ cmsCIEXYZ XYZdbl[3];
+
+
+ n = _cmsSearchTag(Icc, sig, FALSE);
+ if (n < 0)
+ return -1; // Not found
+
+ if (!Icc -> stream) {
+
+ CopyMemory(v, Icc -> TagPtrs[n], Icc -> TagSizes[n]);
+ return (int) Icc -> TagSizes[n];
+ }
+
+ offset = Icc -> TagOffsets[n];
+
+ if (Icc -> Seek(Icc, offset))
+ return -1;
+
+ BaseType = ReadBase(Icc);
+
+ switch (BaseType) {
+
+ case icSigS15Fixed16ArrayType:
+
+ sz = Icc ->TagSizes[n] / sizeof(icXYZNumber);
+
+ if (sz != 3) {
+ cmsSignalError(LCMS_ERRC_ABORTED, "Bad array size of %d entries.", sz);
+ return -1;
+ }
+
+ Icc ->Read(XYZ, sizeof(icXYZNumber), 3, Icc);
+
+ for (i=0; i < 3; i++) {
+
+ XYZdbl[i].X = Convert15Fixed16(XYZ[i].X);
+ XYZdbl[i].Y = Convert15Fixed16(XYZ[i].Y);
+ XYZdbl[i].Z = Convert15Fixed16(XYZ[i].Z);
+ }
+
+ CopyMemory(v, XYZdbl, 3*sizeof(cmsCIEXYZ));
+ break;
+
+ default:
+ cmsSignalError(LCMS_ERRC_ABORTED, "Bad tag signature %lx found.", BaseType);
+ return -1;
+
+ }
+
+ return sizeof(MAT3);
+}
+
+
+
+// Primaries are to be in xyY notation
+
+BOOL LCMSEXPORT cmsTakeColorants(LPcmsCIEXYZTRIPLE Dest, cmsHPROFILE hProfile)
+{
+ if (ReadICCXYZ(hProfile, icSigRedColorantTag, &Dest -> Red, TRUE) < 0) return FALSE;
+ if (ReadICCXYZ(hProfile, icSigGreenColorantTag, &Dest -> Green, TRUE) < 0) return FALSE;
+ if (ReadICCXYZ(hProfile, icSigBlueColorantTag, &Dest -> Blue, TRUE) < 0) return FALSE;
+
+ return TRUE;
+}
+
+
+BOOL cmsReadICCMatrixRGB2XYZ(LPMAT3 r, cmsHPROFILE hProfile)
+{
+ cmsCIEXYZTRIPLE Primaries;
+
+ if (!cmsTakeColorants(&Primaries, hProfile)) return FALSE;
+
+ VEC3init(&r -> v[0], Primaries.Red.X, Primaries.Green.X, Primaries.Blue.X);
+ VEC3init(&r -> v[1], Primaries.Red.Y, Primaries.Green.Y, Primaries.Blue.Y);
+ VEC3init(&r -> v[2], Primaries.Red.Z, Primaries.Green.Z, Primaries.Blue.Z);
+
+ return TRUE;
+
+}
+
+
+// Always return a suitable matrix
+
+BOOL cmsReadChromaticAdaptationMatrix(LPMAT3 r, cmsHPROFILE hProfile)
+{
+
+ if (ReadICCXYZArray(hProfile, icSigChromaticAdaptationTag, r) < 0) {
+
+ LPLCMSICCPROFILE Icc = (LPLCMSICCPROFILE) (LPSTR) hProfile;
+
+ // For display profiles, revert to bradford. Else take identity.
+
+ MAT3identity(r);
+
+ // Emissive devices have non-identity chad
+
+ if ((cmsGetDeviceClass(hProfile) == icSigDisplayClass) ||
+ cmsTakeHeaderFlags(hProfile) & icTransparency) {
+
+ // NULL for cone defaults to Bradford, from media to D50
+ cmsAdaptationMatrix(r, NULL, &Icc ->MediaWhitePoint, &Icc ->Illuminant);
+ }
+ }
+
+ return TRUE;
+}
+
+
+
+LPGAMMATABLE LCMSEXPORT cmsReadICCGamma(cmsHPROFILE hProfile, icTagSignature sig)
+{
+ LPLCMSICCPROFILE Icc = (LPLCMSICCPROFILE) (LPSTR) hProfile;
+ size_t offset;
+ int n;
+
+
+ n = _cmsSearchTag(Icc, sig, TRUE);
+ if (n < 0)
+ return NULL;
+
+ if (!Icc -> stream) {
+
+ return cmsDupGamma((LPGAMMATABLE) Icc -> TagPtrs[n]);
+ }
+
+ offset = Icc -> TagOffsets[n];
+
+ if (Icc -> Seek(Icc, offset))
+ return NULL;
+
+ return ReadCurve(Icc);
+
+}
+
+
+// Some ways have analytical revese. This function accounts for that
+
+LPGAMMATABLE LCMSEXPORT cmsReadICCGammaReversed(cmsHPROFILE hProfile, icTagSignature sig)
+{
+ LPLCMSICCPROFILE Icc = (LPLCMSICCPROFILE) (LPSTR) hProfile;
+ size_t offset;
+ int n;
+
+
+ n = _cmsSearchTag(Icc, sig, TRUE);
+ if (n < 0)
+ return NULL;
+
+ if (!Icc -> stream) {
+
+ return cmsReverseGamma(256, (LPGAMMATABLE) Icc -> TagPtrs[n]);
+ }
+
+ offset = Icc -> TagOffsets[n];
+
+ if (Icc -> Seek(Icc, offset))
+ return NULL;
+
+ return ReadCurveReversed(Icc);
+}
+
+// Check Named color header
+
+static
+BOOL CheckHeader(LPcmsNAMEDCOLORLIST v, icNamedColor2* nc2)
+{
+ if (v ->Prefix[0] == 0 && v ->Suffix[0] == 0 && v ->ColorantCount == 0) return TRUE;
+
+ if (stricmp(v ->Prefix, (const char*) nc2 ->prefix) != 0) return FALSE;
+ if (stricmp(v ->Suffix, (const char*) nc2 ->suffix) != 0) return FALSE;
+
+ return ((int) v ->ColorantCount == (int) nc2 ->nDeviceCoords);
+}
+
+// Read named color list
+
+int cmsReadICCnamedColorList(cmsHTRANSFORM xform, cmsHPROFILE hProfile, icTagSignature sig)
+{
+ _LPcmsTRANSFORM v = (_LPcmsTRANSFORM) xform;
+ LPLCMSICCPROFILE Icc = (LPLCMSICCPROFILE) (LPSTR) hProfile;
+ int n;
+ icTagTypeSignature BaseType;
+ size_t offset;
+
+ n = _cmsSearchTag(Icc, sig, TRUE);
+ if (n < 0)
+ return 0;
+
+ if (!Icc -> stream) {
+
+ // This replaces actual named color list.
+ size_t size = Icc -> TagSizes[n];
+
+ if (v ->NamedColorList) cmsFreeNamedColorList(v ->NamedColorList);
+ v -> NamedColorList = (LPcmsNAMEDCOLORLIST) malloc(size);
+ CopyMemory(v -> NamedColorList, Icc ->TagPtrs[n], size);
+ return v ->NamedColorList->nColors;
+ }
+
+ offset = Icc -> TagOffsets[n];
+
+ if (Icc -> Seek(Icc, offset))
+ return 0;
+
+ BaseType = ReadBase(Icc);
+
+ switch (BaseType) {
+
+ // I never have seen one of these. Probably is not worth of implementing.
+
+ case icSigNamedColorType: {
+
+ cmsSignalError(LCMS_ERRC_WARNING, "Ancient named color profiles are not supported.");
+ return 0;
+ }
+
+ // The named color struct
+
+ case icSigNamedColor2Type: {
+
+ icNamedColor2 nc2;
+ unsigned int i, j;
+
+ Icc -> Read(&nc2, sizeof(icNamedColor2) - SIZEOF_UINT8_ALIGNED, 1, Icc);
+ AdjustEndianess32((LPBYTE) &nc2.vendorFlag);
+ AdjustEndianess32((LPBYTE) &nc2.count);
+ AdjustEndianess32((LPBYTE) &nc2.nDeviceCoords);
+
+ if (!CheckHeader(v->NamedColorList, &nc2)) {
+ cmsSignalError(LCMS_ERRC_WARNING, "prefix/suffix/device for named color profiles mismatch.");
+ }
+
+ strncpy(v ->NamedColorList->Prefix, (const char*) nc2.prefix, 32);
+ strncpy(v ->NamedColorList->Suffix, (const char*) nc2.suffix, 32);
+ v ->NamedColorList->Prefix[32] = v->NamedColorList->Suffix[32] = 0;
+
+ v ->NamedColorList ->ColorantCount = nc2.nDeviceCoords;
+
+ for (i=0; i < nc2.count; i++) {
+
+ WORD PCS[3];
+ WORD Colorant[MAXCHANNELS];
+ char Root[33];
+
+ ZeroMemory(Colorant, sizeof(WORD) * MAXCHANNELS);
+ Icc -> Read(Root, 1, 32, Icc);
+ Icc -> Read(PCS, 3, sizeof(WORD), Icc);
+
+ for (j=0; j < 3; j++)
+ AdjustEndianess16((LPBYTE) &PCS[j]);
+
+ Icc -> Read(Colorant, sizeof(WORD), nc2.nDeviceCoords, Icc);
+
+ for (j=0; j < nc2.nDeviceCoords; j++)
+ AdjustEndianess16((LPBYTE) &Colorant[j]);
+
+ cmsAppendNamedColor(v, Root, PCS, Colorant);
+ }
+
+ return v ->NamedColorList->nColors;
+ }
+ break;
+
+ default:
+ cmsSignalError(LCMS_ERRC_WARNING, "Bad tag signature '%lx' found.", BaseType);
+ return 0;
+ }
+
+ // It would never reach here
+ // return 0;
+}
+
+
+
+// Read colorant tables
+
+LPcmsNAMEDCOLORLIST LCMSEXPORT cmsReadColorantTable(cmsHPROFILE hProfile, icTagSignature sig)
+{
+ icInt32Number n, Count, i;
+ size_t offset;
+ icTagTypeSignature BaseType;
+ LPLCMSICCPROFILE Icc = (LPLCMSICCPROFILE) (LPSTR) hProfile;
+ LPcmsNAMEDCOLORLIST List;
+
+ n = _cmsSearchTag(Icc, sig, FALSE);
+ if (n < 0)
+ return NULL; // Not found
+
+ if (!Icc -> stream) {
+
+ size_t size = Icc -> TagSizes[n];
+ void* v = malloc(size);
+ CopyMemory(v, Icc -> TagPtrs[n], size);
+ return (LPcmsNAMEDCOLORLIST) v;
+ }
+
+
+ offset = Icc -> TagOffsets[n];
+
+ if (Icc -> Seek(Icc, offset))
+ return NULL;
+
+ BaseType = ReadBase(Icc);
+
+ if (BaseType != icSigColorantTableType) {
+ cmsSignalError(LCMS_ERRC_ABORTED, "Bad tag signature '%lx' found.", BaseType);
+ return NULL;
+ }
+
+
+ Icc ->Read(&Count, sizeof(icUInt32Number), 1, Icc);
+ AdjustEndianess32((LPBYTE) &Count);
+
+ List = cmsAllocNamedColorList(Count);
+ for (i=0; i < Count; i++) {
+
+
+ if (!Icc ->Read(List->List[i].Name, 1, 32 , Icc)) goto Error;
+ if (!Icc ->Read(List->List[i].PCS, sizeof(icUInt16Number), 3, Icc)) goto Error;
+ AdjustEndianessArray16(List->List[i].PCS, 3);
+ }
+
+ return List;
+
+Error:
+ cmsFreeNamedColorList(List);
+ return NULL;
+
+}
+
+
+
+// Uncooked manufacturer
+
+const char* LCMSEXPORT cmsTakeManufacturer(cmsHPROFILE hProfile)
+{
+
+ static char Manufacturer[512] = "";
+
+ Manufacturer[0] = 0;
+
+ if (cmsIsTag(hProfile, icSigDeviceMfgDescTag)) {
+
+ cmsReadICCText(hProfile, icSigDeviceMfgDescTag, Manufacturer);
+ }
+
+ return Manufacturer;
+}
+
+// Uncooked model
+
+const char* LCMSEXPORT cmsTakeModel(cmsHPROFILE hProfile)
+{
+
+ static char Model[512] = "";
+
+ Model[0] = 0;
+
+ if (cmsIsTag(hProfile, icSigDeviceModelDescTag)) {
+
+ cmsReadICCText(hProfile, icSigDeviceModelDescTag, Model);
+ }
+
+ return Model;
+}
+
+
+const char* LCMSEXPORT cmsTakeCopyright(cmsHPROFILE hProfile)
+{
+
+ static char Copyright[512] = "";
+
+ Copyright[0] = 0;
+
+ if (cmsIsTag(hProfile, icSigCopyrightTag)) {
+
+ cmsReadICCText(hProfile, icSigCopyrightTag, Copyright);
+ }
+
+ return Copyright;
+}
+
+
+// We compute name with model - manufacturer
+
+const char* LCMSEXPORT cmsTakeProductName(cmsHPROFILE hProfile)
+{
+ static char Name[2048];
+ char Manufacturer[512], Model[512];
+
+ Name[0] = '\0';
+ Manufacturer[0] = Model[0] = '\0';
+
+ if (cmsIsTag(hProfile, icSigDeviceMfgDescTag)) {
+
+ cmsReadICCText(hProfile, icSigDeviceMfgDescTag, Manufacturer);
+ }
+
+ if (cmsIsTag(hProfile, icSigDeviceModelDescTag)) {
+
+ cmsReadICCText(hProfile, icSigDeviceModelDescTag, Model);
+ }
+
+ if (!Manufacturer[0] && !Model[0]) {
+
+ if (cmsIsTag(hProfile, icSigProfileDescriptionTag)) {
+
+ cmsReadICCText(hProfile, icSigProfileDescriptionTag, Name);
+ return Name;
+ }
+ else return "{no name}";
+ }
+
+
+ if (!Manufacturer[0] ||
+ strncmp(Model, Manufacturer, 8) == 0 || strlen(Model) > 30)
+ strcpy(Name, Model);
+ else
+ sprintf(Name, "%s - %s", Model, Manufacturer);
+
+ return Name;
+
+}
+
+
+// We compute desc with manufacturer - model
+
+const char* LCMSEXPORT cmsTakeProductDesc(cmsHPROFILE hProfile)
+{
+ static char Name[2048];
+
+ if (cmsIsTag(hProfile, icSigProfileDescriptionTag)) {
+
+ cmsReadICCText(hProfile, icSigProfileDescriptionTag, Name);
+ }
+ else return cmsTakeProductName(hProfile);
+
+ if (strncmp(Name, "Copyrig", 7) == 0)
+ return cmsTakeProductName(hProfile);
+
+ return Name;
+}
+
+
+const char* LCMSEXPORT cmsTakeProductInfo(cmsHPROFILE hProfile)
+{
+ LPLCMSICCPROFILE Icc = (LPLCMSICCPROFILE) (LPSTR) hProfile;
+
+ static char Info[4096];
+
+ Info[0] = '\0';
+
+ if (cmsIsTag(hProfile, icSigProfileDescriptionTag))
+ {
+ char Desc[1024];
+
+ cmsReadICCText(hProfile, icSigProfileDescriptionTag, Desc);
+ strcat(Info, Desc);
+ strcat(Info, "\r\n\r\n");
+ }
+
+
+ if (cmsIsTag(hProfile, icSigCopyrightTag))
+ {
+ char Copyright[2048];
+
+ cmsReadICCText(hProfile, icSigCopyrightTag, Copyright);
+ strcat(Info, Copyright);
+ strcat(Info, "\r\n\r\n");
+ }
+
+
+
+// KODAK private tag... But very useful
+
+#define K007 (icTagSignature)0x4B303037
+
+ // MonCal
+
+ if (cmsIsTag(hProfile, K007))
+ {
+ char MonCal[1024];
+
+ cmsReadICCText(hProfile, K007, MonCal);
+ strcat(Info, MonCal);
+ strcat(Info, "\r\n\r\n");
+ }
+ else
+ {
+ cmsCIEXYZ WhitePt;
+ char WhiteStr[1024];
+
+ cmsTakeMediaWhitePoint(&WhitePt, hProfile);
+ _cmsIdentifyWhitePoint(WhiteStr, &WhitePt);
+ strcat(WhiteStr, "\r\n\r\n");
+ strcat(Info, WhiteStr);
+ }
+
+
+ if (Icc -> stream) {
+ strcat(Info, Icc -> PhysicalFile);
+ }
+ return Info;
+}
+
+// Extract the target data as a big string. Does not signal if tag is not present.
+
+BOOL LCMSEXPORT cmsTakeCharTargetData(cmsHPROFILE hProfile, char** Data, size_t* len)
+{
+ LPLCMSICCPROFILE Icc = (LPLCMSICCPROFILE) (LPSTR) hProfile;
+ int n;
+
+ *Data = NULL;
+ *len = 0;
+
+ n = _cmsSearchTag(Icc, icSigCharTargetTag, FALSE);
+ if (n < 0) return FALSE;
+
+
+ *len = Icc -> TagSizes[n];
+ *Data = (char*) malloc(*len + 1);
+
+ if (!*Data) {
+
+ cmsSignalError(LCMS_ERRC_ABORTED, "Out of memory allocating CharTarget space!");
+ return FALSE;
+ }
+
+ if (cmsReadICCText(hProfile, icSigCharTargetTag, *Data) < 0)
+ return FALSE;
+
+ (*Data)[*len] = 0; // Force a zero marker. Shouldn't be needed, but is
+ // here to simplify things.
+
+ return TRUE;
+}
+
+
+
+
+BOOL LCMSEXPORT cmsTakeCalibrationDateTime(struct tm *Dest, cmsHPROFILE hProfile)
+{
+ LPLCMSICCPROFILE Icc = (LPLCMSICCPROFILE) (LPSTR) hProfile;
+ int n;
+
+ n = _cmsSearchTag(Icc, icSigCalibrationDateTimeTag, FALSE);
+ if (n < 0) return FALSE;
+
+ if (!Icc ->stream)
+ {
+ CopyMemory(Dest, Icc ->TagPtrs[n], sizeof(struct tm));
+ }
+ else
+ {
+ icDateTimeNumber timestamp;
+
+ if (Icc -> Seek(Icc, Icc -> TagOffsets[n] + sizeof(icTagBase)))
+ return FALSE;
+
+ if (Icc ->Read(&timestamp, 1, sizeof(icDateTimeNumber), Icc) != sizeof(icDateTimeNumber))
+ return FALSE;
+
+ DecodeDateTimeNumber(&timestamp, Dest);
+ }
+
+
+ return TRUE;
+}
+
+
+
+// PSEQ Tag, used in devicelink profiles
+
+LPcmsSEQ LCMSEXPORT cmsReadProfileSequenceDescription(cmsHPROFILE hProfile)
+{
+ LPLCMSICCPROFILE Icc = (LPLCMSICCPROFILE) (LPSTR) hProfile;
+ int n;
+ icUInt32Number i, Count;
+ icDescStruct DescStruct;
+ icTagTypeSignature BaseType;
+ size_t size, offset;
+ LPcmsSEQ OutSeq;
+
+
+ n = _cmsSearchTag(Icc, icSigProfileSequenceDescTag, FALSE);
+ if (n < 0) return NULL;
+
+ size = Icc -> TagSizes[n];
+ if (size < 12) return NULL;
+
+ if (!Icc -> stream) {
+
+ OutSeq = (LPcmsSEQ) malloc(size);
+ CopyMemory(OutSeq, Icc ->TagPtrs[n], size);
+ return OutSeq;
+ }
+
+ offset = Icc -> TagOffsets[n];
+
+ if (Icc -> Seek(Icc, offset))
+ return NULL;
+
+ BaseType = ReadBase(Icc);
+
+ if (BaseType != icSigProfileSequenceDescType) return NULL;
+
+ Icc ->Read(&Count, sizeof(icUInt32Number), 1, Icc);
+ AdjustEndianess32((LPBYTE) &Count);
+
+ size = sizeof(int) + Count * sizeof(cmsPSEQDESC);
+ OutSeq = (LPcmsSEQ) malloc(size);
+
+ OutSeq ->n = Count;
+
+ // Get structures as well
+
+ for (i=0; i < Count; i++) {
+
+ LPcmsPSEQDESC sec = &OutSeq -> seq[i];
+
+ Icc -> Read(&DescStruct, sizeof(icDescStruct) - SIZEOF_UINT8_ALIGNED, 1, Icc);
+
+ AdjustEndianess32((LPBYTE) &DescStruct.deviceMfg);
+ AdjustEndianess32((LPBYTE) &DescStruct.deviceModel);
+ AdjustEndianess32((LPBYTE) &DescStruct.technology);
+ AdjustEndianess32((LPBYTE) &DescStruct.attributes[0]);
+ AdjustEndianess32((LPBYTE) &DescStruct.attributes[1]);
+
+ sec ->attributes[0] = DescStruct.attributes[0];
+ sec ->attributes[1] = DescStruct.attributes[1];
+ sec ->deviceMfg = DescStruct.deviceMfg;
+ sec ->deviceModel = DescStruct.deviceModel;
+ sec ->technology = DescStruct.technology;
+
+ if (ReadEmbeddedTextTag(Icc, size, sec ->Manufacturer) < 0) return NULL;
+ if (ReadEmbeddedTextTag(Icc, size, sec ->Model) < 0) return NULL;
+
+ }
+
+ return OutSeq;
+}
+
+
+
+// Extended gamut -- an HP extension
+
+
+LPcmsGAMUTEX LCMSEXPORT cmsReadExtendedGamut(cmsHPROFILE hProfile, int index)
+{
+ LPLCMSICCPROFILE Icc = (LPLCMSICCPROFILE) (LPSTR) hProfile;
+ size_t size, offset;
+ icUInt32Number off_samp, off_desc, off_vc;
+ int n;
+ icTagTypeSignature BaseType;
+ icColorSpaceSignature CoordSig;
+ icUInt16Number Method, Usage;
+ icUInt32Number GamutCount, SamplesCount;
+ LPcmsGAMUTEX gex;
+ size_t Offsets[256];
+ size_t i, Actual, Loc;
+ icS15Fixed16Number Num;
+ icUInt16Number Surround;
+
+
+ n = _cmsSearchTag(Icc, icSigHPGamutDescTag, FALSE);
+ if (n < 0) return NULL;
+
+ if (!Icc ->stream) return NULL; // In memory is not supported
+
+ // Read the header
+
+ offset = Icc -> TagOffsets[n];
+
+ if (Icc -> Seek(Icc, offset))
+ return NULL;
+
+ // Here is the beginning of tag
+ Actual = Icc ->Tell(Icc);
+
+
+ BaseType = ReadBase(Icc);
+
+ if (BaseType != icSigHPGamutDescType) {
+ cmsSignalError(LCMS_ERRC_ABORTED, "Bad tag signature '%lx' found.", BaseType);
+ return NULL;
+ }
+
+
+ // Read the gamut descriptors count
+ Icc ->Read(&GamutCount, sizeof(icUInt32Number), 1, Icc);
+ AdjustEndianess32((LPBYTE) &GamutCount);
+
+
+ if (GamutCount >= 256) {
+ cmsSignalError(LCMS_ERRC_ABORTED, "Too many gamut structures '%d'.", GamutCount);
+ return NULL;
+ }
+
+ // Read the directory
+
+ for (i=0; i < GamutCount; i++) {
+
+ Icc ->Read(&Offsets[i], sizeof(icUInt32Number), 1, Icc);
+ AdjustEndianess32((LPBYTE) &Offsets[i]);
+ }
+
+
+ // Is there such element?
+ if (index >= (int) GamutCount) return NULL;
+ Loc = Actual + Offsets[index];
+
+
+ // Go to specified index
+ if (Icc -> Seek(Icc, Loc))
+ return NULL;
+
+
+ // Read all members
+ Icc ->Read(&CoordSig, sizeof(icColorSpaceSignature), 1, Icc);
+ AdjustEndianess32((LPBYTE) &CoordSig);
+
+ Icc ->Read(&Method, sizeof(icUInt16Number), 1, Icc);
+ AdjustEndianess16((LPBYTE) &Method);
+
+ Icc ->Read(&Usage, sizeof(icUInt16Number), 1, Icc);
+ AdjustEndianess16((LPBYTE) &Usage);
+
+ Icc ->Read(&SamplesCount, sizeof(icUInt32Number), 1, Icc);
+ AdjustEndianess32((LPBYTE) &SamplesCount);
+
+ Icc ->Read(&off_samp, sizeof(icUInt32Number), 1, Icc);
+ AdjustEndianess32((LPBYTE) &off_samp);
+
+ Icc ->Read(&off_desc, sizeof(icUInt32Number), 1, Icc);
+ AdjustEndianess32((LPBYTE) &off_desc);
+
+ Icc ->Read(&off_vc, sizeof(icUInt32Number), 1, Icc);
+ AdjustEndianess32((LPBYTE) &off_vc);
+
+
+ size = sizeof(cmsGAMUTEX) + (SamplesCount - 1) * sizeof(double);
+
+ gex = (LPcmsGAMUTEX) malloc(size);
+ if (gex == NULL) return NULL;
+
+
+ gex ->CoordSig = CoordSig;
+ gex ->Method = Method;
+ gex ->Usage = Usage;
+ gex ->Count = SamplesCount;
+
+
+ // Read data
+ if (Icc -> Seek(Icc, Loc + off_samp))
+ return NULL;
+
+ for (i=0; i < SamplesCount; i++) {
+ Icc -> Read(&Num, sizeof(icS15Fixed16Number), 1, Icc);
+ gex ->Data[i] = Convert15Fixed16(Num);
+ }
+
+
+ // Read mluc
+ if (Icc -> Seek(Icc, Loc + off_desc)) {
+
+ free(gex);
+ return NULL;
+ }
+
+ ReadEmbeddedTextTag(Icc, 256, gex ->Description);
+
+
+ // Read viewing conditions
+ if (Icc -> Seek(Icc, Loc + off_vc)) {
+ free(gex);
+ return NULL;
+ }
+
+
+ Icc -> Read(&Num, sizeof(icS15Fixed16Number), 1, Icc);
+ gex ->Vc.whitePoint.X = Convert15Fixed16(Num);
+
+ Icc -> Read(&Num, sizeof(icS15Fixed16Number), 1, Icc);
+ gex ->Vc.whitePoint.Y = Convert15Fixed16(Num);
+
+ Icc -> Read(&Num, sizeof(icS15Fixed16Number), 1, Icc);
+ gex ->Vc.whitePoint.Z = Convert15Fixed16(Num);
+
+ Icc -> Read(&Num, sizeof(icS15Fixed16Number), 1, Icc);
+ gex ->Vc.La = Convert15Fixed16(Num);
+
+ Icc -> Read(&Num, sizeof(icS15Fixed16Number), 1, Icc);
+ gex ->Vc.Yb = Convert15Fixed16(Num);
+
+ Icc -> Read(&Num, sizeof(icS15Fixed16Number), 1, Icc);
+ gex ->Vc.D_value = Convert15Fixed16(Num);
+
+ Icc -> Read(&Surround, sizeof(icUInt16Number), 1, Icc);
+ AdjustEndianess16((LPBYTE) &Surround);
+ gex ->Vc.surround = Surround;
+
+
+ // All OK
+ return gex;
+
+}
+
+
+
+void LCMSEXPORT cmsFreeExtendedGamut(LPcmsGAMUTEX gex)
+{
+ if (gex)
+ free(gex);
+}
+
+
+// Read a few tags that are hardly required
+
+
+static
+void ReadCriticalTags(LPLCMSICCPROFILE Icc)
+{
+ cmsHPROFILE hProfile = (cmsHPROFILE) Icc;
+
+ if (Icc ->Version >= 0x4000000) {
+
+ // v4 profiles
+
+ MAT3 ChrmCanonical;
+
+ if (ReadICCXYZ(hProfile,
+ icSigMediaWhitePointTag,
+ &Icc ->MediaWhitePoint, FALSE) < 0) {
+
+ Icc ->MediaWhitePoint = *cmsD50_XYZ();
+ }
+
+ // Read media black
+
+ if (ReadICCXYZ(hProfile,
+ icSigMediaBlackPointTag,
+ &Icc ->MediaBlackPoint, FALSE) < 0) {
+
+ Icc ->MediaBlackPoint.X = 0;
+ Icc ->MediaBlackPoint.Y = 0;
+ Icc ->MediaBlackPoint.X = 0;
+
+ }
+
+ NormalizeXYZ(&Icc ->MediaWhitePoint);
+ NormalizeXYZ(&Icc ->MediaBlackPoint);
+
+ if (ReadICCXYZArray(hProfile,
+ icSigChromaticAdaptationTag,
+ &ChrmCanonical) > 0) {
+
+ MAT3inverse(&ChrmCanonical, &Icc ->ChromaticAdaptation);
+
+ }
+ else {
+
+ MAT3identity(&Icc ->ChromaticAdaptation);
+ }
+
+
+ // Convert media white, black to absolute under original illuminant
+
+ EvalCHRM(&Icc ->MediaWhitePoint, &Icc ->ChromaticAdaptation, &Icc ->MediaWhitePoint);
+ EvalCHRM(&Icc ->MediaBlackPoint, &Icc ->ChromaticAdaptation, &Icc ->MediaBlackPoint);
+
+
+ }
+ else {
+
+ // v2 profiles
+
+ // Read media white
+
+ if (ReadICCXYZ(hProfile,
+ icSigMediaWhitePointTag,
+ &Icc ->MediaWhitePoint, FALSE) < 0) {
+
+ Icc ->MediaWhitePoint = *cmsD50_XYZ();
+ }
+
+ // Read media black
+
+ if (ReadICCXYZ(hProfile,
+ icSigMediaBlackPointTag,
+ &Icc ->MediaBlackPoint, FALSE) < 0) {
+
+ Icc ->MediaBlackPoint.X = 0;
+ Icc ->MediaBlackPoint.Y = 0;
+ Icc ->MediaBlackPoint.X = 0;
+
+ }
+
+ NormalizeXYZ(&Icc ->MediaWhitePoint);
+ NormalizeXYZ(&Icc ->MediaBlackPoint);
+
+
+ // Take Bradford as default for Display profiles only.
+
+ if (cmsGetDeviceClass(hProfile) == icSigDisplayClass) {
+
+
+ cmsAdaptationMatrix(&Icc -> ChromaticAdaptation,
+ NULL,
+ &Icc -> Illuminant,
+ &Icc -> MediaWhitePoint);
+ }
+ else
+ MAT3identity(&Icc ->ChromaticAdaptation);
+
+ }
+
+}
+
+
+// Create profile from disk file
+
+cmsHPROFILE LCMSEXPORT cmsOpenProfileFromFile(const char *lpFileName, const char *sAccess)
+{
+ LPLCMSICCPROFILE NewIcc;
+ cmsHPROFILE hEmpty;
+
+
+ // Open for write means an empty profile
+
+ if (*sAccess == 'W' || *sAccess == 'w') {
+
+ hEmpty = _cmsCreateProfilePlaceholder();
+ NewIcc = (LPLCMSICCPROFILE) (LPSTR) hEmpty;
+ NewIcc -> IsWrite = TRUE;
+ strncpy(NewIcc ->PhysicalFile, lpFileName, MAX_PATH-1);
+
+ // Save LUT as 8 bit
+
+ sAccess++;
+ if (*sAccess == '8') NewIcc ->SaveAs8Bits = TRUE;
+
+ return hEmpty;
+ }
+
+
+ // Open for read means a file placeholder
+
+ NewIcc = _cmsCreateProfileFromFilePlaceholder(lpFileName);
+ if (!NewIcc) return NULL;
+
+ if (!ReadHeader(NewIcc, FALSE)) return NULL;
+
+ ReadCriticalTags(NewIcc);
+
+ return (cmsHPROFILE) (LPSTR) NewIcc;
+}
+
+
+
+
+// Open from memory block
+
+cmsHPROFILE LCMSEXPORT cmsOpenProfileFromMem(LPVOID MemPtr, DWORD dwSize)
+{
+ LPLCMSICCPROFILE NewIcc;
+
+
+ NewIcc = _cmsCreateProfileFromMemPlaceholder(MemPtr, dwSize);
+ if (!NewIcc) return NULL;
+
+ if (!ReadHeader(NewIcc, TRUE)) return NULL;
+
+ ReadCriticalTags(NewIcc);
+
+ return (cmsHPROFILE) (LPSTR) NewIcc;
+
+}
+
+
+
+BOOL LCMSEXPORT cmsCloseProfile(cmsHPROFILE hProfile)
+{
+ LPLCMSICCPROFILE Icc = (LPLCMSICCPROFILE) (LPSTR) hProfile;
+ BOOL rc = TRUE;
+
+ if (!Icc) return FALSE;
+
+
+ // Was open in write mode?
+ if (Icc ->IsWrite) {
+
+ Icc ->IsWrite = FALSE; // Assure no further writting
+ rc = _cmsSaveProfile(hProfile, Icc ->PhysicalFile);
+ }
+
+
+ if (Icc -> stream == NULL) { // Was a memory (i.e. not serialized) profile?
+
+
+ icInt32Number i; // Yes, free tags
+
+ for (i=0; i < Icc -> TagCount; i++) {
+
+ if (Icc -> TagPtrs[i])
+ free(Icc -> TagPtrs[i]);
+ }
+
+ }
+ else Icc -> Close(Icc); // No, close the stream
+
+
+ free(Icc); // Free placeholder memory
+
+ return rc;
+}
+
+
+
+// Write profile ------------------------------------------------------------
+
+
+
+static
+BOOL SaveWordsTable(int nEntries, LPWORD Tab, LPLCMSICCPROFILE Icc)
+{
+ size_t nTabSize = sizeof(WORD) * nEntries;
+ LPWORD PtrW = (LPWORD) malloc(nTabSize);
+ BOOL rc;
+
+ if (!PtrW) return FALSE;
+ CopyMemory(PtrW, Tab, nTabSize);
+ AdjustEndianessArray16(PtrW, nEntries);
+ rc = Icc ->Write(Icc, nTabSize, PtrW);
+ free(PtrW);
+
+ return rc;
+}
+
+
+
+// Saves profile header
+
+static
+BOOL SaveHeader(LPLCMSICCPROFILE Icc)
+{
+ icHeader Header;
+ time_t now = time(NULL);
+
+ Header.size = TransportValue32((icInt32Number) Icc ->UsedSpace);
+ Header.cmmId = TransportValue32(lcmsSignature);
+ Header.version = TransportValue32((icInt32Number) 0x02300000);
+ Header.deviceClass = (icProfileClassSignature) TransportValue32(Icc -> DeviceClass);
+ Header.colorSpace = (icColorSpaceSignature) TransportValue32(Icc -> ColorSpace);
+ Header.pcs = (icColorSpaceSignature) TransportValue32(Icc -> PCS);
+
+ // NOTE: in v4 Timestamp must be in UTC rather than in local time
+ EncodeDateTimeNumber(&Header.date, gmtime(&now));
+
+ Header.magic = TransportValue32(icMagicNumber);
+
+#ifdef NON_WINDOWS
+ Header.platform = (icPlatformSignature)TransportValue32(icSigMacintosh);
+#else
+ Header.platform = (icPlatformSignature)TransportValue32(icSigMicrosoft);
+#endif
+
+ Header.flags = TransportValue32(Icc -> flags);
+ Header.manufacturer = TransportValue32(lcmsSignature);
+ Header.model = TransportValue32(0);
+ Header.attributes[0]= TransportValue32(Icc -> attributes);
+ Header.attributes[1]= TransportValue32(0);
+
+ Header.renderingIntent = TransportValue32(Icc -> RenderingIntent);
+
+ // Illuminant is D50
+
+ Header.illuminant.X = TransportValue32(DOUBLE_TO_FIXED(Icc -> Illuminant.X));
+ Header.illuminant.Y = TransportValue32(DOUBLE_TO_FIXED(Icc -> Illuminant.Y));
+ Header.illuminant.Z = TransportValue32(DOUBLE_TO_FIXED(Icc -> Illuminant.Z));
+
+ Header.creator = TransportValue32(lcmsSignature);
+
+ ZeroMemory(&Header.reserved, sizeof(Header.reserved));
+
+ // Set profile ID
+ CopyMemory(Header.reserved, Icc ->ProfileID, 16);
+
+
+ Icc ->UsedSpace = 0; // Mark as begin-of-file
+
+ return Icc ->Write(Icc, sizeof(icHeader), &Header);
+}
+
+
+
+// Setup base marker
+
+static
+BOOL SetupBase(icTagTypeSignature sig, LPLCMSICCPROFILE Icc)
+{
+ icTagBase Base;
+
+ Base.sig = (icTagTypeSignature) TransportValue32(sig);
+ ZeroMemory(&Base.reserved, sizeof(Base.reserved));
+ return Icc -> Write(Icc, sizeof(icTagBase), &Base);
+}
+
+
+// Store an XYZ tag
+
+static
+BOOL SaveXYZNumber(LPcmsCIEXYZ Value, LPLCMSICCPROFILE Icc)
+{
+
+ icXYZNumber XYZ;
+
+ if (!SetupBase(icSigXYZType, Icc)) return FALSE;
+
+ XYZ.X = TransportValue32(DOUBLE_TO_FIXED(Value -> X));
+ XYZ.Y = TransportValue32(DOUBLE_TO_FIXED(Value -> Y));
+ XYZ.Z = TransportValue32(DOUBLE_TO_FIXED(Value -> Z));
+
+
+ return Icc -> Write(Icc, sizeof(icXYZNumber), &XYZ);
+}
+
+
+
+// Save a gamma structure as a table
+
+static
+BOOL SaveGammaTable(LPGAMMATABLE Gamma, LPLCMSICCPROFILE Icc)
+{
+ icInt32Number Count;
+
+ if (!SetupBase(icSigCurveType, Icc)) return FALSE;
+
+ Count = TransportValue32(Gamma->nEntries);
+
+ if (!Icc ->Write(Icc, sizeof(icInt32Number), &Count)) return FALSE;
+
+ return SaveWordsTable(Gamma->nEntries, Gamma ->GammaTable, Icc);
+}
+
+
+// Save a gamma structure as a one-value
+
+static
+BOOL SaveGammaOneValue(LPGAMMATABLE Gamma, LPLCMSICCPROFILE Icc)
+{
+ icInt32Number Count;
+ Fixed32 GammaFixed32;
+ WORD GammaFixed8;
+
+ if (!SetupBase(icSigCurveType, Icc)) return FALSE;
+
+ Count = TransportValue32(1);
+ if (!Icc ->Write(Icc, sizeof(icInt32Number), &Count)) return FALSE;
+
+ GammaFixed32 = DOUBLE_TO_FIXED(Gamma ->Birth.Params[0]);
+ GammaFixed8 = (WORD) ((GammaFixed32 >> 8) & 0xFFFF);
+ GammaFixed8 = TransportValue16(GammaFixed8);
+
+ return Icc ->Write(Icc, sizeof(icInt16Number), &GammaFixed8);
+}
+
+// Save a gamma structure as a parametric gamma
+
+static
+BOOL SaveGammaParametric(LPGAMMATABLE Gamma, LPLCMSICCPROFILE Icc)
+{
+ icUInt16Number Type, Reserved;
+ int i, nParams;
+ int ParamsByType[] = { 1, 3, 4, 5, 7 };
+
+ if (!SetupBase(icSigParametricCurveType, Icc)) return FALSE;
+
+ nParams = ParamsByType[Gamma -> Birth.Type];
+
+ Type = (icUInt16Number) TransportValue16((WORD) Gamma -> Birth. Type);
+ Reserved = (icUInt16Number) TransportValue16((WORD) 0);
+
+ Icc -> Write(Icc, sizeof(icInt16Number), &Type);
+ Icc -> Write(Icc, sizeof(icUInt16Number), &Reserved);
+
+ for (i=0; i < nParams; i++) {
+
+ icInt32Number val = TransportValue32(DOUBLE_TO_FIXED(Gamma -> Birth.Params[i]));
+ Icc ->Write(Icc, sizeof(icInt32Number), &val);
+ }
+
+
+ return TRUE;
+
+}
+
+
+// Save a gamma table
+
+static
+BOOL SaveGamma(LPGAMMATABLE Gamma, LPLCMSICCPROFILE Icc)
+{
+ // Is the gamma curve type supported by ICC format?
+
+ if (Gamma -> Birth.Type < 0 || Gamma -> Birth.Type > 5 ||
+
+ // has been modified by user?
+
+ _cmsCrc32OfGammaTable(Gamma) != Gamma -> Birth.Crc32) {
+
+ return SaveGammaTable(Gamma, Icc);
+ }
+
+ if (Gamma -> Birth.Type == 1) return SaveGammaOneValue(Gamma, Icc);
+
+ // Only v4 profiles are allowed to hold parametric curves
+
+ if (cmsGetProfileICCversion((cmsHPROFILE) Icc) >= 0x4000000)
+ return SaveGammaParametric(Gamma, Icc);
+
+ // Defaults to save as table
+
+ return SaveGammaTable(Gamma, Icc);
+
+}
+
+
+
+
+// Save an DESC Tag
+
+static
+BOOL SaveDescription(const char *Text, LPLCMSICCPROFILE Icc)
+{
+
+ icUInt32Number len, Count, TotalSize, AlignedSize;
+ char Filler[256];
+
+ len = (icUInt32Number) (strlen(Text) + 1);
+
+ // * icInt8Number desc[count] * NULL terminated ascii string
+ // * icUInt32Number ucLangCode; * UniCode language code
+ // * icUInt32Number ucCount; * UniCode description length
+ // * icInt16Number ucDesc[ucCount];* The UniCode description
+ // * icUInt16Number scCode; * ScriptCode code
+ // * icUInt8Number scCount; * ScriptCode count
+ // * icInt8Number scDesc[67]; * ScriptCode Description
+
+ TotalSize = sizeof(icTagBase) + sizeof(icUInt32Number) + len +
+ sizeof(icUInt32Number) + sizeof(icUInt32Number) +
+ sizeof(icUInt16Number) + sizeof(icUInt8Number) + 67;
+
+ AlignedSize = TotalSize; // Can be unaligned!!
+
+ if (!SetupBase(icSigTextDescriptionType, Icc)) return FALSE;
+ AlignedSize -= sizeof(icTagBase);
+
+ Count = TransportValue32(len);
+ if (!Icc ->Write(Icc, sizeof(icUInt32Number), &Count)) return FALSE;
+ AlignedSize -= sizeof(icUInt32Number);
+
+ if (!Icc ->Write(Icc, len, (LPVOID)Text)) return FALSE;
+ AlignedSize -= len;
+
+ ZeroMemory(Filler, AlignedSize);
+ if (!Icc ->Write(Icc, AlignedSize, Filler)) return FALSE;
+
+ return TRUE;
+}
+
+// Save an ASCII Tag
+
+static
+BOOL SaveText(const char *Text, LPLCMSICCPROFILE Icc)
+{
+ size_t len = strlen(Text) + 1;
+
+ if (!SetupBase(icSigTextType, Icc)) return FALSE;
+ if (!Icc ->Write(Icc, len, (LPVOID) Text)) return FALSE;
+ return TRUE;
+}
+
+
+// Save one of these new chromaticity values
+
+static
+BOOL SaveOneChromaticity(double x, double y, LPLCMSICCPROFILE Icc)
+{
+ Fixed32 xf, yf;
+
+ xf = TransportValue32(DOUBLE_TO_FIXED(x));
+ yf = TransportValue32(DOUBLE_TO_FIXED(y));
+
+ if (!Icc ->Write(Icc, sizeof(Fixed32), &xf)) return FALSE;
+ if (!Icc ->Write(Icc, sizeof(Fixed32), &yf)) return FALSE;
+
+ return TRUE;
+}
+
+
+// New tag added in Addendum II of old spec.
+
+static
+BOOL SaveChromaticities(LPcmsCIExyYTRIPLE chrm, LPLCMSICCPROFILE Icc)
+{
+ WORD nChans, Table;
+
+ if (!SetupBase(icSigChromaticityType, Icc)) return FALSE;
+
+ nChans = TransportValue16(3);
+ if (!Icc ->Write(Icc, sizeof(WORD) , &nChans)) return FALSE;
+ Table = TransportValue16(0);
+ if (!Icc ->Write(Icc, sizeof(WORD) , &Table)) return FALSE;
+
+ if (!SaveOneChromaticity(chrm -> Red.x, chrm -> Red.y, Icc)) return FALSE;
+ if (!SaveOneChromaticity(chrm -> Green.x, chrm -> Green.y, Icc)) return FALSE;
+ if (!SaveOneChromaticity(chrm -> Blue.x, chrm -> Blue.y, Icc)) return FALSE;
+
+ return TRUE;
+}
+
+
+static
+BOOL SaveSequenceDescriptionTag(LPcmsSEQ seq, LPLCMSICCPROFILE Icc)
+{
+ icUInt32Number nSeqs;
+ icDescStruct DescStruct;
+ int i, n = seq ->n;
+ LPcmsPSEQDESC pseq = seq ->seq;
+
+ if (!SetupBase(icSigProfileSequenceDescType, Icc)) return FALSE;
+
+ nSeqs = TransportValue32(n);
+
+ if (!Icc ->Write(Icc, sizeof(icUInt32Number) , &nSeqs)) return FALSE;
+
+ for (i=0; i < n; i++) {
+
+ LPcmsPSEQDESC sec = pseq + i;
+
+
+ DescStruct.deviceMfg = (icTagTypeSignature) TransportValue32(sec ->deviceMfg);
+ DescStruct.deviceModel = (icTagTypeSignature) TransportValue32(sec ->deviceModel);
+ DescStruct.technology = (icTechnologySignature) TransportValue32(sec ->technology);
+ DescStruct.attributes[0]= TransportValue32(sec ->attributes[0]);
+ DescStruct.attributes[1]= TransportValue32(sec ->attributes[1]);
+
+ if (!Icc ->Write(Icc, sizeof(icDescStruct) - SIZEOF_UINT8_ALIGNED, &DescStruct)) return FALSE;
+
+ if (!SaveDescription(sec ->Manufacturer, Icc)) return FALSE;
+ if (!SaveDescription(sec ->Model, Icc)) return FALSE;
+ }
+
+ return TRUE;
+}
+
+
+// Saves a timestamp tag
+
+static
+BOOL SaveDateTimeNumber(const struct tm *DateTime, LPLCMSICCPROFILE Icc)
+{
+ icDateTimeNumber Dest;
+
+ if (!SetupBase(icSigDateTimeType, Icc)) return FALSE;
+ EncodeDateTimeNumber(&Dest, DateTime);
+ if (!Icc ->Write(Icc, sizeof(icDateTimeNumber), &Dest)) return FALSE;
+
+ return TRUE;
+}
+
+
+// Saves a named color list into a named color profile
+static
+BOOL SaveNamedColorList(LPcmsNAMEDCOLORLIST NamedColorList, LPLCMSICCPROFILE Icc)
+{
+
+ icUInt32Number vendorFlag; // Bottom 16 bits for IC use
+ icUInt32Number count; // Count of named colors
+ icUInt32Number nDeviceCoords; // Num of device coordinates
+ icInt8Number prefix[32]; // Prefix for each color name
+ icInt8Number suffix[32]; // Suffix for each color name
+ int i;
+
+ if (!SetupBase(icSigNamedColor2Type, Icc)) return FALSE;
+
+ vendorFlag = TransportValue32(0);
+ count = TransportValue32(NamedColorList ->nColors);
+ nDeviceCoords = TransportValue32(NamedColorList ->ColorantCount);
+
+ strncpy((char *) prefix, (const char*) NamedColorList->Prefix, 32);
+ strncpy((char *) suffix, (const char*) NamedColorList->Suffix, 32);
+
+ if (!Icc ->Write(Icc, sizeof(icUInt32Number), &vendorFlag)) return FALSE;
+ if (!Icc ->Write(Icc, sizeof(icUInt32Number), &count)) return FALSE;
+ if (!Icc ->Write(Icc, sizeof(icUInt32Number), &nDeviceCoords)) return FALSE;
+ if (!Icc ->Write(Icc, 32 , prefix)) return FALSE;
+ if (!Icc ->Write(Icc, 32 , suffix)) return FALSE;
+
+ for (i=0; i < NamedColorList ->nColors; i++) {
+
+ icUInt16Number PCS[3];
+ icUInt16Number Colorant[MAXCHANNELS];
+ icInt8Number root[32];
+ LPcmsNAMEDCOLOR Color;
+ int j;
+
+ Color = NamedColorList ->List + i;
+
+ strncpy((char*) root, Color ->Name, 32);
+ if (!Icc ->Write(Icc, 32 , root)) return FALSE;
+
+ for (j=0; j < 3; j++)
+ PCS[j] = TransportValue16(Color ->PCS[j]);
+
+ if (!Icc ->Write(Icc, 3 * sizeof(icUInt16Number), PCS)) return FALSE;
+
+ for (j=0; j < NamedColorList ->ColorantCount; j++)
+ Colorant[j] = TransportValue16(Color ->DeviceColorant[j]);
+
+ if (!Icc ->Write(Icc,
+ NamedColorList ->ColorantCount * sizeof(icUInt16Number), Colorant)) return FALSE;
+ }
+
+
+ return TRUE;
+}
+
+
+
+// Saves a colorant table. It is using the named color structure for simplicity sake
+
+static
+BOOL SaveColorantTable(LPcmsNAMEDCOLORLIST NamedColorList, LPLCMSICCPROFILE Icc)
+{
+ icUInt32Number count; // Count of named colors
+ int i;
+
+ if (!SetupBase(icSigColorantTableType, Icc)) return FALSE;
+
+ count = TransportValue32(NamedColorList ->nColors);
+
+ if (!Icc ->Write(Icc, sizeof(icUInt32Number), &count)) return FALSE;
+
+ for (i=0; i < NamedColorList ->nColors; i++) {
+
+ icUInt16Number PCS[3];
+ icInt8Number root[32];
+ LPcmsNAMEDCOLOR Color;
+ int j;
+
+ Color = NamedColorList ->List + i;
+
+ strncpy((char*) root, Color ->Name, 32);
+ if (!Icc ->Write(Icc, 32 , root)) return FALSE;
+
+ for (j=0; j < 3; j++)
+ PCS[j] = TransportValue16(Color ->PCS[j]);
+
+ if (!Icc ->Write(Icc, 3 * sizeof(icUInt16Number), PCS)) return FALSE;
+
+ }
+
+
+ return TRUE;
+}
+
+// Does serialization of LUT16 and writes it.
+
+static
+BOOL SaveLUT(const LUT* NewLUT, LPLCMSICCPROFILE Icc)
+{
+ icLut16 LUT16;
+ unsigned int i;
+ size_t nTabSize;
+ WORD NullTbl[2] = { 0, 0xFFFFU};
+
+
+ if (!SetupBase(icSigLut16Type, Icc)) return FALSE;
+
+ LUT16.clutPoints = (icUInt8Number) NewLUT -> cLutPoints;
+ LUT16.inputChan = (icUInt8Number) NewLUT -> InputChan;
+ LUT16.outputChan = (icUInt8Number) NewLUT -> OutputChan;
+
+ LUT16.inputEnt = TransportValue16((WORD) ((NewLUT -> wFlags & LUT_HASTL1) ? NewLUT -> InputEntries : 2));
+ LUT16.outputEnt = TransportValue16((WORD) ((NewLUT -> wFlags & LUT_HASTL2) ? NewLUT -> OutputEntries : 2));
+
+ if (NewLUT -> wFlags & LUT_HASMATRIX) {
+
+ LUT16.e00 = TransportValue32(NewLUT -> Matrix.v[0].n[0]);
+ LUT16.e01 = TransportValue32(NewLUT -> Matrix.v[0].n[1]);
+ LUT16.e02 = TransportValue32(NewLUT -> Matrix.v[0].n[2]);
+ LUT16.e10 = TransportValue32(NewLUT -> Matrix.v[1].n[0]);
+ LUT16.e11 = TransportValue32(NewLUT -> Matrix.v[1].n[1]);
+ LUT16.e12 = TransportValue32(NewLUT -> Matrix.v[1].n[2]);
+ LUT16.e20 = TransportValue32(NewLUT -> Matrix.v[2].n[0]);
+ LUT16.e21 = TransportValue32(NewLUT -> Matrix.v[2].n[1]);
+ LUT16.e22 = TransportValue32(NewLUT -> Matrix.v[2].n[2]);
+ }
+ else {
+
+ LUT16.e00 = TransportValue32(DOUBLE_TO_FIXED(1));
+ LUT16.e01 = TransportValue32(DOUBLE_TO_FIXED(0));
+ LUT16.e02 = TransportValue32(DOUBLE_TO_FIXED(0));
+ LUT16.e10 = TransportValue32(DOUBLE_TO_FIXED(0));
+ LUT16.e11 = TransportValue32(DOUBLE_TO_FIXED(1));
+ LUT16.e12 = TransportValue32(DOUBLE_TO_FIXED(0));
+ LUT16.e20 = TransportValue32(DOUBLE_TO_FIXED(0));
+ LUT16.e21 = TransportValue32(DOUBLE_TO_FIXED(0));
+ LUT16.e22 = TransportValue32(DOUBLE_TO_FIXED(1));
+ }
+
+
+ // Save header
+
+ Icc -> Write(Icc, sizeof(icLut16)- SIZEOF_UINT16_ALIGNED, &LUT16);
+
+ // The prelinearization table
+
+ for (i=0; i < NewLUT -> InputChan; i++) {
+
+ if (NewLUT -> wFlags & LUT_HASTL1) {
+
+ if (!SaveWordsTable(NewLUT -> InputEntries,
+ NewLUT -> L1[i], Icc)) return FALSE;
+
+ }
+ else Icc -> Write(Icc, sizeof(WORD)* 2, NullTbl);
+ }
+
+
+ nTabSize = (NewLUT -> OutputChan * uipow(NewLUT->cLutPoints,
+ NewLUT->InputChan));
+ // The 3D CLUT.
+
+ if (nTabSize > 0) {
+
+ if (!SaveWordsTable((int) nTabSize, NewLUT -> T, Icc)) return FALSE;
+ }
+ // The postlinearization table
+
+ for (i=0; i < NewLUT -> OutputChan; i++) {
+
+ if (NewLUT -> wFlags & LUT_HASTL2) {
+
+ if (!SaveWordsTable(NewLUT -> OutputEntries,
+ NewLUT -> L2[i], Icc)) return FALSE;
+ }
+ else Icc -> Write(Icc, sizeof(WORD)* 2, NullTbl);
+
+ }
+
+ return TRUE;
+}
+
+
+
+// Does serialization of LUT8 and writes it
+
+static
+BOOL SaveLUT8(const LUT* NewLUT, LPLCMSICCPROFILE Icc)
+{
+ icLut8 LUT8;
+ unsigned int i, j;
+ size_t nTabSize;
+ BYTE val;
+
+ // Sanity check
+
+ if (NewLUT -> wFlags & LUT_HASTL1) {
+
+ if (NewLUT -> InputEntries != 256) {
+ cmsSignalError(LCMS_ERRC_ABORTED, "LUT8 needs 256 entries on prelinearization");
+ return FALSE;
+ }
+
+ }
+
+
+ if (NewLUT -> wFlags & LUT_HASTL2) {
+
+ if (NewLUT -> OutputEntries != 256) {
+ cmsSignalError(LCMS_ERRC_ABORTED, "LUT8 needs 256 entries on postlinearization");
+ return FALSE;
+ }
+ }
+
+
+
+ if (!SetupBase(icSigLut8Type, Icc)) return FALSE;
+
+ LUT8.clutPoints = (icUInt8Number) NewLUT -> cLutPoints;
+ LUT8.inputChan = (icUInt8Number) NewLUT -> InputChan;
+ LUT8.outputChan = (icUInt8Number) NewLUT -> OutputChan;
+
+
+ if (NewLUT -> wFlags & LUT_HASMATRIX) {
+
+ LUT8.e00 = TransportValue32(NewLUT -> Matrix.v[0].n[0]);
+ LUT8.e01 = TransportValue32(NewLUT -> Matrix.v[0].n[1]);
+ LUT8.e02 = TransportValue32(NewLUT -> Matrix.v[0].n[2]);
+ LUT8.e10 = TransportValue32(NewLUT -> Matrix.v[1].n[0]);
+ LUT8.e11 = TransportValue32(NewLUT -> Matrix.v[1].n[1]);
+ LUT8.e12 = TransportValue32(NewLUT -> Matrix.v[1].n[2]);
+ LUT8.e20 = TransportValue32(NewLUT -> Matrix.v[2].n[0]);
+ LUT8.e21 = TransportValue32(NewLUT -> Matrix.v[2].n[1]);
+ LUT8.e22 = TransportValue32(NewLUT -> Matrix.v[2].n[2]);
+ }
+ else {
+
+ LUT8.e00 = TransportValue32(DOUBLE_TO_FIXED(1));
+ LUT8.e01 = TransportValue32(DOUBLE_TO_FIXED(0));
+ LUT8.e02 = TransportValue32(DOUBLE_TO_FIXED(0));
+ LUT8.e10 = TransportValue32(DOUBLE_TO_FIXED(0));
+ LUT8.e11 = TransportValue32(DOUBLE_TO_FIXED(1));
+ LUT8.e12 = TransportValue32(DOUBLE_TO_FIXED(0));
+ LUT8.e20 = TransportValue32(DOUBLE_TO_FIXED(0));
+ LUT8.e21 = TransportValue32(DOUBLE_TO_FIXED(0));
+ LUT8.e22 = TransportValue32(DOUBLE_TO_FIXED(1));
+ }
+
+
+ // Save header
+
+ Icc -> Write(Icc, sizeof(icLut8)- SIZEOF_UINT8_ALIGNED, &LUT8);
+
+ // The prelinearization table
+
+ for (i=0; i < NewLUT -> InputChan; i++) {
+
+ for (j=0; j < 256; j++) {
+
+ if (NewLUT -> wFlags & LUT_HASTL1)
+ val = (BYTE) floor(NewLUT ->L1[i][j] / 257.0 + .5);
+ else
+ val = (BYTE) j;
+
+ Icc ->Write(Icc, 1, &val);
+ }
+
+ }
+
+
+ nTabSize = (NewLUT -> OutputChan * uipow(NewLUT->cLutPoints,
+ NewLUT->InputChan));
+ // The 3D CLUT.
+
+ for (j=0; j < nTabSize; j++) {
+
+ val = (BYTE) floor(NewLUT ->T[j] / 257.0 + .5);
+ Icc ->Write(Icc, 1, &val);
+ }
+
+ // The postlinearization table
+
+ for (i=0; i < NewLUT -> OutputChan; i++) {
+
+ for (j=0; j < 256; j++) {
+
+ if (NewLUT -> wFlags & LUT_HASTL2)
+ val = (BYTE) floor(NewLUT ->L2[i][j] / 257.0 + .5);
+ else
+ val = (BYTE) j;
+
+ Icc ->Write(Icc, 1, &val);
+ }
+
+ }
+
+ return TRUE;
+}
+
+
+
+// Set the LUT bitdepth to be saved
+
+void LCMSEXPORT _cmsSetLUTdepth(cmsHPROFILE hProfile, int depth)
+{
+ LPLCMSICCPROFILE Icc = (LPLCMSICCPROFILE) (LPSTR) hProfile;
+
+ switch (depth) {
+
+ case 8: Icc ->SaveAs8Bits = TRUE; break;
+ case 16: Icc ->SaveAs8Bits = FALSE; break;
+
+ default:
+ cmsSignalError(LCMS_ERRC_ABORTED, "%d is an unsupported as bitdepth, use 8 or 16 only.", depth);
+ }
+}
+
+
+// Saves Tag directory
+
+static
+BOOL SaveTagDirectory(LPLCMSICCPROFILE Icc)
+{
+ icInt32Number i;
+ icTag Tag;
+ icInt32Number Count = 0;
+
+ // Get true count
+ for (i=0; i < Icc -> TagCount; i++) {
+ if (Icc ->TagNames[i] != 0)
+ Count++;
+ }
+
+ Count = TransportValue32(Count);
+ if (!Icc ->Write(Icc, sizeof(icInt32Number) , &Count)) return FALSE;
+
+ for (i=0; i < Icc -> TagCount; i++) {
+
+ if (Icc ->TagNames[i] == 0) continue;
+
+ Tag.sig = (icTagSignature)TransportValue32(Icc -> TagNames[i]);
+ Tag.offset = TransportValue32((icInt32Number) Icc -> TagOffsets[i]);
+ Tag.size = TransportValue32((icInt32Number) Icc -> TagSizes[i]);
+
+ if (!Icc ->Write(Icc, sizeof(icTag), &Tag)) return FALSE;
+ }
+
+ return TRUE;
+}
+
+
+// Dump tag contents
+
+static
+BOOL SaveTags(LPLCMSICCPROFILE Icc)
+{
+
+ LPBYTE Data;
+ icInt32Number i;
+ size_t Begin;
+ size_t AlignedSpace, FillerSize;
+
+
+ for (i=0; i < Icc -> TagCount; i++) {
+
+ if (Icc ->TagNames[i] == 0) continue;
+
+ // Align to DWORD boundary, following new spec.
+
+ AlignedSpace = ALIGNLONG(Icc ->UsedSpace);
+ FillerSize = AlignedSpace - Icc ->UsedSpace;
+ if (FillerSize > 0) {
+
+ BYTE Filler[20];
+
+ ZeroMemory(Filler, 16);
+ if (!Icc ->Write(Icc, FillerSize, Filler)) return FALSE;
+ }
+
+
+ Icc -> TagOffsets[i] = Begin = Icc ->UsedSpace;
+ Data = (LPBYTE) Icc -> TagPtrs[i];
+ if (!Data)
+ continue;
+
+ switch (Icc -> TagNames[i]) {
+
+ case icSigProfileDescriptionTag:
+ case icSigDeviceMfgDescTag:
+ case icSigDeviceModelDescTag:
+ if (!SaveDescription((const char *) Data, Icc)) return FALSE;
+ break;
+
+ case icSigRedColorantTag:
+ case icSigGreenColorantTag:
+ case icSigBlueColorantTag:
+ case icSigMediaWhitePointTag:
+ case icSigMediaBlackPointTag:
+ if (!SaveXYZNumber((LPcmsCIEXYZ) Data, Icc)) return FALSE;
+ break;
+
+
+ case icSigRedTRCTag:
+ case icSigGreenTRCTag:
+ case icSigBlueTRCTag:
+ case icSigGrayTRCTag:
+ if (!SaveGamma((LPGAMMATABLE) Data, Icc)) return FALSE;
+ break;
+
+ case icSigCharTargetTag:
+ case icSigCopyrightTag:
+ if (!SaveText((const char *) Data, Icc)) return FALSE;
+ break;
+
+ case icSigChromaticityTag:
+ if (!SaveChromaticities((LPcmsCIExyYTRIPLE) Data, Icc)) return FALSE;
+ break;
+
+ // Save LUT
+
+ case icSigAToB0Tag:
+ case icSigAToB1Tag:
+ case icSigAToB2Tag:
+ case icSigBToA0Tag:
+ case icSigBToA1Tag:
+ case icSigBToA2Tag:
+ case icSigGamutTag:
+ case icSigPreview0Tag:
+ case icSigPreview1Tag:
+ case icSigPreview2Tag:
+
+ if (Icc ->SaveAs8Bits) {
+
+ if (!SaveLUT8((LPLUT) Data, Icc)) return FALSE;
+ }
+ else {
+
+ if (!SaveLUT((LPLUT) Data, Icc)) return FALSE;
+ }
+ break;
+
+ case icSigProfileSequenceDescTag:
+ if (!SaveSequenceDescriptionTag((LPcmsSEQ) Data, Icc)) return FALSE;
+ break;
+
+
+ case icSigNamedColor2Tag:
+ if (!SaveNamedColorList((LPcmsNAMEDCOLORLIST) Data, Icc)) return FALSE;
+ break;
+
+
+ case icSigCalibrationDateTimeTag:
+ if (!SaveDateTimeNumber((struct tm *) Data, Icc)) return FALSE;
+ break;
+
+
+ case icSigColorantTableTag:
+ case icSigColorantTableOutTag:
+ if (!SaveColorantTable((LPcmsNAMEDCOLORLIST) Data, Icc)) return FALSE;
+ break;
+
+
+ default:
+ return FALSE;
+ }
+
+ Icc -> TagSizes[i] = (Icc ->UsedSpace - Begin);
+ }
+
+
+
+ return TRUE;
+}
+
+
+
+// Add tags to profile structure
+
+BOOL LCMSEXPORT cmsAddTag(cmsHPROFILE hProfile, icTagSignature sig, LPVOID Tag)
+{
+ BOOL rc;
+
+ switch (sig) {
+
+ case icSigCharTargetTag:
+ case icSigCopyrightTag:
+ case icSigProfileDescriptionTag:
+ case icSigDeviceMfgDescTag:
+ case icSigDeviceModelDescTag:
+ rc = _cmsAddTextTag(hProfile, sig, (const char*) Tag);
+ break;
+
+ case icSigRedColorantTag:
+ case icSigGreenColorantTag:
+ case icSigBlueColorantTag:
+ case icSigMediaWhitePointTag:
+ case icSigMediaBlackPointTag:
+ rc = _cmsAddXYZTag(hProfile, sig, (const cmsCIEXYZ*) Tag);
+ break;
+
+ case icSigRedTRCTag:
+ case icSigGreenTRCTag:
+ case icSigBlueTRCTag:
+ case icSigGrayTRCTag:
+ rc = _cmsAddGammaTag(hProfile, sig, (LPGAMMATABLE) Tag);
+ break;
+
+ case icSigAToB0Tag:
+ case icSigAToB1Tag:
+ case icSigAToB2Tag:
+ case icSigBToA0Tag:
+ case icSigBToA1Tag:
+ case icSigBToA2Tag:
+ case icSigGamutTag:
+ case icSigPreview0Tag:
+ case icSigPreview1Tag:
+ case icSigPreview2Tag:
+ rc = _cmsAddLUTTag(hProfile, sig, Tag);
+ break;
+
+ case icSigChromaticityTag:
+ rc = _cmsAddChromaticityTag(hProfile, sig, (LPcmsCIExyYTRIPLE) Tag);
+ break;
+
+ case icSigProfileSequenceDescTag:
+ rc = _cmsAddSequenceDescriptionTag(hProfile, sig, (LPcmsSEQ) Tag);
+ break;
+
+ case icSigNamedColor2Tag:
+ rc = _cmsAddNamedColorTag(hProfile, sig, (LPcmsNAMEDCOLORLIST) Tag);
+ break;
+
+ case icSigCalibrationDateTimeTag:
+ rc = _cmsAddDateTimeTag(hProfile, sig, (struct tm*) Tag);
+ break;
+
+ case icSigColorantTableTag:
+ case icSigColorantTableOutTag:
+ rc = _cmsAddColorantTableTag(hProfile, sig, (LPcmsNAMEDCOLORLIST) Tag);
+ break;
+
+ default:
+ cmsSignalError(LCMS_ERRC_ABORTED, "cmsAddTag: Tag '%x' is unsupported", sig);
+ return FALSE;
+ }
+
+ // Check for critical tags
+
+ switch (sig) {
+
+ case icSigMediaWhitePointTag:
+ case icSigMediaBlackPointTag:
+ case icSigChromaticAdaptationTag:
+
+ ReadCriticalTags((LPLCMSICCPROFILE) hProfile);
+ break;
+
+ default:;
+ }
+
+ return rc;
+
+}
+
+// Low-level save to disk. It closes the profile on exit
+
+BOOL LCMSEXPORT _cmsSaveProfile(cmsHPROFILE hProfile, const char* FileName)
+{
+ LPLCMSICCPROFILE Icc = (LPLCMSICCPROFILE) (LPSTR) hProfile;
+ LCMSICCPROFILE Keep;
+ BOOL rc;
+
+ CopyMemory(&Keep, Icc, sizeof(LCMSICCPROFILE));
+ _cmsSetSaveToDisk(Icc, NULL);
+
+ // Pass #1 does compute offsets
+
+ if (!SaveHeader(Icc)) return FALSE;
+ if (!SaveTagDirectory(Icc)) return FALSE;
+ if (!SaveTags(Icc)) return FALSE;
+
+
+ _cmsSetSaveToDisk(Icc, FileName);
+
+
+ // Pass #2 does save to file
+
+ if (!SaveHeader(Icc)) goto CleanUp;
+ if (!SaveTagDirectory(Icc)) goto CleanUp;
+ if (!SaveTags(Icc)) goto CleanUp;
+
+ rc = (Icc ->Close(Icc) == 0);
+ CopyMemory(Icc, &Keep, sizeof(LCMSICCPROFILE));
+ return rc;
+
+
+ CleanUp:
+
+ Icc ->Close(Icc);
+ unlink(FileName);
+ CopyMemory(Icc, &Keep, sizeof(LCMSICCPROFILE));
+ return FALSE;
+}
+
+
+// Low-level save from open stream
+BOOL LCMSEXPORT _cmsSaveProfileToMem(cmsHPROFILE hProfile, void *MemPtr,
+ size_t* BytesNeeded)
+{
+ LPLCMSICCPROFILE Icc = (LPLCMSICCPROFILE) (LPSTR) hProfile;
+ LCMSICCPROFILE Keep;
+
+
+ CopyMemory(&Keep, Icc, sizeof(LCMSICCPROFILE));
+
+ _cmsSetSaveToMemory(Icc, NULL, 0);
+
+ // Pass #1 does compute offsets
+
+ if (!SaveHeader(Icc)) return FALSE;
+ if (!SaveTagDirectory(Icc)) return FALSE;
+ if (!SaveTags(Icc)) return FALSE;
+
+ if (!MemPtr) {
+
+ // update BytesSaved so caller knows how many bytes are needed for MemPtr
+ *BytesNeeded = Icc ->UsedSpace;
+ return TRUE;
+ }
+
+ if (*BytesNeeded < Icc ->UsedSpace) {
+
+ // need at least UsedSpace in MemPtr to continue
+ return FALSE;
+ }
+
+ _cmsSetSaveToMemory(Icc, MemPtr, *BytesNeeded);
+
+
+ // Pass #2 does save to file into supplied stream
+ if (!SaveHeader(Icc)) goto CleanUp;
+ if (!SaveTagDirectory(Icc)) goto CleanUp;
+ if (!SaveTags(Icc)) goto CleanUp;
+
+ // update BytesSaved so caller knows how many bytes put into stream
+ *BytesNeeded = Icc ->UsedSpace;
+
+ Icc ->Close(Icc);
+ CopyMemory(Icc, &Keep, sizeof(LCMSICCPROFILE));
+ return TRUE;
+
+CleanUp:
+
+ Icc ->Close(Icc);
+ CopyMemory(Icc, &Keep, sizeof(LCMSICCPROFILE));
+ return FALSE;
+}
+
diff --git a/icc2ps/cmslut.c b/icc2ps/cmslut.c
new file mode 100644
index 0000000..62f5793
--- /dev/null
+++ b/icc2ps/cmslut.c
@@ -0,0 +1,819 @@
+//
+// Little cms
+// Copyright (C) 1998-2005 Marti Maria
+//
+// Permission is hereby granted, free of charge, to any person obtaining
+// a copy of this software and associated documentation files (the "Software"),
+// to deal in the Software without restriction, including without limitation
+// the rights to use, copy, modify, merge, publish, distribute, sublicense,
+// and/or sell copies of the Software, and to permit persons to whom the Software
+// is furnished to do so, subject to the following conditions:
+//
+// The above copyright notice and this permission notice shall be included in
+// all copies or substantial portions of the Software.
+//
+// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
+// EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO
+// THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
+// NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
+// LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
+// OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
+// WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
+
+#include "lcms.h"
+
+// Pipeline of LUT. Enclosed by {} are new revision 4.0 of ICC spec.
+//
+// [Mat] -> [L1] -> { [Mat3] -> [Ofs3] -> [L3] ->} [CLUT] { -> [L4] -> [Mat4] -> [Ofs4] } -> [L2]
+//
+// Some of these stages would be missing. This implements the totality of
+// combinations of old and new LUT types as follows:
+//
+// Lut8 & Lut16
+// ============
+// [Mat] -> [L1] -> [CLUT] -> [L2]
+//
+// Mat2, Ofs2, L3, L3, Mat3, Ofs3 are missing
+//
+// LutAToB
+// ========
+//
+// [L1] -> [CLUT] -> [L4] -> [Mat4] -> [Ofs4] -> [L2]
+//
+// Mat, Mat3, Ofs3, L3 are missing
+// L1 = A curves
+// L4 = M curves
+// L2 = B curves
+//
+// LutBToA
+// =======
+//
+// [L1] -> [Mat3] -> [Ofs3] -> [L3] -> [CLUT] -> [L2]
+//
+// Mat, L4, Mat4, Ofs4 are missing
+// L1 = B Curves
+// L3 = M Curves
+// L2 = A curves
+//
+//
+// V2&3 emulation
+// ===============
+//
+// For output, Mat is multiplied by
+//
+//
+// | 0xff00 / 0xffff 0 0 |
+// | 0 0xff00 / 0xffff 0 |
+// | 0 0 0xff00 / 0xffff |
+//
+//
+// For input, an additional matrix is needed at the very last end of the chain
+//
+//
+// | 0xffff / 0xff00 0 0 |
+// | 0 0xffff / 0xff00 0 |
+// | 0 0 0xffff / 0xff00 |
+//
+//
+// Which reduces to (val * 257) >> 8
+
+// A couple of macros to convert between revisions
+
+#define FROM_V2_TO_V4(x) (((((x)<<8)+(x))+0x80)>>8) // BY 65535 DIV 65280 ROUND
+#define FROM_V4_TO_V2(x) ((((x)<<8)+0x80)/257) // BY 65280 DIV 65535 ROUND
+
+
+// Lut Creation & Destruction
+
+LPLUT LCMSEXPORT cmsAllocLUT(void)
+{
+ LPLUT NewLUT;
+
+ NewLUT = (LPLUT) malloc(sizeof(LUT));
+ if (NewLUT)
+ ZeroMemory(NewLUT, sizeof(LUT));
+
+ return NewLUT;
+}
+
+void LCMSEXPORT cmsFreeLUT(LPLUT Lut)
+{
+ unsigned int i;
+
+ if (!Lut) return;
+
+ if (Lut -> T) free(Lut -> T);
+
+ for (i=0; i < Lut -> OutputChan; i++)
+ {
+ if (Lut -> L2[i]) free(Lut -> L2[i]);
+ }
+
+ for (i=0; i < Lut -> InputChan; i++)
+ {
+
+ if (Lut -> L1[i]) free(Lut -> L1[i]);
+ }
+
+
+ if (Lut ->wFlags & LUT_HASTL3) {
+
+ for (i=0; i < Lut -> InputChan; i++) {
+
+ if (Lut -> L3[i]) free(Lut -> L3[i]);
+ }
+ }
+
+ if (Lut ->wFlags & LUT_HASTL4) {
+
+ for (i=0; i < Lut -> OutputChan; i++) {
+
+ if (Lut -> L4[i]) free(Lut -> L4[i]);
+ }
+ }
+
+ if (Lut ->CLut16params.p8)
+ free(Lut ->CLut16params.p8);
+
+ free(Lut);
+}
+
+
+static
+LPVOID DupBlockTab(LPVOID Org, size_t size)
+{
+ LPVOID mem = malloc(size);
+
+ CopyMemory(mem, Org, size);
+ return mem;
+}
+
+
+LPLUT LCMSEXPORT cmsDupLUT(LPLUT Orig)
+{
+ LPLUT NewLUT = cmsAllocLUT();
+ unsigned int i;
+
+ CopyMemory(NewLUT, Orig, sizeof(LUT));
+
+ for (i=0; i < Orig ->InputChan; i++)
+ NewLUT -> L1[i] = (LPWORD) DupBlockTab((LPVOID) Orig ->L1[i],
+ sizeof(WORD) * Orig ->In16params.nSamples);
+
+ for (i=0; i < Orig ->OutputChan; i++)
+ NewLUT -> L2[i] = (LPWORD) DupBlockTab((LPVOID) Orig ->L2[i],
+ sizeof(WORD) * Orig ->Out16params.nSamples);
+
+ NewLUT -> T = (LPWORD) DupBlockTab((LPVOID) Orig ->T, Orig -> Tsize);
+
+ return NewLUT;
+}
+
+
+static
+unsigned int UIpow(unsigned int a, unsigned int b)
+{
+ unsigned int rv = 1;
+
+ for (; b > 0; b--)
+ rv *= a;
+
+ return rv;
+}
+
+
+LPLUT LCMSEXPORT cmsAlloc3DGrid(LPLUT NewLUT, int clutPoints, int inputChan, int outputChan)
+{
+ DWORD nTabSize;
+
+ NewLUT -> wFlags |= LUT_HAS3DGRID;
+ NewLUT -> cLutPoints = clutPoints;
+ NewLUT -> InputChan = inputChan;
+ NewLUT -> OutputChan = outputChan;
+
+
+ nTabSize = (NewLUT -> OutputChan * UIpow(NewLUT->cLutPoints,
+ NewLUT->InputChan)
+ * sizeof(WORD));
+
+ NewLUT -> T = (LPWORD) malloc(nTabSize);
+ ZeroMemory(NewLUT -> T, nTabSize);
+ NewLUT ->Tsize = nTabSize;
+
+
+ cmsCalcCLUT16Params(NewLUT -> cLutPoints, NewLUT -> InputChan,
+ NewLUT -> OutputChan,
+ &NewLUT -> CLut16params);
+
+ return NewLUT;
+}
+
+
+
+
+LPLUT LCMSEXPORT cmsAllocLinearTable(LPLUT NewLUT, LPGAMMATABLE Tables[], int nTable)
+{
+ unsigned int i;
+ LPWORD PtrW;
+
+ switch (nTable) {
+
+
+ case 1: NewLUT -> wFlags |= LUT_HASTL1;
+ cmsCalcL16Params(Tables[0] -> nEntries, &NewLUT -> In16params);
+ NewLUT -> InputEntries = Tables[0] -> nEntries;
+
+ for (i=0; i < NewLUT -> InputChan; i++) {
+
+ PtrW = (LPWORD) malloc(sizeof(WORD) * NewLUT -> InputEntries);
+ NewLUT -> L1[i] = PtrW;
+ CopyMemory(PtrW, Tables[i]->GammaTable, sizeof(WORD) * NewLUT -> InputEntries);
+ CopyMemory(&NewLUT -> LCurvesBirth[0][i], &Tables[i] -> Birth, sizeof(LCMSGAMMAPARAMS));
+ }
+
+
+ break;
+
+ case 2: NewLUT -> wFlags |= LUT_HASTL2;
+ cmsCalcL16Params(Tables[0] -> nEntries, &NewLUT -> Out16params);
+ NewLUT -> OutputEntries = Tables[0] -> nEntries;
+ for (i=0; i < NewLUT -> OutputChan; i++) {
+
+ PtrW = (LPWORD) malloc(sizeof(WORD) * NewLUT -> OutputEntries);
+ NewLUT -> L2[i] = PtrW;
+ CopyMemory(PtrW, Tables[i]->GammaTable, sizeof(WORD) * NewLUT -> OutputEntries);
+ CopyMemory(&NewLUT -> LCurvesBirth[1][i], &Tables[i] -> Birth, sizeof(LCMSGAMMAPARAMS));
+ }
+ break;
+
+
+ // 3 & 4 according ICC 4.0 spec
+
+ case 3:
+ NewLUT -> wFlags |= LUT_HASTL3;
+ cmsCalcL16Params(Tables[0] -> nEntries, &NewLUT -> L3params);
+ NewLUT -> L3Entries = Tables[0] -> nEntries;
+
+ for (i=0; i < NewLUT -> InputChan; i++) {
+
+ PtrW = (LPWORD) malloc(sizeof(WORD) * NewLUT -> L3Entries);
+ NewLUT -> L3[i] = PtrW;
+ CopyMemory(PtrW, Tables[i]->GammaTable, sizeof(WORD) * NewLUT -> L3Entries);
+ CopyMemory(&NewLUT -> LCurvesBirth[2][i], &Tables[i] -> Birth, sizeof(LCMSGAMMAPARAMS));
+ }
+ break;
+
+ case 4:
+ NewLUT -> wFlags |= LUT_HASTL4;
+ cmsCalcL16Params(Tables[0] -> nEntries, &NewLUT -> L4params);
+ NewLUT -> L4Entries = Tables[0] -> nEntries;
+ for (i=0; i < NewLUT -> OutputChan; i++) {
+
+ PtrW = (LPWORD) malloc(sizeof(WORD) * NewLUT -> L4Entries);
+ NewLUT -> L4[i] = PtrW;
+ CopyMemory(PtrW, Tables[i]->GammaTable, sizeof(WORD) * NewLUT -> L4Entries);
+ CopyMemory(&NewLUT -> LCurvesBirth[3][i], &Tables[i] -> Birth, sizeof(LCMSGAMMAPARAMS));
+ }
+ break;
+
+
+ default:;
+ }
+
+ return NewLUT;
+}
+
+
+// Set the LUT matrix
+
+LPLUT LCMSEXPORT cmsSetMatrixLUT(LPLUT Lut, LPMAT3 M)
+{
+ MAT3toFix(&Lut ->Matrix, M);
+
+ if (!MAT3isIdentity(&Lut->Matrix, 0.0001))
+ Lut ->wFlags |= LUT_HASMATRIX;
+
+ return Lut;
+}
+
+
+// Set matrix & offset, v4 compatible
+
+LPLUT LCMSEXPORT cmsSetMatrixLUT4(LPLUT Lut, LPMAT3 M, LPVEC3 off, DWORD dwFlags)
+{
+ WMAT3 WMat;
+ WVEC3 Woff;
+ VEC3 Zero = {{0, 0, 0}};
+
+ MAT3toFix(&WMat, M);
+
+ if (off == NULL)
+ off = &Zero;
+
+ VEC3toFix(&Woff, off);
+
+ // Nop if identity
+ if (MAT3isIdentity(&WMat, 0.0001) &&
+ (Woff.n[VX] == 0 && Woff.n[VY] == 0 && Woff.n[VZ] == 0))
+ return Lut;
+
+ switch (dwFlags) {
+
+ case LUT_HASMATRIX:
+ Lut ->Matrix = WMat;
+ Lut ->wFlags |= LUT_HASMATRIX;
+ break;
+
+ case LUT_HASMATRIX3:
+ Lut ->Mat3 = WMat;
+ Lut ->Ofs3 = Woff;
+ Lut ->wFlags |= LUT_HASMATRIX3;
+ break;
+
+ case LUT_HASMATRIX4:
+ Lut ->Mat4 = WMat;
+ Lut ->Ofs4 = Woff;
+ Lut ->wFlags |= LUT_HASMATRIX4;
+ break;
+
+
+ default:;
+ }
+
+ return Lut;
+}
+
+
+
+// The full evaluator
+
+void LCMSEXPORT cmsEvalLUT(LPLUT Lut, WORD In[], WORD Out[])
+{
+ register unsigned int i;
+ WORD StageABC[MAXCHANNELS], StageLMN[MAXCHANNELS];
+
+
+ // Try to speedup things on plain devicelinks
+ if (Lut ->wFlags == LUT_HAS3DGRID) {
+
+ Lut ->CLut16params.Interp3D(In, Out, Lut -> T, &Lut -> CLut16params);
+ return;
+ }
+
+
+ // Nope, evaluate whole LUT
+
+ for (i=0; i < Lut -> InputChan; i++)
+ StageABC[i] = In[i];
+
+
+ if (Lut ->wFlags & LUT_V4_OUTPUT_EMULATE_V2) {
+
+ // Clamp Lab to avoid overflow
+ if (StageABC[0] > 0xFF00)
+ StageABC[0] = 0xFF00;
+
+ StageABC[0] = (WORD) FROM_V2_TO_V4(StageABC[0]);
+ StageABC[1] = (WORD) FROM_V2_TO_V4(StageABC[1]);
+ StageABC[2] = (WORD) FROM_V2_TO_V4(StageABC[2]);
+
+ }
+
+ if (Lut ->wFlags & LUT_V2_OUTPUT_EMULATE_V4) {
+
+ StageABC[0] = (WORD) FROM_V4_TO_V2(StageABC[0]);
+ StageABC[1] = (WORD) FROM_V4_TO_V2(StageABC[1]);
+ StageABC[2] = (WORD) FROM_V4_TO_V2(StageABC[2]);
+ }
+
+
+ // Matrix handling.
+
+ if (Lut -> wFlags & LUT_HASMATRIX) {
+
+ WVEC3 InVect, OutVect;
+
+ // In LUT8 here comes the special gray axis fixup
+
+ if (Lut ->FixGrayAxes) {
+
+ StageABC[1] = _cmsClampWord(StageABC[1] - 128);
+ StageABC[2] = _cmsClampWord(StageABC[2] - 128);
+ }
+
+ // Matrix
+
+ InVect.n[VX] = ToFixedDomain(StageABC[0]);
+ InVect.n[VY] = ToFixedDomain(StageABC[1]);
+ InVect.n[VZ] = ToFixedDomain(StageABC[2]);
+
+
+ MAT3evalW(&OutVect, &Lut -> Matrix, &InVect);
+
+ // PCS in 1Fixed15 format, adjusting
+
+ StageABC[0] = _cmsClampWord(FromFixedDomain(OutVect.n[VX]));
+ StageABC[1] = _cmsClampWord(FromFixedDomain(OutVect.n[VY]));
+ StageABC[2] = _cmsClampWord(FromFixedDomain(OutVect.n[VZ]));
+ }
+
+
+ // First linearization
+
+ if (Lut -> wFlags & LUT_HASTL1)
+ {
+ for (i=0; i < Lut -> InputChan; i++)
+ StageABC[i] = cmsLinearInterpLUT16(StageABC[i],
+ Lut -> L1[i],
+ &Lut -> In16params);
+ }
+
+
+ // Mat3, Ofs3, L3 processing
+
+ if (Lut ->wFlags & LUT_HASMATRIX3) {
+
+ WVEC3 InVect, OutVect;
+
+ InVect.n[VX] = ToFixedDomain(StageABC[0]);
+ InVect.n[VY] = ToFixedDomain(StageABC[1]);
+ InVect.n[VZ] = ToFixedDomain(StageABC[2]);
+
+ MAT3evalW(&OutVect, &Lut -> Mat3, &InVect);
+
+ OutVect.n[VX] += Lut ->Ofs3.n[VX];
+ OutVect.n[VY] += Lut ->Ofs3.n[VY];
+ OutVect.n[VZ] += Lut ->Ofs3.n[VZ];
+
+ StageABC[0] = _cmsClampWord(FromFixedDomain(OutVect.n[VX]));
+ StageABC[1] = _cmsClampWord(FromFixedDomain(OutVect.n[VY]));
+ StageABC[2] = _cmsClampWord(FromFixedDomain(OutVect.n[VZ]));
+
+ }
+
+ if (Lut ->wFlags & LUT_HASTL3) {
+
+ for (i=0; i < Lut -> InputChan; i++)
+ StageABC[i] = cmsLinearInterpLUT16(StageABC[i],
+ Lut -> L3[i],
+ &Lut -> L3params);
+
+ }
+
+
+
+ if (Lut -> wFlags & LUT_HAS3DGRID) {
+
+ Lut ->CLut16params.Interp3D(StageABC, StageLMN, Lut -> T, &Lut -> CLut16params);
+
+ }
+ else
+ {
+
+ for (i=0; i < Lut -> InputChan; i++)
+ StageLMN[i] = StageABC[i];
+
+ }
+
+
+ // Mat4, Ofs4, L4 processing
+
+ if (Lut ->wFlags & LUT_HASTL4) {
+
+ for (i=0; i < Lut -> OutputChan; i++)
+ StageLMN[i] = cmsLinearInterpLUT16(StageLMN[i],
+ Lut -> L4[i],
+ &Lut -> L4params);
+ }
+
+ if (Lut ->wFlags & LUT_HASMATRIX4) {
+
+ WVEC3 InVect, OutVect;
+
+ InVect.n[VX] = ToFixedDomain(StageLMN[0]);
+ InVect.n[VY] = ToFixedDomain(StageLMN[1]);
+ InVect.n[VZ] = ToFixedDomain(StageLMN[2]);
+
+ MAT3evalW(&OutVect, &Lut -> Mat4, &InVect);
+
+ OutVect.n[VX] += Lut ->Ofs4.n[VX];
+ OutVect.n[VY] += Lut ->Ofs4.n[VY];
+ OutVect.n[VZ] += Lut ->Ofs4.n[VZ];
+
+ StageLMN[0] = _cmsClampWord(FromFixedDomain(OutVect.n[VX]));
+ StageLMN[1] = _cmsClampWord(FromFixedDomain(OutVect.n[VY]));
+ StageLMN[2] = _cmsClampWord(FromFixedDomain(OutVect.n[VZ]));
+
+ }
+
+ // Last linearitzation
+
+ if (Lut -> wFlags & LUT_HASTL2)
+ {
+ for (i=0; i < Lut -> OutputChan; i++)
+ Out[i] = cmsLinearInterpLUT16(StageLMN[i],
+ Lut -> L2[i],
+ &Lut -> Out16params);
+ }
+ else
+ {
+ for (i=0; i < Lut -> OutputChan; i++)
+ Out[i] = StageLMN[i];
+ }
+
+
+
+ if (Lut ->wFlags & LUT_V4_INPUT_EMULATE_V2) {
+
+ Out[0] = (WORD) FROM_V4_TO_V2(Out[0]);
+ Out[1] = (WORD) FROM_V4_TO_V2(Out[1]);
+ Out[2] = (WORD) FROM_V4_TO_V2(Out[2]);
+
+ }
+
+ if (Lut ->wFlags & LUT_V2_INPUT_EMULATE_V4) {
+
+ Out[0] = (WORD) FROM_V2_TO_V4(Out[0]);
+ Out[1] = (WORD) FROM_V2_TO_V4(Out[1]);
+ Out[2] = (WORD) FROM_V2_TO_V4(Out[2]);
+ }
+}
+
+
+// Precomputes tables for 8-bit on input devicelink.
+//
+LPLUT _cmsBlessLUT8(LPLUT Lut)
+{
+ int i, j;
+ WORD StageABC[3];
+ Fixed32 v1, v2, v3;
+ LPL8PARAMS p8;
+ LPL16PARAMS p = &Lut ->CLut16params;
+
+
+ p8 = (LPL8PARAMS) malloc(sizeof(L8PARAMS));
+ if (p8 == NULL) return NULL;
+
+ // values comes * 257, so we can safely take first byte (x << 8 + x)
+ // if there are prelinearization, is already smelted in tables
+
+ for (i=0; i < 256; i++) {
+
+ StageABC[0] = StageABC[1] = StageABC[2] = RGB_8_TO_16(i);
+
+ if (Lut ->wFlags & LUT_HASTL1) {
+
+ for (j=0; j < 3; j++)
+ StageABC[i] = cmsLinearInterpLUT16(StageABC[i],
+ Lut -> L1[i],
+ &Lut -> In16params);
+ Lut ->wFlags &= ~LUT_HASTL1;
+ }
+
+
+ v1 = ToFixedDomain(StageABC[0] * p -> Domain);
+ v2 = ToFixedDomain(StageABC[1] * p -> Domain);
+ v3 = ToFixedDomain(StageABC[2] * p -> Domain);
+
+ p8 ->X0[i] = p->opta3 * FIXED_TO_INT(v1);
+ p8 ->Y0[i] = p->opta2 * FIXED_TO_INT(v2);
+ p8 ->Z0[i] = p->opta1 * FIXED_TO_INT(v3);
+
+ p8 ->rx[i] = (WORD) FIXED_REST_TO_INT(v1);
+ p8 ->ry[i] = (WORD) FIXED_REST_TO_INT(v2);
+ p8 ->rz[i] = (WORD) FIXED_REST_TO_INT(v3);
+
+ }
+
+ Lut -> CLut16params.p8 = p8;
+ Lut -> CLut16params.Interp3D = cmsTetrahedralInterp8;
+
+ return Lut;
+
+}
+
+
+
+
+// ----------------------------------------------------------- Reverse interpolation
+
+
+// Here's how it goes. The derivative Df(x) of the function f is the linear
+// transformation that best approximates f near the point x. It can be represented
+// by a matrix A whose entries are the partial derivatives of the components of f
+// with respect to all the coordinates. This is know as the Jacobian
+//
+// The best linear approximation to f is given by the matrix equation:
+//
+// y-y0 = A (x-x0)
+//
+// So, if x0 is a good "guess" for the zero of f, then solving for the zero of this
+// linear approximation will give a "better guess" for the zero of f. Thus let y=0,
+// and since y0=f(x0) one can solve the above equation for x. This leads to the
+// Newton's method formula:
+//
+// xn+1 = xn - A-1 f(xn)
+//
+// where xn+1 denotes the (n+1)-st guess, obtained from the n-th guess xn in the
+// fashion described above. Iterating this will give better and better approximations
+// if you have a "good enough" initial guess.
+
+
+#define JACOBIAN_EPSILON 0.001
+#define INVERSION_MAX_ITERATIONS 30
+
+
+// Evaluates the CLUT part of a LUT (3x3 only)
+
+static
+void EvalLUTdoubleK(LPLUT Lut, const VEC3* In, WORD FixedK, LPVEC3 Out)
+{
+ WORD wIn[4], wOut[3];
+
+ wIn[0] = (WORD) floor(In ->n[0] * 65535.0 + 0.5);
+ wIn[1] = (WORD) floor(In ->n[1] * 65535.0 + 0.5);
+ wIn[2] = (WORD) floor(In ->n[2] * 65535.0 + 0.5);
+ wIn[3] = FixedK;
+
+ cmsEvalLUT(Lut, wIn, wOut);
+
+ Out ->n[0] = (double) wOut[0] / 65535.0;
+ Out ->n[1] = (double) wOut[1] / 65535.0;
+ Out ->n[2] = (double) wOut[2] / 65535.0;
+}
+
+
+// Increment with reflexion on boundary
+
+static
+void IncDelta(double *Val)
+{
+ if (*Val < (1.0 - JACOBIAN_EPSILON))
+
+ *Val += JACOBIAN_EPSILON;
+
+ else
+ *Val -= JACOBIAN_EPSILON;
+
+}
+
+
+// Builds a Jacobian CMY->Lab
+
+static
+void ComputeJacobian(LPLUT Lut, LPMAT3 Jacobian, const VEC3* Colorant, WORD K)
+{
+ VEC3 ColorantD;
+ double DeltaColorant;
+ VEC3 Lab, LabD;
+ int i, j;
+
+ EvalLUTdoubleK(Lut, Colorant, K, &Lab);
+
+
+ for (j = 0; j < 3; j++) {
+
+ ColorantD.n[0] = Colorant ->n[0];
+ ColorantD.n[1] = Colorant ->n[1];
+ ColorantD.n[2] = Colorant ->n[2];
+
+ IncDelta(&ColorantD.n[j]);
+
+ EvalLUTdoubleK(Lut, &ColorantD, K, &LabD);
+
+ DeltaColorant = (Colorant->n[j] - ColorantD.n[j]);
+
+ for (i = 0; i < 3; i++) {
+
+ double DeltaTristim = (Lab.n[i] - LabD.n[i]);
+
+ Jacobian->v[i].n[j] = (DeltaTristim / DeltaColorant);
+ }
+ }
+}
+
+
+static
+void ToEncoded(WORD Encoded[3], LPVEC3 Float)
+{
+ Encoded[0] = (WORD) floor(Float->n[0] * 65535.0 + 0.5);
+ Encoded[1] = (WORD) floor(Float->n[1] * 65535.0 + 0.5);
+ Encoded[2] = (WORD) floor(Float->n[2] * 65535.0 + 0.5);
+}
+
+static
+void FromEncoded(LPVEC3 Float, WORD Encoded[3])
+{
+ Float->n[0] = Encoded[0] / 65535.0;
+ Float->n[1] = Encoded[1] / 65535.0;
+ Float->n[2] = Encoded[2] / 65535.0;
+}
+
+
+// Evaluate a LUT in reverse direction. It only searches on 3->3 LUT, but It
+// can be used on CMYK -> Lab LUT to obtain black preservation.
+// Target holds LabK in this case
+
+
+LCMSAPI double LCMSEXPORT cmsEvalLUTreverse(LPLUT Lut, WORD Target[], WORD Result[], LPWORD Hint)
+{
+ int i;
+ double error, LastError;
+ VEC3 Guess;
+ VEC3 Goal, TestPoint, Colorant;
+ MAT3 Jacobian, JacobianInverse;
+ WORD FixedK;
+ WORD LastResult[4];
+
+
+ // This is our Lab goal
+ FromEncoded(&Goal, Target);
+
+ // Special case for CMYK->Lab
+
+ if (Lut ->InputChan == 4)
+ FixedK = Target[3];
+ else
+ FixedK = 0;
+
+
+ // Take the hint as starting point if specified
+
+ if (Hint == NULL) {
+
+ // Begin at any point, we choose 1/3 of neutral CMY gray
+
+ Colorant.n[0] =
+ Colorant.n[1] =
+ Colorant.n[2] = 0.3;
+
+ }
+ else {
+ FromEncoded(&Colorant, Hint);
+ }
+
+
+ LastError = 1E20;
+
+ // Iterate
+
+ for (i = 0; i < INVERSION_MAX_ITERATIONS; i++) {
+
+ // Get beginning guess
+ EvalLUTdoubleK(Lut, &Colorant, FixedK, &Guess);
+
+ // Compute error
+ error = VEC3distance(&Guess, &Goal);
+
+ // If not convergent, return last safe value
+ if (error >= LastError)
+ break;
+
+ // Keep latest values
+ LastError = error;
+
+ ToEncoded(LastResult, &Colorant);
+ LastResult[3] = FixedK;
+
+
+ // Obtain slope
+ ComputeJacobian(Lut, &Jacobian, &Colorant, FixedK);
+
+ // Evaluate jacobian
+ MAT3eval(&TestPoint, &Jacobian, &Colorant);
+
+ // Move testpoint
+ TestPoint.n[0] += (Goal.n[0] - Guess.n[0]);
+ TestPoint.n[1] += (Goal.n[1] - Guess.n[1]);
+ TestPoint.n[2] += (Goal.n[2] - Guess.n[2]);
+
+ VEC3saturate(&TestPoint);
+
+ // Jacobian ^ -1
+ if (MAT3inverse(&Jacobian, &JacobianInverse) < 0) {
+
+ // Singular matrix,
+ break;
+ }
+
+
+ // Obtain colorant from current point
+ MAT3eval(&Colorant, &JacobianInverse, &TestPoint);
+
+ // Some clipping....
+ VEC3saturate(&Colorant);
+ }
+
+ Result[0] = LastResult[0];
+ Result[1] = LastResult[1];
+ Result[2] = LastResult[2];
+ Result[3] = LastResult[3];
+
+ return LastError;
+
+}
+
+
+
+
+
diff --git a/icc2ps/cmsmatsh.c b/icc2ps/cmsmatsh.c
new file mode 100644
index 0000000..1bd1c22
--- /dev/null
+++ b/icc2ps/cmsmatsh.c
@@ -0,0 +1,375 @@
+//
+// Little cms
+// Copyright (C) 1998-2005 Marti Maria
+//
+// Permission is hereby granted, free of charge, to any person obtaining
+// a copy of this software and associated documentation files (the "Software"),
+// to deal in the Software without restriction, including without limitation
+// the rights to use, copy, modify, merge, publish, distribute, sublicense,
+// and/or sell copies of the Software, and to permit persons to whom the Software
+// is furnished to do so, subject to the following conditions:
+//
+// The above copyright notice and this permission notice shall be included in
+// all copies or substantial portions of the Software.
+//
+// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
+// EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO
+// THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
+// NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
+// LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
+// OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
+// WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
+
+
+#include "lcms.h"
+
+
+// Shaper/Matrix handling
+// This routines handles the matrix-shaper method. A note about domain
+// is here required. If the shaper-matrix is invoked on INPUT profiles,
+// after the shaper process, we have a value between 0 and 0xFFFF. Thus,
+// for proper matrix handling, we must convert it to 15fix16, so
+// ToFixedDomain might be called. But cmsLinearInterpFixed() returns
+// data yet in fixed point, so no additional process is required.
+// Then, we obtain data on 15.16, so we need to shift >> by 1 to
+// obtain 1.15 PCS format.
+// On OUTPUT profiles, things are inverse, we must first expand 1 bit
+// by shifting left, and then convert result between 0 and 1.000 to
+// RGB, so FromFixedDomain() must be called before pass values to
+// shaper. Trickly, there is a situation where this shifts works
+// little different. Sometimes, lcms smelts input/output
+// matrices into a single, one shaper, process. In such cases, since
+// input is encoded from 0 to 0xffff, we must first use the shaper and
+// then the matrix, an additional FromFixedDomain() must be used to
+// accomodate output values.
+// For a sake of simplicity, I will handle this three behaviours
+// with different routines, so the flags MATSHAPER_INPUT and MATSHAPER_OUTPUT
+// can be conbined to signal smelted matrix-shapers
+
+
+
+static
+int ComputeTables(LPGAMMATABLE Table[3], LPWORD Out[3], LPL16PARAMS p16)
+{
+ int i, AllLinear;
+
+ cmsCalcL16Params(Table[0] -> nEntries, p16);
+
+ AllLinear = 0;
+ for (i=0; i < 3; i++)
+ {
+ LPWORD PtrW;
+
+ PtrW = (LPWORD) malloc(sizeof(WORD) * p16 -> nSamples);
+
+ if (PtrW == NULL) return -1; // Signal error
+
+ CopyMemory(PtrW, Table[i] -> GammaTable, sizeof(WORD) * Table[i] -> nEntries);
+
+ Out[i] = PtrW; // Set table pointer
+
+ // Linear after all?
+
+ AllLinear += cmsIsLinear(PtrW, p16 -> nSamples);
+ }
+
+ // If is all linear, then supress table interpolation (this
+ // will speed greately some trivial operations.
+ // Return 1 if present, 0 if all linear
+
+
+ if (AllLinear != 3) return 1;
+
+ return 0;
+
+}
+
+
+LPMATSHAPER cmsAllocMatShaper2(LPMAT3 Matrix, LPGAMMATABLE In[], LPGAMMATABLE Out[], DWORD Behaviour)
+{
+ LPMATSHAPER NewMatShaper;
+ int rc;
+
+ NewMatShaper = (LPMATSHAPER) malloc(sizeof(MATSHAPER));
+ if (NewMatShaper)
+ ZeroMemory(NewMatShaper, sizeof(MATSHAPER));
+
+ NewMatShaper->dwFlags = Behaviour & (MATSHAPER_ALLSMELTED);
+
+ // Fill matrix part
+
+ MAT3toFix(&NewMatShaper -> Matrix, Matrix);
+
+ // Reality check
+
+ if (!MAT3isIdentity(&NewMatShaper -> Matrix, 0.00001))
+ NewMatShaper -> dwFlags |= MATSHAPER_HASMATRIX;
+
+ // Now, on the table characteristics
+
+ if (Out) {
+
+ rc = ComputeTables(Out, NewMatShaper ->L, &NewMatShaper ->p16);
+ if (rc < 0) {
+ cmsFreeMatShaper(NewMatShaper);
+ return NULL;
+ }
+ if (rc == 1) NewMatShaper -> dwFlags |= MATSHAPER_HASSHAPER;
+ }
+
+
+ if (In) {
+
+ rc = ComputeTables(In, NewMatShaper ->L2, &NewMatShaper ->p2_16);
+ if (rc < 0) {
+ cmsFreeMatShaper(NewMatShaper);
+ return NULL;
+ }
+ if (rc == 1) NewMatShaper -> dwFlags |= MATSHAPER_HASINPSHAPER;
+ }
+
+
+ return NewMatShaper;
+
+}
+
+
+
+// Creation & Destruction
+
+LPMATSHAPER cmsAllocMatShaper(LPMAT3 Matrix, LPGAMMATABLE Tables[], DWORD Behaviour)
+{
+ LPMATSHAPER NewMatShaper;
+ int i, AllLinear;
+
+ NewMatShaper = (LPMATSHAPER) malloc(sizeof(MATSHAPER));
+ if (NewMatShaper)
+ ZeroMemory(NewMatShaper, sizeof(MATSHAPER));
+
+ NewMatShaper->dwFlags = Behaviour & (MATSHAPER_ALLSMELTED);
+
+ // Fill matrix part
+
+ MAT3toFix(&NewMatShaper -> Matrix, Matrix);
+
+ // Reality check
+
+ if (!MAT3isIdentity(&NewMatShaper -> Matrix, 0.00001))
+ NewMatShaper -> dwFlags |= MATSHAPER_HASMATRIX;
+
+ // Now, on the table characteristics
+
+ cmsCalcL16Params(Tables[0] -> nEntries, &NewMatShaper -> p16);
+
+ // Copy tables
+
+ AllLinear = 0;
+ for (i=0; i < 3; i++)
+ {
+ LPWORD PtrW;
+
+ PtrW = (LPWORD) malloc(sizeof(WORD) * NewMatShaper -> p16.nSamples);
+
+ if (PtrW == NULL) {
+ cmsFreeMatShaper(NewMatShaper);
+ return NULL;
+ }
+
+ CopyMemory(PtrW, Tables[i] -> GammaTable,
+ sizeof(WORD) * Tables[i] -> nEntries);
+
+ NewMatShaper -> L[i] = PtrW; // Set table pointer
+
+ // Linear after all?
+
+ AllLinear += cmsIsLinear(PtrW, NewMatShaper -> p16.nSamples);
+ }
+
+ // If is all linear, then supress table interpolation (this
+ // will speed greately some trivial operations
+
+ if (AllLinear != 3)
+ NewMatShaper -> dwFlags |= MATSHAPER_HASSHAPER;
+
+ return NewMatShaper;
+}
+
+
+
+// Free associated memory
+
+void cmsFreeMatShaper(LPMATSHAPER MatShaper)
+{
+ int i;
+
+ if (!MatShaper) return;
+
+ for (i=0; i < 3; i++)
+ {
+ if (MatShaper -> L[i]) free(MatShaper ->L[i]);
+ if (MatShaper -> L2[i]) free(MatShaper ->L2[i]);
+ }
+
+ free(MatShaper);
+}
+
+
+// All smelted must postpose gamma to last stage.
+
+static
+void AllSmeltedBehaviour(LPMATSHAPER MatShaper, WORD In[], WORD Out[])
+{
+
+ WORD tmp[3];
+ WVEC3 InVect, OutVect;
+
+ if (MatShaper -> dwFlags & MATSHAPER_HASINPSHAPER)
+ {
+ InVect.n[VX] = cmsLinearInterpFixed(In[0], MatShaper -> L2[0], &MatShaper -> p2_16);
+ InVect.n[VY] = cmsLinearInterpFixed(In[1], MatShaper -> L2[1], &MatShaper -> p2_16);
+ InVect.n[VZ] = cmsLinearInterpFixed(In[2], MatShaper -> L2[2], &MatShaper -> p2_16);
+ }
+ else
+ {
+ InVect.n[VX] = ToFixedDomain(In[0]);
+ InVect.n[VY] = ToFixedDomain(In[1]);
+ InVect.n[VZ] = ToFixedDomain(In[2]);
+ }
+
+
+ if (MatShaper -> dwFlags & MATSHAPER_HASMATRIX)
+ {
+
+ MAT3evalW(&OutVect, &MatShaper -> Matrix, &InVect);
+ }
+ else {
+
+ OutVect.n[VX] = InVect.n[VX];
+ OutVect.n[VY] = InVect.n[VY];
+ OutVect.n[VZ] = InVect.n[VZ];
+ }
+
+
+ tmp[0] = _cmsClampWord(FromFixedDomain(OutVect.n[VX]));
+ tmp[1] = _cmsClampWord(FromFixedDomain(OutVect.n[VY]));
+ tmp[2] = _cmsClampWord(FromFixedDomain(OutVect.n[VZ]));
+
+
+
+ if (MatShaper -> dwFlags & MATSHAPER_HASSHAPER)
+ {
+ Out[0] = cmsLinearInterpLUT16(tmp[0], MatShaper -> L[0], &MatShaper -> p16);
+ Out[1] = cmsLinearInterpLUT16(tmp[1], MatShaper -> L[1], &MatShaper -> p16);
+ Out[2] = cmsLinearInterpLUT16(tmp[2], MatShaper -> L[2], &MatShaper -> p16);
+ }
+ else
+ {
+ Out[0] = tmp[0];
+ Out[1] = tmp[1];
+ Out[2] = tmp[2];
+ }
+
+}
+
+
+static
+void InputBehaviour(LPMATSHAPER MatShaper, WORD In[], WORD Out[])
+{
+ WVEC3 InVect, OutVect;
+
+
+ if (MatShaper -> dwFlags & MATSHAPER_HASSHAPER)
+ {
+ InVect.n[VX] = cmsLinearInterpFixed(In[0], MatShaper -> L[0], &MatShaper -> p16);
+ InVect.n[VY] = cmsLinearInterpFixed(In[1], MatShaper -> L[1], &MatShaper -> p16);
+ InVect.n[VZ] = cmsLinearInterpFixed(In[2], MatShaper -> L[2], &MatShaper -> p16);
+ }
+ else
+ {
+ InVect.n[VX] = ToFixedDomain(In[0]);
+ InVect.n[VY] = ToFixedDomain(In[1]);
+ InVect.n[VZ] = ToFixedDomain(In[2]);
+ }
+
+ if (MatShaper -> dwFlags & MATSHAPER_HASMATRIX)
+ {
+ MAT3evalW(&OutVect, &MatShaper -> Matrix, &InVect);
+ }
+ else
+ {
+ OutVect = InVect;
+ }
+
+ // PCS in 1Fixed15 format, adjusting
+
+ Out[0] = _cmsClampWord((OutVect.n[VX]) >> 1);
+ Out[1] = _cmsClampWord((OutVect.n[VY]) >> 1);
+ Out[2] = _cmsClampWord((OutVect.n[VZ]) >> 1);
+
+}
+
+
+static
+void OutputBehaviour(LPMATSHAPER MatShaper, WORD In[], WORD Out[])
+{
+ WVEC3 InVect, OutVect;
+ int i;
+
+ // We need to convert from XYZ to RGB, here we must
+ // shift << 1 to pass between 1.15 to 15.16 formats
+
+ InVect.n[VX] = (Fixed32) In[0] << 1;
+ InVect.n[VY] = (Fixed32) In[1] << 1;
+ InVect.n[VZ] = (Fixed32) In[2] << 1;
+
+ if (MatShaper -> dwFlags & MATSHAPER_HASMATRIX)
+ {
+ MAT3evalW(&OutVect, &MatShaper -> Matrix, &InVect);
+ }
+ else
+ {
+ OutVect = InVect;
+ }
+
+
+ if (MatShaper -> dwFlags & MATSHAPER_HASSHAPER)
+ {
+ for (i=0; i < 3; i++)
+ {
+
+ Out[i] = cmsLinearInterpLUT16(
+ _cmsClampWord(FromFixedDomain(OutVect.n[i])),
+ MatShaper -> L[i],
+ &MatShaper ->p16);
+ }
+ }
+ else
+ {
+ // Result from fixed domain to RGB
+
+ Out[0] = _cmsClampWord(FromFixedDomain(OutVect.n[VX]));
+ Out[1] = _cmsClampWord(FromFixedDomain(OutVect.n[VY]));
+ Out[2] = _cmsClampWord(FromFixedDomain(OutVect.n[VZ]));
+ }
+
+}
+
+
+// Master on evaluating shapers, 3 different behaviours
+
+void cmsEvalMatShaper(LPMATSHAPER MatShaper, WORD In[], WORD Out[])
+{
+
+ if ((MatShaper -> dwFlags & MATSHAPER_ALLSMELTED) == MATSHAPER_ALLSMELTED)
+ {
+ AllSmeltedBehaviour(MatShaper, In, Out);
+ return;
+ }
+ if (MatShaper -> dwFlags & MATSHAPER_INPUT)
+ {
+ InputBehaviour(MatShaper, In, Out);
+ return;
+ }
+
+ OutputBehaviour(MatShaper, In, Out);
+}
diff --git a/icc2ps/cmsmtrx.c b/icc2ps/cmsmtrx.c
new file mode 100644
index 0000000..5475b4d
--- /dev/null
+++ b/icc2ps/cmsmtrx.c
@@ -0,0 +1,814 @@
+//
+// Little cms
+// Copyright (C) 1998-2005 Marti Maria
+//
+// Permission is hereby granted, free of charge, to any person obtaining
+// a copy of this software and associated documentation files (the "Software"),
+// to deal in the Software without restriction, including without limitation
+// the rights to use, copy, modify, merge, publish, distribute, sublicense,
+// and/or sell copies of the Software, and to permit persons to whom the Software
+// is furnished to do so, subject to the following conditions:
+//
+// The above copyright notice and this permission notice shall be included in
+// all copies or substantial portions of the Software.
+//
+// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
+// EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO
+// THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
+// NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
+// LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
+// OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
+// WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
+
+// Vector & Matrix stuff
+
+#include "lcms.h"
+
+
+void cdecl VEC3init(LPVEC3 r, double x, double y, double z);
+void cdecl VEC3initF(LPWVEC3 r, double x, double y, double z);
+void cdecl VEC3toFix(LPWVEC3 r, LPVEC3 v);
+void cdecl VEC3scaleFix(LPWORD r, LPWVEC3 Scale);
+void cdecl VEC3swap(LPVEC3 a, LPVEC3 b);
+void cdecl VEC3divK(LPVEC3 r, LPVEC3 v, double d);
+void cdecl VEC3perK(LPVEC3 r, LPVEC3 v, double d);
+void cdecl VEC3perComp(LPVEC3 r, LPVEC3 a, LPVEC3 b);
+void cdecl VEC3minus(LPVEC3 r, LPVEC3 a, LPVEC3 b);
+void cdecl VEC3scaleAndCut(LPWVEC3 r, LPVEC3 v, double d);
+void cdecl VEC3cross(LPVEC3 r, LPVEC3 u, LPVEC3 v);
+void cdecl VEC3saturate(LPVEC3 v);
+
+double cdecl VEC3length(LPVEC3 a);
+double cdecl VEC3distance(LPVEC3 a, LPVEC3 b);
+
+
+void cdecl MAT3identity(LPMAT3 a);
+void cdecl MAT3per(LPMAT3 r, LPMAT3 a, LPMAT3 b);
+int cdecl MAT3inverse(LPMAT3 a, LPMAT3 b);
+BOOL cdecl MAT3solve(LPVEC3 x, LPMAT3 a, LPVEC3 b);
+double cdecl MAT3det(LPMAT3 m);
+void cdecl MAT3eval(LPVEC3 r, LPMAT3 a, LPVEC3 v);
+void cdecl MAT3toFix(LPWMAT3 r, LPMAT3 v);
+void cdecl MAT3evalW(LPWVEC3 r, LPWMAT3 a, LPWVEC3 v);
+void cdecl MAT3perK(LPMAT3 r, LPMAT3 v, double d);
+void cdecl MAT3scaleAndCut(LPWMAT3 r, LPMAT3 v, double d);
+
+// --------------------- Implementation ----------------------------
+
+#define DSWAP(x, y) {double tmp = (x); (x)=(y); (y)=tmp;}
+
+
+
+#ifdef USE_ASSEMBLER
+
+
+#ifdef _MSC_VER
+#pragma warning(disable : 4033)
+#endif
+
+
+
+Fixed32 FixedMul(Fixed32 a, Fixed32 b)
+{
+ ASM {
+
+ mov eax, ss:a
+ mov edx, ss:b
+ imul edx
+ add eax, 0x8000
+ adc edx, 0
+ shrd eax, edx, 16
+
+ }
+
+ RET(_EAX);
+}
+
+
+
+
+Fixed32 FixedSquare(Fixed32 a)
+{
+ ASM {
+ pushf
+ push edx
+ mov eax, ss:a
+ imul eax
+ add eax, 0x8000
+ adc edx, 0
+ shrd eax, edx, 16
+ sar eax, 16
+ pop edx
+ popf
+ }
+
+ RET(_EAX);
+}
+
+
+
+
+// Linear intERPolation
+// a * (h - l) >> 16 + l
+
+Fixed32 FixedLERP(Fixed32 a, Fixed32 l, Fixed32 h)
+{
+ ASM {
+ mov eax, dword ptr ss:h
+ mov edx, dword ptr ss:l
+ push edx
+ mov ecx, dword ptr ss:a
+ sub eax, edx
+ imul ecx
+ add eax, 0x8000
+ adc edx, 0
+ shrd eax, edx, 16
+ pop edx
+ add eax, edx
+ }
+
+ RET(_EAX);
+}
+
+
+// a as word is scaled by s as float
+
+WORD FixedScale(WORD a, Fixed32 s)
+{
+ ASM {
+
+ xor eax,eax
+ mov ax, ss:a // This is faster that movzx eax, ss:a
+ sal eax, 16
+ mov edx, ss:s
+ mul edx
+ add eax, 0x8000
+ adc edx, 0
+ mov eax, edx
+ }
+
+ RET(_EAX);
+}
+
+#ifdef _MSC_VER
+#pragma warning(default : 4033)
+#endif
+
+#else
+
+
+// These are floating point versions for compilers that doesn't
+// support asm at all. Use with care, since this will slow down
+// all operations
+
+
+Fixed32 FixedMul(Fixed32 a, Fixed32 b)
+{
+#ifdef USE_INT64
+ LCMSULONGLONG l = (LCMSULONGLONG) (LCMSSLONGLONG) a * (LCMSULONGLONG) (LCMSSLONGLONG) b + (LCMSULONGLONG) 0x8000;
+ l >>= 16;
+ return (Fixed32) l;
+#else
+ return DOUBLE_TO_FIXED(FIXED_TO_DOUBLE(a) * FIXED_TO_DOUBLE(b));
+#endif
+}
+
+Fixed32 FixedSquare(Fixed32 a)
+{
+ return FixedMul(a, a);
+}
+
+
+Fixed32 FixedLERP(Fixed32 a, Fixed32 l, Fixed32 h)
+{
+#ifdef USE_INT64
+
+ LCMSULONGLONG dif = (LCMSULONGLONG) (h - l) * a + 0x8000;
+ dif = (dif >> 16) + l;
+ return (Fixed32) (dif);
+#else
+ double dif = h - l;
+
+ dif *= a;
+ dif /= 65536.0;
+ dif += l;
+
+ return (Fixed32) (dif + 0.5);
+#endif
+
+}
+
+
+WORD FixedScale(WORD a, Fixed32 s)
+{
+ return (WORD) (a * FIXED_TO_DOUBLE(s));
+}
+
+#endif
+
+
+#ifndef USE_INLINE
+
+Fixed32 ToFixedDomain(int a)
+{
+ return a + ((a + 0x7fff) / 0xffff);
+}
+
+
+int FromFixedDomain(Fixed32 a)
+{
+ return a - ((a + 0x7fff) >> 16);
+}
+
+#endif
+
+
+
+// Initiate a vector (double version)
+
+
+void VEC3init(LPVEC3 r, double x, double y, double z)
+{
+ r -> n[VX] = x;
+ r -> n[VY] = y;
+ r -> n[VZ] = z;
+}
+
+// Init a vector (fixed version)
+
+void VEC3initF(LPWVEC3 r, double x, double y, double z)
+{
+ r -> n[VX] = DOUBLE_TO_FIXED(x);
+ r -> n[VY] = DOUBLE_TO_FIXED(y);
+ r -> n[VZ] = DOUBLE_TO_FIXED(z);
+}
+
+
+// Convert to fixed point encoding is 1.0 = 0xFFFF
+
+void VEC3toFix(LPWVEC3 r, LPVEC3 v)
+{
+ r -> n[VX] = DOUBLE_TO_FIXED(v -> n[VX]);
+ r -> n[VY] = DOUBLE_TO_FIXED(v -> n[VY]);
+ r -> n[VZ] = DOUBLE_TO_FIXED(v -> n[VZ]);
+}
+
+// Convert from fixed point
+
+void VEC3fromFix(LPVEC3 r, LPWVEC3 v)
+{
+ r -> n[VX] = FIXED_TO_DOUBLE(v -> n[VX]);
+ r -> n[VY] = FIXED_TO_DOUBLE(v -> n[VY]);
+ r -> n[VZ] = FIXED_TO_DOUBLE(v -> n[VZ]);
+}
+
+
+// Swap two double vectors
+
+void VEC3swap(LPVEC3 a, LPVEC3 b)
+{
+ DSWAP(a-> n[VX], b-> n[VX]);
+ DSWAP(a-> n[VY], b-> n[VY]);
+ DSWAP(a-> n[VZ], b-> n[VZ]);
+}
+
+// Divide a vector by a constant
+
+void VEC3divK(LPVEC3 r, LPVEC3 v, double d)
+{
+ double d_inv = 1./d;
+
+ r -> n[VX] = v -> n[VX] * d_inv;
+ r -> n[VY] = v -> n[VY] * d_inv;
+ r -> n[VZ] = v -> n[VZ] * d_inv;
+}
+
+// Multiply by a constant
+
+void VEC3perK(LPVEC3 r, LPVEC3 v, double d )
+{
+ r -> n[VX] = v -> n[VX] * d;
+ r -> n[VY] = v -> n[VY] * d;
+ r -> n[VZ] = v -> n[VZ] * d;
+}
+
+
+void VEC3perComp(LPVEC3 r, LPVEC3 a, LPVEC3 b)
+{
+ r -> n[VX] = a->n[VX]*b->n[VX];
+ r -> n[VY] = a->n[VY]*b->n[VY];
+ r -> n[VZ] = a->n[VZ]*b->n[VZ];
+}
+
+// Minus
+
+
+void VEC3minus(LPVEC3 r, LPVEC3 a, LPVEC3 b)
+{
+ r -> n[VX] = a -> n[VX] - b -> n[VX];
+ r -> n[VY] = a -> n[VY] - b -> n[VY];
+ r -> n[VZ] = a -> n[VZ] - b -> n[VZ];
+}
+
+
+// Check id two vectors are the same, allowing tolerance
+
+static
+BOOL RangeCheck(double l, double h, double v)
+{
+ return (v >= l && v <= h);
+}
+
+
+BOOL VEC3equal(LPWVEC3 a, LPWVEC3 b, double Tolerance)
+{
+ int i;
+ double c;
+
+ for (i=0; i < 3; i++)
+ {
+ c = FIXED_TO_DOUBLE(a -> n[i]);
+ if (!RangeCheck(c - Tolerance,
+ c + Tolerance,
+ FIXED_TO_DOUBLE(b->n[i]))) return FALSE;
+ }
+
+ return TRUE;
+}
+
+BOOL VEC3equalF(LPVEC3 a, LPVEC3 b, double Tolerance)
+{
+ int i;
+ double c;
+
+ for (i=0; i < 3; i++)
+ {
+ c = a -> n[i];
+ if (!RangeCheck(c - Tolerance,
+ c + Tolerance,
+ b->n[i])) return FALSE;
+ }
+
+ return TRUE;
+}
+
+
+void VEC3scaleFix(LPWORD r, LPWVEC3 Scale)
+{
+ if (Scale -> n[VX] == 0x00010000L &&
+ Scale -> n[VY] == 0x00010000L &&
+ Scale -> n[VZ] == 0x00010000L) return;
+
+ r[0] = (WORD) FixedScale(r[0], Scale -> n[VX]);
+ r[1] = (WORD) FixedScale(r[1], Scale -> n[VY]);
+ r[2] = (WORD) FixedScale(r[2], Scale -> n[VZ]);
+
+}
+
+
+
+// Vector cross product
+
+void VEC3cross(LPVEC3 r, LPVEC3 u, LPVEC3 v)
+{
+
+ r ->n[VX] = u->n[VY] * v->n[VZ] - v->n[VY] * u->n[VZ];
+ r ->n[VY] = u->n[VZ] * v->n[VX] - v->n[VZ] * u->n[VX];
+ r ->n[VZ] = u->n[VX] * v->n[VY] - v->n[VX] * u->n[VY];
+}
+
+
+
+// The vector size
+
+double VEC3length(LPVEC3 a)
+{
+ return sqrt(a ->n[VX] * a ->n[VX] +
+ a ->n[VY] * a ->n[VY] +
+ a ->n[VZ] * a ->n[VZ]);
+}
+
+
+// Saturate a vector into 0..1.0 range
+
+void VEC3saturate(LPVEC3 v)
+{
+ int i;
+ for (i=0; i < 3; i++) {
+ if (v ->n[i] < 0)
+ v ->n[i] = 0;
+ else
+ if (v ->n[i] > 1.0)
+ v ->n[i] = 1.0;
+ }
+}
+
+
+// Euclidean distance
+
+double VEC3distance(LPVEC3 a, LPVEC3 b)
+{
+ double d1 = a ->n[VX] - b ->n[VX];
+ double d2 = a ->n[VY] - b ->n[VY];
+ double d3 = a ->n[VZ] - b ->n[VZ];
+
+ return sqrt(d1*d1 + d2*d2 + d3*d3);
+}
+
+
+// Identity
+
+
+void MAT3identity(LPMAT3 a)
+{
+ VEC3init(&a-> v[0], 1.0, 0.0, 0.0);
+ VEC3init(&a-> v[1], 0.0, 1.0, 0.0);
+ VEC3init(&a-> v[2], 0.0, 0.0, 1.0);
+}
+
+
+
+
+// Check if matrix is Identity. Allow a tolerance as %
+
+BOOL MAT3isIdentity(LPWMAT3 a, double Tolerance)
+{
+ int i;
+ MAT3 Idd;
+ WMAT3 Idf;
+
+ MAT3identity(&Idd);
+ MAT3toFix(&Idf, &Idd);
+
+ for (i=0; i < 3; i++)
+ if (!VEC3equal(&a -> v[i], &Idf.v[i], Tolerance)) return FALSE;
+
+ return TRUE;
+
+}
+
+// Multiply two matrices
+
+
+void MAT3per(LPMAT3 r, LPMAT3 a, LPMAT3 b)
+{
+#define ROWCOL(i, j) \
+ a->v[i].n[0]*b->v[0].n[j] + a->v[i].n[1]*b->v[1].n[j] + a->v[i].n[2]*b->v[2].n[j]
+
+ VEC3init(&r-> v[0], ROWCOL(0,0), ROWCOL(0,1), ROWCOL(0,2));
+ VEC3init(&r-> v[1], ROWCOL(1,0), ROWCOL(1,1), ROWCOL(1,2));
+ VEC3init(&r-> v[2], ROWCOL(2,0), ROWCOL(2,1), ROWCOL(2,2));
+
+#undef ROWCOL //(i, j)
+}
+
+
+
+// Inverse of a matrix b = a^(-1)
+// Gauss-Jordan elimination with partial pivoting
+
+int MAT3inverse(LPMAT3 a, LPMAT3 b)
+{
+ register int i, j, max;
+
+ MAT3identity(b);
+
+ // Loop over cols of a from left to right, eliminating above and below diag
+ for (j=0; j<3; j++) { // Find largest pivot in column j among rows j..2
+
+ max = j; // Row with largest pivot candidate
+ for (i=j+1; i<3; i++)
+ if (fabs(a -> v[i].n[j]) > fabs(a -> v[max].n[j]))
+ max = i;
+
+ // Swap rows max and j in a and b to put pivot on diagonal
+
+ VEC3swap(&a -> v[max], &a -> v[j]);
+ VEC3swap(&b -> v[max], &b -> v[j]);
+
+ // Scale row j to have a unit diagonal
+
+ if (a -> v[j].n[j]==0.)
+ return -1; // singular matrix; can't invert
+
+ VEC3divK(&b-> v[j], &b -> v[j], a->v[j].n[j]);
+ VEC3divK(&a-> v[j], &a -> v[j], a->v[j].n[j]);
+
+ // Eliminate off-diagonal elems in col j of a, doing identical ops to b
+ for (i=0; i<3; i++)
+
+ if (i !=j) {
+ VEC3 temp;
+
+ VEC3perK(&temp, &b -> v[j], a -> v[i].n[j]);
+ VEC3minus(&b -> v[i], &b -> v[i], &temp);
+
+ VEC3perK(&temp, &a -> v[j], a -> v[i].n[j]);
+ VEC3minus(&a -> v[i], &a -> v[i], &temp);
+ }
+ }
+
+ return 1;
+}
+
+
+// Solve a system in the form Ax = b
+
+BOOL MAT3solve(LPVEC3 x, LPMAT3 a, LPVEC3 b)
+{
+ MAT3 m, a_1;
+
+ CopyMemory(&m, a, sizeof(MAT3));
+
+ if (!MAT3inverse(&m, &a_1)) return FALSE; // Singular matrix
+
+ MAT3eval(x, &a_1, b);
+ return TRUE;
+}
+
+
+// The determinant
+
+double MAT3det(LPMAT3 m)
+{
+
+ double a1 = m ->v[VX].n[VX];
+ double a2 = m ->v[VX].n[VY];
+ double a3 = m ->v[VX].n[VZ];
+ double b1 = m ->v[VY].n[VX];
+ double b2 = m ->v[VY].n[VY];
+ double b3 = m ->v[VY].n[VZ];
+ double c1 = m ->v[VZ].n[VX];
+ double c2 = m ->v[VZ].n[VY];
+ double c3 = m ->v[VZ].n[VZ];
+
+
+ return a1*b2*c3 - a1*b3*c2 + a2*b3*c1 - a2*b1*c3 - a3*b1*c2 - a3*b2*c1;
+}
+
+
+// linear transform
+
+
+void MAT3eval(LPVEC3 r, LPMAT3 a, LPVEC3 v)
+{
+ r->n[VX] = a->v[0].n[VX]*v->n[VX] + a->v[0].n[VY]*v->n[VY] + a->v[0].n[VZ]*v->n[VZ];
+ r->n[VY] = a->v[1].n[VX]*v->n[VX] + a->v[1].n[VY]*v->n[VY] + a->v[1].n[VZ]*v->n[VZ];
+ r->n[VZ] = a->v[2].n[VX]*v->n[VX] + a->v[2].n[VY]*v->n[VY] + a->v[2].n[VZ]*v->n[VZ];
+}
+
+
+// Ok, this is another bottleneck of performance.
+
+
+#ifdef USE_ASSEMBLER
+
+// ecx:ebx is result in 64 bits format
+// edi points to matrix, esi points to input vector
+// since only 3 accesses are in output, this is a stack variable
+
+
+void MAT3evalW(LPWVEC3 r_, LPWMAT3 a_, LPWVEC3 v_)
+{
+
+ ASM {
+
+
+ mov esi, dword ptr ss:v_
+ mov edi, dword ptr ss:a_
+
+ // r->n[VX] = FixedMul(a->v[0].n[0], v->n[0]) +
+
+ mov eax,dword ptr [esi]
+ mov edx,dword ptr [edi]
+ imul edx
+ mov ecx, eax
+ mov ebx, edx
+
+ // FixedMul(a->v[0].n[1], v->n[1]) +
+
+ mov eax,dword ptr [esi+4]
+ mov edx,dword ptr [edi+4]
+ imul edx
+ add ecx, eax
+ adc ebx, edx
+
+ // FixedMul(a->v[0].n[2], v->n[2]);
+
+ mov eax,dword ptr [esi+8]
+ mov edx,dword ptr [edi+8]
+ imul edx
+ add ecx, eax
+ adc ebx, edx
+
+ // Back to Fixed 15.16
+
+ add ecx, 0x8000
+ adc ebx, 0
+ shrd ecx, ebx, 16
+
+ push edi
+ mov edi, dword ptr ss:r_
+ mov dword ptr [edi], ecx // r -> n[VX]
+ pop edi
+
+
+
+ // 2nd row ***************************
+
+ // FixedMul(a->v[1].n[0], v->n[0])
+
+ mov eax,dword ptr [esi]
+ mov edx,dword ptr [edi+12]
+ imul edx
+ mov ecx, eax
+ mov ebx, edx
+
+ // FixedMul(a->v[1].n[1], v->n[1]) +
+
+ mov eax,dword ptr [esi+4]
+ mov edx,dword ptr [edi+16]
+ imul edx
+ add ecx, eax
+ adc ebx, edx
+
+ // FixedMul(a->v[1].n[2], v->n[2]);
+
+ mov eax,dword ptr [esi+8]
+ mov edx,dword ptr [edi+20]
+ imul edx
+ add ecx, eax
+ adc ebx, edx
+
+ add ecx, 0x8000
+ adc ebx, 0
+ shrd ecx, ebx, 16
+
+ push edi
+ mov edi, dword ptr ss:r_
+ mov dword ptr [edi+4], ecx // r -> n[VY]
+ pop edi
+
+// 3d row **************************
+
+ // r->n[VZ] = FixedMul(a->v[2].n[0], v->n[0]) +
+
+ mov eax,dword ptr [esi]
+ mov edx,dword ptr [edi+24]
+ imul edx
+ mov ecx, eax
+ mov ebx, edx
+
+ // FixedMul(a->v[2].n[1], v->n[1]) +
+
+ mov eax,dword ptr [esi+4]
+ mov edx,dword ptr [edi+28]
+ imul edx
+ add ecx, eax
+ adc ebx, edx
+
+ // FixedMul(a->v[2].n[2], v->n[2]);
+
+ mov eax,dword ptr [esi+8]
+ mov edx,dword ptr [edi+32]
+ imul edx
+ add ecx, eax
+ adc ebx, edx
+
+ add ecx, 0x8000
+ adc ebx, 0
+ shrd ecx, ebx, 16
+
+ mov edi, dword ptr ss:r_
+ mov dword ptr [edi+8], ecx // r -> n[VZ]
+ }
+}
+
+
+#else
+
+
+#ifdef USE_FLOAT
+
+void MAT3evalW(LPWVEC3 r, LPWMAT3 a, LPWVEC3 v)
+{
+ r->n[VX] = DOUBLE_TO_FIXED(
+ FIXED_TO_DOUBLE(a->v[0].n[0]) * FIXED_TO_DOUBLE(v->n[0]) +
+ FIXED_TO_DOUBLE(a->v[0].n[1]) * FIXED_TO_DOUBLE(v->n[1]) +
+ FIXED_TO_DOUBLE(a->v[0].n[2]) * FIXED_TO_DOUBLE(v->n[2])
+ );
+
+ r->n[VY] = DOUBLE_TO_FIXED(
+ FIXED_TO_DOUBLE(a->v[1].n[0]) * FIXED_TO_DOUBLE(v->n[0]) +
+ FIXED_TO_DOUBLE(a->v[1].n[1]) * FIXED_TO_DOUBLE(v->n[1]) +
+ FIXED_TO_DOUBLE(a->v[1].n[2]) * FIXED_TO_DOUBLE(v->n[2])
+ );
+
+ r->n[VZ] = DOUBLE_TO_FIXED(
+ FIXED_TO_DOUBLE(a->v[2].n[0]) * FIXED_TO_DOUBLE(v->n[0]) +
+ FIXED_TO_DOUBLE(a->v[2].n[1]) * FIXED_TO_DOUBLE(v->n[1]) +
+ FIXED_TO_DOUBLE(a->v[2].n[2]) * FIXED_TO_DOUBLE(v->n[2])
+ );
+}
+
+
+#else
+
+void MAT3evalW(LPWVEC3 r, LPWMAT3 a, LPWVEC3 v)
+{
+
+#ifdef USE_INT64
+
+ LCMSULONGLONG l1 = (LCMSULONGLONG) (LCMSSLONGLONG) a->v[0].n[0] *
+ (LCMSULONGLONG) (LCMSSLONGLONG) v->n[0] +
+ (LCMSULONGLONG) (LCMSSLONGLONG) a->v[0].n[1] *
+ (LCMSULONGLONG) (LCMSSLONGLONG) v->n[1] +
+ (LCMSULONGLONG) (LCMSSLONGLONG) a->v[0].n[2] *
+ (LCMSULONGLONG) (LCMSSLONGLONG) v->n[2] + (LCMSULONGLONG) 0x8000;
+
+ LCMSULONGLONG l2 = (LCMSULONGLONG) (LCMSSLONGLONG) a->v[1].n[0] *
+ (LCMSULONGLONG) (LCMSSLONGLONG) v->n[0] +
+ (LCMSULONGLONG) (LCMSSLONGLONG) a->v[1].n[1] *
+ (LCMSULONGLONG) (LCMSSLONGLONG) v->n[1] +
+ (LCMSULONGLONG) (LCMSSLONGLONG) a->v[1].n[2] *
+ (LCMSULONGLONG) (LCMSSLONGLONG) v->n[2] + (LCMSULONGLONG) 0x8000;
+
+ LCMSULONGLONG l3 = (LCMSULONGLONG) (LCMSSLONGLONG) a->v[2].n[0] *
+ (LCMSULONGLONG) (LCMSSLONGLONG) v->n[0] +
+ (LCMSULONGLONG) (LCMSSLONGLONG) a->v[2].n[1] *
+ (LCMSULONGLONG) (LCMSSLONGLONG) v->n[1] +
+ (LCMSULONGLONG) (LCMSSLONGLONG) a->v[2].n[2] *
+ (LCMSULONGLONG) (LCMSSLONGLONG) v->n[2] + (LCMSULONGLONG) 0x8000;
+ l1 >>= 16;
+ l2 >>= 16;
+ l3 >>= 16;
+
+ r->n[VX] = (Fixed32) l1;
+ r->n[VY] = (Fixed32) l2;
+ r->n[VZ] = (Fixed32) l3;
+
+#else
+
+ // FIXME: Rounding should be done at very last stage. There is 1-Contone rounding error!
+
+ r->n[VX] = FixedMul(a->v[0].n[0], v->n[0]) +
+ FixedMul(a->v[0].n[1], v->n[1]) +
+ FixedMul(a->v[0].n[2], v->n[2]);
+
+ r->n[VY] = FixedMul(a->v[1].n[0], v->n[0]) +
+ FixedMul(a->v[1].n[1], v->n[1]) +
+ FixedMul(a->v[1].n[2], v->n[2]);
+
+ r->n[VZ] = FixedMul(a->v[2].n[0], v->n[0]) +
+ FixedMul(a->v[2].n[1], v->n[1]) +
+ FixedMul(a->v[2].n[2], v->n[2]);
+#endif
+}
+
+#endif
+#endif
+
+
+void MAT3perK(LPMAT3 r, LPMAT3 v, double d)
+{
+ VEC3perK(&r -> v[0], &v -> v[0], d);
+ VEC3perK(&r -> v[1], &v -> v[1], d);
+ VEC3perK(&r -> v[2], &v -> v[2], d);
+}
+
+
+void MAT3toFix(LPWMAT3 r, LPMAT3 v)
+{
+ VEC3toFix(&r -> v[0], &v -> v[0]);
+ VEC3toFix(&r -> v[1], &v -> v[1]);
+ VEC3toFix(&r -> v[2], &v -> v[2]);
+}
+
+void MAT3fromFix(LPMAT3 r, LPWMAT3 v)
+{
+ VEC3fromFix(&r -> v[0], &v -> v[0]);
+ VEC3fromFix(&r -> v[1], &v -> v[1]);
+ VEC3fromFix(&r -> v[2], &v -> v[2]);
+}
+
+
+
+// Scale v by d and store it in r giving INTEGER
+
+void VEC3scaleAndCut(LPWVEC3 r, LPVEC3 v, double d)
+{
+ r -> n[VX] = (int) floor(v -> n[VX] * d + .5);
+ r -> n[VY] = (int) floor(v -> n[VY] * d + .5);
+ r -> n[VZ] = (int) floor(v -> n[VZ] * d + .5);
+}
+
+void MAT3scaleAndCut(LPWMAT3 r, LPMAT3 v, double d)
+{
+ VEC3scaleAndCut(&r -> v[0], &v -> v[0], d);
+ VEC3scaleAndCut(&r -> v[1], &v -> v[1], d);
+ VEC3scaleAndCut(&r -> v[2], &v -> v[2], d);
+}
+
+
+
+
diff --git a/icc2ps/cmsnamed.c b/icc2ps/cmsnamed.c
new file mode 100644
index 0000000..ff24177
--- /dev/null
+++ b/icc2ps/cmsnamed.c
@@ -0,0 +1,171 @@
+//
+// Little cms
+// Copyright (C) 1998-2005 Marti Maria
+//
+// Permission is hereby granted, free of charge, to any person obtaining
+// a copy of this software and associated documentation files (the "Software"),
+// to deal in the Software without restriction, including without limitation
+// the rights to use, copy, modify, merge, publish, distribute, sublicense,
+// and/or sell copies of the Software, and to permit persons to whom the Software
+// is furnished to do so, subject to the following conditions:
+//
+// The above copyright notice and this permission notice shall be included in
+// all copies or substantial portions of the Software.
+//
+// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
+// EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO
+// THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
+// NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
+// LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
+// OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
+// WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
+
+
+// Named color support
+
+#include "lcms.h"
+
+
+
+static
+LPcmsNAMEDCOLORLIST GrowNamedColorList(LPcmsNAMEDCOLORLIST v, int ByElements)
+{
+ if (ByElements > v ->Allocated) {
+
+ LPcmsNAMEDCOLORLIST TheNewList;
+ int NewElements;
+ size_t size;
+
+ if (v ->Allocated == 0)
+ NewElements = 64; // Initial guess
+ else
+ NewElements = v ->Allocated;
+
+ while (ByElements > NewElements)
+ NewElements *= 2;
+
+ size = sizeof(cmsNAMEDCOLORLIST) + (sizeof(cmsNAMEDCOLOR) * NewElements);
+ TheNewList = (LPcmsNAMEDCOLORLIST) malloc(size);
+
+
+ if (TheNewList == NULL) {
+ cmsSignalError(LCMS_ERRC_ABORTED, "Out of memory reallocating named color list");
+ return NULL;
+ }
+ else {
+ ZeroMemory(TheNewList, size);
+ CopyMemory(TheNewList, v, sizeof(cmsNAMEDCOLORLIST) + (v ->nColors - 1) * sizeof(cmsNAMEDCOLOR));
+ TheNewList -> Allocated = NewElements;
+
+ free(v);
+ return TheNewList;
+ }
+ }
+
+ return v;
+}
+
+
+LPcmsNAMEDCOLORLIST cmsAllocNamedColorList(int n)
+{
+ size_t size = sizeof(cmsNAMEDCOLORLIST) + (n - 1) * sizeof(cmsNAMEDCOLOR);
+
+ LPcmsNAMEDCOLORLIST v = (LPcmsNAMEDCOLORLIST) malloc(size);
+
+
+ if (v == NULL) {
+ cmsSignalError(LCMS_ERRC_ABORTED, "Out of memory creating named color list");
+ return NULL;
+ }
+
+ ZeroMemory(v, size);
+
+ v ->nColors = n;
+ v ->Allocated = n;
+ v ->Prefix[0] = 0;
+ v ->Suffix[0] = 0;
+
+ return v;
+}
+
+void cmsFreeNamedColorList(LPcmsNAMEDCOLORLIST v)
+{
+ if (v == NULL) {
+ cmsSignalError(LCMS_ERRC_RECOVERABLE, "Couldn't free a NULL named color list");
+ return;
+ }
+
+ free(v);
+}
+
+BOOL cmsAppendNamedColor(cmsHTRANSFORM xform, const char* Name, WORD PCS[3], WORD Colorant[MAXCHANNELS])
+{
+ _LPcmsTRANSFORM v = (_LPcmsTRANSFORM) xform;
+ LPcmsNAMEDCOLORLIST List;
+ int i;
+
+ if (v ->NamedColorList == NULL) return FALSE;
+
+ v ->NamedColorList = GrowNamedColorList(v ->NamedColorList, v->NamedColorList ->nColors + 1);
+
+ List = v ->NamedColorList;
+
+ for (i=0; i < MAXCHANNELS; i++)
+ List ->List[List ->nColors].DeviceColorant[i] = Colorant[i];
+
+ for (i=0; i < 3; i++)
+ List ->List[List ->nColors].PCS[i] = PCS[i];
+
+ strncpy(List ->List[List ->nColors].Name, Name, MAX_PATH-1);
+
+ List ->nColors++;
+ return TRUE;
+}
+
+
+
+// Returns named color count
+
+int LCMSEXPORT cmsNamedColorCount(cmsHTRANSFORM xform)
+{
+ _LPcmsTRANSFORM v = (_LPcmsTRANSFORM) xform;
+
+ if (v ->NamedColorList == NULL) return 0;
+ return v ->NamedColorList ->nColors;
+}
+
+
+BOOL LCMSEXPORT cmsNamedColorInfo(cmsHTRANSFORM xform, int nColor, char* Name, char* Prefix, char* Suffix)
+{
+ _LPcmsTRANSFORM v = (_LPcmsTRANSFORM) xform;
+
+
+ if (v ->NamedColorList == NULL) return FALSE;
+
+ if (nColor < 0 || nColor >= cmsNamedColorCount(xform)) return FALSE;
+
+ if (Name) strncpy(Name, v ->NamedColorList->List[nColor].Name, 31);
+ if (Prefix) strncpy(Prefix, v ->NamedColorList->Prefix, 31);
+ if (Suffix) strncpy(Suffix, v ->NamedColorList->Suffix, 31);
+
+ return TRUE;
+}
+
+
+int LCMSEXPORT cmsNamedColorIndex(cmsHTRANSFORM xform, const char* Name)
+{
+ _LPcmsTRANSFORM v = (_LPcmsTRANSFORM) xform;
+ int i, n;
+
+ if (v ->NamedColorList == NULL) return -1;
+
+ n = cmsNamedColorCount(xform);
+ for (i=0; i < n; i++) {
+ if (stricmp(Name, v ->NamedColorList->List[i].Name) == 0)
+ return i;
+ }
+
+ return -1;
+}
+
+
diff --git a/icc2ps/cmspack.c b/icc2ps/cmspack.c
new file mode 100644
index 0000000..68ce9af
--- /dev/null
+++ b/icc2ps/cmspack.c
@@ -0,0 +1,2048 @@
+// Little cms
+// Copyright (C) 1998-2005 Marti Maria
+//
+// Permission is hereby granted, free of charge, to any person obtaining
+// a copy of this software and associated documentation files (the "Software"),
+// to deal in the Software without restriction, including without limitation
+// the rights to use, copy, modify, merge, publish, distribute, sublicense,
+// and/or sell copies of the Software, and to permit persons to whom the Software
+// is furnished to do so, subject to the following conditions:
+//
+// The above copyright notice and this permission notice shall be included in
+// all copies or substantial portions of the Software.
+//
+// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
+// EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO
+// THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
+// NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
+// LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
+// OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
+// WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
+
+
+#include "lcms.h"
+
+// This module handles all formats supported by lcms
+
+
+// ---------------------------------------------------------------------------
+
+
+// This macro return words stored as big endian
+
+#define CHANGE_ENDIAN(w) (WORD) ((WORD) ((w)<<8)|((w)>>8))
+
+// These macros handles reversing (negative)
+
+#define REVERSE_FLAVOR_8(x) ((BYTE) (0xff-(x)))
+#define REVERSE_FLAVOR_16(x) ((WORD)(0xffff-(x)))
+
+// Supress waning about info never being used
+
+#ifdef __BORLANDC__
+#pragma warn -par
+#endif
+
+#ifdef _MSC_VER
+#pragma warning(disable : 4100)
+#endif
+
+// -------------------------------------------------------- Unpacking routines.
+
+
+static
+LPBYTE UnrollAnyBytes(register _LPcmsTRANSFORM info, register WORD wIn[], register LPBYTE accum)
+{
+ int nChan = T_CHANNELS(info -> InputFormat);
+ register int i;
+
+ for (i=0; i < nChan; i++) {
+
+ wIn[i] = RGB_8_TO_16(*accum); accum++;
+ }
+
+ return accum + T_EXTRA(info -> InputFormat);
+}
+
+
+
+static
+LPBYTE Unroll4Bytes(register _LPcmsTRANSFORM info, register WORD wIn[], register LPBYTE accum)
+{
+ wIn[0] = RGB_8_TO_16(*accum); accum++; // C
+ wIn[1] = RGB_8_TO_16(*accum); accum++; // M
+ wIn[2] = RGB_8_TO_16(*accum); accum++; // Y
+ wIn[3] = RGB_8_TO_16(*accum); accum++; // K
+
+ return accum;
+}
+
+static
+LPBYTE Unroll4BytesReverse(register _LPcmsTRANSFORM info, register WORD wIn[], register LPBYTE accum)
+{
+ wIn[0] = RGB_8_TO_16(REVERSE_FLAVOR_8(*accum)); accum++; // C
+ wIn[1] = RGB_8_TO_16(REVERSE_FLAVOR_8(*accum)); accum++; // M
+ wIn[2] = RGB_8_TO_16(REVERSE_FLAVOR_8(*accum)); accum++; // Y
+ wIn[3] = RGB_8_TO_16(REVERSE_FLAVOR_8(*accum)); accum++; // K
+
+ return accum;
+}
+
+
+static
+LPBYTE Unroll4BytesSwapFirst(register _LPcmsTRANSFORM info, register WORD wIn[], register LPBYTE accum)
+{
+
+ wIn[3] = RGB_8_TO_16(*accum); accum++; // K
+ wIn[0] = RGB_8_TO_16(*accum); accum++; // C
+ wIn[1] = RGB_8_TO_16(*accum); accum++; // M
+ wIn[2] = RGB_8_TO_16(*accum); accum++; // Y
+
+
+ return accum;
+}
+
+
+
+// KYMC
+static
+LPBYTE Unroll4BytesSwap(register _LPcmsTRANSFORM info, register WORD wIn[], register LPBYTE accum)
+{
+ wIn[3] = RGB_8_TO_16(*accum); accum++; // K
+ wIn[2] = RGB_8_TO_16(*accum); accum++; // Y
+ wIn[1] = RGB_8_TO_16(*accum); accum++; // M
+ wIn[0] = RGB_8_TO_16(*accum); accum++; // C
+
+ return accum;
+}
+
+
+static
+LPBYTE Unroll4BytesSwapSwapFirst(register _LPcmsTRANSFORM info, register WORD wIn[], register LPBYTE accum)
+{
+ wIn[2] = RGB_8_TO_16(*accum); accum++; // K
+ wIn[1] = RGB_8_TO_16(*accum); accum++; // Y
+ wIn[0] = RGB_8_TO_16(*accum); accum++; // M
+ wIn[3] = RGB_8_TO_16(*accum); accum++; // C
+
+ return accum;
+}
+
+
+static
+LPBYTE UnrollAnyWords(register _LPcmsTRANSFORM info, register WORD wIn[], register LPBYTE accum)
+{
+ int nChan = T_CHANNELS(info -> InputFormat);
+ register int i;
+
+ for (i=0; i < nChan; i++) {
+
+ wIn[i] = *(LPWORD) accum; accum += 2;
+ }
+
+ return accum + T_EXTRA(info -> InputFormat) * sizeof(WORD);
+}
+
+
+static
+LPBYTE Unroll4Words(register _LPcmsTRANSFORM info, register WORD wIn[], register LPBYTE accum)
+{
+ wIn[0] = *(LPWORD) accum; accum+= 2; // C
+ wIn[1] = *(LPWORD) accum; accum+= 2; // M
+ wIn[2] = *(LPWORD) accum; accum+= 2; // Y
+ wIn[3] = *(LPWORD) accum; accum+= 2; // K
+
+ return accum;
+}
+
+static
+LPBYTE Unroll4WordsReverse(register _LPcmsTRANSFORM info, register WORD wIn[], register LPBYTE accum)
+{
+ wIn[0] = REVERSE_FLAVOR_16(*(LPWORD) accum); accum+= 2; // C
+ wIn[1] = REVERSE_FLAVOR_16(*(LPWORD) accum); accum+= 2; // M
+ wIn[2] = REVERSE_FLAVOR_16(*(LPWORD) accum); accum+= 2; // Y
+ wIn[3] = REVERSE_FLAVOR_16(*(LPWORD) accum); accum+= 2; // K
+
+ return accum;
+}
+
+
+static
+LPBYTE Unroll4WordsSwapFirst(register _LPcmsTRANSFORM info, register WORD wIn[], register LPBYTE accum)
+{
+ wIn[3] = *(LPWORD) accum; accum+= 2; // K
+ wIn[0] = *(LPWORD) accum; accum+= 2; // C
+ wIn[1] = *(LPWORD) accum; accum+= 2; // M
+ wIn[2] = *(LPWORD) accum; accum+= 2; // Y
+
+ return accum;
+}
+
+
+// KYMC
+static
+LPBYTE Unroll4WordsSwap(register _LPcmsTRANSFORM info, register WORD wIn[], register LPBYTE accum)
+{
+ wIn[3] = *(LPWORD) accum; accum+= 2; // K
+ wIn[2] = *(LPWORD) accum; accum+= 2; // Y
+ wIn[1] = *(LPWORD) accum; accum+= 2; // M
+ wIn[0] = *(LPWORD) accum; accum+= 2; // C
+
+ return accum;
+}
+
+static
+LPBYTE Unroll4WordsSwapSwapFirst(register _LPcmsTRANSFORM info, register WORD wIn[], register LPBYTE accum)
+{
+ wIn[2] = *(LPWORD) accum; accum+= 2; // K
+ wIn[1] = *(LPWORD) accum; accum+= 2; // Y
+ wIn[0] = *(LPWORD) accum; accum+= 2; // M
+ wIn[3] = *(LPWORD) accum; accum+= 2; // C
+
+ return accum;
+}
+
+
+static
+LPBYTE Unroll4WordsBigEndian(register _LPcmsTRANSFORM info, register WORD wIn[], register LPBYTE accum)
+{
+ wIn[0] = CHANGE_ENDIAN(*(LPWORD) accum); accum+= 2; //C
+ wIn[1] = CHANGE_ENDIAN(*(LPWORD) accum); accum+= 2; //M
+ wIn[2] = CHANGE_ENDIAN(*(LPWORD) accum); accum+= 2; //Y
+ wIn[3] = CHANGE_ENDIAN(*(LPWORD) accum); accum+= 2; //K
+
+ return accum;
+}
+
+static
+LPBYTE Unroll4WordsBigEndianReverse(register _LPcmsTRANSFORM info, register WORD wIn[], register LPBYTE accum)
+{
+ wIn[0] = REVERSE_FLAVOR_16(CHANGE_ENDIAN(*(LPWORD) accum)); accum+= 2; //C
+ wIn[1] = REVERSE_FLAVOR_16(CHANGE_ENDIAN(*(LPWORD) accum)); accum+= 2; //M
+ wIn[2] = REVERSE_FLAVOR_16(CHANGE_ENDIAN(*(LPWORD) accum)); accum+= 2; //Y
+ wIn[3] = REVERSE_FLAVOR_16(CHANGE_ENDIAN(*(LPWORD) accum)); accum+= 2; //K
+
+ return accum;
+}
+
+
+// KYMC
+static
+LPBYTE Unroll4WordsSwapBigEndian(register _LPcmsTRANSFORM info, register WORD wIn[], register LPBYTE accum)
+{
+ wIn[3] = CHANGE_ENDIAN(*(LPWORD) accum); accum+= 2; //K
+ wIn[2] = CHANGE_ENDIAN(*(LPWORD) accum); accum+= 2; //Y
+ wIn[1] = CHANGE_ENDIAN(*(LPWORD) accum); accum+= 2; //M
+ wIn[0] = CHANGE_ENDIAN(*(LPWORD) accum); accum+= 2; //C
+
+ return accum;
+}
+
+static
+LPBYTE Unroll3Bytes(register _LPcmsTRANSFORM info, register WORD wIn[], register LPBYTE accum)
+{
+
+ wIn[0] = RGB_8_TO_16(*accum); accum++; // R
+ wIn[1] = RGB_8_TO_16(*accum); accum++; // G
+ wIn[2] = RGB_8_TO_16(*accum); accum++; // B
+
+ return accum;
+}
+
+
+// Lab8 encoding using v2 PCS
+
+static
+LPBYTE Unroll3BytesLab(register _LPcmsTRANSFORM info, register WORD wIn[], register LPBYTE accum)
+{
+
+ wIn[0] = (WORD) ((*accum) << 8); accum++;
+ wIn[1] = (WORD) ((*accum) << 8); accum++;
+ wIn[2] = (WORD) ((*accum) << 8); accum++;
+
+ return accum;
+}
+
+
+// BRG
+
+static
+LPBYTE Unroll3BytesSwap(register _LPcmsTRANSFORM info, register WORD wIn[], register LPBYTE accum)
+{
+
+ wIn[2] = RGB_8_TO_16(*accum); accum++; // B
+ wIn[1] = RGB_8_TO_16(*accum); accum++; // G
+ wIn[0] = RGB_8_TO_16(*accum); accum++; // R
+
+ return accum;
+}
+
+static
+LPBYTE Unroll3Words(register _LPcmsTRANSFORM info, register WORD wIn[], register LPBYTE accum)
+{
+ wIn[0] = *(LPWORD) accum; accum+= 2; // C R
+ wIn[1] = *(LPWORD) accum; accum+= 2; // M G
+ wIn[2] = *(LPWORD) accum; accum+= 2; // Y B
+ return accum;
+}
+
+
+static
+LPBYTE Unroll3WordsSwap(register _LPcmsTRANSFORM info, register WORD wIn[], register LPBYTE accum)
+{
+ wIn[2] = *(LPWORD) accum; accum+= 2; // C R
+ wIn[1] = *(LPWORD) accum; accum+= 2; // M G
+ wIn[0] = *(LPWORD) accum; accum+= 2; // Y B
+ return accum;
+}
+
+
+static
+LPBYTE Unroll3WordsBigEndian(register _LPcmsTRANSFORM info, register WORD wIn[], register LPBYTE accum)
+{
+ wIn[0] = CHANGE_ENDIAN(*(LPWORD) accum); accum+= 2;
+ wIn[1] = CHANGE_ENDIAN(*(LPWORD) accum); accum+= 2;
+ wIn[2] = CHANGE_ENDIAN(*(LPWORD) accum); accum+= 2;
+ return accum;
+}
+
+
+static
+LPBYTE Unroll3WordsSwapBigEndian(register _LPcmsTRANSFORM info, register WORD wIn[], register LPBYTE accum)
+{
+ wIn[2] = CHANGE_ENDIAN(*(LPWORD) accum); accum+= 2;
+ wIn[1] = CHANGE_ENDIAN(*(LPWORD) accum); accum+= 2;
+ wIn[0] = CHANGE_ENDIAN(*(LPWORD) accum); accum+= 2;
+ return accum;
+}
+
+
+
+// Monochrome duplicates L into RGB for null-transforms
+
+static
+LPBYTE Unroll1Byte(register _LPcmsTRANSFORM info, register WORD wIn[], register LPBYTE accum)
+{
+ wIn[0] = wIn[1] = wIn[2] = RGB_8_TO_16(*accum); accum++; // L
+ return accum;
+}
+
+
+static
+LPBYTE Unroll1ByteSkip2(register _LPcmsTRANSFORM info, register WORD wIn[], register LPBYTE accum)
+{
+ wIn[0] = wIn[1] = wIn[2] = RGB_8_TO_16(*accum); accum++; // L
+ accum += 2;
+ return accum;
+}
+
+static
+LPBYTE Unroll1ByteReversed(register _LPcmsTRANSFORM info, register WORD wIn[], register LPBYTE accum)
+{
+ wIn[0] = wIn[1] = wIn[2] = REVERSE_FLAVOR_16(RGB_8_TO_16(*accum)); accum++; // L
+ return accum;
+}
+
+
+static
+LPBYTE Unroll1Word(register _LPcmsTRANSFORM info, register WORD wIn[], register LPBYTE accum)
+{
+ wIn[0] = wIn[1] = wIn[2] = *(LPWORD) accum; accum+= 2; // L
+ return accum;
+}
+
+static
+LPBYTE Unroll1WordReversed(register _LPcmsTRANSFORM info, register WORD wIn[], register LPBYTE accum)
+{
+ wIn[0] = wIn[1] = wIn[2] = REVERSE_FLAVOR_16(*(LPWORD) accum); accum+= 2;
+ return accum;
+}
+
+
+static
+LPBYTE Unroll1WordBigEndian(register _LPcmsTRANSFORM info, register WORD wIn[], register LPBYTE accum)
+{
+ wIn[0] = wIn[1] = wIn[2] = CHANGE_ENDIAN(*(LPWORD) accum); accum+= 2;
+ return accum;
+}
+
+static
+LPBYTE Unroll1WordSkip3(register _LPcmsTRANSFORM info, register WORD wIn[], register LPBYTE accum)
+{
+ wIn[0] = wIn[1] = wIn[2] = *(LPWORD) accum;
+
+ accum += 8;
+ return accum;
+}
+
+
+// Monochrome + alpha. Alpha is lost
+
+static
+LPBYTE Unroll2Byte(register _LPcmsTRANSFORM info, register WORD wIn[], register LPBYTE accum)
+{
+ wIn[0] = wIn[1] = wIn[2] = RGB_8_TO_16(*accum); accum++; // L
+ wIn[3] = RGB_8_TO_16(*accum); accum++; // alpha
+ return accum;
+}
+
+static
+LPBYTE Unroll2ByteSwapFirst(register _LPcmsTRANSFORM info, register WORD wIn[], register LPBYTE accum)
+{
+ wIn[3] = RGB_8_TO_16(*accum); accum++; // alpha
+ wIn[0] = wIn[1] = wIn[2] = RGB_8_TO_16(*accum); accum++; // L
+ return accum;
+}
+
+
+static
+LPBYTE Unroll2Word(register _LPcmsTRANSFORM info, register WORD wIn[], register LPBYTE accum)
+{
+ wIn[0] = wIn[1] = wIn[2] = *(LPWORD) accum; accum+= 2; // L
+ wIn[3] = *(LPWORD) accum; accum += 2; // alpha
+
+ return accum;
+}
+
+
+static
+LPBYTE Unroll2WordSwapFirst(register _LPcmsTRANSFORM info, register WORD wIn[], register LPBYTE accum)
+{
+ wIn[3] = *(LPWORD) accum; accum += 2; // alpha
+ wIn[0] = wIn[1] = wIn[2] = *(LPWORD) accum; accum+= 2; // L
+
+ return accum;
+}
+
+static
+LPBYTE Unroll2WordBigEndian(register _LPcmsTRANSFORM info, register WORD wIn[], register LPBYTE accum)
+{
+ wIn[0] = wIn[1] = wIn[2] = CHANGE_ENDIAN(*(LPWORD) accum); accum+= 2;
+ wIn[3] = CHANGE_ENDIAN(*(LPWORD) accum); accum+= 2;
+
+ return accum;
+}
+
+
+
+
+static
+LPBYTE UnrollPlanarBytes(register _LPcmsTRANSFORM info, register WORD wIn[], register LPBYTE accum)
+{
+ int nChan = T_CHANNELS(info -> InputFormat);
+ register int i;
+ LPBYTE Init = accum;
+
+ for (i=0; i < nChan; i++) {
+
+ wIn[i] = RGB_8_TO_16(*accum);
+ accum += info -> StrideIn;
+ }
+
+ return (Init + 1);
+}
+
+
+
+static
+LPBYTE UnrollPlanarWords(register _LPcmsTRANSFORM info, register WORD wIn[], register LPBYTE accum)
+{
+ int nChan = T_CHANNELS(info -> InputFormat);
+ register int i;
+ LPBYTE Init = accum;
+
+ for (i=0; i < nChan; i++) {
+
+ wIn[i] = *(LPWORD) accum;
+ accum += (info -> StrideIn * sizeof(WORD));
+ }
+
+ return (Init + sizeof(WORD));
+}
+
+
+
+static
+LPBYTE UnrollPlanarWordsBigEndian(register _LPcmsTRANSFORM info, register WORD wIn[], register LPBYTE accum)
+{
+ int nChan = T_CHANNELS(info -> InputFormat);
+ register int i;
+ LPBYTE Init = accum;
+
+ for (i=0; i < nChan; i++) {
+
+ wIn[i] = CHANGE_ENDIAN(*(LPWORD) accum);
+ accum += (info -> StrideIn * sizeof(WORD));
+ }
+
+ return (Init + sizeof(WORD));
+}
+
+
+// floating point
+static
+LPBYTE UnrollLabDouble(register _LPcmsTRANSFORM info, register WORD wIn[], register LPBYTE accum)
+{
+
+ if (T_PLANAR(info -> InputFormat)) {
+
+ double* Pt = (double*) accum;
+
+ cmsCIELab Lab;
+
+ Lab.L = Pt[0];
+ Lab.a = Pt[info->StrideIn];
+ Lab.b = Pt[info->StrideIn*2];
+
+ if (info ->lInputV4Lab)
+ cmsFloat2LabEncoded4(wIn, &Lab);
+ else
+ cmsFloat2LabEncoded(wIn, &Lab);
+
+ return accum + sizeof(double);
+ }
+ else {
+
+ if (info ->lInputV4Lab)
+ cmsFloat2LabEncoded4(wIn, (LPcmsCIELab) accum);
+ else
+ cmsFloat2LabEncoded(wIn, (LPcmsCIELab) accum);
+
+ accum += sizeof(cmsCIELab);
+
+ return accum;
+ }
+}
+
+static
+LPBYTE UnrollXYZDouble(register _LPcmsTRANSFORM info, register WORD wIn[], register LPBYTE accum)
+{
+ if (T_PLANAR(info -> InputFormat)) {
+
+ double* Pt = (double*) accum;
+ cmsCIEXYZ XYZ;
+
+ XYZ.X = Pt[0];
+ XYZ.Y = Pt[info->StrideIn];
+ XYZ.Z = Pt[info->StrideIn*2];
+ cmsFloat2XYZEncoded(wIn, &XYZ);
+
+ return accum + sizeof(double);
+
+ }
+
+ else {
+
+
+ cmsFloat2XYZEncoded(wIn, (LPcmsCIEXYZ) accum);
+ accum += sizeof(cmsCIEXYZ);
+
+ return accum;
+ }
+}
+
+
+
+// Inks does come in percentage
+static
+LPBYTE UnrollInkDouble(register _LPcmsTRANSFORM info, register WORD wIn[], register LPBYTE accum)
+{
+ double* Inks = (double*) accum;
+ int nChan = T_CHANNELS(info -> InputFormat);
+ int Planar = T_PLANAR(info -> InputFormat);
+ int i;
+ double v;
+
+ for (i=0; i < nChan; i++) {
+
+ if (Planar)
+
+ v = Inks[i * info ->StrideIn];
+ else
+ v = Inks[i];
+
+ v = floor(v * 655.35 + 0.5);
+
+ if (v > 65535.0) v = 65535.0;
+ if (v < 0) v = 0;
+
+ wIn[i] = (WORD) v;
+ }
+
+ if (T_PLANAR(info -> InputFormat))
+ return accum + sizeof(double);
+ else
+ return accum + (nChan + T_EXTRA(info ->InputFormat)) * sizeof(double);
+}
+
+
+// Remaining cases are between 0..1.0
+static
+LPBYTE UnrollDouble(register _LPcmsTRANSFORM info, register WORD wIn[], register LPBYTE accum)
+{
+ double* Inks = (double*) accum;
+ int nChan = T_CHANNELS(info -> InputFormat);
+ int Planar = T_PLANAR(info -> InputFormat);
+ int i;
+ double v;
+
+ for (i=0; i < nChan; i++) {
+
+ if (Planar)
+
+ v = Inks[i * info ->StrideIn];
+ else
+ v = Inks[i];
+
+ v = floor(v * 65535.0 + 0.5);
+
+ if (v > 65535.0) v = 65535.0;
+ if (v < 0) v = 0;
+
+ wIn[i] = (WORD) v;
+ }
+
+ if (T_PLANAR(info -> InputFormat))
+ return accum + sizeof(double);
+ else
+ return accum + (nChan + T_EXTRA(info ->InputFormat)) * sizeof(double);
+}
+
+
+
+// ----------------------------------------------------------- Packing routines
+
+
+// Generic chunky for byte
+
+static
+LPBYTE PackNBytes(register _LPcmsTRANSFORM info, register WORD wOut[], register LPBYTE output)
+{
+ int nChan = T_CHANNELS(info -> OutputFormat);
+ register int i;
+
+ for (i=0; i < nChan; i++)
+ *output++ = RGB_16_TO_8(wOut[i]);
+
+ return output + T_EXTRA(info ->OutputFormat);
+}
+
+// Chunky reversed order bytes
+
+static
+LPBYTE PackNBytesSwap(register _LPcmsTRANSFORM info, register WORD wOut[], register LPBYTE output)
+{
+ int nChan = T_CHANNELS(info -> OutputFormat);
+ register int i;
+
+ for (i=nChan-1; i >= 0; --i)
+ *output++ = RGB_16_TO_8(wOut[i]);
+
+ return output + T_EXTRA(info ->OutputFormat);
+
+}
+
+
+static
+LPBYTE PackNWords(register _LPcmsTRANSFORM info, register WORD wOut[], register LPBYTE output)
+{
+ int nChan = T_CHANNELS(info -> OutputFormat);
+ register int i;
+
+ for (i=0; i < nChan; i++) {
+ *(LPWORD) output = wOut[i];
+ output += sizeof(WORD);
+ }
+
+ return output + T_EXTRA(info ->OutputFormat) * sizeof(WORD);
+}
+
+static
+LPBYTE PackNWordsSwap(register _LPcmsTRANSFORM info, register WORD wOut[], register LPBYTE output)
+{
+ int nChan = T_CHANNELS(info -> OutputFormat);
+ register int i;
+
+ for (i=nChan-1; i >= 0; --i) {
+ *(LPWORD) output = wOut[i];
+ output += sizeof(WORD);
+ }
+
+ return output + T_EXTRA(info ->OutputFormat) * sizeof(WORD);
+}
+
+
+
+static
+LPBYTE PackNWordsBigEndian(register _LPcmsTRANSFORM info, register WORD wOut[], register LPBYTE output)
+{
+ int nChan = T_CHANNELS(info -> OutputFormat);
+ register int i;
+
+ for (i=0; i < nChan; i++) {
+ *(LPWORD) output = CHANGE_ENDIAN(wOut[i]);
+ output += sizeof(WORD);
+ }
+
+ return output + T_EXTRA(info ->OutputFormat) * sizeof(WORD);
+}
+
+
+static
+LPBYTE PackNWordsSwapBigEndian(register _LPcmsTRANSFORM info, register WORD wOut[], register LPBYTE output)
+{
+ int nChan = T_CHANNELS(info -> OutputFormat);
+ register int i;
+
+ for (i=nChan-1; i >= 0; --i) {
+ *(LPWORD) output = CHANGE_ENDIAN(wOut[i]);
+ output += sizeof(WORD);
+ }
+
+ return output + T_EXTRA(info ->OutputFormat) * sizeof(WORD);
+}
+
+
+static
+LPBYTE PackPlanarBytes(register _LPcmsTRANSFORM info, register WORD wOut[], register LPBYTE output)
+{
+ int nChan = T_CHANNELS(info -> OutputFormat);
+ register int i;
+ LPBYTE Init = output;
+
+ for (i=0; i < nChan; i++) {
+
+ *(LPBYTE) output = RGB_16_TO_8(wOut[i]);
+ output += info -> StrideOut;
+ }
+
+ return (Init + 1);
+}
+
+
+static
+LPBYTE PackPlanarWords(register _LPcmsTRANSFORM info, register WORD wOut[], register LPBYTE output)
+{
+ int nChan = T_CHANNELS(info -> OutputFormat);
+ register int i;
+ LPBYTE Init = output;
+
+ for (i=0; i < nChan; i++) {
+
+ *(LPWORD) output = wOut[i];
+ output += (info -> StrideOut * sizeof(WORD));
+ }
+
+ return (Init + 2);
+}
+
+
+// CMYKcm (unrolled for speed)
+
+static
+LPBYTE Pack6Bytes(register _LPcmsTRANSFORM info, register WORD wOut[], register LPBYTE output)
+{
+ *output++ = RGB_16_TO_8(wOut[0]);
+ *output++ = RGB_16_TO_8(wOut[1]);
+ *output++ = RGB_16_TO_8(wOut[2]);
+ *output++ = RGB_16_TO_8(wOut[3]);
+ *output++ = RGB_16_TO_8(wOut[4]);
+ *output++ = RGB_16_TO_8(wOut[5]);
+
+ return output;
+}
+
+// KCMYcm
+
+static
+LPBYTE Pack6BytesSwap(register _LPcmsTRANSFORM info, register WORD wOut[], register LPBYTE output)
+{
+ *output++ = RGB_16_TO_8(wOut[3]);
+ *output++ = RGB_16_TO_8(wOut[0]);
+ *output++ = RGB_16_TO_8(wOut[1]);
+ *output++ = RGB_16_TO_8(wOut[2]);
+ *output++ = RGB_16_TO_8(wOut[4]);
+ *output++ = RGB_16_TO_8(wOut[5]);
+
+ return output;
+}
+
+// CMYKcm
+static
+LPBYTE Pack6Words(register _LPcmsTRANSFORM info, register WORD wOut[], register LPBYTE output)
+{
+ *(LPWORD) output = wOut[0];
+ output+= 2;
+ *(LPWORD) output = wOut[1];
+ output+= 2;
+ *(LPWORD) output = wOut[2];
+ output+= 2;
+ *(LPWORD) output = wOut[3];
+ output+= 2;
+ *(LPWORD) output = wOut[4];
+ output+= 2;
+ *(LPWORD) output = wOut[5];
+ output+= 2;
+
+ return output;
+}
+
+// KCMYcm
+static
+LPBYTE Pack6WordsSwap(register _LPcmsTRANSFORM info, register WORD wOut[], register LPBYTE output)
+{
+ *(LPWORD) output = wOut[3];
+ output+= 2;
+ *(LPWORD) output = wOut[0];
+ output+= 2;
+ *(LPWORD) output = wOut[1];
+ output+= 2;
+ *(LPWORD) output = wOut[2];
+ output+= 2;
+ *(LPWORD) output = wOut[4];
+ output+= 2;
+ *(LPWORD) output = wOut[5];
+ output+= 2;
+
+ return output;
+}
+
+// CMYKcm
+static
+LPBYTE Pack6WordsBigEndian(register _LPcmsTRANSFORM info, register WORD wOut[], register LPBYTE output)
+{
+ *(LPWORD) output = CHANGE_ENDIAN(wOut[0]);
+ output+= 2;
+ *(LPWORD) output = CHANGE_ENDIAN(wOut[1]);
+ output+= 2;
+ *(LPWORD) output = CHANGE_ENDIAN(wOut[2]);
+ output+= 2;
+ *(LPWORD) output = CHANGE_ENDIAN(wOut[3]);
+ output+= 2;
+ *(LPWORD) output = CHANGE_ENDIAN(wOut[4]);
+ output+= 2;
+ *(LPWORD) output = CHANGE_ENDIAN(wOut[5]);
+ output+= 2;
+
+ return output;
+}
+
+// KCMYcm
+static
+LPBYTE Pack6WordsSwapBigEndian(register _LPcmsTRANSFORM info, register WORD wOut[], register LPBYTE output)
+{
+ *(LPWORD) output = CHANGE_ENDIAN(wOut[3]);
+ output+= 2;
+ *(LPWORD) output = CHANGE_ENDIAN(wOut[0]);
+ output+= 2;
+ *(LPWORD) output = CHANGE_ENDIAN(wOut[1]);
+ output+= 2;
+ *(LPWORD) output = CHANGE_ENDIAN(wOut[2]);
+ output+= 2;
+ *(LPWORD) output = CHANGE_ENDIAN(wOut[4]);
+ output+= 2;
+ *(LPWORD) output = CHANGE_ENDIAN(wOut[5]);
+ output+= 2;
+
+ return output;
+}
+
+
+static
+LPBYTE Pack4Bytes(register _LPcmsTRANSFORM info, register WORD wOut[], register LPBYTE output)
+{
+ *output++ = RGB_16_TO_8(wOut[0]);
+ *output++ = RGB_16_TO_8(wOut[1]);
+ *output++ = RGB_16_TO_8(wOut[2]);
+ *output++ = RGB_16_TO_8(wOut[3]);
+
+ return output;
+}
+
+static
+LPBYTE Pack4BytesReverse(register _LPcmsTRANSFORM info, register WORD wOut[], register LPBYTE output)
+{
+ *output++ = REVERSE_FLAVOR_8(RGB_16_TO_8(wOut[0]));
+ *output++ = REVERSE_FLAVOR_8(RGB_16_TO_8(wOut[1]));
+ *output++ = REVERSE_FLAVOR_8(RGB_16_TO_8(wOut[2]));
+ *output++ = REVERSE_FLAVOR_8(RGB_16_TO_8(wOut[3]));
+
+ return output;
+}
+
+
+static
+LPBYTE Pack4BytesSwapFirst(register _LPcmsTRANSFORM info, register WORD wOut[], register LPBYTE output)
+{
+ *output++ = RGB_16_TO_8(wOut[3]);
+ *output++ = RGB_16_TO_8(wOut[0]);
+ *output++ = RGB_16_TO_8(wOut[1]);
+ *output++ = RGB_16_TO_8(wOut[2]);
+
+ return output;
+}
+
+
+// ABGR
+
+static
+LPBYTE Pack4BytesSwap(register _LPcmsTRANSFORM info, register WORD wOut[], register LPBYTE output)
+{
+ *output++ = RGB_16_TO_8(wOut[3]);
+ *output++ = RGB_16_TO_8(wOut[2]);
+ *output++ = RGB_16_TO_8(wOut[1]);
+ *output++ = RGB_16_TO_8(wOut[0]);
+
+ return output;
+}
+
+
+static
+LPBYTE Pack4BytesSwapSwapFirst(register _LPcmsTRANSFORM info, register WORD wOut[], register LPBYTE output)
+{
+ *output++ = RGB_16_TO_8(wOut[2]);
+ *output++ = RGB_16_TO_8(wOut[1]);
+ *output++ = RGB_16_TO_8(wOut[0]);
+ *output++ = RGB_16_TO_8(wOut[3]);
+
+ return output;
+}
+
+
+static
+LPBYTE Pack4Words(register _LPcmsTRANSFORM info, register WORD wOut[], register LPBYTE output)
+{
+ *(LPWORD) output = wOut[0];
+ output+= 2;
+ *(LPWORD) output = wOut[1];
+ output+= 2;
+ *(LPWORD) output = wOut[2];
+ output+= 2;
+ *(LPWORD) output = wOut[3];
+ output+= 2;
+
+ return output;
+}
+
+
+static
+LPBYTE Pack4WordsReverse(register _LPcmsTRANSFORM info, register WORD wOut[], register LPBYTE output)
+{
+ *(LPWORD) output = REVERSE_FLAVOR_16(wOut[0]);
+ output+= 2;
+ *(LPWORD) output = REVERSE_FLAVOR_16(wOut[1]);
+ output+= 2;
+ *(LPWORD) output = REVERSE_FLAVOR_16(wOut[2]);
+ output+= 2;
+ *(LPWORD) output = REVERSE_FLAVOR_16(wOut[3]);
+ output+= 2;
+
+ return output;
+}
+
+// ABGR
+
+static
+LPBYTE Pack4WordsSwap(register _LPcmsTRANSFORM info, register WORD wOut[], register LPBYTE output)
+{
+ *(LPWORD) output = wOut[3];
+ output+= 2;
+ *(LPWORD) output = wOut[2];
+ output+= 2;
+ *(LPWORD) output = wOut[1];
+ output+= 2;
+ *(LPWORD) output = wOut[0];
+ output+= 2;
+
+ return output;
+}
+
+// CMYK
+static
+LPBYTE Pack4WordsBigEndian(register _LPcmsTRANSFORM info, register WORD wOut[], register LPBYTE output)
+{
+ *(LPWORD) output = CHANGE_ENDIAN(wOut[0]);
+ output+= 2;
+ *(LPWORD) output = CHANGE_ENDIAN(wOut[1]);
+ output+= 2;
+ *(LPWORD) output = CHANGE_ENDIAN(wOut[2]);
+ output+= 2;
+ *(LPWORD) output = CHANGE_ENDIAN(wOut[3]);
+ output+= 2;
+
+ return output;
+}
+
+
+static
+LPBYTE Pack4WordsBigEndianReverse(register _LPcmsTRANSFORM info, register WORD wOut[], register LPBYTE output)
+{
+ *(LPWORD) output = CHANGE_ENDIAN(REVERSE_FLAVOR_16(wOut[0]));
+ output+= 2;
+ *(LPWORD) output = CHANGE_ENDIAN(REVERSE_FLAVOR_16(wOut[1]));
+ output+= 2;
+ *(LPWORD) output = CHANGE_ENDIAN(REVERSE_FLAVOR_16(wOut[2]));
+ output+= 2;
+ *(LPWORD) output = CHANGE_ENDIAN(REVERSE_FLAVOR_16(wOut[3]));
+ output+= 2;
+
+ return output;
+}
+
+// KYMC
+
+static
+LPBYTE Pack4WordsSwapBigEndian(register _LPcmsTRANSFORM info, register WORD wOut[], register LPBYTE output)
+{
+ *(LPWORD) output = CHANGE_ENDIAN(wOut[3]);
+ output+= 2;
+ *(LPWORD) output = CHANGE_ENDIAN(wOut[2]);
+ output+= 2;
+ *(LPWORD) output = CHANGE_ENDIAN(wOut[1]);
+ output+= 2;
+ *(LPWORD) output = CHANGE_ENDIAN(wOut[0]);
+ output+= 2;
+
+ return output;
+}
+
+static
+LPBYTE Pack3Bytes(register _LPcmsTRANSFORM info, register WORD wOut[], register LPBYTE output)
+{
+ *output++ = RGB_16_TO_8(wOut[0]);
+ *output++ = RGB_16_TO_8(wOut[1]);
+ *output++ = RGB_16_TO_8(wOut[2]);
+
+ return output;
+}
+
+static
+LPBYTE Pack3BytesLab(register _LPcmsTRANSFORM info, register WORD wOut[], register LPBYTE output)
+{
+ *output++ = (BYTE) (wOut[0] >> 8);
+ *output++ = (BYTE) (wOut[1] >> 8);
+ *output++ = (BYTE) (wOut[2] >> 8);
+
+ return output;
+}
+
+
+static
+LPBYTE Pack3BytesSwap(register _LPcmsTRANSFORM info, register WORD wOut[], register LPBYTE output)
+{
+ *output++ = RGB_16_TO_8(wOut[2]);
+ *output++ = RGB_16_TO_8(wOut[1]);
+ *output++ = RGB_16_TO_8(wOut[0]);
+
+ return output;
+}
+
+
+static
+LPBYTE Pack3Words(register _LPcmsTRANSFORM info, register WORD wOut[], register LPBYTE output)
+{
+ *(LPWORD) output = wOut[0];
+ output+= 2;
+ *(LPWORD) output = wOut[1];
+ output+= 2;
+ *(LPWORD) output = wOut[2];
+ output+= 2;
+
+ return output;
+}
+
+static
+LPBYTE Pack3WordsSwap(register _LPcmsTRANSFORM info, register WORD wOut[], register LPBYTE output)
+{
+ *(LPWORD) output = wOut[2];
+ output+= 2;
+ *(LPWORD) output = wOut[1];
+ output+= 2;
+ *(LPWORD) output = wOut[0];
+ output+= 2;
+
+ return output;
+}
+
+static
+LPBYTE Pack3WordsBigEndian(register _LPcmsTRANSFORM info, register WORD wOut[], register LPBYTE output)
+{
+ *(LPWORD) output = CHANGE_ENDIAN(wOut[0]);
+ output+= 2;
+ *(LPWORD) output = CHANGE_ENDIAN(wOut[1]);
+ output+= 2;
+ *(LPWORD) output = CHANGE_ENDIAN(wOut[2]);
+ output+= 2;
+
+ return output;
+}
+
+
+static
+LPBYTE Pack3WordsSwapBigEndian(register _LPcmsTRANSFORM Info, register WORD wOut[], register LPBYTE output)
+{
+ *(LPWORD) output = CHANGE_ENDIAN(wOut[2]);
+ output+= 2;
+ *(LPWORD) output = CHANGE_ENDIAN(wOut[1]);
+ output+= 2;
+ *(LPWORD) output = CHANGE_ENDIAN(wOut[0]);
+ output+= 2;
+
+ return output;
+}
+
+
+static
+LPBYTE Pack3BytesAndSkip1(register _LPcmsTRANSFORM Info, register WORD wOut[], register LPBYTE output)
+{
+ *output++ = RGB_16_TO_8(wOut[0]);
+ *output++ = RGB_16_TO_8(wOut[1]);
+ *output++ = RGB_16_TO_8(wOut[2]);
+ output++;
+
+ return output;
+}
+
+
+static
+LPBYTE Pack3BytesAndSkip1SwapFirst(register _LPcmsTRANSFORM Info, register WORD wOut[], register LPBYTE output)
+{
+ output++;
+ *output++ = RGB_16_TO_8(wOut[0]);
+ *output++ = RGB_16_TO_8(wOut[1]);
+ *output++ = RGB_16_TO_8(wOut[2]);
+
+ return output;
+}
+
+static
+LPBYTE Pack3BytesAndSkip1Swap(register _LPcmsTRANSFORM Info, register WORD wOut[], register LPBYTE output)
+{
+ output++;
+ *output++ = RGB_16_TO_8(wOut[2]);
+ *output++ = RGB_16_TO_8(wOut[1]);
+ *output++ = RGB_16_TO_8(wOut[0]);
+
+ return output;
+}
+
+
+static
+LPBYTE Pack3BytesAndSkip1SwapSwapFirst(register _LPcmsTRANSFORM Info, register WORD wOut[], register LPBYTE output)
+{
+ *output++ = RGB_16_TO_8(wOut[2]);
+ *output++ = RGB_16_TO_8(wOut[1]);
+ *output++ = RGB_16_TO_8(wOut[0]);
+ output++;
+
+ return output;
+}
+
+
+static
+LPBYTE Pack3WordsAndSkip1(register _LPcmsTRANSFORM Info, register WORD wOut[], register LPBYTE output)
+{
+ *(LPWORD) output = wOut[0];
+ output+= 2;
+ *(LPWORD) output = wOut[1];
+ output+= 2;
+ *(LPWORD) output = wOut[2];
+ output+= 2;
+ output+= 2;
+
+ return output;
+}
+
+static
+LPBYTE Pack3WordsAndSkip1Swap(register _LPcmsTRANSFORM Info, register WORD wOut[], register LPBYTE output)
+{
+ output+= 2;
+ *(LPWORD) output = wOut[2];
+ output+= 2;
+ *(LPWORD) output = wOut[1];
+ output+= 2;
+ *(LPWORD) output = wOut[0];
+ output+= 2;
+
+
+ return output;
+}
+
+
+static
+LPBYTE Pack3WordsAndSkip1SwapSwapFirst(register _LPcmsTRANSFORM Info, register WORD wOut[], register LPBYTE output)
+{
+ *(LPWORD) output = wOut[2];
+ output+= 2;
+ *(LPWORD) output = wOut[1];
+ output+= 2;
+ *(LPWORD) output = wOut[0];
+ output+= 2;
+ output+= 2;
+
+
+ return output;
+}
+
+
+static
+LPBYTE Pack3WordsAndSkip1BigEndian(register _LPcmsTRANSFORM Info, register WORD wOut[], register LPBYTE output)
+{
+ *(LPWORD) output = CHANGE_ENDIAN(wOut[0]);
+ output+= 2;
+ *(LPWORD) output = CHANGE_ENDIAN(wOut[1]);
+ output+= 2;
+ *(LPWORD) output = CHANGE_ENDIAN(wOut[2]);
+ output+= 2;
+ output+= 2;
+
+ return output;
+}
+
+
+static
+LPBYTE Pack3WordsAndSkip1SwapBigEndian(register _LPcmsTRANSFORM Info, register WORD wOut[], register LPBYTE output)
+{
+ output+= 2;
+ *(LPWORD) output = CHANGE_ENDIAN(wOut[2]);
+ output+= 2;
+ *(LPWORD) output = CHANGE_ENDIAN(wOut[1]);
+ output+= 2;
+ *(LPWORD) output = CHANGE_ENDIAN(wOut[0]);
+ output+= 2;
+
+
+ return output;
+}
+
+
+
+static
+LPBYTE Pack1Byte(register _LPcmsTRANSFORM Info, register WORD wOut[], register LPBYTE output)
+{
+ *output++ = RGB_16_TO_8(wOut[0]);
+ return output;
+}
+
+
+static
+LPBYTE Pack1ByteAndSkip1(register _LPcmsTRANSFORM Info, register WORD wOut[], register LPBYTE output)
+{
+ *output++ = RGB_16_TO_8(wOut[0]);
+ output++;
+ return output;
+}
+
+
+static
+LPBYTE Pack1ByteAndSkip1SwapFirst(register _LPcmsTRANSFORM Info, register WORD wOut[], register LPBYTE output)
+{
+ output++;
+ *output++ = RGB_16_TO_8(wOut[0]);
+
+ return output;
+}
+
+static
+LPBYTE Pack1Word(register _LPcmsTRANSFORM Info, register WORD wOut[], register LPBYTE output)
+{
+ *(LPWORD) output = wOut[0];
+ output+= 2;
+
+ return output;
+}
+
+static
+LPBYTE Pack1WordBigEndian(register _LPcmsTRANSFORM Info, register WORD wOut[], register LPBYTE output)
+{
+ *(LPWORD) output = CHANGE_ENDIAN(wOut[0]);
+ output+= 2;
+
+ return output;
+}
+
+
+static
+LPBYTE Pack1WordAndSkip1(register _LPcmsTRANSFORM Info, register WORD wOut[], register LPBYTE output)
+{
+ *(LPWORD) output = wOut[0];
+ output+= 4;
+
+ return output;
+}
+
+static
+LPBYTE Pack1WordAndSkip1SwapFirst(register _LPcmsTRANSFORM Info, register WORD wOut[], register LPBYTE output)
+{
+ output += 2;
+ *(LPWORD) output = wOut[0];
+ output+= 2;
+
+ return output;
+}
+
+
+static
+LPBYTE Pack1WordAndSkip1BigEndian(register _LPcmsTRANSFORM Info, register WORD wOut[], register LPBYTE output)
+{
+ *(LPWORD) output = CHANGE_ENDIAN(wOut[0]);
+ output+= 4;
+
+ return output;
+}
+
+
+// Unencoded Float values -- don't try optimize speed
+
+static
+LPBYTE PackLabDouble(register _LPcmsTRANSFORM Info, register WORD wOut[], register LPBYTE output)
+{
+
+ if (T_PLANAR(Info -> OutputFormat)) {
+
+ cmsCIELab Lab;
+ double* Out = (double*) output;
+ cmsLabEncoded2Float(&Lab, wOut);
+
+ Out[0] = Lab.L;
+ Out[Info ->StrideOut] = Lab.a;
+ Out[Info ->StrideOut*2] = Lab.b;
+
+ return output + sizeof(double);
+
+ }
+ else {
+
+ if (Info ->lOutputV4Lab)
+ cmsLabEncoded2Float4((LPcmsCIELab) output, wOut);
+ else
+ cmsLabEncoded2Float((LPcmsCIELab) output, wOut);
+
+ output += sizeof(cmsCIELab);
+
+ return output;
+ }
+
+}
+
+static
+LPBYTE PackXYZDouble(register _LPcmsTRANSFORM Info, register WORD wOut[], register LPBYTE output)
+{
+
+ if (T_PLANAR(Info -> OutputFormat)) {
+
+ cmsCIEXYZ XYZ;
+ double* Out = (double*) output;
+ cmsXYZEncoded2Float(&XYZ, wOut);
+
+ Out[0] = XYZ.X;
+ Out[Info ->StrideOut] = XYZ.Y;
+ Out[Info ->StrideOut*2] = XYZ.Z;
+
+ return output + sizeof(double);
+
+ }
+ else {
+
+ cmsXYZEncoded2Float((LPcmsCIEXYZ) output, wOut);
+ output += sizeof(cmsCIEXYZ);
+
+ return output;
+ }
+}
+
+
+
+static
+LPBYTE PackInkDouble(register _LPcmsTRANSFORM Info, register WORD wOut[], register LPBYTE output)
+{
+ double* Inks = (double*) output;
+ int nChan = T_CHANNELS(Info -> OutputFormat);
+ int i;
+
+ if (T_PLANAR(Info -> OutputFormat)) {
+
+ for (i=0; i < nChan; i++) {
+
+ Inks[i*Info ->StrideOut] = wOut[i] / 655.35;
+ }
+
+ return output + sizeof(double);
+ }
+ else {
+
+ for (i=0; i < nChan; i++) {
+
+ Inks[i] = wOut[i] / 655.35;
+ }
+
+
+ return output + (nChan + T_EXTRA(Info ->OutputFormat)) * sizeof(double);
+ }
+
+}
+
+
+static
+LPBYTE PackDouble(register _LPcmsTRANSFORM Info, register WORD wOut[], register LPBYTE output)
+{
+ double* Inks = (double*) output;
+ int nChan = T_CHANNELS(Info -> OutputFormat);
+ int i;
+
+
+ if (T_PLANAR(Info -> OutputFormat)) {
+
+ for (i=0; i < nChan; i++) {
+
+ Inks[i*Info ->StrideOut] = wOut[i] / 65535.0;
+ }
+
+ return output + sizeof(double);
+
+ }
+ else {
+ for (i=0; i < nChan; i++) {
+
+ Inks[i] = wOut[i] / 65535.0;
+ }
+
+ return output + (nChan + T_EXTRA(Info ->OutputFormat)) * sizeof(double);
+ }
+
+}
+
+
+// choose routine from Input identifier
+
+_cmsFIXFN _cmsIdentifyInputFormat(_LPcmsTRANSFORM xform, DWORD dwInput)
+{
+ _cmsFIXFN FromInput = NULL;
+
+
+ // Check Named Color
+
+ if (xform) {
+
+ if (xform ->InputProfile) {
+
+ if (cmsGetDeviceClass(xform ->InputProfile) == icSigNamedColorClass) {
+
+ if (dwInput != TYPE_NAMED_COLOR_INDEX) {
+ cmsSignalError(LCMS_ERRC_ABORTED, "Named color needs TYPE_NAMED_COLOR_INDEX");
+ return NULL;
+ }
+ }
+
+ }
+ }
+
+ // Unencoded modes
+
+ if (T_BYTES(dwInput) == 0) {
+
+ switch (T_COLORSPACE(dwInput)) {
+
+ case PT_Lab:
+ FromInput = UnrollLabDouble;
+ break;
+ case PT_XYZ:
+ FromInput = UnrollXYZDouble;
+ break;
+
+ // 0.0 .. 1.0 range
+
+ case PT_GRAY:
+ case PT_RGB:
+ case PT_YCbCr:
+ case PT_YUV:
+ case PT_YUVK:
+ case PT_HSV:
+ case PT_HLS:
+ case PT_Yxy:
+ FromInput = UnrollDouble;
+ break;
+
+ // Inks (%) 0.0 .. 100.0
+
+ default:
+ FromInput = UnrollInkDouble;
+ break;
+ }
+
+ }
+ else {
+
+ if (T_PLANAR(dwInput)) {
+
+ switch (T_BYTES(dwInput)) {
+
+ case 1:
+ FromInput = UnrollPlanarBytes;
+ break;
+
+ case 2:
+ if (T_ENDIAN16(dwInput))
+ FromInput = UnrollPlanarWordsBigEndian;
+ else
+ FromInput = UnrollPlanarWords;
+ break;
+
+ default:;
+ }
+ }
+ else {
+
+ switch (T_BYTES(dwInput)) {
+
+ case 1: // 1 byte per channel
+
+ switch (T_CHANNELS(dwInput) + T_EXTRA(dwInput)) {
+
+ case 1: if (T_FLAVOR(dwInput))
+ FromInput = Unroll1ByteReversed;
+ else
+ FromInput = Unroll1Byte;
+ break;
+
+ case 2: if (T_SWAPFIRST(dwInput))
+ FromInput = Unroll2ByteSwapFirst;
+ else
+ FromInput = Unroll2Byte;
+ break;
+
+ case 3: if (T_DOSWAP(dwInput))
+ FromInput = Unroll3BytesSwap;
+ else {
+ if (T_EXTRA(dwInput) == 2)
+ FromInput = Unroll1ByteSkip2;
+ else
+ if (T_COLORSPACE(dwInput) == PT_Lab)
+ FromInput = Unroll3BytesLab;
+ else
+ FromInput = Unroll3Bytes;
+ }
+ break;
+ case 4:
+ // TODO: ALab8 must be fixed to match v2 encoding
+
+ if (T_DOSWAP(dwInput)) {
+ if (T_SWAPFIRST(dwInput))
+
+ FromInput = Unroll4BytesSwapSwapFirst;
+ else
+ FromInput = Unroll4BytesSwap;
+ }
+ else {
+ if (T_SWAPFIRST(dwInput))
+ FromInput = Unroll4BytesSwapFirst;
+ else {
+ if (T_FLAVOR(dwInput))
+ FromInput = Unroll4BytesReverse;
+ else
+ FromInput = Unroll4Bytes;
+ }
+ }
+ break;
+
+
+ case 5:
+ case 6:
+ case 7:
+ case 8:
+ if (!T_DOSWAP(dwInput) && !T_SWAPFIRST(dwInput))
+ FromInput = UnrollAnyBytes;
+ break;
+
+
+ default:;
+ }
+ break;
+
+
+ case 2: // 1 word per channel
+
+ switch (T_CHANNELS(dwInput) + T_EXTRA(dwInput))
+ {
+ case 1: if (T_ENDIAN16(dwInput))
+ FromInput = Unroll1WordBigEndian;
+ else
+ if (T_FLAVOR(dwInput))
+ FromInput = Unroll1WordReversed;
+ else
+ FromInput = Unroll1Word;
+ break;
+
+ case 2: if (T_ENDIAN16(dwInput))
+ FromInput = Unroll2WordBigEndian;
+ else {
+ if (T_SWAPFIRST(dwInput))
+ FromInput = Unroll2WordSwapFirst;
+ else
+ FromInput = Unroll2Word;
+ }
+ break;
+
+ case 3: if (T_DOSWAP(dwInput)) {
+ if (T_ENDIAN16(dwInput))
+ FromInput = Unroll3WordsSwapBigEndian;
+ else
+ FromInput = Unroll3WordsSwap;
+ }
+ else {
+ if (T_ENDIAN16(dwInput))
+ FromInput = Unroll3WordsBigEndian;
+ else
+ FromInput = Unroll3Words;
+ }
+ break;
+
+ case 4: if (T_DOSWAP(dwInput)) {
+
+ if (T_ENDIAN16(dwInput))
+ FromInput = Unroll4WordsSwapBigEndian;
+ else {
+
+ if (T_SWAPFIRST(dwInput))
+ FromInput = Unroll4WordsSwapSwapFirst;
+ else
+ FromInput = Unroll4WordsSwap;
+
+ }
+
+ }
+ else {
+
+ if (T_EXTRA(dwInput) == 3)
+ FromInput = Unroll1WordSkip3;
+ else
+
+ if (T_ENDIAN16(dwInput)) {
+
+ if (T_FLAVOR(dwInput))
+ FromInput = Unroll4WordsBigEndianReverse;
+ else
+ FromInput = Unroll4WordsBigEndian;
+ }
+ else {
+ if (T_SWAPFIRST(dwInput))
+ FromInput = Unroll4WordsSwapFirst;
+ else {
+ if (T_FLAVOR(dwInput))
+ FromInput = Unroll4WordsReverse;
+ else
+ FromInput = Unroll4Words;
+ }
+ }
+ }
+ break;
+
+
+ case 5:
+ case 6:
+ case 7:
+ case 8:
+ if (!T_DOSWAP(dwInput) && !T_SWAPFIRST(dwInput))
+ FromInput = UnrollAnyWords;
+ break;
+
+ }
+ break;
+
+ default:;
+ }
+ }
+ }
+
+
+ if (!FromInput)
+ cmsSignalError(LCMS_ERRC_ABORTED, "Unknown input format");
+
+ return FromInput;
+}
+
+// choose routine from Input identifier
+
+_cmsFIXFN _cmsIdentifyOutputFormat(_LPcmsTRANSFORM xform, DWORD dwOutput)
+{
+ _cmsFIXFN ToOutput = NULL;
+
+
+ if (T_BYTES(dwOutput) == 0) {
+
+ switch (T_COLORSPACE(dwOutput)) {
+
+ case PT_Lab:
+ ToOutput = PackLabDouble;
+ break;
+ case PT_XYZ:
+ ToOutput = PackXYZDouble;
+ break;
+
+ // 0.0 .. 1.0 range
+ case PT_GRAY:
+ case PT_RGB:
+ case PT_YCbCr:
+ case PT_YUV:
+ case PT_YUVK:
+ case PT_HSV:
+ case PT_HLS:
+ case PT_Yxy:
+ ToOutput = PackDouble;
+ break;
+
+ // Inks (%) 0.0 .. 100.0
+
+ default:
+ ToOutput = PackInkDouble;
+ break;
+ }
+
+ }
+ else
+
+ if (T_PLANAR(dwOutput)) {
+
+ switch (T_BYTES(dwOutput)) {
+
+ case 1: ToOutput = PackPlanarBytes;
+ break;
+
+ case 2:if (!T_ENDIAN16(dwOutput))
+ ToOutput = PackPlanarWords;
+ break;
+
+ default:;
+ }
+ }
+ else {
+
+ switch (T_BYTES(dwOutput)) {
+
+ case 1:
+ switch (T_CHANNELS(dwOutput))
+ {
+ case 1:
+ ToOutput = Pack1Byte;
+ if (T_EXTRA(dwOutput) == 1) {
+ if (T_SWAPFIRST(dwOutput))
+ ToOutput = Pack1ByteAndSkip1SwapFirst;
+ else
+ ToOutput = Pack1ByteAndSkip1;
+ }
+ break;
+
+ case 3:
+ switch (T_EXTRA(dwOutput)) {
+
+ case 0: if (T_DOSWAP(dwOutput))
+ ToOutput = Pack3BytesSwap;
+ else
+ if (T_COLORSPACE(dwOutput) == PT_Lab)
+ ToOutput = Pack3BytesLab;
+ else
+ ToOutput = Pack3Bytes;
+ break;
+
+ case 1: // TODO: ALab8 should be handled here
+
+ if (T_DOSWAP(dwOutput)) {
+
+ if (T_SWAPFIRST(dwOutput))
+ ToOutput = Pack3BytesAndSkip1SwapSwapFirst;
+ else
+ ToOutput = Pack3BytesAndSkip1Swap;
+ }
+ else {
+ if (T_SWAPFIRST(dwOutput))
+ ToOutput = Pack3BytesAndSkip1SwapFirst;
+ else
+ ToOutput = Pack3BytesAndSkip1;
+ }
+ break;
+
+ default:;
+ }
+ break;
+
+ case 4: if (T_EXTRA(dwOutput) == 0) {
+
+ if (T_DOSWAP(dwOutput)) {
+
+ if (T_SWAPFIRST(dwOutput))
+ ToOutput = Pack4BytesSwapSwapFirst;
+ else
+ ToOutput = Pack4BytesSwap;
+ }
+ else {
+ if (T_SWAPFIRST(dwOutput))
+ ToOutput = Pack4BytesSwapFirst;
+ else {
+
+ if (T_FLAVOR(dwOutput))
+ ToOutput = Pack4BytesReverse;
+ else
+ ToOutput = Pack4Bytes;
+ }
+ }
+ }
+ else {
+ if (!T_DOSWAP(dwOutput) && !T_SWAPFIRST(dwOutput))
+ ToOutput = PackNBytes;
+ }
+ break;
+
+ // Hexachrome separations.
+ case 6: if (T_EXTRA(dwOutput) == 0) {
+
+ if( T_DOSWAP(dwOutput))
+ ToOutput = Pack6BytesSwap;
+ else
+ ToOutput = Pack6Bytes;
+ }
+ else {
+ if (!T_DOSWAP(dwOutput) && !T_SWAPFIRST(dwOutput))
+ ToOutput = PackNBytes;
+
+ }
+ break;
+
+ case 2:
+ case 5:
+ case 7:
+ case 8:
+ case 9:
+ case 10:
+ case 11:
+ case 12:
+ case 13:
+ case 14:
+ case 15:
+
+ if ((T_EXTRA(dwOutput) == 0) && (T_SWAPFIRST(dwOutput) == 0))
+ {
+ if (T_DOSWAP(dwOutput))
+ ToOutput = PackNBytesSwap;
+ else
+ ToOutput = PackNBytes;
+ }
+ break;
+
+ default:;
+ }
+ break;
+
+
+ case 2:
+
+ switch (T_CHANNELS(dwOutput)) {
+
+ case 1:
+ if (T_ENDIAN16(dwOutput))
+
+ ToOutput = Pack1WordBigEndian;
+ else
+ ToOutput = Pack1Word;
+
+ if (T_EXTRA(dwOutput) == 1) {
+
+ if (T_ENDIAN16(dwOutput))
+
+ ToOutput = Pack1WordAndSkip1BigEndian;
+ else {
+ if (T_SWAPFIRST(dwOutput))
+ ToOutput = Pack1WordAndSkip1SwapFirst;
+ else
+ ToOutput = Pack1WordAndSkip1;
+ }
+ }
+ break;
+
+ case 3:
+
+ switch (T_EXTRA(dwOutput)) {
+
+ case 0:
+ if (T_DOSWAP(dwOutput)) {
+
+ if (T_ENDIAN16(dwOutput))
+
+ ToOutput = Pack3WordsSwapBigEndian;
+ else
+ ToOutput = Pack3WordsSwap;
+ }
+ else {
+ if (T_ENDIAN16(dwOutput))
+
+ ToOutput = Pack3WordsBigEndian;
+ else
+ ToOutput = Pack3Words;
+ }
+ break;
+
+ case 1: if (T_DOSWAP(dwOutput)) {
+
+ if (T_ENDIAN16(dwOutput))
+
+ ToOutput = Pack3WordsAndSkip1SwapBigEndian;
+ else {
+ if (T_SWAPFIRST(dwOutput))
+ ToOutput = Pack3WordsAndSkip1SwapSwapFirst;
+ else
+ ToOutput = Pack3WordsAndSkip1Swap;
+ }
+ }
+ else {
+ if (T_ENDIAN16(dwOutput))
+ ToOutput = Pack3WordsAndSkip1BigEndian;
+ else
+ ToOutput = Pack3WordsAndSkip1;
+ }
+ default:;
+ }
+ break;
+
+ case 4: if (T_EXTRA(dwOutput) == 0) {
+
+ if (T_DOSWAP(dwOutput)) {
+
+ if (T_ENDIAN16(dwOutput))
+ ToOutput = Pack4WordsSwapBigEndian;
+ else
+ ToOutput = Pack4WordsSwap;
+ }
+ else {
+
+ if (T_ENDIAN16(dwOutput)) {
+
+ if (T_FLAVOR(dwOutput))
+ ToOutput = Pack4WordsBigEndianReverse;
+ else
+ ToOutput = Pack4WordsBigEndian;
+ }
+ else {
+ if (T_FLAVOR(dwOutput))
+ ToOutput = Pack4WordsReverse;
+ else
+ ToOutput = Pack4Words;
+ }
+ }
+ }
+ else {
+ if (!T_DOSWAP(dwOutput) && !T_SWAPFIRST(dwOutput))
+ ToOutput = PackNWords;
+ }
+ break;
+
+ case 6: if (T_EXTRA(dwOutput) == 0) {
+
+ if (T_DOSWAP(dwOutput)) {
+
+ if (T_ENDIAN16(dwOutput))
+ ToOutput = Pack6WordsSwapBigEndian;
+ else
+ ToOutput = Pack6WordsSwap;
+ }
+ else {
+
+ if (T_ENDIAN16(dwOutput))
+ ToOutput = Pack6WordsBigEndian;
+ else
+ ToOutput = Pack6Words;
+ }
+ }
+ else {
+ if (!T_DOSWAP(dwOutput) && !T_SWAPFIRST(dwOutput))
+ ToOutput = PackNWords;
+ }
+ break;
+
+
+ case 2:
+ case 5:
+ case 7:
+ case 8:
+ case 9:
+ case 10:
+ case 11:
+ case 12:
+ case 13:
+ case 14:
+ case 15: if ((T_EXTRA(dwOutput) == 0) && (T_SWAPFIRST(dwOutput) == 0)) {
+
+ if (T_DOSWAP(dwOutput)) {
+
+ if (T_ENDIAN16(dwOutput))
+ ToOutput = PackNWordsSwapBigEndian;
+ else
+ ToOutput = PackNWordsSwap;
+ }
+ else {
+
+ if (T_ENDIAN16(dwOutput))
+ ToOutput = PackNWordsBigEndian;
+ else
+ ToOutput = PackNWords;
+ }
+ }
+ break;
+
+ default:;
+ }
+ break;
+
+ default:;
+ }
+ }
+
+ if (!ToOutput)
+ cmsSignalError(LCMS_ERRC_ABORTED, "Unknown output format");
+
+ return ToOutput;
+}
+
+// User formatters for (weird) cases not already included
+
+void LCMSEXPORT cmsSetUserFormatters(cmsHTRANSFORM hTransform, DWORD dwInput, cmsFORMATTER Input,
+ DWORD dwOutput, cmsFORMATTER Output)
+{
+ _LPcmsTRANSFORM xform = (_LPcmsTRANSFORM) (LPSTR) hTransform;
+
+ if (Input != NULL) {
+ xform ->FromInput = (_cmsFIXFN) Input;
+ xform ->InputFormat = dwInput;
+ }
+
+ if (Output != NULL) {
+ xform ->ToOutput = (_cmsFIXFN) Output;
+ xform ->OutputFormat = dwOutput;
+ }
+
+}
+
+void LCMSEXPORT cmsGetUserFormatters(cmsHTRANSFORM hTransform,
+ LPDWORD InputFormat, cmsFORMATTER* Input,
+ LPDWORD OutputFormat, cmsFORMATTER* Output)
+{
+ _LPcmsTRANSFORM xform = (_LPcmsTRANSFORM) (LPSTR) hTransform;
+
+ *Input = (cmsFORMATTER) xform ->FromInput;
+ *InputFormat = xform -> InputFormat;
+ *Output = (cmsFORMATTER) xform ->ToOutput;
+ *OutputFormat = xform -> OutputFormat;
+}
+
+
+// Change format of yet existing transform. No colorspace checking is performed
+
+void LCMSEXPORT cmsChangeBuffersFormat(cmsHTRANSFORM hTransform,
+ DWORD dwInputFormat,
+ DWORD dwOutputFormat)
+{
+
+ cmsSetUserFormatters(hTransform,
+ dwInputFormat,
+ (cmsFORMATTER) _cmsIdentifyInputFormat((_LPcmsTRANSFORM ) hTransform, dwInputFormat),
+ dwOutputFormat,
+ (cmsFORMATTER) _cmsIdentifyOutputFormat((_LPcmsTRANSFORM ) hTransform, dwOutputFormat));
+}
diff --git a/icc2ps/cmspcs.c b/icc2ps/cmspcs.c
new file mode 100644
index 0000000..0f618d3
--- /dev/null
+++ b/icc2ps/cmspcs.c
@@ -0,0 +1,597 @@
+//
+// Little cms
+// Copyright (C) 1998-2005 Marti Maria
+//
+// Permission is hereby granted, free of charge, to any person obtaining
+// a copy of this software and associated documentation files (the "Software"),
+// to deal in the Software without restriction, including without limitation
+// the rights to use, copy, modify, merge, publish, distribute, sublicense,
+// and/or sell copies of the Software, and to permit persons to whom the Software
+// is furnished to do so, subject to the following conditions:
+//
+// The above copyright notice and this permission notice shall be included in
+// all copies or substantial portions of the Software.
+//
+// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
+// EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO
+// THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
+// NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
+// LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
+// OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
+// WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
+
+// inter PCS conversions XYZ <-> CIE L* a* b*
+
+#include "lcms.h"
+
+/*
+
+
+ CIE Lab is defined as:
+
+ L* = 116*f(Y/Yn) - 16 0 <= L* <= 100
+ a* = 500*[f(X/Xn) - f(Y/Yn)]
+ b* = 200*[f(Y/Yn) - f(Z/Zn)]
+
+ and
+
+ f(t) = t^(1/3) 1 >= t > 0.008856
+ 7.787*t + (16/116) 0 <= t <= 0.008856
+
+
+ Reverse transform is:
+
+ X = Xn*[a* / 500 + (L* + 16) / 116] ^ 3 if (X/Xn) > 0.206893
+ = Xn*(a* / 500 + L* / 116) / 7.787 if (X/Xn) <= 0.206893
+
+
+
+ Following ICC. PCS in Lab is coded as:
+
+ 8 bit Lab PCS:
+
+ L* 0..100 into a 0..ff byte.
+ a* t + 128 range is -128.0 +127.0
+ b*
+
+ 16 bit Lab PCS:
+
+ L* 0..100 into a 0..ff00 word.
+ a* t + 128 range is -128.0 +127.9961
+ b*
+
+
+ We are always playing with 16 bits-data, so I will ignore the
+ 8-bits encoding scheme.
+
+
+Interchange Space Component Actual Range Encoded Range
+CIE XYZ X 0 -> 1.99997 0x0000 -> 0xffff
+CIE XYZ Y 0 -> 1.99997 0x0000 -> 0xffff
+CIE XYZ Z 0 -> 1.99997 0x0000 -> 0xffff
+
+Version 2,3
+-----------
+
+CIELAB (16 bit) L* 0 -> 100.0 0x0000 -> 0xff00
+CIELAB (16 bit) a* -128.0 -> +127.996 0x0000 -> 0x8000 -> 0xffff
+CIELAB (16 bit) b* -128.0 -> +127.996 0x0000 -> 0x8000 -> 0xffff
+
+
+Version 4
+---------
+
+CIELAB (16 bit) L* 0 -> 100.0 0x0000 -> 0xffff
+CIELAB (16 bit) a* -128.0 -> +127 0x0000 -> 0x8080 -> 0xffff
+CIELAB (16 bit) b* -128.0 -> +127 0x0000 -> 0x8080 -> 0xffff
+
+*/
+
+
+
+
+// On most modern computers, D > 4 M (i.e. a division takes more than 4
+// multiplications worth of time), so it is probably preferable to compute
+// a 24 bit result directly.
+
+// #define ITERATE 1
+
+static
+float CubeRoot(float x)
+{
+ float fr, r;
+ int ex, shx;
+
+ /* Argument reduction */
+ fr = (float) frexp(x, &ex); /* separate into mantissa and exponent */
+ shx = ex % 3;
+
+ if (shx > 0)
+ shx -= 3; /* compute shx such that (ex - shx) is divisible by 3 */
+
+ ex = (ex - shx) / 3; /* exponent of cube root */
+ fr = (float) ldexp(fr, shx);
+
+ /* 0.125 <= fr < 1.0 */
+
+#ifdef ITERATE
+ /* Compute seed with a quadratic approximation */
+
+ fr = (-0.46946116F * fr + 1.072302F) * fr + 0.3812513F;/* 0.5<=fr<1 */
+ r = ldexp(fr, ex); /* 6 bits of precision */
+
+ /* Newton-Raphson iterations */
+
+ r = (float)(2.0/3.0) * r + (float)(1.0/3.0) * x / (r * r); /* 12 bits */
+ r = (float)(2.0/3.0) * r + (float)(1.0/3.0) * x / (r * r); /* 24 bits */
+#else /* ITERATE */
+
+ /* Use quartic rational polynomial with error < 2^(-24) */
+
+ fr = (float) (((((45.2548339756803022511987494 * fr +
+ 192.2798368355061050458134625) * fr +
+ 119.1654824285581628956914143) * fr +
+ 13.43250139086239872172837314) * fr +
+ 0.1636161226585754240958355063)
+ /
+ ((((14.80884093219134573786480845 * fr +
+ 151.9714051044435648658557668) * fr +
+ 168.5254414101568283957668343) * fr +
+ 33.9905941350215598754191872) * fr +
+ 1.0));
+ r = (float) ldexp(fr, ex); /* 24 bits of precision */
+#endif
+ return r;
+}
+
+static
+double f(double t)
+{
+
+ if (t <= 0.008856)
+ return 7.787037037037037037037037037037*t + (16./116.);
+ else
+ return CubeRoot((float) t); // more precisse than return pow(t, 1.0/3.0);
+
+}
+
+
+void LCMSEXPORT cmsXYZ2Lab(LPcmsCIEXYZ WhitePoint, LPcmsCIELab Lab, const cmsCIEXYZ* xyz)
+{
+ double fx, fy, fz;
+
+ if (xyz -> X == 0 && xyz -> Y == 0 && xyz -> Z == 0)
+ {
+ Lab -> L = 0;
+ Lab -> a = 0;
+ Lab -> b = 0;
+ return;
+ }
+
+ if (WhitePoint == NULL)
+ WhitePoint = cmsD50_XYZ();
+
+ fx = f(xyz->X / WhitePoint->X);
+ fy = f(xyz->Y / WhitePoint->Y);
+ fz = f(xyz->Z / WhitePoint->Z);
+
+ Lab->L = 116.* fy - 16.;
+
+ Lab->a = 500.*(fx - fy);
+ Lab->b = 200.*(fy - fz);
+}
+
+
+
+void cmsXYZ2LabEncoded(WORD XYZ[3], WORD Lab[3])
+{
+ Fixed32 X, Y, Z;
+ double x, y, z, L, a, b;
+ double fx, fy, fz;
+ Fixed32 wL, wa, wb;
+
+ X = (Fixed32) XYZ[0] << 1;
+ Y = (Fixed32) XYZ[1] << 1;
+ Z = (Fixed32) XYZ[2] << 1;
+
+
+ if (X==0 && Y==0 && Z==0) {
+
+ Lab[0] = 0;
+ Lab[1] = Lab[2] = 0x8000;
+ return;
+ }
+
+ // PCS is in D50
+
+
+ x = FIXED_TO_DOUBLE(X) / D50X;
+ y = FIXED_TO_DOUBLE(Y) / D50Y;
+ z = FIXED_TO_DOUBLE(Z) / D50Z;
+
+
+ fx = f(x);
+ fy = f(y);
+ fz = f(z);
+
+ L = 116.* fy - 16.;
+
+ a = 500.*(fx - fy);
+ b = 200.*(fy - fz);
+
+ a += 128.;
+ b += 128.;
+
+ wL = (int) (L * 652.800 + .5);
+ wa = (int) (a * 256.0 + .5);
+ wb = (int) (b * 256.0 + .5);
+
+
+ Lab[0] = Clamp_L(wL);
+ Lab[1] = Clamp_ab(wa);
+ Lab[2] = Clamp_ab(wb);
+
+
+}
+
+
+
+
+static
+double f_1(double t)
+{
+
+ if (t <= ((7.787*0.008856) + (16./116.)))
+ {
+ double tmp;
+
+ tmp = ((t - (16./116.)) / 7.787037037037037037037037037037);
+ if (tmp <= 0.0) return 0.0;
+ else return tmp;
+ }
+
+ return t * t * t;
+}
+
+
+
+void LCMSEXPORT cmsLab2XYZ(LPcmsCIEXYZ WhitePoint, LPcmsCIEXYZ xyz, const cmsCIELab* Lab)
+{
+ double x, y, z;
+
+ if (Lab -> L <= 0) {
+ xyz -> X = 0;
+ xyz -> Y = 0;
+ xyz -> Z = 0;
+ return;
+ }
+
+
+ if (WhitePoint == NULL)
+ WhitePoint = cmsD50_XYZ();
+
+ y = (Lab-> L + 16.) / 116.0;
+ x = y + 0.002 * Lab -> a;
+ z = y - 0.005 * Lab -> b;
+
+ xyz -> X = f_1(x) * WhitePoint -> X;
+ xyz -> Y = f_1(y) * WhitePoint -> Y;
+ xyz -> Z = f_1(z) * WhitePoint -> Z;
+
+}
+
+
+
+void cmsLab2XYZEncoded(WORD Lab[3], WORD XYZ[3])
+{
+ double L, a, b;
+ double X, Y, Z, x, y, z;
+
+
+ L = ((double) Lab[0] * 100.0) / 65280.0;
+ if (L==0.0) {
+
+ XYZ[0] = 0; XYZ[1] = 0; XYZ[2] = 0;
+ return;
+ }
+
+ a = ((double) Lab[1] / 256.0) - 128.0;
+ b = ((double) Lab[2] / 256.0) - 128.0;
+
+ y = (L + 16.) / 116.0;
+ x = y + 0.002 * a;
+ z = y - 0.005 * b;
+
+ X = f_1(x) * D50X;
+ Y = f_1(y) * D50Y;
+ Z = f_1(z) * D50Z;
+
+ // Convert to 1.15 fixed format PCS
+
+
+ XYZ[0] = _cmsClampWord((int) floor(X * 32768.0 + 0.5));
+ XYZ[1] = _cmsClampWord((int) floor(Y * 32768.0 + 0.5));
+ XYZ[2] = _cmsClampWord((int) floor(Z * 32768.0 + 0.5));
+
+
+}
+
+static
+double L2float3(WORD v)
+{
+ Fixed32 fix32;
+
+ fix32 = (Fixed32) v;
+ return (double) fix32 / 652.800;
+}
+
+
+// the a/b part
+
+static
+double ab2float3(WORD v)
+{
+ Fixed32 fix32;
+
+ fix32 = (Fixed32) v;
+ return ((double) fix32/256.0)-128.0;
+}
+
+static
+WORD L2Fix3(double L)
+{
+ return (WORD) (L * 652.800 + 0.5);
+}
+
+static
+WORD ab2Fix3(double ab)
+{
+ return (WORD) ((ab + 128.0) * 256.0 + 0.5);
+}
+
+
+// ICC 4.0 -- ICC has changed PCS Lab encoding.
+
+static
+WORD L2Fix4(double L)
+{
+ return (WORD) (L * 655.35 + 0.5);
+}
+
+static
+WORD ab2Fix4(double ab)
+{
+ return (WORD) ((ab + 128.0) * 257.0 + 0.5);
+}
+
+static
+double L2float4(WORD v)
+{
+ Fixed32 fix32;
+
+ fix32 = (Fixed32) v;
+ return (double) fix32 / 655.35;
+}
+
+
+// the a/b part
+
+static
+double ab2float4(WORD v)
+{
+ Fixed32 fix32;
+
+ fix32 = (Fixed32) v;
+ return ((double) fix32/257.0)-128.0;
+}
+
+
+void LCMSEXPORT cmsLabEncoded2Float(LPcmsCIELab Lab, const WORD wLab[3])
+{
+ Lab->L = L2float3(wLab[0]);
+ Lab->a = ab2float3(wLab[1]);
+ Lab->b = ab2float3(wLab[2]);
+}
+
+
+void LCMSEXPORT cmsLabEncoded2Float4(LPcmsCIELab Lab, const WORD wLab[3])
+{
+ Lab->L = L2float4(wLab[0]);
+ Lab->a = ab2float4(wLab[1]);
+ Lab->b = ab2float4(wLab[2]);
+}
+
+static
+double Clamp_L_double(double L)
+{
+ if (L < 0) L = 0;
+ if (L > 100) L = 100;
+
+ return L;
+}
+
+
+static
+double Clamp_ab_double(double ab)
+{
+ if (ab < -128) ab = -128.0;
+ if (ab > +127.9961) ab = +127.9961;
+
+ return ab;
+}
+
+void LCMSEXPORT cmsFloat2LabEncoded(WORD wLab[3], const cmsCIELab* fLab)
+{
+ cmsCIELab Lab;
+
+
+ Lab.L = Clamp_L_double(fLab ->L);
+ Lab.a = Clamp_ab_double(fLab ->a);
+ Lab.b = Clamp_ab_double(fLab ->b);
+
+ wLab[0] = L2Fix3(Lab.L);
+ wLab[1] = ab2Fix3(Lab.a);
+ wLab[2] = ab2Fix3(Lab.b);
+}
+
+
+void LCMSEXPORT cmsFloat2LabEncoded4(WORD wLab[3], const cmsCIELab* fLab)
+{
+ cmsCIELab Lab;
+
+
+ Lab.L = fLab ->L;
+ Lab.a = fLab ->a;
+ Lab.b = fLab ->b;
+
+
+ if (Lab.L < 0) Lab.L = 0;
+ if (Lab.L > 100.) Lab.L = 100.;
+
+ if (Lab.a < -128.) Lab.a = -128.;
+ if (Lab.a > 127.) Lab.a = 127.;
+ if (Lab.b < -128.) Lab.b = -128.;
+ if (Lab.b > 127.) Lab.b = 127.;
+
+
+ wLab[0] = L2Fix4(Lab.L);
+ wLab[1] = ab2Fix4(Lab.a);
+ wLab[2] = ab2Fix4(Lab.b);
+}
+
+
+
+
+void LCMSEXPORT cmsLab2LCh(LPcmsCIELCh LCh, const cmsCIELab* Lab)
+{
+ double a, b;
+
+ LCh -> L = Clamp_L_double(Lab -> L);
+
+ a = Clamp_ab_double(Lab -> a);
+ b = Clamp_ab_double(Lab -> b);
+
+ LCh -> C = pow(a * a + b * b, 0.5);
+
+ if (a == 0 && b == 0)
+ LCh -> h = 0;
+ else
+ LCh -> h = atan2(b, a);
+
+
+ LCh -> h *= (180. / M_PI);
+
+
+ while (LCh -> h >= 360.) // Not necessary, but included as a check.
+ LCh -> h -= 360.;
+
+ while (LCh -> h < 0)
+ LCh -> h += 360.;
+
+}
+
+
+
+
+void LCMSEXPORT cmsLCh2Lab(LPcmsCIELab Lab, const cmsCIELCh* LCh)
+{
+
+ double h = (LCh -> h * M_PI) / 180.0;
+
+ Lab -> L = Clamp_L_double(LCh -> L);
+ Lab -> a = Clamp_ab_double(LCh -> C * cos(h));
+ Lab -> b = Clamp_ab_double(LCh -> C * sin(h));
+
+}
+
+
+
+
+
+// In XYZ All 3 components are encoded using 1.15 fixed point
+
+static
+WORD XYZ2Fix(double d)
+{
+ return (WORD) floor(d * 32768.0 + 0.5);
+}
+
+
+void LCMSEXPORT cmsFloat2XYZEncoded(WORD XYZ[3], const cmsCIEXYZ* fXYZ)
+{
+ cmsCIEXYZ xyz;
+
+ xyz.X = fXYZ -> X;
+ xyz.Y = fXYZ -> Y;
+ xyz.Z = fXYZ -> Z;
+
+
+ // Clamp to encodeable values.
+ // 1.99997 is reserved as out-of-gamut marker
+
+
+ if (xyz.Y <= 0) {
+
+ xyz.X = 0;
+ xyz.Y = 0;
+ xyz.Z = 0;
+ }
+
+
+ if (xyz.X > 1.99996)
+ xyz.X = 1.99996;
+
+ if (xyz.X < 0)
+ xyz.X = 0;
+
+ if (xyz.Y > 1.99996)
+ xyz.Y = 1.99996;
+
+ if (xyz.Y < 0)
+ xyz.Y = 0;
+
+
+ if (xyz.Z > 1.99996)
+ xyz.Z = 1.99996;
+
+ if (xyz.Z < 0)
+ xyz.Z = 0;
+
+
+
+ XYZ[0] = XYZ2Fix(xyz.X);
+ XYZ[1] = XYZ2Fix(xyz.Y);
+ XYZ[2] = XYZ2Fix(xyz.Z);
+
+}
+
+
+// To convert from Fixed 1.15 point to double
+
+static
+double XYZ2float(WORD v)
+{
+ Fixed32 fix32;
+
+ // From 1.15 to 15.16
+
+ fix32 = v << 1;
+
+ // From fixed 15.16 to double
+
+ return FIXED_TO_DOUBLE(fix32);
+}
+
+
+void LCMSEXPORT cmsXYZEncoded2Float(LPcmsCIEXYZ fXYZ, const WORD XYZ[3])
+{
+
+ fXYZ -> X = XYZ2float(XYZ[0]);
+ fXYZ -> Y = XYZ2float(XYZ[1]);
+ fXYZ -> Z = XYZ2float(XYZ[2]);
+
+}
+
+
+
+
diff --git a/icc2ps/cmsps2.c b/icc2ps/cmsps2.c
new file mode 100644
index 0000000..c393972
--- /dev/null
+++ b/icc2ps/cmsps2.c
@@ -0,0 +1,1667 @@
+//
+// Little cms
+// Copyright (C) 1998-2005 Marti Maria
+//
+// Permission is hereby granted, free of charge, to any person obtaining
+// a copy of this software and associated documentation files (the "Software"),
+// to deal in the Software without restriction, including without limitation
+// the rights to use, copy, modify, merge, publish, distribute, sublicense,
+// and/or sell copies of the Software, and to permit persons to whom the Software
+// is furnished to do so, subject to the following conditions:
+//
+// The above copyright notice and this permission notice shall be included in
+// all copies or substantial portions of the Software.
+//
+// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
+// EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO
+// THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
+// NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
+// LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
+// OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
+// WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
+
+
+// Postscript level 2 operators
+
+
+
+#include "lcms.h"
+#include <time.h>
+#include <stdarg.h>
+
+// PostScript ColorRenderingDictionary and ColorSpaceArray
+
+LCMSAPI DWORD LCMSEXPORT cmsGetPostScriptCSA(cmsHPROFILE hProfile, int Intent, LPVOID Buffer, DWORD dwBufferLen);
+LCMSAPI DWORD LCMSEXPORT cmsGetPostScriptCRD(cmsHPROFILE hProfile, int Intent, LPVOID Buffer, DWORD dwBufferLen);
+LCMSAPI DWORD LCMSEXPORT cmsGetPostScriptCRDEx(cmsHPROFILE hProfile, int Intent, DWORD dwFlags, LPVOID Buffer, DWORD dwBufferLen);
+// -------------------------------------------------------------------- Implementation
+
+#define MAXPSCOLS 60 // Columns on tables
+
+/*
+ Implementation
+ --------------
+
+ PostScript does use XYZ as its internal PCS. But since PostScript
+ interpolation tables are limited to 8 bits, I use Lab as a way to
+ improve the accuracy, favoring perceptual results. So, for the creation
+ of each CRD, CSA the profiles are converted to Lab via a device
+ link between profile -> Lab or Lab -> profile. The PS code necessary to
+ convert Lab <-> XYZ is also included.
+
+
+
+ Color Space Arrays (CSA)
+ ==================================================================================
+
+ In order to obtain precission, code chooses between three ways to implement
+ the device -> XYZ transform. These cases identifies monochrome profiles (often
+ implemented as a set of curves), matrix-shaper and LUT-based.
+
+ Monochrome
+ -----------
+
+ This is implemented as /CIEBasedA CSA. The prelinearization curve is
+ placed into /DecodeA section, and matrix equals to D50. Since here is
+ no interpolation tables, I do the conversion directly to XYZ
+
+ NOTE: CLUT-based monochrome profiles are NOT supported. So, cmsFLAGS_MATRIXINPUT
+ flag is forced on such profiles.
+
+ [ /CIEBasedA
+ <<
+ /DecodeA { transfer function } bind
+ /MatrixA [D50]
+ /RangeLMN [ 0.0 D50X 0.0 D50Y 0.0 D50Z ]
+ /WhitePoint [D50]
+ /BlackPoint [BP]
+ /RenderingIntent (intent)
+ >>
+ ]
+
+ On simpler profiles, the PCS is already XYZ, so no conversion is required.
+
+
+ Matrix-shaper based
+ -------------------
+
+ This is implemented both with /CIEBasedABC or /CIEBasedDEF on dependig
+ of profile implementation. Since here is no interpolation tables, I do
+ the conversion directly to XYZ
+
+
+
+ [ /CIEBasedABC
+ <<
+ /DecodeABC [ {transfer1} {transfer2} {transfer3} ]
+ /MatrixABC [Matrix]
+ /RangeLMN [ 0.0 D50X 0.0 D50Y 0.0 D50Z ]
+ /DecodeLMN [ { / 2} dup dup ]
+ /WhitePoint [D50]
+ /BlackPoint [BP]
+ /RenderingIntent (intent)
+ >>
+ ]
+
+
+ CLUT based
+ ----------
+
+ Lab is used in such cases.
+
+ [ /CIEBasedDEF
+ <<
+ /DecodeDEF [ <prelinearization> ]
+ /Table [ p p p [<...>]]
+ /RangeABC [ 0 1 0 1 0 1]
+ /DecodeABC[ <postlinearization> ]
+ /MatrixABC [ 1 1 1 1 0 0 0 0 -1]
+ /WhitePoint [D50]
+ /BlackPoint [BP]
+ /RenderingIntent (intent)
+ ]
+
+
+ Color Rendering Dictionaries (CRD)
+ ==================================
+ These are always implemented as CLUT, and always are using Lab. Since CRD are expected to
+ be used as resources, the code adds the definition as well.
+
+ <<
+ /ColorRenderingType 1
+ /WhitePoint [ D50 ]
+ /BlackPoint [BP]
+ /MatrixPQR [ Bradford ]
+ /RangePQR [-0.125 1.375 -0.125 1.375 -0.125 1.375 ]
+ /TransformPQR [
+ {4 index 3 get div 2 index 3 get mul exch pop exch pop exch pop exch pop } bind
+ {4 index 4 get div 2 index 4 get mul exch pop exch pop exch pop exch pop } bind
+ {4 index 5 get div 2 index 5 get mul exch pop exch pop exch pop exch pop } bind
+ ]
+ /MatrixABC <...>
+ /EncodeABC <...>
+ /RangeABC <.. used for XYZ -> Lab>
+ /EncodeLMN
+ /RenderTable [ p p p [<...>]]
+
+ /RenderingIntent (Perceptual)
+ >>
+ /Current exch /ColorRendering defineresource pop
+
+
+ The following stages are used to convert from XYZ to Lab
+ --------------------------------------------------------
+
+ Input is given at LMN stage on X, Y, Z
+
+ Encode LMN gives us f(X/Xn), f(Y/Yn), f(Z/Zn)
+
+ /EncodeLMN [
+
+ { 0.964200 div dup 0.008856 le {7.787 mul 16 116 div add}{1 3 div exp} ifelse } bind
+ { 1.000000 div dup 0.008856 le {7.787 mul 16 116 div add}{1 3 div exp} ifelse } bind
+ { 0.824900 div dup 0.008856 le {7.787 mul 16 116 div add}{1 3 div exp} ifelse } bind
+
+ ]
+
+
+ MatrixABC is used to compute f(Y/Yn), f(X/Xn) - f(Y/Yn), f(Y/Yn) - f(Z/Zn)
+
+ | 0 1 0|
+ | 1 -1 0|
+ | 0 1 -1|
+
+ /MatrixABC [ 0 1 0 1 -1 1 0 0 -1 ]
+
+ EncodeABC finally gives Lab values.
+
+ /EncodeABC [
+ { 116 mul 16 sub 100 div } bind
+ { 500 mul 128 add 255 div } bind
+ { 200 mul 128 add 255 div } bind
+ ]
+
+ The following stages are used to convert Lab to XYZ
+ ----------------------------------------------------
+
+ /RangeABC [ 0 1 0 1 0 1]
+ /DecodeABC [ { 100 mul 16 add 116 div } bind
+ { 255 mul 128 sub 500 div } bind
+ { 255 mul 128 sub 200 div } bind
+ ]
+
+ /MatrixABC [ 1 1 1 1 0 0 0 0 -1]
+ /DecodeLMN [
+ {dup 6 29 div ge {dup dup mul mul} {4 29 div sub 108 841 div mul} ifelse 0.964200 mul} bind
+ {dup 6 29 div ge {dup dup mul mul} {4 29 div sub 108 841 div mul} ifelse } bind
+ {dup 6 29 div ge {dup dup mul mul} {4 29 div sub 108 841 div mul} ifelse 0.824900 mul} bind
+ ]
+
+
+*/
+
+/*
+
+ PostScript algorithms discussion.
+ =========================================================================================================
+
+ 1D interpolation algorithm
+
+
+ 1D interpolation (float)
+ ------------------------
+
+ val2 = Domain * Value;
+
+ cell0 = (int) floor(val2);
+ cell1 = (int) ceil(val2);
+
+ rest = val2 - cell0;
+
+ y0 = LutTable[cell0] ;
+ y1 = LutTable[cell1] ;
+
+ y = y0 + (y1 - y0) * rest;
+
+
+
+ PostScript code Stack
+ ================================================
+
+ { % v
+ <check 0..1.0>
+ [array] % v tab
+ dup % v tab tab
+ length 1 sub % v tab dom
+
+ 3 -1 roll % tab dom v
+
+ mul % tab val2
+ dup % tab val2 val2
+ dup % tab val2 val2 val2
+ floor cvi % tab val2 val2 cell0
+ exch % tab val2 cell0 val2
+ ceiling cvi % tab val2 cell0 cell1
+
+ 3 index % tab val2 cell0 cell1 tab
+ exch % tab val2 cell0 tab cell1
+ get % tab val2 cell0 y1
+
+ 4 -1 roll % val2 cell0 y1 tab
+ 3 -1 roll % val2 y1 tab cell0
+ get % val2 y1 y0
+
+ dup % val2 y1 y0 y0
+ 3 1 roll % val2 y0 y1 y0
+
+ sub % val2 y0 (y1-y0)
+ 3 -1 roll % y0 (y1-y0) val2
+ dup % y0 (y1-y0) val2 val2
+ floor cvi % y0 (y1-y0) val2 floor(val2)
+ sub % y0 (y1-y0) rest
+ mul % y0 t1
+ add % y
+ 65535 div % result
+
+ } bind
+
+
+*/
+
+static icTagSignature Device2PCSTab[] = {icSigAToB0Tag, // Perceptual
+ icSigAToB1Tag, // Relative colorimetric
+ icSigAToB2Tag, // Saturation
+ icSigAToB1Tag }; // Absolute colorimetric
+ // (Relative/WhitePoint)
+
+
+// --------------------------------------------------------------- Memory Stream
+//
+// This struct holds the memory block currently being write
+//
+
+typedef struct {
+ LPBYTE Block;
+ LPBYTE Ptr;
+ DWORD dwMax;
+ DWORD dwUsed;
+ int MaxCols;
+ int Col;
+ int HasError;
+
+ } MEMSTREAM, FAR* LPMEMSTREAM;
+
+
+typedef struct {
+ LPLUT Lut;
+ LPMEMSTREAM m;
+
+ int FirstComponent;
+ int SecondComponent;
+
+ int bps;
+ const char* PreMaj;
+ const char* PostMaj;
+ const char* PreMin;
+ const char* PostMin;
+
+ int lIsInput; // Handle L* encoding
+ int FixWhite; // Force mapping of pure white
+
+ icColorSpaceSignature ColorSpace; // ColorSpace of profile
+
+
+ } SAMPLERCARGO, FAR* LPSAMPLERCARGO;
+
+
+// Creates a ready to use memory stream
+static
+LPMEMSTREAM CreateMemStream(LPBYTE Buffer, DWORD dwMax, int MaxCols)
+{
+ LPMEMSTREAM m = (LPMEMSTREAM) malloc(sizeof(MEMSTREAM));
+
+ ZeroMemory(m, sizeof(MEMSTREAM));
+
+ m -> Block = m -> Ptr = Buffer;
+ m -> dwMax = dwMax;
+ m -> dwUsed = 0;
+ m -> MaxCols = MaxCols;
+ m -> Col = 0;
+ m -> HasError = 0;
+
+ return m;
+}
+
+
+
+// Convert to byte
+static
+BYTE Word2Byte(WORD w)
+{
+ return (BYTE) floor((double) w / 257.0 + 0.5);
+}
+
+
+// Convert to byte (using ICC2 notation)
+
+static
+BYTE L2Byte(WORD w)
+{
+ int ww = w + 0x0080;
+
+ if (ww > 0xFFFF) return 0xFF;
+
+ return (BYTE) ((WORD) (ww >> 8) & 0xFF);
+}
+
+// Write a raw, uncooked byte. Check for space
+static
+void WriteRawByte(LPMEMSTREAM m, BYTE b)
+{
+
+ if (m -> dwUsed + 1 > m -> dwMax) {
+ m -> HasError = 1;
+ }
+
+ if (!m ->HasError && m ->Block) {
+ *m ->Ptr++ = b;
+ }
+
+ m -> dwUsed++;
+}
+
+// Write a cooked byte
+static
+void WriteByte(LPMEMSTREAM m, BYTE b)
+{
+ static const BYTE Hex[] = "0123456789ABCDEF";
+ BYTE c;
+
+ c = Hex[(b >> 4) & 0x0f];
+ WriteRawByte(m, c);
+
+ c = Hex[b & 0x0f];
+ WriteRawByte(m, c);
+
+ m -> Col += 2;
+
+ if (m -> Col > m -> MaxCols) {
+
+ WriteRawByte(m, '\n');
+ m -> Col = 0;
+ }
+
+}
+
+// Does write a formatted string
+static
+void Writef(LPMEMSTREAM m, const char *frm, ...)
+{
+ va_list args;
+ LPBYTE pt;
+ BYTE Buffer[2048];
+
+ va_start(args, frm);
+
+ vsprintf((char*) Buffer, frm, args);
+
+ for (pt = Buffer; *pt; pt++) {
+
+ WriteRawByte(m, *pt);
+ }
+
+ va_end(args);
+}
+
+
+
+// ----------------------------------------------------------------- PostScript generation
+
+
+// Removes offending Carriage returns
+static
+char* RemoveCR(const char* txt)
+{
+ static char Buffer[2048];
+ char* pt;
+
+ strncpy(Buffer, txt, 2047);
+ Buffer[2047] = 0;
+ for (pt = Buffer; *pt; pt++)
+ if (*pt == '\n' || *pt == '\r') *pt = ' ';
+
+ return Buffer;
+
+}
+
+static
+void EmitHeader(LPMEMSTREAM m, const char* Title, cmsHPROFILE hProfile)
+{
+
+ time_t timer;
+
+ time(&timer);
+
+ Writef(m, "%%!PS-Adobe-3.0\n");
+ Writef(m, "%%\n");
+ Writef(m, "%% %s\n", Title);
+ Writef(m, "%% Source: %s\n", RemoveCR(cmsTakeProductName(hProfile)));
+ Writef(m, "%% Description: %s\n", RemoveCR(cmsTakeProductDesc(hProfile)));
+ Writef(m, "%% Created: %s", ctime(&timer)); // ctime appends a \n!!!
+ Writef(m, "%%\n");
+ Writef(m, "%%%%BeginResource\n");
+
+}
+
+
+// Emits White & Black point. White point is always D50, Black point is the device
+// Black point adapted to D50.
+
+static
+void EmitWhiteBlackD50(LPMEMSTREAM m, LPcmsCIEXYZ BlackPoint)
+{
+
+ Writef(m, "/BlackPoint [%f %f %f]\n", BlackPoint -> X,
+ BlackPoint -> Y,
+ BlackPoint -> Z);
+
+ Writef(m, "/WhitePoint [%f %f %f]\n", cmsD50_XYZ()->X,
+ cmsD50_XYZ()->Y,
+ cmsD50_XYZ()->Z);
+}
+
+
+static
+void EmitRangeCheck(LPMEMSTREAM m)
+{
+ Writef(m, "dup 0.0 lt { pop 0.0 } if "
+ "dup 1.0 gt { pop 1.0 } if ");
+
+}
+
+// Does write the intent
+
+static
+void EmitIntent(LPMEMSTREAM m, int RenderingIntent)
+{
+ const char *intent;
+
+ switch (RenderingIntent) {
+
+ case INTENT_PERCEPTUAL: intent = "Perceptual"; break;
+ case INTENT_RELATIVE_COLORIMETRIC: intent = "RelativeColorimetric"; break;
+ case INTENT_ABSOLUTE_COLORIMETRIC: intent = "AbsoluteColorimetric"; break;
+ case INTENT_SATURATION: intent = "Saturation"; break;
+
+ default: intent = "Undefined"; break;
+ }
+
+ Writef(m, "/RenderingIntent (%s)\n", intent );
+}
+
+//
+// Convert L* to Y
+//
+// Y = Yn*[ (L* + 16) / 116] ^ 3 if (L*) >= 6 / 29
+// = Yn*( L* / 116) / 7.787 if (L*) < 6 / 29
+//
+
+/*
+static
+void EmitL2Y(LPMEMSTREAM m)
+{
+ Writef(m,
+ "{ "
+ "100 mul 16 add 116 div " // (L * 100 + 16) / 116
+ "dup 6 29 div ge " // >= 6 / 29 ?
+ "{ dup dup mul mul } " // yes, ^3 and done
+ "{ 4 29 div sub 108 841 div mul } " // no, slope limiting
+ "ifelse } bind ");
+}
+*/
+
+
+// Lab -> XYZ, see the discussion above
+
+static
+void EmitLab2XYZ(LPMEMSTREAM m)
+{
+ Writef(m, "/RangeABC [ 0 1 0 1 0 1]\n");
+ Writef(m, "/DecodeABC [\n");
+ Writef(m, "{100 mul 16 add 116 div } bind\n");
+ Writef(m, "{255 mul 128 sub 500 div } bind\n");
+ Writef(m, "{255 mul 128 sub 200 div } bind\n");
+ Writef(m, "]\n");
+ Writef(m, "/MatrixABC [ 1 1 1 1 0 0 0 0 -1]\n");
+ Writef(m, "/RangeLMN [ 0.0 0.9642 0.0 1.0000 0.0 0.8249 ]\n");
+ Writef(m, "/DecodeLMN [\n");
+ Writef(m, "{dup 6 29 div ge {dup dup mul mul} {4 29 div sub 108 841 div mul} ifelse 0.964200 mul} bind\n");
+ Writef(m, "{dup 6 29 div ge {dup dup mul mul} {4 29 div sub 108 841 div mul} ifelse } bind\n");
+ Writef(m, "{dup 6 29 div ge {dup dup mul mul} {4 29 div sub 108 841 div mul} ifelse 0.824900 mul} bind\n");
+ Writef(m, "]\n");
+}
+
+
+
+// Outputs a table of words. It does use 16 bits
+
+static
+void Emit1Gamma(LPMEMSTREAM m, LPWORD Table, int nEntries)
+{
+ int i;
+ double gamma;
+
+
+ if (nEntries <= 0) return; // Empty table
+
+ // Suppress whole if identity
+ if (cmsIsLinear(Table, nEntries)) return;
+
+ // Check if is really an exponential. If so, emit "exp"
+ gamma = cmsEstimateGammaEx(Table, nEntries, 0.001);
+ if (gamma > 0) {
+ Writef(m, "{ %g exp } bind ", gamma);
+ return;
+ }
+
+ Writef(m, "{ ");
+
+ // Bounds check
+ EmitRangeCheck(m);
+
+ // Emit intepolation code
+
+ // PostScript code Stack
+ // =============== ========================
+ // v
+ Writef(m, " [");
+
+ // TODO: Check for endianess!!!
+
+ for (i=0; i < nEntries; i++) {
+ Writef(m, "%d ", Table[i]);
+ }
+
+ Writef(m, "] "); // v tab
+
+ Writef(m, "dup "); // v tab tab
+ Writef(m, "length 1 sub "); // v tab dom
+ Writef(m, "3 -1 roll "); // tab dom v
+ Writef(m, "mul "); // tab val2
+ Writef(m, "dup "); // tab val2 val2
+ Writef(m, "dup "); // tab val2 val2 val2
+ Writef(m, "floor cvi "); // tab val2 val2 cell0
+ Writef(m, "exch "); // tab val2 cell0 val2
+ Writef(m, "ceiling cvi "); // tab val2 cell0 cell1
+ Writef(m, "3 index "); // tab val2 cell0 cell1 tab
+ Writef(m, "exch "); // tab val2 cell0 tab cell1
+ Writef(m, "get "); // tab val2 cell0 y1
+ Writef(m, "4 -1 roll "); // val2 cell0 y1 tab
+ Writef(m, "3 -1 roll "); // val2 y1 tab cell0
+ Writef(m, "get "); // val2 y1 y0
+ Writef(m, "dup "); // val2 y1 y0 y0
+ Writef(m, "3 1 roll "); // val2 y0 y1 y0
+ Writef(m, "sub "); // val2 y0 (y1-y0)
+ Writef(m, "3 -1 roll "); // y0 (y1-y0) val2
+ Writef(m, "dup "); // y0 (y1-y0) val2 val2
+ Writef(m, "floor cvi "); // y0 (y1-y0) val2 floor(val2)
+ Writef(m, "sub "); // y0 (y1-y0) rest
+ Writef(m, "mul "); // y0 t1
+ Writef(m, "add "); // y
+ Writef(m, "65535 div "); // result
+
+ Writef(m, " } bind ");
+}
+
+
+// Compare gamma table
+
+static
+BOOL GammaTableEquals(LPWORD g1, LPWORD g2, int nEntries)
+{
+ return memcmp(g1, g2, nEntries* sizeof(WORD)) == 0;
+}
+
+
+// Does write a set of gamma curves
+
+static
+void EmitNGamma(LPMEMSTREAM m, int n, LPWORD g[], int nEntries)
+{
+ int i;
+
+ for( i=0; i < n; i++ )
+ {
+ if (i > 0 && GammaTableEquals(g[i-1], g[i], nEntries)) {
+
+ Writef(m, "dup ");
+ }
+ else {
+ Emit1Gamma(m, g[i], nEntries);
+ }
+ }
+
+}
+
+
+// Check whatever a profile has CLUT tables (only on input)
+
+static
+BOOL IsLUTbased(cmsHPROFILE hProfile, int Intent)
+{
+ icTagSignature Tag;
+
+ // Check if adequate tag is present
+ Tag = Device2PCSTab[Intent];
+
+ if (cmsIsTag(hProfile, Tag)) return 1;
+
+ // If not present, revert to default (perceptual)
+ Tag = icSigAToB0Tag;
+
+ // If no tag present, try matrix-shaper
+ return cmsIsTag(hProfile, Tag);
+}
+
+
+
+// Following code dumps a LUT onto memory stream
+
+
+// This is the sampler. Intended to work in SAMPLER_INSPECT mode,
+// that is, the callback will be called for each knot with
+//
+// In[] The grid location coordinates, normalized to 0..ffff
+// Out[] The LUT values, normalized to 0..ffff
+//
+// Returning a value other than 0 does terminate the sampling process
+//
+// Each row contains LUT values for all but first component. So, I
+// detect row changing by keeping a copy of last value of first
+// component. -1 is used to mark begining of whole block.
+
+static
+int OutputValueSampler(register WORD In[], register WORD Out[], register LPVOID Cargo)
+{
+ LPSAMPLERCARGO sc = (LPSAMPLERCARGO) Cargo;
+ unsigned int i;
+
+
+ if (sc -> FixWhite) {
+
+ if (In[0] == 0xFFFF) { // Only in L* = 100
+
+ if ((In[1] >= 0x8000 && In[1] <= 0x87FF) ||
+ (In[2] >= 0x8000 && In[2] <= 0x87FF)) {
+
+ WORD* Black;
+ WORD* White;
+ int nOutputs;
+
+ if (!_cmsEndPointsBySpace(sc ->ColorSpace, &White, &Black, &nOutputs))
+ return 0;
+
+ for (i=0; i < (unsigned int) nOutputs; i++)
+ Out[i] = White[i];
+ }
+
+
+ }
+ }
+
+
+ // Hadle the parenthesis on rows
+
+ if (In[0] != sc ->FirstComponent) {
+
+ if (sc ->FirstComponent != -1) {
+
+ Writef(sc ->m, sc ->PostMin);
+ sc ->SecondComponent = -1;
+ Writef(sc ->m, sc ->PostMaj);
+ }
+
+ // Begin block
+ sc->m->Col = 0;
+
+ Writef(sc ->m, sc ->PreMaj);
+ sc ->FirstComponent = In[0];
+ }
+
+
+ if (In[1] != sc ->SecondComponent) {
+
+ if (sc ->SecondComponent != -1) {
+
+ Writef(sc ->m, sc ->PostMin);
+ }
+
+ Writef(sc ->m, sc ->PreMin);
+ sc ->SecondComponent = In[1];
+ }
+
+
+
+ // Dump table. Could be Word or byte based on
+ // depending on bps member (16 bps mode is not currently
+ // being used at all, but is here for future ampliations)
+
+ for (i=0; i < sc -> Lut ->OutputChan; i++) {
+
+ WORD wWordOut = Out[i];
+
+ if (sc ->bps == 8) {
+
+ // Value as byte
+ BYTE wByteOut;
+
+ // If is input, convert from Lab2 to Lab4 (just divide by 256)
+
+ if (sc ->lIsInput) {
+
+
+ wByteOut = L2Byte(wWordOut);
+ }
+ else
+ wByteOut = Word2Byte(wWordOut);
+
+ WriteByte(sc -> m, wByteOut);
+ }
+ else {
+
+ // Value as word
+ WriteByte(sc -> m, (BYTE) (wWordOut & 0xFF));
+ WriteByte(sc -> m, (BYTE) ((wWordOut >> 8) & 0xFF));
+ }
+ }
+
+ return 1;
+}
+
+// Writes a LUT on memstream. Could be 8 or 16 bits based
+
+static
+void WriteCLUT(LPMEMSTREAM m, LPLUT Lut, int bps, const char* PreMaj,
+ const char* PostMaj,
+ const char* PreMin,
+ const char* PostMin,
+ int lIsInput,
+ int FixWhite,
+ icColorSpaceSignature ColorSpace)
+{
+ unsigned int i;
+ SAMPLERCARGO sc;
+
+ sc.FirstComponent = -1;
+ sc.SecondComponent = -1;
+ sc.Lut = Lut;
+ sc.m = m;
+ sc.bps = bps;
+ sc.PreMaj = PreMaj;
+ sc.PostMaj= PostMaj;
+
+ sc.PreMin = PreMin;
+ sc.PostMin= PostMin;
+ sc.lIsInput = lIsInput;
+ sc.FixWhite = FixWhite;
+ sc.ColorSpace = ColorSpace;
+
+ Writef(m, "[");
+
+ for (i=0; i < Lut ->InputChan; i++)
+ Writef(m, " %d ", Lut ->cLutPoints);
+
+ Writef(m, " [\n");
+
+
+
+ cmsSample3DGrid(Lut, OutputValueSampler, (LPVOID) &sc, SAMPLER_INSPECT);
+
+
+ Writef(m, PostMin);
+ Writef(m, PostMaj);
+ Writef(m, "] ");
+
+
+
+}
+
+
+// Dumps CIEBasedA Color Space Array
+
+static
+int EmitCIEBasedA(LPMEMSTREAM m, LPWORD Tab, int nEntries, LPcmsCIEXYZ BlackPoint)
+{
+
+ Writef(m, "[ /CIEBasedA\n");
+ Writef(m, " <<\n");
+
+ Writef(m, "/DecodeA ");
+
+ Emit1Gamma(m,Tab, nEntries);
+
+ Writef(m, " \n");
+
+ Writef(m, "/MatrixA [ 0.9642 1.0000 0.8249 ]\n");
+ Writef(m, "/RangeLMN [ 0.0 0.9642 0.0 1.0000 0.0 0.8249 ]\n");
+
+ EmitWhiteBlackD50(m, BlackPoint);
+ EmitIntent(m, INTENT_PERCEPTUAL);
+
+ Writef(m, ">>\n");
+ Writef(m, "]\n");
+
+ return 1;
+}
+
+
+// Dumps CIEBasedABC Color Space Array
+
+static
+int EmitCIEBasedABC(LPMEMSTREAM m, LPWORD L[], int nEntries, LPWMAT3 Matrix, LPcmsCIEXYZ BlackPoint)
+{
+ int i;
+
+ Writef(m, "[ /CIEBasedABC\n");
+ Writef(m, "<<\n");
+ Writef(m, "/DecodeABC [ ");
+
+ EmitNGamma(m, 3, L, nEntries);
+
+ Writef(m, "]\n");
+
+ Writef(m, "/MatrixABC [ " );
+
+ for( i=0; i < 3; i++ ) {
+
+ Writef(m, "%.6f %.6f %.6f ",
+ FIXED_TO_DOUBLE(Matrix->v[0].n[i]),
+ FIXED_TO_DOUBLE(Matrix->v[1].n[i]),
+ FIXED_TO_DOUBLE(Matrix->v[2].n[i]));
+ }
+
+
+ Writef(m, "]\n");
+
+ Writef(m, "/RangeLMN [ 0.0 0.9642 0.0 1.0000 0.0 0.8249 ]\n");
+
+ EmitWhiteBlackD50(m, BlackPoint);
+ EmitIntent(m, INTENT_PERCEPTUAL);
+
+ Writef(m, ">>\n");
+ Writef(m, "]\n");
+
+
+ return 1;
+}
+
+
+static
+int EmitCIEBasedDEF(LPMEMSTREAM m, LPLUT Lut, int Intent, LPcmsCIEXYZ BlackPoint)
+{
+ const char* PreMaj;
+ const char* PostMaj;
+ const char* PreMin, *PostMin;
+
+ switch (Lut ->InputChan) {
+ case 3:
+
+ Writef(m, "[ /CIEBasedDEF\n");
+ PreMaj ="<";
+ PostMaj= ">\n";
+ PreMin = PostMin = "";
+ break;
+ case 4:
+ Writef(m, "[ /CIEBasedDEFG\n");
+ PreMaj = "[";
+ PostMaj = "]\n";
+ PreMin = "<";
+ PostMin = ">\n";
+ break;
+ default:
+ return 0;
+
+ }
+
+ Writef(m, "<<\n");
+
+ if (Lut ->wFlags & LUT_HASTL1) {
+
+ Writef(m, "/DecodeDEF [ ");
+ EmitNGamma(m, Lut ->InputChan, Lut ->L1, Lut ->CLut16params.nSamples);
+ Writef(m, "]\n");
+ }
+
+
+
+ if (Lut ->wFlags & LUT_HAS3DGRID) {
+
+ Writef(m, "/Table ");
+ WriteCLUT(m, Lut, 8, PreMaj, PostMaj, PreMin, PostMin, TRUE, FALSE, (icColorSpaceSignature) 0);
+ Writef(m, "]\n");
+ }
+
+ EmitLab2XYZ(m);
+ EmitWhiteBlackD50(m, BlackPoint);
+ EmitIntent(m, Intent);
+
+ Writef(m, " >>\n");
+ Writef(m, "]\n");
+
+
+ return 1;
+}
+
+
+
+// Because PostScrip has only 8 bits in /Table, we should use
+// a more perceptually uniform space... I do choose Lab.
+
+static
+int WriteInputLUT(LPMEMSTREAM m, cmsHPROFILE hProfile, int Intent)
+{
+ cmsHPROFILE hLab;
+ cmsHTRANSFORM xform;
+ icColorSpaceSignature ColorSpace;
+ int nChannels;
+ DWORD InputFormat;
+ int rc;
+ cmsHPROFILE Profiles[2];
+ cmsCIEXYZ BlackPointAdaptedToD50;
+
+ // Does create a device-link based transform.
+ // The DeviceLink is next dumped as working CSA.
+
+ hLab = cmsCreateLabProfile(NULL);
+ ColorSpace = cmsGetColorSpace(hProfile);
+ nChannels = _cmsChannelsOf(ColorSpace);
+ InputFormat = CHANNELS_SH(nChannels) | BYTES_SH(2);
+
+ cmsDetectBlackPoint(&BlackPointAdaptedToD50, hProfile, Intent,LCMS_BPFLAGS_D50_ADAPTED);
+
+ // Is a devicelink profile?
+ if (cmsGetDeviceClass(hProfile) == icSigLinkClass) {
+
+ // if devicelink output already Lab, use it directly
+
+ if (cmsGetPCS(hProfile) == icSigLabData) {
+
+ xform = cmsCreateTransform(hProfile, InputFormat, NULL,
+ TYPE_Lab_DBL, Intent, 0);
+ }
+ else {
+
+ // Nope, adjust output to Lab if possible
+
+ Profiles[0] = hProfile;
+ Profiles[1] = hLab;
+
+ xform = cmsCreateMultiprofileTransform(Profiles, 2, InputFormat,
+ TYPE_Lab_DBL, Intent, 0);
+ }
+
+
+ }
+ else {
+
+ // This is a normal profile
+ xform = cmsCreateTransform(hProfile, InputFormat, hLab,
+ TYPE_Lab_DBL, Intent, 0);
+ }
+
+
+
+ if (xform == NULL) {
+
+ cmsSignalError(LCMS_ERRC_ABORTED, "Cannot create transform Profile -> Lab");
+ return 0;
+ }
+
+ // Only 1, 3 and 4 channels are allowed
+
+ switch (nChannels) {
+
+ case 1: {
+
+ // LPGAMMATABLE Gray2Y = ExtractGray2Y(xform);
+ // rc = EmitCIEBasedA(m, Gray2Y->GammaTable, Gray2Y ->nEntries, hProfile);
+ // cmsFreeGamma(Gray2Y);
+
+ cmsSignalError(LCMS_ERRC_ABORTED, "Monochrome LUT-based currently unsupported for CSA generation");
+ }
+ break;
+
+ case 3:
+ case 4: {
+ LPLUT DeviceLink;
+ _LPcmsTRANSFORM v = (_LPcmsTRANSFORM) xform;
+
+ if (v ->DeviceLink)
+ rc = EmitCIEBasedDEF(m, v->DeviceLink, Intent, &BlackPointAdaptedToD50);
+ else {
+ DeviceLink = _cmsPrecalculateDeviceLink(xform, 0);
+ rc = EmitCIEBasedDEF(m, DeviceLink, Intent, &BlackPointAdaptedToD50);
+ cmsFreeLUT(DeviceLink);
+ }
+ }
+ break;
+
+ default:
+
+ cmsSignalError(LCMS_ERRC_ABORTED, "Only 3, 4 channels supported for CSA. This profile has %d channels.", nChannels);
+ return 0;
+ }
+
+
+ cmsDeleteTransform(xform);
+ cmsCloseProfile(hLab);
+ return 1;
+}
+
+
+
+// Does create CSA based on matrix-shaper. Allowed types are gray and RGB based
+
+static
+int WriteInputMatrixShaper(LPMEMSTREAM m, cmsHPROFILE hProfile)
+{
+ icColorSpaceSignature ColorSpace;
+ LPMATSHAPER MatShaper;
+ int rc;
+ cmsCIEXYZ BlackPointAdaptedToD50;
+
+
+ ColorSpace = cmsGetColorSpace(hProfile);
+ MatShaper = cmsBuildInputMatrixShaper(hProfile);
+
+ cmsDetectBlackPoint(&BlackPointAdaptedToD50, hProfile, INTENT_RELATIVE_COLORIMETRIC, LCMS_BPFLAGS_D50_ADAPTED);
+
+ if (MatShaper == NULL) {
+
+ cmsSignalError(LCMS_ERRC_ABORTED, "This profile is not suitable for input");
+ return 0;
+ }
+
+ if (ColorSpace == icSigGrayData) {
+
+ rc = EmitCIEBasedA(m, MatShaper ->L[0],
+ MatShaper ->p16.nSamples,
+ &BlackPointAdaptedToD50);
+
+ }
+ else
+ if (ColorSpace == icSigRgbData) {
+
+
+ rc = EmitCIEBasedABC(m, MatShaper->L,
+ MatShaper ->p16.nSamples,
+ &MatShaper ->Matrix,
+ &BlackPointAdaptedToD50);
+ }
+ else {
+
+ cmsSignalError(LCMS_ERRC_ABORTED, "Profile is not suitable for CSA. Unsupported colorspace.");
+ return 0;
+ }
+
+ cmsFreeMatShaper(MatShaper);
+ return rc;
+}
+
+
+
+// Creates a PostScript color list from a named profile data.
+// This is a HP extension, and it works in Lab instead of XYZ
+
+static
+int WriteNamedColorCSA(LPMEMSTREAM m, cmsHPROFILE hNamedColor, int Intent)
+{
+ cmsHTRANSFORM xform;
+ cmsHPROFILE hLab;
+ int i, nColors;
+ char ColorName[32];
+
+
+ hLab = cmsCreateLabProfile(NULL);
+ xform = cmsCreateTransform(hNamedColor, TYPE_NAMED_COLOR_INDEX,
+ hLab, TYPE_Lab_DBL, Intent, cmsFLAGS_NOTPRECALC);
+ if (xform == NULL) return 0;
+
+
+ Writef(m, "<<\n");
+ Writef(m, "(colorlistcomment) (%s)\n", "Named color CSA");
+ Writef(m, "(Prefix) [ (Pantone ) (PANTONE ) ]\n");
+ Writef(m, "(Suffix) [ ( CV) ( CVC) ( C) ]\n");
+
+ nColors = cmsNamedColorCount(xform);
+
+
+ for (i=0; i < nColors; i++) {
+
+ WORD In[1];
+ cmsCIELab Lab;
+
+ In[0] = (WORD) i;
+
+ if (!cmsNamedColorInfo(xform, i, ColorName, NULL, NULL))
+ continue;
+
+ cmsDoTransform(xform, In, &Lab, 1);
+ Writef(m, " (%s) [ %.3f %.3f %.3f ]\n", ColorName, Lab.L, Lab.a, Lab.b);
+ }
+
+
+
+ Writef(m, ">>\n");
+
+ cmsDeleteTransform(xform);
+ cmsCloseProfile(hLab);
+ return 1;
+}
+
+
+// Does create a Color Space Array on XYZ colorspace for PostScript usage
+
+DWORD LCMSEXPORT cmsGetPostScriptCSA(cmsHPROFILE hProfile,
+ int Intent,
+ LPVOID Buffer, DWORD dwBufferLen)
+{
+
+ LPMEMSTREAM mem;
+ DWORD dwBytesUsed;
+
+ // Set up the serialization engine
+ mem = CreateMemStream((LPBYTE) Buffer, dwBufferLen, MAXPSCOLS);
+ if (!mem) return 0;
+
+
+ // Is a named color profile?
+ if (cmsGetDeviceClass(hProfile) == icSigNamedColorClass) {
+
+ if (!WriteNamedColorCSA(mem, hProfile, Intent)) {
+
+ free((void*) mem);
+ return 0;
+ }
+ }
+ else {
+
+
+ // Any profile class are allowed (including devicelink), but
+ // output (PCS) colorspace must be XYZ or Lab
+ icColorSpaceSignature ColorSpace = cmsGetPCS(hProfile);
+
+ if (ColorSpace != icSigXYZData &&
+ ColorSpace != icSigLabData) {
+
+ cmsSignalError(LCMS_ERRC_ABORTED, "Invalid output color space");
+ free((void*) mem);
+ return 0;
+ }
+
+ // Is there any CLUT?
+ if (IsLUTbased(hProfile, Intent)) {
+
+ // Yes, so handle as LUT-based
+ if (!WriteInputLUT(mem, hProfile, Intent)) {
+
+ free((void*) mem);
+ return 0;
+ }
+ }
+ else {
+
+ // No, try Matrix-shaper (this only works on XYZ)
+
+ if (!WriteInputMatrixShaper(mem, hProfile)) {
+
+ free((void*) mem); // Something went wrong
+ return 0;
+ }
+ }
+ }
+
+
+ // Done, keep memory usage
+ dwBytesUsed = mem ->dwUsed;
+
+ // Get rid of memory stream
+ free((void*) mem);
+
+ // Finally, return used byte count
+ return dwBytesUsed;
+}
+
+// ------------------------------------------------------ Color Rendering Dictionary (CRD)
+
+
+
+/*
+
+ Black point compensation plus chromatic adaptation:
+
+ Step 1 - Chromatic adaptation
+ =============================
+
+ WPout
+ X = ------- PQR
+ Wpin
+
+ Step 2 - Black point compensation
+ =================================
+
+ (WPout - BPout)*X - WPout*(BPin - BPout)
+ out = ---------------------------------------
+ WPout - BPin
+
+
+ Algorithm discussion
+ ====================
+
+ TransformPQR(WPin, BPin, WPout, BPout, PQR)
+
+ Wpin,etc= { Xws Yws Zws Pws Qws Rws }
+
+
+ Algorithm Stack 0...n
+ ===========================================================
+ PQR BPout WPout BPin WPin
+ 4 index 3 get WPin PQR BPout WPout BPin WPin
+ div (PQR/WPin) BPout WPout BPin WPin
+ 2 index 3 get WPout (PQR/WPin) BPout WPout BPin WPin
+ mult WPout*(PQR/WPin) BPout WPout BPin WPin
+
+ 2 index 3 get WPout WPout*(PQR/WPin) BPout WPout BPin WPin
+ 2 index 3 get BPout WPout WPout*(PQR/WPin) BPout WPout BPin WPin
+ sub (WPout-BPout) WPout*(PQR/WPin) BPout WPout BPin WPin
+ mult (WPout-BPout)* WPout*(PQR/WPin) BPout WPout BPin WPin
+
+ 2 index 3 get WPout (BPout-WPout)* WPout*(PQR/WPin) BPout WPout BPin WPin
+ 4 index 3 get BPin WPout (BPout-WPout)* WPout*(PQR/WPin) BPout WPout BPin WPin
+ 3 index 3 get BPout BPin WPout (BPout-WPout)* WPout*(PQR/WPin) BPout WPout BPin WPin
+
+ sub (BPin-BPout) WPout (BPout-WPout)* WPout*(PQR/WPin) BPout WPout BPin WPin
+ mult (BPin-BPout)*WPout (BPout-WPout)* WPout*(PQR/WPin) BPout WPout BPin WPin
+ sub (BPout-WPout)* WPout*(PQR/WPin)-(BPin-BPout)*WPout BPout WPout BPin WPin
+
+ 3 index 3 get BPin (BPout-WPout)* WPout*(PQR/WPin)-(BPin-BPout)*WPout BPout WPout BPin WPin
+ 3 index 3 get WPout BPin (BPout-WPout)* WPout*(PQR/WPin)-(BPin-BPout)*WPout BPout WPout BPin WPin
+ exch
+ sub (WPout-BPin) (BPout-WPout)* WPout*(PQR/WPin)-(BPin-BPout)*WPout BPout WPout BPin WPin
+ div
+
+ exch pop
+ exch pop
+ exch pop
+ exch pop
+
+*/
+
+
+static
+void EmitPQRStage(LPMEMSTREAM m, int DoBPC, int lIsAbsolute)
+{
+
+
+ Writef(m,"%% Bradford Cone Space\n"
+ "/MatrixPQR [0.8951 -0.7502 0.0389 0.2664 1.7135 -0.0685 -0.1614 0.0367 1.0296 ] \n");
+
+ Writef(m, "/RangePQR [ -0.5 2 -0.5 2 -0.5 2 ]\n");
+
+
+ if (lIsAbsolute) {
+
+ // For absolute colorimetric intent, do nothing
+
+ Writef(m, "%% Absolute colorimetric -- no transformation\n"
+ "/TransformPQR [\n"
+ "{exch pop exch pop exch pop exch pop} bind dup dup]\n");
+ return;
+ }
+
+
+ // No BPC
+
+ if (!DoBPC) {
+
+ Writef(m, "%% VonKries-like transform in Bradford Cone Space\n"
+ "/TransformPQR [\n"
+ "{exch pop exch 3 get mul exch pop exch 3 get div} bind\n"
+ "{exch pop exch 4 get mul exch pop exch 4 get div} bind\n"
+ "{exch pop exch 5 get mul exch pop exch 5 get div} bind\n]\n");
+ } else {
+
+ // BPC
+
+ Writef(m, "%% VonKries-like transform in Bradford Cone Space plus BPC\n"
+ "/TransformPQR [\n");
+
+ Writef(m, "{4 index 3 get div 2 index 3 get mul "
+ "2 index 3 get 2 index 3 get sub mul "
+ "2 index 3 get 4 index 3 get 3 index 3 get sub mul sub "
+ "3 index 3 get 3 index 3 get exch sub div "
+ "exch pop exch pop exch pop exch pop } bind\n");
+
+ Writef(m, "{4 index 4 get div 2 index 4 get mul "
+ "2 index 4 get 2 index 4 get sub mul "
+ "2 index 4 get 4 index 4 get 3 index 4 get sub mul sub "
+ "3 index 4 get 3 index 4 get exch sub div "
+ "exch pop exch pop exch pop exch pop } bind\n");
+
+ Writef(m, "{4 index 5 get div 2 index 5 get mul "
+ "2 index 5 get 2 index 5 get sub mul "
+ "2 index 5 get 4 index 5 get 3 index 5 get sub mul sub "
+ "3 index 5 get 3 index 5 get exch sub div "
+ "exch pop exch pop exch pop exch pop } bind\n]\n");
+
+ }
+
+
+}
+
+
+static
+void EmitXYZ2Lab(LPMEMSTREAM m)
+{
+ Writef(m, "/EncodeLMN [\n");
+ Writef(m, "{ 0.964200 div dup 0.008856 le {7.787 mul 16 116 div add}{1 3 div exp} ifelse } bind\n");
+ Writef(m, "{ 1.000000 div dup 0.008856 le {7.787 mul 16 116 div add}{1 3 div exp} ifelse } bind\n");
+ Writef(m, "{ 0.824900 div dup 0.008856 le {7.787 mul 16 116 div add}{1 3 div exp} ifelse } bind\n");
+ Writef(m, "]\n");
+ Writef(m, "/MatrixABC [ 0 1 0 1 -1 1 0 0 -1 ]\n");
+ Writef(m, "/EncodeABC [\n");
+
+
+
+ Writef(m, "{ 116 mul 16 sub 100 div } bind\n");
+ Writef(m, "{ 500 mul 128 add 255 div } bind\n");
+ Writef(m, "{ 200 mul 128 add 255 div } bind\n");
+
+
+ /*
+ Writef(m, "{ 116 mul 16 sub 256 mul 25700 div } bind\n");
+ Writef(m, "{ 500 mul 128 add 256 mul 65535 div } bind\n");
+ Writef(m, "{ 200 mul 128 add 256 mul 65535 div } bind\n");
+ */
+
+ Writef(m, "]\n");
+
+
+}
+
+// Due to impedance mismatch between XYZ and almost all RGB and CMYK spaces
+// I choose to dump LUTS in Lab instead of XYZ. There is still a lot of wasted
+// space on 3D CLUT, but since space seems not to be a problem here, 33 points
+// would give a reasonable accurancy. Note also that CRD tables must operate in
+// 8 bits.
+
+static
+int WriteOutputLUT(LPMEMSTREAM m, cmsHPROFILE hProfile, int Intent, DWORD dwFlags)
+{
+ cmsHPROFILE hLab;
+ cmsHTRANSFORM xform;
+ icColorSpaceSignature ColorSpace;
+ int i, nChannels;
+ DWORD OutputFormat;
+ _LPcmsTRANSFORM v;
+ LPLUT DeviceLink;
+ cmsHPROFILE Profiles[3];
+ cmsCIEXYZ BlackPointAdaptedToD50;
+ BOOL lFreeDeviceLink = FALSE;
+ BOOL lDoBPC = (dwFlags & cmsFLAGS_BLACKPOINTCOMPENSATION);
+
+
+ // Trick our v4 profile as it were v2. This prevents the ajusting done
+ // in perceptual & saturation. We only neew v4 encoding!
+
+ hLab = cmsCreateLab4Profile(NULL);
+ cmsSetProfileICCversion(hLab, 0);
+
+ ColorSpace = cmsGetColorSpace(hProfile);
+ nChannels = _cmsChannelsOf(ColorSpace);
+ OutputFormat = CHANNELS_SH(nChannels) | BYTES_SH(2);
+
+ // Is a devicelink profile?
+ if (cmsGetDeviceClass(hProfile) == icSigLinkClass) {
+
+ // if devicelink input already in Lab
+
+ if (ColorSpace == icSigLabData) {
+
+ // adjust input to Lab to out v4
+
+ Profiles[0] = hLab;
+ Profiles[1] = hProfile;
+
+ xform = cmsCreateMultiprofileTransform(Profiles, 2, TYPE_Lab_DBL,
+ OutputFormat, Intent, cmsFLAGS_NOPRELINEARIZATION);
+
+ }
+ else {
+ cmsSignalError(LCMS_ERRC_ABORTED, "Cannot use devicelink profile for CRD creation");
+ return 0;
+ }
+
+
+ }
+ else {
+
+ // This is a normal profile
+ xform = cmsCreateTransform(hLab, TYPE_Lab_DBL, hProfile,
+ OutputFormat, Intent, cmsFLAGS_NOPRELINEARIZATION);
+ }
+
+ if (xform == NULL) {
+
+ cmsSignalError(LCMS_ERRC_ABORTED, "Cannot create transform Lab -> Profile in CRD creation");
+ return 0;
+ }
+
+ // Get the internal precalculated devicelink
+
+ v = (_LPcmsTRANSFORM) xform;
+ DeviceLink = v ->DeviceLink;
+
+ if (!DeviceLink) {
+
+ DeviceLink = _cmsPrecalculateDeviceLink(xform, 0);
+ lFreeDeviceLink = TRUE;
+ }
+
+ Writef(m, "<<\n");
+ Writef(m, "/ColorRenderingType 1\n");
+
+
+ cmsDetectBlackPoint(&BlackPointAdaptedToD50, hProfile, Intent, LCMS_BPFLAGS_D50_ADAPTED);
+
+ // Emit headers, etc.
+ EmitWhiteBlackD50(m, &BlackPointAdaptedToD50);
+ EmitPQRStage(m, lDoBPC, Intent == INTENT_ABSOLUTE_COLORIMETRIC);
+ EmitXYZ2Lab(m);
+
+ if (DeviceLink ->wFlags & LUT_HASTL1) {
+
+ // Shouldn't happen
+ cmsSignalError(LCMS_ERRC_ABORTED, "Internal error (prelinearization on CRD)");
+ }
+
+
+ // FIXUP: map Lab (100, 0, 0) to perfect white, because the particular encoding for Lab
+ // does map a=b=0 not falling into any specific node. Since range a,b goes -128..127,
+ // zero is slightly moved towards right, so assure next node (in L=100 slice) is mapped to
+ // zero. This would sacrifice a bit of highlights, but failure to do so would cause
+ // scum dot. Ouch.
+
+ Writef(m, "/RenderTable ");
+
+ WriteCLUT(m, DeviceLink, 8, "<", ">\n", "", "", FALSE,
+ (Intent != INTENT_ABSOLUTE_COLORIMETRIC), ColorSpace);
+
+ Writef(m, " %d {} bind ", nChannels);
+
+ for (i=1; i < nChannels; i++)
+ Writef(m, "dup ");
+
+ Writef(m, "]\n");
+
+
+ EmitIntent(m, Intent);
+
+ Writef(m, ">>\n");
+
+ if (!(dwFlags & cmsFLAGS_NODEFAULTRESOURCEDEF)) {
+
+ Writef(m, "/Current exch /ColorRendering defineresource pop\n");
+ }
+
+ if (lFreeDeviceLink) cmsFreeLUT(DeviceLink);
+ cmsDeleteTransform(xform);
+ cmsCloseProfile(hLab);
+
+ return 1;
+}
+
+
+// Builds a ASCII string containing colorant list in 0..1.0 range
+static
+void BuildColorantList(char *Colorant, int nColorant, WORD Out[])
+{
+ char Buff[32];
+ int j;
+
+ Colorant[0] = 0;
+ for (j=0; j < nColorant; j++) {
+
+ sprintf(Buff, "%.3f", Out[j] / 65535.0);
+ strcat(Colorant, Buff);
+ if (j < nColorant -1)
+ strcat(Colorant, " ");
+
+ }
+}
+
+
+// Creates a PostScript color list from a named profile data.
+// This is a HP extension.
+
+static
+int WriteNamedColorCRD(LPMEMSTREAM m, cmsHPROFILE hNamedColor, int Intent, DWORD dwFlags)
+{
+ cmsHTRANSFORM xform;
+ int i, nColors, nColorant;
+ DWORD OutputFormat;
+ char ColorName[32];
+ char Colorant[128];
+
+ nColorant = _cmsChannelsOf(cmsGetColorSpace(hNamedColor));
+ OutputFormat = CHANNELS_SH(nColorant) | BYTES_SH(2);
+
+ xform = cmsCreateTransform(hNamedColor, TYPE_NAMED_COLOR_INDEX,
+ NULL, OutputFormat, Intent, cmsFLAGS_NOTPRECALC);
+ if (xform == NULL) return 0;
+
+
+ Writef(m, "<<\n");
+ Writef(m, "(colorlistcomment) (%s) \n", "Named profile");
+ Writef(m, "(Prefix) [ (Pantone ) (PANTONE ) ]\n");
+ Writef(m, "(Suffix) [ ( CV) ( CVC) ( C) ]\n");
+
+ nColors = cmsNamedColorCount(xform);
+
+
+ for (i=0; i < nColors; i++) {
+
+ WORD In[1];
+ WORD Out[MAXCHANNELS];
+
+ In[0] = (WORD) i;
+
+ if (!cmsNamedColorInfo(xform, i, ColorName, NULL, NULL))
+ continue;
+
+ cmsDoTransform(xform, In, Out, 1);
+ BuildColorantList(Colorant, nColorant, Out);
+ Writef(m, " (%s) [ %s ]\n", ColorName, Colorant);
+ }
+
+ Writef(m, " >>");
+
+ if (!(dwFlags & cmsFLAGS_NODEFAULTRESOURCEDEF)) {
+
+ Writef(m, " /Current exch /HPSpotTable defineresource pop\n");
+ }
+
+ cmsDeleteTransform(xform);
+ return 1;
+}
+
+
+
+// This one does create a Color Rendering Dictionary.
+// CRD are always LUT-Based, no matter if profile is
+// implemented as matrix-shaper.
+
+DWORD LCMSEXPORT cmsGetPostScriptCRDEx(cmsHPROFILE hProfile,
+ int Intent, DWORD dwFlags,
+ LPVOID Buffer, DWORD dwBufferLen)
+{
+
+ LPMEMSTREAM mem;
+ DWORD dwBytesUsed;
+
+ // Set up the serialization artifact
+ mem = CreateMemStream((LPBYTE) Buffer, dwBufferLen, MAXPSCOLS);
+ if (!mem) return 0;
+
+
+ if (!(dwFlags & cmsFLAGS_NODEFAULTRESOURCEDEF)) {
+
+ EmitHeader(mem, "Color Rendering Dictionary (CRD)", hProfile);
+ }
+
+
+ // Is a named color profile?
+ if (cmsGetDeviceClass(hProfile) == icSigNamedColorClass) {
+
+ if (!WriteNamedColorCRD(mem, hProfile, Intent, dwFlags)) {
+
+ free((void*) mem);
+ return 0;
+ }
+ }
+ else {
+
+ // CRD are always implemented as LUT.
+
+
+ if (!WriteOutputLUT(mem, hProfile, Intent, dwFlags)) {
+ free((void*) mem);
+ return 0;
+ }
+ }
+
+ if (!(dwFlags & cmsFLAGS_NODEFAULTRESOURCEDEF)) {
+
+ Writef(mem, "%%%%EndResource\n");
+ Writef(mem, "\n%% CRD End\n");
+ }
+
+ // Done, keep memory usage
+ dwBytesUsed = mem ->dwUsed;
+
+ // Get rid of memory stream
+ free((void*) mem);
+
+ // Finally, return used byte count
+ return dwBytesUsed;
+}
+
+
+// For compatibility with previous versions
+
+DWORD LCMSEXPORT cmsGetPostScriptCRD(cmsHPROFILE hProfile,
+ int Intent,
+ LPVOID Buffer, DWORD dwBufferLen)
+{
+ return cmsGetPostScriptCRDEx(hProfile, Intent, 0, Buffer, dwBufferLen);
+}
diff --git a/icc2ps/cmssamp.c b/icc2ps/cmssamp.c
new file mode 100644
index 0000000..f24429c
--- /dev/null
+++ b/icc2ps/cmssamp.c
@@ -0,0 +1,618 @@
+//
+// Little cms
+// Copyright (C) 1998-2005 Marti Maria
+//
+// Permission is hereby granted, free of charge, to any person obtaining
+// a copy of this software and associated documentation files (the "Software"),
+// to deal in the Software without restriction, including without limitation
+// the rights to use, copy, modify, merge, publish, distribute, sublicense,
+// and/or sell copies of the Software, and to permit persons to whom the Software
+// is furnished to do so, subject to the following conditions:
+//
+// The above copyright notice and this permission notice shall be included in
+// all copies or substantial portions of the Software.
+//
+// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
+// EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO
+// THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
+// NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
+// LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
+// OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
+// WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
+
+
+#include "lcms.h"
+
+
+// ---------------------------------------------------------------------------------
+
+// Quantize a value 0 <= i < MaxSamples
+
+WORD _cmsQuantizeVal(double i, int MaxSamples)
+{
+ double x;
+
+ x = ((double) i * 65535.) / (double) (MaxSamples - 1);
+
+ return (WORD) floor(x + .5);
+}
+
+
+// Is a table linear?
+
+int cmsIsLinear(WORD Table[], int nEntries)
+{
+ register int i;
+ int diff;
+
+ for (i=0; i < nEntries; i++) {
+
+ diff = abs((int) Table[i] - (int) _cmsQuantizeVal(i, nEntries));
+ if (diff > 3)
+ return 0;
+ }
+
+ return 1;
+}
+
+
+
+// pow() restricted to integer
+
+static
+int ipow(int base, int exp)
+{
+ int res = base;
+
+ while (--exp)
+ res *= base;
+
+ return res;
+}
+
+
+// Given n, 0<=n<=clut^dim, returns the colorant.
+
+static
+int ComponentOf(int n, int clut, int nColorant)
+{
+ if (nColorant <= 0)
+ return (n % clut);
+
+ n /= ipow(clut, nColorant);
+
+ return (n % clut);
+}
+
+
+
+// This routine does a sweep on whole input space, and calls its callback
+// function on knots. returns TRUE if all ok, FALSE otherwise.
+
+BOOL LCMSEXPORT cmsSample3DGrid(LPLUT Lut, _cmsSAMPLER Sampler, LPVOID Cargo, DWORD dwFlags)
+{
+ int i, t, nTotalPoints, Colorant, index;
+ WORD In[MAXCHANNELS], Out[MAXCHANNELS];
+
+ nTotalPoints = ipow(Lut->cLutPoints, Lut -> InputChan);
+
+ index = 0;
+ for (i = 0; i < nTotalPoints; i++) {
+
+ for (t=0; t < (int) Lut -> InputChan; t++) {
+
+ Colorant = ComponentOf(i, Lut -> cLutPoints, (Lut -> InputChan - t - 1 ));
+ In[t] = _cmsQuantizeVal(Colorant, Lut -> cLutPoints);
+ }
+
+
+ if (dwFlags & SAMPLER_HASTL1) {
+
+ for (t=0; t < (int) Lut -> InputChan; t++)
+ In[t] = cmsReverseLinearInterpLUT16(In[t],
+ Lut -> L1[t],
+ &Lut -> In16params);
+ }
+
+
+ // if (dwFlags & SAMPLER_INSPECT) {
+
+ for (t=0; t < (int) Lut -> OutputChan; t++)
+ Out[t] = Lut->T[index + t];
+ // }
+
+
+ if (!Sampler(In, Out, Cargo))
+ return FALSE;
+
+ if (!(dwFlags & SAMPLER_INSPECT)) {
+
+ if (dwFlags & SAMPLER_HASTL2) {
+
+ for (t=0; t < (int) Lut -> OutputChan; t++)
+ Out[t] = cmsReverseLinearInterpLUT16(Out[t],
+ Lut -> L2[t],
+ &Lut -> Out16params);
+ }
+
+
+ for (t=0; t < (int) Lut -> OutputChan; t++)
+ Lut->T[index + t] = Out[t];
+
+ }
+
+ index += Lut -> OutputChan;
+
+ }
+
+ return TRUE;
+}
+
+
+
+
+
+
+// choose reasonable resolution
+int _cmsReasonableGridpointsByColorspace(icColorSpaceSignature Colorspace, DWORD dwFlags)
+{
+ int nChannels;
+
+ // Already specified?
+ if (dwFlags & 0x00FF0000) {
+ // Yes, grab'em
+ return (dwFlags >> 16) & 0xFF;
+ }
+
+ nChannels = _cmsChannelsOf(Colorspace);
+
+ // HighResPrecalc is maximum resolution
+
+ if (dwFlags & cmsFLAGS_HIGHRESPRECALC) {
+
+ if (nChannels > 4)
+ return 7; // 7 for Hifi
+
+ if (nChannels == 4) // 23 for CMYK
+ return 23;
+
+ return 49; // 49 for RGB and others
+ }
+
+
+ // LowResPrecal is stripped resolution
+
+ if (dwFlags & cmsFLAGS_LOWRESPRECALC) {
+
+ if (nChannels > 4)
+ return 6; // 6 for Hifi
+
+ if (nChannels == 1)
+ return 33; // For monochrome
+
+ return 17; // 17 for remaining
+ }
+
+ // Default values
+
+ if (nChannels > 4)
+ return 7; // 7 for Hifi
+
+ if (nChannels == 4)
+ return 17; // 17 for CMYK
+
+ return 33; // 33 for RGB
+
+}
+
+// Sampler implemented by another transform. This is a clean way to
+// precalculate the devicelink 3D CLUT for almost any transform
+
+static
+int XFormSampler(register WORD In[], register WORD Out[], register LPVOID Cargo)
+{
+ cmsDoTransform((cmsHTRANSFORM) Cargo, In, Out, 1);
+ return TRUE;
+}
+
+// This routine does compute the devicelink CLUT containing whole
+// transform. Handles any channel number.
+
+LPLUT _cmsPrecalculateDeviceLink(cmsHTRANSFORM h, DWORD dwFlags)
+{
+ _LPcmsTRANSFORM p = (_LPcmsTRANSFORM) h;
+ LPLUT Grid;
+ int nGridPoints;
+ DWORD dwFormatIn, dwFormatOut;
+ int ChannelsIn, ChannelsOut;
+ LPLUT SaveGamutLUT;
+
+ // Remove any gamut checking
+ SaveGamutLUT = p ->Gamut;
+ p ->Gamut = NULL;
+
+ ChannelsIn = _cmsChannelsOf(p -> EntryColorSpace);
+ ChannelsOut = _cmsChannelsOf(p -> ExitColorSpace);
+
+ nGridPoints = _cmsReasonableGridpointsByColorspace(p -> EntryColorSpace, dwFlags);
+
+ Grid = cmsAllocLUT();
+ if (!Grid) return NULL;
+
+ Grid = cmsAlloc3DGrid(Grid, nGridPoints, ChannelsIn, ChannelsOut);
+
+ // Compute device link on 16-bit basis
+ dwFormatIn = (CHANNELS_SH(ChannelsIn)|BYTES_SH(2));
+ dwFormatOut = (CHANNELS_SH(ChannelsOut)|BYTES_SH(2));
+
+ p -> FromInput = _cmsIdentifyInputFormat(p, dwFormatIn);
+ p -> ToOutput = _cmsIdentifyOutputFormat(p, dwFormatOut);
+
+ // Fix gamut & gamma possible mismatches.
+
+ if (!(dwFlags & cmsFLAGS_NOPRELINEARIZATION)) {
+
+ cmsHTRANSFORM hOne[1];
+ hOne[0] = h;
+
+ _cmsComputePrelinearizationTablesFromXFORM(hOne, 1, Grid);
+ }
+
+
+ // Attention to this typecast! we can take the luxury to
+ // do this since cmsHTRANSFORM is only an alias to a pointer
+ // to the transform struct.
+
+ if (!cmsSample3DGrid(Grid, XFormSampler, (LPVOID) p, Grid -> wFlags)) {
+
+ cmsFreeLUT(Grid);
+ return NULL;
+ }
+
+
+ p ->Gamut = SaveGamutLUT;
+ return Grid;
+}
+
+
+
+// Sampler for Black-preserving CMYK->CMYK transforms
+
+typedef struct {
+ cmsHTRANSFORM cmyk2cmyk;
+ cmsHTRANSFORM cmyk2Lab;
+ LPGAMMATABLE KTone;
+ L16PARAMS KToneParams;
+ LPLUT LabK2cmyk;
+ double MaxError;
+
+ cmsHTRANSFORM hRoundTrip;
+ int MaxTAC;
+
+ cmsHTRANSFORM hProofOutput;
+
+ } BPCARGO, *LPBPCARGO;
+
+
+
+
+
+static
+int BlackPreservingSampler(register WORD In[], register WORD Out[], register LPVOID Cargo)
+{
+
+ WORD LabK[4];
+ double SumCMY, SumCMYK, Error;
+ cmsCIELab ColorimetricLab, BlackPreservingLab;
+ BPCARGO* bp = (LPBPCARGO) Cargo;
+
+ // Get the K across Tone curve
+ LabK[3] = cmsLinearInterpLUT16(In[3], bp->KTone ->GammaTable, &bp->KToneParams);
+
+
+ // If going across black only, keep black only
+
+ if (In[0] == 0 && In[1] == 0 && In[2] == 0) {
+
+ Out[0] = Out[1] = Out[2] = 0;
+ Out[3] = LabK[3];
+ return 1;
+ }
+
+ // Try the original transform, maybe K is already ok (valid on K=0)
+ cmsDoTransform(bp ->cmyk2cmyk, In, Out, 1);
+ if (Out[3] == LabK[3]) return 1;
+
+
+ // No, mesure and keep Lab measurement for further usage
+ cmsDoTransform(bp->hProofOutput, Out, &ColorimetricLab, 1);
+
+ // Is not black only and the transform doesn't keep black.
+ // Obtain the Lab of CMYK. After that we have Lab + K
+ cmsDoTransform(bp ->cmyk2Lab, In, LabK, 1);
+
+ // Obtain the corresponding CMY using reverse interpolation.
+ // As a seed, we use the colorimetric CMY
+ cmsEvalLUTreverse(bp ->LabK2cmyk, LabK, Out, Out);
+
+ // Estimate the error
+ cmsDoTransform(bp->hProofOutput, Out, &BlackPreservingLab, 1);
+ Error = cmsDeltaE(&ColorimetricLab, &BlackPreservingLab);
+
+
+
+ // Apply TAC if needed
+
+ SumCMY = Out[0] + Out[1] + Out[2];
+ SumCMYK = SumCMY + Out[3];
+
+ if (SumCMYK > bp ->MaxTAC) {
+
+ double Ratio = 1 - ((SumCMYK - bp->MaxTAC) / SumCMY);
+ if (Ratio < 0)
+ Ratio = 0;
+
+ Out[0] = (WORD) floor(Out[0] * Ratio + 0.5); // C
+ Out[1] = (WORD) floor(Out[1] * Ratio + 0.5); // M
+ Out[2] = (WORD) floor(Out[2] * Ratio + 0.5); // Y
+ }
+
+ return 1;
+}
+
+
+// Sample whole gamut to estimate maximum TAC
+
+#ifdef _MSC_VER
+#pragma warning(disable : 4100)
+#endif
+
+static
+int EstimateTAC(register WORD In[], register WORD Out[], register LPVOID Cargo)
+{
+ BPCARGO* bp = (LPBPCARGO) Cargo;
+ WORD RoundTrip[4];
+ int Sum;
+
+ cmsDoTransform(bp->hRoundTrip, In, RoundTrip, 1);
+
+ Sum = RoundTrip[0] + RoundTrip[1] + RoundTrip[2] + RoundTrip[3];
+
+ if (Sum > bp ->MaxTAC)
+ bp ->MaxTAC = Sum;
+
+ return 1;
+}
+
+
+// Estimate the maximum error
+
+static
+int BlackPreservingEstimateErrorSampler(register WORD In[], register WORD Out[], register LPVOID Cargo)
+{
+ BPCARGO* bp = (LPBPCARGO) Cargo;
+ WORD ColorimetricOut[4];
+ cmsCIELab ColorimetricLab, BlackPreservingLab;
+ double Error;
+
+
+
+ if (In[0] == 0 && In[1] == 0 && In[2] == 0) return 1;
+
+
+ cmsDoTransform(bp->cmyk2cmyk, In, ColorimetricOut, 1);
+
+ cmsDoTransform(bp->hProofOutput, ColorimetricOut, &ColorimetricLab, 1);
+ cmsDoTransform(bp->hProofOutput, Out, &BlackPreservingLab, 1);
+
+ Error = cmsDeltaE(&ColorimetricLab, &BlackPreservingLab);
+
+ if (Error > bp ->MaxError)
+ bp ->MaxError = Error;
+
+ return 1;
+}
+
+
+// This is the black-preserving devicelink generator
+
+
+LPLUT _cmsPrecalculateBlackPreservingDeviceLink(cmsHTRANSFORM hCMYK2CMYK, DWORD dwFlags)
+{
+ _LPcmsTRANSFORM p = (_LPcmsTRANSFORM) hCMYK2CMYK;
+ BPCARGO Cargo;
+ LPLUT Grid;
+ cmsHPROFILE hLab = cmsCreateLabProfile(NULL);
+ int nGridPoints;
+ icTagSignature Device2PCS[] = {icSigAToB0Tag, // Perceptual
+ icSigAToB1Tag, // Relative colorimetric
+ icSigAToB2Tag, // Saturation
+ icSigAToB1Tag }; // Absolute colorimetric
+ // (Relative/WhitePoint)
+
+
+ nGridPoints = _cmsReasonableGridpointsByColorspace(p -> EntryColorSpace, dwFlags);
+
+
+
+ // Fill in cargo struct
+
+ Cargo.cmyk2cmyk = hCMYK2CMYK;
+
+
+ // Compute tone curves
+
+
+ Cargo.KTone = _cmsBuildKToneCurve(hCMYK2CMYK, 256);
+ if (Cargo.KTone == NULL) return NULL;
+ cmsCalcL16Params(Cargo.KTone ->nEntries, &Cargo.KToneParams);
+
+
+ Cargo.cmyk2Lab = cmsCreateTransform(p ->InputProfile, TYPE_CMYK_16,
+ hLab, TYPE_Lab_16, p->Intent, cmsFLAGS_NOTPRECALC);
+
+ // We are going to use the reverse of proof direction
+ Cargo.LabK2cmyk = cmsReadICCLut(p->OutputProfile, Device2PCS[p->Intent]);
+
+
+
+ // Setup a roundtrip on output profile for TAC estimation
+
+ Cargo.hRoundTrip = cmsCreateTransform(p ->OutputProfile, TYPE_CMYK_16,
+ p ->OutputProfile, TYPE_CMYK_16, p->Intent, cmsFLAGS_NOTPRECALC);
+
+
+ // Setup a proof CMYK->Lab on output
+
+ Cargo.hProofOutput = cmsCreateTransform(p ->OutputProfile, TYPE_CMYK_16,
+ hLab, TYPE_Lab_DBL, p->Intent, cmsFLAGS_NOTPRECALC);
+
+
+ Grid = cmsAllocLUT();
+ if (!Grid) return NULL;
+
+ Grid = cmsAlloc3DGrid(Grid, nGridPoints, 4, 4);
+
+
+ p -> FromInput = _cmsIdentifyInputFormat(p, TYPE_CMYK_16);
+ p -> ToOutput = _cmsIdentifyOutputFormat(p, TYPE_CMYK_16);
+
+
+
+ // Step #1, estimate TAC
+
+ Cargo.MaxTAC = 0;
+ if (!cmsSample3DGrid(Grid, EstimateTAC, (LPVOID) &Cargo, 0)) {
+
+ cmsFreeLUT(Grid);
+ Grid = NULL;
+ goto Cleanup;
+ }
+
+ // Step #2, compute approximation
+
+ if (!cmsSample3DGrid(Grid, BlackPreservingSampler, (LPVOID) &Cargo, 0)) {
+
+ cmsFreeLUT(Grid);
+ Grid = NULL;
+ goto Cleanup;
+ }
+
+ // Step #3, estimate error
+
+ Cargo.MaxError = 0;
+ cmsSample3DGrid(Grid, BlackPreservingEstimateErrorSampler, (LPVOID) &Cargo, SAMPLER_INSPECT);
+
+
+Cleanup:
+
+ cmsDeleteTransform(Cargo.cmyk2Lab);
+ cmsDeleteTransform(Cargo.hRoundTrip);
+ cmsDeleteTransform(Cargo.hProofOutput);
+
+ cmsCloseProfile(hLab);
+
+ cmsFreeGamma(Cargo.KTone);
+
+ cmsFreeLUT(Cargo.LabK2cmyk);
+
+ return Grid;
+}
+
+
+
+// Fix broken LUT. just to obtain other CMS compatibility
+
+static
+void PatchLUT(LPLUT Grid, WORD At[], WORD Value[],
+ int nChannelsOut, int nChannelsIn)
+{
+ LPL16PARAMS p16 = &Grid -> CLut16params;
+ double px, py, pz, pw;
+ int x0, y0, z0, w0;
+ int i, index;
+
+
+ if (Grid ->wFlags & LUT_HASTL1) return; // There is a prelinearization
+
+ px = ((double) At[0] * (p16->Domain)) / 65535.0;
+ py = ((double) At[1] * (p16->Domain)) / 65535.0;
+ pz = ((double) At[2] * (p16->Domain)) / 65535.0;
+ pw = ((double) At[3] * (p16->Domain)) / 65535.0;
+
+ x0 = (int) floor(px);
+ y0 = (int) floor(py);
+ z0 = (int) floor(pz);
+ w0 = (int) floor(pw);
+
+ if (nChannelsIn == 4) {
+
+ if (((px - x0) != 0) ||
+ ((py - y0) != 0) ||
+ ((pz - z0) != 0) ||
+ ((pw - w0) != 0)) return; // Not on exact node
+
+ index = p16 -> opta4 * x0 +
+ p16 -> opta3 * y0 +
+ p16 -> opta2 * z0 +
+ p16 -> opta1 * w0;
+ }
+ else
+ if (nChannelsIn == 3) {
+
+ if (((px - x0) != 0) ||
+ ((py - y0) != 0) ||
+ ((pz - z0) != 0)) return; // Not on exact node
+
+ index = p16 -> opta3 * x0 +
+ p16 -> opta2 * y0 +
+ p16 -> opta1 * z0;
+ }
+ else
+ if (nChannelsIn == 1) {
+
+ if (((px - x0) != 0)) return; // Not on exact node
+
+ index = p16 -> opta1 * x0;
+ }
+ else {
+ cmsSignalError(LCMS_ERRC_ABORTED, "(internal) %d Channels are not supported on PatchLUT", nChannelsIn);
+ return;
+ }
+
+ for (i=0; i < nChannelsOut; i++)
+ Grid -> T[index + i] = Value[i];
+
+}
+
+
+
+BOOL _cmsFixWhiteMisalignment(_LPcmsTRANSFORM p)
+{
+
+ WORD *WhitePointIn, *WhitePointOut, *BlackPointIn, *BlackPointOut;
+ int nOuts, nIns;
+
+
+ if (!p -> DeviceLink) return FALSE;
+
+ if (p ->Intent == INTENT_ABSOLUTE_COLORIMETRIC) return FALSE;
+ if ((p ->PreviewProfile != NULL) &&
+ (p ->ProofIntent == INTENT_ABSOLUTE_COLORIMETRIC)) return FALSE;
+
+
+ if (!_cmsEndPointsBySpace(p -> EntryColorSpace,
+ &WhitePointIn, &BlackPointIn, &nIns)) return FALSE;
+
+
+ if (!_cmsEndPointsBySpace(p -> ExitColorSpace,
+ &WhitePointOut, &BlackPointOut, &nOuts)) return FALSE;
+
+ // Fix white only
+
+ PatchLUT(p -> DeviceLink, WhitePointIn, WhitePointOut, nOuts, nIns);
+ // PatchLUT(p -> DeviceLink, BlackPointIn, BlackPointOut, nOuts, nIns);
+
+ return TRUE;
+}
+
diff --git a/icc2ps/cmsvirt.c b/icc2ps/cmsvirt.c
new file mode 100644
index 0000000..418ba0d
--- /dev/null
+++ b/icc2ps/cmsvirt.c
@@ -0,0 +1,843 @@
+//
+// Little cms
+// Copyright (C) 1998-2004 Marti Maria
+//
+// Permission is hereby granted, free of charge, to any person obtaining
+// a copy of this software and associated documentation files (the "Software"),
+// to deal in the Software without restriction, including without limitation
+// the rights to use, copy, modify, merge, publish, distribute, sublicense,
+// and/or sell copies of the Software, and to permit persons to whom the Software
+// is furnished to do so, subject to the following conditions:
+//
+// The above copyright notice and this permission notice shall be included in
+// all copies or substantial portions of the Software.
+//
+// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
+// EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO
+// THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
+// NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
+// LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
+// OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
+// WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
+
+
+#include "lcms.h"
+
+
+// Virtual (built-in) profiles
+// -----------------------------------------------------------------------------------
+
+
+// This function creates a profile based on White point, primaries and
+// transfer functions.
+
+
+cmsHPROFILE LCMSEXPORT cmsCreateRGBProfile(LPcmsCIExyY WhitePoint,
+ LPcmsCIExyYTRIPLE Primaries,
+ LPGAMMATABLE TransferFunction[3])
+{
+ cmsHPROFILE hICC;
+ cmsCIEXYZ tmp;
+ MAT3 MColorants;
+ cmsCIEXYZTRIPLE Colorants;
+ cmsCIExyY MaxWhite;
+
+
+ hICC = _cmsCreateProfilePlaceholder();
+ if (!hICC) // can't allocate
+ return NULL;
+
+
+ cmsSetDeviceClass(hICC, icSigDisplayClass);
+ cmsSetColorSpace(hICC, icSigRgbData);
+ cmsSetPCS(hICC, icSigXYZData);
+ cmsSetRenderingIntent(hICC, INTENT_PERCEPTUAL);
+
+
+ // Implement profile using following tags:
+ //
+ // 1 icSigProfileDescriptionTag
+ // 2 icSigMediaWhitePointTag
+ // 3 icSigRedColorantTag
+ // 4 icSigGreenColorantTag
+ // 5 icSigBlueColorantTag
+ // 6 icSigRedTRCTag
+ // 7 icSigGreenTRCTag
+ // 8 icSigBlueTRCTag
+
+ // This conforms a standard RGB DisplayProfile as says ICC, and then I add
+
+ // 9 icSigChromaticityTag
+
+ // As addendum II
+
+
+ // Fill-in the tags
+
+ cmsAddTag(hICC, icSigDeviceMfgDescTag, (LPVOID) "(lcms internal)");
+ cmsAddTag(hICC, icSigProfileDescriptionTag, (LPVOID) "lcms RGB virtual profile");
+ cmsAddTag(hICC, icSigDeviceModelDescTag, (LPVOID) "rgb built-in");
+
+
+ if (WhitePoint) {
+
+ cmsxyY2XYZ(&tmp, WhitePoint);
+ cmsAddTag(hICC, icSigMediaWhitePointTag, (LPVOID) &tmp);
+ }
+
+ if (WhitePoint && Primaries) {
+
+ MaxWhite.x = WhitePoint -> x;
+ MaxWhite.y = WhitePoint -> y;
+ MaxWhite.Y = 1.0;
+
+ if (!cmsBuildRGB2XYZtransferMatrix(&MColorants, &MaxWhite, Primaries))
+ {
+ cmsCloseProfile(hICC);
+ return NULL;
+ }
+
+ cmsAdaptMatrixToD50(&MColorants, &MaxWhite);
+
+ Colorants.Red.X = MColorants.v[0].n[0];
+ Colorants.Red.Y = MColorants.v[1].n[0];
+ Colorants.Red.Z = MColorants.v[2].n[0];
+
+ Colorants.Green.X = MColorants.v[0].n[1];
+ Colorants.Green.Y = MColorants.v[1].n[1];
+ Colorants.Green.Z = MColorants.v[2].n[1];
+
+ Colorants.Blue.X = MColorants.v[0].n[2];
+ Colorants.Blue.Y = MColorants.v[1].n[2];
+ Colorants.Blue.Z = MColorants.v[2].n[2];
+
+ cmsAddTag(hICC, icSigRedColorantTag, (LPVOID) &Colorants.Red);
+ cmsAddTag(hICC, icSigBlueColorantTag, (LPVOID) &Colorants.Blue);
+ cmsAddTag(hICC, icSigGreenColorantTag, (LPVOID) &Colorants.Green);
+ }
+
+
+ if (TransferFunction) {
+
+ // In case of gamma, we must dup' the table pointer
+
+ cmsAddTag(hICC, icSigRedTRCTag, (LPVOID) TransferFunction[0]);
+ cmsAddTag(hICC, icSigGreenTRCTag, (LPVOID) TransferFunction[1]);
+ cmsAddTag(hICC, icSigBlueTRCTag, (LPVOID) TransferFunction[2]);
+ }
+
+ if (Primaries) {
+ cmsAddTag(hICC, icSigChromaticityTag, (LPVOID) Primaries);
+ }
+
+ return hICC;
+}
+
+
+
+// This function creates a profile based on White point and transfer function.
+
+cmsHPROFILE LCMSEXPORT cmsCreateGrayProfile(LPcmsCIExyY WhitePoint,
+ LPGAMMATABLE TransferFunction)
+{
+ cmsHPROFILE hICC;
+ cmsCIEXYZ tmp;
+
+
+ hICC = _cmsCreateProfilePlaceholder();
+ if (!hICC) // can't allocate
+ return NULL;
+
+
+ cmsSetDeviceClass(hICC, icSigDisplayClass);
+ cmsSetColorSpace(hICC, icSigGrayData);
+ cmsSetPCS(hICC, icSigXYZData);
+ cmsSetRenderingIntent(hICC, INTENT_PERCEPTUAL);
+
+
+
+ // Implement profile using following tags:
+ //
+ // 1 icSigProfileDescriptionTag
+ // 2 icSigMediaWhitePointTag
+ // 6 icSigGrayTRCTag
+
+ // This conforms a standard Gray DisplayProfile
+
+ // Fill-in the tags
+
+
+ cmsAddTag(hICC, icSigDeviceMfgDescTag, (LPVOID) "(lcms internal)");
+ cmsAddTag(hICC, icSigProfileDescriptionTag, (LPVOID) "lcms gray virtual profile");
+ cmsAddTag(hICC, icSigDeviceModelDescTag, (LPVOID) "gray built-in");
+
+
+ if (WhitePoint) {
+
+ cmsxyY2XYZ(&tmp, WhitePoint);
+ cmsAddTag(hICC, icSigMediaWhitePointTag, (LPVOID) &tmp);
+ }
+
+
+ if (TransferFunction) {
+
+ // In case of gamma, we must dup' the table pointer
+
+ cmsAddTag(hICC, icSigGrayTRCTag, (LPVOID) TransferFunction);
+ }
+
+ return hICC;
+
+}
+
+
+static
+int IsPCS(icColorSpaceSignature ColorSpace)
+{
+ return (ColorSpace == icSigXYZData ||
+ ColorSpace == icSigLabData);
+}
+
+static
+void FixColorSpaces(cmsHPROFILE hProfile,
+ icColorSpaceSignature ColorSpace,
+ icColorSpaceSignature PCS,
+ DWORD dwFlags)
+{
+
+ if (dwFlags & cmsFLAGS_GUESSDEVICECLASS) {
+
+ if (IsPCS(ColorSpace) && IsPCS(PCS)) {
+
+ cmsSetDeviceClass(hProfile, icSigAbstractClass);
+ cmsSetColorSpace(hProfile, ColorSpace);
+ cmsSetPCS(hProfile, PCS);
+ return;
+ }
+
+ if (IsPCS(ColorSpace) && !IsPCS(PCS)) {
+
+ cmsSetDeviceClass(hProfile, icSigOutputClass);
+ cmsSetPCS(hProfile, ColorSpace);
+ cmsSetColorSpace(hProfile, PCS);
+ return;
+ }
+
+ if (IsPCS(PCS) && !IsPCS(ColorSpace)) {
+
+ cmsSetDeviceClass(hProfile, icSigInputClass);
+ cmsSetColorSpace(hProfile, ColorSpace);
+ cmsSetPCS(hProfile, PCS);
+ return;
+ }
+ }
+
+ cmsSetDeviceClass(hProfile, icSigLinkClass);
+ cmsSetColorSpace(hProfile, ColorSpace);
+ cmsSetPCS(hProfile, PCS);
+
+}
+
+
+static
+cmsHPROFILE CreateNamedColorDevicelink(cmsHTRANSFORM xform)
+{
+ _LPcmsTRANSFORM v = (_LPcmsTRANSFORM) xform;
+ cmsHPROFILE hICC;
+ cmsCIEXYZ WhitePoint;
+ int i, nColors;
+ size_t Size;
+ LPcmsNAMEDCOLORLIST nc2;
+
+
+ hICC = _cmsCreateProfilePlaceholder();
+ if (hICC == NULL) return NULL;
+
+ cmsSetRenderingIntent(hICC, v -> Intent);
+ cmsSetDeviceClass(hICC, icSigNamedColorClass);
+ cmsSetColorSpace(hICC, v ->ExitColorSpace);
+ cmsSetPCS(hICC, cmsGetPCS(v ->InputProfile));
+ cmsTakeMediaWhitePoint(&WhitePoint, v ->InputProfile);
+
+ cmsAddTag(hICC, icSigMediaWhitePointTag, &WhitePoint);
+ cmsAddTag(hICC, icSigDeviceMfgDescTag, (LPVOID) "LittleCMS");
+ cmsAddTag(hICC, icSigProfileDescriptionTag, (LPVOID) "Named color Device link");
+ cmsAddTag(hICC, icSigDeviceModelDescTag, (LPVOID) "Named color Device link");
+
+
+ nColors = cmsNamedColorCount(xform);
+ nc2 = cmsAllocNamedColorList(nColors);
+
+ Size = sizeof(cmsNAMEDCOLORLIST) + (sizeof(cmsNAMEDCOLOR) * (nColors-1));
+
+ CopyMemory(nc2, v->NamedColorList, Size);
+ nc2 ->ColorantCount = _cmsChannelsOf(v ->ExitColorSpace);
+
+ for (i=0; i < nColors; i++) {
+ cmsDoTransform(xform, &i, nc2 ->List[i].DeviceColorant, 1);
+ }
+
+ cmsAddTag(hICC, icSigNamedColor2Tag, (void*) nc2);
+ cmsFreeNamedColorList(nc2);
+
+ return hICC;
+}
+
+
+// Does convert a transform into a device link profile
+
+cmsHPROFILE LCMSEXPORT cmsTransform2DeviceLink(cmsHTRANSFORM hTransform, DWORD dwFlags)
+{
+ cmsHPROFILE hICC;
+ _LPcmsTRANSFORM v = (_LPcmsTRANSFORM) hTransform;
+ LPLUT Lut;
+ BOOL MustFreeLUT;
+
+ // Check if is a named color transform
+
+ if (cmsGetDeviceClass(v ->InputProfile) == icSigNamedColorClass) {
+
+ return CreateNamedColorDevicelink(hTransform);
+
+ }
+
+ if (v ->DeviceLink) {
+
+ Lut = v -> DeviceLink;
+ MustFreeLUT = FALSE;
+ }
+ else {
+
+ Lut = _cmsPrecalculateDeviceLink(hTransform, dwFlags);
+ if (!Lut) return NULL;
+ MustFreeLUT = TRUE;
+ }
+
+ hICC = _cmsCreateProfilePlaceholder();
+ if (!hICC) { // can't allocate
+
+ if (MustFreeLUT) cmsFreeLUT(Lut);
+ return NULL;
+ }
+
+
+ FixColorSpaces(hICC, v -> EntryColorSpace, v -> ExitColorSpace, dwFlags);
+
+ cmsSetRenderingIntent(hICC, v -> Intent);
+
+ // Implement devicelink profile using following tags:
+ //
+ // 1 icSigProfileDescriptionTag
+ // 2 icSigMediaWhitePointTag
+ // 3 icSigAToB0Tag
+
+
+ cmsAddTag(hICC, icSigDeviceMfgDescTag, (LPVOID) "LittleCMS");
+ cmsAddTag(hICC, icSigProfileDescriptionTag, (LPVOID) "Device link");
+ cmsAddTag(hICC, icSigDeviceModelDescTag, (LPVOID) "Device link");
+
+
+ cmsAddTag(hICC, icSigMediaWhitePointTag, (LPVOID) cmsD50_XYZ());
+
+ if (cmsGetDeviceClass(hICC) == icSigOutputClass) {
+
+
+ cmsAddTag(hICC, icSigBToA0Tag, (LPVOID) Lut);
+ }
+
+ else
+ cmsAddTag(hICC, icSigAToB0Tag, (LPVOID) Lut);
+
+
+ if (MustFreeLUT) cmsFreeLUT(Lut);
+
+ return hICC;
+
+}
+
+
+// This is a devicelink operating in the target colorspace with as many transfer
+// functions as components
+
+cmsHPROFILE LCMSEXPORT cmsCreateLinearizationDeviceLink(icColorSpaceSignature ColorSpace,
+ LPGAMMATABLE TransferFunctions[])
+{
+ cmsHPROFILE hICC;
+ LPLUT Lut;
+
+
+ hICC = _cmsCreateProfilePlaceholder();
+ if (!hICC) // can't allocate
+ return NULL;
+
+
+ cmsSetDeviceClass(hICC, icSigLinkClass);
+ cmsSetColorSpace(hICC, ColorSpace);
+ cmsSetPCS(hICC, ColorSpace);
+ cmsSetRenderingIntent(hICC, INTENT_PERCEPTUAL);
+
+
+ // Creates a LUT with prelinearization step only
+ Lut = cmsAllocLUT();
+
+ // Set up channels
+ Lut ->InputChan = Lut ->OutputChan = _cmsChannelsOf(ColorSpace);
+
+ // Copy tables to LUT
+ cmsAllocLinearTable(Lut, TransferFunctions, 1);
+
+ // Create tags
+ cmsAddTag(hICC, icSigDeviceMfgDescTag, (LPVOID) "(lcms internal)");
+ cmsAddTag(hICC, icSigProfileDescriptionTag, (LPVOID) "lcms linearization device link");
+ cmsAddTag(hICC, icSigDeviceModelDescTag, (LPVOID) "linearization built-in");
+
+ cmsAddTag(hICC, icSigMediaWhitePointTag, (LPVOID) cmsD50_XYZ());
+ cmsAddTag(hICC, icSigAToB0Tag, (LPVOID) Lut);
+
+ // LUT is already on virtual profile
+ cmsFreeLUT(Lut);
+
+ // Ok, done
+ return hICC;
+}
+
+
+// Ink-limiting algorithm
+//
+// Sum = C + M + Y + K
+// If Sum > InkLimit
+// Ratio= 1 - (Sum - InkLimit) / (C + M + Y)
+// if Ratio <0
+// Ratio=0
+// endif
+// Else
+// Ratio=1
+// endif
+//
+// C = Ratio * C
+// M = Ratio * M
+// Y = Ratio * Y
+// K: Does not change
+
+static
+int InkLimitingSampler(register WORD In[], register WORD Out[], register LPVOID Cargo)
+{
+ double InkLimit = *(double *) Cargo;
+ double SumCMY, SumCMYK, Ratio;
+
+ InkLimit = (InkLimit * 655.35);
+
+ SumCMY = In[0] + In[1] + In[2];
+ SumCMYK = SumCMY + In[3];
+
+ if (SumCMYK > InkLimit) {
+
+ Ratio = 1 - ((SumCMYK - InkLimit) / SumCMY);
+ if (Ratio < 0)
+ Ratio = 0;
+ }
+ else Ratio = 1;
+
+ Out[0] = (WORD) floor(In[0] * Ratio + 0.5); // C
+ Out[1] = (WORD) floor(In[1] * Ratio + 0.5); // M
+ Out[2] = (WORD) floor(In[2] * Ratio + 0.5); // Y
+
+ Out[3] = In[3]; // K (untouched)
+
+ return TRUE;
+}
+
+// This is a devicelink operating in CMYK for ink-limiting
+
+cmsHPROFILE LCMSEXPORT cmsCreateInkLimitingDeviceLink(icColorSpaceSignature ColorSpace,
+ double Limit)
+{
+ cmsHPROFILE hICC;
+ LPLUT Lut;
+
+ if (ColorSpace != icSigCmykData) {
+ cmsSignalError(LCMS_ERRC_ABORTED, "InkLimiting: Only CMYK currently supported");
+ return NULL;
+ }
+
+ if (Limit < 0.0 || Limit > 400) {
+
+ cmsSignalError(LCMS_ERRC_WARNING, "InkLimiting: Limit should be between 0..400");
+ if (Limit < 0) Limit = 0;
+ if (Limit > 400) Limit = 400;
+
+ }
+
+ hICC = _cmsCreateProfilePlaceholder();
+ if (!hICC) // can't allocate
+ return NULL;
+
+
+ cmsSetDeviceClass(hICC, icSigLinkClass);
+ cmsSetColorSpace(hICC, ColorSpace);
+ cmsSetPCS(hICC, ColorSpace);
+ cmsSetRenderingIntent(hICC, INTENT_PERCEPTUAL);
+
+
+ // Creates a LUT with 3D grid only
+ Lut = cmsAllocLUT();
+
+
+ cmsAlloc3DGrid(Lut, 17, _cmsChannelsOf(ColorSpace),
+ _cmsChannelsOf(ColorSpace));
+
+ if (!cmsSample3DGrid(Lut, InkLimitingSampler, (LPVOID) &Limit, 0)) {
+
+ // Shouldn't reach here
+ cmsFreeLUT(Lut);
+ cmsCloseProfile(hICC);
+ return NULL;
+ }
+
+ // Create tags
+
+ cmsAddTag(hICC, icSigDeviceMfgDescTag, (LPVOID) "(lcms internal)");
+ cmsAddTag(hICC, icSigProfileDescriptionTag, (LPVOID) "lcms ink limiting device link");
+ cmsAddTag(hICC, icSigDeviceModelDescTag, (LPVOID) "ink limiting built-in");
+
+ cmsAddTag(hICC, icSigMediaWhitePointTag, (LPVOID) cmsD50_XYZ());
+
+ cmsAddTag(hICC, icSigAToB0Tag, (LPVOID) Lut);
+
+ // LUT is already on virtual profile
+ cmsFreeLUT(Lut);
+
+ // Ok, done
+ return hICC;
+}
+
+
+
+static
+LPLUT Create3x3EmptyLUT(void)
+{
+ LPLUT AToB0 = cmsAllocLUT();
+ AToB0 -> InputChan = AToB0 -> OutputChan = 3;
+
+ return AToB0;
+}
+
+
+
+// Creates a fake Lab identity.
+cmsHPROFILE LCMSEXPORT cmsCreateLabProfile(LPcmsCIExyY WhitePoint)
+{
+ cmsHPROFILE hProfile;
+ LPLUT Lut;
+
+
+ hProfile = cmsCreateRGBProfile(WhitePoint == NULL ? cmsD50_xyY() : WhitePoint, NULL, NULL);
+
+ cmsSetDeviceClass(hProfile, icSigAbstractClass);
+ cmsSetColorSpace(hProfile, icSigLabData);
+ cmsSetPCS(hProfile, icSigLabData);
+
+ cmsAddTag(hProfile, icSigDeviceMfgDescTag, (LPVOID) "(lcms internal)");
+ cmsAddTag(hProfile, icSigProfileDescriptionTag, (LPVOID) "lcms Lab identity");
+ cmsAddTag(hProfile, icSigDeviceModelDescTag, (LPVOID) "Lab built-in");
+
+
+ // An empty LUTs is all we need
+ Lut = Create3x3EmptyLUT();
+ if (Lut == NULL) return NULL;
+
+ cmsAddTag(hProfile, icSigAToB0Tag, (LPVOID) Lut);
+ cmsAddTag(hProfile, icSigBToA0Tag, (LPVOID) Lut);
+
+ cmsFreeLUT(Lut);
+
+ return hProfile;
+}
+
+
+// Creates a fake Lab identity.
+cmsHPROFILE LCMSEXPORT cmsCreateLab4Profile(LPcmsCIExyY WhitePoint)
+{
+ cmsHPROFILE hProfile;
+ LPLUT Lut;
+
+
+ hProfile = cmsCreateRGBProfile(WhitePoint == NULL ? cmsD50_xyY() : WhitePoint, NULL, NULL);
+
+ cmsSetProfileICCversion(hProfile, 0x4000000);
+
+ cmsSetDeviceClass(hProfile, icSigAbstractClass);
+ cmsSetColorSpace(hProfile, icSigLabData);
+ cmsSetPCS(hProfile, icSigLabData);
+
+ cmsAddTag(hProfile, icSigDeviceMfgDescTag, (LPVOID) "(lcms internal)");
+ cmsAddTag(hProfile, icSigProfileDescriptionTag, (LPVOID) "lcms Lab identity v4");
+ cmsAddTag(hProfile, icSigDeviceModelDescTag, (LPVOID) "Lab v4 built-in");
+
+
+ // An empty LUTs is all we need
+ Lut = Create3x3EmptyLUT();
+ if (Lut == NULL) return NULL;
+
+ Lut -> wFlags |= LUT_V4_INPUT_EMULATE_V2;
+ cmsAddTag(hProfile, icSigAToB0Tag, (LPVOID) Lut);
+
+ Lut -> wFlags |= LUT_V4_OUTPUT_EMULATE_V2;
+ cmsAddTag(hProfile, icSigBToA0Tag, (LPVOID) Lut);
+
+ cmsFreeLUT(Lut);
+
+ return hProfile;
+}
+
+
+
+// Creates a fake XYZ identity
+cmsHPROFILE LCMSEXPORT cmsCreateXYZProfile(void)
+{
+ cmsHPROFILE hProfile;
+ LPLUT Lut;
+
+ hProfile = cmsCreateRGBProfile(cmsD50_xyY(), NULL, NULL);
+
+ cmsSetDeviceClass(hProfile, icSigAbstractClass);
+ cmsSetColorSpace(hProfile, icSigXYZData);
+ cmsSetPCS(hProfile, icSigXYZData);
+
+ cmsAddTag(hProfile, icSigDeviceMfgDescTag, (LPVOID) "(lcms internal)");
+ cmsAddTag(hProfile, icSigProfileDescriptionTag, (LPVOID) "lcms XYZ identity");
+ cmsAddTag(hProfile, icSigDeviceModelDescTag, (LPVOID) "XYZ built-in");
+
+ // An empty LUTs is all we need
+ Lut = Create3x3EmptyLUT();
+ if (Lut == NULL) return NULL;
+
+ cmsAddTag(hProfile, icSigAToB0Tag, (LPVOID) Lut);
+ cmsAddTag(hProfile, icSigBToA0Tag, (LPVOID) Lut);
+ cmsAddTag(hProfile, icSigPreview0Tag, (LPVOID) Lut);
+
+ cmsFreeLUT(Lut);
+
+
+ return hProfile;
+}
+
+
+
+/*
+
+If R’sRGB,G’sRGB, B’sRGB < 0.04045
+
+ R = R’sRGB / 12.92
+ G = G’sRGB / 12.92
+ B = B’sRGB / 12.92
+
+
+
+else if R’sRGB,G’sRGB, B’sRGB >= 0.04045
+
+ R = ((R’sRGB + 0.055) / 1.055)^2.4
+ G = ((G’sRGB + 0.055) / 1.055)^2.4
+ B = ((B’sRGB + 0.055) / 1.055)^2.4
+
+ */
+
+static
+LPGAMMATABLE Build_sRGBGamma(void)
+{
+ double Parameters[5];
+
+ Parameters[0] = 2.4;
+ Parameters[1] = 1. / 1.055;
+ Parameters[2] = 0.055 / 1.055;
+ Parameters[3] = 1. / 12.92;
+ Parameters[4] = 0.04045; // d
+
+ return cmsBuildParametricGamma(1024, 4, Parameters);
+}
+
+cmsHPROFILE LCMSEXPORT cmsCreate_sRGBProfile(void)
+{
+ cmsCIExyY D65;
+ cmsCIExyYTRIPLE Rec709Primaries = {
+ {0.6400, 0.3300, 1.0},
+ {0.3000, 0.6000, 1.0},
+ {0.1500, 0.0600, 1.0}
+ };
+ LPGAMMATABLE Gamma22[3];
+ cmsHPROFILE hsRGB;
+
+ cmsWhitePointFromTemp(6504, &D65);
+ Gamma22[0] = Gamma22[1] = Gamma22[2] = Build_sRGBGamma();
+
+ hsRGB = cmsCreateRGBProfile(&D65, &Rec709Primaries, Gamma22);
+ cmsFreeGamma(Gamma22[0]);
+
+
+ cmsAddTag(hsRGB, icSigDeviceMfgDescTag, (LPVOID) "(lcms internal)");
+ cmsAddTag(hsRGB, icSigDeviceModelDescTag, (LPVOID) "sRGB built-in");
+ cmsAddTag(hsRGB, icSigProfileDescriptionTag, (LPVOID) "sRGB built-in");
+
+ return hsRGB;
+}
+
+
+
+
+typedef struct {
+ double Brightness;
+ double Contrast;
+ double Hue;
+ double Saturation;
+ cmsCIEXYZ WPsrc, WPdest;
+
+} BCHSWADJUSTS, *LPBCHSWADJUSTS;
+
+
+static
+int bchswSampler(register WORD In[], register WORD Out[], register LPVOID Cargo)
+{
+ cmsCIELab LabIn, LabOut;
+ cmsCIELCh LChIn, LChOut;
+ cmsCIEXYZ XYZ;
+ LPBCHSWADJUSTS bchsw = (LPBCHSWADJUSTS) Cargo;
+
+
+ cmsLabEncoded2Float(&LabIn, In);
+
+
+ cmsLab2LCh(&LChIn, &LabIn);
+
+ // Do some adjusts on LCh
+
+ LChOut.L = LChIn.L * bchsw ->Contrast + bchsw ->Brightness;
+ LChOut.C = LChIn.C + bchsw -> Saturation;
+ LChOut.h = LChIn.h + bchsw -> Hue;
+
+
+ cmsLCh2Lab(&LabOut, &LChOut);
+
+ // Move white point in Lab
+
+ cmsLab2XYZ(&bchsw ->WPsrc, &XYZ, &LabOut);
+ cmsXYZ2Lab(&bchsw ->WPdest, &LabOut, &XYZ);
+
+ // Back to encoded
+
+ cmsFloat2LabEncoded(Out, &LabOut);
+
+
+ return TRUE;
+}
+
+
+// Creates an abstract profile operating in Lab space for Brightness,
+// contrast, Saturation and white point displacement
+
+cmsHPROFILE LCMSEXPORT cmsCreateBCHSWabstractProfile(int nLUTPoints,
+ double Bright,
+ double Contrast,
+ double Hue,
+ double Saturation,
+ int TempSrc,
+ int TempDest)
+{
+ cmsHPROFILE hICC;
+ LPLUT Lut;
+ BCHSWADJUSTS bchsw;
+ cmsCIExyY WhitePnt;
+
+ bchsw.Brightness = Bright;
+ bchsw.Contrast = Contrast;
+ bchsw.Hue = Hue;
+ bchsw.Saturation = Saturation;
+
+ cmsWhitePointFromTemp(TempSrc, &WhitePnt);
+ cmsxyY2XYZ(&bchsw.WPsrc, &WhitePnt);
+
+ cmsWhitePointFromTemp(TempDest, &WhitePnt);
+ cmsxyY2XYZ(&bchsw.WPdest, &WhitePnt);
+
+ hICC = _cmsCreateProfilePlaceholder();
+ if (!hICC) // can't allocate
+ return NULL;
+
+
+ cmsSetDeviceClass(hICC, icSigAbstractClass);
+ cmsSetColorSpace(hICC, icSigLabData);
+ cmsSetPCS(hICC, icSigLabData);
+
+ cmsSetRenderingIntent(hICC, INTENT_PERCEPTUAL);
+
+
+ // Creates a LUT with 3D grid only
+ Lut = cmsAllocLUT();
+
+
+ cmsAlloc3DGrid(Lut, nLUTPoints, 3, 3);
+
+ if (!cmsSample3DGrid(Lut, bchswSampler, (LPVOID) &bchsw, 0)) {
+
+ // Shouldn't reach here
+ cmsFreeLUT(Lut);
+ cmsCloseProfile(hICC);
+ return NULL;
+ }
+
+ // Create tags
+
+ cmsAddTag(hICC, icSigDeviceMfgDescTag, (LPVOID) "(lcms internal)");
+ cmsAddTag(hICC, icSigProfileDescriptionTag, (LPVOID) "lcms BCHSW abstract profile");
+ cmsAddTag(hICC, icSigDeviceModelDescTag, (LPVOID) "BCHSW built-in");
+
+ cmsAddTag(hICC, icSigMediaWhitePointTag, (LPVOID) cmsD50_XYZ());
+
+ cmsAddTag(hICC, icSigAToB0Tag, (LPVOID) Lut);
+
+ // LUT is already on virtual profile
+ cmsFreeLUT(Lut);
+
+ // Ok, done
+ return hICC;
+
+}
+
+
+// Creates a fake NULL profile. This profile return 1 channel as always 0.
+// Is useful only for gamut checking tricks
+
+cmsHPROFILE LCMSEXPORT cmsCreateNULLProfile(void)
+{
+ cmsHPROFILE hProfile;
+ LPLUT Lut;
+ LPGAMMATABLE EmptyTab;
+
+ hProfile = _cmsCreateProfilePlaceholder();
+ if (!hProfile) // can't allocate
+ return NULL;
+
+ cmsSetDeviceClass(hProfile, icSigOutputClass);
+ cmsSetColorSpace(hProfile, icSigGrayData);
+ cmsSetPCS(hProfile, icSigLabData);
+
+
+ // An empty LUTs is all we need
+ Lut = cmsAllocLUT();
+ if (Lut == NULL) return NULL;
+
+ Lut -> InputChan = 3;
+ Lut -> OutputChan = 1;
+
+ EmptyTab = cmsAllocGamma(2);
+ EmptyTab ->GammaTable[0] = 0;
+ EmptyTab ->GammaTable[1] = 0;
+
+ cmsAllocLinearTable(Lut, &EmptyTab, 2);
+
+ cmsAddTag(hProfile, icSigBToA0Tag, (LPVOID) Lut);
+
+ cmsFreeLUT(Lut);
+ cmsFreeGamma(EmptyTab);
+
+ return hProfile;
+}
diff --git a/icc2ps/cmswtpnt.c b/icc2ps/cmswtpnt.c
new file mode 100644
index 0000000..7363b46
--- /dev/null
+++ b/icc2ps/cmswtpnt.c
@@ -0,0 +1,709 @@
+//
+// Little cms
+// Copyright (C) 1998-2004 Marti Maria
+//
+// Permission is hereby granted, free of charge, to any person obtaining
+// a copy of this software and associated documentation files (the "Software"),
+// to deal in the Software without restriction, including without limitation
+// the rights to use, copy, modify, merge, publish, distribute, sublicense,
+// and/or sell copies of the Software, and to permit persons to whom the Software
+// is furnished to do so, subject to the following conditions:
+//
+// The above copyright notice and this permission notice shall be included in
+// all copies or substantial portions of the Software.
+//
+// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
+// EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO
+// THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
+// NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
+// LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
+// OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
+// WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
+
+#include "lcms.h"
+
+// Uncomment this line if you want lcms to use the black point tag in profile,
+// if commented, lcms will compute the black point by its own.
+// It is safer to leve it commented out
+// #define HONOR_BLACK_POINT_TAG
+
+// Conversions
+
+void LCMSEXPORT cmsXYZ2xyY(LPcmsCIExyY Dest, const cmsCIEXYZ* Source)
+{
+ double ISum;
+
+ ISum = 1./(Source -> X + Source -> Y + Source -> Z);
+
+ Dest -> x = (Source -> X) * ISum;
+ Dest -> y = (Source -> Y) * ISum;
+ Dest -> Y = Source -> Y;
+}
+
+
+void LCMSEXPORT cmsxyY2XYZ(LPcmsCIEXYZ Dest, const cmsCIExyY* Source)
+{
+
+ Dest -> X = (Source -> x / Source -> y) * Source -> Y;
+ Dest -> Y = Source -> Y;
+ Dest -> Z = ((1 - Source -> x - Source -> y) / Source -> y) * Source -> Y;
+}
+
+
+
+// Obtains WhitePoint from Temperature
+
+BOOL LCMSEXPORT cmsWhitePointFromTemp(int TempK, LPcmsCIExyY WhitePoint)
+{
+ double x, y;
+ double T, T2, T3;
+ // double M1, M2;
+
+
+ // No optimization provided.
+
+ T = TempK;
+ T2 = T*T; // Square
+ T3 = T2*T; // Cube
+
+ // For correlated color temperature (T) between 4000K and 7000K:
+
+ if (T >= 4000. && T <= 7000.)
+ {
+ x = -4.6070*(1E9/T3) + 2.9678*(1E6/T2) + 0.09911*(1E3/T) + 0.244063;
+ }
+ else
+ // or for correlated color temperature (T) between 7000K and 25000K:
+
+ if (T > 7000.0 && T <= 25000.0)
+ {
+ x = -2.0064*(1E9/T3) + 1.9018*(1E6/T2) + 0.24748*(1E3/T) + 0.237040;
+ }
+ else {
+ cmsSignalError(LCMS_ERRC_ABORTED, "cmsWhitePointFromTemp: invalid temp");
+ return FALSE;
+ }
+
+ // Obtain y(x)
+
+ y = -3.000*(x*x) + 2.870*x - 0.275;
+
+ // wave factors (not used, but here for futures extensions)
+
+ // M1 = (-1.3515 - 1.7703*x + 5.9114 *y)/(0.0241 + 0.2562*x - 0.7341*y);
+ // M2 = (0.0300 - 31.4424*x + 30.0717*y)/(0.0241 + 0.2562*x - 0.7341*y);
+
+
+
+ // Fill WhitePoint struct
+
+ WhitePoint -> x = x;
+ WhitePoint -> y = y;
+ WhitePoint -> Y = 1.0;
+
+ return TRUE;
+}
+
+// Build a White point, primary chromas transfer matrix from RGB to CIE XYZ
+// This is just an approximation, I am not handling all the non-linear
+// aspects of the RGB to XYZ process, and assumming that the gamma correction
+// has transitive property in the tranformation chain.
+//
+// the alghoritm:
+//
+// - First I build the absolute conversion matrix using
+// primaries in XYZ. This matrix is next inverted
+// - Then I eval the source white point across this matrix
+// obtaining the coeficients of the transformation
+// - Then, I apply these coeficients to the original matrix
+
+
+BOOL LCMSEXPORT cmsBuildRGB2XYZtransferMatrix(LPMAT3 r, LPcmsCIExyY WhitePt,
+ LPcmsCIExyYTRIPLE Primrs)
+{
+ VEC3 WhitePoint, Coef;
+ MAT3 Result, Primaries;
+ double xn, yn;
+ double xr, yr;
+ double xg, yg;
+ double xb, yb;
+
+
+ xn = WhitePt -> x;
+ yn = WhitePt -> y;
+ xr = Primrs -> Red.x;
+ yr = Primrs -> Red.y;
+ xg = Primrs -> Green.x;
+ yg = Primrs -> Green.y;
+ xb = Primrs -> Blue.x;
+ yb = Primrs -> Blue.y;
+
+
+ // Build Primaries matrix
+
+ VEC3init(&Primaries.v[0], xr, xg, xb);
+ VEC3init(&Primaries.v[1], yr, yg, yb);
+ VEC3init(&Primaries.v[2], (1-xr-yr), (1-xg-yg), (1-xb-yb));
+
+
+ // Result = Primaries ^ (-1) inverse matrix
+
+ if (!MAT3inverse(&Primaries, &Result))
+ return FALSE;
+
+
+ VEC3init(&WhitePoint, xn/yn, 1.0, (1.0-xn-yn)/yn);
+
+ // Across inverse primaries ...
+
+ MAT3eval(&Coef, &Result, &WhitePoint);
+
+ // Give us the Coefs, then I build transformation matrix
+
+ VEC3init(&r -> v[0], Coef.n[VX]*xr, Coef.n[VY]*xg, Coef.n[VZ]*xb);
+ VEC3init(&r -> v[1], Coef.n[VX]*yr, Coef.n[VY]*yg, Coef.n[VZ]*yb);
+ VEC3init(&r -> v[2], Coef.n[VX]*(1.0-xr-yr), Coef.n[VY]*(1.0-xg-yg), Coef.n[VZ]*(1.0-xb-yb));
+
+
+ return TRUE;
+}
+
+
+
+// Compute chromatic adaptation matrix using Chad as cone matrix
+
+static
+void ComputeChromaticAdaptation(LPMAT3 Conversion,
+ LPcmsCIEXYZ SourceWhitePoint,
+ LPcmsCIEXYZ DestWhitePoint,
+ LPMAT3 Chad)
+
+{
+
+ MAT3 Chad_Inv;
+ VEC3 ConeSourceXYZ, ConeSourceRGB;
+ VEC3 ConeDestXYZ, ConeDestRGB;
+ MAT3 Cone, Tmp;
+
+
+ Tmp = *Chad;
+ MAT3inverse(&Tmp, &Chad_Inv);
+
+ VEC3init(&ConeSourceXYZ, SourceWhitePoint -> X,
+ SourceWhitePoint -> Y,
+ SourceWhitePoint -> Z);
+
+ VEC3init(&ConeDestXYZ, DestWhitePoint -> X,
+ DestWhitePoint -> Y,
+ DestWhitePoint -> Z);
+
+ MAT3eval(&ConeSourceRGB, Chad, &ConeSourceXYZ);
+ MAT3eval(&ConeDestRGB, Chad, &ConeDestXYZ);
+
+ // Build matrix
+
+ VEC3init(&Cone.v[0], ConeDestRGB.n[0]/ConeSourceRGB.n[0], 0.0, 0.0);
+ VEC3init(&Cone.v[1], 0.0, ConeDestRGB.n[1]/ConeSourceRGB.n[1], 0.0);
+ VEC3init(&Cone.v[2], 0.0, 0.0, ConeDestRGB.n[2]/ConeSourceRGB.n[2]);
+
+
+ // Normalize
+ MAT3per(&Tmp, &Cone, Chad);
+ MAT3per(Conversion, &Chad_Inv, &Tmp);
+
+}
+
+
+// Returns the final chrmatic adaptation from illuminant FromIll to Illuminant ToIll
+// The cone matrix can be specified in ConeMatrix. If NULL, Bradford is assumed
+
+BOOL cmsAdaptationMatrix(LPMAT3 r, LPMAT3 ConeMatrix, LPcmsCIEXYZ FromIll, LPcmsCIEXYZ ToIll)
+{
+ MAT3 LamRigg = {{ // Bradford matrix
+ {{ 0.8951, 0.2664, -0.1614 }},
+ {{ -0.7502, 1.7135, 0.0367 }},
+ {{ 0.0389, -0.0685, 1.0296 }}
+ }};
+
+
+ if (ConeMatrix == NULL)
+ ConeMatrix = &LamRigg;
+
+ ComputeChromaticAdaptation(r, FromIll, ToIll, ConeMatrix);
+ return TRUE;
+
+}
+
+// Same as anterior, but assuming D50 destination. White point is given in xyY
+
+BOOL cmsAdaptMatrixToD50(LPMAT3 r, LPcmsCIExyY SourceWhitePt)
+{
+ cmsCIEXYZ Dn;
+ MAT3 Bradford;
+ MAT3 Tmp;
+
+ cmsxyY2XYZ(&Dn, SourceWhitePt);
+
+ cmsAdaptationMatrix(&Bradford, NULL, &Dn, cmsD50_XYZ());
+
+ Tmp = *r;
+ MAT3per(r, &Bradford, &Tmp);
+
+ return TRUE;
+}
+
+
+// Same as anterior, but assuming D50 source. White point is given in xyY
+
+BOOL cmsAdaptMatrixFromD50(LPMAT3 r, LPcmsCIExyY DestWhitePt)
+{
+ cmsCIEXYZ Dn;
+ MAT3 Bradford;
+ MAT3 Tmp;
+
+ cmsxyY2XYZ(&Dn, DestWhitePt);
+
+ cmsAdaptationMatrix(&Bradford, NULL, cmsD50_XYZ(), &Dn);
+
+ Tmp = *r;
+ MAT3per(r, &Bradford, &Tmp);
+
+ return TRUE;
+}
+
+
+// Adapts a color to a given illuminant. Original color is expected to have
+// a SourceWhitePt white point.
+
+BOOL LCMSEXPORT cmsAdaptToIlluminant(LPcmsCIEXYZ Result,
+ LPcmsCIEXYZ SourceWhitePt,
+ LPcmsCIEXYZ Illuminant,
+ LPcmsCIEXYZ Value)
+{
+ MAT3 Bradford;
+ VEC3 In, Out;
+
+ // BradfordLamRiggChromaticAdaptation(&Bradford, SourceWhitePt, Illuminant);
+
+ cmsAdaptationMatrix(&Bradford, NULL, SourceWhitePt, Illuminant);
+
+ VEC3init(&In, Value -> X, Value -> Y, Value -> Z);
+ MAT3eval(&Out, &Bradford, &In);
+
+ Result -> X = Out.n[0];
+ Result -> Y = Out.n[1];
+ Result -> Z = Out.n[2];
+
+ return TRUE;
+}
+
+
+
+typedef struct {
+
+ double mirek; // temp (in microreciprocal kelvin)
+ double ut; // u coord of intersection w/ blackbody locus
+ double vt; // v coord of intersection w/ blackbody locus
+ double tt; // slope of ISOTEMPERATURE. line
+
+ } ISOTEMPERATURE,FAR* LPISOTEMPERATURE;
+
+static ISOTEMPERATURE isotempdata[] = {
+// {Mirek, Ut, Vt, Tt }
+ {0, 0.18006, 0.26352, -0.24341},
+ {10, 0.18066, 0.26589, -0.25479},
+ {20, 0.18133, 0.26846, -0.26876},
+ {30, 0.18208, 0.27119, -0.28539},
+ {40, 0.18293, 0.27407, -0.30470},
+ {50, 0.18388, 0.27709, -0.32675},
+ {60, 0.18494, 0.28021, -0.35156},
+ {70, 0.18611, 0.28342, -0.37915},
+ {80, 0.18740, 0.28668, -0.40955},
+ {90, 0.18880, 0.28997, -0.44278},
+ {100, 0.19032, 0.29326, -0.47888},
+ {125, 0.19462, 0.30141, -0.58204},
+ {150, 0.19962, 0.30921, -0.70471},
+ {175, 0.20525, 0.31647, -0.84901},
+ {200, 0.21142, 0.32312, -1.0182 },
+ {225, 0.21807, 0.32909, -1.2168 },
+ {250, 0.22511, 0.33439, -1.4512 },
+ {275, 0.23247, 0.33904, -1.7298 },
+ {300, 0.24010, 0.34308, -2.0637 },
+ {325, 0.24702, 0.34655, -2.4681 },
+ {350, 0.25591, 0.34951, -2.9641 },
+ {375, 0.26400, 0.35200, -3.5814 },
+ {400, 0.27218, 0.35407, -4.3633 },
+ {425, 0.28039, 0.35577, -5.3762 },
+ {450, 0.28863, 0.35714, -6.7262 },
+ {475, 0.29685, 0.35823, -8.5955 },
+ {500, 0.30505, 0.35907, -11.324 },
+ {525, 0.31320, 0.35968, -15.628 },
+ {550, 0.32129, 0.36011, -23.325 },
+ {575, 0.32931, 0.36038, -40.770 },
+ {600, 0.33724, 0.36051, -116.45 }
+};
+
+#define NISO sizeof(isotempdata)/sizeof(ISOTEMPERATURE)
+
+
+// Robertson's method
+
+static
+double Robertson(LPcmsCIExyY v)
+{
+ int j;
+ double us,vs;
+ double uj,vj,tj,di,dj,mi,mj;
+ double Tc = -1, xs, ys;
+
+ di = mi = 0;
+ xs = v -> x;
+ ys = v -> y;
+
+ // convert (x,y) to CIE 1960 (u,v)
+
+ us = (2*xs) / (-xs + 6*ys + 1.5);
+ vs = (3*ys) / (-xs + 6*ys + 1.5);
+
+
+ for (j=0; j < NISO; j++) {
+
+ uj = isotempdata[j].ut;
+ vj = isotempdata[j].vt;
+ tj = isotempdata[j].tt;
+ mj = isotempdata[j].mirek;
+
+ dj = ((vs - vj) - tj * (us - uj)) / sqrt(1 + tj*tj);
+
+
+
+ if ((j!=0) && (di/dj < 0.0)) {
+ Tc = 1000000.0 / (mi + (di / (di - dj)) * (mj - mi));
+ break;
+ }
+
+ di = dj;
+ mi = mj;
+ }
+
+
+ if (j == NISO) return -1;
+ return Tc;
+}
+
+
+
+static
+BOOL InRange(LPcmsCIExyY a, LPcmsCIExyY b, double tolerance)
+{
+ double dist_x, dist_y;
+
+ dist_x = fabs(a->x - b->x);
+ dist_y = fabs(a->y - b->y);
+
+ return (tolerance >= dist_x * dist_x + dist_y * dist_y);
+
+}
+
+
+typedef struct {
+ char Name[30];
+ cmsCIExyY Val;
+
+ } WHITEPOINTS,FAR *LPWHITEPOINTS;
+
+static
+int FromD40toD150(LPWHITEPOINTS pts)
+{
+ int i, n;
+
+ n = 0;
+ for (i=40; i < 150; i ++)
+ {
+ sprintf(pts[n].Name, "D%d", i);
+ cmsWhitePointFromTemp((int) (i*100.0), &pts[n].Val);
+ n++;
+ }
+
+ return n;
+}
+
+
+void _cmsIdentifyWhitePoint(char *Buffer, LPcmsCIEXYZ WhitePt)
+{
+ int i, n;
+ cmsCIExyY Val;
+ double T;
+ WHITEPOINTS SomeIlluminants[140] = {
+
+ {"CIE illuminant A", {0.4476, 0.4074, 1.0}},
+ {"CIE illuminant C", {0.3101, 0.3162, 1.0}},
+ {"D65 (daylight)", {0.3127, 0.3291, 1.0}},
+ };
+
+ n = FromD40toD150(&SomeIlluminants[3]) + 3;
+
+ cmsXYZ2xyY(&Val, WhitePt);
+
+ Val.Y = 1.;
+ for (i=0; i < n; i++)
+ {
+
+ if (InRange(&Val, &SomeIlluminants[i].Val, 0.000005))
+ {
+ strcpy(Buffer, "WhitePoint : ");
+ strcat(Buffer, SomeIlluminants[i].Name);
+ return;
+ }
+ }
+
+ T = Robertson(&Val);
+
+ if (T > 0)
+ sprintf(Buffer, "White point near %dK", (int) T);
+ else
+ {
+ sprintf(Buffer, "Unknown white point (X:%1.2g, Y:%1.2g, Z:%1.2g)",
+ WhitePt -> X, WhitePt -> Y, WhitePt -> Z);
+
+ }
+
+}
+
+
+// Use darker colorant to obtain black point
+
+static
+int BlackPointAsDarkerColorant(cmsHPROFILE hInput,
+ int Intent,
+ LPcmsCIEXYZ BlackPoint,
+ DWORD dwFlags)
+{
+ WORD *Black, *White;
+ cmsHTRANSFORM xform;
+ icColorSpaceSignature Space;
+ int nChannels;
+ DWORD dwFormat;
+ cmsHPROFILE hLab;
+ cmsCIELab Lab;
+ cmsCIEXYZ BlackXYZ, MediaWhite;
+
+ // If the profile does not support input direction, assume Black point 0
+
+ if (!cmsIsIntentSupported(hInput, Intent, LCMS_USED_AS_INPUT)) {
+
+ BlackPoint -> X = BlackPoint ->Y = BlackPoint -> Z = 0.0;
+ return 0;
+ }
+
+
+ // Try to get black by using black colorant
+
+ Space = cmsGetColorSpace(hInput);
+
+ if (!_cmsEndPointsBySpace(Space, &White, &Black, &nChannels)) {
+
+ BlackPoint -> X = BlackPoint ->Y = BlackPoint -> Z = 0.0;
+ return 0;
+ }
+
+ dwFormat = CHANNELS_SH(nChannels)|BYTES_SH(2);
+
+ hLab = cmsCreateLabProfile(NULL);
+
+ xform = cmsCreateTransform(hInput, dwFormat,
+ hLab, TYPE_Lab_DBL, Intent, cmsFLAGS_NOTPRECALC);
+
+
+ cmsDoTransform(xform, Black, &Lab, 1);
+
+ // Force it to be neutral, clip to max. L* of 50
+
+ Lab.a = Lab.b = 0;
+ if (Lab.L > 50) Lab.L = 50;
+
+ cmsCloseProfile(hLab);
+ cmsDeleteTransform(xform);
+
+ cmsLab2XYZ(NULL, &BlackXYZ, &Lab);
+
+ if (Intent == INTENT_ABSOLUTE_COLORIMETRIC) {
+
+ *BlackPoint = BlackXYZ;
+ }
+ else {
+
+ if (!(dwFlags & LCMS_BPFLAGS_D50_ADAPTED)) {
+
+ cmsTakeMediaWhitePoint(&MediaWhite, hInput);
+ cmsAdaptToIlluminant(BlackPoint, cmsD50_XYZ(), &MediaWhite, &BlackXYZ);
+ }
+ else
+ *BlackPoint = BlackXYZ;
+ }
+
+ return 1;
+}
+
+
+// Get a black point of output CMYK profile, discounting any ink-limiting embedded
+// in the profile. Fou doing that, use perceptual intent in input direction:
+// Lab (0, 0, 0) -> [Perceptual] Profile -> CMYK -> [Rel. colorimetric] Profile -> Lab
+
+static
+int BlackPointUsingPerceptualBlack(LPcmsCIEXYZ BlackPoint,
+ cmsHPROFILE hProfile,
+ DWORD dwFlags)
+{
+ cmsHTRANSFORM hPercLab2CMYK, hRelColCMYK2Lab;
+ cmsHPROFILE hLab;
+ cmsCIELab LabIn, LabOut;
+ WORD CMYK[MAXCHANNELS];
+ cmsCIEXYZ BlackXYZ, MediaWhite;
+
+
+ if (!cmsIsIntentSupported(hProfile, INTENT_PERCEPTUAL, LCMS_USED_AS_INPUT)) {
+
+ BlackPoint -> X = BlackPoint ->Y = BlackPoint -> Z = 0.0;
+ return 0;
+ }
+
+ hLab = cmsCreateLabProfile(NULL);
+
+ hPercLab2CMYK = cmsCreateTransform(hLab, TYPE_Lab_DBL,
+ hProfile, TYPE_CMYK_16,
+ INTENT_PERCEPTUAL, cmsFLAGS_NOTPRECALC);
+
+ hRelColCMYK2Lab = cmsCreateTransform(hProfile, TYPE_CMYK_16,
+ hLab, TYPE_Lab_DBL,
+ INTENT_RELATIVE_COLORIMETRIC, cmsFLAGS_NOTPRECALC);
+
+ LabIn.L = LabIn.a = LabIn.b = 0;
+
+ cmsDoTransform(hPercLab2CMYK, &LabIn, CMYK, 1);
+ cmsDoTransform(hRelColCMYK2Lab, CMYK, &LabOut, 1);
+
+ if (LabOut.L > 50) LabOut.L = 50;
+ LabOut.a = LabOut.b = 0;
+
+ cmsDeleteTransform(hPercLab2CMYK);
+ cmsDeleteTransform(hRelColCMYK2Lab);
+ cmsCloseProfile(hLab);
+
+ cmsLab2XYZ(NULL, &BlackXYZ, &LabOut);
+
+ if (!(dwFlags & LCMS_BPFLAGS_D50_ADAPTED)){
+ cmsTakeMediaWhitePoint(&MediaWhite, hProfile);
+ cmsAdaptToIlluminant(BlackPoint, cmsD50_XYZ(), &MediaWhite, &BlackXYZ);
+ }
+ else
+ *BlackPoint = BlackXYZ;
+
+ return 1;
+
+}
+
+
+// Get Perceptual black of v4 profiles.
+static
+int GetV4PerceptualBlack(LPcmsCIEXYZ BlackPoint, cmsHPROFILE hProfile, DWORD dwFlags)
+{
+ if (dwFlags & LCMS_BPFLAGS_D50_ADAPTED) {
+
+ BlackPoint->X = PERCEPTUAL_BLACK_X;
+ BlackPoint->Y = PERCEPTUAL_BLACK_Y;
+ BlackPoint->Z = PERCEPTUAL_BLACK_Z;
+ }
+ else {
+
+ cmsCIEXYZ D50BlackPoint, MediaWhite;
+
+ cmsTakeMediaWhitePoint(&MediaWhite, hProfile);
+ D50BlackPoint.X = PERCEPTUAL_BLACK_X;
+ D50BlackPoint.Y = PERCEPTUAL_BLACK_Y;
+ D50BlackPoint.Z = PERCEPTUAL_BLACK_Z;
+ cmsAdaptToIlluminant(BlackPoint, cmsD50_XYZ(), &MediaWhite, &D50BlackPoint);
+ }
+
+
+ return 1;
+}
+
+
+// This function shouldn't exist at all -- there is such quantity of broken
+// profiles on black point tag, that we must somehow fix chromaticity to
+// avoid huge tint when doing Black point compensation. This function does
+// just that. If BP is specified, then forces it to neutral and uses only L
+// component. If does not exist, computes it by taking 400% of ink or RGB=0 This
+// works well on relative intent and is undefined on perceptual & saturation.
+// However, I will support all intents for tricking & trapping.
+
+
+int cmsDetectBlackPoint(LPcmsCIEXYZ BlackPoint, cmsHPROFILE hProfile, int Intent, DWORD dwFlags)
+{
+
+ // v4 + perceptual & saturation intents does have its own black point
+
+ if ((cmsGetProfileICCversion(hProfile) >= 0x4000000) &&
+ (Intent == INTENT_PERCEPTUAL || Intent == INTENT_SATURATION)) {
+
+ // Matrix shaper share MRC & perceptual intents
+
+ if (_cmsIsMatrixShaper(hProfile))
+ return BlackPointAsDarkerColorant(hProfile, INTENT_RELATIVE_COLORIMETRIC, BlackPoint, cmsFLAGS_NOTPRECALC);
+
+ // Get fixed value
+ return GetV4PerceptualBlack(BlackPoint, hProfile, dwFlags);
+ }
+
+
+#ifdef HONOR_BLACK_POINT_TAG
+
+ // v2, v4 rel/abs colorimetric
+ if (cmsIsTag(hProfile, icSigMediaBlackPointTag) &&
+ Intent == INTENT_RELATIVE_COLORIMETRIC) {
+
+ cmsCIEXYZ BlackXYZ, UntrustedBlackPoint, TrustedBlackPoint, MediaWhite;
+ cmsCIELab Lab;
+
+ // If black point is specified, then use it,
+
+ cmsTakeMediaBlackPoint(&BlackXYZ, hProfile);
+ cmsTakeMediaWhitePoint(&MediaWhite, hProfile);
+
+ // Black point is absolute XYZ, so adapt to D50 to get PCS value
+
+ cmsAdaptToIlluminant(&UntrustedBlackPoint, &MediaWhite, cmsD50_XYZ(), &BlackXYZ);
+
+ // Force a=b=0 to get rid of any chroma
+
+ cmsXYZ2Lab(NULL, &Lab, &UntrustedBlackPoint);
+ Lab.a = Lab.b = 0;
+ if (Lab.L > 50) Lab.L = 50; // Clip to L* <= 50
+
+ cmsLab2XYZ(NULL, &TrustedBlackPoint, &Lab);
+
+ // Return BP as D50 relative or absolute XYZ (depends on flags)
+
+ if (!(dwFlags & LCMS_BPFLAGS_D50_ADAPTED))
+ cmsAdaptToIlluminant(BlackPoint, cmsD50_XYZ(), &MediaWhite, &TrustedBlackPoint);
+ else
+ *BlackPoint = TrustedBlackPoint;
+
+ return 1;
+ }
+
+#endif
+
+ // If output profile, discount ink-limiting
+
+ if (Intent == INTENT_RELATIVE_COLORIMETRIC &&
+ (cmsGetDeviceClass(hProfile) == icSigOutputClass) &&
+ (cmsGetColorSpace(hProfile) == icSigCmykData))
+ return BlackPointUsingPerceptualBlack(BlackPoint, hProfile, dwFlags);
+
+ // Nope, compute BP using current intent.
+
+ return BlackPointAsDarkerColorant(hProfile, Intent, BlackPoint, dwFlags);
+
+}
diff --git a/icc2ps/cmsxform.c b/icc2ps/cmsxform.c
new file mode 100644
index 0000000..ea3cb35
--- /dev/null
+++ b/icc2ps/cmsxform.c
@@ -0,0 +1,1920 @@
+//
+// Little cms
+// Copyright (C) 1998-2004 Marti Maria
+//
+// Permission is hereby granted, free of charge, to any person obtaining
+// a copy of this software and associated documentation files (the "Software"),
+// to deal in the Software without restriction, including without limitation
+// the rights to use, copy, modify, merge, publish, distribute, sublicense,
+// and/or sell copies of the Software, and to permit persons to whom the Software
+// is furnished to do so, subject to the following conditions:
+//
+// The above copyright notice and this permission notice shall be included in
+// all copies or substantial portions of the Software.
+//
+// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
+// EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO
+// THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
+// NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
+// LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
+// OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
+// WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
+
+
+#include "lcms.h"
+
+// #define DEBUG 1
+
+// Transformations stuff
+// -----------------------------------------------------------------------
+
+// Interface
+
+cmsHTRANSFORM LCMSEXPORT cmsCreateTransform(cmsHPROFILE Input,
+ DWORD InputFormat,
+ cmsHPROFILE Output,
+ DWORD OutputFormat,
+ int Intent,
+ DWORD dwFlags);
+
+cmsHTRANSFORM LCMSEXPORT cmsCreateProofingTransform(cmsHPROFILE Input,
+ DWORD InputFormat,
+ cmsHPROFILE Output,
+ DWORD OutputFormat,
+ cmsHPROFILE Proofing,
+ int Intent,
+ int ProofingIntent,
+ DWORD dwFlags);
+
+
+void LCMSEXPORT cmsDeleteTransform(cmsHTRANSFORM hTransform);
+
+void LCMSEXPORT cmsDoTransform(cmsHTRANSFORM Transform,
+ LPVOID InputBuffer,
+ LPVOID OutputBuffer, unsigned int Size);
+
+void LCMSEXPORT cmsGetAlarmCodes(int *r, int *g, int *b);
+void LCMSEXPORT cmsSetAlarmCodes(int r, int g, int b);
+BOOL LCMSEXPORT cmsIsIntentSupported(cmsHPROFILE hProfile,
+ int Intent, int UsedDirection);
+
+// -------------------------------------------------------------------------
+
+
+// Alarm RGB codes
+
+static WORD AlarmR = 0x8fff, AlarmG = 0x8fff, AlarmB = 0x8fff;
+
+// Tag tables, soted by intents
+
+static icTagSignature Device2PCS[] = {icSigAToB0Tag, // Perceptual
+ icSigAToB1Tag, // Relative colorimetric
+ icSigAToB2Tag, // Saturation
+ icSigAToB1Tag }; // Absolute colorimetric
+ // (Relative/WhitePoint)
+
+static icTagSignature PCS2Device[] = {icSigBToA0Tag, // Perceptual
+ icSigBToA1Tag, // Relative colorimetric
+ icSigBToA2Tag, // Saturation
+ icSigBToA1Tag }; // Absolute colorimetric
+ // (Relative/WhitePoint)
+
+
+static icTagSignature Preview[] = {icSigPreview0Tag,
+ icSigPreview1Tag,
+ icSigPreview2Tag,
+ icSigPreview1Tag };
+
+
+
+static double GlobalAdaptationState = 0;
+
+// --------------------------------Stages--------------------------------------
+
+// Following routines does implement several kind of steps inside
+// transform. On building the transform, code chooses adequate.
+
+
+// From Shaper-Matrix to PCS
+
+static
+void ShaperMatrixToPCS(struct _cmstransform_struct *p,
+ WORD In[3], WORD Out[3])
+{
+ cmsEvalMatShaper(p -> InMatShaper, In, Out);
+}
+
+// From LUT to PCS
+
+static
+void LUTtoPCS(struct _cmstransform_struct *p,
+ WORD In[], WORD Out[3])
+{
+ cmsEvalLUT(p -> Device2PCS, In, Out);
+}
+
+// From indexed named color to PCS
+
+static
+void NC2toPCS(struct _cmstransform_struct *p,
+ WORD In[], WORD Out[3])
+{
+ int index = In[0];
+
+ if (index >= p ->NamedColorList-> nColors)
+ cmsSignalError(LCMS_ERRC_WARNING, "Color %d out of range", index);
+ else
+ CopyMemory(Out, p ->NamedColorList->List[index].PCS, 3 * sizeof(WORD));
+}
+
+// From PCS to Shaper-Matrix
+
+static
+void PCStoShaperMatrix(struct _cmstransform_struct *p,
+ WORD In[3], WORD Out[3])
+{
+ cmsEvalMatShaper(p -> OutMatShaper, In, Out);
+}
+
+// From PCS to LUT
+
+static
+void PCStoLUT(struct _cmstransform_struct *p,
+ WORD In[3], WORD Out[])
+{
+ cmsEvalLUT(p -> PCS2Device, In, Out);
+}
+
+
+
+
+// ----------------------- TRANSFORMATIONS --------------------------
+
+
+// Inlining some assignations
+
+#define COPY_3CHANS(to, from) { to[0]=from[0]; to[1]=from[1]; to[2]=from[2]; }
+
+
+// Null transformation, only hold channels
+
+static
+void NullXFORM(_LPcmsTRANSFORM p,
+ LPVOID in,
+ LPVOID out, unsigned int Size)
+{
+ register LPBYTE accum;
+ register LPBYTE output;
+ WORD wIn[MAXCHANNELS];
+ register unsigned int i, n;
+
+
+ accum = (LPBYTE) in;
+ output = (LPBYTE) out;
+ n = Size; // Buffer len
+
+ for (i=0; i < n; i++)
+ {
+ accum = p -> FromInput(p, wIn, accum);
+ output = p -> ToOutput(p, wIn, output);
+ }
+
+}
+
+
+// This is the "normal" proofing transform
+
+static
+void NormalXFORM(_LPcmsTRANSFORM p,
+ LPVOID in,
+ LPVOID out, unsigned int Size)
+{
+ register LPBYTE accum;
+ register LPBYTE output;
+ WORD wIn[MAXCHANNELS], wOut[MAXCHANNELS];
+ WORD wStageABC[3], wPCS[3], wStageLMN[MAXCHANNELS];
+ WORD wGamut[1];
+ register unsigned int i, n;
+
+
+
+ accum = (LPBYTE) in;
+ output = (LPBYTE) out;
+ n = Size; // Buffer len
+
+ for (i=0; i < n; i++)
+ {
+
+ accum = p -> FromInput(p, wIn, accum);
+
+ p -> FromDevice(p, wIn, wStageABC);
+
+ if (p -> Stage1) {
+
+ p -> Stage1(wStageABC, wPCS, &p->m1, &p->of1);
+
+ if (wPCS[0] == 0xFFFF &&
+ wPCS[1] == 0xFFFF &&
+ wPCS[2] == 0xFFFF) {
+
+ // White cutoff
+
+ output = p -> ToOutput((_LPcmsTRANSFORM) p,
+ _cmsWhiteBySpace(cmsGetColorSpace(p -> OutputProfile)),
+ output);
+ continue;
+ }
+ }
+ else
+ COPY_3CHANS(wPCS, wStageABC);
+
+
+ if (p->Gamut) {
+
+ // Gamut check, enabled across CLUT
+
+ cmsEvalLUT(p -> Gamut, wPCS, wGamut);
+
+ if (wGamut[0] >= 1) {
+
+ wOut[0] = AlarmR; // Gamut alarm
+ wOut[1] = AlarmG;
+ wOut[2] = AlarmB;
+ wOut[3] = 0;
+
+ output = p -> ToOutput((_LPcmsTRANSFORM)p, wOut, output);
+ continue;
+ }
+ }
+
+ if (p -> Preview)
+ {
+ WORD wPreview[3]; // PCS
+
+ cmsEvalLUT(p -> Preview, wPCS, wPreview);
+ COPY_3CHANS(wPCS, wPreview);
+ }
+
+ if (p -> Stage2) {
+
+ p -> Stage2(wPCS, wStageLMN, &p->m2, &p->of2);
+
+ if (wPCS[0] == 0xFFFF &&
+ wPCS[1] == 0xFFFF &&
+ wPCS[2] == 0xFFFF) {
+
+ // White cutoff
+
+ output = p -> ToOutput((_LPcmsTRANSFORM)p,
+ _cmsWhiteBySpace(cmsGetColorSpace(p -> OutputProfile)),
+ output);
+
+ continue;
+ }
+
+ }
+ else
+ COPY_3CHANS(wStageLMN, wPCS);
+
+ // Here wOut may come as MAXCHANNELS channels
+
+ p -> ToDevice(p, wStageLMN, wOut);
+
+ output = p -> ToOutput((_LPcmsTRANSFORM)p, wOut, output);
+ }
+}
+
+// Using precalculated LUT
+
+static
+void PrecalculatedXFORM(_LPcmsTRANSFORM p,
+ LPVOID in,
+ LPVOID out, unsigned int Size)
+{
+ register LPBYTE accum;
+ register LPBYTE output;
+ WORD wIn[MAXCHANNELS], wOut[MAXCHANNELS];
+ register unsigned int i, n;
+
+
+ accum = (LPBYTE) in;
+ output = (LPBYTE) out;
+ n = Size; // Buffer len
+
+ for (i=0; i < n; i++) {
+
+ accum = p -> FromInput(p, wIn, accum);
+ cmsEvalLUT(p -> DeviceLink, wIn, wOut);
+ output = p -> ToOutput(p, wOut, output);
+ }
+}
+
+// Auxiliar: Handle precalculated gamut check
+
+static
+void TransformOnePixelWithGamutCheck(_LPcmsTRANSFORM p, WORD wIn[], WORD wOut[])
+{
+ WORD wOutOfGamut;
+
+ cmsEvalLUT(p ->GamutCheck, wIn, &wOutOfGamut);
+
+ if (wOutOfGamut >= 1) {
+
+ ZeroMemory(wOut, sizeof(WORD) * MAXCHANNELS);
+
+ wOut[0] = AlarmR;
+ wOut[1] = AlarmG;
+ wOut[2] = AlarmB;
+
+ }
+ else
+ cmsEvalLUT(p -> DeviceLink, wIn, wOut);
+
+}
+
+
+static
+void PrecalculatedXFORMGamutCheck(_LPcmsTRANSFORM p,
+ LPVOID in,
+ LPVOID out, unsigned int Size)
+{
+ register LPBYTE accum;
+ register LPBYTE output;
+ WORD wIn[MAXCHANNELS], wOut[MAXCHANNELS];
+ register unsigned int i, n;
+
+
+ accum = (LPBYTE) in;
+ output = (LPBYTE) out;
+ n = Size; // Buffer len
+
+ for (i=0; i < n; i++) {
+
+ accum = p -> FromInput(p, wIn, accum);
+
+ TransformOnePixelWithGamutCheck(p, wIn, wOut);
+
+ output = p -> ToOutput(p, wOut, output);
+ }
+}
+
+
+
+// Using precalculated LUT + Cache
+
+static
+void CachedXFORM(_LPcmsTRANSFORM p,
+ LPVOID in,
+ LPVOID out, unsigned int Size)
+{
+ register LPBYTE accum;
+ register LPBYTE output;
+ WORD wIn[MAXCHANNELS], wOut[MAXCHANNELS];
+ register unsigned int i, n;
+
+
+ accum = (LPBYTE) in;
+ output = (LPBYTE) out;
+ n = Size; // Buffer len
+
+ // Empty buffers for quick memcmp
+
+ ZeroMemory(wIn, sizeof(WORD) * MAXCHANNELS);
+ ZeroMemory(wOut, sizeof(WORD) * MAXCHANNELS);
+
+ for (i=0; i < n; i++) {
+
+ accum = p -> FromInput(p, wIn, accum);
+
+ if (memcmp(wIn, p ->CacheIn, sizeof(WORD) * MAXCHANNELS) == 0) {
+
+ CopyMemory(wOut, p ->CacheOut, sizeof(WORD) * MAXCHANNELS);
+ }
+ else {
+
+ CopyMemory(p ->CacheIn, wIn, sizeof(WORD) * MAXCHANNELS);
+
+ cmsEvalLUT(p -> DeviceLink, wIn, wOut);
+
+ CopyMemory(p ->CacheOut, wOut, sizeof(WORD) * MAXCHANNELS);
+ }
+
+ output = p -> ToOutput(p, wOut, output);
+ }
+}
+
+
+
+// Using precalculated LUT + Cache
+
+static
+void CachedXFORMGamutCheck(_LPcmsTRANSFORM p,
+ LPVOID in,
+ LPVOID out, unsigned int Size)
+{
+ register LPBYTE accum;
+ register LPBYTE output;
+ WORD wIn[MAXCHANNELS], wOut[MAXCHANNELS];
+ register unsigned int i, n;
+
+
+ accum = (LPBYTE) in;
+ output = (LPBYTE) out;
+ n = Size; // Buffer len
+
+ // Empty buffers for quick memcmp
+
+ ZeroMemory(wIn, sizeof(WORD) * MAXCHANNELS);
+ ZeroMemory(wOut, sizeof(WORD) * MAXCHANNELS);
+
+ for (i=0; i < n; i++) {
+
+ accum = p -> FromInput(p, wIn, accum);
+
+ if (memcmp(wIn, p ->CacheIn, sizeof(WORD) * MAXCHANNELS) == 0) {
+
+ CopyMemory(wOut, p ->CacheOut, sizeof(WORD) * MAXCHANNELS);
+ }
+ else {
+
+ CopyMemory(p ->CacheIn, wIn, sizeof(WORD) * MAXCHANNELS);
+
+ TransformOnePixelWithGamutCheck(p, wIn, wOut);
+
+ CopyMemory(p ->CacheOut, wOut, sizeof(WORD) * MAXCHANNELS);
+ }
+
+ output = p -> ToOutput(p, wOut, output);
+ }
+}
+
+
+// Using smelted Matrix/Shaper
+
+static
+void MatrixShaperXFORM(_LPcmsTRANSFORM p,
+ LPVOID in,
+ LPVOID out, unsigned int Size)
+{
+ register LPBYTE accum;
+ register LPBYTE output;
+ WORD wIn[MAXCHANNELS], wOut[MAXCHANNELS];
+ register unsigned int i, n;
+
+
+ accum = (LPBYTE) in;
+ output = (LPBYTE) out;
+ n = Size; // Buffer len
+
+ for (i=0; i < n; i++)
+ {
+ accum = p -> FromInput(p, wIn, accum);
+ cmsEvalMatShaper(p -> SmeltMatShaper, wIn, wOut);
+ output = p -> ToOutput(p, wOut, output);
+ }
+}
+
+
+// Using Named color input table
+
+static
+void NC2deviceXform(_LPcmsTRANSFORM p,
+ LPVOID in,
+ LPVOID out, unsigned int Size)
+{
+
+ register LPBYTE accum;
+ register LPBYTE output;
+ WORD wIn[MAXCHANNELS], wOut[MAXCHANNELS];
+ register unsigned int i;
+
+
+ accum = (LPBYTE) in;
+ output = (LPBYTE) out;
+
+ for (i=0; i < Size; i++) {
+
+ accum = p -> FromInput(p, wIn, accum);
+ CopyMemory(wOut, p ->NamedColorList->List[wIn[0]].DeviceColorant, sizeof(WORD) * MAXCHANNELS);
+ output = p -> ToOutput(p, wOut, output);
+ }
+
+}
+
+
+
+// --------------------------------------------------------------------------
+// Build a LUT based on shape-matrix method.
+
+
+// Some non-conformant gray profiles are using kTCR as L*,
+// this function converts the curve to XYZ PCS.
+
+static
+void FromLstarToXYZ(LPGAMMATABLE g, LPGAMMATABLE gxyz[3])
+{
+ int i;
+ int nPoints = 4096;
+ cmsCIELab Lab;
+ cmsCIEXYZ XYZ;
+ L16PARAMS L16;
+
+ // Setup interpolation across origin
+ cmsCalcL16Params(g ->nEntries, &L16);
+
+ // Allocate curves
+ gxyz[0] = cmsAllocGamma(nPoints);
+ gxyz[1] = cmsAllocGamma(nPoints);
+ gxyz[2] = cmsAllocGamma(nPoints);
+
+ // Transport from Lab to XYZ
+
+ for (i=0; i < nPoints; i++) {
+
+ WORD val = _cmsQuantizeVal(i, nPoints);
+ WORD w = cmsLinearInterpLUT16(val, g->GammaTable, &L16);
+
+ Lab.L = ((double) 100.0 * w ) / 65535.0;
+ Lab.a = Lab.b = 0;
+
+ cmsLab2XYZ(NULL, &XYZ, &Lab);
+
+ // Should be same curve
+ gxyz[0] ->GammaTable[i] = (WORD) floor((65535.0 * XYZ.X) / D50X + 0.5);
+ gxyz[1] ->GammaTable[i] = (WORD) floor((65535.0 * XYZ.Y) / D50Y + 0.5);
+ gxyz[2] ->GammaTable[i] = (WORD) floor((65535.0 * XYZ.Z) / D50Z + 0.5);
+ }
+}
+
+// Monochrome version
+
+static
+LPMATSHAPER cmsBuildGrayInputMatrixShaper(cmsHPROFILE hProfile)
+{
+ cmsCIEXYZ Illuminant;
+ LPGAMMATABLE GrayTRC, Shapes[3];
+ LPMATSHAPER MatShaper;
+ MAT3 Scale;
+
+ GrayTRC = cmsReadICCGamma(hProfile, icSigGrayTRCTag); // Y
+ cmsTakeIluminant(&Illuminant, hProfile);
+
+ if (cmsGetPCS(hProfile) == icSigLabData) {
+
+ // Fixup for Lab monochrome
+ FromLstarToXYZ(GrayTRC, Shapes);
+ }
+ else {
+ Shapes[0] = cmsDupGamma(GrayTRC);
+ Shapes[1] = cmsDupGamma(GrayTRC);
+ Shapes[2] = cmsDupGamma(GrayTRC);
+ }
+
+ if (!Shapes[0] || !Shapes[1] || !Shapes[2])
+ return NULL;
+
+ cmsFreeGamma(GrayTRC);
+
+ // R=G=B as precondition
+
+ VEC3init(&Scale.v[0], Illuminant.X/3, Illuminant.X/3, Illuminant.X/3);
+ VEC3init(&Scale.v[1], Illuminant.Y/3, Illuminant.Y/3, Illuminant.Y/3);
+ VEC3init(&Scale.v[2], Illuminant.Z/3, Illuminant.Z/3, Illuminant.Z/3);
+
+
+ MatShaper = cmsAllocMatShaper(&Scale, Shapes, MATSHAPER_INPUT);
+ cmsFreeGammaTriple(Shapes);
+ return MatShaper;
+
+}
+
+
+// Monochrome as output
+
+static
+LPMATSHAPER cmsBuildGrayOutputMatrixShaper(cmsHPROFILE hProfile)
+{
+ cmsCIEXYZ Illuminant;
+ LPGAMMATABLE GrayTRC, Shapes[3];
+ LPMATSHAPER MatShaper;
+ MAT3 Scale;
+
+ cmsTakeIluminant(&Illuminant, hProfile);
+
+ // That is a special case for non-compliant profiles.
+
+ if (cmsGetPCS(hProfile) == icSigLabData) {
+
+ LPGAMMATABLE Shapes1[3];
+
+ GrayTRC = cmsReadICCGamma(hProfile, icSigGrayTRCTag);
+ FromLstarToXYZ(GrayTRC, Shapes1);
+
+ // Reversing must be done after curve translation
+
+ Shapes[0] = cmsReverseGamma(Shapes1[0]->nEntries, Shapes1[0]);
+ Shapes[1] = cmsReverseGamma(Shapes1[1]->nEntries, Shapes1[1]);
+ Shapes[2] = cmsReverseGamma(Shapes1[2]->nEntries, Shapes1[2]);
+
+ cmsFreeGammaTriple(Shapes1);
+
+ }
+ else {
+
+ // Normal case
+
+ GrayTRC = cmsReadICCGammaReversed(hProfile, icSigGrayTRCTag); // Y
+
+ Shapes[0] = cmsDupGamma(GrayTRC);
+ Shapes[1] = cmsDupGamma(GrayTRC);
+ Shapes[2] = cmsDupGamma(GrayTRC);
+ }
+
+ if (!Shapes[0] || !Shapes[1] || !Shapes[2])
+ return NULL;
+
+ cmsFreeGamma(GrayTRC);
+
+ VEC3init(&Scale.v[0], 0, 1.0/Illuminant.Y, 0);
+ VEC3init(&Scale.v[1], 0, 1.0/Illuminant.Y, 0);
+ VEC3init(&Scale.v[2], 0, 1.0/Illuminant.Y, 0);
+
+
+ MatShaper = cmsAllocMatShaper(&Scale, Shapes, MATSHAPER_OUTPUT);
+ cmsFreeGammaTriple(Shapes);
+ return MatShaper;
+
+}
+
+
+
+// Input matrix, only in XYZ
+
+LPMATSHAPER cmsBuildInputMatrixShaper(cmsHPROFILE InputProfile)
+{
+ MAT3 DoubleMat;
+ LPGAMMATABLE Shapes[3];
+ LPMATSHAPER InMatSh;
+
+ // Check if this is a grayscale profile. If so, build
+ // appropiate conversion tables. The tables are the PCS
+ // iluminant, scaled across GrayTRC
+
+ if (cmsGetColorSpace(InputProfile) == icSigGrayData)
+ {
+ // if (dwFlags) *dwFlags |= cmsFLAGS_NOTPRECALC;
+ return cmsBuildGrayInputMatrixShaper(InputProfile);
+ }
+
+ if (!cmsReadICCMatrixRGB2XYZ(&DoubleMat, InputProfile))
+ return NULL;
+
+ Shapes[0] = cmsReadICCGamma(InputProfile, icSigRedTRCTag);
+ Shapes[1] = cmsReadICCGamma(InputProfile, icSigGreenTRCTag);
+ Shapes[2] = cmsReadICCGamma(InputProfile, icSigBlueTRCTag);
+
+ if (!Shapes[0] || !Shapes[1] || !Shapes[2])
+ return NULL;
+
+ InMatSh = cmsAllocMatShaper(&DoubleMat, Shapes, MATSHAPER_INPUT);
+
+ cmsFreeGammaTriple(Shapes);
+
+ return InMatSh;
+}
+
+
+// Output style matrix-shaper
+
+
+LPMATSHAPER cmsBuildOutputMatrixShaper(cmsHPROFILE OutputProfile)
+{
+ MAT3 DoubleMat, DoubleInv;
+ LPGAMMATABLE InverseShapes[3];
+ LPMATSHAPER OutMatSh;
+
+
+
+ if (cmsGetColorSpace(OutputProfile) == icSigGrayData)
+ {
+ return cmsBuildGrayOutputMatrixShaper(OutputProfile);
+ }
+
+
+ if (!cmsReadICCMatrixRGB2XYZ(&DoubleMat, OutputProfile))
+ return NULL;
+
+ if (MAT3inverse(&DoubleMat, &DoubleInv) < 0)
+ return NULL;
+
+
+ InverseShapes[0] = cmsReadICCGammaReversed(OutputProfile, icSigRedTRCTag);
+ InverseShapes[1] = cmsReadICCGammaReversed(OutputProfile, icSigGreenTRCTag);
+ InverseShapes[2] = cmsReadICCGammaReversed(OutputProfile, icSigBlueTRCTag);
+
+ OutMatSh = cmsAllocMatShaper(&DoubleInv, InverseShapes, MATSHAPER_OUTPUT);
+
+ cmsFreeGammaTriple(InverseShapes);
+
+ return OutMatSh;
+}
+
+
+
+// This function builds a transform matrix chaining parameters
+
+static
+BOOL cmsBuildSmeltMatShaper(_LPcmsTRANSFORM p)
+{
+ MAT3 From, To, ToInv, Transfer;
+ LPGAMMATABLE In[3], InverseOut[3];
+
+
+ if (!cmsReadICCMatrixRGB2XYZ(&From, p -> InputProfile))
+ return FALSE;
+
+
+ if (!cmsReadICCMatrixRGB2XYZ(&To, p -> OutputProfile))
+ return FALSE;
+
+
+ // invert dest
+
+ if (MAT3inverse(&To, &ToInv) < 0)
+ return FALSE;
+
+ // Multiply
+ MAT3per(&Transfer, &ToInv, &From);
+
+
+ // Read gamma curves
+
+ In[0] = cmsReadICCGamma(p -> InputProfile, icSigRedTRCTag);
+ In[1] = cmsReadICCGamma(p -> InputProfile, icSigGreenTRCTag);
+ In[2] = cmsReadICCGamma(p -> InputProfile, icSigBlueTRCTag);
+
+ if (!In[0] || !In[1] || !In[2])
+ return FALSE;
+
+
+ InverseOut[0] = cmsReadICCGammaReversed(p -> OutputProfile, icSigRedTRCTag);
+ InverseOut[1] = cmsReadICCGammaReversed(p -> OutputProfile, icSigGreenTRCTag);
+ InverseOut[2] = cmsReadICCGammaReversed(p -> OutputProfile, icSigBlueTRCTag);
+
+ p -> SmeltMatShaper = cmsAllocMatShaper2(&Transfer, In, InverseOut, MATSHAPER_ALLSMELTED);
+
+ cmsFreeGammaTriple(In);
+
+ cmsFreeGammaTriple(InverseOut);
+
+ return (p -> SmeltMatShaper != NULL);
+}
+
+
+
+
+// Conversion between PCS ------------------------------------------
+
+// Identifies intent archieved by LUT
+
+static
+int GetPhase(cmsHPROFILE hProfile)
+{
+ switch (cmsGetPCS(hProfile)) {
+
+ case icSigXYZData: return XYZRel;
+
+ case icSigLabData: return LabRel;
+
+ default: cmsSignalError(LCMS_ERRC_ABORTED, "Invalid PCS");
+ }
+
+ return XYZRel;
+}
+
+
+
+
+static
+void TakeConversionRoutines(_LPcmsTRANSFORM p, int DoBPC)
+{
+ cmsCIEXYZ BlackPointIn, WhitePointIn, IlluminantIn;
+ cmsCIEXYZ BlackPointOut, WhitePointOut, IlluminantOut;
+ cmsCIEXYZ BlackPointProof, WhitePointProof, IlluminantProof;
+ MAT3 ChromaticAdaptationMatrixIn, ChromaticAdaptationMatrixOut;
+ MAT3 ChromaticAdaptationMatrixProof;
+
+
+ cmsTakeIluminant(&IlluminantIn, p -> InputProfile);
+ cmsTakeMediaWhitePoint(&WhitePointIn, p -> InputProfile);
+ cmsTakeMediaBlackPoint(&BlackPointIn, p -> InputProfile);
+ cmsReadChromaticAdaptationMatrix(&ChromaticAdaptationMatrixIn, p -> InputProfile);
+
+ cmsTakeIluminant(&IlluminantOut, p -> OutputProfile);
+ cmsTakeMediaWhitePoint(&WhitePointOut, p -> OutputProfile);
+ cmsTakeMediaBlackPoint(&BlackPointOut, p -> OutputProfile);
+ cmsReadChromaticAdaptationMatrix(&ChromaticAdaptationMatrixOut, p -> OutputProfile);
+
+
+ if (p -> Preview == NULL && p ->Gamut == NULL) // Non-proofing
+ {
+ if (p ->Intent == INTENT_PERCEPTUAL ||
+ p ->Intent == INTENT_SATURATION) {
+
+
+ // For v4 profiles, Perceptual PCS has a reference black point
+ // which v2 profiles should scale to.
+
+ if ((cmsGetProfileICCversion(p ->InputProfile) >= 0x4000000) ||
+ (cmsGetProfileICCversion(p ->OutputProfile) >= 0x4000000)) {
+
+ DoBPC = TRUE;
+ }
+ }
+
+ // Black point compensation does not apply to absolute intent
+
+ if (p ->Intent == INTENT_ABSOLUTE_COLORIMETRIC)
+ DoBPC = FALSE;
+
+ // Black point compensation does not apply to devicelink profiles
+
+ if (cmsGetDeviceClass(p ->InputProfile) == icSigLinkClass)
+ DoBPC = FALSE;
+
+ if (cmsGetDeviceClass(p ->OutputProfile) == icSigLinkClass)
+ DoBPC = FALSE;
+
+ if (DoBPC) {
+
+ // Detect Black points
+
+ cmsDetectBlackPoint(&BlackPointIn, p->InputProfile, p->Intent, 0);
+ cmsDetectBlackPoint(&BlackPointOut, p->OutputProfile, p->Intent, 0);
+
+ // If equal black points, then do nothing. This often applies to BP=0
+
+ if (BlackPointIn.X == BlackPointOut.X &&
+ BlackPointIn.Y == BlackPointOut.Y &&
+ BlackPointIn.Z == BlackPointOut.Z)
+ DoBPC = FALSE;
+
+
+ }
+
+ cmsChooseCnvrt(p -> Intent == INTENT_ABSOLUTE_COLORIMETRIC,
+
+ p -> Phase1,
+ &BlackPointIn,
+ &WhitePointIn,
+ &IlluminantIn,
+ &ChromaticAdaptationMatrixIn,
+
+ p -> Phase3,
+ &BlackPointOut,
+ &WhitePointOut,
+ &IlluminantOut,
+ &ChromaticAdaptationMatrixOut,
+
+ DoBPC,
+ p ->AdaptationState,
+ &p->Stage1,
+ &p->m1, &p->of1);
+
+ }
+ else // Proofing
+ {
+
+
+ cmsTakeIluminant(&IlluminantProof, p -> PreviewProfile);
+ cmsTakeMediaWhitePoint(&WhitePointProof, p -> PreviewProfile);
+ cmsTakeMediaBlackPoint(&BlackPointProof, p -> PreviewProfile);
+ cmsReadChromaticAdaptationMatrix(&ChromaticAdaptationMatrixProof, p -> PreviewProfile);
+
+ if (DoBPC) {
+
+ cmsDetectBlackPoint(&BlackPointProof, p->PreviewProfile, p->Intent, 0);
+ cmsDetectBlackPoint(&BlackPointIn, p->InputProfile, p->Intent, 0);
+ cmsDetectBlackPoint(&BlackPointOut, p->OutputProfile, p->Intent, 0);
+
+ // Reality check
+
+ if (BlackPointIn.X == BlackPointProof.X &&
+ BlackPointIn.Y == BlackPointProof.Y &&
+ BlackPointIn.Z == BlackPointProof.Z)
+ DoBPC = FALSE;
+
+
+ }
+
+
+
+ cmsChooseCnvrt(p -> Intent == INTENT_ABSOLUTE_COLORIMETRIC,
+
+ p -> Phase1,
+ &BlackPointIn,
+ &WhitePointIn,
+ &IlluminantIn,
+ &ChromaticAdaptationMatrixIn,
+
+ p -> Phase2,
+ &BlackPointProof,
+ &WhitePointProof,
+ &IlluminantProof,
+ &ChromaticAdaptationMatrixProof,
+ DoBPC,
+ p ->AdaptationState,
+ &p->Stage1,
+ &p->m1, &p->of1);
+
+ cmsChooseCnvrt(p -> ProofIntent == INTENT_ABSOLUTE_COLORIMETRIC,
+
+ p -> Phase2,
+ &BlackPointProof,
+ &WhitePointProof,
+ &IlluminantProof,
+ &ChromaticAdaptationMatrixProof,
+
+ p -> Phase3,
+ &BlackPointOut,
+ &WhitePointOut,
+ &IlluminantOut,
+ &ChromaticAdaptationMatrixOut,
+ 0,
+ 0.0,
+ &p->Stage2,
+ &p->m2, &p->of2);
+ }
+
+}
+
+
+// Check colorspace
+
+static
+BOOL IsProperColorSpace(cmsHPROFILE hProfile, DWORD dwFormat, BOOL lUsePCS)
+{
+ int Space = T_COLORSPACE(dwFormat);
+
+ if (Space == PT_ANY) return TRUE;
+
+ if (lUsePCS)
+ return (Space == _cmsLCMScolorSpace(cmsGetPCS(hProfile)));
+ else
+ return (Space == _cmsLCMScolorSpace(cmsGetColorSpace(hProfile)));
+}
+
+
+// Auxiliary: allocate transform struct and set to defaults
+
+static
+_LPcmsTRANSFORM AllocEmptyTransform(void)
+{
+ // Allocate needed memory
+
+ _LPcmsTRANSFORM p = (_LPcmsTRANSFORM) malloc(sizeof(_cmsTRANSFORM));
+ if (!p) {
+
+ cmsSignalError(LCMS_ERRC_ABORTED, "cmsCreateTransform: malloc() failed");
+ return NULL;
+ }
+
+ ZeroMemory(p, sizeof(_cmsTRANSFORM));
+
+ // Initialize default methods
+
+ p -> xform = NULL;
+ p -> Intent = INTENT_PERCEPTUAL;
+ p -> ProofIntent = INTENT_ABSOLUTE_COLORIMETRIC;
+ p -> DoGamutCheck = FALSE;
+ p -> InputProfile = NULL;
+ p -> OutputProfile = NULL;
+ p -> PreviewProfile = NULL;
+ p -> Preview = NULL;
+ p -> Gamut = NULL;
+ p -> DeviceLink = NULL;
+ p -> InMatShaper = NULL;
+ p -> OutMatShaper = NULL;
+ p -> SmeltMatShaper = NULL;
+ p -> NamedColorList = NULL;
+ p -> EntryColorSpace = (icColorSpaceSignature) 0;
+ p -> ExitColorSpace = (icColorSpaceSignature) 0;
+ p -> AdaptationState = GlobalAdaptationState;
+
+ return p;
+}
+
+
+// Identify whatever a transform is to be cached
+
+static
+void SetPrecalculatedTransform(_LPcmsTRANSFORM p, DWORD dwFlags)
+{
+ if (dwFlags & cmsFLAGS_GAMUTCHECK && p ->GamutCheck != NULL) {
+
+ p -> xform = PrecalculatedXFORMGamutCheck;
+
+ if (!(dwFlags & cmsFLAGS_NOTCACHE)) {
+
+ ZeroMemory(p ->CacheIn, sizeof(WORD) * MAXCHANNELS);
+ TransformOnePixelWithGamutCheck(p, p->CacheIn, p ->CacheOut);
+ p ->xform = CachedXFORMGamutCheck;
+ }
+
+ }
+ else {
+
+ p -> xform = PrecalculatedXFORM;
+
+ if (!(dwFlags & cmsFLAGS_NOTCACHE)) {
+
+ ZeroMemory(p ->CacheIn, sizeof(WORD) * MAXCHANNELS);
+ cmsEvalLUT(p ->DeviceLink, p->CacheIn, p ->CacheOut);
+ p ->xform = CachedXFORM;
+ }
+ }
+}
+
+
+// Transform is identified as device-link
+static
+cmsHPROFILE CreateDeviceLinkTransform(_LPcmsTRANSFORM p, DWORD dwFlags)
+{
+
+ if (!IsProperColorSpace(p->InputProfile, p->InputFormat, FALSE)) {
+ cmsSignalError(LCMS_ERRC_ABORTED, "Device link is operating on wrong colorspace on input");
+ return NULL;
+ }
+
+ if (!IsProperColorSpace(p->InputProfile, p->OutputFormat, TRUE)) {
+ cmsSignalError(LCMS_ERRC_ABORTED, "Device link is operating on wrong colorspace on output");
+ return NULL;
+ }
+
+ // Device link does only have AToB0Tag (ICC-Spec 1998/09)
+
+ p->DeviceLink = cmsReadICCLut(p->InputProfile, icSigAToB0Tag);
+
+ if (!p->DeviceLink) {
+
+ cmsSignalError(LCMS_ERRC_ABORTED, "Noncompliant device-link profile");
+ cmsDeleteTransform((cmsHTRANSFORM) p);
+ return NULL;
+ }
+
+ if (p ->PreviewProfile != NULL) {
+ cmsSignalError(LCMS_ERRC_WARNING, "Proofing not supported on device link transforms");
+ }
+
+ if (p ->OutputProfile != NULL) {
+ cmsSignalError(LCMS_ERRC_WARNING, "Output profile should be NULL, since this is a device-link transform");
+ }
+
+ p -> Phase1 = -1;
+ p -> Phase2 = -1;
+ p -> Phase3 = -1;
+
+ SetPrecalculatedTransform(p, dwFlags);
+
+ p -> EntryColorSpace = cmsGetColorSpace(p -> InputProfile);
+ p -> ExitColorSpace = cmsGetPCS(p -> InputProfile);
+
+ if (p ->EntryColorSpace == icSigRgbData ||
+ p ->EntryColorSpace == icSigCmyData) {
+
+ p->DeviceLink -> CLut16params.Interp3D = cmsTetrahedralInterp16;
+ }
+
+ // Precalculated device-link profile is ready
+ return (cmsHTRANSFORM) p;
+}
+
+
+// Transform that includes proofing
+static
+void CreateProof(_LPcmsTRANSFORM p,
+ DWORD dwFlags,
+ icTagSignature *ToTagPtr)
+
+{
+ icTagSignature ProofTag;
+
+ if (dwFlags & cmsFLAGS_SOFTPROOFING) {
+
+ // Apr-15, 2002 - Too much profiles does have bogus content
+ // on preview tag, so I do compute it by my own.
+
+ p -> Preview = _cmsComputeSoftProofLUT(p ->PreviewProfile, p ->Intent);
+ p -> Phase2 = LabRel;
+
+ // That's a proofing transfor, so use second intent for output.
+
+ *ToTagPtr = PCS2Device[p->ProofIntent];
+
+ if (p -> Preview == NULL) {
+
+ ProofTag = Preview[p -> Intent];
+
+ if (!cmsIsTag(p ->PreviewProfile, ProofTag)) {
+
+ ProofTag = Preview[0];
+ if (!cmsIsTag(p ->PreviewProfile, ProofTag))
+ ProofTag = (icTagSignature)0;
+ }
+
+ if (ProofTag) {
+
+ p -> Preview = cmsReadICCLut(p ->PreviewProfile, ProofTag);
+ p -> Phase2 = GetPhase(p ->PreviewProfile);
+
+ }
+ else
+ {
+ p -> Preview = NULL;
+ p ->PreviewProfile = NULL;
+ cmsSignalError(LCMS_ERRC_WARNING, "Sorry, the proof profile has not previewing capabilities");
+ }
+ }
+
+ }
+
+
+ // Aug-31, 2001 - Too much profiles does have bogus content
+ // on gamut tag, so I do compute it by my own.
+
+ if ((dwFlags & cmsFLAGS_GAMUTCHECK) && (dwFlags & cmsFLAGS_NOTPRECALC)) {
+
+
+ p -> Gamut = _cmsComputeGamutLUT(p->PreviewProfile, p ->Intent);
+ p -> Phase2 = LabRel;
+
+ if (p -> Gamut == NULL) {
+
+ // Profile goes only in one direction... try to see
+ // if profile has the tag, and use it, no matter it
+ // could be bogus. This is the last chance!
+
+ if (cmsIsTag(p ->PreviewProfile, icSigGamutTag)) {
+
+ p -> Gamut = cmsReadICCLut(p ->PreviewProfile, icSigGamutTag);
+
+ }
+ else {
+
+ // Nope, cannot be done.
+
+ cmsSignalError(LCMS_ERRC_WARNING, "Sorry, the proof profile has not gamut checking capabilities");
+ p -> Gamut = NULL;
+ }
+ }
+
+ }
+
+}
+
+// Choose the adequate transform routine
+
+static
+_LPcmsTRANSFORM PickTransformRoutine(_LPcmsTRANSFORM p,
+ LPDWORD dwFlagsPtr,
+ icTagSignature *FromTagPtr,
+ icTagSignature *ToTagPtr)
+{
+
+
+
+
+ // Is a named color profile?
+ if (cmsGetDeviceClass(p->InputProfile) == icSigNamedColorClass) {
+
+ // Yes, and used as input
+ p ->FromDevice = NC2toPCS;
+ }
+ else {
+ // Can we optimize matrix-shaper only transform?
+
+ if (*FromTagPtr == 0 &&
+ *ToTagPtr == 0 &&
+ !p->PreviewProfile &&
+ p -> Intent != INTENT_ABSOLUTE_COLORIMETRIC &&
+ (p -> EntryColorSpace == icSigRgbData) &&
+ (p -> ExitColorSpace == icSigRgbData) &&
+ !((*dwFlagsPtr) & cmsFLAGS_BLACKPOINTCOMPENSATION)) {
+
+ // Yes... try to smelt matrix-shapers
+ p -> xform = MatrixShaperXFORM;
+ *dwFlagsPtr |= cmsFLAGS_NOTPRECALC;
+
+ if (!cmsBuildSmeltMatShaper(p))
+ {
+ cmsSignalError(LCMS_ERRC_ABORTED, "unable to smelt shaper-matrix, required tags missing");
+ return NULL;
+ }
+
+ p -> Phase1 = p -> Phase3 = XYZRel;
+ return p;
+
+ }
+
+ // No, is a transform involving LUT
+
+ if (*FromTagPtr != 0) {
+
+ p -> FromDevice = LUTtoPCS;
+ p -> Device2PCS = cmsReadICCLut(p -> InputProfile, *FromTagPtr);
+ if (!p -> Device2PCS) {
+
+ cmsSignalError(LCMS_ERRC_ABORTED, "profile is unsuitable for input");
+ return NULL;
+ }
+
+ }
+ else
+ {
+ p -> FromDevice = ShaperMatrixToPCS;
+ p -> InMatShaper = cmsBuildInputMatrixShaper(p -> InputProfile);
+
+ if (!p ->InMatShaper) {
+ cmsSignalError(LCMS_ERRC_ABORTED, "profile is unsuitable for input");
+ return NULL;
+ }
+
+ p -> Phase1 = XYZRel;
+
+ }
+ }
+
+ if (*ToTagPtr != 0) {
+
+ p -> ToDevice = PCStoLUT;
+ p -> PCS2Device = cmsReadICCLut(p -> OutputProfile, *ToTagPtr);
+ if (!p -> PCS2Device) {
+ cmsSignalError(LCMS_ERRC_ABORTED, "profile is unsuitable for output");
+ return NULL;
+ }
+
+ }
+ else
+ {
+ p -> ToDevice = PCStoShaperMatrix;
+ p -> OutMatShaper = cmsBuildOutputMatrixShaper(p->OutputProfile);
+
+ if (!p -> OutMatShaper) {
+ cmsSignalError(LCMS_ERRC_ABORTED, "profile is unsuitable for output");
+ return NULL;
+ }
+ p -> Phase3 = XYZRel;
+
+ }
+
+
+ return p;
+}
+
+
+
+
+// Create a transform.
+
+cmsHTRANSFORM LCMSEXPORT cmsCreateProofingTransform(cmsHPROFILE InputProfile,
+ DWORD InputFormat,
+ cmsHPROFILE OutputProfile,
+ DWORD OutputFormat,
+ cmsHPROFILE ProofingProfile,
+ int nIntent,
+ int ProofingIntent,
+ DWORD dwFlags)
+
+{
+ _LPcmsTRANSFORM p;
+ icTagSignature FromTag;
+ icTagSignature ToTag;
+
+ if (nIntent < 0 || nIntent > 3 ||
+ ProofingIntent < 0 || ProofingIntent > 3) {
+
+ cmsSignalError(LCMS_ERRC_ABORTED, "cmsCreateTransform: intent mismatch");
+ return NULL;
+ }
+
+ p = AllocEmptyTransform();
+ if (p == NULL) return NULL;
+
+ p -> xform = NormalXFORM;
+ p -> Intent = nIntent;
+ p -> ProofIntent = ProofingIntent;
+ p -> DoGamutCheck = FALSE;
+ p -> InputProfile = InputProfile;
+ p -> OutputProfile = OutputProfile;
+ p -> PreviewProfile = ProofingProfile;
+ p -> InputFormat = InputFormat;
+ p -> OutputFormat = OutputFormat;
+ p -> lInputV4Lab = p ->lOutputV4Lab = FALSE;
+
+ p -> FromInput = _cmsIdentifyInputFormat(p, InputFormat);
+ p -> ToOutput = _cmsIdentifyOutputFormat(p, OutputFormat);
+
+ // Null transform can be done without profiles
+ if ((dwFlags & cmsFLAGS_NULLTRANSFORM) ||
+ ((InputProfile == NULL) &&
+ (OutputProfile == NULL))) {
+
+ p -> xform = NullXFORM;
+ return (cmsHTRANSFORM) p;
+ }
+
+ // From here we need at least one input profile
+ if (InputProfile == NULL) {
+
+ cmsSignalError(LCMS_ERRC_ABORTED, "Input profile cannot be NULL!");
+ cmsDeleteTransform((cmsHTRANSFORM) p);
+ return NULL;
+ }
+
+
+ // Device link are means to store precalculated transform grids.
+ if (cmsGetDeviceClass(InputProfile) == icSigLinkClass) {
+
+ return CreateDeviceLinkTransform(p, dwFlags);
+ }
+
+ if (!IsProperColorSpace(InputProfile, InputFormat, FALSE)) {
+
+ cmsSignalError(LCMS_ERRC_ABORTED, "Input profile is operating on wrong colorspace");
+ cmsDeleteTransform((cmsHTRANSFORM) p);
+ return NULL;
+ }
+
+ p ->EntryColorSpace = cmsGetColorSpace(InputProfile);
+
+ // Oct-21-2002: Added named color transforms
+ if (cmsGetDeviceClass(InputProfile) == icSigNamedColorClass) {
+
+ if (p ->NamedColorList == NULL)
+ p ->NamedColorList = cmsAllocNamedColorList(0);
+
+ cmsReadICCnamedColorList(p, InputProfile, icSigNamedColor2Tag);
+
+ // Special case. If output profile == NULL, then the transform gives
+ // device values from named colors.
+
+ if (OutputProfile == NULL) {
+
+ p ->ExitColorSpace = p -> EntryColorSpace;
+ p ->xform = NC2deviceXform;
+ return (cmsHTRANSFORM) p;
+ }
+
+
+ // Named color doesn't precalc anything
+ dwFlags |= cmsFLAGS_NOTPRECALC;
+ }
+
+
+ // From here we need also output profile.
+ if (OutputProfile == NULL) {
+ cmsSignalError(LCMS_ERRC_ABORTED, "Output profile cannot be NULL!");
+ cmsDeleteTransform((cmsHTRANSFORM) p);
+ return NULL;
+ }
+
+
+ if (!IsProperColorSpace(OutputProfile, OutputFormat, FALSE)) {
+ cmsSignalError(LCMS_ERRC_ABORTED, "Output profile is operating on wrong colorspace");
+ cmsDeleteTransform((cmsHTRANSFORM) p);
+ return NULL;
+ }
+
+ p -> ExitColorSpace = cmsGetColorSpace(OutputProfile);
+
+ // Named color only on input
+ if (cmsGetDeviceClass(OutputProfile) == icSigNamedColorClass) {
+
+ cmsSignalError(LCMS_ERRC_ABORTED, "Named color profiles are not supported as output");
+ cmsDeleteTransform((cmsHTRANSFORM) p);
+ return NULL;
+ }
+
+ p -> Phase1 = GetPhase(InputProfile);
+ p -> Phase2 = -1;
+ p -> Phase3 = GetPhase(OutputProfile);
+
+ // Try to locate a LUT
+
+ FromTag = Device2PCS[nIntent];
+ ToTag = PCS2Device[nIntent];
+
+ if (!cmsIsTag(InputProfile, FromTag)) {
+
+ FromTag = Device2PCS[0];
+
+ if (!cmsIsTag(InputProfile, FromTag)) {
+ FromTag = (icTagSignature)0;
+ }
+ }
+
+ // If proofing is needed, add required tags/parameters
+ if (ProofingProfile)
+ CreateProof(p, dwFlags, &ToTag);
+
+
+ if (!cmsIsTag(OutputProfile, ToTag)) {
+
+ ToTag = PCS2Device[0];
+
+ // 12-Dec-2003, Abstract profiles can be placed as output and still using AToB0
+ if (cmsGetDeviceClass(OutputProfile) == icSigAbstractClass) {
+
+ if (!cmsIsTag(OutputProfile, ToTag)) {
+ ToTag = (icTagSignature) icSigAToB0Tag;
+ }
+ }
+
+ if (!cmsIsTag(OutputProfile, ToTag))
+ ToTag = (icTagSignature)0;
+ }
+
+
+ if (dwFlags& cmsFLAGS_MATRIXINPUT)
+ FromTag = (icTagSignature)0;
+
+ if (dwFlags & cmsFLAGS_MATRIXOUTPUT)
+ ToTag = (icTagSignature)0;
+
+
+
+ if (PickTransformRoutine(p, &dwFlags, &FromTag, &ToTag) == NULL) {
+
+ cmsDeleteTransform((cmsHTRANSFORM) p);
+ return NULL;
+
+ }
+
+ TakeConversionRoutines(p, dwFlags & cmsFLAGS_BLACKPOINTCOMPENSATION);
+
+
+ if (!(dwFlags & cmsFLAGS_NOTPRECALC)) {
+
+ LPLUT DeviceLink;
+ LPLUT GamutCheck = NULL;
+
+
+ if (p ->EntryColorSpace == icSigCmykData &&
+ p ->ExitColorSpace == icSigCmykData &&
+ dwFlags & cmsFLAGS_PRESERVEBLACK) {
+
+ DeviceLink = _cmsPrecalculateBlackPreservingDeviceLink((cmsHTRANSFORM) p, dwFlags);
+
+ // Cannot be done at all?
+ if (DeviceLink == NULL)
+ DeviceLink = _cmsPrecalculateDeviceLink((cmsHTRANSFORM) p, dwFlags);
+
+ }
+ else {
+
+ DeviceLink = _cmsPrecalculateDeviceLink((cmsHTRANSFORM) p, dwFlags);
+ }
+
+ if (dwFlags & cmsFLAGS_GAMUTCHECK) {
+
+ GamutCheck = _cmsPrecalculateGamutCheck((cmsHTRANSFORM) p);
+ }
+
+ // If input colorspace is Rgb, Cmy, then use tetrahedral interpolation
+ // for speed reasons (it only works well on spaces on Luma is diagonal, and
+ // not if luma is in separate channel)
+
+ if (p ->EntryColorSpace == icSigRgbData ||
+ p ->EntryColorSpace == icSigCmyData) {
+
+
+ cmsCalcCLUT16ParamsEx(DeviceLink->CLut16params.nSamples,
+ DeviceLink->CLut16params.nInputs,
+ DeviceLink->CLut16params.nOutputs,
+ TRUE, &DeviceLink->CLut16params);
+
+ }
+
+ // If this is a 8-bit transform, optimize LUT further.
+
+ if ((T_BYTES(InputFormat) == 1) && (T_CHANNELS(InputFormat) == 3)) {
+
+ DeviceLink = _cmsBlessLUT8(DeviceLink);
+ if (DeviceLink == NULL) return NULL;
+
+ }
+
+
+ p ->GamutCheck = GamutCheck;
+
+ if (DeviceLink) {
+
+ p ->DeviceLink = DeviceLink;
+
+ if ((nIntent != INTENT_ABSOLUTE_COLORIMETRIC) &&
+ !(dwFlags & cmsFLAGS_NOWHITEONWHITEFIXUP))
+
+ _cmsFixWhiteMisalignment(p);
+
+ }
+ else
+ {
+
+ cmsSignalError(LCMS_ERRC_ABORTED,
+ "Cannot precalculate %d->%d channels transform!",
+ T_CHANNELS(InputFormat), T_CHANNELS(OutputFormat));
+
+ cmsDeleteTransform(p);
+ return NULL;
+ }
+
+
+ SetPrecalculatedTransform(p, dwFlags);
+
+
+ }
+
+ // Re-Identify formats
+ p -> FromInput = _cmsIdentifyInputFormat(p, InputFormat);
+ p -> ToOutput = _cmsIdentifyOutputFormat(p, OutputFormat);
+
+ return p;
+}
+
+
+// Wrapper por simpler non-proofing transforms.
+
+cmsHTRANSFORM LCMSEXPORT cmsCreateTransform(cmsHPROFILE Input,
+ DWORD InputFormat,
+ cmsHPROFILE Output,
+ DWORD OutputFormat,
+ int Intent,
+ DWORD dwFlags)
+
+{
+ return cmsCreateProofingTransform(Input, InputFormat,
+ Output, OutputFormat,
+ NULL,
+ Intent, INTENT_ABSOLUTE_COLORIMETRIC,
+ dwFlags);
+}
+
+
+// Profiles are *NOT* closed
+
+void LCMSEXPORT cmsDeleteTransform(cmsHTRANSFORM hTransform)
+{
+ _LPcmsTRANSFORM p = (_LPcmsTRANSFORM) (LPSTR) hTransform;
+
+ if (p -> Device2PCS)
+ cmsFreeLUT(p -> Device2PCS);
+ if (p -> PCS2Device)
+ cmsFreeLUT(p -> PCS2Device);
+ if (p -> Gamut)
+ cmsFreeLUT(p -> Gamut);
+ if (p -> Preview)
+ cmsFreeLUT(p -> Preview);
+ if (p -> DeviceLink)
+ cmsFreeLUT(p -> DeviceLink);
+ if (p -> InMatShaper)
+ cmsFreeMatShaper(p -> InMatShaper);
+ if (p -> OutMatShaper)
+ cmsFreeMatShaper(p -> OutMatShaper);
+ if (p -> SmeltMatShaper)
+ cmsFreeMatShaper(p -> SmeltMatShaper);
+ if (p ->NamedColorList)
+ cmsFreeNamedColorList(p ->NamedColorList);
+ if (p -> GamutCheck)
+ cmsFreeLUT(p -> GamutCheck);
+
+ free((void *) p);
+}
+
+
+// Apply transform code
+void LCMSEXPORT cmsDoTransform(cmsHTRANSFORM Transform,
+ LPVOID InputBuffer,
+ LPVOID OutputBuffer, unsigned int Size)
+
+{
+
+ _LPcmsTRANSFORM p = (_LPcmsTRANSFORM) (LPSTR) Transform;
+
+ p -> StrideIn = p -> StrideOut = Size;
+
+ p -> xform(p, InputBuffer, OutputBuffer, Size);
+
+}
+
+
+void LCMSEXPORT cmsSetAlarmCodes(int r, int g, int b)
+{
+ AlarmR = RGB_8_TO_16(r);
+ AlarmG = RGB_8_TO_16(g);
+ AlarmB = RGB_8_TO_16(b);
+}
+
+void LCMSEXPORT cmsGetAlarmCodes(int *r, int *g, int *b)
+{
+ *r = RGB_16_TO_8(AlarmR);
+ *g = RGB_16_TO_8(AlarmG);
+ *b = RGB_16_TO_8(AlarmB);
+}
+
+// Returns TRUE if the profile is implemented as matrix-shaper
+
+BOOL LCMSEXPORT _cmsIsMatrixShaper(cmsHPROFILE hProfile)
+{
+ switch (cmsGetColorSpace(hProfile)) {
+
+ case icSigGrayData:
+
+ return cmsIsTag(hProfile, icSigGrayTRCTag);
+
+ case icSigRgbData:
+
+ return (cmsIsTag(hProfile, icSigRedColorantTag) &&
+ cmsIsTag(hProfile, icSigGreenColorantTag) &&
+ cmsIsTag(hProfile, icSigBlueColorantTag) &&
+ cmsIsTag(hProfile, icSigRedTRCTag) &&
+ cmsIsTag(hProfile, icSigGreenTRCTag) &&
+ cmsIsTag(hProfile, icSigBlueTRCTag));
+
+ default:
+
+ return FALSE;
+ }
+}
+
+
+BOOL LCMSEXPORT cmsIsIntentSupported(cmsHPROFILE hProfile,
+ int Intent, int UsedDirection)
+{
+
+ icTagSignature* TagTable;
+
+ // Device link profiles only implements the intent in header
+
+ if (cmsGetDeviceClass(hProfile) != icSigLinkClass) {
+
+ switch (UsedDirection) {
+
+ case LCMS_USED_AS_INPUT: TagTable = Device2PCS; break;
+ case LCMS_USED_AS_OUTPUT:TagTable = PCS2Device; break;
+ case LCMS_USED_AS_PROOF: TagTable = Preview; break;
+
+ default:
+ cmsSignalError(LCMS_ERRC_ABORTED, "Unexpected direction (%d)", UsedDirection);
+ return FALSE;
+ }
+
+ if (cmsIsTag(hProfile, TagTable[Intent])) return TRUE;
+ return _cmsIsMatrixShaper(hProfile);
+ }
+
+ return (cmsTakeRenderingIntent(hProfile) == Intent);
+}
+
+// Multiple profile transform.
+static
+int MultiprofileSampler(register WORD In[], register WORD Out[], register LPVOID Cargo)
+{
+ cmsHTRANSFORM* Transforms = (cmsHTRANSFORM*) Cargo;
+ int i;
+
+ cmsDoTransform(Transforms[0], In, Out, 1);
+
+ for (i=1; Transforms[i]; i++)
+ cmsDoTransform(Transforms[i], Out, Out, 1);
+
+
+
+ return TRUE;
+}
+
+
+// A multiprofile transform does chain several profiles into a single
+// devicelink. It couls also be used to merge named color profiles into
+// a single database.
+
+
+cmsHTRANSFORM LCMSEXPORT cmsCreateMultiprofileTransform(cmsHPROFILE hProfiles[],
+ int nProfiles,
+ DWORD dwInput,
+ DWORD dwOutput,
+ int Intent,
+ DWORD dwFlags)
+{
+ cmsHTRANSFORM Transforms[257];
+ DWORD dwPrecalcFlags = (dwFlags|cmsFLAGS_NOTPRECALC|cmsFLAGS_NOTCACHE);
+ DWORD FormatInput, FormatOutput;
+ cmsHPROFILE hLab, hXYZ, hProfile;
+ icColorSpaceSignature ColorSpace, CurrentColorSpace;
+ icColorSpaceSignature ColorSpaceIn, ColorSpaceOut;
+ LPLUT Grid;
+ int nGridPoints, ChannelsInput, ChannelsOutput = 3, i;
+ _LPcmsTRANSFORM p;
+ int nNamedColor;
+
+ if (nProfiles > 255) {
+ cmsSignalError(LCMS_ERRC_ABORTED, "What are you trying to do with more that 255 profiles?!?, of course aborted");
+ return NULL;
+ }
+
+ // Creates a phantom transform for latter filling
+ p = (_LPcmsTRANSFORM) cmsCreateTransform(NULL, dwInput,
+ NULL, dwOutput, Intent, cmsFLAGS_NULLTRANSFORM);
+
+ // If user wants null one, give it
+ if (dwFlags & cmsFLAGS_NULLTRANSFORM) return (cmsHPROFILE) p;
+
+ // Is a bunch of named color profiles?
+ nNamedColor = 0;
+ for (i=0; i < nProfiles; i++) {
+ if (cmsGetDeviceClass(hProfiles[i]) == icSigNamedColorClass)
+ nNamedColor++;
+ }
+
+
+ if (nNamedColor == nProfiles) {
+
+ // Yes, only named color. Create a named color-device
+ // and append to named color table
+
+ cmsDeleteTransform((cmsHTRANSFORM) p);
+
+ p = (_LPcmsTRANSFORM) cmsCreateTransform(hProfiles[0], dwInput, NULL, dwOutput, Intent, dwFlags);
+ for (i=1; i < nProfiles; i++) {
+ cmsReadICCnamedColorList(p, hProfiles[i], icSigNamedColor2Tag);
+ }
+
+ return p; // Ok, done so far
+ }
+ else
+ if (nNamedColor > 0) {
+
+ cmsDeleteTransform((cmsHTRANSFORM) p);
+ cmsSignalError(LCMS_ERRC_ABORTED, "Could not mix named color profiles with other types in multiprofile transform");
+ return NULL;
+ }
+
+
+ // We will need a 3DCLUT for device link
+ Grid = cmsAllocLUT();
+ if (!Grid) return NULL;
+
+ // This one is our PCS (Always Lab)
+ hLab = cmsCreateLabProfile(NULL);
+ hXYZ = cmsCreateXYZProfile();
+
+ if (!hLab || !hXYZ) goto ErrorCleanup;
+
+ // Take some info....
+
+ p ->EntryColorSpace = CurrentColorSpace = cmsGetColorSpace(hProfiles[0]);
+
+
+ for (i=0; i < nProfiles; i++) {
+
+ int lIsDeviceLink, lIsInput;
+
+ // Check colorspace
+
+ hProfile = hProfiles[i];
+ lIsDeviceLink = (cmsGetDeviceClass(hProfile) == icSigLinkClass);
+ lIsInput = (CurrentColorSpace != icSigXYZData) &&
+ (CurrentColorSpace != icSigLabData);
+
+ if (lIsInput) {
+
+ ColorSpaceIn = cmsGetColorSpace(hProfile);
+ ColorSpaceOut = cmsGetPCS(hProfile);
+
+ }
+ else {
+
+ ColorSpaceIn = cmsGetPCS(hProfile);
+ ColorSpaceOut = cmsGetColorSpace(hProfile);
+ }
+
+ ChannelsInput = _cmsChannelsOf(ColorSpaceIn);
+ ChannelsOutput = _cmsChannelsOf(ColorSpaceOut);
+
+ FormatInput = BYTES_SH(2)|CHANNELS_SH(ChannelsInput);
+ FormatOutput = BYTES_SH(2)|CHANNELS_SH(ChannelsOutput);
+
+ ColorSpace = ColorSpaceIn;
+
+
+ if (ColorSpace == CurrentColorSpace) {
+
+ if (lIsDeviceLink) {
+
+ Transforms[i] = cmsCreateTransform(hProfile, FormatInput,
+ NULL, FormatOutput,
+ Intent, dwPrecalcFlags);
+ }
+
+ else {
+
+ if (lIsInput) {
+
+ Transforms[i] = cmsCreateTransform(hProfile, FormatInput,
+ (ColorSpaceOut == icSigLabData ? hLab : hXYZ), FormatOutput,
+ Intent, dwPrecalcFlags);
+ }
+ else {
+ Transforms[i] = cmsCreateTransform((ColorSpaceIn == icSigLabData ? hLab : hXYZ), FormatInput,
+ hProfile, FormatOutput,
+ Intent, dwPrecalcFlags);
+
+ }
+ }
+
+
+ }
+ else // Can come from pcs?
+ if (CurrentColorSpace == icSigXYZData) {
+
+ Transforms[i] = cmsCreateTransform(hXYZ, FormatInput,
+ hProfile, FormatOutput,
+ Intent, dwPrecalcFlags);
+
+ }
+ else
+ if (CurrentColorSpace == icSigLabData) {
+
+ Transforms[i] = cmsCreateTransform(hLab, FormatInput,
+ hProfile, FormatOutput,
+ Intent, dwPrecalcFlags);
+
+ }
+ else {
+ cmsSignalError(LCMS_ERRC_ABORTED, "cmsCreateMultiprofileTransform: ColorSpace mismatch");
+ goto ErrorCleanup;
+ }
+
+ CurrentColorSpace = ColorSpaceOut;
+
+ }
+
+ p ->ExitColorSpace = CurrentColorSpace;
+ Transforms[i] = NULL; // End marker
+
+ p ->InputProfile = hProfiles[0];
+ p ->OutputProfile = hProfiles[nProfiles - 1];
+
+ nGridPoints = _cmsReasonableGridpointsByColorspace(p ->EntryColorSpace, dwFlags);
+
+ ChannelsInput = _cmsChannelsOf(cmsGetColorSpace(p ->InputProfile));
+
+ Grid = cmsAlloc3DGrid(Grid, nGridPoints, ChannelsInput, ChannelsOutput);
+
+ if (!(dwFlags & cmsFLAGS_NOPRELINEARIZATION))
+ _cmsComputePrelinearizationTablesFromXFORM(Transforms, nProfiles, Grid);
+
+ // Compute device link on 16-bit basis
+ if (!cmsSample3DGrid(Grid, MultiprofileSampler, (LPVOID) Transforms, Grid -> wFlags)) {
+
+ cmsFreeLUT(Grid);
+ goto ErrorCleanup;
+ }
+
+ // All ok, store the newly created LUT
+ p -> DeviceLink = Grid;
+
+ SetPrecalculatedTransform(p, dwFlags);
+
+ for (i=nProfiles-1; i >= 0; --i)
+ cmsDeleteTransform(Transforms[i]);
+
+
+ if (hLab) cmsCloseProfile(hLab);
+ if (hXYZ) cmsCloseProfile(hXYZ);
+
+ if ((Intent != INTENT_ABSOLUTE_COLORIMETRIC) &&
+ !(dwFlags & cmsFLAGS_NOWHITEONWHITEFIXUP))
+ _cmsFixWhiteMisalignment(p);
+
+ return (cmsHTRANSFORM) p;
+
+
+ErrorCleanup:
+
+ if (hLab) cmsCloseProfile(hLab);
+ if (hXYZ) cmsCloseProfile(hXYZ);
+ return NULL;
+}
+
+
+
+double LCMSEXPORT cmsSetAdaptationState(double d)
+{
+ double OldVal = GlobalAdaptationState;
+
+ if (d >= 0)
+ GlobalAdaptationState = d;
+
+ return OldVal;
+
+}
diff --git a/icc2ps/icc2ps.c b/icc2ps/icc2ps.c
new file mode 100644
index 0000000..7adac95
--- /dev/null
+++ b/icc2ps/icc2ps.c
@@ -0,0 +1,226 @@
+//
+// Little cms
+// Copyright (C) 1998-2003 Marti Maria
+//
+// Permission is hereby granted, free of charge, to any person obtaining
+// a copy of this software and associated documentation files (the "Software"),
+// to deal in the Software without restriction, including without limitation
+// the rights to use, copy, modify, merge, publish, distribute, sublicense,
+// and/or sell copies of the Software, and to permit persons to whom the Software
+// is furnished to do so, subject to the following conditions:
+//
+// The above copyright notice and this permission notice shall be included in
+// all copies or substantial portions of the Software.
+//
+// THIS SOFTWARE IS PROVIDED "AS-IS" AND WITHOUT WARRANTY OF ANY KIND,
+// EXPRESS, IMPLIED OR OTHERWISE, INCLUDING WITHOUT LIMITATION, ANY
+// WARRANTY OF MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE.
+//
+// IN NO EVENT SHALL MARTI MARIA BE LIABLE FOR ANY SPECIAL, INCIDENTAL,
+// INDIRECT OR CONSEQUENTIAL DAMAGES OF ANY KIND,
+// OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS,
+// WHETHER OR NOT ADVISED OF THE POSSIBILITY OF DAMAGE, AND ON ANY THEORY OF
+// LIABILITY, ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE
+// OF THIS SOFTWARE.
+//
+// Version 1.12
+
+#include "lcms.h"
+#include <stdarg.h>
+
+// xgetopt() interface -----------------------------------------------------
+
+extern int xoptind;
+extern char *xoptarg;
+extern int xopterr;
+extern char SW;
+int cdecl xgetopt(int argc, char *argv[], char *optionS);
+
+// ------------------------------------------------------------------------
+
+static char *cInProf = NULL;
+static char *cOutProf = NULL;
+static int Intent = INTENT_PERCEPTUAL;
+static FILE* OutFile;
+static int BlackPointCompensation = FALSE;
+static int Undecorated = FALSE;
+
+static
+void FatalError(const char *frm, ...)
+{
+ va_list args;
+
+ va_start(args, frm);
+ vfprintf(stderr, frm, args);
+ va_end(args);
+
+ exit(1);
+}
+
+
+
+// The toggles stuff
+
+static
+void HandleSwitches(int argc, char *argv[])
+{
+ int s;
+
+ while ((s = xgetopt(argc,argv,"uUbBI:i:O:o:T:t:")) != EOF) {
+
+ switch (s){
+
+
+ case 'i':
+ case 'I':
+ cInProf = xoptarg;
+ break;
+
+ case 'o':
+ case 'O':
+ cOutProf = xoptarg;
+ break;
+
+ case 'b':
+ case 'B': BlackPointCompensation =TRUE;
+ break;
+
+
+ case 't':
+ case 'T':
+ Intent = atoi(xoptarg);
+ if (Intent > 3) Intent = 3;
+ if (Intent < 0) Intent = 0;
+ break;
+
+ case 'U':
+ case 'u':
+ Undecorated = TRUE;
+ break;
+
+ default:
+
+ FatalError("Unknown option - run without args to see valid ones.\n");
+ }
+ }
+}
+
+static
+void Help(void)
+{
+
+
+ fprintf(stderr, "usage: icc2ps [flags]\n\n");
+
+ fprintf(stderr, "flags:\n\n");
+
+ fprintf(stderr, "%ci<profile> - Input profile: Generates Color Space Array (CSA)\n", SW);
+ fprintf(stderr, "%co<profile> - Output profile: Generates Color Rendering Dictionary(CRD)\n", SW);
+
+ fprintf(stderr, "%ct<0,1,2,3> - Intent (0=Perceptual, 1=Colorimetric, 2=Saturation, 3=Absolute)\n", SW);
+
+ fprintf(stderr, "%cb - Black point compensation (CRD only)\n", SW);
+ fprintf(stderr, "%cu - Do NOT generate resource name on CRD\n", SW);
+
+ fprintf(stderr, "\n");
+ fprintf(stderr, "This program is intended to be a demo of the little cms\n"
+ "engine. Both lcms and this program are freeware. You can\n"
+ "obtain both in source code at http://www.littlecms.com\n"
+ "For suggestions, comments, bug reports etc. send mail to\n"
+ "marti@littlecms.com\n\n");
+ exit(0);
+}
+
+
+static
+void GenerateCSA(void)
+{
+ cmsHPROFILE hProfile = cmsOpenProfileFromFile(cInProf, "r");
+ size_t n;
+ char* Buffer;
+
+ n = cmsGetPostScriptCSA(hProfile, Intent, NULL, 0);
+ if (n == 0) return;
+
+ Buffer = (char*) malloc(n + 1);
+ cmsGetPostScriptCSA(hProfile, Intent, Buffer, n);
+ Buffer[n] = 0;
+
+ fprintf(OutFile, "%s", Buffer);
+
+ free(Buffer);
+ cmsCloseProfile(hProfile);
+}
+
+
+static
+void GenerateCRD(void)
+{
+ cmsHPROFILE hProfile = cmsOpenProfileFromFile(cOutProf, "r");
+ size_t n;
+ char* Buffer;
+ DWORD dwFlags = 0;
+
+ if (BlackPointCompensation) dwFlags |= cmsFLAGS_BLACKPOINTCOMPENSATION;
+ if (Undecorated) dwFlags |= cmsFLAGS_NODEFAULTRESOURCEDEF;
+
+ n = cmsGetPostScriptCRDEx(hProfile, Intent, dwFlags, NULL, 0);
+ if (n == 0) return;
+
+ Buffer = (char*) malloc(n + 1);
+ cmsGetPostScriptCRDEx(hProfile, Intent, dwFlags, Buffer, n);
+ Buffer[n] = 0;
+
+ fprintf(OutFile, "%s", Buffer);
+ free(Buffer);
+ cmsCloseProfile(hProfile);
+}
+
+
+static
+int MyErrorHandler(int ErrorCode, const char *ErrorText)
+{
+ FatalError("icc2ps: %s", ErrorText);
+ return 0;
+}
+
+
+
+int main(int argc, char *argv[])
+{
+ int nargs;
+
+ fprintf(stderr, "little cms PostScript converter - v1.4\n\n");
+
+ HandleSwitches(argc, argv);
+
+ cmsSetErrorHandler(MyErrorHandler);
+
+ nargs = (argc - xoptind);
+ if (nargs != 0 && nargs != 1)
+ Help();
+
+ if (nargs == 0)
+ OutFile = stdout;
+ else
+ OutFile = fopen(argv[xoptind], "wt");
+
+
+ if (cInProf == NULL && cOutProf == NULL)
+ Help();
+
+
+ if (cInProf != NULL)
+ GenerateCSA();
+
+ if (cOutProf != NULL)
+ GenerateCRD();
+
+ if (nargs == 1) {
+ fclose(OutFile);
+ }
+
+ return 0;
+}
+
+
diff --git a/icc2ps/icc34.h b/icc2ps/icc34.h
new file mode 100644
index 0000000..32718f3
--- /dev/null
+++ b/icc2ps/icc34.h
@@ -0,0 +1,1037 @@
+/* Header file guard bands */
+#ifndef ICC_H
+#define ICC_H
+
+/*****************************************************************
+ Copyright (c) 1994-1996 SunSoft, Inc.
+
+ Rights Reserved
+
+Permission is hereby granted, free of charge, to any person
+obtaining a copy of this software and associated documentation
+files (the "Software"), to deal in the Software without restrict-
+ion, including without limitation the rights to use, copy, modify,
+merge, publish distribute, sublicense, and/or sell copies of the
+Software, and to permit persons to whom the Software is furnished
+to do so, subject to the following conditions:
+
+The above copyright notice and this permission notice shall be
+included in all copies or substantial portions of the Software.
+
+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
+EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES
+OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON-
+INFRINGEMENT. IN NO EVENT SHALL SUNSOFT, INC. OR ITS PARENT
+COMPANY BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY,
+WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
+FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR
+OTHER DEALINGS IN THE SOFTWARE.
+
+Except as contained in this notice, the name of SunSoft, Inc.
+shall not be used in advertising or otherwise to promote the
+sale, use or other dealings in this Software without written
+authorization from SunSoft Inc.
+******************************************************************/
+
+/*
+ * This version of the header file corresponds to the profile
+ * specification version 3.4.
+ *
+ * All header file entries are pre-fixed with "ic" to help
+ * avoid name space collisions. Signatures are pre-fixed with
+ * icSig.
+ *
+ * The structures defined in this header file were created to
+ * represent a description of an ICC profile on disk. Rather
+ * than use pointers a technique is used where a single byte array
+ * was placed at the end of each structure. This allows us in "C"
+ * to extend the structure by allocating more data than is needed
+ * to account for variable length structures.
+ *
+ * This also ensures that data following is allocated
+ * contiguously and makes it easier to write and read data from
+ * the file.
+ *
+ * For example to allocate space for a 256 count length UCR
+ * and BG array, and fill the allocated data. Note strlen + 1
+ * to remember NULL terminator.
+ *
+ icUcrBgCurve *ucrCurve, *bgCurve;
+ int ucr_nbytes, bg_nbytes, string_bytes;
+ icUcrBg *ucrBgWrite;
+ char ucr_string[100], *ucr_char;
+
+ strcpy(ucr_string, "Example ucrBG curves");
+ ucr_nbytes = sizeof(icUInt32Number) +
+ (UCR_CURVE_SIZE * sizeof(icUInt16Number));
+ bg_nbytes = sizeof(icUInt32Number) +
+ (BG_CURVE_SIZE * sizeof(icUInt16Number));
+ string_bytes = strlen(ucr_string) + 1;
+
+ ucrBgWrite = (icUcrBg *)malloc(
+ (ucr_nbytes + bg_nbytes + string_bytes));
+
+ ucrCurve = (icUcrBgCurve *)ucrBgWrite->data;
+ ucrCurve->count = UCR_CURVE_SIZE;
+ for (i=0; i<ucrCurve->count; i++)
+ ucrCurve->curve[i] = (icUInt16Number)i;
+
+ bgCurve = (icUcrBgCurve *)((char *)ucrCurve + ucr_nbytes);
+ bgCurve->count = BG_CURVE_SIZE;
+ for (i=0; i<bgCurve->count; i++)
+ bgCurve->curve[i] = 255 - (icUInt16Number)i;
+
+ ucr_char = (char *)((char *)bgCurve + bg_nbytes);
+ memcpy(ucr_char, ucr_string, string_bytes);
+ *
+ */
+
+/*
+ * Many of the structures contain variable length arrays. This
+ * is represented by the use of the convention.
+ *
+ * type data[icAny];
+ */
+
+/*------------------------------------------------------------------------*/
+/*
+ * Defines used in the specification
+ */
+#define icMagicNumber 0x61637370L /* 'acsp' */
+#define icVersionNumber 0x02100000L /* 2.1.0, BCD */
+
+/* Screening Encodings */
+#define icPrtrDefaultScreensFalse 0x00000000L /* Bit pos 0 */
+#define icPrtrDefaultScreensTrue 0x00000001L /* Bit pos 0 */
+#define icLinesPerInch 0x00000002L /* Bit pos 1 */
+#define icLinesPerCm 0x00000000L /* Bit pos 1 */
+
+/*
+ * Device attributes, currently defined values correspond
+ * to the low 4 bytes of the 8 byte attribute quantity, see
+ * the header for their location.
+ */
+#define icReflective 0x00000000L /* Bit pos 0 */
+#define icTransparency 0x00000001L /* Bit pos 0 */
+#define icGlossy 0x00000000L /* Bit pos 1 */
+#define icMatte 0x00000002L /* Bit pos 1 */
+
+/*
+ * Profile header flags, the low 16 bits are reserved for consortium
+ * use.
+ */
+#define icEmbeddedProfileFalse 0x00000000L /* Bit pos 0 */
+#define icEmbeddedProfileTrue 0x00000001L /* Bit pos 0 */
+#define icUseAnywhere 0x00000000L /* Bit pos 1 */
+#define icUseWithEmbeddedDataOnly 0x00000002L /* Bit pos 1 */
+
+/* Ascii or Binary data */
+#define icAsciiData 0x00000000L
+#define icBinaryData 0x00000001L
+
+/*
+ * Define used to indicate that this is a variable length array
+ */
+#define icAny 1
+
+
+/*------------------------------------------------------------------------*/
+/*
+ * Use this area to translate platform definitions of long
+ * etc into icXXX form. The rest of the header uses the icXXX
+ * typedefs. Signatures are 4 byte quantities.
+ *
+ */
+
+
+#ifdef PACKAGE_NAME
+/*
+ June 9, 2003, Adapted for use with configure by Bob Friesenhahn
+ Added the stupid check for autoconf by Marti Maria
+*/
+typedef @INT32_T@ icSignature;
+
+typedef @UINT8_T@ icUInt8Number;
+typedef @UINT16_T@ icUInt16Number;
+typedef @UINT32_T@ icUInt32Number;
+typedef @UINT32_T@ icUInt64Number[2];
+
+typedef @INT8_T@ icInt8Number;
+typedef @INT16_T@ icInt16Number;
+typedef @INT32_T@ icInt32Number;
+typedef @INT32_T@ icInt64Number[2];
+
+typedef icInt32Number icS15Fixed16Number;
+typedef icUInt32Number icU16Fixed16Number;
+#else
+
+/*
+ *Apr-17-2002: Modified by Marti Maria in order to provide wider portability.
+ */
+
+#if defined (__digital__) && defined (__unix__)
+
+/* Tru64 */
+
+#include <inttypes.h>
+
+typedef int32_t icSignature;
+
+typedef uint8_t icUInt8Number;
+typedef uint16_t icUInt16Number;
+typedef uint32_t icUInt32Number;
+typedef uint32_t icUInt64Number[2];
+
+typedef int8_t icInt8Number;
+typedef int16_t icInt16Number;
+typedef int32_t icInt32Number;
+typedef int32_t icInt64Number[2];
+
+typedef icInt32Number icS15Fixed16Number;
+typedef icUInt32Number icU16Fixed16Number;
+
+#else
+#ifdef __sgi
+#include "sgidefs.h"
+
+typedef __int32_t icSignature;
+
+/*
+ * Number definitions
+ */
+
+/* Unsigned integer numbers */
+typedef unsigned char icUInt8Number;
+typedef unsigned short icUInt16Number;
+typedef __uint32_t icUInt32Number;
+typedef __uint32_t icUInt64Number[2];
+
+/* Signed numbers */
+typedef char icInt8Number;
+typedef short icInt16Number;
+typedef __int32_t icInt32Number;
+typedef __int32_t icInt64Number[2];
+
+/* Fixed numbers */
+typedef __int32_t icS15Fixed16Number;
+typedef __uint32_t icU16Fixed16Number;
+
+#else
+#if defined(__GNUC__) || defined(__unix__) || defined(__unix)
+
+#include <sys/types.h>
+
+typedef int32_t icSignature;
+
+#if defined(__sun) || defined(__hpux)
+
+typedef uint8_t icUInt8Number;
+typedef uint16_t icUInt16Number;
+typedef uint32_t icUInt32Number;
+typedef uint32_t icUInt64Number[2];
+
+#else
+
+/* Unsigned integer numbers */
+typedef u_int8_t icUInt8Number;
+typedef u_int16_t icUInt16Number;
+typedef u_int32_t icUInt32Number;
+typedef u_int32_t icUInt64Number[2];
+
+#endif
+
+
+/* Signed numbers */
+typedef int8_t icInt8Number;
+typedef int16_t icInt16Number;
+typedef int32_t icInt32Number;
+typedef int32_t icInt64Number[2];
+
+/* Fixed numbers */
+typedef icInt32Number icS15Fixed16Number;
+typedef icUInt32Number icU16Fixed16Number;
+
+#else /* default definitions */
+
+typedef long icSignature;
+
+/*
+ * Number definitions
+ */
+
+/* Unsigned integer numbers */
+typedef unsigned char icUInt8Number;
+typedef unsigned short icUInt16Number;
+typedef unsigned long icUInt32Number;
+typedef unsigned long icUInt64Number[2];
+
+/* Signed numbers */
+typedef char icInt8Number;
+typedef short icInt16Number;
+typedef long icInt32Number;
+typedef long icInt64Number[2];
+
+/* Fixed numbers */
+typedef long icS15Fixed16Number;
+typedef unsigned long icU16Fixed16Number;
+#endif /* default defs */
+#endif
+#endif
+#endif
+
+/*------------------------------------------------------------------------*/
+/* public tags and sizes */
+typedef enum {
+ icSigAToB0Tag = 0x41324230L, /* 'A2B0' */
+ icSigAToB1Tag = 0x41324231L, /* 'A2B1' */
+ icSigAToB2Tag = 0x41324232L, /* 'A2B2' */
+ icSigBlueColorantTag = 0x6258595AL, /* 'bXYZ' */
+ icSigBlueTRCTag = 0x62545243L, /* 'bTRC' */
+ icSigBToA0Tag = 0x42324130L, /* 'B2A0' */
+ icSigBToA1Tag = 0x42324131L, /* 'B2A1' */
+ icSigBToA2Tag = 0x42324132L, /* 'B2A2' */
+ icSigCalibrationDateTimeTag = 0x63616C74L, /* 'calt' */
+ icSigCharTargetTag = 0x74617267L, /* 'targ' */
+ icSigCopyrightTag = 0x63707274L, /* 'cprt' */
+ icSigCrdInfoTag = 0x63726469L, /* 'crdi' */
+ icSigDeviceMfgDescTag = 0x646D6E64L, /* 'dmnd' */
+ icSigDeviceModelDescTag = 0x646D6464L, /* 'dmdd' */
+ icSigGamutTag = 0x67616D74L, /* 'gamt ' */
+ icSigGrayTRCTag = 0x6b545243L, /* 'kTRC' */
+ icSigGreenColorantTag = 0x6758595AL, /* 'gXYZ' */
+ icSigGreenTRCTag = 0x67545243L, /* 'gTRC' */
+ icSigLuminanceTag = 0x6C756d69L, /* 'lumi' */
+ icSigMeasurementTag = 0x6D656173L, /* 'meas' */
+ icSigMediaBlackPointTag = 0x626B7074L, /* 'bkpt' */
+ icSigMediaWhitePointTag = 0x77747074L, /* 'wtpt' */
+ icSigNamedColorTag = 0x6E636f6CL, /* 'ncol'
+ * OBSOLETE, use ncl2 */
+ icSigNamedColor2Tag = 0x6E636C32L, /* 'ncl2' */
+ icSigPreview0Tag = 0x70726530L, /* 'pre0' */
+ icSigPreview1Tag = 0x70726531L, /* 'pre1' */
+ icSigPreview2Tag = 0x70726532L, /* 'pre2' */
+ icSigProfileDescriptionTag = 0x64657363L, /* 'desc' */
+ icSigProfileSequenceDescTag = 0x70736571L, /* 'pseq' */
+ icSigPs2CRD0Tag = 0x70736430L, /* 'psd0' */
+ icSigPs2CRD1Tag = 0x70736431L, /* 'psd1' */
+ icSigPs2CRD2Tag = 0x70736432L, /* 'psd2' */
+ icSigPs2CRD3Tag = 0x70736433L, /* 'psd3' */
+ icSigPs2CSATag = 0x70733273L, /* 'ps2s' */
+ icSigPs2RenderingIntentTag = 0x70733269L, /* 'ps2i' */
+ icSigRedColorantTag = 0x7258595AL, /* 'rXYZ' */
+ icSigRedTRCTag = 0x72545243L, /* 'rTRC' */
+ icSigScreeningDescTag = 0x73637264L, /* 'scrd' */
+ icSigScreeningTag = 0x7363726EL, /* 'scrn' */
+ icSigTechnologyTag = 0x74656368L, /* 'tech' */
+ icSigUcrBgTag = 0x62666420L, /* 'bfd ' */
+ icSigViewingCondDescTag = 0x76756564L, /* 'vued' */
+ icSigViewingConditionsTag = 0x76696577L, /* 'view' */
+ icMaxEnumTag = 0xFFFFFFFFL
+} icTagSignature;
+
+/* technology signature descriptions */
+typedef enum {
+ icSigDigitalCamera = 0x6463616DL, /* 'dcam' */
+ icSigFilmScanner = 0x6673636EL, /* 'fscn' */
+ icSigReflectiveScanner = 0x7273636EL, /* 'rscn' */
+ icSigInkJetPrinter = 0x696A6574L, /* 'ijet' */
+ icSigThermalWaxPrinter = 0x74776178L, /* 'twax' */
+ icSigElectrophotographicPrinter = 0x6570686FL, /* 'epho' */
+ icSigElectrostaticPrinter = 0x65737461L, /* 'esta' */
+ icSigDyeSublimationPrinter = 0x64737562L, /* 'dsub' */
+ icSigPhotographicPaperPrinter = 0x7270686FL, /* 'rpho' */
+ icSigFilmWriter = 0x6670726EL, /* 'fprn' */
+ icSigVideoMonitor = 0x7669646DL, /* 'vidm' */
+ icSigVideoCamera = 0x76696463L, /* 'vidc' */
+ icSigProjectionTelevision = 0x706A7476L, /* 'pjtv' */
+ icSigCRTDisplay = 0x43525420L, /* 'CRT ' */
+ icSigPMDisplay = 0x504D4420L, /* 'PMD ' */
+ icSigAMDisplay = 0x414D4420L, /* 'AMD ' */
+ icSigPhotoCD = 0x4B504344L, /* 'KPCD' */
+ icSigPhotoImageSetter = 0x696D6773L, /* 'imgs' */
+ icSigGravure = 0x67726176L, /* 'grav' */
+ icSigOffsetLithography = 0x6F666673L, /* 'offs' */
+ icSigSilkscreen = 0x73696C6BL, /* 'silk' */
+ icSigFlexography = 0x666C6578L, /* 'flex' */
+ icMaxEnumTechnology = 0xFFFFFFFFL
+} icTechnologySignature;
+
+/* type signatures */
+typedef enum {
+ icSigCurveType = 0x63757276L, /* 'curv' */
+ icSigDataType = 0x64617461L, /* 'data' */
+ icSigDateTimeType = 0x6474696DL, /* 'dtim' */
+ icSigLut16Type = 0x6d667432L, /* 'mft2' */
+ icSigLut8Type = 0x6d667431L, /* 'mft1' */
+ icSigMeasurementType = 0x6D656173L, /* 'meas' */
+ icSigNamedColorType = 0x6E636f6CL, /* 'ncol'
+ * OBSOLETE, use ncl2 */
+ icSigProfileSequenceDescType = 0x70736571L, /* 'pseq' */
+ icSigS15Fixed16ArrayType = 0x73663332L, /* 'sf32' */
+ icSigScreeningType = 0x7363726EL, /* 'scrn' */
+ icSigSignatureType = 0x73696720L, /* 'sig ' */
+ icSigTextType = 0x74657874L, /* 'text' */
+ icSigTextDescriptionType = 0x64657363L, /* 'desc' */
+ icSigU16Fixed16ArrayType = 0x75663332L, /* 'uf32' */
+ icSigUcrBgType = 0x62666420L, /* 'bfd ' */
+ icSigUInt16ArrayType = 0x75693136L, /* 'ui16' */
+ icSigUInt32ArrayType = 0x75693332L, /* 'ui32' */
+ icSigUInt64ArrayType = 0x75693634L, /* 'ui64' */
+ icSigUInt8ArrayType = 0x75693038L, /* 'ui08' */
+ icSigViewingConditionsType = 0x76696577L, /* 'view' */
+ icSigXYZType = 0x58595A20L, /* 'XYZ ' */
+ icSigXYZArrayType = 0x58595A20L, /* 'XYZ ' */
+ icSigNamedColor2Type = 0x6E636C32L, /* 'ncl2' */
+ icSigCrdInfoType = 0x63726469L, /* 'crdi' */
+ icMaxEnumType = 0xFFFFFFFFL
+} icTagTypeSignature;
+
+/*
+ * Color Space Signatures
+ * Note that only icSigXYZData and icSigLabData are valid
+ * Profile Connection Spaces (PCSs)
+ */
+typedef enum {
+ icSigXYZData = 0x58595A20L, /* 'XYZ ' */
+ icSigLabData = 0x4C616220L, /* 'Lab ' */
+ icSigLuvData = 0x4C757620L, /* 'Luv ' */
+ icSigYCbCrData = 0x59436272L, /* 'YCbr' */
+ icSigYxyData = 0x59787920L, /* 'Yxy ' */
+ icSigRgbData = 0x52474220L, /* 'RGB ' */
+ icSigGrayData = 0x47524159L, /* 'GRAY' */
+ icSigHsvData = 0x48535620L, /* 'HSV ' */
+ icSigHlsData = 0x484C5320L, /* 'HLS ' */
+ icSigCmykData = 0x434D594BL, /* 'CMYK' */
+ icSigCmyData = 0x434D5920L, /* 'CMY ' */
+ icSig2colorData = 0x32434C52L, /* '2CLR' */
+ icSig3colorData = 0x33434C52L, /* '3CLR' */
+ icSig4colorData = 0x34434C52L, /* '4CLR' */
+ icSig5colorData = 0x35434C52L, /* '5CLR' */
+ icSig6colorData = 0x36434C52L, /* '6CLR' */
+ icSig7colorData = 0x37434C52L, /* '7CLR' */
+ icSig8colorData = 0x38434C52L, /* '8CLR' */
+ icSig9colorData = 0x39434C52L, /* '9CLR' */
+ icSig10colorData = 0x41434C52L, /* 'ACLR' */
+ icSig11colorData = 0x42434C52L, /* 'BCLR' */
+ icSig12colorData = 0x43434C52L, /* 'CCLR' */
+ icSig13colorData = 0x44434C52L, /* 'DCLR' */
+ icSig14colorData = 0x45434C52L, /* 'ECLR' */
+ icSig15colorData = 0x46434C52L, /* 'FCLR' */
+ icMaxEnumData = 0xFFFFFFFFL
+} icColorSpaceSignature;
+
+/* profileClass enumerations */
+typedef enum {
+ icSigInputClass = 0x73636E72L, /* 'scnr' */
+ icSigDisplayClass = 0x6D6E7472L, /* 'mntr' */
+ icSigOutputClass = 0x70727472L, /* 'prtr' */
+ icSigLinkClass = 0x6C696E6BL, /* 'link' */
+ icSigAbstractClass = 0x61627374L, /* 'abst' */
+ icSigColorSpaceClass = 0x73706163L, /* 'spac' */
+ icSigNamedColorClass = 0x6e6d636cL, /* 'nmcl' */
+ icMaxEnumClass = 0xFFFFFFFFL
+} icProfileClassSignature;
+
+/* Platform Signatures */
+typedef enum {
+ icSigMacintosh = 0x4150504CL, /* 'APPL' */
+ icSigMicrosoft = 0x4D534654L, /* 'MSFT' */
+ icSigSolaris = 0x53554E57L, /* 'SUNW' */
+ icSigSGI = 0x53474920L, /* 'SGI ' */
+ icSigTaligent = 0x54474E54L, /* 'TGNT' */
+ icMaxEnumPlatform = 0xFFFFFFFFL
+} icPlatformSignature;
+
+/*------------------------------------------------------------------------*/
+/*
+ * Other enums
+ */
+
+/* Measurement Flare, used in the measurmentType tag */
+typedef enum {
+ icFlare0 = 0x00000000L, /* 0% flare */
+ icFlare100 = 0x00000001L, /* 100% flare */
+ icMaxFlare = 0xFFFFFFFFL
+} icMeasurementFlare;
+
+/* Measurement Geometry, used in the measurmentType tag */
+typedef enum {
+ icGeometryUnknown = 0x00000000L, /* Unknown */
+ icGeometry045or450 = 0x00000001L, /* 0/45, 45/0 */
+ icGeometry0dord0 = 0x00000002L, /* 0/d or d/0 */
+ icMaxGeometry = 0xFFFFFFFFL
+} icMeasurementGeometry;
+
+/* Rendering Intents, used in the profile header */
+typedef enum {
+ icPerceptual = 0,
+ icRelativeColorimetric = 1,
+ icSaturation = 2,
+ icAbsoluteColorimetric = 3,
+ icMaxEnumIntent = 0xFFFFFFFFL
+} icRenderingIntent;
+
+/* Different Spot Shapes currently defined, used for screeningType */
+typedef enum {
+ icSpotShapeUnknown = 0,
+ icSpotShapePrinterDefault = 1,
+ icSpotShapeRound = 2,
+ icSpotShapeDiamond = 3,
+ icSpotShapeEllipse = 4,
+ icSpotShapeLine = 5,
+ icSpotShapeSquare = 6,
+ icSpotShapeCross = 7,
+ icMaxEnumSpot = 0xFFFFFFFFL
+} icSpotShape;
+
+/* Standard Observer, used in the measurmentType tag */
+typedef enum {
+ icStdObsUnknown = 0x00000000L, /* Unknown */
+ icStdObs1931TwoDegrees = 0x00000001L, /* 2 deg */
+ icStdObs1964TenDegrees = 0x00000002L, /* 10 deg */
+ icMaxStdObs = 0xFFFFFFFFL
+} icStandardObserver;
+
+/* Pre-defined illuminants, used in measurement and viewing conditions type */
+typedef enum {
+ icIlluminantUnknown = 0x00000000L,
+ icIlluminantD50 = 0x00000001L,
+ icIlluminantD65 = 0x00000002L,
+ icIlluminantD93 = 0x00000003L,
+ icIlluminantF2 = 0x00000004L,
+ icIlluminantD55 = 0x00000005L,
+ icIlluminantA = 0x00000006L,
+ icIlluminantEquiPowerE = 0x00000007L,
+ icIlluminantF8 = 0x00000008L,
+ icMaxEnumIluminant = 0xFFFFFFFFL
+} icIlluminant;
+
+
+/*------------------------------------------------------------------------*/
+/*
+ * Arrays of numbers
+ */
+
+/* Int8 Array */
+typedef struct {
+ icInt8Number data[icAny]; /* Variable array of values */
+} icInt8Array;
+
+/* UInt8 Array */
+typedef struct {
+ icUInt8Number data[icAny]; /* Variable array of values */
+} icUInt8Array;
+
+/* uInt16 Array */
+typedef struct {
+ icUInt16Number data[icAny]; /* Variable array of values */
+} icUInt16Array;
+
+/* Int16 Array */
+typedef struct {
+ icInt16Number data[icAny]; /* Variable array of values */
+} icInt16Array;
+
+/* uInt32 Array */
+typedef struct {
+ icUInt32Number data[icAny]; /* Variable array of values */
+} icUInt32Array;
+
+/* Int32 Array */
+typedef struct {
+ icInt32Number data[icAny]; /* Variable array of values */
+} icInt32Array;
+
+/* UInt64 Array */
+typedef struct {
+ icUInt64Number data[icAny]; /* Variable array of values */
+} icUInt64Array;
+
+/* Int64 Array */
+typedef struct {
+ icInt64Number data[icAny]; /* Variable array of values */
+} icInt64Array;
+
+/* u16Fixed16 Array */
+typedef struct {
+ icU16Fixed16Number data[icAny]; /* Variable array of values */
+} icU16Fixed16Array;
+
+/* s15Fixed16 Array */
+typedef struct {
+ icS15Fixed16Number data[icAny]; /* Variable array of values */
+} icS15Fixed16Array;
+
+/* The base date time number */
+typedef struct {
+ icUInt16Number year;
+ icUInt16Number month;
+ icUInt16Number day;
+ icUInt16Number hours;
+ icUInt16Number minutes;
+ icUInt16Number seconds;
+} icDateTimeNumber;
+
+/* XYZ Number */
+typedef struct {
+ icS15Fixed16Number X;
+ icS15Fixed16Number Y;
+ icS15Fixed16Number Z;
+} icXYZNumber;
+
+/* XYZ Array */
+typedef struct {
+ icXYZNumber data[icAny]; /* Variable array of XYZ numbers */
+} icXYZArray;
+
+/* Curve */
+typedef struct {
+ icUInt32Number count; /* Number of entries */
+ icUInt16Number data[icAny]; /* The actual table data, real
+ * number is determined by count
+ * Interpretation depends on how
+ * data is used with a given tag
+ */
+} icCurve;
+
+/* Data */
+typedef struct {
+ icUInt32Number dataFlag; /* 0 = ascii, 1 = binary */
+ icInt8Number data[icAny]; /* Data, size from tag */
+} icData;
+
+/* lut16 */
+typedef struct {
+ icUInt8Number inputChan; /* Number of input channels */
+ icUInt8Number outputChan; /* Number of output channels */
+ icUInt8Number clutPoints; /* Number of grid points */
+ icInt8Number pad; /* Padding for byte alignment */
+ icS15Fixed16Number e00; /* e00 in the 3 * 3 */
+ icS15Fixed16Number e01; /* e01 in the 3 * 3 */
+ icS15Fixed16Number e02; /* e02 in the 3 * 3 */
+ icS15Fixed16Number e10; /* e10 in the 3 * 3 */
+ icS15Fixed16Number e11; /* e11 in the 3 * 3 */
+ icS15Fixed16Number e12; /* e12 in the 3 * 3 */
+ icS15Fixed16Number e20; /* e20 in the 3 * 3 */
+ icS15Fixed16Number e21; /* e21 in the 3 * 3 */
+ icS15Fixed16Number e22; /* e22 in the 3 * 3 */
+ icUInt16Number inputEnt; /* Num of in-table entries */
+ icUInt16Number outputEnt; /* Num of out-table entries */
+ icUInt16Number data[icAny]; /* Data follows see spec */
+/*
+ * Data that follows is of this form
+ *
+ * icUInt16Number inputTable[inputChan][icAny]; * The in-table
+ * icUInt16Number clutTable[icAny]; * The clut
+ * icUInt16Number outputTable[outputChan][icAny]; * The out-table
+ */
+} icLut16;
+
+/* lut8, input & output tables are always 256 bytes in length */
+typedef struct {
+ icUInt8Number inputChan; /* Num of input channels */
+ icUInt8Number outputChan; /* Num of output channels */
+ icUInt8Number clutPoints; /* Num of grid points */
+ icInt8Number pad;
+ icS15Fixed16Number e00; /* e00 in the 3 * 3 */
+ icS15Fixed16Number e01; /* e01 in the 3 * 3 */
+ icS15Fixed16Number e02; /* e02 in the 3 * 3 */
+ icS15Fixed16Number e10; /* e10 in the 3 * 3 */
+ icS15Fixed16Number e11; /* e11 in the 3 * 3 */
+ icS15Fixed16Number e12; /* e12 in the 3 * 3 */
+ icS15Fixed16Number e20; /* e20 in the 3 * 3 */
+ icS15Fixed16Number e21; /* e21 in the 3 * 3 */
+ icS15Fixed16Number e22; /* e22 in the 3 * 3 */
+ icUInt8Number data[icAny]; /* Data follows see spec */
+/*
+ * Data that follows is of this form
+ *
+ * icUInt8Number inputTable[inputChan][256]; * The in-table
+ * icUInt8Number clutTable[icAny]; * The clut
+ * icUInt8Number outputTable[outputChan][256]; * The out-table
+ */
+} icLut8;
+
+/* Measurement Data */
+typedef struct {
+ icStandardObserver stdObserver; /* Standard observer */
+ icXYZNumber backing; /* XYZ for backing */
+ icMeasurementGeometry geometry; /* Meas. geometry */
+ icMeasurementFlare flare; /* Measurement flare */
+ icIlluminant illuminant; /* Illuminant */
+} icMeasurement;
+
+/* Named color */
+
+/*
+ * icNamedColor2 takes the place of icNamedColor
+ */
+typedef struct {
+ icUInt32Number vendorFlag; /* Bottom 16 bits for IC use */
+ icUInt32Number count; /* Count of named colors */
+ icUInt32Number nDeviceCoords; /* Num of device coordinates */
+ icInt8Number prefix[32]; /* Prefix for each color name */
+ icInt8Number suffix[32]; /* Suffix for each color name */
+ icInt8Number data[icAny]; /* Named color data follows */
+/*
+ * Data that follows is of this form
+ *
+ * icInt8Number root1[32]; * Root name for 1st color
+ * icUInt16Number pcsCoords1[icAny]; * PCS coords of 1st color
+ * icUInt16Number deviceCoords1[icAny]; * Dev coords of 1st color
+ * icInt8Number root2[32]; * Root name for 2nd color
+ * icUInt16Number pcsCoords2[icAny]; * PCS coords of 2nd color
+ * icUInt16Number deviceCoords2[icAny]; * Dev coords of 2nd color
+ * :
+ * :
+ * Repeat for name and PCS and device color coordinates up to (count-1)
+ *
+ * NOTES:
+ * PCS and device space can be determined from the header.
+ *
+ * PCS coordinates are icUInt16 numbers and are described in Annex A of
+ * the ICC spec. Only 16 bit L*a*b* and XYZ are allowed. The number of
+ * coordinates is consistent with the headers PCS.
+ *
+ * Device coordinates are icUInt16 numbers where 0x0000 represents
+ * the minimum value and 0xFFFF represents the maximum value.
+ * If the nDeviceCoords value is 0 this field is not given.
+ */
+} icNamedColor2;
+
+/* Profile sequence structure */
+typedef struct {
+ icSignature deviceMfg; /* Dev Manufacturer */
+ icSignature deviceModel; /* Dev Model */
+ icUInt64Number attributes; /* Dev attributes */
+ icTechnologySignature technology; /* Technology sig */
+ icInt8Number data[icAny]; /* Desc text follows */
+/*
+ * Data that follows is of this form, this is an icInt8Number
+ * to avoid problems with a compiler generating bad code as
+ * these arrays are variable in length.
+ *
+ * icTextDescription deviceMfgDesc; * Manufacturer text
+ * icTextDescription modelDesc; * Model text
+ */
+} icDescStruct;
+
+/* Profile sequence description */
+typedef struct {
+ icUInt32Number count; /* Number of descriptions */
+ icUInt8Number data[icAny]; /* Array of desc structs */
+} icProfileSequenceDesc;
+
+/* textDescription */
+typedef struct {
+ icUInt32Number count; /* Description length */
+ icInt8Number data[icAny]; /* Descriptions follow */
+/*
+ * Data that follows is of this form
+ *
+ * icInt8Number desc[count] * NULL terminated ascii string
+ * icUInt32Number ucLangCode; * UniCode language code
+ * icUInt32Number ucCount; * UniCode description length
+ * icInt16Number ucDesc[ucCount];* The UniCode description
+ * icUInt16Number scCode; * ScriptCode code
+ * icUInt8Number scCount; * ScriptCode count
+ * icInt8Number scDesc[67]; * ScriptCode Description
+ */
+} icTextDescription;
+
+/* Screening Data */
+typedef struct {
+ icS15Fixed16Number frequency; /* Frequency */
+ icS15Fixed16Number angle; /* Screen angle */
+ icSpotShape spotShape; /* Spot Shape encodings below */
+} icScreeningData;
+
+typedef struct {
+ icUInt32Number screeningFlag; /* Screening flag */
+ icUInt32Number channels; /* Number of channels */
+ icScreeningData data[icAny]; /* Array of screening data */
+} icScreening;
+
+/* Text Data */
+typedef struct {
+ icInt8Number data[icAny]; /* Variable array of chars */
+} icText;
+
+/* Structure describing either a UCR or BG curve */
+typedef struct {
+ icUInt32Number count; /* Curve length */
+ icUInt16Number curve[icAny]; /* The array of curve values */
+} icUcrBgCurve;
+
+/* Under color removal, black generation */
+typedef struct {
+ icInt8Number data[icAny]; /* The Ucr BG data */
+/*
+ * Data that follows is of this form, this is a icInt8Number
+ * to avoid problems with a compiler generating bad code as
+ * these arrays are variable in length.
+ *
+ * icUcrBgCurve ucr; * Ucr curve
+ * icUcrBgCurve bg; * Bg curve
+ * icInt8Number string; * UcrBg description
+ */
+} icUcrBg;
+
+/* viewingConditionsType */
+typedef struct {
+ icXYZNumber illuminant; /* In candelas per sq. meter */
+ icXYZNumber surround; /* In candelas per sq. meter */
+ icIlluminant stdIluminant; /* See icIlluminant defines */
+} icViewingCondition;
+
+/* CrdInfo type */
+typedef struct {
+ icUInt32Number count; /* Char count includes NULL */
+ icInt8Number desc[icAny]; /* Null terminated string */
+} icCrdInfo;
+
+/*------------------------------------------------------------------------*/
+/*
+ * Tag Type definitions
+ */
+
+/*
+ * Many of the structures contain variable length arrays. This
+ * is represented by the use of the convention.
+ *
+ * type data[icAny];
+ */
+
+/* The base part of each tag */
+typedef struct {
+ icTagTypeSignature sig; /* Signature */
+ icInt8Number reserved[4]; /* Reserved, set to 0 */
+} icTagBase;
+
+/* curveType */
+typedef struct {
+ icTagBase base; /* Signature, "curv" */
+ icCurve curve; /* The curve data */
+} icCurveType;
+
+/* dataType */
+typedef struct {
+ icTagBase base; /* Signature, "data" */
+ icData data; /* The data structure */
+} icDataType;
+
+/* dateTimeType */
+typedef struct {
+ icTagBase base; /* Signature, "dtim" */
+ icDateTimeNumber date; /* The date */
+} icDateTimeType;
+
+/* lut16Type */
+typedef struct {
+ icTagBase base; /* Signature, "mft2" */
+ icLut16 lut; /* Lut16 data */
+} icLut16Type;
+
+/* lut8Type, input & output tables are always 256 bytes in length */
+typedef struct {
+ icTagBase base; /* Signature, "mft1" */
+ icLut8 lut; /* Lut8 data */
+} icLut8Type;
+
+/* Measurement Type */
+typedef struct {
+ icTagBase base; /* Signature, "meas" */
+ icMeasurement measurement; /* Measurement data */
+} icMeasurementType;
+
+/* Named color type */
+/* icNamedColor2Type, replaces icNamedColorType */
+typedef struct {
+ icTagBase base; /* Signature, "ncl2" */
+ icNamedColor2 ncolor; /* Named color data */
+} icNamedColor2Type;
+
+/* Profile sequence description type */
+typedef struct {
+ icTagBase base; /* Signature, "pseq" */
+ icProfileSequenceDesc desc; /* The seq description */
+} icProfileSequenceDescType;
+
+/* textDescriptionType */
+typedef struct {
+ icTagBase base; /* Signature, "desc" */
+ icTextDescription desc; /* The description */
+} icTextDescriptionType;
+
+/* s15Fixed16Type */
+typedef struct {
+ icTagBase base; /* Signature, "sf32" */
+ icS15Fixed16Array data; /* Array of values */
+} icS15Fixed16ArrayType;
+
+typedef struct {
+ icTagBase base; /* Signature, "scrn" */
+ icScreening screen; /* Screening structure */
+} icScreeningType;
+
+/* sigType */
+typedef struct {
+ icTagBase base; /* Signature, "sig" */
+ icSignature signature; /* The signature data */
+} icSignatureType;
+
+/* textType */
+typedef struct {
+ icTagBase base; /* Signature, "text" */
+ icText data; /* Variable array of chars */
+} icTextType;
+
+/* u16Fixed16Type */
+typedef struct {
+ icTagBase base; /* Signature, "uf32" */
+ icU16Fixed16Array data; /* Variable array of values */
+} icU16Fixed16ArrayType;
+
+/* Under color removal, black generation type */
+typedef struct {
+ icTagBase base; /* Signature, "bfd " */
+ icUcrBg data; /* ucrBg structure */
+} icUcrBgType;
+
+/* uInt16Type */
+typedef struct {
+ icTagBase base; /* Signature, "ui16" */
+ icUInt16Array data; /* Variable array of values */
+} icUInt16ArrayType;
+
+/* uInt32Type */
+typedef struct {
+ icTagBase base; /* Signature, "ui32" */
+ icUInt32Array data; /* Variable array of values */
+} icUInt32ArrayType;
+
+/* uInt64Type */
+typedef struct {
+ icTagBase base; /* Signature, "ui64" */
+ icUInt64Array data; /* Variable array of values */
+} icUInt64ArrayType;
+
+/* uInt8Type */
+typedef struct {
+ icTagBase base; /* Signature, "ui08" */
+ icUInt8Array data; /* Variable array of values */
+} icUInt8ArrayType;
+
+/* viewingConditionsType */
+typedef struct {
+ icTagBase base; /* Signature, "view" */
+ icViewingCondition view; /* Viewing conditions */
+} icViewingConditionType;
+
+/* XYZ Type */
+typedef struct {
+ icTagBase base; /* Signature, "XYZ" */
+ icXYZArray data; /* Variable array of XYZ nums */
+} icXYZType;
+
+/* CRDInfoType where [0] is the CRD product name count and string and
+ * [1] -[5] are the rendering intents 0-4 counts and strings
+ */
+typedef struct {
+ icTagBase base; /* Signature, "crdi" */
+ icCrdInfo info; /* 5 sets of counts & strings */
+}icCrdInfoType;
+ /* icCrdInfo productName; PS product count/string */
+ /* icCrdInfo CRDName0; CRD name for intent 0 */
+ /* icCrdInfo CRDName1; CRD name for intent 1 */
+ /* icCrdInfo CRDName2; CRD name for intent 2 */
+ /* icCrdInfo CRDName3; CRD name for intent 3 */
+
+/*------------------------------------------------------------------------*/
+
+/*
+ * Lists of tags, tags, profile header and profile structure
+ */
+
+/* A tag */
+typedef struct {
+ icTagSignature sig; /* The tag signature */
+ icUInt32Number offset; /* Start of tag relative to
+ * start of header, Spec
+ * Clause 5 */
+ icUInt32Number size; /* Size in bytes */
+} icTag;
+
+/* A Structure that may be used independently for a list of tags */
+typedef struct {
+ icUInt32Number count; /* Num tags in the profile */
+ icTag tags[icAny]; /* Variable array of tags */
+} icTagList;
+
+/* The Profile header */
+typedef struct {
+ icUInt32Number size; /* Prof size in bytes */
+ icSignature cmmId; /* CMM for profile */
+ icUInt32Number version; /* Format version */
+ icProfileClassSignature deviceClass; /* Type of profile */
+ icColorSpaceSignature colorSpace; /* Clr space of data */
+ icColorSpaceSignature pcs; /* PCS, XYZ or Lab */
+ icDateTimeNumber date; /* Creation Date */
+ icSignature magic; /* icMagicNumber */
+ icPlatformSignature platform; /* Primary Platform */
+ icUInt32Number flags; /* Various bits */
+ icSignature manufacturer; /* Dev manufacturer */
+ icUInt32Number model; /* Dev model number */
+ icUInt64Number attributes; /* Device attributes */
+ icUInt32Number renderingIntent;/* Rendering intent */
+ icXYZNumber illuminant; /* Profile illuminant */
+ icSignature creator; /* Profile creator */
+ icInt8Number reserved[44]; /* Reserved */
+} icHeader;
+
+/*
+ * A profile,
+ * we can't use icTagList here because its not at the end of the structure
+ */
+typedef struct {
+ icHeader header; /* The header */
+ icUInt32Number count; /* Num tags in the profile */
+ icInt8Number data[icAny]; /* The tagTable and tagData */
+/*
+ * Data that follows is of the form
+ *
+ * icTag tagTable[icAny]; * The tag table
+ * icInt8Number tagData[icAny]; * The tag data
+ */
+} icProfile;
+
+/*------------------------------------------------------------------------*/
+/* Obsolete entries */
+
+/* icNamedColor was replaced with icNamedColor2 */
+typedef struct {
+ icUInt32Number vendorFlag; /* Bottom 16 bits for IC use */
+ icUInt32Number count; /* Count of named colors */
+ icInt8Number data[icAny]; /* Named color data follows */
+/*
+ * Data that follows is of this form
+ *
+ * icInt8Number prefix[icAny]; * Prefix
+ * icInt8Number suffix[icAny]; * Suffix
+ * icInt8Number root1[icAny]; * Root name
+ * icInt8Number coords1[icAny]; * Color coordinates
+ * icInt8Number root2[icAny]; * Root name
+ * icInt8Number coords2[icAny]; * Color coordinates
+ * :
+ * :
+ * Repeat for root name and color coordinates up to (count-1)
+ */
+} icNamedColor;
+
+/* icNamedColorType was replaced by icNamedColor2Type */
+typedef struct {
+ icTagBase base; /* Signature, "ncol" */
+ icNamedColor ncolor; /* Named color data */
+} icNamedColorType;
+
+#endif /* ICC_H */
diff --git a/icc2ps/lcms.h b/icc2ps/lcms.h
new file mode 100644
index 0000000..3b1dc08
--- /dev/null
+++ b/icc2ps/lcms.h
@@ -0,0 +1,1989 @@
+//
+// Little cms
+// Copyright (C) 1998-2005 Marti Maria
+//
+// Permission is hereby granted, free of charge, to any person obtaining
+// a copy of this software and associated documentation files (the "Software"),
+// to deal in the Software without restriction, including without limitation
+// the rights to use, copy, modify, merge, publish, distribute, sublicense,
+// and/or sell copies of the Software, and to permit persons to whom the Software
+// is furnished to do so, subject to the following conditions:
+//
+// The above copyright notice and this permission notice shall be included in
+// all copies or substantial portions of the Software.
+//
+// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
+// EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO
+// THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
+// NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
+// LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
+// OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
+// WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
+
+// Version 1.15
+
+#ifndef __cms_H
+
+// ********** Configuration toggles ****************************************
+
+// Optimization mode.
+//
+// Note that USE_ASSEMBLER Is fastest by far, but it is limited to Pentium.
+// USE_FLOAT are the generic floating-point routines. USE_C should work on
+// virtually any machine.
+
+//#define USE_FLOAT 1
+// #define USE_C 1
+#define USE_ASSEMBLER 1
+
+// Define this if you are using this package as a DLL (windows only)
+
+// #define LCMS_DLL 1
+// #define LCMS_DLL_BUILD 1
+
+// Uncomment if you are trying the engine in a non-windows environment
+// like linux, SGI, VAX, FreeBSD, BeOS, etc.
+#define NON_WINDOWS 1
+
+// Uncomment this one if you are using big endian machines (only meaningful
+// when NON_WINDOWS is used)
+// #define USE_BIG_ENDIAN 1
+
+// Uncomment this one if your compiler/machine does support the
+// "long long" type This will speedup fixed point math. (USE_C only)
+#define USE_INT64 1
+
+// Some machines does not have a reliable 'swab' function. Usually
+// leave commented unless the testbed diagnoses the contrary.
+// #define USE_CUSTOM_SWAB 1
+
+// Uncomment this if your compiler supports inline
+#define USE_INLINE 1
+
+// Uncomment this if your compiler doesn't work with fast floor function
+// #define USE_DEFAULT_FLOOR_CONVERSION 1
+
+
+// ********** End of configuration toggles ******************************
+
+#define LCMS_VERSION 115
+
+#include <stdio.h>
+#include <stdlib.h>
+#include <math.h>
+#include <assert.h>
+#include <stdarg.h>
+#include <time.h>
+
+// Metroworks CodeWarrior
+
+#ifdef __MWERKS__
+# define unlink remove
+# if WIN32
+# define USE_CUSTOM_SWAB 1
+# else
+# define NON_WINDOWS 1
+# endif
+#endif
+
+// Borland C
+
+#ifdef __BORLANDC__
+# undef NON_WINDOWS
+#endif
+
+// Microsoft VisualC++
+
+#ifdef _MSC_VER
+# undef NON_WINDOWS
+#endif
+
+// Here comes the Non-Windows settings
+
+#ifdef NON_WINDOWS
+
+// Non windows environments. Also avoid indentation on includes.
+
+#undef LCMS_DLL
+
+#ifdef USE_ASSEMBLER
+# undef USE_ASSEMBLER
+# define USE_C 1
+#endif
+
+#ifdef _HOST_BIG_ENDIAN
+# define USE_BIG_ENDIAN 1
+#endif
+
+#if defined(__sgi__) || defined(__sgi) || defined(__powerpc__) || defined(sparc) || defined(__ppc__)
+# define USE_BIG_ENDIAN 1
+#endif
+
+#ifdef TARGET_CPU_PPC
+# define USE_BIG_ENDIAN 1
+#endif
+
+#ifdef macintosh
+# define USE_BIG_ENDIAN 1
+#endif
+
+#ifdef WORDS_BIGENDIAN
+# define USE_BIG_ENDIAN 1
+#endif
+
+#if defined(__OpenBSD__) || defined(__NetBSD__) || defined(__FreeBSD__)
+# include <sys/types.h>
+# define USE_INT64 1
+# define LCMSSLONGLONG int64_t
+# define LCMSULONGLONG u_int64_t
+#endif
+
+#ifdef USE_INT64
+# ifndef LCMSULONGLONG
+# define LCMSULONGLONG unsigned long long
+# define LCMSSLONGLONG long long
+# endif
+#endif
+
+#if !defined(__INTEGRITY)
+# include <memory.h>
+#endif
+
+#include <string.h>
+
+#if defined(__GNUC__) || defined(__FreeBSD__)
+# include <unistd.h>
+#endif
+
+#ifndef LCMS_WIN_TYPES_ALREADY_DEFINED
+
+typedef unsigned char BYTE, *LPBYTE;
+typedef unsigned short WORD, *LPWORD;
+typedef unsigned int DWORD, *LPDWORD;
+typedef int BOOL;
+typedef char *LPSTR;
+typedef void *LPVOID;
+typedef void* LCMSHANDLE;
+
+
+#define ZeroMemory(p,l) memset((p),0,(l))
+#define CopyMemory(d,s,l) memcpy((d),(s),(l))
+#define FAR
+
+#ifndef stricmp
+# define stricmp strcasecmp
+#endif
+
+
+#ifndef FALSE
+# define FALSE 0
+#endif
+#ifndef TRUE
+# define TRUE 1
+#endif
+
+#define LOWORD(l) ((WORD)(l))
+#define HIWORD(l) ((WORD)((DWORD)(l) >> 16))
+
+#define MAX_PATH (256)
+
+#define cdecl
+#endif
+
+// The specification for "inline" is section 6.7.4 of the C99 standard (ISO/IEC 9899:1999).
+
+#define LCMS_INLINE static inline
+
+#else
+
+// Win32 stuff
+
+#ifndef WIN32_LEAN_AND_MEAN
+# define WIN32_LEAN_AND_MEAN
+#endif
+
+#include <windows.h>
+
+typedef HANDLE LCMSHANDLE;
+
+
+#ifdef USE_INT64
+# ifndef LCMSULONGLONG
+# define LCMSULONGLONG unsigned __int64
+# define LCMSSLONGLONG __int64
+# endif
+#endif
+
+// This works for both VC & BorlandC
+#define LCMS_INLINE __inline
+
+#endif
+
+
+#include "icc34.h" // ICC header file
+
+
+// Some tag & type additions
+
+#define lcmsSignature ((icSignature) 0x6c636d73L)
+
+#define icSigLuvKData ((icColorSpaceSignature) 0x4C75764BL) // 'LuvK'
+
+#define icSigHexachromeData ((icColorSpaceSignature) 0x4d434836L) // MCH6
+#define icSigHeptachromeData ((icColorSpaceSignature) 0x4d434837L) // MCH7
+#define icSigOctachromeData ((icColorSpaceSignature) 0x4d434838L) // MCH8
+
+#define icSigMCH5Data ((icColorSpaceSignature) 0x4d434835L) // MCH5
+#define icSigMCH6Data ((icColorSpaceSignature) 0x4d434836L) // MCH6
+#define icSigMCH7Data ((icColorSpaceSignature) 0x4d434837L) // MCH7
+#define icSigMCH8Data ((icColorSpaceSignature) 0x4d434838L) // MCH8
+#define icSigMCH9Data ((icColorSpaceSignature) 0x4d434839L) // MCH9
+#define icSigMCHAData ((icColorSpaceSignature) 0x4d434841L) // MCHA
+#define icSigMCHBData ((icColorSpaceSignature) 0x4d434842L) // MCHB
+#define icSigMCHCData ((icColorSpaceSignature) 0x4d434843L) // MCHC
+#define icSigMCHDData ((icColorSpaceSignature) 0x4d434844L) // MCHD
+#define icSigMCHEData ((icColorSpaceSignature) 0x4d434845L) // MCHE
+#define icSigMCHFData ((icColorSpaceSignature) 0x4d434846L) // MCHF
+
+#define icSigCAM97JABData ((icColorSpaceSignature) 0x4A616231L) // 'Jab1' H. Zeng
+#define icSigCAM02JABData ((icColorSpaceSignature) 0x4A616232L) // 'Jab2' H. Zeng
+#define icSigCAM02JCHData ((icColorSpaceSignature) 0x4A636A32L) // 'Jch2' H. Zeng
+
+#define icSigChromaticityTag ((icTagSignature) 0x6368726dL) // As per Addendum 2 to Spec. ICC.1:1998-09
+#define icSigChromaticAdaptationTag ((icTagSignature) 0x63686164L) // 'chad'
+#define icSigColorantTableTag ((icTagSignature) 0x636c7274L) // 'clrt'
+#define icSigColorantTableOutTag ((icTagSignature) 0x636c6f74L) // 'clot'
+#define icSigHPGamutDescTag ((icTagSignature) 0x676D7441L) // 'gmtA' H. Zeng
+
+
+#define icSigParametricCurveType ((icTagTypeSignature) 0x70617261L) // parametric (ICC 4.0)
+#define icSigMultiLocalizedUnicodeType ((icTagTypeSignature) 0x6D6C7563L)
+#define icSigS15Fixed16ArrayType ((icTagTypeSignature) 0x73663332L)
+#define icSigChromaticityType ((icTagTypeSignature) 0x6368726dL)
+#define icSiglutAtoBType ((icTagTypeSignature) 0x6d414220L) // mAB
+#define icSiglutBtoAType ((icTagTypeSignature) 0x6d424120L) // mBA
+#define icSigColorantTableType ((icTagTypeSignature) 0x636c7274L) // clrt
+#define icSigHPGamutDescType ((icTagTypeSignature) 0x676D7441L) // gmtA H. Zeng
+
+
+typedef struct {
+ icUInt8Number gridPoints[16]; // Number of grid points in each dimension.
+ icUInt8Number prec; // Precision of data elements in bytes.
+ icUInt8Number pad1;
+ icUInt8Number pad2;
+ icUInt8Number pad3;
+ /*icUInt8Number data[icAny]; Data follows see spec for size */
+} icCLutStruct;
+
+// icLutAtoB
+typedef struct {
+ icUInt8Number inputChan; // Number of input channels
+ icUInt8Number outputChan; // Number of output channels
+ icUInt8Number pad1;
+ icUInt8Number pad2;
+ icUInt32Number offsetB; // Offset to first "B" curve
+ icUInt32Number offsetMat; // Offset to matrix
+ icUInt32Number offsetM; // Offset to first "M" curve
+ icUInt32Number offsetC; // Offset to CLUT
+ icUInt32Number offsetA; // Offset to first "A" curve
+ /*icUInt8Number data[icAny]; Data follows see spec for size */
+} icLutAtoB;
+
+// icLutBtoA
+typedef struct {
+ icUInt8Number inputChan; // Number of input channels
+ icUInt8Number outputChan; // Number of output channels
+ icUInt8Number pad1;
+ icUInt8Number pad2;
+ icUInt32Number offsetB; // Offset to first "B" curve
+ icUInt32Number offsetMat; // Offset to matrix
+ icUInt32Number offsetM; // Offset to first "M" curve
+ icUInt32Number offsetC; // Offset to CLUT
+ icUInt32Number offsetA; // Offset to first "A" curve
+ /*icUInt8Number data[icAny]; Data follows see spec for size */
+} icLutBtoA;
+
+
+
+
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+// Calling convention
+
+#ifdef NON_WINDOWS
+# define LCMSEXPORT
+# define LCMSAPI
+#else
+# ifdef LCMS_DLL
+# ifdef __BORLANDC__
+# define LCMSEXPORT __stdcall _export
+# define LCMSAPI
+# else
+ // VC++
+# define LCMSEXPORT _stdcall
+# ifdef LCMS_DLL_BUILD
+# define LCMSAPI __declspec(dllexport)
+# else
+# define LCMSAPI __declspec(dllimport)
+# endif
+# endif
+# else
+# define LCMSEXPORT cdecl
+# define LCMSAPI
+# endif
+#endif
+
+#ifdef USE_ASSEMBLER
+#ifdef __BORLANDC__
+
+# define ASM asm
+# define RET(v) return(v)
+#else
+ // VC++
+# define ASM __asm
+# define RET(v) return
+#endif
+#endif
+
+#ifdef _MSC_VER
+#ifndef stricmp
+# define stricmp _stricmp
+#endif
+#ifndef unlink
+# define unlink _unlink
+#endif
+#ifndef swab
+# define swab _swab
+#endif
+#ifndef itoa
+# define itoa _itoa
+#endif
+#ifndef filelength
+# define filelength _filelength
+#endif
+#ifndef fileno
+# define fileno _fileno
+#endif
+#ifndef strupr
+# define strupr _strupr
+#endif
+#ifndef hypot
+# define hypot _hypot
+#endif
+#endif
+
+
+#ifndef M_PI
+# define M_PI 3.14159265358979323846
+#endif
+
+#ifndef LOGE
+# define LOGE 0.434294481
+#endif
+
+// ********** Little cms API ***************************************************
+
+typedef LCMSHANDLE cmsHPROFILE; // Opaque typedefs to hide internals
+typedef LCMSHANDLE cmsHTRANSFORM;
+
+#define MAXCHANNELS 16 // Maximum number of channels
+
+// Format of pixel is defined by one DWORD, using bit fields as follows
+//
+// TTTTT U Y F P X S EEE CCCC BBB
+//
+// T: Pixeltype
+// F: Flavor 0=MinIsBlack(Chocolate) 1=MinIsWhite(Vanilla)
+// P: Planar? 0=Chunky, 1=Planar
+// X: swap 16 bps endianess?
+// S: Do swap? ie, BGR, KYMC
+// E: Extra samples
+// C: Channels (Samples per pixel)
+// B: Bytes per sample
+// Y: Swap first - changes ABGR to BGRA and KCMY to CMYK
+
+
+#define COLORSPACE_SH(s) ((s) << 16)
+#define SWAPFIRST_SH(s) ((s) << 14)
+#define FLAVOR_SH(s) ((s) << 13)
+#define PLANAR_SH(p) ((p) << 12)
+#define ENDIAN16_SH(e) ((e) << 11)
+#define DOSWAP_SH(e) ((e) << 10)
+#define EXTRA_SH(e) ((e) << 7)
+#define CHANNELS_SH(c) ((c) << 3)
+#define BYTES_SH(b) (b)
+
+// Pixel types
+
+#define PT_ANY 0 // Don't check colorspace
+ // 1 & 2 are reserved
+#define PT_GRAY 3
+#define PT_RGB 4
+#define PT_CMY 5
+#define PT_CMYK 6
+#define PT_YCbCr 7
+#define PT_YUV 8 // Lu'v'
+#define PT_XYZ 9
+#define PT_Lab 10
+#define PT_YUVK 11 // Lu'v'K
+#define PT_HSV 12
+#define PT_HLS 13
+#define PT_Yxy 14
+#define PT_HiFi 15
+#define PT_HiFi7 16
+#define PT_HiFi8 17
+#define PT_HiFi9 18
+#define PT_HiFi10 19
+#define PT_HiFi11 20
+#define PT_HiFi12 21
+#define PT_HiFi13 22
+#define PT_HiFi14 23
+#define PT_HiFi15 24
+
+#define NOCOLORSPACECHECK(x) ((x) & 0xFFFF)
+
+// Some (not all!) representations
+
+#ifndef TYPE_RGB_8 // TYPE_RGB_8 is a very common identifier, so don't include ours
+ // if user has it already defined.
+
+#define TYPE_GRAY_8 (COLORSPACE_SH(PT_GRAY)|CHANNELS_SH(1)|BYTES_SH(1))
+#define TYPE_GRAY_8_REV (COLORSPACE_SH(PT_GRAY)|CHANNELS_SH(1)|BYTES_SH(1)|FLAVOR_SH(1))
+#define TYPE_GRAY_16 (COLORSPACE_SH(PT_GRAY)|CHANNELS_SH(1)|BYTES_SH(2))
+#define TYPE_GRAY_16_REV (COLORSPACE_SH(PT_GRAY)|CHANNELS_SH(1)|BYTES_SH(2)|FLAVOR_SH(1))
+#define TYPE_GRAY_16_SE (COLORSPACE_SH(PT_GRAY)|CHANNELS_SH(1)|BYTES_SH(2)|ENDIAN16_SH(1))
+#define TYPE_GRAYA_8 (COLORSPACE_SH(PT_GRAY)|EXTRA_SH(1)|CHANNELS_SH(1)|BYTES_SH(1))
+#define TYPE_GRAYA_16 (COLORSPACE_SH(PT_GRAY)|EXTRA_SH(1)|CHANNELS_SH(1)|BYTES_SH(2))
+#define TYPE_GRAYA_16_SE (COLORSPACE_SH(PT_GRAY)|EXTRA_SH(1)|CHANNELS_SH(1)|BYTES_SH(2)|ENDIAN16_SH(1))
+#define TYPE_GRAYA_8_PLANAR (COLORSPACE_SH(PT_GRAY)|EXTRA_SH(1)|CHANNELS_SH(1)|BYTES_SH(1)|PLANAR_SH(1))
+#define TYPE_GRAYA_16_PLANAR (COLORSPACE_SH(PT_GRAY)|EXTRA_SH(1)|CHANNELS_SH(1)|BYTES_SH(2)|PLANAR_SH(1))
+
+#define TYPE_RGB_8 (COLORSPACE_SH(PT_RGB)|CHANNELS_SH(3)|BYTES_SH(1))
+#define TYPE_RGB_8_PLANAR (COLORSPACE_SH(PT_RGB)|CHANNELS_SH(3)|BYTES_SH(1)|PLANAR_SH(1))
+#define TYPE_BGR_8 (COLORSPACE_SH(PT_RGB)|CHANNELS_SH(3)|BYTES_SH(1)|DOSWAP_SH(1))
+#define TYPE_BGR_8_PLANAR (COLORSPACE_SH(PT_RGB)|CHANNELS_SH(3)|BYTES_SH(1)|DOSWAP_SH(1)|PLANAR_SH(1))
+#define TYPE_RGB_16 (COLORSPACE_SH(PT_RGB)|CHANNELS_SH(3)|BYTES_SH(2))
+#define TYPE_RGB_16_PLANAR (COLORSPACE_SH(PT_RGB)|CHANNELS_SH(3)|BYTES_SH(2)|PLANAR_SH(1))
+#define TYPE_RGB_16_SE (COLORSPACE_SH(PT_RGB)|CHANNELS_SH(3)|BYTES_SH(2)|ENDIAN16_SH(1))
+#define TYPE_BGR_16 (COLORSPACE_SH(PT_RGB)|CHANNELS_SH(3)|BYTES_SH(2)|DOSWAP_SH(1))
+#define TYPE_BGR_16_PLANAR (COLORSPACE_SH(PT_RGB)|CHANNELS_SH(3)|BYTES_SH(2)|DOSWAP_SH(1)|PLANAR_SH(1))
+#define TYPE_BGR_16_SE (COLORSPACE_SH(PT_RGB)|CHANNELS_SH(3)|BYTES_SH(2)|DOSWAP_SH(1)|ENDIAN16_SH(1))
+
+#define TYPE_RGBA_8 (COLORSPACE_SH(PT_RGB)|EXTRA_SH(1)|CHANNELS_SH(3)|BYTES_SH(1))
+#define TYPE_RGBA_8_PLANAR (COLORSPACE_SH(PT_RGB)|EXTRA_SH(1)|CHANNELS_SH(3)|BYTES_SH(1)|PLANAR_SH(1))
+#define TYPE_RGBA_16 (COLORSPACE_SH(PT_RGB)|EXTRA_SH(1)|CHANNELS_SH(3)|BYTES_SH(2))
+#define TYPE_RGBA_16_PLANAR (COLORSPACE_SH(PT_RGB)|EXTRA_SH(1)|CHANNELS_SH(3)|BYTES_SH(2)|PLANAR_SH(1))
+#define TYPE_RGBA_16_SE (COLORSPACE_SH(PT_RGB)|EXTRA_SH(1)|CHANNELS_SH(3)|BYTES_SH(2)|ENDIAN16_SH(1))
+
+#define TYPE_ARGB_8 (COLORSPACE_SH(PT_RGB)|EXTRA_SH(1)|CHANNELS_SH(3)|BYTES_SH(1)|SWAPFIRST_SH(1))
+#define TYPE_ARGB_16 (COLORSPACE_SH(PT_RGB)|EXTRA_SH(1)|CHANNELS_SH(3)|BYTES_SH(2)|SWAPFIRST_SH(1))
+
+#define TYPE_ABGR_8 (COLORSPACE_SH(PT_RGB)|EXTRA_SH(1)|CHANNELS_SH(3)|BYTES_SH(1)|DOSWAP_SH(1))
+#define TYPE_ABGR_16 (COLORSPACE_SH(PT_RGB)|EXTRA_SH(1)|CHANNELS_SH(3)|BYTES_SH(2)|DOSWAP_SH(1))
+#define TYPE_ABGR_16_PLANAR (COLORSPACE_SH(PT_RGB)|EXTRA_SH(1)|CHANNELS_SH(3)|BYTES_SH(2)|DOSWAP_SH(1)|PLANAR_SH(1))
+#define TYPE_ABGR_16_SE (COLORSPACE_SH(PT_RGB)|EXTRA_SH(1)|CHANNELS_SH(3)|BYTES_SH(2)|DOSWAP_SH(1)|ENDIAN16_SH(1))
+
+#define TYPE_BGRA_8 (COLORSPACE_SH(PT_RGB)|EXTRA_SH(1)|CHANNELS_SH(3)|BYTES_SH(1)|DOSWAP_SH(1)|SWAPFIRST_SH(1))
+#define TYPE_BGRA_16 (COLORSPACE_SH(PT_RGB)|EXTRA_SH(1)|CHANNELS_SH(3)|BYTES_SH(2)|DOSWAP_SH(1)|SWAPFIRST_SH(1))
+#define TYPE_BGRA_16_SE (COLORSPACE_SH(PT_RGB)|EXTRA_SH(1)|CHANNELS_SH(3)|BYTES_SH(2)|ENDIAN16_SH(1)|SWAPFIRST_SH(1))
+
+#define TYPE_CMY_8 (COLORSPACE_SH(PT_CMY)|CHANNELS_SH(3)|BYTES_SH(1))
+#define TYPE_CMY_8_PLANAR (COLORSPACE_SH(PT_CMY)|CHANNELS_SH(3)|BYTES_SH(1)|PLANAR_SH(1))
+#define TYPE_CMY_16 (COLORSPACE_SH(PT_CMY)|CHANNELS_SH(3)|BYTES_SH(2))
+#define TYPE_CMY_16_PLANAR (COLORSPACE_SH(PT_CMY)|CHANNELS_SH(3)|BYTES_SH(2)|PLANAR_SH(1))
+#define TYPE_CMY_16_SE (COLORSPACE_SH(PT_CMY)|CHANNELS_SH(3)|BYTES_SH(2)|ENDIAN16_SH(1))
+
+#define TYPE_CMYK_8 (COLORSPACE_SH(PT_CMYK)|CHANNELS_SH(4)|BYTES_SH(1))
+#define TYPE_CMYKA_8 (COLORSPACE_SH(PT_CMYK)|EXTRA_SH(1)|CHANNELS_SH(4)|BYTES_SH(1))
+#define TYPE_CMYK_8_REV (COLORSPACE_SH(PT_CMYK)|CHANNELS_SH(4)|BYTES_SH(1)|FLAVOR_SH(1))
+#define TYPE_YUVK_8 TYPE_CMYK_8_REV
+#define TYPE_CMYK_8_PLANAR (COLORSPACE_SH(PT_CMYK)|CHANNELS_SH(4)|BYTES_SH(1)|PLANAR_SH(1))
+#define TYPE_CMYK_16 (COLORSPACE_SH(PT_CMYK)|CHANNELS_SH(4)|BYTES_SH(2))
+#define TYPE_CMYK_16_REV (COLORSPACE_SH(PT_CMYK)|CHANNELS_SH(4)|BYTES_SH(2)|FLAVOR_SH(1))
+#define TYPE_YUVK_16 TYPE_CMYK_16_REV
+#define TYPE_CMYK_16_PLANAR (COLORSPACE_SH(PT_CMYK)|CHANNELS_SH(4)|BYTES_SH(2)|PLANAR_SH(1))
+#define TYPE_CMYK_16_SE (COLORSPACE_SH(PT_CMYK)|CHANNELS_SH(4)|BYTES_SH(2)|ENDIAN16_SH(1))
+
+#define TYPE_KYMC_8 (COLORSPACE_SH(PT_CMYK)|CHANNELS_SH(4)|BYTES_SH(1)|DOSWAP_SH(1))
+#define TYPE_KYMC_16 (COLORSPACE_SH(PT_CMYK)|CHANNELS_SH(4)|BYTES_SH(2)|DOSWAP_SH(1))
+#define TYPE_KYMC_16_SE (COLORSPACE_SH(PT_CMYK)|CHANNELS_SH(4)|BYTES_SH(2)|DOSWAP_SH(1)|ENDIAN16_SH(1))
+
+#define TYPE_KCMY_8 (COLORSPACE_SH(PT_CMYK)|CHANNELS_SH(4)|BYTES_SH(1)|SWAPFIRST_SH(1))
+#define TYPE_KCMY_8_REV (COLORSPACE_SH(PT_CMYK)|CHANNELS_SH(4)|BYTES_SH(1)|FLAVOR_SH(1)|SWAPFIRST_SH(1))
+#define TYPE_KCMY_16 (COLORSPACE_SH(PT_CMYK)|CHANNELS_SH(4)|BYTES_SH(2)|SWAPFIRST_SH(1))
+#define TYPE_KCMY_16_REV (COLORSPACE_SH(PT_CMYK)|CHANNELS_SH(4)|BYTES_SH(2)|FLAVOR_SH(1)|SWAPFIRST_SH(1))
+#define TYPE_KCMY_16_SE (COLORSPACE_SH(PT_CMYK)|CHANNELS_SH(4)|BYTES_SH(2)|ENDIAN16_SH(1)|SWAPFIRST_SH(1))
+
+
+// HiFi separations, Thanks to Steven Greaves for providing the code,
+// the colorspace is not checked
+#define TYPE_CMYK5_8 (CHANNELS_SH(5)|BYTES_SH(1))
+#define TYPE_CMYK5_16 (CHANNELS_SH(5)|BYTES_SH(2))
+#define TYPE_CMYK5_16_SE (CHANNELS_SH(5)|BYTES_SH(2)|ENDIAN16_SH(1))
+#define TYPE_KYMC5_8 (CHANNELS_SH(5)|BYTES_SH(1)|DOSWAP_SH(1))
+#define TYPE_KYMC5_16 (CHANNELS_SH(5)|BYTES_SH(2)|DOSWAP_SH(1))
+#define TYPE_KYMC5_16_SE (CHANNELS_SH(5)|BYTES_SH(2)|DOSWAP_SH(1)|ENDIAN16_SH(1))
+
+#define TYPE_CMYKcm_8 (CHANNELS_SH(6)|BYTES_SH(1))
+#define TYPE_CMYKcm_8_PLANAR (CHANNELS_SH(6)|BYTES_SH(1)|PLANAR_SH(1))
+#define TYPE_CMYKcm_16 (CHANNELS_SH(6)|BYTES_SH(2))
+#define TYPE_CMYKcm_16_PLANAR (CHANNELS_SH(6)|BYTES_SH(2)|PLANAR_SH(1))
+#define TYPE_CMYKcm_16_SE (CHANNELS_SH(6)|BYTES_SH(2)|ENDIAN16_SH(1))
+
+// Separations with more than 6 channels aren't very standarized,
+// Except most start with CMYK and add other colors, so I just used
+// then total number of channels after CMYK i.e CMYK8_8
+
+#define TYPE_CMYK7_8 (CHANNELS_SH(7)|BYTES_SH(1))
+#define TYPE_CMYK7_16 (CHANNELS_SH(7)|BYTES_SH(2))
+#define TYPE_CMYK7_16_SE (CHANNELS_SH(7)|BYTES_SH(2)|ENDIAN16_SH(1))
+#define TYPE_KYMC7_8 (CHANNELS_SH(7)|BYTES_SH(1)|DOSWAP_SH(1))
+#define TYPE_KYMC7_16 (CHANNELS_SH(7)|BYTES_SH(2)|DOSWAP_SH(1))
+#define TYPE_KYMC7_16_SE (CHANNELS_SH(7)|BYTES_SH(2)|DOSWAP_SH(1)|ENDIAN16_SH(1))
+#define TYPE_CMYK8_8 (CHANNELS_SH(8)|BYTES_SH(1))
+#define TYPE_CMYK8_16 (CHANNELS_SH(8)|BYTES_SH(2))
+#define TYPE_CMYK8_16_SE (CHANNELS_SH(8)|BYTES_SH(2)|ENDIAN16_SH(1))
+#define TYPE_KYMC8_8 (CHANNELS_SH(8)|BYTES_SH(1)|DOSWAP_SH(1))
+#define TYPE_KYMC8_16 (CHANNELS_SH(8)|BYTES_SH(2)|DOSWAP_SH(1))
+#define TYPE_KYMC8_16_SE (CHANNELS_SH(8)|BYTES_SH(2)|DOSWAP_SH(1)|ENDIAN16_SH(1))
+#define TYPE_CMYK9_8 (CHANNELS_SH(9)|BYTES_SH(1))
+#define TYPE_CMYK9_16 (CHANNELS_SH(9)|BYTES_SH(2))
+#define TYPE_CMYK9_16_SE (CHANNELS_SH(9)|BYTES_SH(2)|ENDIAN16_SH(1))
+#define TYPE_KYMC9_8 (CHANNELS_SH(9)|BYTES_SH(1)|DOSWAP_SH(1))
+#define TYPE_KYMC9_16 (CHANNELS_SH(9)|BYTES_SH(2)|DOSWAP_SH(1))
+#define TYPE_KYMC9_16_SE (CHANNELS_SH(9)|BYTES_SH(2)|DOSWAP_SH(1)|ENDIAN16_SH(1))
+#define TYPE_CMYK10_8 (CHANNELS_SH(10)|BYTES_SH(1))
+#define TYPE_CMYK10_16 (CHANNELS_SH(10)|BYTES_SH(2))
+#define TYPE_CMYK10_16_SE (CHANNELS_SH(10)|BYTES_SH(2)|ENDIAN16_SH(1))
+#define TYPE_KYMC10_8 (CHANNELS_SH(10)|BYTES_SH(1)|DOSWAP_SH(1))
+#define TYPE_KYMC10_16 (CHANNELS_SH(10)|BYTES_SH(2)|DOSWAP_SH(1))
+#define TYPE_KYMC10_16_SE (CHANNELS_SH(10)|BYTES_SH(2)|DOSWAP_SH(1)|ENDIAN16_SH(1))
+#define TYPE_CMYK11_8 (CHANNELS_SH(11)|BYTES_SH(1))
+#define TYPE_CMYK11_16 (CHANNELS_SH(11)|BYTES_SH(2))
+#define TYPE_CMYK11_16_SE (CHANNELS_SH(11)|BYTES_SH(2)|ENDIAN16_SH(1))
+#define TYPE_KYMC11_8 (CHANNELS_SH(11)|BYTES_SH(1)|DOSWAP_SH(1))
+#define TYPE_KYMC11_16 (CHANNELS_SH(11)|BYTES_SH(2)|DOSWAP_SH(1))
+#define TYPE_KYMC11_16_SE (CHANNELS_SH(11)|BYTES_SH(2)|DOSWAP_SH(1)|ENDIAN16_SH(1))
+#define TYPE_CMYK12_8 (CHANNELS_SH(12)|BYTES_SH(1))
+#define TYPE_CMYK12_16 (CHANNELS_SH(12)|BYTES_SH(2))
+#define TYPE_CMYK12_16_SE (CHANNELS_SH(12)|BYTES_SH(2)|ENDIAN16_SH(1))
+#define TYPE_KYMC12_8 (CHANNELS_SH(12)|BYTES_SH(1)|DOSWAP_SH(1))
+#define TYPE_KYMC12_16 (CHANNELS_SH(12)|BYTES_SH(2)|DOSWAP_SH(1))
+#define TYPE_KYMC12_16_SE (CHANNELS_SH(12)|BYTES_SH(2)|DOSWAP_SH(1)|ENDIAN16_SH(1))
+
+// Colorimetric
+
+#define TYPE_XYZ_16 (COLORSPACE_SH(PT_XYZ)|CHANNELS_SH(3)|BYTES_SH(2))
+#define TYPE_Lab_8 (COLORSPACE_SH(PT_Lab)|CHANNELS_SH(3)|BYTES_SH(1))
+#define TYPE_ALab_8 (COLORSPACE_SH(PT_Lab)|CHANNELS_SH(3)|BYTES_SH(1)|EXTRA_SH(1)|DOSWAP_SH(1))
+#define TYPE_Lab_16 (COLORSPACE_SH(PT_Lab)|CHANNELS_SH(3)|BYTES_SH(2))
+#define TYPE_Yxy_16 (COLORSPACE_SH(PT_Yxy)|CHANNELS_SH(3)|BYTES_SH(2))
+
+// YCbCr
+
+#define TYPE_YCbCr_8 (COLORSPACE_SH(PT_YCbCr)|CHANNELS_SH(3)|BYTES_SH(1))
+#define TYPE_YCbCr_8_PLANAR (COLORSPACE_SH(PT_YCbCr)|CHANNELS_SH(3)|BYTES_SH(1)|PLANAR_SH(1))
+#define TYPE_YCbCr_16 (COLORSPACE_SH(PT_YCbCr)|CHANNELS_SH(3)|BYTES_SH(2))
+#define TYPE_YCbCr_16_PLANAR (COLORSPACE_SH(PT_YCbCr)|CHANNELS_SH(3)|BYTES_SH(2)|PLANAR_SH(1))
+#define TYPE_YCbCr_16_SE (COLORSPACE_SH(PT_YCbCr)|CHANNELS_SH(3)|BYTES_SH(2)|ENDIAN16_SH(1))
+
+// YUV
+
+#define TYPE_YUV_8 (COLORSPACE_SH(PT_YUV)|CHANNELS_SH(3)|BYTES_SH(1))
+#define TYPE_YUV_8_PLANAR (COLORSPACE_SH(PT_YUV)|CHANNELS_SH(3)|BYTES_SH(1)|PLANAR_SH(1))
+#define TYPE_YUV_16 (COLORSPACE_SH(PT_YUV)|CHANNELS_SH(3)|BYTES_SH(2))
+#define TYPE_YUV_16_PLANAR (COLORSPACE_SH(PT_YUV)|CHANNELS_SH(3)|BYTES_SH(2)|PLANAR_SH(1))
+#define TYPE_YUV_16_SE (COLORSPACE_SH(PT_YUV)|CHANNELS_SH(3)|BYTES_SH(2)|ENDIAN16_SH(1))
+
+// HLS
+
+#define TYPE_HLS_8 (COLORSPACE_SH(PT_HLS)|CHANNELS_SH(3)|BYTES_SH(1))
+#define TYPE_HLS_8_PLANAR (COLORSPACE_SH(PT_HLS)|CHANNELS_SH(3)|BYTES_SH(1)|PLANAR_SH(1))
+#define TYPE_HLS_16 (COLORSPACE_SH(PT_HLS)|CHANNELS_SH(3)|BYTES_SH(2))
+#define TYPE_HLS_16_PLANAR (COLORSPACE_SH(PT_HLS)|CHANNELS_SH(3)|BYTES_SH(2)|PLANAR_SH(1))
+#define TYPE_HLS_16_SE (COLORSPACE_SH(PT_HLS)|CHANNELS_SH(3)|BYTES_SH(2)|ENDIAN16_SH(1))
+
+
+// HSV
+
+#define TYPE_HSV_8 (COLORSPACE_SH(PT_HSV)|CHANNELS_SH(3)|BYTES_SH(1))
+#define TYPE_HSV_8_PLANAR (COLORSPACE_SH(PT_HSV)|CHANNELS_SH(3)|BYTES_SH(1)|PLANAR_SH(1))
+#define TYPE_HSV_16 (COLORSPACE_SH(PT_HSV)|CHANNELS_SH(3)|BYTES_SH(2))
+#define TYPE_HSV_16_PLANAR (COLORSPACE_SH(PT_HSV)|CHANNELS_SH(3)|BYTES_SH(2)|PLANAR_SH(1))
+#define TYPE_HSV_16_SE (COLORSPACE_SH(PT_HSV)|CHANNELS_SH(3)|BYTES_SH(2)|ENDIAN16_SH(1))
+
+// Named color index. Only 16 bits allowed (don't check colorspace)
+
+#define TYPE_NAMED_COLOR_INDEX (CHANNELS_SH(1)|BYTES_SH(2))
+
+// Double values. Painful slow, but sometimes helpful. NOTE THAT 'BYTES' FIELD IS SET TO ZERO!
+
+#define TYPE_XYZ_DBL (COLORSPACE_SH(PT_XYZ)|CHANNELS_SH(3)|BYTES_SH(0))
+#define TYPE_Lab_DBL (COLORSPACE_SH(PT_Lab)|CHANNELS_SH(3)|BYTES_SH(0))
+#define TYPE_GRAY_DBL (COLORSPACE_SH(PT_GRAY)|CHANNELS_SH(1)|BYTES_SH(0))
+#define TYPE_RGB_DBL (COLORSPACE_SH(PT_RGB)|CHANNELS_SH(3)|BYTES_SH(0))
+#define TYPE_CMYK_DBL (COLORSPACE_SH(PT_CMYK)|CHANNELS_SH(4)|BYTES_SH(0))
+
+#endif
+
+
+// Gamma table parameters
+
+typedef struct {
+
+ unsigned int Crc32; // Has my table been touched?
+
+ // Keep initial parameters for further serialization
+
+ int Type;
+ double Params[10];
+
+ } LCMSGAMMAPARAMS, FAR* LPLCMSGAMMAPARAMS;
+
+// Gamma tables.
+
+typedef struct {
+
+ LCMSGAMMAPARAMS Birth; // Parameters used for table creation
+
+ // Table-based representation follows
+
+ int nEntries;
+ WORD GammaTable[1];
+
+ } GAMMATABLE;
+
+typedef GAMMATABLE FAR* LPGAMMATABLE;
+
+// Sampled curves (1D)
+typedef struct {
+
+ int nItems;
+ double* Values;
+
+ } SAMPLEDCURVE;
+
+typedef SAMPLEDCURVE FAR* LPSAMPLEDCURVE;
+
+// Vectors
+typedef struct { // Float Vector
+
+ double n[3];
+
+ } VEC3;
+
+typedef VEC3 FAR* LPVEC3;
+
+
+typedef struct { // Matrix
+
+ VEC3 v[3];
+
+ } MAT3;
+
+typedef MAT3 FAR* LPMAT3;
+
+// Colorspace values
+typedef struct {
+
+ double X;
+ double Y;
+ double Z;
+
+ } cmsCIEXYZ;
+
+typedef cmsCIEXYZ FAR* LPcmsCIEXYZ;
+
+typedef struct {
+
+ double x;
+ double y;
+ double Y;
+
+ } cmsCIExyY;
+
+typedef cmsCIExyY FAR* LPcmsCIExyY;
+
+typedef struct {
+
+ double L;
+ double a;
+ double b;
+
+ } cmsCIELab;
+
+typedef cmsCIELab FAR* LPcmsCIELab;
+
+typedef struct {
+
+ double L;
+ double C;
+ double h;
+
+ } cmsCIELCh;
+
+typedef cmsCIELCh FAR* LPcmsCIELCh;
+
+typedef struct {
+
+ double J;
+ double C;
+ double h;
+
+ } cmsJCh;
+
+typedef cmsJCh FAR* LPcmsJCh;
+
+// Primaries
+typedef struct {
+
+ cmsCIEXYZ Red;
+ cmsCIEXYZ Green;
+ cmsCIEXYZ Blue;
+
+ } cmsCIEXYZTRIPLE;
+
+typedef cmsCIEXYZTRIPLE FAR* LPcmsCIEXYZTRIPLE;
+
+
+typedef struct {
+
+ cmsCIExyY Red;
+ cmsCIExyY Green;
+ cmsCIExyY Blue;
+
+ } cmsCIExyYTRIPLE;
+
+typedef cmsCIExyYTRIPLE FAR* LPcmsCIExyYTRIPLE;
+
+
+
+// Following ICC spec
+
+#define D50X (0.9642)
+#define D50Y (1.0)
+#define D50Z (0.8249)
+
+#define PERCEPTUAL_BLACK_X (0.00336)
+#define PERCEPTUAL_BLACK_Y (0.0034731)
+#define PERCEPTUAL_BLACK_Z (0.00287)
+
+// Does return pointers to constant structs
+
+LCMSAPI LPcmsCIEXYZ LCMSEXPORT cmsD50_XYZ(void);
+LCMSAPI LPcmsCIExyY LCMSEXPORT cmsD50_xyY(void);
+
+
+// Input/Output
+
+LCMSAPI cmsHPROFILE LCMSEXPORT cmsOpenProfileFromFile(const char *ICCProfile, const char *sAccess);
+LCMSAPI cmsHPROFILE LCMSEXPORT cmsOpenProfileFromMem(LPVOID MemPtr, DWORD dwSize);
+LCMSAPI BOOL LCMSEXPORT cmsCloseProfile(cmsHPROFILE hProfile);
+
+// Predefined run-time profiles
+
+LCMSAPI cmsHPROFILE LCMSEXPORT cmsCreateRGBProfile(LPcmsCIExyY WhitePoint,
+ LPcmsCIExyYTRIPLE Primaries,
+ LPGAMMATABLE TransferFunction[3]);
+
+LCMSAPI cmsHPROFILE LCMSEXPORT cmsCreateGrayProfile(LPcmsCIExyY WhitePoint,
+ LPGAMMATABLE TransferFunction);
+
+LCMSAPI cmsHPROFILE LCMSEXPORT cmsCreateLinearizationDeviceLink(icColorSpaceSignature ColorSpace,
+ LPGAMMATABLE TransferFunctions[]);
+
+LCMSAPI cmsHPROFILE LCMSEXPORT cmsCreateInkLimitingDeviceLink(icColorSpaceSignature ColorSpace,
+ double Limit);
+
+
+LCMSAPI cmsHPROFILE LCMSEXPORT cmsCreateLabProfile(LPcmsCIExyY WhitePoint);
+LCMSAPI cmsHPROFILE LCMSEXPORT cmsCreateLab4Profile(LPcmsCIExyY WhitePoint);
+
+LCMSAPI cmsHPROFILE LCMSEXPORT cmsCreateXYZProfile(void);
+LCMSAPI cmsHPROFILE LCMSEXPORT cmsCreate_sRGBProfile(void);
+
+
+
+LCMSAPI cmsHPROFILE LCMSEXPORT cmsCreateBCHSWabstractProfile(int nLUTPoints,
+ double Bright,
+ double Contrast,
+ double Hue,
+ double Saturation,
+ int TempSrc,
+ int TempDest);
+
+LCMSAPI cmsHPROFILE LCMSEXPORT cmsCreateNULLProfile(void);
+
+
+// Colorimetric space conversions
+
+LCMSAPI void LCMSEXPORT cmsXYZ2xyY(LPcmsCIExyY Dest, const cmsCIEXYZ* Source);
+LCMSAPI void LCMSEXPORT cmsxyY2XYZ(LPcmsCIEXYZ Dest, const cmsCIExyY* Source);
+LCMSAPI void LCMSEXPORT cmsXYZ2Lab(LPcmsCIEXYZ WhitePoint, LPcmsCIELab Lab, const cmsCIEXYZ* xyz);
+LCMSAPI void LCMSEXPORT cmsLab2XYZ(LPcmsCIEXYZ WhitePoint, LPcmsCIEXYZ xyz, const cmsCIELab* Lab);
+LCMSAPI void LCMSEXPORT cmsLab2LCh(LPcmsCIELCh LCh, const cmsCIELab* Lab);
+LCMSAPI void LCMSEXPORT cmsLCh2Lab(LPcmsCIELab Lab, const cmsCIELCh* LCh);
+
+
+// CIELab handling
+
+LCMSAPI double LCMSEXPORT cmsDeltaE(LPcmsCIELab Lab1, LPcmsCIELab Lab2);
+LCMSAPI double LCMSEXPORT cmsCIE94DeltaE(LPcmsCIELab Lab1, LPcmsCIELab Lab2);
+LCMSAPI double LCMSEXPORT cmsBFDdeltaE(LPcmsCIELab Lab1, LPcmsCIELab Lab2);
+LCMSAPI double LCMSEXPORT cmsCMCdeltaE(LPcmsCIELab Lab1, LPcmsCIELab Lab2);
+LCMSAPI double LCMSEXPORT cmsCIE2000DeltaE(LPcmsCIELab Lab1, LPcmsCIELab Lab2, double Kl, double Kc, double Kh);
+
+LCMSAPI void LCMSEXPORT cmsClampLab(LPcmsCIELab Lab, double amax, double amin, double bmax, double bmin);
+
+LCMSAPI BOOL LCMSEXPORT cmsWhitePointFromTemp(int TempK, LPcmsCIExyY WhitePoint);
+
+LCMSAPI BOOL LCMSEXPORT cmsAdaptToIlluminant(LPcmsCIEXYZ Result,
+ LPcmsCIEXYZ SourceWhitePt,
+ LPcmsCIEXYZ Illuminant,
+ LPcmsCIEXYZ Value);
+
+LCMSAPI BOOL LCMSEXPORT cmsBuildRGB2XYZtransferMatrix(LPMAT3 r,
+ LPcmsCIExyY WhitePoint,
+ LPcmsCIExyYTRIPLE Primaries);
+
+// CIECAM97s
+
+#define AVG_SURROUND_4 0
+#define AVG_SURROUND 1
+#define DIM_SURROUND 2
+#define DARK_SURROUND 3
+#define CUTSHEET_SURROUND 4
+
+#define D_CALCULATE (-1)
+#define D_CALCULATE_DISCOUNT (-2)
+
+typedef struct {
+
+ cmsCIEXYZ whitePoint;
+ double Yb;
+ double La;
+ int surround;
+ double D_value;
+
+ } cmsViewingConditions;
+
+typedef cmsViewingConditions FAR* LPcmsViewingConditions;
+
+
+LCMSAPI LCMSHANDLE LCMSEXPORT cmsCIECAM97sInit(LPcmsViewingConditions pVC2);
+LCMSAPI void LCMSEXPORT cmsCIECAM97sDone(LCMSHANDLE hModel);
+LCMSAPI void LCMSEXPORT cmsCIECAM97sForward(LCMSHANDLE hModel, LPcmsCIEXYZ pIn, LPcmsJCh pOut);
+LCMSAPI void LCMSEXPORT cmsCIECAM97sReverse(LCMSHANDLE hModel, LPcmsJCh pIn, LPcmsCIEXYZ pOut);
+
+
+// CIECAM02
+
+LCMSAPI LCMSHANDLE LCMSEXPORT cmsCIECAM02Init(LPcmsViewingConditions pVC);
+LCMSAPI void LCMSEXPORT cmsCIECAM02Done(LCMSHANDLE hModel);
+LCMSAPI void LCMSEXPORT cmsCIECAM02Forward(LCMSHANDLE hModel, LPcmsCIEXYZ pIn, LPcmsJCh pOut);
+LCMSAPI void LCMSEXPORT cmsCIECAM02Reverse(LCMSHANDLE hModel, LPcmsJCh pIn, LPcmsCIEXYZ pOut);
+
+
+// Gamma
+
+LCMSAPI LPGAMMATABLE LCMSEXPORT cmsBuildGamma(int nEntries, double Gamma);
+LCMSAPI LPGAMMATABLE LCMSEXPORT cmsBuildParametricGamma(int nEntries, int Type, double Params[]);
+LCMSAPI LPGAMMATABLE LCMSEXPORT cmsAllocGamma(int nEntries);
+LCMSAPI void LCMSEXPORT cmsFreeGamma(LPGAMMATABLE Gamma);
+LCMSAPI void LCMSEXPORT cmsFreeGammaTriple(LPGAMMATABLE Gamma[3]);
+LCMSAPI LPGAMMATABLE LCMSEXPORT cmsDupGamma(LPGAMMATABLE Src);
+LCMSAPI LPGAMMATABLE LCMSEXPORT cmsReverseGamma(int nResultSamples, LPGAMMATABLE InGamma);
+LCMSAPI LPGAMMATABLE LCMSEXPORT cmsJoinGamma(LPGAMMATABLE InGamma, LPGAMMATABLE OutGamma);
+LCMSAPI LPGAMMATABLE LCMSEXPORT cmsJoinGammaEx(LPGAMMATABLE InGamma, LPGAMMATABLE OutGamma, int nPoints);
+LCMSAPI BOOL LCMSEXPORT cmsSmoothGamma(LPGAMMATABLE Tab, double lambda);
+LCMSAPI double LCMSEXPORT cmsEstimateGamma(LPGAMMATABLE t);
+LCMSAPI double LCMSEXPORT cmsEstimateGammaEx(LPWORD Table, int nEntries, double Thereshold);
+LCMSAPI LPGAMMATABLE LCMSEXPORT cmsReadICCGamma(cmsHPROFILE hProfile, icTagSignature sig);
+LCMSAPI LPGAMMATABLE LCMSEXPORT cmsReadICCGammaReversed(cmsHPROFILE hProfile, icTagSignature sig);
+
+// Access to Profile data.
+
+LCMSAPI BOOL LCMSEXPORT cmsTakeMediaWhitePoint(LPcmsCIEXYZ Dest, cmsHPROFILE hProfile);
+LCMSAPI BOOL LCMSEXPORT cmsTakeMediaBlackPoint(LPcmsCIEXYZ Dest, cmsHPROFILE hProfile);
+LCMSAPI BOOL LCMSEXPORT cmsTakeIluminant(LPcmsCIEXYZ Dest, cmsHPROFILE hProfile);
+LCMSAPI BOOL LCMSEXPORT cmsTakeColorants(LPcmsCIEXYZTRIPLE Dest, cmsHPROFILE hProfile);
+LCMSAPI DWORD LCMSEXPORT cmsTakeHeaderFlags(cmsHPROFILE hProfile);
+LCMSAPI DWORD LCMSEXPORT cmsTakeHeaderAttributes(cmsHPROFILE hProfile);
+
+LCMSAPI void LCMSEXPORT cmsSetLanguage(int LanguageCode, int CountryCode);
+LCMSAPI const char* LCMSEXPORT cmsTakeProductName(cmsHPROFILE hProfile);
+LCMSAPI const char* LCMSEXPORT cmsTakeProductDesc(cmsHPROFILE hProfile);
+LCMSAPI const char* LCMSEXPORT cmsTakeProductInfo(cmsHPROFILE hProfile);
+LCMSAPI const char* LCMSEXPORT cmsTakeManufacturer(cmsHPROFILE hProfile);
+LCMSAPI const char* LCMSEXPORT cmsTakeModel(cmsHPROFILE hProfile);
+LCMSAPI const char* LCMSEXPORT cmsTakeCopyright(cmsHPROFILE hProfile);
+LCMSAPI const BYTE* LCMSEXPORT cmsTakeProfileID(cmsHPROFILE hProfile);
+
+LCMSAPI BOOL LCMSEXPORT cmsTakeCreationDateTime(struct tm *Dest, cmsHPROFILE hProfile);
+LCMSAPI BOOL LCMSEXPORT cmsTakeCalibrationDateTime(struct tm *Dest, cmsHPROFILE hProfile);
+
+LCMSAPI BOOL LCMSEXPORT cmsIsTag(cmsHPROFILE hProfile, icTagSignature sig);
+LCMSAPI int LCMSEXPORT cmsTakeRenderingIntent(cmsHPROFILE hProfile);
+
+LCMSAPI BOOL LCMSEXPORT cmsTakeCharTargetData(cmsHPROFILE hProfile, char** Data, size_t* len);
+
+LCMSAPI int LCMSEXPORT cmsReadICCText(cmsHPROFILE hProfile, icTagSignature sig, char *Text);
+
+typedef struct {
+
+ icSignature deviceMfg;
+ icSignature deviceModel;
+ icUInt32Number attributes[2];
+ icTechnologySignature technology;
+
+ char Manufacturer[512];
+ char Model[512];
+
+ } cmsPSEQDESC, FAR *LPcmsPSEQDESC;
+
+typedef struct {
+
+ int n;
+ cmsPSEQDESC seq[1];
+
+ } cmsSEQ, FAR *LPcmsSEQ;
+
+
+LCMSAPI LPcmsSEQ LCMSEXPORT cmsReadProfileSequenceDescription(cmsHPROFILE hProfile);
+
+
+
+// Extended gamut tag -- an HP extension
+
+#define LCMSGAMUTMETHOD_SEGMENTMAXIMA 0
+#define LCMSGAMUTMETHOD_CONVEXHULL 1
+#define LCMSGAMUTMETHOD_ALPHASHAPE 2
+
+
+#define LCMSGAMUT_PHYSICAL 0
+#define LCMSGAMUT_HP1 1
+#define LCMSGAMUT_HP2 2
+
+typedef struct {
+
+ icColorSpaceSignature CoordSig; // Gamut coordinates signature
+ icUInt16Number Method; // Method used to generate gamut
+ icUInt16Number Usage; // Gamut usage or intent
+
+ char Description[512]; // Textual description
+
+ cmsViewingConditions Vc; // The viewing conditions
+
+ icUInt32Number Count; // Number of entries
+ double Data[1]; // The current data
+
+ } cmsGAMUTEX, FAR* LPcmsGAMUTEX;
+
+
+LCMSAPI LPcmsGAMUTEX LCMSEXPORT cmsReadExtendedGamut(cmsHPROFILE hProfile, int index);
+LCMSAPI void LCMSEXPORT cmsFreeExtendedGamut(LPcmsGAMUTEX gex);
+
+
+
+
+// Translate form/to our notation to ICC
+LCMSAPI icColorSpaceSignature LCMSEXPORT _cmsICCcolorSpace(int OurNotation);
+LCMSAPI int LCMSEXPORT _cmsLCMScolorSpace(icColorSpaceSignature ProfileSpace);
+LCMSAPI int LCMSEXPORT _cmsChannelsOf(icColorSpaceSignature ColorSpace);
+LCMSAPI BOOL LCMSEXPORT _cmsIsMatrixShaper(cmsHPROFILE hProfile);
+
+#define LCMS_USED_AS_INPUT 0
+#define LCMS_USED_AS_OUTPUT 1
+#define LCMS_USED_AS_PROOF 2
+
+LCMSAPI BOOL LCMSEXPORT cmsIsIntentSupported(cmsHPROFILE hProfile, int Intent, int UsedDirection);
+
+LCMSAPI icColorSpaceSignature LCMSEXPORT cmsGetPCS(cmsHPROFILE hProfile);
+LCMSAPI icColorSpaceSignature LCMSEXPORT cmsGetColorSpace(cmsHPROFILE hProfile);
+LCMSAPI icProfileClassSignature LCMSEXPORT cmsGetDeviceClass(cmsHPROFILE hProfile);
+LCMSAPI DWORD LCMSEXPORT cmsGetProfileICCversion(cmsHPROFILE hProfile);
+LCMSAPI void LCMSEXPORT cmsSetProfileICCversion(cmsHPROFILE hProfile, DWORD Version);
+LCMSAPI icInt32Number LCMSEXPORT cmsGetTagCount(cmsHPROFILE hProfile);
+LCMSAPI icTagSignature LCMSEXPORT cmsGetTagSignature(cmsHPROFILE hProfile, icInt32Number n);
+
+
+LCMSAPI void LCMSEXPORT cmsSetDeviceClass(cmsHPROFILE hProfile, icProfileClassSignature sig);
+LCMSAPI void LCMSEXPORT cmsSetColorSpace(cmsHPROFILE hProfile, icColorSpaceSignature sig);
+LCMSAPI void LCMSEXPORT cmsSetPCS(cmsHPROFILE hProfile, icColorSpaceSignature pcs);
+LCMSAPI void LCMSEXPORT cmsSetRenderingIntent(cmsHPROFILE hProfile, int RenderingIntent);
+LCMSAPI void LCMSEXPORT cmsSetHeaderFlags(cmsHPROFILE hProfile, DWORD Flags);
+LCMSAPI void LCMSEXPORT cmsSetHeaderAttributes(cmsHPROFILE hProfile, DWORD Flags);
+LCMSAPI void LCMSEXPORT cmsSetProfileID(cmsHPROFILE hProfile, LPBYTE ProfileID);
+
+// Intents
+
+#define INTENT_PERCEPTUAL 0
+#define INTENT_RELATIVE_COLORIMETRIC 1
+#define INTENT_SATURATION 2
+#define INTENT_ABSOLUTE_COLORIMETRIC 3
+
+// Flags
+
+#define cmsFLAGS_MATRIXINPUT 0x0001
+#define cmsFLAGS_MATRIXOUTPUT 0x0002
+#define cmsFLAGS_MATRIXONLY (cmsFLAGS_MATRIXINPUT|cmsFLAGS_MATRIXOUTPUT)
+
+#define cmsFLAGS_NOWHITEONWHITEFIXUP 0x0004 // Don't hot fix scum dot
+#define cmsFLAGS_NOPRELINEARIZATION 0x0010 // Don't create prelinearization tables
+ // on precalculated transforms (internal use)
+
+#define cmsFLAGS_GUESSDEVICECLASS 0x0020 // Guess device class (for transform2devicelink)
+
+#define cmsFLAGS_NOTCACHE 0x0040 // Inhibit 1-pixel cache
+
+#define cmsFLAGS_NOTPRECALC 0x0100
+#define cmsFLAGS_NULLTRANSFORM 0x0200 // Don't transform anyway
+#define cmsFLAGS_HIGHRESPRECALC 0x0400 // Use more memory to give better accurancy
+#define cmsFLAGS_LOWRESPRECALC 0x0800 // Use less memory to minimize resouces
+
+
+#define cmsFLAGS_WHITEBLACKCOMPENSATION 0x2000
+#define cmsFLAGS_BLACKPOINTCOMPENSATION cmsFLAGS_WHITEBLACKCOMPENSATION
+
+// Proofing flags
+
+#define cmsFLAGS_GAMUTCHECK 0x1000 // Out of Gamut alarm
+#define cmsFLAGS_SOFTPROOFING 0x4000 // Do softproofing
+
+
+// Black preservation
+
+#define cmsFLAGS_PRESERVEBLACK 0x8000
+
+// CRD special
+
+#define cmsFLAGS_NODEFAULTRESOURCEDEF 0x00010000
+
+// Gridpoints
+
+#define cmsFLAGS_GRIDPOINTS(n) (((n) & 0xFF) << 16)
+
+
+// Transforms
+
+LCMSAPI cmsHTRANSFORM LCMSEXPORT cmsCreateTransform(cmsHPROFILE Input,
+ DWORD InputFormat,
+ cmsHPROFILE Output,
+ DWORD OutputFormat,
+ int Intent,
+ DWORD dwFlags);
+
+LCMSAPI cmsHTRANSFORM LCMSEXPORT cmsCreateProofingTransform(cmsHPROFILE Input,
+ DWORD InputFormat,
+ cmsHPROFILE Output,
+ DWORD OutputFormat,
+ cmsHPROFILE Proofing,
+ int Intent,
+ int ProofingIntent,
+ DWORD dwFlags);
+
+LCMSAPI cmsHTRANSFORM LCMSEXPORT cmsCreateMultiprofileTransform(cmsHPROFILE hProfiles[],
+ int nProfiles,
+ DWORD InputFormat,
+ DWORD OutputFormat,
+ int Intent,
+ DWORD dwFlags);
+
+LCMSAPI void LCMSEXPORT cmsDeleteTransform(cmsHTRANSFORM hTransform);
+
+LCMSAPI void LCMSEXPORT cmsDoTransform(cmsHTRANSFORM Transform,
+ LPVOID InputBuffer,
+ LPVOID OutputBuffer,
+ unsigned int Size);
+
+LCMSAPI void LCMSEXPORT cmsChangeBuffersFormat(cmsHTRANSFORM hTransform, DWORD InputFormat, DWORD dwOutputFormat);
+
+LCMSAPI void LCMSEXPORT cmsSetAlarmCodes(int r, int g, int b);
+LCMSAPI void LCMSEXPORT cmsGetAlarmCodes(int *r, int *g, int *b);
+
+
+// Adaptation state for absolute colorimetric intent
+
+LCMSAPI double LCMSEXPORT cmsSetAdaptationState(double d);
+
+
+// Named color support
+typedef struct {
+ char Name[MAX_PATH];
+ WORD PCS[3];
+ WORD DeviceColorant[MAXCHANNELS];
+
+
+ } cmsNAMEDCOLOR, FAR* LPcmsNAMEDCOLOR;
+
+typedef struct {
+ int nColors;
+ int Allocated;
+ int ColorantCount;
+ char Prefix[33];
+ char Suffix[33];
+
+ cmsNAMEDCOLOR List[1];
+
+ } cmsNAMEDCOLORLIST, FAR* LPcmsNAMEDCOLORLIST;
+
+// Named color support
+
+LCMSAPI int LCMSEXPORT cmsNamedColorCount(cmsHTRANSFORM xform);
+LCMSAPI BOOL LCMSEXPORT cmsNamedColorInfo(cmsHTRANSFORM xform, int nColor, char* Name, char* Prefix, char* Suffix);
+LCMSAPI int LCMSEXPORT cmsNamedColorIndex(cmsHTRANSFORM xform, const char* Name);
+
+// Colorant tables
+
+LCMSAPI LPcmsNAMEDCOLORLIST LCMSEXPORT cmsReadColorantTable(cmsHPROFILE hProfile, icTagSignature sig);
+
+// Profile creation
+
+LCMSAPI BOOL LCMSEXPORT cmsAddTag(cmsHPROFILE hProfile, icTagSignature sig, void* data);
+
+// Converts a transform to a devicelink profile
+LCMSAPI cmsHPROFILE LCMSEXPORT cmsTransform2DeviceLink(cmsHTRANSFORM hTransform, DWORD dwFlags);
+
+// Set the 'save as 8-bit' flag
+LCMSAPI void LCMSEXPORT _cmsSetLUTdepth(cmsHPROFILE hProfile, int depth);
+
+
+// Save profile
+LCMSAPI BOOL LCMSEXPORT _cmsSaveProfile(cmsHPROFILE hProfile, const char* FileName);
+LCMSAPI BOOL LCMSEXPORT _cmsSaveProfileToMem(cmsHPROFILE hProfile, void *MemPtr,
+ size_t* BytesNeeded);
+
+
+
+// PostScript ColorRenderingDictionary and ColorSpaceArray
+
+LCMSAPI DWORD LCMSEXPORT cmsGetPostScriptCSA(cmsHPROFILE hProfile, int Intent, LPVOID Buffer, DWORD dwBufferLen);
+LCMSAPI DWORD LCMSEXPORT cmsGetPostScriptCRD(cmsHPROFILE hProfile, int Intent, LPVOID Buffer, DWORD dwBufferLen);
+LCMSAPI DWORD LCMSEXPORT cmsGetPostScriptCRDEx(cmsHPROFILE hProfile, int Intent, DWORD dwFlags, LPVOID Buffer, DWORD dwBufferLen);
+
+
+// Error handling
+
+#define LCMS_ERROR_ABORT 0
+#define LCMS_ERROR_SHOW 1
+#define LCMS_ERROR_IGNORE 2
+
+LCMSAPI int LCMSEXPORT cmsErrorAction(int nAction);
+
+#define LCMS_ERRC_WARNING 0x1000
+#define LCMS_ERRC_RECOVERABLE 0x2000
+#define LCMS_ERRC_ABORTED 0x3000
+
+typedef int (* cmsErrorHandlerFunction)(int ErrorCode, const char *ErrorText);
+
+LCMSAPI void LCMSEXPORT cmsSetErrorHandler(cmsErrorHandlerFunction Fn);
+
+
+// LUT manipulation
+
+
+typedef struct _lcms_LUT_struc LUT, FAR* LPLUT; // opaque pointer
+
+LCMSAPI LPLUT LCMSEXPORT cmsAllocLUT(void);
+LCMSAPI LPLUT LCMSEXPORT cmsAllocLinearTable(LPLUT NewLUT, LPGAMMATABLE Tables[], int nTable);
+LCMSAPI LPLUT LCMSEXPORT cmsAlloc3DGrid(LPLUT Lut, int clutPoints, int inputChan, int outputChan);
+LCMSAPI LPLUT LCMSEXPORT cmsSetMatrixLUT(LPLUT Lut, LPMAT3 M);
+LCMSAPI LPLUT LCMSEXPORT cmsSetMatrixLUT4(LPLUT Lut, LPMAT3 M, LPVEC3 off, DWORD dwFlags);
+LCMSAPI void LCMSEXPORT cmsFreeLUT(LPLUT Lut);
+LCMSAPI void LCMSEXPORT cmsEvalLUT(LPLUT Lut, WORD In[], WORD Out[]);
+LCMSAPI double LCMSEXPORT cmsEvalLUTreverse(LPLUT Lut, WORD Target[], WORD Result[], LPWORD Hint);
+LCMSAPI LPLUT LCMSEXPORT cmsReadICCLut(cmsHPROFILE hProfile, icTagSignature sig);
+LCMSAPI LPLUT LCMSEXPORT cmsDupLUT(LPLUT Orig);
+
+// LUT Sampling
+
+typedef int (* _cmsSAMPLER)(register WORD In[],
+ register WORD Out[],
+ register LPVOID Cargo);
+
+#define SAMPLER_HASTL1 LUT_HASTL1
+#define SAMPLER_HASTL2 LUT_HASTL2
+#define SAMPLER_INSPECT 0x01000000
+
+LCMSAPI int LCMSEXPORT cmsSample3DGrid(LPLUT Lut, _cmsSAMPLER Sampler, LPVOID Cargo, DWORD dwFlags);
+
+// Formatters
+
+typedef unsigned char* (* cmsFORMATTER)(register void* CMMcargo,
+ register WORD ToUnroll[],
+ register LPBYTE Buffer);
+
+LCMSAPI void LCMSEXPORT cmsSetUserFormatters(cmsHTRANSFORM hTransform, DWORD dwInput, cmsFORMATTER Input,
+ DWORD dwOutput, cmsFORMATTER Output);
+
+LCMSAPI void LCMSEXPORT cmsGetUserFormatters(cmsHTRANSFORM hTransform,
+ LPDWORD InputFormat, cmsFORMATTER* Input,
+ LPDWORD OutputFormat, cmsFORMATTER* Output);
+
+
+// IT8.7 / CGATS.17-200x handling
+
+LCMSAPI LCMSHANDLE LCMSEXPORT cmsIT8Alloc(void);
+LCMSAPI void LCMSEXPORT cmsIT8Free(LCMSHANDLE IT8);
+
+// Tables
+
+LCMSAPI int LCMSEXPORT cmsIT8TableCount(LCMSHANDLE IT8);
+LCMSAPI int LCMSEXPORT cmsIT8SetTable(LCMSHANDLE IT8, int nTable);
+
+// Persistence
+LCMSAPI LCMSHANDLE LCMSEXPORT cmsIT8LoadFromFile(const char* cFileName);
+LCMSAPI LCMSHANDLE LCMSEXPORT cmsIT8LoadFromMem(void *Ptr, size_t len);
+LCMSAPI BOOL LCMSEXPORT cmsIT8SaveToFile(LCMSHANDLE IT8, const char* cFileName);
+LCMSAPI BOOL LCMSEXPORT cmsIT8SaveToMem(LCMSHANDLE hIT8, void *MemPtr, size_t* BytesNeeded);
+
+// Properties
+LCMSAPI const char* LCMSEXPORT cmsIT8GetSheetType(LCMSHANDLE hIT8);
+LCMSAPI BOOL LCMSEXPORT cmsIT8SetSheetType(LCMSHANDLE hIT8, const char* Type);
+
+LCMSAPI BOOL LCMSEXPORT cmsIT8SetComment(LCMSHANDLE hIT8, const char* cComment);
+
+LCMSAPI BOOL LCMSEXPORT cmsIT8SetPropertyStr(LCMSHANDLE hIT8, const char* cProp, const char *Str);
+LCMSAPI BOOL LCMSEXPORT cmsIT8SetPropertyDbl(LCMSHANDLE hIT8, const char* cProp, double Val);
+LCMSAPI BOOL LCMSEXPORT cmsIT8SetPropertyHex(LCMSHANDLE hIT8, const char* cProp, int Val);
+
+LCMSAPI BOOL LCMSEXPORT cmsIT8SetPropertyUncooked(LCMSHANDLE hIT8, const char* Key, const char* Buffer);
+
+
+LCMSAPI const char* LCMSEXPORT cmsIT8GetProperty(LCMSHANDLE hIT8, const char* cProp);
+LCMSAPI double LCMSEXPORT cmsIT8GetPropertyDbl(LCMSHANDLE hIT8, const char* cProp);
+LCMSAPI int LCMSEXPORT cmsIT8EnumProperties(LCMSHANDLE IT8, char ***PropertyNames);
+
+// Datasets
+
+LCMSAPI const char* LCMSEXPORT cmsIT8GetDataRowCol(LCMSHANDLE IT8, int row, int col);
+LCMSAPI double LCMSEXPORT cmsIT8GetDataRowColDbl(LCMSHANDLE IT8, int row, int col);
+
+LCMSAPI BOOL LCMSEXPORT cmsIT8SetDataRowCol(LCMSHANDLE hIT8, int row, int col,
+ const char* Val);
+
+LCMSAPI BOOL LCMSEXPORT cmsIT8SetDataRowColDbl(LCMSHANDLE hIT8, int row, int col,
+ double Val);
+
+LCMSAPI const char* LCMSEXPORT cmsIT8GetData(LCMSHANDLE IT8, const char* cPatch, const char* cSample);
+
+
+LCMSAPI double LCMSEXPORT cmsIT8GetDataDbl(LCMSHANDLE IT8, const char* cPatch, const char* cSample);
+
+LCMSAPI BOOL LCMSEXPORT cmsIT8SetData(LCMSHANDLE IT8, const char* cPatch,
+ const char* cSample,
+ const char *Val);
+
+LCMSAPI BOOL LCMSEXPORT cmsIT8SetDataDbl(LCMSHANDLE hIT8, const char* cPatch,
+ const char* cSample,
+ double Val);
+
+LCMSAPI int LCMSEXPORT cmsIT8GetDataFormat(LCMSHANDLE hIT8, const char* cSample);
+LCMSAPI BOOL LCMSEXPORT cmsIT8SetDataFormat(LCMSHANDLE IT8, int n, const char *Sample);
+LCMSAPI int LCMSEXPORT cmsIT8EnumDataFormat(LCMSHANDLE IT8, char ***SampleNames);
+
+
+LCMSAPI const char* LCMSEXPORT cmsIT8GetPatchName(LCMSHANDLE hIT8, int nPatch, char* buffer);
+
+// The LABEL extension
+
+LCMSAPI int LCMSEXPORT cmsIT8SetTableByLabel(LCMSHANDLE hIT8, const char* cSet, const char* cField, const char* ExpectedType);
+
+// Formatter for double
+LCMSAPI void LCMSEXPORT cmsIT8DefineDblFormat(LCMSHANDLE IT8, const char* Formatter);
+
+
+// ***************************************************************************
+// End of Little cms API From here functions are private
+// You can use them only if using static libraries, and at your own risk of
+// be stripped or changed at futures releases.
+
+#ifndef LCMS_APIONLY
+
+
+// Compatibility with anterior versions-- not needed anymore
+// -- Morge
+
+LCMSAPI void LCMSEXPORT cmsLabEncoded2Float(LPcmsCIELab Lab, const WORD wLab[3]);
+LCMSAPI void LCMSEXPORT cmsLabEncoded2Float4(LPcmsCIELab Lab, const WORD wLab[3]);
+LCMSAPI void LCMSEXPORT cmsFloat2LabEncoded(WORD wLab[3], const cmsCIELab* Lab);
+LCMSAPI void LCMSEXPORT cmsFloat2LabEncoded4(WORD wLab[3], const cmsCIELab* Lab);
+LCMSAPI void LCMSEXPORT cmsXYZEncoded2Float(LPcmsCIEXYZ fxyz, const WORD XYZ[3]);
+LCMSAPI void LCMSEXPORT cmsFloat2XYZEncoded(WORD XYZ[3], const cmsCIEXYZ* fXYZ);
+
+
+// Profiling Extensions --- Would be removed from API in future revisions
+
+LCMSAPI BOOL LCMSEXPORT _cmsAddTextTag(cmsHPROFILE hProfile, icTagSignature sig, const char* Text);
+LCMSAPI BOOL LCMSEXPORT _cmsAddXYZTag(cmsHPROFILE hProfile, icTagSignature sig, const cmsCIEXYZ* XYZ);
+LCMSAPI BOOL LCMSEXPORT _cmsAddLUTTag(cmsHPROFILE hProfile, icTagSignature sig, void* lut);
+LCMSAPI BOOL LCMSEXPORT _cmsAddGammaTag(cmsHPROFILE hProfile, icTagSignature sig, LPGAMMATABLE TransferFunction);
+LCMSAPI BOOL LCMSEXPORT _cmsAddChromaticityTag(cmsHPROFILE hProfile, icTagSignature sig, LPcmsCIExyYTRIPLE Chrm);
+LCMSAPI BOOL LCMSEXPORT _cmsAddSequenceDescriptionTag(cmsHPROFILE hProfile, icTagSignature sig, LPcmsSEQ PSeq);
+LCMSAPI BOOL LCMSEXPORT _cmsAddNamedColorTag(cmsHPROFILE hProfile, icTagSignature sig, LPcmsNAMEDCOLORLIST nc);
+LCMSAPI BOOL LCMSEXPORT _cmsAddDateTimeTag(cmsHPROFILE hProfile, icTagSignature sig, struct tm *DateTime);
+LCMSAPI BOOL LCMSEXPORT _cmsAddColorantTableTag(cmsHPROFILE hProfile, icTagSignature sig, LPcmsNAMEDCOLORLIST nc);
+
+// --------------------------------------------------------------------------------------------------- Inline functions
+
+// Fast floor conversion logic. Thanks to Sree Kotay and Stuart Nixon
+// note than this only works in the range ..-32767...+32767 because
+// mantissa is interpreted as 15.16 fixed point.
+// The union is to avoid pointer aliasing overoptimization.
+
+LCMS_INLINE int _cmsQuickFloor(double val)
+{
+#if USE_DEFAULT_FLOOR_CONVERSION
+ return (int) floor(val);
+#else
+ const double _lcms_double2fixmagic = 68719476736.0 * 1.5; // 2^36 * 1.5, (52-16=36) uses limited precision to floor
+ union {
+ double val;
+ int halves[2];
+ } temp;
+
+ temp.val = val + _lcms_double2fixmagic;
+
+
+#if USE_BIG_ENDIAN
+ return temp.halves[1] >> 16;
+#else
+ return temp.halves[0] >> 16;
+#endif
+#endif
+}
+
+
+
+// Clamp with saturation
+
+LCMS_INLINE WORD _cmsClampWord(int in)
+{
+ if (in < 0) return 0;
+ if (in > 0xFFFF) return 0xFFFFU; // Including marker
+ return (WORD) in;
+}
+
+// ------------------------------------------------------------------------------------------- end of inline functions
+
+// Signal error from inside lcms code
+
+void cdecl cmsSignalError(int ErrorCode, const char *ErrorText, ...);
+
+// Alignment handling (needed in ReadLUT16 and ReadLUT8)
+
+typedef struct {
+ icS15Fixed16Number a;
+ icUInt16Number b;
+
+ } _cmsTestAlign16;
+
+#define SIZEOF_UINT16_ALIGNED (sizeof(_cmsTestAlign16) - sizeof(icS15Fixed16Number))
+
+typedef struct {
+ icS15Fixed16Number a;
+ icUInt8Number b;
+
+ } _cmsTestAlign8;
+
+#define SIZEOF_UINT8_ALIGNED (sizeof(_cmsTestAlign8) - sizeof(icS15Fixed16Number))
+
+
+// Fixed point
+
+
+typedef icInt32Number Fixed32; // Fixed 15.16 whith sign
+
+#define INT_TO_FIXED(x) ((x)<<16)
+#define DOUBLE_TO_FIXED(x) ((Fixed32) ((x)*65536.0+0.5))
+#define FIXED_TO_INT(x) ((x)>>16)
+#define FIXED_REST_TO_INT(x) ((x)& 0xFFFFU)
+#define FIXED_TO_DOUBLE(x) (((double)x)/65536.0)
+#define ROUND_FIXED_TO_INT(x) (((x)+0x8000)>>16)
+
+
+Fixed32 cdecl FixedMul(Fixed32 a, Fixed32 b);
+Fixed32 cdecl FixedSquare(Fixed32 a);
+
+
+#ifdef USE_INLINE
+
+LCMS_INLINE Fixed32 ToFixedDomain(int a) { return a + ((a + 0x7fff) / 0xffff); }
+LCMS_INLINE int FromFixedDomain(Fixed32 a) { return a - ((a + 0x7fff) >> 16); }
+
+#else
+
+Fixed32 cdecl ToFixedDomain(int a); // (a * 65536.0 / 65535.0)
+int cdecl FromFixedDomain(Fixed32 a); // (a * 65535.0 + .5)
+
+#endif
+
+Fixed32 cdecl FixedLERP(Fixed32 a, Fixed32 l, Fixed32 h);
+WORD cdecl FixedScale(WORD a, Fixed32 s);
+
+// Vector & Matrix operations. I'm using the notation frequently found in
+// literature. Mostly 'Graphic Gems' samples. Not to be same routines.
+
+// Vector members
+
+#define VX 0
+#define VY 1
+#define VZ 2
+
+typedef struct { // Fixed 15.16 bits vector
+ Fixed32 n[3];
+ } WVEC3, FAR* LPWVEC3;
+
+typedef struct { // Matrix (Fixed 15.16)
+ WVEC3 v[3];
+ } WMAT3, FAR* LPWMAT3;
+
+
+
+void cdecl VEC3init(LPVEC3 r, double x, double y, double z); // double version
+void cdecl VEC3initF(LPWVEC3 r, double x, double y, double z); // Fix32 version
+void cdecl VEC3toFix(LPWVEC3 r, LPVEC3 v);
+void cdecl VEC3fromFix(LPVEC3 r, LPWVEC3 v);
+void cdecl VEC3scaleFix(LPWORD r, LPWVEC3 Scale);
+void cdecl VEC3swap(LPVEC3 a, LPVEC3 b);
+void cdecl VEC3divK(LPVEC3 r, LPVEC3 v, double d);
+void cdecl VEC3perK(LPVEC3 r, LPVEC3 v, double d);
+void cdecl VEC3minus(LPVEC3 r, LPVEC3 a, LPVEC3 b);
+void cdecl VEC3perComp(LPVEC3 r, LPVEC3 a, LPVEC3 b);
+BOOL cdecl VEC3equal(LPWVEC3 a, LPWVEC3 b, double Tolerance);
+BOOL cdecl VEC3equalF(LPVEC3 a, LPVEC3 b, double Tolerance);
+void cdecl VEC3scaleAndCut(LPWVEC3 r, LPVEC3 v, double d);
+void cdecl VEC3cross(LPVEC3 r, LPVEC3 u, LPVEC3 v);
+void cdecl VEC3saturate(LPVEC3 v);
+double cdecl VEC3distance(LPVEC3 a, LPVEC3 b);
+double cdecl VEC3length(LPVEC3 a);
+
+void cdecl MAT3identity(LPMAT3 a);
+void cdecl MAT3per(LPMAT3 r, LPMAT3 a, LPMAT3 b);
+void cdecl MAT3perK(LPMAT3 r, LPMAT3 v, double d);
+int cdecl MAT3inverse(LPMAT3 a, LPMAT3 b);
+BOOL cdecl MAT3solve(LPVEC3 x, LPMAT3 a, LPVEC3 b);
+double cdecl MAT3det(LPMAT3 m);
+void cdecl MAT3eval(LPVEC3 r, LPMAT3 a, LPVEC3 v);
+void cdecl MAT3toFix(LPWMAT3 r, LPMAT3 v);
+void cdecl MAT3fromFix(LPMAT3 r, LPWMAT3 v);
+void cdecl MAT3evalW(LPWVEC3 r, LPWMAT3 a, LPWVEC3 v);
+BOOL cdecl MAT3isIdentity(LPWMAT3 a, double Tolerance);
+void cdecl MAT3scaleAndCut(LPWMAT3 r, LPMAT3 v, double d);
+
+// Is a table linear?
+
+int cdecl cmsIsLinear(WORD Table[], int nEntries);
+
+// I hold this structures describing domain
+// details mainly for optimization purposes.
+
+struct _lcms_l16params_struc;
+
+typedef void (* _cms3DLERP)(WORD Input[],
+ WORD Output[],
+ WORD LutTable[],
+ struct _lcms_l16params_struc* p);
+
+
+
+typedef struct _lcms_l8opt_struc { // Used on 8 bit interpolations
+
+ unsigned int X0[256], Y0[256], Z0[256];
+ WORD rx[256], ry[256], rz[256];
+
+ } L8PARAMS, FAR* LPL8PARAMS;
+
+typedef struct _lcms_l16params_struc { // Used on 16 bits interpolations
+
+ int nSamples; // Valid on all kinds of tables
+ int nInputs; // != 1 only in 3D interpolation
+ int nOutputs; // != 1 only in 3D interpolation
+
+ WORD Domain;
+
+ int opta1, opta2;
+ int opta3, opta4; // Optimization for 3D LUT
+ int opta5, opta6;
+ int opta7, opta8;
+
+ _cms3DLERP Interp3D; // The interpolation routine
+
+ LPL8PARAMS p8; // Points to some tables for 8-bit speedup
+
+ } L16PARAMS, *LPL16PARAMS;
+
+
+void cdecl cmsCalcL16Params(int nSamples, LPL16PARAMS p);
+void cdecl cmsCalcCLUT16Params(int nSamples, int InputChan, int OutputChan, LPL16PARAMS p);
+void cdecl cmsCalcCLUT16ParamsEx(int nSamples, int InputChan, int OutputChan,
+ BOOL lUseTetrahedral, LPL16PARAMS p);
+
+WORD cdecl cmsLinearInterpLUT16(WORD Value, WORD LutTable[], LPL16PARAMS p);
+Fixed32 cdecl cmsLinearInterpFixed(WORD Value1, WORD LutTable[], LPL16PARAMS p);
+WORD cdecl cmsReverseLinearInterpLUT16(WORD Value, WORD LutTable[], LPL16PARAMS p);
+
+void cdecl cmsTrilinearInterp16(WORD Input[],
+ WORD Output[],
+ WORD LutTable[],
+ LPL16PARAMS p);
+
+void cdecl cmsTetrahedralInterp16(WORD Input[],
+ WORD Output[],
+ WORD LutTable[], LPL16PARAMS p);
+
+void cdecl cmsTetrahedralInterp8(WORD Input[],
+ WORD Output[],
+ WORD LutTable[], LPL16PARAMS p);
+
+// LUT handling
+
+#define LUT_HASMATRIX 0x0001 // Do-op Flags
+#define LUT_HASTL1 0x0002
+#define LUT_HASTL2 0x0008
+#define LUT_HAS3DGRID 0x0010
+
+// New in rev 4.0 of ICC spec
+
+#define LUT_HASMATRIX3 0x0020 // Matrix + offset for LutAToB
+#define LUT_HASMATRIX4 0x0040 // Matrix + offset for LutBToA
+
+#define LUT_HASTL3 0x0100 // '3' curves for LutAToB
+#define LUT_HASTL4 0x0200 // '4' curves for LutBToA
+
+// V4 emulation
+
+#define LUT_V4_OUTPUT_EMULATE_V2 0x10000 // Is a V4 output LUT, emulating V2
+#define LUT_V4_INPUT_EMULATE_V2 0x20000 // Is a V4 input LUT, emulating V2
+#define LUT_V2_OUTPUT_EMULATE_V4 0x40000 // Is a V2 output LUT, emulating V4
+#define LUT_V2_INPUT_EMULATE_V4 0x80000 // Is a V2 input LUT, emulating V4
+
+
+struct _lcms_LUT_struc {
+
+ DWORD wFlags;
+ WMAT3 Matrix; // 15fixed16 matrix
+
+ unsigned int InputChan;
+ unsigned int OutputChan;
+ unsigned int InputEntries;
+ unsigned int OutputEntries;
+ unsigned int cLutPoints;
+
+
+ LPWORD L1[MAXCHANNELS]; // First linearization
+ LPWORD L2[MAXCHANNELS]; // Last linearization
+
+ LPWORD T; // 3D CLUT
+ unsigned int Tsize; // CLUT size in bytes
+
+ // Parameters & Optimizations
+
+ L16PARAMS In16params;
+ L16PARAMS Out16params;
+ L16PARAMS CLut16params;
+
+ int Intent; // Accomplished intent
+
+ // New for Rev 4.0 of spec (reserved)
+
+ WMAT3 Mat3;
+ WVEC3 Ofs3;
+ LPWORD L3[MAXCHANNELS];
+ L16PARAMS L3params;
+ unsigned int L3Entries;
+
+ WMAT3 Mat4;
+ WVEC3 Ofs4;
+ LPWORD L4[MAXCHANNELS];
+ L16PARAMS L4params;
+ unsigned int L4Entries;
+
+ // Gray axes fixup. Only on v2 8-bit Lab LUT
+
+ BOOL FixGrayAxes;
+
+
+ // Parameters used for curve creation
+
+ LCMSGAMMAPARAMS LCurvesBirth[4][MAXCHANNELS];
+
+
+ }; // LUT, FAR* LPLUT;
+
+
+BOOL cdecl _cmsSmoothEndpoints(LPWORD Table, int nEntries);
+
+
+// CRC of gamma tables
+
+unsigned int _cmsCrc32OfGammaTable(LPGAMMATABLE Table);
+
+// Sampled curves
+
+LPSAMPLEDCURVE cdecl cmsAllocSampledCurve(int nItems);
+void cdecl cmsFreeSampledCurve(LPSAMPLEDCURVE p);
+LPSAMPLEDCURVE cdecl cmsDupSampledCurve(LPSAMPLEDCURVE p);
+
+LPSAMPLEDCURVE cdecl cmsConvertGammaToSampledCurve(LPGAMMATABLE Gamma, int nPoints);
+LPGAMMATABLE cdecl cmsConvertSampledCurveToGamma(LPSAMPLEDCURVE Sampled, double Max);
+
+void cdecl cmsEndpointsOfSampledCurve(LPSAMPLEDCURVE p, double* Min, double* Max);
+void cdecl cmsClampSampledCurve(LPSAMPLEDCURVE p, double Min, double Max);
+BOOL cdecl cmsSmoothSampledCurve(LPSAMPLEDCURVE Tab, double SmoothingLambda);
+void cdecl cmsRescaleSampledCurve(LPSAMPLEDCURVE p, double Min, double Max, int nPoints);
+
+LPSAMPLEDCURVE cdecl cmsJoinSampledCurves(LPSAMPLEDCURVE X, LPSAMPLEDCURVE Y, int nResultingPoints);
+
+// Shaper/Matrix handling
+
+#define MATSHAPER_HASMATRIX 0x0001 // Do-ops flags
+#define MATSHAPER_HASSHAPER 0x0002
+#define MATSHAPER_INPUT 0x0004 // Behaviour
+#define MATSHAPER_OUTPUT 0x0008
+#define MATSHAPER_HASINPSHAPER 0x0010
+#define MATSHAPER_ALLSMELTED (MATSHAPER_INPUT|MATSHAPER_OUTPUT)
+
+
+typedef struct {
+ DWORD dwFlags;
+
+ WMAT3 Matrix;
+
+ L16PARAMS p16; // Primary curve
+ LPWORD L[3];
+
+ L16PARAMS p2_16; // Secondary curve (used as input in smelted ones)
+ LPWORD L2[3];
+
+ } MATSHAPER, FAR* LPMATSHAPER;
+
+LPMATSHAPER cdecl cmsAllocMatShaper(LPMAT3 matrix, LPGAMMATABLE Shaper[], DWORD Behaviour);
+LPMATSHAPER cdecl cmsAllocMatShaper2(LPMAT3 matrix, LPGAMMATABLE In[], LPGAMMATABLE Out[], DWORD Behaviour);
+
+void cdecl cmsFreeMatShaper(LPMATSHAPER MatShaper);
+void cdecl cmsEvalMatShaper(LPMATSHAPER MatShaper, WORD In[], WORD Out[]);
+
+BOOL cdecl cmsReadICCMatrixRGB2XYZ(LPMAT3 r, cmsHPROFILE hProfile);
+
+LPMATSHAPER cdecl cmsBuildInputMatrixShaper(cmsHPROFILE InputProfile);
+LPMATSHAPER cdecl cmsBuildOutputMatrixShaper(cmsHPROFILE OutputProfile);
+
+
+
+// White Point & Primary chromas handling
+BOOL cdecl cmsAdaptationMatrix(LPMAT3 r, LPMAT3 ConeMatrix, LPcmsCIEXYZ FromIll, LPcmsCIEXYZ ToIll);
+BOOL cdecl cmsAdaptMatrixToD50(LPMAT3 r, LPcmsCIExyY SourceWhitePt);
+BOOL cdecl cmsAdaptMatrixFromD50(LPMAT3 r, LPcmsCIExyY DestWhitePt);
+
+BOOL cdecl cmsReadChromaticAdaptationMatrix(LPMAT3 r, cmsHPROFILE hProfile);
+
+// Inter-PCS conversion routines. They assume D50 as white point.
+void cdecl cmsXYZ2LabEncoded(WORD XYZ[3], WORD Lab[3]);
+void cdecl cmsLab2XYZEncoded(WORD Lab[3], WORD XYZ[3]);
+
+// Retrieve text representation of WP
+void cdecl _cmsIdentifyWhitePoint(char *Buffer, LPcmsCIEXYZ WhitePt);
+
+// Quantize to WORD in a (MaxSamples - 1) domain
+WORD cdecl _cmsQuantizeVal(double i, int MaxSamples);
+
+LPcmsNAMEDCOLORLIST cdecl cmsAllocNamedColorList(int n);
+int cdecl cmsReadICCnamedColorList(cmsHTRANSFORM xform, cmsHPROFILE hProfile, icTagSignature sig);
+void cdecl cmsFreeNamedColorList(LPcmsNAMEDCOLORLIST List);
+BOOL cdecl cmsAppendNamedColor(cmsHTRANSFORM xform, const char* Name, WORD PCS[3], WORD Colorant[MAXCHANNELS]);
+
+
+// I/O
+
+#define MAX_TABLE_TAG 100
+
+// This is the internal struct holding profile details.
+
+typedef struct _lcms_iccprofile_struct {
+
+ void* stream; // Associated stream. If NULL,
+ // tags are supposed to be in
+ // memory rather than in a file.
+
+ // Only most important items found in ICC profile
+
+ icProfileClassSignature DeviceClass;
+ icColorSpaceSignature ColorSpace;
+ icColorSpaceSignature PCS;
+ icRenderingIntent RenderingIntent;
+ icUInt32Number flags;
+ icUInt32Number attributes;
+ cmsCIEXYZ Illuminant;
+
+ // Additions for V4 profiles
+
+ icUInt32Number Version;
+ MAT3 ChromaticAdaptation;
+ cmsCIEXYZ MediaWhitePoint;
+ cmsCIEXYZ MediaBlackPoint;
+ BYTE ProfileID[16];
+
+
+ // Dictionary
+
+ icInt32Number TagCount;
+ icTagSignature TagNames[MAX_TABLE_TAG];
+ size_t TagSizes[MAX_TABLE_TAG];
+ size_t TagOffsets[MAX_TABLE_TAG];
+ LPVOID TagPtrs[MAX_TABLE_TAG];
+
+ char PhysicalFile[MAX_PATH];
+
+ BOOL IsWrite;
+ BOOL SaveAs8Bits;
+
+ struct tm Created;
+
+ // I/O handlers
+
+ size_t (* Read)(void *buffer, size_t size, size_t count, struct _lcms_iccprofile_struct* Icc);
+
+ BOOL (* Seek)(struct _lcms_iccprofile_struct* Icc, size_t offset);
+ BOOL (* Close)(struct _lcms_iccprofile_struct* Icc);
+ size_t (* Tell)(struct _lcms_iccprofile_struct* Icc);
+
+ // Writting
+
+ BOOL (* Write)(struct _lcms_iccprofile_struct* Icc, size_t size, LPVOID Ptr);
+
+ size_t UsedSpace;
+
+
+ } LCMSICCPROFILE, FAR* LPLCMSICCPROFILE;
+
+
+// Create an empty template for virtual profiles
+cmsHPROFILE cdecl _cmsCreateProfilePlaceholder(void);
+
+// Search into tag dictionary
+icInt32Number cdecl _cmsSearchTag(LPLCMSICCPROFILE Profile, icTagSignature sig, BOOL lSignalError);
+
+// Search for a particular tag, replace if found or add new one else
+LPVOID _cmsInitTag(LPLCMSICCPROFILE Icc, icTagSignature sig, size_t size, const void* Init);
+
+
+LPLCMSICCPROFILE cdecl _cmsCreateProfileFromFilePlaceholder(const char* FileName);
+LPLCMSICCPROFILE cdecl _cmsCreateProfileFromMemPlaceholder(LPVOID MemPtr, DWORD dwSize);
+
+void _cmsSetSaveToDisk(LPLCMSICCPROFILE Icc, const char* FileName);
+void _cmsSetSaveToMemory(LPLCMSICCPROFILE Icc, LPVOID MemPtr, size_t dwSize);
+
+
+
+// These macros unpack format specifiers into integers
+
+#define T_COLORSPACE(s) (((s)>>16)&31)
+#define T_SWAPFIRST(s) (((s)>>14)&1)
+#define T_FLAVOR(s) (((s)>>13)&1)
+#define T_PLANAR(p) (((p)>>12)&1)
+#define T_ENDIAN16(e) (((e)>>11)&1)
+#define T_DOSWAP(e) (((e)>>10)&1)
+#define T_EXTRA(e) (((e)>>7)&7)
+#define T_CHANNELS(c) (((c)>>3)&15)
+#define T_BYTES(b) ((b)&7)
+
+
+
+// Internal XFORM struct
+struct _cmstransform_struct;
+
+// Full xform
+typedef void (* _cmsCOLORCALLBACKFN)(struct _cmstransform_struct *Transform,
+ LPVOID InputBuffer,
+ LPVOID OutputBuffer, unsigned int Size);
+
+// intermediate pass, from WORD[] to WORD[]
+
+typedef void (* _cmsADJFN)(WORD In[], WORD Out[], LPWMAT3 m, LPWVEC3 b);
+
+typedef void (* _cmsTRANSFN)(struct _cmstransform_struct *Transform,
+ WORD In[], WORD Out[]);
+
+typedef void (* _cmsCNVRT)(WORD In[], WORD Out[]);
+
+typedef LPBYTE (* _cmsFIXFN)(register struct _cmstransform_struct *info,
+ register WORD ToUnroll[],
+ register LPBYTE Buffer);
+
+
+
+// Transformation
+typedef struct _cmstransform_struct {
+
+ // Keep formats for further reference
+ DWORD InputFormat, OutputFormat;
+
+ DWORD StrideIn, StrideOut; // Planar support
+
+ int Intent, ProofIntent;
+ int DoGamutCheck;
+
+
+ cmsHPROFILE InputProfile;
+ cmsHPROFILE OutputProfile;
+ cmsHPROFILE PreviewProfile;
+
+ icColorSpaceSignature EntryColorSpace;
+ icColorSpaceSignature ExitColorSpace;
+
+ WMAT3 m1, m2; // Matrix holding inter PCS operation
+ WVEC3 of1, of2; // Offset terms
+
+ _cmsCOLORCALLBACKFN xform;
+
+ // Steps in xFORM
+
+ _cmsFIXFN FromInput;
+ _cmsTRANSFN FromDevice;
+ _cmsADJFN Stage1;
+ _cmsADJFN Stage2;
+ _cmsTRANSFN ToDevice;
+ _cmsFIXFN ToOutput;
+
+ // LUTs
+
+ LPLUT Device2PCS;
+ LPLUT PCS2Device;
+ LPLUT Gamut; // Gamut check
+ LPLUT Preview; // Preview (Proof)
+
+ LPLUT DeviceLink; // Precalculated grid - device link profile
+ LPLUT GamutCheck; // Precalculated device -> gamut check
+
+ // Matrix/Shapers
+
+ LPMATSHAPER InMatShaper;
+ LPMATSHAPER OutMatShaper;
+ LPMATSHAPER SmeltMatShaper;
+
+
+ // Phase of Lab/XYZ, Abs/Rel
+
+ int Phase1, Phase2, Phase3;
+
+ // Named color table
+
+ LPcmsNAMEDCOLORLIST NamedColorList;
+
+ // Flag for transform involving v4 profiles
+
+ BOOL lInputV4Lab, lOutputV4Lab;
+
+ // 1-pixel cache
+
+ WORD CacheIn[MAXCHANNELS];
+ WORD CacheOut[MAXCHANNELS];
+
+
+ double AdaptationState; // Figure for v4 incomplete state of adaptation
+
+
+ } _cmsTRANSFORM,FAR *_LPcmsTRANSFORM;
+
+
+
+// Packing & Unpacking
+
+_cmsFIXFN cdecl _cmsIdentifyInputFormat(_LPcmsTRANSFORM xform, DWORD dwInput);
+_cmsFIXFN cdecl _cmsIdentifyOutputFormat(_LPcmsTRANSFORM xform, DWORD dwOutput);
+
+
+// Conversion
+
+#define XYZRel 0
+#define LabRel 1
+
+
+int cdecl cmsChooseCnvrt(int Absolute,
+ int Phase1, LPcmsCIEXYZ BlackPointIn,
+ LPcmsCIEXYZ WhitePointIn,
+ LPcmsCIEXYZ IlluminantIn,
+ LPMAT3 ChromaticAdaptationMatrixIn,
+
+ int Phase2, LPcmsCIEXYZ BlackPointOut,
+ LPcmsCIEXYZ WhitePointOut,
+ LPcmsCIEXYZ IlluminantOut,
+ LPMAT3 ChromaticAdaptationMatrixOut,
+ int DoBPC,
+ double AdaptationState,
+ _cmsADJFN *fn1,
+ LPWMAT3 wm, LPWVEC3 wof);
+
+
+
+// Clamping & Gamut handling
+
+BOOL cdecl _cmsEndPointsBySpace(icColorSpaceSignature Space,
+ WORD **White, WORD **Black, int *nOutputs);
+
+WORD * cdecl _cmsWhiteBySpace(icColorSpaceSignature Space);
+
+
+
+WORD cdecl Clamp_L(Fixed32 in);
+WORD cdecl Clamp_ab(Fixed32 in);
+
+// Detection of black point
+
+#define LCMS_BPFLAGS_D50_ADAPTED 0x0001
+
+int cdecl cmsDetectBlackPoint(LPcmsCIEXYZ BlackPoint, cmsHPROFILE hProfile, int Intent, DWORD dwFlags);
+
+// choose reasonable resolution
+int cdecl _cmsReasonableGridpointsByColorspace(icColorSpaceSignature Colorspace, DWORD dwFlags);
+
+// Precalculate device link
+LPLUT cdecl _cmsPrecalculateDeviceLink(cmsHTRANSFORM h, DWORD dwFlags);
+
+// Precalculate black preserving device link
+LPLUT _cmsPrecalculateBlackPreservingDeviceLink(cmsHTRANSFORM hCMYK2CMYK, DWORD dwFlags);
+
+// Precalculate gamut check
+LPLUT cdecl _cmsPrecalculateGamutCheck(cmsHTRANSFORM h);
+
+// Hot fixes bad profiles
+BOOL cdecl _cmsFixWhiteMisalignment(_LPcmsTRANSFORM p);
+
+// Marks LUT as 8 bit on input
+LPLUT cdecl _cmsBlessLUT8(LPLUT Lut);
+
+// Compute gamut boundary
+LPLUT cdecl _cmsComputeGamutLUT(cmsHPROFILE hProfile, int Intent);
+
+// Compute softproof
+LPLUT cdecl _cmsComputeSoftProofLUT(cmsHPROFILE hProfile, int nIntent);
+
+// Find a suitable prelinearization tables, matching the given transform
+void cdecl _cmsComputePrelinearizationTablesFromXFORM(cmsHTRANSFORM h[], int nTransforms, LPLUT Grid);
+
+
+// Build a tone curve for K->K' if possible (only works on CMYK)
+LPGAMMATABLE _cmsBuildKToneCurve(cmsHTRANSFORM hCMYK2CMYK, int nPoints);
+
+// These are two VITAL macros, from converting between 8 and 16 bit
+// representation.
+
+#define RGB_8_TO_16(rgb) (WORD) ((((WORD) (rgb)) << 8)|(rgb))
+#define RGB_16_TO_8(rgb) (BYTE) ((((rgb) * 65281 + 8388608) >> 24) & 0xFF)
+
+
+#endif // LCMS_APIONLY
+
+
+#define __cms_H
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif
+
diff --git a/icc2ps/xgetopt.c b/icc2ps/xgetopt.c
new file mode 100755
index 0000000..3eb08fe
--- /dev/null
+++ b/icc2ps/xgetopt.c
@@ -0,0 +1,75 @@
+/*
+ getopt.c
+
+*/
+
+#include <errno.h>
+#include <string.h>
+#include <stdio.h>
+
+int xoptind = 1; /* index of which argument is next */
+char *xoptarg; /* pointer to argument of current option */
+int xopterr = 0; /* allow error message */
+
+static char *letP = NULL; /* remember next option char's location */
+char SW = '-'; /* DOS switch character, either '-' or '/' */
+
+/*
+ Parse the command line options, System V style.
+
+ Standard option syntax is:
+
+ option ::= SW [optLetter]* [argLetter space* argument]
+
+*/
+
+int xgetopt(int argc, char *argv[], char *optionS)
+{
+ unsigned char ch;
+ char *optP;
+
+ if (SW == 0) {
+ SW = '/';
+ }
+
+ if (argc > xoptind) {
+ if (letP == NULL) {
+ if ((letP = argv[xoptind]) == NULL ||
+ *(letP++) != SW) goto gopEOF;
+ if (*letP == SW) {
+ xoptind++; goto gopEOF;
+ }
+ }
+ if (0 == (ch = *(letP++))) {
+ xoptind++; goto gopEOF;
+ }
+ if (':' == ch || (optP = strchr(optionS, ch)) == NULL)
+ goto gopError;
+ if (':' == *(++optP)) {
+ xoptind++;
+ if (0 == *letP) {
+ if (argc <= xoptind) goto gopError;
+ letP = argv[xoptind++];
+ }
+ xoptarg = letP;
+ letP = NULL;
+ } else {
+ if (0 == *letP) {
+ xoptind++;
+ letP = NULL;
+ }
+ xoptarg = NULL;
+ }
+ return ch;
+ }
+gopEOF:
+ xoptarg = letP = NULL;
+ return EOF;
+
+gopError:
+ xoptarg = NULL;
+ errno = EINVAL;
+ if (xopterr)
+ perror ("get command line option");
+ return ('?');
+}
diff --git a/jbig.c b/jbig.c
new file mode 100644
index 0000000..6631472
--- /dev/null
+++ b/jbig.c
@@ -0,0 +1,3194 @@
+/*
+ * Portable Free JBIG image compression library
+ *
+ * Markus Kuhn -- http://www.cl.cam.ac.uk/~mgk25/
+ *
+ * Id: jbig.c,v 1.22 2004-06-11 15:17:06+01 mgk25 Exp $
+ * $Id: jbig.c,v 1.4 2004/06/12 02:33:05 rick Exp $
+ *
+ * This module implements a portable standard C encoder and decoder
+ * using the JBIG lossless bi-level image compression algorithm as
+ * specified in International Standard ISO 11544:1993 or equivalently
+ * as specified in ITU-T Recommendation T.82. See the file jbig.doc
+ * for usage instructions and application examples.
+ *
+ * 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.
+ *
+ * If you want to use this program under different license conditions,
+ * then contact the author for an arrangement.
+ *
+ * It is possible that certain products which can be built using this
+ * software module might form inventions protected by patent rights in
+ * some countries (e.g., by patents about arithmetic coding algorithms
+ * owned by IBM and AT&T in the USA). Provision of this software by the
+ * author does NOT include any licences for any patents. In those
+ * countries where a patent licence is required for certain applications
+ * of this software module, you will have to obtain such a licence
+ * yourself.
+ */
+
+#ifdef DEBUG
+#include <stdio.h>
+#else
+#define NDEBUG
+#endif
+
+#include <stdlib.h>
+#include <string.h>
+#include <assert.h>
+
+#include "jbig.h"
+
+
+/* optional export of arithmetic coder functions for test purposes */
+#ifdef TEST_CODEC
+#define ARITH
+#define ARITH_INL
+#else
+#define ARITH static
+#ifdef __GNUC__
+#define ARITH_INL static __inline__
+#else
+#define ARITH_INL static
+#endif
+#endif
+
+#define MX_MAX 127 /* maximal supported mx offset for
+ * adaptive template in the encoder */
+
+#define TPB2CX 0x195 /* contexts for TP special pixels */
+#define TPB3CX 0x0e5
+#define TPDCX 0xc3f
+
+/* marker codes */
+#define MARKER_STUFF 0x00
+#define MARKER_RESERVE 0x01
+#define MARKER_SDNORM 0x02
+#define MARKER_SDRST 0x03
+#define MARKER_ABORT 0x04
+#define MARKER_NEWLEN 0x05
+#define MARKER_ATMOVE 0x06
+#define MARKER_COMMENT 0x07
+#define MARKER_ESC 0xff
+
+/* loop array indices */
+#define STRIPE 0
+#define LAYER 1
+#define PLANE 2
+
+/* special jbg_buf pointers (instead of NULL) */
+#define SDE_DONE ((struct jbg_buf *) -1)
+#define SDE_TODO ((struct jbg_buf *) 0)
+
+/* object code version id */
+
+const char jbg_version[] =
+" JBIG-KIT " JBG_VERSION " -- Markus Kuhn -- "
+"$Id: jbig.c,v 1.4 2004/06/12 02:33:05 rick Exp $ ";
+
+/*
+ * the following array specifies for each combination of the 3
+ * ordering bits, which ii[] variable represents which dimension
+ * of s->sde.
+ */
+static const int iindex[8][3] = {
+ { 2, 1, 0 }, /* no ordering bit set */
+ { -1, -1, -1}, /* SMID -> illegal combination */
+ { 2, 0, 1 }, /* ILEAVE */
+ { 1, 0, 2 }, /* SMID + ILEAVE */
+ { 0, 2, 1 }, /* SEQ */
+ { 1, 2, 0 }, /* SEQ + SMID */
+ { 0, 1, 2 }, /* SEQ + ILEAVE */
+ { -1, -1, -1 } /* SEQ + SMID + ILEAVE -> illegal combination */
+};
+
+
+/*
+ * Array [language][message] with text string error messages that correspond
+ * to return values from public functions in this library.
+ */
+#define NEMSG 9 /* number of error codes */
+#define NEMSG_LANG 3 /* number of supported languages */
+static const char *errmsg[NEMSG_LANG][NEMSG] = {
+ /* English (JBG_EN) */
+ {
+ "Everything is ok", /* JBG_EOK */
+ "Reached specified maximum size", /* JBG_EOK_INTR */
+ "Unexpected end of data", /* JBG_EAGAIN */
+ "Not enough memory available", /* JBG_ENOMEM */
+ "ABORT marker found", /* JBG_EABORT */
+ "Unknown marker segment encountered", /* JBG_EMARKER */
+ "Incremental BIE does not fit to previous one", /* JBG_ENOCONT */
+ "Invalid data encountered", /* JBG_EINVAL */
+ "Unimplemented features used" /* JBG_EIMPL */
+ },
+ /* German (JBG_DE_8859_1) */
+ {
+ "Kein Problem aufgetreten", /* JBG_EOK */
+ "Angegebene maximale Bildgr\366\337e erreicht", /* JBG_EOK_INTR */
+ "Unerwartetes Ende der Daten", /* JBG_EAGAIN */
+ "Nicht gen\374gend Speicher vorhanden", /* JBG_ENOMEM */
+ "Es wurde eine Abbruch-Sequenz gefunden", /* JBG_EABORT */
+ "Eine unbekannte Markierungssequenz wurde gefunden", /* JBG_EMARKER */
+ "Neue Daten passen nicht zu vorangegangenen Daten", /* JBG_ENOCONT */
+ "Es wurden ung\374ltige Daten gefunden", /* JBG_EINVAL */
+ "Noch nicht implementierte Optionen wurden benutzt" /* JBG_EIMPL */
+ },
+ /* German (JBG_DE_UTF_8) */
+ {
+ "Kein Problem aufgetreten", /* JBG_EOK */
+ "Angegebene maximale Bildgr\303\266\303\237e erreicht", /* JBG_EOK_INTR */
+ "Unerwartetes Ende der Daten", /* JBG_EAGAIN */
+ "Nicht gen\303\274gend Speicher vorhanden", /* JBG_ENOMEM */
+ "Es wurde eine Abbruch-Sequenz gefunden", /* JBG_EABORT */
+ "Eine unbekannte Markierungssequenz wurde gefunden", /* JBG_EMARKER */
+ "Neue Daten passen nicht zu vorangegangenen Daten", /* JBG_ENOCONT */
+ "Es wurden ung\303\274ltige Daten gefunden", /* JBG_EINVAL */
+ "Noch nicht implementierte Optionen wurden benutzt" /* JBG_EIMPL */
+ }
+};
+
+
+
+/*
+ * The following three functions are the only places in this code, were
+ * C library memory management functions are called. The whole JBIG
+ * library has been designed in order to allow multi-threaded
+ * execution. No static or global variables are used, so all fuctions
+ * are fully reentrant. However if you want to use this multi-thread
+ * capability and your malloc, realloc and free are not reentrant,
+ * then simply add the necessary semaphores or mutex primitives below.
+ * In contrast to C's malloc() and realloc(), but like C's calloc(),
+ * these functions take two parameters nmemb and size that are multiplied
+ * before being passed on to the corresponding C function.
+ * This we can catch all overflows during a size_t multiplication a
+ * a single place.
+ */
+
+#ifndef SIZE_MAX
+#define SIZE_MAX ((size_t) -1) /* largest value of size_t */
+#endif
+
+static void *checked_malloc(size_t nmemb, size_t size)
+{
+ void *p;
+
+ /* Full manual exception handling is ugly here for performance
+ * reasons. If an adequate handling of lack of memory is required,
+ * then use C++ and throw a C++ exception instead of abort(). */
+
+ /* assert that nmemb * size <= SIZE_MAX */
+ if (size > SIZE_MAX / nmemb)
+ abort();
+
+ p = malloc(nmemb * size);
+
+ if (!p)
+ abort();
+
+#if 0
+ fprintf(stderr, "%p = malloc(%lu * %lu)\n", p,
+ (unsigned long) nmemb, (unsigned long) size);
+#endif
+
+ return p;
+}
+
+
+static void *checked_realloc(void *ptr, size_t nmemb, size_t size)
+{
+ void *p;
+
+ /* Full manual exception handling is ugly here for performance
+ * reasons. If an adequate handling of lack of memory is required,
+ * then use C++ and throw a C++ exception here instead of abort(). */
+
+ /* assert that nmemb * size <= SIZE_MAX */
+ if (size > SIZE_MAX / nmemb)
+ abort();
+
+ p = realloc(ptr, nmemb * size);
+
+ if (!p)
+ abort();
+
+#if 0
+ fprintf(stderr, "%p = realloc(%p, %lu * %lu)\n", p, ptr,
+ (unsigned long) nmemb, (unsigned long) size);
+#endif
+
+ return p;
+}
+
+
+static void checked_free(void *ptr)
+{
+ free(ptr);
+
+#if 0
+ fprintf(stderr, "free(%p)\n", ptr);
+#endif
+
+}
+
+
+
+/*
+ * The next functions implement the arithmedic encoder and decoder
+ * required for JBIG. The same algorithm is also used in the arithmetic
+ * variant of JPEG.
+ */
+
+#ifdef DEBUG
+static long encoded_pixels = 0;
+#endif
+
+ARITH void arith_encode_init(struct jbg_arenc_state *s, int reuse_st)
+{
+ int i;
+
+ if (!reuse_st)
+ for (i = 0; i < 4096; s->st[i++] = 0);
+ s->c = 0;
+ s->a = 0x10000L;
+ s->sc = 0;
+ s->ct = 11;
+ s->buffer = -1; /* empty */
+
+ return;
+}
+
+
+ARITH void arith_encode_flush(struct jbg_arenc_state *s)
+{
+ unsigned long temp;
+
+#ifdef DEBUG
+ fprintf(stderr, " encoded pixels = %ld, a = %05lx, c = %08lx\n",
+ encoded_pixels, s->a, s->c);
+#endif
+
+ /* find the s->c in the coding interval with the largest
+ * number of trailing zero bits */
+ if ((temp = (s->a - 1 + s->c) & 0xffff0000L) < s->c)
+ s->c = temp + 0x8000;
+ else
+ s->c = temp;
+ /* send remaining bytes to output */
+ s->c <<= s->ct;
+ if (s->c & 0xf8000000L) {
+ /* one final overflow has to be handled */
+ if (s->buffer >= 0) {
+ s->byte_out(s->buffer + 1, s->file);
+ if (s->buffer + 1 == MARKER_ESC)
+ s->byte_out(MARKER_STUFF, s->file);
+ }
+ /* output 0x00 bytes only when more non-0x00 will follow */
+ if (s->c & 0x7fff800L)
+ for (; s->sc; --s->sc)
+ s->byte_out(0x00, s->file);
+ } else {
+ if (s->buffer >= 0)
+ s->byte_out(s->buffer, s->file);
+ /* T.82 figure 30 says buffer+1 for the above line! Typo? */
+ for (; s->sc; --s->sc) {
+ s->byte_out(0xff, s->file);
+ s->byte_out(MARKER_STUFF, s->file);
+ }
+ }
+ /* output final bytes only if they are not 0x00 */
+ if (s->c & 0x7fff800L) {
+ s->byte_out((s->c >> 19) & 0xff, s->file);
+ if (((s->c >> 19) & 0xff) == MARKER_ESC)
+ s->byte_out(MARKER_STUFF, s->file);
+ if (s->c & 0x7f800L) {
+ s->byte_out((s->c >> 11) & 0xff, s->file);
+ if (((s->c >> 11) & 0xff) == MARKER_ESC)
+ s->byte_out(MARKER_STUFF, s->file);
+ }
+ }
+
+ return;
+}
+
+
+ARITH_INL void arith_encode(struct jbg_arenc_state *s, int cx, int pix)
+{
+ extern short jbg_lsz[];
+ extern unsigned char jbg_nmps[], jbg_nlps[];
+ register unsigned lsz, ss;
+ register unsigned char *st;
+ long temp;
+
+#ifdef DEBUG
+ ++encoded_pixels;
+#endif
+
+ assert(cx >= 0 && cx < 4096);
+ st = s->st + cx;
+ ss = *st & 0x7f;
+ assert(ss < 113);
+ lsz = jbg_lsz[ss];
+
+#if 0
+ fprintf(stderr, "pix = %d, cx = %d, mps = %d, st = %3d, lsz = 0x%04x, "
+ "a = 0x%05lx, c = 0x%08lx, ct = %2d, buf = 0x%02x\n",
+ pix, cx, !!(s->st[cx] & 0x80), ss, lsz, s->a, s->c, s->ct,
+ s->buffer);
+#endif
+
+ if (((pix << 7) ^ s->st[cx]) & 0x80) {
+ /* encode the less probable symbol */
+ if ((s->a -= lsz) >= lsz) {
+ /* If the interval size (lsz) for the less probable symbol (LPS)
+ * is larger than the interval size for the MPS, then exchange
+ * the two symbols for coding efficiency, otherwise code the LPS
+ * as usual: */
+ s->c += s->a;
+ s->a = lsz;
+ }
+ /* Check whether MPS/LPS exchange is necessary
+ * and chose next probability estimator status */
+ *st &= 0x80;
+ *st ^= jbg_nlps[ss];
+ } else {
+ /* encode the more probable symbol */
+ if ((s->a -= lsz) & 0xffff8000L)
+ return; /* A >= 0x8000 -> ready, no renormalization required */
+ if (s->a < lsz) {
+ /* If the interval size (lsz) for the less probable symbol (LPS)
+ * is larger than the interval size for the MPS, then exchange
+ * the two symbols for coding efficiency: */
+ s->c += s->a;
+ s->a = lsz;
+ }
+ /* chose next probability estimator status */
+ *st &= 0x80;
+ *st |= jbg_nmps[ss];
+ }
+
+ /* renormalization of coding interval */
+ do {
+ s->a <<= 1;
+ s->c <<= 1;
+ --s->ct;
+ if (s->ct == 0) {
+ /* another byte is ready for output */
+ temp = s->c >> 19;
+ if (temp & 0xffffff00L) {
+ /* handle overflow over all buffered 0xff bytes */
+ if (s->buffer >= 0) {
+ ++s->buffer;
+ s->byte_out(s->buffer, s->file);
+ if (s->buffer == MARKER_ESC)
+ s->byte_out(MARKER_STUFF, s->file);
+ }
+ for (; s->sc; --s->sc)
+ s->byte_out(0x00, s->file);
+ s->buffer = temp & 0xff; /* new output byte, might overflow later */
+ assert(s->buffer != 0xff);
+ /* can s->buffer really never become 0xff here? */
+ } else if (temp == 0xff) {
+ /* buffer 0xff byte (which might overflow later) */
+ ++s->sc;
+ } else {
+ /* output all buffered 0xff bytes, they will not overflow any more */
+ if (s->buffer >= 0)
+ s->byte_out(s->buffer, s->file);
+ for (; s->sc; --s->sc) {
+ s->byte_out(0xff, s->file);
+ s->byte_out(MARKER_STUFF, s->file);
+ }
+ s->buffer = temp; /* buffer new output byte (can still overflow) */
+ }
+ s->c &= 0x7ffffL;
+ s->ct = 8;
+ }
+ } while (s->a < 0x8000);
+
+ return;
+}
+
+
+ARITH void arith_decode_init(struct jbg_ardec_state *s, int reuse_st)
+{
+ int i;
+
+ if (!reuse_st)
+ for (i = 0; i < 4096; s->st[i++] = 0);
+ s->c = 0;
+ s->a = 1;
+ s->ct = 0;
+ s->result = JBG_OK;
+ s->startup = 1;
+ return;
+}
+
+
+ARITH_INL int arith_decode(struct jbg_ardec_state *s, int cx)
+{
+ extern short jbg_lsz[];
+ extern unsigned char jbg_nmps[], jbg_nlps[];
+ register unsigned lsz, ss;
+ register unsigned char *st;
+ int pix;
+
+ /* renormalization */
+ while (s->a < 0x8000 || s->startup) {
+ if (s->ct < 1 && s->result != JBG_READY) {
+ /* first we have to move a new byte into s->c */
+ if (s->pscd_ptr >= s->pscd_end) {
+ s->result = JBG_MORE;
+ return -1;
+ }
+ if (*s->pscd_ptr == 0xff)
+ if (s->pscd_ptr + 1 >= s->pscd_end) {
+ s->result = JBG_MARKER;
+ return -1;
+ } else {
+ if (*(s->pscd_ptr + 1) == MARKER_STUFF) {
+ s->c |= 0xffL << (8 - s->ct);
+ s->ct += 8;
+ s->pscd_ptr += 2;
+ s->result = JBG_OK;
+ } else
+ s->result = JBG_READY;
+ }
+ else {
+ s->c |= (long)*(s->pscd_ptr++) << (8 - s->ct);
+ s->ct += 8;
+ s->result = JBG_OK;
+ }
+ }
+ s->c <<= 1;
+ s->a <<= 1;
+ --s->ct;
+ if (s->a == 0x10000L)
+ s->startup = 0;
+ }
+
+ st = s->st + cx;
+ ss = *st & 0x7f;
+ assert(ss < 113);
+ lsz = jbg_lsz[ss];
+
+#if 0
+ fprintf(stderr, "cx = %d, mps = %d, st = %3d, lsz = 0x%04x, a = 0x%05lx, "
+ "c = 0x%08lx, ct = %2d\n",
+ cx, !!(s->st[cx] & 0x80), ss, lsz, s->a, s->c, s->ct);
+#endif
+
+ if ((s->c >> 16) < (s->a -= lsz))
+ if (s->a & 0xffff8000L)
+ return *st >> 7;
+ else {
+ /* MPS_EXCHANGE */
+ if (s->a < lsz) {
+ pix = 1 - (*st >> 7);
+ /* Check whether MPS/LPS exchange is necessary
+ * and chose next probability estimator status */
+ *st &= 0x80;
+ *st ^= jbg_nlps[ss];
+ } else {
+ pix = *st >> 7;
+ *st &= 0x80;
+ *st |= jbg_nmps[ss];
+ }
+ }
+ else {
+ /* LPS_EXCHANGE */
+ if (s->a < lsz) {
+ s->c -= s->a << 16;
+ s->a = lsz;
+ pix = *st >> 7;
+ *st &= 0x80;
+ *st |= jbg_nmps[ss];
+ } else {
+ s->c -= s->a << 16;
+ s->a = lsz;
+ pix = 1 - (*st >> 7);
+ /* Check whether MPS/LPS exchange is necessary
+ * and chose next probability estimator status */
+ *st &= 0x80;
+ *st ^= jbg_nlps[ss];
+ }
+ }
+
+ return pix;
+}
+
+
+
+/*
+ * Memory management for buffers which are used for temporarily
+ * storing SDEs by the encoder.
+ *
+ * The following functions manage a set of struct jbg_buf storage
+ * containers were each can keep JBG_BUFSIZE bytes. The jbg_buf
+ * containers can be linked to form linear double-chained lists for
+ * which a number of operations are provided. Blocks which are
+ * tempoarily not used any more are returned to a freelist which each
+ * encoder keeps. Only the destructor of the encoder actually returns
+ * the block via checked_free() to the stdlib memory management.
+ */
+
+
+/*
+ * Allocate a new buffer block and initialize it. Try to get it from
+ * the free_list, and if it is empty, call checked_malloc().
+ */
+static struct jbg_buf *jbg_buf_init(struct jbg_buf **free_list)
+{
+ struct jbg_buf *new_block;
+
+ /* Test whether a block from the free list is available */
+ if (*free_list) {
+ new_block = *free_list;
+ *free_list = new_block->next;
+ } else {
+ /* request a new memory block */
+ new_block = (struct jbg_buf *) checked_malloc(1, sizeof(struct jbg_buf));
+ }
+ new_block->len = 0;
+ new_block->next = NULL;
+ new_block->previous = NULL;
+ new_block->last = new_block;
+ new_block->free_list = free_list;
+
+ return new_block;
+}
+
+
+/*
+ * Return an entire free_list to the memory management of stdlib.
+ * This is only done by jbg_enc_free().
+ */
+static void jbg_buf_free(struct jbg_buf **free_list)
+{
+ struct jbg_buf *tmp;
+
+ while (*free_list) {
+ tmp = (*free_list)->next;
+ checked_free(*free_list);
+ *free_list = tmp;
+ }
+
+ return;
+}
+
+
+/*
+ * Append a single byte to a single list that starts with the block
+ * *(struct jbg_buf *) head. The type of *head is void here in order to
+ * keep the interface of the arithmetic encoder gereric, which uses this
+ * function as a call-back function in order to deliver single bytes
+ * for a PSCD.
+ */
+static void jbg_buf_write(int b, void *head)
+{
+ struct jbg_buf *now;
+
+ now = ((struct jbg_buf *) head)->last;
+ if (now->len < JBG_BUFSIZE - 1) {
+ now->d[now->len++] = b;
+ return;
+ }
+ now->next = jbg_buf_init(((struct jbg_buf *) head)->free_list);
+ now->next->previous = now;
+ now->next->d[now->next->len++] = b;
+ ((struct jbg_buf *) head)->last = now->next;
+
+ return;
+}
+
+
+/*
+ * Remove any trailing zero bytes from the end of a linked jbg_buf list,
+ * however make sure that no zero byte is removed which directly
+ * follows a 0xff byte (i.e., keep MARKER_ESC MARKER_STUFF sequences
+ * intact). This function is used to remove any redundant final zero
+ * bytes from a PSCD.
+ */
+static void jbg_buf_remove_zeros(struct jbg_buf *head)
+{
+ struct jbg_buf *last;
+
+ while (1) {
+ /* remove trailing 0x00 in last block of list until this block is empty */
+ last = head->last;
+ while (last->len && last->d[last->len - 1] == 0)
+ last->len--;
+ /* if block became really empty, remove it in case it is not the
+ * only remaining block and then loop to next block */
+ if (last->previous && !last->len) {
+ head->last->next = *head->free_list;
+ *head->free_list = head->last;
+ head->last = last->previous;
+ head->last->next = NULL;
+ } else
+ break;
+ }
+
+ /*
+ * If the final non-zero byte is 0xff (MARKER_ESC), then we just have
+ * removed a MARKER_STUFF and we will append it again now in order
+ * to preserve PSCD status of byte stream.
+ */
+ if (head->last->len && head->last->d[head->last->len - 1] == MARKER_ESC)
+ jbg_buf_write(MARKER_STUFF, head);
+
+ return;
+}
+
+
+/*
+ * The jbg_buf list which starts with block *new_prefix is concatenated
+ * with the list which starts with block **start and *start will then point
+ * to the first block of the new list.
+ */
+static void jbg_buf_prefix(struct jbg_buf *new_prefix, struct jbg_buf **start)
+{
+ new_prefix->last->next = *start;
+ new_prefix->last->next->previous = new_prefix->last;
+ new_prefix->last = new_prefix->last->next->last;
+ *start = new_prefix;
+
+ return;
+}
+
+
+/*
+ * Send the contents of a jbg_buf list that starts with block **head to
+ * the call back function data_out and return the blocks of the jbg_buf
+ * list to the freelist from which these jbg_buf blocks have been taken.
+ * After the call, *head == NULL.
+ */
+static void jbg_buf_output(struct jbg_buf **head,
+ void (*data_out)(unsigned char *start,
+ size_t len, void *file),
+ void *file)
+{
+ struct jbg_buf *tmp;
+
+ while (*head) {
+ data_out((*head)->d, (*head)->len, file);
+ tmp = (*head)->next;
+ (*head)->next = *(*head)->free_list;
+ *(*head)->free_list = *head;
+ *head = tmp;
+ }
+
+ return;
+}
+
+
+/*
+ * Calculate y = ceil(x/2) applied n times, which is equivalent to
+ * y = ceil(x/(2^n)). This function is used to
+ * determine the number of pixels per row or column after n resolution
+ * reductions. E.g. X[d-1] = jbg_ceil_half(X[d], 1) and X[0] =
+ * jbg_ceil_half(X[d], d) as defined in clause 6.2.3 of T.82.
+ */
+unsigned long jbg_ceil_half(unsigned long x, int n)
+{
+ unsigned long mask;
+
+ assert(n >= 0 && n < 32);
+ mask = (1UL << n) - 1; /* the lowest n bits are 1 here */
+ return (x >> n) + ((mask & x) != 0);
+}
+
+
+/*
+ * Set L0 (the number of lines in a stripe at lowest resolution)
+ * to a default value, such that there are about 35 stripes, as
+ * suggested in Annex C of ITU-T T.82, without exceeding the
+ * limit 128/2^D suggested in Annex A.
+ */
+static void jbg_set_default_l0(struct jbg_enc_state *s)
+{
+ s->l0 = jbg_ceil_half(s->yd, s->d) / 35; /* 35 stripes/image */
+ while ((s->l0 << s->d) > 128) /* but <= 128 lines/stripe */
+ --s->l0;
+ if (s->l0 < 2) s->l0 = 2;
+}
+
+
+/*
+ * Calculate the number of stripes, as defined in clause 6.2.3 of T.82.
+ */
+static unsigned long jbg_stripes(unsigned long l0, unsigned long yd,
+ unsigned long d)
+{
+ unsigned long y0 = jbg_ceil_half(yd, d);
+
+ return y0 / l0 + (y0 % l0 != 0);
+}
+
+
+/*
+ * Initialize the status struct for the encoder.
+ */
+void jbg_enc_init(struct jbg_enc_state *s, unsigned long x, unsigned long y,
+ int planes, unsigned char **p,
+ void (*data_out)(unsigned char *start, size_t len,
+ void *file),
+ void *file)
+{
+ unsigned long l, lx;
+ int i;
+
+ extern char jbg_resred[], jbg_dptable[];
+
+ s->xd = x;
+ s->yd = y;
+ s->yd1 = y; /* This is the hight initially announced in BIH. To provoke
+ generation of NEWLEN for T.85 compatibility tests,
+ overwrite with new value s->yd1 > s->yd */
+ s->planes = planes;
+ s->data_out = data_out;
+ s->file = file;
+
+ s->d = 0;
+ s->dl = 0;
+ s->dh = s->d;
+ jbg_set_default_l0(s);
+ s->mx = 8;
+ s->my = 0;
+ s->order = JBG_ILEAVE | JBG_SMID;
+ s->options = JBG_TPBON | JBG_TPDON | JBG_DPON;
+ s->dppriv = jbg_dptable;
+ s->res_tab = jbg_resred;
+
+ s->highres = (int *) checked_malloc(planes, sizeof(int));
+ s->lhp[0] = p;
+ s->lhp[1] = (unsigned char **)
+ checked_malloc(planes, sizeof(unsigned char *));
+ for (i = 0; i < planes; i++) {
+ s->highres[i] = 0;
+ s->lhp[1][i] = (unsigned char *)
+ checked_malloc(jbg_ceil_half(y, 1), jbg_ceil_half(x, 1+3));
+ }
+
+ s->free_list = NULL;
+ s->s = (struct jbg_arenc_state *)
+ checked_malloc(s->planes, sizeof(struct jbg_arenc_state));
+ s->tx = (int *) checked_malloc(s->planes, sizeof(int));
+ lx = jbg_ceil_half(x, 1);
+ s->tp = (char *) checked_malloc(lx, sizeof(char));
+ for (l = 0; l < lx; s->tp[l++] = 2);
+ s->sde = NULL;
+
+ return;
+}
+
+
+/*
+ * This function selects the number of differential layers based on
+ * the maximum size requested for the lowest resolution layer. If
+ * possible, a number of differential layers is selected, which will
+ * keep the size of the lowest resolution layer below or equal to the
+ * given width x and height y. However not more than 6 differential
+ * resolution layers will be used. In addition, a reasonable value for
+ * l0 (height of one stripe in the lowest resolution layer) is
+ * selected, which obeys the recommended limitations for l0 in annex A
+ * and C of the JBIG standard. The selected number of resolution layers
+ * is returned.
+ */
+int jbg_enc_lrlmax(struct jbg_enc_state *s, unsigned long x,
+ unsigned long y)
+{
+ for (s->d = 0; s->d < 6; s->d++)
+ if (jbg_ceil_half(s->xd, s->d) <= x && jbg_ceil_half(s->yd, s->d) <= y)
+ break;
+ s->dl = 0;
+ s->dh = s->d;
+ jbg_set_default_l0(s);
+ return s->d;
+}
+
+
+/*
+ * As an alternative to jbg_enc_lrlmax(), the following function allows
+ * to specify the number of layers directly. The stripe height and layer
+ * range is also adjusted automatically here.
+ */
+void jbg_enc_layers(struct jbg_enc_state *s, int d)
+{
+ if (d < 0 || d > 31)
+ return;
+ s->d = d;
+ s->dl = 0;
+ s->dh = s->d;
+ jbg_set_default_l0(s);
+ return;
+}
+
+
+/*
+ * Specify the highest and lowest resolution layers which will be
+ * written to the output file. Call this function not before
+ * jbg_enc_layers() or jbg_enc_lrlmax(), because these two functions
+ * reset the lowest and highest resolution layer to default values.
+ * Negative values are ignored. The total number of layers is returned.
+ */
+int jbg_enc_lrange(struct jbg_enc_state *s, int dl, int dh)
+{
+ if (dl >= 0 && dl <= s->d) s->dl = dl;
+ if (dh >= s->dl && dh <= s->d) s->dh = dh;
+
+ return s->d;
+}
+
+
+/*
+ * The following function allows to specify the bits describing the
+ * options of the format as well as the maximum AT movement window and
+ * the number of layer 0 lines per stripes.
+ */
+void jbg_enc_options(struct jbg_enc_state *s, int order, int options,
+ unsigned long l0, int mx, int my)
+{
+ if (order >= 0 && order <= 0x0f) s->order = order;
+ if (options >= 0) s->options = options;
+ if (l0 > 0) s->l0 = l0;
+ if (mx >= 0 && my < 128) s->mx = mx;
+ if (my >= 0 && my < 256) s->my = my;
+
+ return;
+}
+
+
+/*
+ * This function actually does all the tricky work involved in producing
+ * a SDE, which is stored in the appropriate s->sde[][][] element
+ * for later output in the correct order.
+ */
+static void encode_sde(struct jbg_enc_state *s,
+ long stripe, int layer, int plane)
+{
+ unsigned char *hp, *lp1, *lp2, *p0, *p1, *q1, *q2;
+ unsigned long hl, ll, hx, hy, lx, ly, hbpl, lbpl;
+ unsigned long line_h0 = 0, line_h1 = 0;
+ unsigned long line_h2, line_h3, line_l1, line_l2, line_l3;
+ struct jbg_arenc_state *se;
+ unsigned long i, j, y;
+ long o;
+ unsigned a, p, t;
+ int ltp, ltp_old, cx;
+ unsigned long c_all, c[MX_MAX + 1], cmin, cmax, clmin, clmax;
+ int tmax, at_determined;
+ int new_tx;
+ long new_tx_line = -1;
+ struct jbg_buf *new_jbg_buf;
+
+#ifdef DEBUG
+ static long tp_lines, tp_exceptions, tp_pixels, dp_pixels;
+ static long encoded_pixels;
+#endif
+
+ /* return immediately if this stripe has already been encoded */
+ if (s->sde[stripe][layer][plane] != SDE_TODO)
+ return;
+
+#ifdef DEBUG
+ if (stripe == 0)
+ tp_lines = tp_exceptions = tp_pixels = dp_pixels = encoded_pixels = 0;
+ fprintf(stderr, "encode_sde: s/d/p = %2ld/%2d/%2d\n",
+ stripe, layer, plane);
+#endif
+
+ /* number of lines per stripe in highres image */
+ hl = s->l0 << layer;
+ /* number of lines per stripe in lowres image */
+ ll = hl >> 1;
+ /* current line number in highres image */
+ y = stripe * hl;
+ /* number of pixels in highres image */
+ hx = jbg_ceil_half(s->xd, s->d - layer);
+ hy = jbg_ceil_half(s->yd, s->d - layer);
+ /* number of pixels in lowres image */
+ lx = jbg_ceil_half(hx, 1);
+ ly = jbg_ceil_half(hy, 1);
+ /* bytes per line in highres and lowres image */
+ hbpl = jbg_ceil_half(hx, 3);
+ lbpl = jbg_ceil_half(lx, 3);
+ /* pointer to first image byte of highres stripe */
+ hp = s->lhp[s->highres[plane]][plane] + stripe * hl * hbpl;
+ lp2 = s->lhp[1 - s->highres[plane]][plane] + stripe * ll * lbpl;
+ lp1 = lp2 + lbpl;
+
+ /* initialize arithmetic encoder */
+ se = s->s + plane;
+ arith_encode_init(se, stripe != 0);
+ s->sde[stripe][layer][plane] = jbg_buf_init(&s->free_list);
+ se->byte_out = jbg_buf_write;
+ se->file = s->sde[stripe][layer][plane];
+
+ /* initialize adaptive template movement algorithm */
+ c_all = 0;
+ for (t = 0; t <= s->mx; t++)
+ c[t] = 0;
+ if (stripe == 0)
+ s->tx[plane] = 0;
+ new_tx = -1;
+ at_determined = 0; /* we haven't yet decided the template move */
+ if (s->mx == 0)
+ at_determined = 1;
+
+ /* initialize typical prediction */
+ ltp = 0;
+ if (stripe == 0)
+ ltp_old = 0;
+ else {
+ ltp_old = 1;
+ p1 = hp - hbpl;
+ if (y > 1) {
+ q1 = p1 - hbpl;
+ while (p1 < hp && (ltp_old = (*p1++ == *q1++)) != 0);
+ } else
+ while (p1 < hp && (ltp_old = (*p1++ == 0)) != 0);
+ }
+
+ if (layer == 0) {
+
+ /*
+ * Encode lowest resolution layer
+ */
+
+ for (i = 0; i < hl && y < hy; i++, y++) {
+
+ /* check whether it is worth to perform an ATMOVE */
+ if (!at_determined && c_all > 2048) {
+ cmin = clmin = 0xffffffffL;
+ cmax = clmax = 0;
+ tmax = 0;
+ for (t = (s->options & JBG_LRLTWO) ? 5 : 3; t <= s->mx; t++) {
+ if (c[t] > cmax) cmax = c[t];
+ if (c[t] < cmin) cmin = c[t];
+ if (c[t] > c[tmax]) tmax = t;
+ }
+ clmin = (c[0] < cmin) ? c[0] : cmin;
+ clmax = (c[0] > cmax) ? c[0] : cmax;
+ if (c_all - cmax < (c_all >> 3) &&
+ cmax - c[s->tx[plane]] > c_all - cmax &&
+ cmax - c[s->tx[plane]] > (c_all >> 4) &&
+ /* ^ T.82 said < here, fixed in Cor.1/25 */
+ cmax - (c_all - c[s->tx[plane]]) > c_all - cmax &&
+ cmax - (c_all - c[s->tx[plane]]) > (c_all >> 4) &&
+ cmax - cmin > (c_all >> 2) &&
+ (s->tx[plane] || clmax - clmin > (c_all >> 3))) {
+ /* we have decided to perform an ATMOVE */
+ new_tx = tmax;
+ if (!(s->options & JBG_DELAY_AT)) {
+ new_tx_line = i;
+ s->tx[plane] = new_tx;
+ }
+#ifdef DEBUG
+ fprintf(stderr, "ATMOVE: line=%ld, tx=%d, c_all=%ld\n",
+ i, new_tx, c_all);
+#endif
+ }
+ at_determined = 1;
+ }
+ assert(s->tx[plane] >= 0); /* i.e., tx can safely be cast to unsigned */
+
+ /* typical prediction */
+ if (s->options & JBG_TPBON) {
+ ltp = 1;
+ p1 = hp;
+ if (y > 0) {
+ q1 = hp - hbpl;
+ while (q1 < hp && (ltp = (*p1++ == *q1++)) != 0);
+ } else
+ while (p1 < hp + hbpl && (ltp = (*p1++ == 0)) != 0);
+ arith_encode(se, (s->options & JBG_LRLTWO) ? TPB2CX : TPB3CX,
+ ltp == ltp_old);
+#ifdef DEBUG
+ tp_lines += ltp;
+#endif
+ ltp_old = ltp;
+ if (ltp) {
+ /* skip next line */
+ hp += hbpl;
+ continue;
+ }
+ }
+
+ /*
+ * Layout of the variables line_h1, line_h2, line_h3, which contain
+ * as bits the neighbour pixels of the currently coded pixel X:
+ *
+ * 76543210765432107654321076543210 line_h3
+ * 76543210765432107654321076543210 line_h2
+ * 76543210765432107654321X76543210 line_h1
+ */
+
+ line_h1 = line_h2 = line_h3 = 0;
+ if (y > 0) line_h2 = (long)*(hp - hbpl) << 8;
+ if (y > 1) line_h3 = (long)*(hp - hbpl - hbpl) << 8;
+
+ /* encode line */
+ for (j = 0; j < hx; hp++) {
+ line_h1 |= *hp;
+ if (j < hbpl * 8 - 8 && y > 0) {
+ line_h2 |= *(hp - hbpl + 1);
+ if (y > 1)
+ line_h3 |= *(hp - hbpl - hbpl + 1);
+ }
+ if (s->options & JBG_LRLTWO) {
+ /* two line template */
+ do {
+ line_h1 <<= 1; line_h2 <<= 1; line_h3 <<= 1;
+ if (s->tx[plane]) {
+ if ((unsigned) s->tx[plane] > j)
+ a = 0;
+ else {
+ o = (j - s->tx[plane]) - (j & ~7L);
+ a = (hp[o >> 3] >> (7 - (o & 7))) & 1;
+ a <<= 4;
+ }
+ assert(s->tx[plane] > 23 ||
+ a == ((line_h1 >> (4 + s->tx[plane])) & 0x010));
+ arith_encode(se, (((line_h2 >> 10) & 0x3e0) | a |
+ ((line_h1 >> 9) & 0x00f)),
+ (line_h1 >> 8) & 1);
+ }
+ else
+ arith_encode(se, (((line_h2 >> 10) & 0x3f0) |
+ ((line_h1 >> 9) & 0x00f)),
+ (line_h1 >> 8) & 1);
+#ifdef DEBUG
+ encoded_pixels++;
+#endif
+ /* statistics for adaptive template changes */
+ if (!at_determined && j >= s->mx && j < hx-2) {
+ p = (line_h1 & 0x100) != 0; /* current pixel value */
+ c[0] += ((line_h2 & 0x4000) != 0) == p; /* default position */
+ assert(!(((line_h2 >> 6) ^ line_h1) & 0x100) ==
+ (((line_h2 & 0x4000) != 0) == p));
+ for (t = 5; t <= s->mx && t <= j; t++) {
+ o = (j - t) - (j & ~7L);
+ a = (hp[o >> 3] >> (7 - (o & 7))) & 1;
+ assert(t > 23 ||
+ (a == p) == !(((line_h1 >> t) ^ line_h1) & 0x100));
+ c[t] += a == p;
+ }
+ for (; t <= s->mx; t++) {
+ c[t] += 0 == p;
+ }
+ ++c_all;
+ }
+ } while (++j & 7 && j < hx);
+ } else {
+ /* three line template */
+ do {
+ line_h1 <<= 1; line_h2 <<= 1; line_h3 <<= 1;
+ if (s->tx[plane]) {
+ if ((unsigned) s->tx[plane] > j)
+ a = 0;
+ else {
+ o = (j - s->tx[plane]) - (j & ~7L);
+ a = (hp[o >> 3] >> (7 - (o & 7))) & 1;
+ a <<= 2;
+ }
+ assert(s->tx[plane] > 23 ||
+ a == ((line_h1 >> (6 + s->tx[plane])) & 0x004));
+ arith_encode(se, (((line_h3 >> 8) & 0x380) |
+ ((line_h2 >> 12) & 0x078) | a |
+ ((line_h1 >> 9) & 0x003)),
+ (line_h1 >> 8) & 1);
+ } else
+ arith_encode(se, (((line_h3 >> 8) & 0x380) |
+ ((line_h2 >> 12) & 0x07c) |
+ ((line_h1 >> 9) & 0x003)),
+ (line_h1 >> 8) & 1);
+#ifdef DEBUG
+ encoded_pixels++;
+#endif
+ /* statistics for adaptive template changes */
+ if (!at_determined && j >= s->mx && j < hx-2) {
+ p = (line_h1 & 0x100) != 0; /* current pixel value */
+ c[0] += ((line_h2 & 0x4000) != 0) == p; /* default position */
+ assert(!(((line_h2 >> 6) ^ line_h1) & 0x100) ==
+ (((line_h2 & 0x4000) != 0) == p));
+ for (t = 3; t <= s->mx && t <= j; t++) {
+ o = (j - t) - (j & ~7L);
+ a = (hp[o >> 3] >> (7 - (o & 7))) & 1;
+ assert(t > 23 ||
+ (a == p) == !(((line_h1 >> t) ^ line_h1) & 0x100));
+ c[t] += a == p;
+ }
+ for (; t <= s->mx; t++) {
+ c[t] += 0 == p;
+ }
+ ++c_all;
+ }
+ } while (++j & 7 && j < hx);
+ } /* if (s->options & JBG_LRLTWO) */
+ } /* for (j = ...) */
+ } /* for (i = ...) */
+
+ } else {
+
+ /*
+ * Encode differential layer
+ */
+
+ for (i = 0; i < hl && y < hy; i++, y++) {
+
+ /* check whether it is worth to perform an ATMOVE */
+ if (!at_determined && c_all > 2048) {
+ cmin = clmin = 0xffffffffL;
+ cmax = clmax = 0;
+ tmax = 0;
+ for (t = 3; t <= s->mx; t++) {
+ if (c[t] > cmax) cmax = c[t];
+ if (c[t] < cmin) cmin = c[t];
+ if (c[t] > c[tmax]) tmax = t;
+ }
+ clmin = (c[0] < cmin) ? c[0] : cmin;
+ clmax = (c[0] > cmax) ? c[0] : cmax;
+ if (c_all - cmax < (c_all >> 3) &&
+ cmax - c[s->tx[plane]] > c_all - cmax &&
+ cmax - c[s->tx[plane]] > (c_all >> 4) &&
+ /* ^ T.82 said < here, fixed in Cor.1/25 */
+ cmax - (c_all - c[s->tx[plane]]) > c_all - cmax &&
+ cmax - (c_all - c[s->tx[plane]]) > (c_all >> 4) &&
+ cmax - cmin > (c_all >> 2) &&
+ (s->tx[plane] || clmax - clmin > (c_all >> 3))) {
+ /* we have decided to perform an ATMOVE */
+ new_tx = tmax;
+ if (!(s->options & JBG_DELAY_AT)) {
+ new_tx_line = i;
+ s->tx[plane] = new_tx;
+ }
+#ifdef DEBUG
+ fprintf(stderr, "ATMOVE: line=%ld, tx=%d, c_all=%ld\n",
+ i, new_tx, c_all);
+#endif
+ }
+ at_determined = 1;
+ }
+
+ if ((i >> 1) >= ll - 1 || (y >> 1) >= ly - 1)
+ lp1 = lp2;
+
+ /* typical prediction */
+ if (s->options & JBG_TPDON && (i & 1) == 0) {
+ q1 = lp1; q2 = lp2;
+ p0 = p1 = hp;
+ if (i < hl - 1 && y < hy - 1)
+ p0 = hp + hbpl;
+ if (y > 1)
+ line_l3 = (long)*(q2 - lbpl) << 8;
+ else
+ line_l3 = 0;
+ line_l2 = (long)*q2 << 8;
+ line_l1 = (long)*q1 << 8;
+ ltp = 1;
+ for (j = 0; j < lx && ltp; q1++, q2++) {
+ if (j < lbpl * 8 - 8) {
+ if (y > 1)
+ line_l3 |= *(q2 - lbpl + 1);
+ line_l2 |= *(q2 + 1);
+ line_l1 |= *(q1 + 1);
+ }
+ do {
+ if ((j >> 2) < hbpl) {
+ line_h1 = *(p1++);
+ line_h0 = *(p0++);
+ }
+ do {
+ line_l3 <<= 1;
+ line_l2 <<= 1;
+ line_l1 <<= 1;
+ line_h1 <<= 2;
+ line_h0 <<= 2;
+ cx = (((line_l3 >> 15) & 0x007) |
+ ((line_l2 >> 12) & 0x038) |
+ ((line_l1 >> 9) & 0x1c0));
+ if (cx == 0x000)
+ if ((line_h1 & 0x300) == 0 && (line_h0 & 0x300) == 0)
+ s->tp[j] = 0;
+ else {
+ ltp = 0;
+#ifdef DEBUG
+ tp_exceptions++;
+#endif
+ }
+ else if (cx == 0x1ff)
+ if ((line_h1 & 0x300) == 0x300 && (line_h0 & 0x300) == 0x300)
+ s->tp[j] = 1;
+ else {
+ ltp = 0;
+#ifdef DEBUG
+ tp_exceptions++;
+#endif
+ }
+ else
+ s->tp[j] = 2;
+ } while (++j & 3 && j < lx);
+ } while (j & 7 && j < lx);
+ } /* for (j = ...) */
+ arith_encode(se, TPDCX, !ltp);
+#ifdef DEBUG
+ tp_lines += ltp;
+#endif
+ }
+
+
+ /*
+ * Layout of the variables line_h1, line_h2, line_h3, which contain
+ * as bits the high resolution neighbour pixels of the currently coded
+ * highres pixel X:
+ *
+ * 76543210 76543210 76543210 76543210 line_h3
+ * 76543210 76543210 76543210 76543210 line_h2
+ * 76543210 76543210 7654321X 76543210 line_h1
+ *
+ * Layout of the variables line_l1, line_l2, line_l3, which contain
+ * the low resolution pixels near the currently coded pixel as bits.
+ * The lowres pixel in which the currently coded highres pixel is
+ * located is marked as Y:
+ *
+ * 76543210 76543210 76543210 76543210 line_l3
+ * 76543210 7654321Y 76543210 76543210 line_l2
+ * 76543210 76543210 76543210 76543210 line_l1
+ */
+
+
+ line_h1 = line_h2 = line_h3 = line_l1 = line_l2 = line_l3 = 0;
+ if (y > 0) line_h2 = (long)*(hp - hbpl) << 8;
+ if (y > 1) {
+ line_h3 = (long)*(hp - hbpl - hbpl) << 8;
+ line_l3 = (long)*(lp2 - lbpl) << 8;
+ }
+ line_l2 = (long)*lp2 << 8;
+ line_l1 = (long)*lp1 << 8;
+
+ /* encode line */
+ for (j = 0; j < hx; lp1++, lp2++) {
+ if ((j >> 1) < lbpl * 8 - 8) {
+ if (y > 1)
+ line_l3 |= *(lp2 - lbpl + 1);
+ line_l2 |= *(lp2 + 1);
+ line_l1 |= *(lp1 + 1);
+ }
+ do { /* ... while (j & 15 && j < hx) */
+
+ assert(hp - (s->lhp[s->highres[plane]][plane] +
+ (stripe * hl + i) * hbpl)
+ == (ptrdiff_t) j >> 3);
+
+ assert(lp2 - (s->lhp[1-s->highres[plane]][plane] +
+ (stripe * ll + (i>>1)) * lbpl)
+ == (ptrdiff_t) j >> 4);
+
+ line_h1 |= *hp;
+ if (j < hbpl * 8 - 8) {
+ if (y > 0) {
+ line_h2 |= *(hp - hbpl + 1);
+ if (y > 1)
+ line_h3 |= *(hp - hbpl - hbpl + 1);
+ }
+ }
+ do { /* ... while (j & 7 && j < hx) */
+ line_l1 <<= 1; line_l2 <<= 1; line_l3 <<= 1;
+ if (ltp && s->tp[j >> 1] < 2) {
+ /* pixel are typical and have not to be encoded */
+ line_h1 <<= 2; line_h2 <<= 2; line_h3 <<= 2;
+#ifdef DEBUG
+ do {
+ ++tp_pixels;
+ } while (++j & 1 && j < hx);
+#else
+ j += 2;
+#endif
+ } else
+ do { /* ... while (++j & 1 && j < hx) */
+ line_h1 <<= 1; line_h2 <<= 1; line_h3 <<= 1;
+
+ /* deterministic prediction */
+ if (s->options & JBG_DPON) {
+ if ((y & 1) == 0) {
+ if ((j & 1) == 0) {
+ /* phase 0 */
+ if (s->dppriv[((line_l3 >> 16) & 0x003) |
+ ((line_l2 >> 14) & 0x00c) |
+ ((line_h1 >> 5) & 0x010) |
+ ((line_h2 >> 10) & 0x0e0)] < 2) {
+#ifdef DEBUG
+ ++dp_pixels;
+#endif
+ continue;
+ }
+ } else {
+ /* phase 1 */
+ if (s->dppriv[(((line_l3 >> 16) & 0x003) |
+ ((line_l2 >> 14) & 0x00c) |
+ ((line_h1 >> 5) & 0x030) |
+ ((line_h2 >> 10) & 0x1c0)) + 256] < 2) {
+#ifdef DEBUG
+ ++dp_pixels;
+#endif
+ continue;
+ }
+ }
+ } else {
+ if ((j & 1) == 0) {
+ /* phase 2 */
+ if (s->dppriv[(((line_l3 >> 16) & 0x003) |
+ ((line_l2 >> 14) & 0x00c) |
+ ((line_h1 >> 5) & 0x010) |
+ ((line_h2 >> 10) & 0x0e0) |
+ ((line_h3 >> 7) & 0x700)) + 768] < 2) {
+#ifdef DEBUG
+ ++dp_pixels;
+#endif
+ continue;
+ }
+ } else {
+ /* phase 3 */
+ if (s->dppriv[(((line_l3 >> 16) & 0x003) |
+ ((line_l2 >> 14) & 0x00c) |
+ ((line_h1 >> 5) & 0x030) |
+ ((line_h2 >> 10) & 0x1c0) |
+ ((line_h3 >> 7) & 0xe00)) + 2816] < 2) {
+#ifdef DEBUG
+ ++dp_pixels;
+#endif
+ continue;
+ }
+ }
+ }
+ }
+
+ /* determine context */
+ if (s->tx[plane]) {
+ if ((unsigned) s->tx[plane] > j)
+ a = 0;
+ else {
+ o = (j - s->tx[plane]) - (j & ~7L);
+ a = (hp[o >> 3] >> (7 - (o & 7))) & 1;
+ a <<= 4;
+ }
+ assert(s->tx[plane] > 23 ||
+ a == ((line_h1 >> (4 + s->tx[plane])) & 0x010));
+ cx = (((line_h1 >> 9) & 0x003) | a |
+ ((line_h2 >> 13) & 0x00c) |
+ ((line_h3 >> 11) & 0x020));
+ } else
+ cx = (((line_h1 >> 9) & 0x003) |
+ ((line_h2 >> 13) & 0x01c) |
+ ((line_h3 >> 11) & 0x020));
+ if (j & 1)
+ cx |= (((line_l2 >> 9) & 0x0c0) |
+ ((line_l1 >> 7) & 0x300)) | (1UL << 10);
+ else
+ cx |= (((line_l2 >> 10) & 0x0c0) |
+ ((line_l1 >> 8) & 0x300));
+ cx |= (y & 1) << 11;
+
+ arith_encode(se, cx, (line_h1 >> 8) & 1);
+#ifdef DEBUG
+ encoded_pixels++;
+#endif
+
+ /* statistics for adaptive template changes */
+ if (!at_determined && j >= s->mx) {
+ c[0] += !(((line_h2 >> 6) ^ line_h1) & 0x100);
+ for (t = 3; t <= s->mx; t++)
+ c[t] += !(((line_h1 >> t) ^ line_h1) & 0x100);
+ ++c_all;
+ }
+
+ } while (++j & 1 && j < hx);
+ } while (j & 7 && j < hx);
+ hp++;
+ } while (j & 15 && j < hx);
+ } /* for (j = ...) */
+
+ /* low resolution pixels are used twice */
+ if ((i & 1) == 0) {
+ lp1 -= lbpl;
+ lp2 -= lbpl;
+ }
+
+ } /* for (i = ...) */
+ }
+
+ arith_encode_flush(se);
+ jbg_buf_remove_zeros(s->sde[stripe][layer][plane]);
+ jbg_buf_write(MARKER_ESC, s->sde[stripe][layer][plane]);
+ jbg_buf_write(MARKER_SDNORM, s->sde[stripe][layer][plane]);
+
+ /* add ATMOVE */
+ if (new_tx != -1) {
+ if (s->options & JBG_DELAY_AT) {
+ /* ATMOVE will become active at the first line of the next stripe */
+ s->tx[plane] = new_tx;
+ jbg_buf_write(MARKER_ESC, s->sde[stripe][layer][plane]);
+ jbg_buf_write(MARKER_ATMOVE, s->sde[stripe][layer][plane]);
+ jbg_buf_write(0, s->sde[stripe][layer][plane]);
+ jbg_buf_write(0, s->sde[stripe][layer][plane]);
+ jbg_buf_write(0, s->sde[stripe][layer][plane]);
+ jbg_buf_write(0, s->sde[stripe][layer][plane]);
+ jbg_buf_write(s->tx[plane], s->sde[stripe][layer][plane]);
+ jbg_buf_write(0, s->sde[stripe][layer][plane]);
+ } else {
+ /* ATMOVE has already become active during this stripe
+ * => we have to prefix the SDE data with an ATMOVE marker */
+ new_jbg_buf = jbg_buf_init(&s->free_list);
+ jbg_buf_write(MARKER_ESC, new_jbg_buf);
+ jbg_buf_write(MARKER_ATMOVE, new_jbg_buf);
+ jbg_buf_write((new_tx_line >> 24) & 0xff, new_jbg_buf);
+ jbg_buf_write((new_tx_line >> 16) & 0xff, new_jbg_buf);
+ jbg_buf_write((new_tx_line >> 8) & 0xff, new_jbg_buf);
+ jbg_buf_write(new_tx_line & 0xff, new_jbg_buf);
+ jbg_buf_write(new_tx, new_jbg_buf);
+ jbg_buf_write(0, new_jbg_buf);
+ jbg_buf_prefix(new_jbg_buf, &s->sde[stripe][layer][plane]);
+ }
+ }
+
+#if 0
+ if (stripe == s->stripes - 1)
+ fprintf(stderr, "tp_lines = %ld, tp_exceptions = %ld, tp_pixels = %ld, "
+ "dp_pixels = %ld, encoded_pixels = %ld\n",
+ tp_lines, tp_exceptions, tp_pixels, dp_pixels, encoded_pixels);
+#endif
+
+ return;
+}
+
+
+/*
+ * Create the next lower resolution version of an image
+ */
+static void resolution_reduction(struct jbg_enc_state *s, int plane,
+ int higher_layer)
+{
+ unsigned long hx, hy, lx, ly, hbpl, lbpl;
+ unsigned char *hp1, *hp2, *hp3, *lp;
+ unsigned long line_h1, line_h2, line_h3, line_l2;
+ unsigned long i, j;
+ int pix, k, l;
+
+ /* number of pixels in highres image */
+ hx = jbg_ceil_half(s->xd, s->d - higher_layer);
+ hy = jbg_ceil_half(s->yd, s->d - higher_layer);
+ /* number of pixels in lowres image */
+ lx = jbg_ceil_half(hx, 1);
+ ly = jbg_ceil_half(hy, 1);
+ /* bytes per line in highres and lowres image */
+ hbpl = jbg_ceil_half(hx, 3);
+ lbpl = jbg_ceil_half(lx, 3);
+ /* pointers to first image bytes */
+ hp2 = s->lhp[s->highres[plane]][plane];
+ hp1 = hp2 + hbpl;
+ hp3 = hp2 - hbpl;
+ lp = s->lhp[1 - s->highres[plane]][plane];
+
+#ifdef DEBUG
+ fprintf(stderr, "resolution_reduction: plane = %d, higher_layer = %d\n",
+ plane, higher_layer);
+#endif
+
+ /*
+ * Layout of the variables line_h1, line_h2, line_h3, which contain
+ * as bits the high resolution neighbour pixels of the currently coded
+ * lowres pixel /\:
+ * \/
+ *
+ * 76543210 76543210 76543210 76543210 line_h3
+ * 76543210 76543210 765432/\ 76543210 line_h2
+ * 76543210 76543210 765432\/ 76543210 line_h1
+ *
+ * Layout of the variable line_l2, which contains the low resolution
+ * pixels near the currently coded pixel as bits. The lowres pixel
+ * which is currently coded is marked as X:
+ *
+ * 76543210 76543210 76543210 76543210 line_l2
+ * X
+ */
+
+ for (i = 0; i < ly; i++) {
+ if (2*i + 1 >= hy)
+ hp1 = hp2;
+ pix = 0;
+ line_h1 = line_h2 = line_h3 = line_l2 = 0;
+ for (j = 0; j < lbpl * 8; j += 8) {
+ *lp = 0;
+ line_l2 |= i ? *(lp-lbpl) : 0;
+ for (k = 0; k < 8 && j + k < lx; k += 4) {
+ if (((j + k) >> 2) < hbpl) {
+ line_h3 |= i ? *hp3 : 0;
+ ++hp3;
+ line_h2 |= *(hp2++);
+ line_h1 |= *(hp1++);
+ }
+ for (l = 0; l < 4 && j + k + l < lx; l++) {
+ line_h3 <<= 2;
+ line_h2 <<= 2;
+ line_h1 <<= 2;
+ line_l2 <<= 1;
+ pix = s->res_tab[((line_h1 >> 8) & 0x007) |
+ ((line_h2 >> 5) & 0x038) |
+ ((line_h3 >> 2) & 0x1c0) |
+ (pix << 9) | ((line_l2 << 2) & 0xc00)];
+ *lp = (*lp << 1) | pix;
+ }
+ }
+ ++lp;
+ }
+ *(lp - 1) <<= lbpl * 8 - lx;
+ hp1 += hbpl;
+ hp2 += hbpl;
+ hp3 += hbpl;
+ }
+
+#ifdef DEBUG
+ {
+ FILE *f;
+ char fn[50];
+
+ sprintf(fn, "dbg_d=%02d.pbm", higher_layer - 1);
+ f = fopen(fn, "wb");
+ fprintf(f, "P4\n%lu %lu\n", lx, ly);
+ fwrite(s->lhp[1 - s->highres[plane]][plane], 1, lbpl * ly, f);
+ fclose(f);
+ }
+#endif
+
+ return;
+}
+
+
+/*
+ * This function is called inside the three loops of jbg_enc_out() in
+ * order to write the next SDE. It has first to generate the required
+ * SDE and all SDEs which have to be encoded before this SDE can be
+ * created. The problem here is that if we want to output a lower
+ * resolution layer, we have to allpy the resolution reduction
+ * algorithm in order to get it. As we try to safe as much memory as
+ * possible, the resolution reduction will overwrite previous higher
+ * resolution bitmaps. Consequently, we have to encode and buffer SDEs
+ * which depend on higher resolution layers before we can start the
+ * resolution reduction. All this logic about which SDE has to be
+ * encoded before resolution reduction is allowed is handled here.
+ * This approach might be a little bit more complex than alternative
+ * ways to do it, but it allows us to do the encoding with the minimal
+ * possible amount of temporary memory.
+ */
+static void output_sde(struct jbg_enc_state *s,
+ unsigned long stripe, int layer, int plane)
+{
+ int lfcl; /* lowest fully coded layer */
+ long i;
+ unsigned long u;
+
+ assert(s->sde[stripe][layer][plane] != SDE_DONE);
+
+ if (s->sde[stripe][layer][plane] != SDE_TODO) {
+#ifdef DEBUG
+ fprintf(stderr, "writing SDE: s/d/p = %2lu/%2d/%2d\n",
+ stripe, layer, plane);
+#endif
+ jbg_buf_output(&s->sde[stripe][layer][plane], s->data_out, s->file);
+ s->sde[stripe][layer][plane] = SDE_DONE;
+ return;
+ }
+
+ /* Determine the smallest resolution layer in this plane for which
+ * not yet all stripes have been encoded into SDEs. This layer will
+ * have to be completely coded, before we can apply the next
+ * resolution reduction step. */
+ lfcl = 0;
+ for (i = s->d; i >= 0; i--)
+ if (s->sde[s->stripes - 1][i][plane] == SDE_TODO) {
+ lfcl = i + 1;
+ break;
+ }
+ if (lfcl > s->d && s->d > 0 && stripe == 0) {
+ /* perform the first resolution reduction */
+ resolution_reduction(s, plane, s->d);
+ }
+ /* In case HITOLO is not used, we have to encode and store the higher
+ * resolution layers first, although we do not need them right now. */
+ while (lfcl - 1 > layer) {
+ for (u = 0; u < s->stripes; u++)
+ encode_sde(s, u, lfcl - 1, plane);
+ --lfcl;
+ s->highres[plane] ^= 1;
+ if (lfcl > 1)
+ resolution_reduction(s, plane, lfcl - 1);
+ }
+
+ encode_sde(s, stripe, layer, plane);
+
+#ifdef DEBUG
+ fprintf(stderr, "writing SDE: s/d/p = %2lu/%2d/%2d\n", stripe, layer, plane);
+#endif
+ jbg_buf_output(&s->sde[stripe][layer][plane], s->data_out, s->file);
+ s->sde[stripe][layer][plane] = SDE_DONE;
+
+ if (stripe == s->stripes - 1 && layer > 0 &&
+ s->sde[0][layer-1][plane] == SDE_TODO) {
+ s->highres[plane] ^= 1;
+ if (layer > 1)
+ resolution_reduction(s, plane, layer - 1);
+ }
+
+ return;
+}
+
+
+/*
+ * Convert the table which controls the deterministic prediction
+ * process from the internal format into the representation required
+ * for the 1728 byte long DPTABLE element of a BIH.
+ *
+ * The bit order of the DPTABLE format (see also ITU-T T.82 figure 13) is
+ *
+ * high res: 4 5 6 low res: 0 1
+ * 7 8 9 2 3
+ * 10 11 12
+ *
+ * were 4 table entries are packed into one byte, while we here use
+ * internally an unpacked 6912 byte long table indexed by the following
+ * bit order:
+ *
+ * high res: 7 6 5 high res: 8 7 6 low res: 1 0
+ * (phase 0) 4 . . (phase 1) 5 4 . 3 2
+ * . . . . . .
+ *
+ * high res: 10 9 8 high res: 11 10 9
+ * (phase 2) 7 6 5 (phase 3) 8 7 6
+ * 4 . . 5 4 .
+ */
+void jbg_int2dppriv(unsigned char *dptable, const char *internal)
+{
+ int i, j, k;
+ int trans0[ 8] = { 1, 0, 3, 2, 7, 6, 5, 4 };
+ int trans1[ 9] = { 1, 0, 3, 2, 8, 7, 6, 5, 4 };
+ int trans2[11] = { 1, 0, 3, 2, 10, 9, 8, 7, 6, 5, 4 };
+ int trans3[12] = { 1, 0, 3, 2, 11, 10, 9, 8, 7, 6, 5, 4 };
+
+ for (i = 0; i < 1728; dptable[i++] = 0);
+
+#define FILL_TABLE1(offset, len, trans) \
+ for (i = 0; i < len; i++) { \
+ k = 0; \
+ for (j = 0; j < 8; j++) \
+ k |= ((i >> j) & 1) << trans[j]; \
+ dptable[(i + offset) >> 2] |= \
+ (internal[k + offset] & 3) << ((3 - (i&3)) << 1); \
+ }
+
+ FILL_TABLE1( 0, 256, trans0);
+ FILL_TABLE1( 256, 512, trans1);
+ FILL_TABLE1( 768, 2048, trans2);
+ FILL_TABLE1(2816, 4096, trans3);
+
+ return;
+}
+
+
+/*
+ * Convert the table which controls the deterministic prediction
+ * process from the 1728 byte long DPTABLE format into the 6912 byte long
+ * internal format.
+ */
+void jbg_dppriv2int(char *internal, const unsigned char *dptable)
+{
+ int i, j, k;
+ int trans0[ 8] = { 1, 0, 3, 2, 7, 6, 5, 4 };
+ int trans1[ 9] = { 1, 0, 3, 2, 8, 7, 6, 5, 4 };
+ int trans2[11] = { 1, 0, 3, 2, 10, 9, 8, 7, 6, 5, 4 };
+ int trans3[12] = { 1, 0, 3, 2, 11, 10, 9, 8, 7, 6, 5, 4 };
+
+#define FILL_TABLE2(offset, len, trans) \
+ for (i = 0; i < len; i++) { \
+ k = 0; \
+ for (j = 0; j < 8; j++) \
+ k |= ((i >> j) & 1) << trans[j]; \
+ internal[k + offset] = \
+ (dptable[(i + offset) >> 2] >> ((3 - (i & 3)) << 1)) & 3; \
+ }
+
+ FILL_TABLE2( 0, 256, trans0);
+ FILL_TABLE2( 256, 512, trans1);
+ FILL_TABLE2( 768, 2048, trans2);
+ FILL_TABLE2(2816, 4096, trans3);
+
+ return;
+}
+
+
+/*
+ * Encode one full BIE and pass the generated data to the specified
+ * call-back function
+ */
+void jbg_enc_out(struct jbg_enc_state *s)
+{
+ unsigned long bpl;
+ unsigned char buf[20];
+ unsigned long xd, yd, y;
+ long ii[3], is[3], ie[3]; /* generic variables for the 3 nested loops */
+ unsigned long stripe;
+ int layer, plane;
+ int order;
+ unsigned char dpbuf[1728];
+ extern char jbg_dptable[];
+
+ /* some sanity checks */
+ s->order &= JBG_HITOLO | JBG_SEQ | JBG_ILEAVE | JBG_SMID;
+ order = s->order & (JBG_SEQ | JBG_ILEAVE | JBG_SMID);
+ if (iindex[order][0] < 0)
+ s->order = order = JBG_SMID | JBG_ILEAVE;
+ if (s->options & JBG_DPON && s->dppriv != jbg_dptable)
+ s->options |= JBG_DPPRIV;
+ if (s->mx > MX_MAX)
+ s->mx = MX_MAX;
+ s->my = 0;
+ if (s->mx && s->mx < ((s->options & JBG_LRLTWO) ? 5U : 3U))
+ s->mx = 0;
+ if (s->d > 255 || s->d < 0 || s->dh > s->d || s->dh < 0 ||
+ s->dl < 0 || s->dl > s->dh || s->planes < 0 || s->planes > 255)
+ return;
+ /* prevent uint32 overflow: s->l0 * 2 ^ s->d < 2 ^ 32 */
+ if (s->d > 31 || (s->d != 0 && s->l0 >= (1UL << (32 - s->d))))
+ return;
+ if (s->yd1 < s->yd)
+ s->yd1 = s->yd;
+ if (s->yd1 > s->yd)
+ s->options |= JBG_VLENGTH;
+
+ /* ensure correct zero padding of bitmap at the final byte of each line */
+ if (s->xd & 7) {
+ bpl = jbg_ceil_half(s->xd, 3); /* bytes per line */
+ for (plane = 0; plane < s->planes; plane++)
+ for (y = 0; y < s->yd; y++)
+ s->lhp[0][plane][y * bpl + bpl - 1] &= ~((1 << (8 - (s->xd & 7))) - 1);
+ }
+
+ /* prepare BIH */
+ buf[0] = s->dl;
+ buf[1] = s->dh;
+ buf[2] = s->planes;
+ buf[3] = 0;
+ xd = jbg_ceil_half(s->xd, s->d - s->dh);
+ yd = jbg_ceil_half(s->yd1, s->d - s->dh);
+ buf[4] = xd >> 24;
+ buf[5] = (xd >> 16) & 0xff;
+ buf[6] = (xd >> 8) & 0xff;
+ buf[7] = xd & 0xff;
+ buf[8] = yd >> 24;
+ buf[9] = (yd >> 16) & 0xff;
+ buf[10] = (yd >> 8) & 0xff;
+ buf[11] = yd & 0xff;
+ buf[12] = s->l0 >> 24;
+ buf[13] = (s->l0 >> 16) & 0xff;
+ buf[14] = (s->l0 >> 8) & 0xff;
+ buf[15] = s->l0 & 0xff;
+ buf[16] = s->mx;
+ buf[17] = s->my;
+ buf[18] = s->order;
+ buf[19] = s->options & 0x7f;
+
+#if 0
+ /* sanitize L0 (if it was set to 0xffffffff for T.85-style NEWLEN tests) */
+ if (s->l0 > (s->yd >> s->d))
+ s->l0 = s->yd >> s->d;
+#endif
+
+ /* calculate number of stripes that will be required */
+ s->stripes = jbg_stripes(s->l0, s->yd, s->d);
+
+ /* allocate buffers for SDE pointers */
+ if (s->sde == NULL) {
+ s->sde = (struct jbg_buf ****)
+ checked_malloc(s->stripes, sizeof(struct jbg_buf ***));
+ for (stripe = 0; stripe < s->stripes; stripe++) {
+ s->sde[stripe] = (struct jbg_buf ***)
+ checked_malloc(s->d + 1, sizeof(struct jbg_buf **));
+ for (layer = 0; layer < s->d + 1; layer++) {
+ s->sde[stripe][layer] = (struct jbg_buf **)
+ checked_malloc(s->planes, sizeof(struct jbg_buf *));
+ for (plane = 0; plane < s->planes; plane++)
+ s->sde[stripe][layer][plane] = SDE_TODO;
+ }
+ }
+ }
+
+ /* output BIH */
+ s->data_out(buf, 20, s->file);
+ if ((s->options & (JBG_DPON | JBG_DPPRIV | JBG_DPLAST)) ==
+ (JBG_DPON | JBG_DPPRIV)) {
+ /* write private table */
+ jbg_int2dppriv(dpbuf, s->dppriv);
+ s->data_out(dpbuf, 1728, s->file);
+ }
+
+#if 0
+ /*
+ * Encode everything first. This is a simple-minded alternative to
+ * all the tricky on-demand encoding logic in output_sde() for
+ * debugging purposes.
+ */
+ for (layer = s->dh; layer >= s->dl; layer--) {
+ for (plane = 0; plane < s->planes; plane++) {
+ if (layer > 0)
+ resolution_reduction(s, plane, layer);
+ for (stripe = 0; stripe < s->stripes; stripe++)
+ encode_sde(s, stripe, layer, plane);
+ s->highres[plane] ^= 1;
+ }
+ }
+#endif
+
+ /*
+ * Generic loops over all SDEs. Which loop represents layer, plane and
+ * stripe depends on the option flags.
+ */
+
+ /* start and end value vor each loop */
+ is[iindex[order][STRIPE]] = 0;
+ ie[iindex[order][STRIPE]] = s->stripes - 1;
+ is[iindex[order][LAYER]] = s->dl;
+ ie[iindex[order][LAYER]] = s->dh;
+ is[iindex[order][PLANE]] = 0;
+ ie[iindex[order][PLANE]] = s->planes - 1;
+
+ for (ii[0] = is[0]; ii[0] <= ie[0]; ii[0]++)
+ for (ii[1] = is[1]; ii[1] <= ie[1]; ii[1]++)
+ for (ii[2] = is[2]; ii[2] <= ie[2]; ii[2]++) {
+
+ stripe = ii[iindex[order][STRIPE]];
+ if (s->order & JBG_HITOLO)
+ layer = s->dh - (ii[iindex[order][LAYER]] - s->dl);
+ else
+ layer = ii[iindex[order][LAYER]];
+ plane = ii[iindex[order][PLANE]];
+
+ output_sde(s, stripe, layer, plane);
+
+ /*
+ * When we generate a NEWLEN test case (s->yd1 > s->yd), output
+ * NEWLEN after last stripe if we have only a single
+ * resolution layer or plane (see ITU-T T.85 profile), otherwise
+ * output NEWLEN before last stripe.
+ */
+ if (s->yd1 > s->yd &&
+ (stripe == s->stripes - 1 ||
+ (stripe == s->stripes - 2 &&
+ (s->dl != s->dh || s->planes > 1)))) {
+ s->yd1 = s->yd;
+ yd = jbg_ceil_half(s->yd, s->d - s->dh);
+ buf[0] = MARKER_ESC;
+ buf[1] = MARKER_NEWLEN;
+ buf[2] = yd >> 24;
+ buf[3] = (yd >> 16) & 0xff;
+ buf[4] = (yd >> 8) & 0xff;
+ buf[5] = yd & 0xff;
+ s->data_out(buf, 6, s->file);
+#ifdef DEBUG
+ fprintf(stderr, "NEWLEN: yd=%lu\n", yd);
+#endif
+ if (stripe == s->stripes - 1) {
+ buf[1] = MARKER_SDNORM;
+ s->data_out(buf, 2, s->file);
+ }
+ }
+
+ }
+
+ return;
+}
+
+
+void jbg_enc_free(struct jbg_enc_state *s)
+{
+ unsigned long stripe;
+ int layer, plane;
+
+#ifdef DEBUG
+ fprintf(stderr, "jbg_enc_free(%p)\n", (void *) s);
+#endif
+
+ /* clear buffers for SDEs */
+ if (s->sde) {
+ for (stripe = 0; stripe < s->stripes; stripe++) {
+ for (layer = 0; layer < s->d + 1; layer++) {
+ for (plane = 0; plane < s->planes; plane++)
+ if (s->sde[stripe][layer][plane] != SDE_DONE &&
+ s->sde[stripe][layer][plane] != SDE_TODO)
+ jbg_buf_free(&s->sde[stripe][layer][plane]);
+ checked_free(s->sde[stripe][layer]);
+ }
+ checked_free(s->sde[stripe]);
+ }
+ checked_free(s->sde);
+ }
+
+ /* clear free_list */
+ jbg_buf_free(&s->free_list);
+
+ /* clear memory for arithmetic encoder states */
+ checked_free(s->s);
+
+ /* clear memory for differential-layer typical prediction buffer */
+ checked_free(s->tp);
+
+ /* clear memory for adaptive template pixel offsets */
+ checked_free(s->tx);
+
+ /* clear lowres image buffers */
+ if (s->lhp[1]) {
+ for (plane = 0; plane < s->planes; plane++)
+ checked_free(s->lhp[1][plane]);
+ checked_free(s->lhp[1]);
+ }
+
+ /* clear buffer for index of highres image in lhp */
+ checked_free(s->highres);
+
+ return;
+}
+
+
+/*
+ * Convert the error codes used by jbg_dec_in() into a string
+ * written in the selected language and character set.
+ */
+const char *jbg_strerror(int errnum, int language)
+{
+ if (errnum < 0 || errnum >= NEMSG)
+ return "Unknown error code passed to jbg_strerror()";
+ if (language < 0 || language >= NEMSG_LANG)
+ return "Unknown language code passed to jbg_strerror()";
+
+ return errmsg[language][errnum];
+}
+
+
+/*
+ * The constructor for a decoder
+ */
+void jbg_dec_init(struct jbg_dec_state *s)
+{
+ s->order = 0;
+ s->d = -1;
+ s->bie_len = 0;
+ s->buf_len = 0;
+ s->dppriv = NULL;
+ s->xmax = 4294967295UL;
+ s->ymax = 4294967295UL;
+ s->dmax = 256;
+ s->s = NULL;
+
+ return;
+}
+
+
+/*
+ * Specify a maximum image size for the decoder. If the JBIG file has
+ * the order bit ILEAVE, but not the bit SEQ set, then the decoder
+ * will abort to decode after the image has reached the maximal
+ * resolution layer which is still not wider than xmax or higher than
+ * ymax.
+ */
+void jbg_dec_maxsize(struct jbg_dec_state *s, unsigned long xmax,
+ unsigned long ymax)
+{
+ if (xmax > 0) s->xmax = xmax;
+ if (ymax > 0) s->ymax = ymax;
+
+ return;
+}
+
+
+/*
+ * Decode the new len PSDC bytes to which data points and add them to
+ * the current stripe. Return the number of bytes which have actually
+ * been read (this will be less than len if a marker segment was
+ * part of the data or if the final byte was 0xff were this code
+ * can not determine, whether we have a marker segment.
+ */
+static size_t decode_pscd(struct jbg_dec_state *s, unsigned char *data,
+ size_t len)
+{
+ unsigned long stripe;
+ unsigned int layer, plane;
+ unsigned long hl, ll, y, hx, hy, lx, ly, hbpl, lbpl;
+ unsigned char *hp, *lp1, *lp2, *p1, *q1;
+ register unsigned long line_h1, line_h2, line_h3;
+ register unsigned long line_l1, line_l2, line_l3;
+ struct jbg_ardec_state *se;
+ unsigned long x;
+ long o;
+ unsigned a;
+ int n;
+ int pix, cx = 0, slntp, tx;
+
+ /* SDE loop variables */
+ stripe = s->ii[iindex[s->order & 7][STRIPE]];
+ layer = s->ii[iindex[s->order & 7][LAYER]];
+ plane = s->ii[iindex[s->order & 7][PLANE]];
+
+ /* forward data to arithmetic decoder */
+ se = s->s[plane] + layer - s->dl;
+ se->pscd_ptr = data;
+ se->pscd_end = data + len;
+
+ /* number of lines per stripe in highres image */
+ hl = s->l0 << layer;
+ /* number of lines per stripe in lowres image */
+ ll = hl >> 1;
+ /* current line number in highres image */
+ y = stripe * hl + s->i;
+ /* number of pixels in highres image */
+ hx = jbg_ceil_half(s->xd, s->d - layer);
+ hy = jbg_ceil_half(s->yd, s->d - layer);
+ /* number of pixels in lowres image */
+ lx = jbg_ceil_half(hx, 1);
+ ly = jbg_ceil_half(hy, 1);
+ /* bytes per line in highres and lowres image */
+ hbpl = jbg_ceil_half(hx, 3);
+ lbpl = jbg_ceil_half(lx, 3);
+ /* pointer to highres and lowres image bytes */
+ hp = s->lhp[ layer & 1][plane] + (stripe * hl + s->i) * hbpl +
+ (s->x >> 3);
+ lp2 = s->lhp[(layer-1) & 1][plane] + (stripe * ll + (s->i >> 1)) * lbpl +
+ (s->x >> 4);
+ lp1 = lp2 + lbpl;
+
+ /* restore a few local variables */
+ line_h1 = s->line_h1;
+ line_h2 = s->line_h2;
+ line_h3 = s->line_h3;
+ line_l1 = s->line_l1;
+ line_l2 = s->line_l2;
+ line_l3 = s->line_l3;
+ x = s->x;
+
+ if (s->x == 0 && s->i == 0 &&
+ (stripe == 0 || s->reset[plane][layer - s->dl])) {
+ s->tx[plane][layer - s->dl] = s->ty[plane][layer - s->dl] = 0;
+ if (s->pseudo)
+ s->lntp[plane][layer - s->dl] = 1;
+ }
+
+#ifdef DEBUG
+ if (s->x == 0 && s->i == 0 && s->pseudo)
+ fprintf(stderr, "decode_pscd(%p, %p, %ld): s/d/p = %2lu/%2u/%2u\n",
+ (void *) s, (void *) data, (long) len, stripe, layer, plane);
+#endif
+
+ if (layer == 0) {
+
+ /*
+ * Decode lowest resolution layer
+ */
+
+ for (; s->i < hl && y < hy; s->i++, y++) {
+
+ /* adaptive template changes */
+ if (x == 0)
+ for (n = 0; n < s->at_moves; n++)
+ if (s->at_line[n] == s->i) {
+ s->tx[plane][layer - s->dl] = s->at_tx[n];
+ s->ty[plane][layer - s->dl] = s->at_ty[n];
+#ifdef DEBUG
+ fprintf(stderr, "ATMOVE: line=%lu, tx=%d, ty=%d.\n", s->i,
+ s->tx[plane][layer - s->dl], s->ty[plane][layer - s->dl]);
+#endif
+ }
+ tx = s->tx[plane][layer - s->dl];
+ assert(tx >= 0); /* i.e., tx can safely be cast to unsigned */
+
+ /* typical prediction */
+ if (s->options & JBG_TPBON && s->pseudo) {
+ slntp = arith_decode(se, (s->options & JBG_LRLTWO) ? TPB2CX : TPB3CX);
+ if (se->result == JBG_MORE || se->result == JBG_MARKER)
+ goto leave;
+ s->lntp[plane][layer - s->dl] =
+ !(slntp ^ s->lntp[plane][layer - s->dl]);
+ if (s->lntp[plane][layer - s->dl]) {
+ /* this line is 'not typical' and has to be coded completely */
+ s->pseudo = 0;
+ } else {
+ /* this line is 'typical' (i.e. identical to the previous one) */
+ p1 = hp;
+ if (s->i == 0 && (stripe == 0 || s->reset[plane][layer - s->dl]))
+ while (p1 < hp + hbpl) *p1++ = 0;
+ else {
+ q1 = hp - hbpl;
+ while (q1 < hp) *p1++ = *q1++;
+ }
+ hp += hbpl;
+ continue;
+ }
+ }
+
+ /*
+ * Layout of the variables line_h1, line_h2, line_h3, which contain
+ * as bits the neighbour pixels of the currently decoded pixel X:
+ *
+ * 76543210 76543210 76543210 76543210 line_h3
+ * 76543210 76543210 76543210 76543210 line_h2
+ * 76543210 76543210 76543210 76543210 X line_h1
+ */
+
+ if (x == 0) {
+ line_h1 = line_h2 = line_h3 = 0;
+ if (s->i > 0 || (y > 0 && !s->reset[plane][layer - s->dl]))
+ line_h2 = (long)*(hp - hbpl) << 8;
+ if (s->i > 1 || (y > 1 && !s->reset[plane][layer - s->dl]))
+ line_h3 = (long)*(hp - hbpl - hbpl) << 8;
+ }
+
+ /*
+ * Another tiny JBIG standard bug:
+ *
+ * While implementing the line_h3 handling here, I discovered
+ * another problem with the ITU-T T.82(1993 E) specification.
+ * This might be a somewhat pathological case, however. The
+ * standard is unclear about how a decoder should behave in the
+ * following situation:
+ *
+ * Assume we are in layer 0 and all stripes are single lines
+ * (L0=1 allowed by table 9). We are now decoding the first (and
+ * only) line of the third stripe. Assume, the first stripe was
+ * terminated by SDRST and the second stripe was terminated by
+ * SDNORM. While decoding the only line of the third stripe with
+ * the three-line template, we need access to pixels from the
+ * previous two stripes. We know that the previous stripe
+ * terminated with SDNROM, so we access the pixel from the
+ * second stripe. But do we have to replace the pixels from the
+ * first stripe by background pixels, because this stripe ended
+ * with SDRST? The standard, especially clause 6.2.5 does never
+ * mention this case, so the behaviour is undefined here. My
+ * current implementation remembers only the marker used to
+ * terminate the previous stripe. In the above example, the
+ * pixels of the first stripe are accessed despite the fact that
+ * this stripe ended with SDRST. An alternative (only slightly
+ * more complicated) implementation would be to remember the end
+ * marker (SDNORM or SDRST) of the previous two stripes in a
+ * plane/layer and to act accordingly when accessing the two
+ * previous lines. What am I supposed to do here?
+ *
+ * As the standard is unclear about the correct behaviour in the
+ * situation of the above example, I strongly suggest to avoid
+ * the following situation while encoding data with JBIG:
+ *
+ * LRLTWO = 0, L0=1 and both SDNORM and SDRST appear in layer 0.
+ *
+ * I guess that only a very few if any encoders will switch
+ * between SDNORM and SDRST, so let us hope that this ambiguity
+ * in the standard will never cause any interoperability
+ * problems.
+ *
+ * Markus Kuhn -- 1995-04-30
+ */
+
+ /* decode line */
+ while (x < hx) {
+ if ((x & 7) == 0) {
+ if (x < hbpl * 8 - 8 &&
+ (s->i > 0 || (y > 0 && !s->reset[plane][layer - s->dl]))) {
+ line_h2 |= *(hp - hbpl + 1);
+ if (s->i > 1 || (y > 1 && !s->reset[plane][layer - s->dl]))
+ line_h3 |= *(hp - hbpl - hbpl + 1);
+ }
+ }
+ if (s->options & JBG_LRLTWO) {
+ /* two line template */
+ do {
+ if (tx) {
+ if ((unsigned) tx > x)
+ a = 0;
+ else if (tx < 8)
+ a = ((line_h1 >> (tx - 5)) & 0x010);
+ else {
+ o = (x - tx) - (x & ~7L);
+ a = (hp[o >> 3] >> (7 - (o & 7))) & 1;
+ a <<= 4;
+ }
+ assert(tx > 31 ||
+ a == ((line_h1 >> (tx - 5)) & 0x010));
+ pix = arith_decode(se, (((line_h2 >> 9) & 0x3e0) | a |
+ (line_h1 & 0x00f)));
+ } else
+ pix = arith_decode(se, (((line_h2 >> 9) & 0x3f0) |
+ (line_h1 & 0x00f)));
+ if (se->result == JBG_MORE || se->result == JBG_MARKER)
+ goto leave;
+ line_h1 = (line_h1 << 1) | pix;
+ line_h2 <<= 1;
+ } while ((++x & 7) && x < hx);
+ } else {
+ /* three line template */
+ do {
+ if (tx) {
+ if ((unsigned) tx > x)
+ a = 0;
+ else if (tx < 8)
+ a = ((line_h1 >> (tx - 3)) & 0x004);
+ else {
+ o = (x - tx) - (x & ~7L);
+ a = (hp[o >> 3] >> (7 - (o & 7))) & 1;
+ a <<= 2;
+ }
+ assert(tx > 31 ||
+ a == ((line_h1 >> (tx - 3)) & 0x004));
+ pix = arith_decode(se, (((line_h3 >> 7) & 0x380) |
+ ((line_h2 >> 11) & 0x078) | a |
+ (line_h1 & 0x003)));
+ } else
+ pix = arith_decode(se, (((line_h3 >> 7) & 0x380) |
+ ((line_h2 >> 11) & 0x07c) |
+ (line_h1 & 0x003)));
+ if (se->result == JBG_MORE || se->result == JBG_MARKER)
+ goto leave;
+
+ line_h1 = (line_h1 << 1) | pix;
+ line_h2 <<= 1;
+ line_h3 <<= 1;
+ } while ((++x & 7) && x < hx);
+ } /* if (s->options & JBG_LRLTWO) */
+ *hp++ = line_h1;
+ } /* while */
+ *(hp - 1) <<= hbpl * 8 - hx;
+ x = 0;
+ s->pseudo = 1;
+ } /* for (i = ...) */
+
+ } else {
+
+ /*
+ * Decode differential layer
+ */
+
+ for (; s->i < hl && y < hy; s->i++, y++) {
+
+ /* adaptive template changes */
+ if (x == 0)
+ for (n = 0; n < s->at_moves; n++)
+ if (s->at_line[n] == s->i) {
+ s->tx[plane][layer - s->dl] = s->at_tx[n];
+ s->ty[plane][layer - s->dl] = s->at_ty[n];
+#ifdef DEBUG
+ fprintf(stderr, "ATMOVE: line=%lu, tx=%d, ty=%d.\n", s->i,
+ s->tx[plane][layer - s->dl], s->ty[plane][layer - s->dl]);
+#endif
+ }
+ tx = s->tx[plane][layer - s->dl];
+
+ /* handle lower border of low-resolution image */
+ if ((s->i >> 1) >= ll - 1 || (y >> 1) >= ly - 1)
+ lp1 = lp2;
+
+ /* typical prediction */
+ if (s->options & JBG_TPDON && s->pseudo) {
+ s->lntp[plane][layer - s->dl] = arith_decode(se, TPDCX);
+ if (se->result == JBG_MORE || se->result == JBG_MARKER)
+ goto leave;
+ s->pseudo = 0;
+ }
+
+
+ /*
+ * Layout of the variables line_h1, line_h2, line_h3, which contain
+ * as bits the high resolution neighbour pixels of the currently
+ * decoded highres pixel X:
+ *
+ * 76543210 76543210 76543210 76543210 line_h3
+ * 76543210 76543210 76543210 76543210 line_h2
+ * 76543210 76543210 76543210 76543210 X line_h1
+ *
+ * Layout of the variables line_l1, line_l2, line_l3, which contain
+ * the low resolution pixels near the currently decoded pixel as bits.
+ * The lowres pixel in which the currently coded highres pixel is
+ * located is marked as Y:
+ *
+ * 76543210 76543210 76543210 76543210 line_l3
+ * 76543210 76543210 Y6543210 76543210 line_l2
+ * 76543210 76543210 76543210 76543210 line_l1
+ */
+
+
+ if (x == 0) {
+ line_h1 = line_h2 = line_h3 = line_l1 = line_l2 = line_l3 = 0;
+ if (s->i > 0 || (y > 0 && !s->reset[plane][layer - s->dl])) {
+ line_h2 = (long)*(hp - hbpl) << 8;
+ if (s->i > 1 || (y > 1 && !s->reset[plane][layer - s->dl]))
+ line_h3 = (long)*(hp - hbpl - hbpl) << 8;
+ }
+ if (s->i > 1 || (y > 1 && !s->reset[plane][layer-s->dl]))
+ line_l3 = (long)*(lp2 - lbpl) << 8;
+ line_l2 = (long)*lp2 << 8;
+ line_l1 = (long)*lp1 << 8;
+ }
+
+ /* decode line */
+ while (x < hx) {
+ if ((x & 15) == 0)
+ if ((x >> 1) < lbpl * 8 - 8) {
+ line_l1 |= *(lp1 + 1);
+ line_l2 |= *(lp2 + 1);
+ if (s->i > 1 ||
+ (y > 1 && !s->reset[plane][layer - s->dl]))
+ line_l3 |= *(lp2 - lbpl + 1);
+ }
+ do {
+
+ assert(hp - (s->lhp[ layer &1][plane] + (stripe * hl + s->i)
+ * hbpl) == (ptrdiff_t) x >> 3);
+ assert(lp2 - (s->lhp[(layer-1) &1][plane] + (stripe * ll + (s->i>>1))
+ * lbpl) == (ptrdiff_t) x >> 4);
+
+ if ((x & 7) == 0)
+ if (x < hbpl * 8 - 8) {
+ if (s->i > 0 || (y > 0 && !s->reset[plane][layer - s->dl])) {
+ line_h2 |= *(hp + 1 - hbpl);
+ if (s->i > 1 || (y > 1 && !s->reset[plane][layer - s->dl]))
+ line_h3 |= *(hp + 1 - hbpl - hbpl);
+ }
+ }
+ do {
+ if (!s->lntp[plane][layer - s->dl])
+ cx = (((line_l3 >> 14) & 0x007) |
+ ((line_l2 >> 11) & 0x038) |
+ ((line_l1 >> 8) & 0x1c0));
+ if (!s->lntp[plane][layer - s->dl] &&
+ (cx == 0x000 || cx == 0x1ff)) {
+ /* pixels are typical and have not to be decoded */
+ do {
+ line_h1 = (line_h1 << 1) | (cx & 1);
+ } while ((++x & 1) && x < hx);
+ line_h2 <<= 2; line_h3 <<= 2;
+ } else
+ do {
+
+ /* deterministic prediction */
+ if (s->options & JBG_DPON)
+ if ((y & 1) == 0)
+ if ((x & 1) == 0)
+ /* phase 0 */
+ pix = s->dppriv[((line_l3 >> 15) & 0x003) |
+ ((line_l2 >> 13) & 0x00c) |
+ ((line_h1 << 4) & 0x010) |
+ ((line_h2 >> 9) & 0x0e0)];
+ else
+ /* phase 1 */
+ pix = s->dppriv[(((line_l3 >> 15) & 0x003) |
+ ((line_l2 >> 13) & 0x00c) |
+ ((line_h1 << 4) & 0x030) |
+ ((line_h2 >> 9) & 0x1c0)) + 256];
+ else
+ if ((x & 1) == 0)
+ /* phase 2 */
+ pix = s->dppriv[(((line_l3 >> 15) & 0x003) |
+ ((line_l2 >> 13) & 0x00c) |
+ ((line_h1 << 4) & 0x010) |
+ ((line_h2 >> 9) & 0x0e0) |
+ ((line_h3 >> 6) & 0x700)) + 768];
+ else
+ /* phase 3 */
+ pix = s->dppriv[(((line_l3 >> 15) & 0x003) |
+ ((line_l2 >> 13) & 0x00c) |
+ ((line_h1 << 4) & 0x030) |
+ ((line_h2 >> 9) & 0x1c0) |
+ ((line_h3 >> 6) & 0xe00)) + 2816];
+ else
+ pix = 2;
+
+ if (pix & 2) {
+ if (tx)
+ cx = ((line_h1 & 0x003) |
+ (((line_h1 << 2) >> (tx - 3)) & 0x010) |
+ ((line_h2 >> 12) & 0x00c) |
+ ((line_h3 >> 10) & 0x020));
+ else
+ cx = ((line_h1 & 0x003) |
+ ((line_h2 >> 12) & 0x01c) |
+ ((line_h3 >> 10) & 0x020));
+ if (x & 1)
+ cx |= (((line_l2 >> 8) & 0x0c0) |
+ ((line_l1 >> 6) & 0x300)) | (1UL << 10);
+ else
+ cx |= (((line_l2 >> 9) & 0x0c0) |
+ ((line_l1 >> 7) & 0x300));
+ cx |= (y & 1) << 11;
+
+ pix = arith_decode(se, cx);
+ if (se->result == JBG_MORE || se->result == JBG_MARKER)
+ goto leave;
+ }
+
+ line_h1 = (line_h1 << 1) | pix;
+ line_h2 <<= 1;
+ line_h3 <<= 1;
+
+ } while ((++x & 1) && x < hx);
+ line_l1 <<= 1; line_l2 <<= 1; line_l3 <<= 1;
+ } while ((x & 7) && x < hx);
+ *hp++ = line_h1;
+ } while ((x & 15) && x < hx);
+ ++lp1;
+ ++lp2;
+ } /* while */
+ x = 0;
+
+ *(hp - 1) <<= hbpl * 8 - hx;
+ if ((s->i & 1) == 0) {
+ /* low resolution pixels are used twice */
+ lp1 -= lbpl;
+ lp2 -= lbpl;
+ } else
+ s->pseudo = 1;
+
+ } /* for (i = ...) */
+
+ }
+
+ leave:
+
+ /* save a few local variables */
+ s->line_h1 = line_h1;
+ s->line_h2 = line_h2;
+ s->line_h3 = line_h3;
+ s->line_l1 = line_l1;
+ s->line_l2 = line_l2;
+ s->line_l3 = line_l3;
+ s->x = x;
+
+ return se->pscd_ptr - data;
+}
+
+
+/*
+ * Provide a new BIE fragment to the decoder.
+ *
+ * If cnt is not NULL, then *cnt will contain after the call the
+ * number of actually read bytes. If the data was not complete, then
+ * the return value will be JBG_EAGAIN and *cnt == len. In case this
+ * function has returned with JBG_EOK, then it has reached the end of
+ * a BIE but it can be called again with data from the next BIE if
+ * there exists one in order to get to a higher resolution layer. In
+ * case the return value was JBG_EOK_INTR then this function can be
+ * called again with the rest of the BIE, because parsing the BIE has
+ * been interrupted by a jbg_dec_maxsize() specification. In both
+ * cases the remaining len - *cnt bytes of the previous block will
+ * have to passed to this function again (if len > *cnt). In case of
+ * any other return value than JBG_EOK, JBG_EOK_INTR or JBG_EAGAIN, a
+ * serious problem has occured and the only function you should call
+ * is jbg_dec_free() in order to remove the mess (and probably
+ * jbg_strerror() in order to find out what to tell the user).
+ */
+int jbg_dec_in(struct jbg_dec_state *s, unsigned char *data, size_t len,
+ size_t *cnt)
+{
+ int i, j, required_length;
+ unsigned long x, y;
+ unsigned long is[3], ie[3];
+ extern char jbg_dptable[];
+ size_t dummy_cnt;
+
+ if (!cnt) cnt = &dummy_cnt;
+ *cnt = 0;
+ if (len < 1) return JBG_EAGAIN;
+
+ /* read in 20-byte BIH */
+ if (s->bie_len < 20) {
+ while (s->bie_len < 20 && *cnt < len)
+ s->buffer[s->bie_len++] = data[(*cnt)++];
+ if (s->bie_len < 20)
+ return JBG_EAGAIN;
+ if (s->buffer[1] < s->buffer[0])
+ return JBG_EINVAL;
+ /* test whether this looks like a valid JBIG header at all */
+ if (s->buffer[3] != 0 || (s->buffer[18] & 0xf0) != 0 ||
+ (s->buffer[19] & 0x80) != 0)
+ return JBG_EINVAL;
+ if (s->buffer[0] != s->d + 1)
+ return JBG_ENOCONT;
+ s->dl = s->buffer[0];
+ s->d = s->buffer[1];
+ if (s->dl == 0)
+ s->planes = s->buffer[2];
+ else
+ if (s->planes != s->buffer[2])
+ return JBG_ENOCONT;
+ x = (((long) s->buffer[ 4] << 24) | ((long) s->buffer[ 5] << 16) |
+ ((long) s->buffer[ 6] << 8) | (long) s->buffer[ 7]);
+ y = (((long) s->buffer[ 8] << 24) | ((long) s->buffer[ 9] << 16) |
+ ((long) s->buffer[10] << 8) | (long) s->buffer[11]);
+ if (s->dl != 0 && ((s->xd << (s->d - s->dl + 1)) != x &&
+ (s->yd << (s->d - s->dl + 1)) != y))
+ return JBG_ENOCONT;
+ s->xd = x;
+ s->yd = y;
+ s->l0 = (((long) s->buffer[12] << 24) | ((long) s->buffer[13] << 16) |
+ ((long) s->buffer[14] << 8) | (long) s->buffer[15]);
+ /* ITU-T T.85 trick not directly supported by decoder; for full
+ * T.85 compatibility with respect to all NEWLEN marker scenarios,
+ * preprocess BIE with jbg_newlen() before passing it to the decoder. */
+ if (s->yd == 0xffffffff)
+ return JBG_EIMPL;
+ if (!s->planes || !s->xd || !s->yd || !s->l0)
+ return JBG_EINVAL;
+ /* prevent uint32 overflow: s->l0 * 2 ^ s->d < 2 ^ 32 */
+ if (s->d > 31 || (s->d != 0 && s->l0 >= (1UL << (32 - s->d))))
+ return JBG_EIMPL;
+ s->mx = s->buffer[16];
+ if (s->mx > 127)
+ return JBG_EINVAL;
+ s->my = s->buffer[17];
+#if 0
+ if (s->my > 0)
+ return JBG_EIMPL;
+#endif
+ s->order = s->buffer[18];
+ if (iindex[s->order & 7][0] < 0)
+ return JBG_EINVAL;
+ /* HITOLO and SEQ currently not yet implemented */
+ if (s->dl != s->d && (s->order & JBG_HITOLO || s->order & JBG_SEQ))
+ return JBG_EIMPL;
+ s->options = s->buffer[19];
+
+ /* calculate number of stripes that will be required */
+ s->stripes = jbg_stripes(s->l0, s->yd, s->d);
+
+ /* some initialization */
+ s->ii[iindex[s->order & 7][STRIPE]] = 0;
+ s->ii[iindex[s->order & 7][LAYER]] = s->dl;
+ s->ii[iindex[s->order & 7][PLANE]] = 0;
+ if (s->dl == 0) {
+ s->s = (struct jbg_ardec_state **)
+ checked_malloc(s->planes, sizeof(struct jbg_ardec_state *));
+ s->tx = (int **) checked_malloc(s->planes, sizeof(int *));
+ s->ty = (int **) checked_malloc(s->planes, sizeof(int *));
+ s->reset = (int **) checked_malloc(s->planes, sizeof(int *));
+ s->lntp = (int **) checked_malloc(s->planes, sizeof(int *));
+ s->lhp[0] = (unsigned char **)
+ checked_malloc(s->planes, sizeof(unsigned char *));
+ s->lhp[1] = (unsigned char **)
+ checked_malloc(s->planes, sizeof(unsigned char *));
+ for (i = 0; i < s->planes; i++) {
+ s->s[i] = (struct jbg_ardec_state *)
+ checked_malloc(s->d - s->dl + 1, sizeof(struct jbg_ardec_state));
+ s->tx[i] = (int *) checked_malloc(s->d - s->dl + 1, sizeof(int));
+ s->ty[i] = (int *) checked_malloc(s->d - s->dl + 1, sizeof(int));
+ s->reset[i] = (int *) checked_malloc(s->d - s->dl + 1, sizeof(int));
+ s->lntp[i] = (int *) checked_malloc(s->d - s->dl + 1, sizeof(int));
+ s->lhp[ s->d & 1][i] = (unsigned char *)
+ checked_malloc(s->yd, jbg_ceil_half(s->xd, 3));
+ s->lhp[(s->d-1) & 1][i] = (unsigned char *)
+ checked_malloc(jbg_ceil_half(s->yd, 1), jbg_ceil_half(s->xd, 1+3));
+ }
+ } else {
+ for (i = 0; i < s->planes; i++) {
+ s->s[i] = (struct jbg_ardec_state *)
+ checked_realloc(s->s[i], s->d - s->dl + 1,
+ sizeof(struct jbg_ardec_state));
+ s->tx[i] = (int *) checked_realloc(s->tx[i],
+ s->d - s->dl + 1, sizeof(int));
+ s->ty[i] = (int *) checked_realloc(s->ty[i],
+ s->d - s->dl + 1, sizeof(int));
+ s->reset[i] = (int *) checked_realloc(s->reset[i],
+ s->d - s->dl + 1, sizeof(int));
+ s->lntp[i] = (int *) checked_realloc(s->lntp[i],
+ s->d - s->dl + 1, sizeof(int));
+ s->lhp[ s->d & 1][i] = (unsigned char *)
+ checked_realloc(s->lhp[ s->d & 1][i],
+ s->yd, jbg_ceil_half(s->xd, 3));
+ s->lhp[(s->d-1) & 1][i] = (unsigned char *)
+ checked_realloc(s->lhp[(s->d-1) & 1][i],
+ jbg_ceil_half(s->yd, 1), jbg_ceil_half(s->xd, 1+3));
+ }
+ }
+ for (i = 0; i < s->planes; i++)
+ for (j = 0; j <= s->d - s->dl; j++)
+ arith_decode_init(s->s[i] + j, 0);
+ if (s->dl == 0 || (s->options & JBG_DPON && !(s->options & JBG_DPPRIV)))
+ s->dppriv = jbg_dptable;
+ s->comment_skip = 0;
+ s->buf_len = 0;
+ s->x = 0;
+ s->i = 0;
+ s->pseudo = 1;
+ s->at_moves = 0;
+ }
+
+ /* read in DPTABLE */
+ if (s->bie_len < 20 + 1728 &&
+ (s->options & (JBG_DPON | JBG_DPPRIV | JBG_DPLAST)) ==
+ (JBG_DPON | JBG_DPPRIV)) {
+ assert(s->bie_len >= 20);
+ while (s->bie_len < 20 + 1728 && *cnt < len)
+ s->buffer[s->bie_len++ - 20] = data[(*cnt)++];
+ if (s->bie_len < 20 + 1728)
+ return JBG_EAGAIN;
+ if (!s->dppriv || s->dppriv == jbg_dptable)
+ s->dppriv = (char *) checked_malloc(1728, sizeof(char));
+ jbg_dppriv2int(s->dppriv, s->buffer);
+ }
+
+ /*
+ * BID processing loop
+ */
+
+ while (*cnt < len) {
+
+ /* process floating marker segments */
+
+ /* skip COMMENT contents */
+ if (s->comment_skip) {
+ if (s->comment_skip <= len - *cnt) {
+ *cnt += s->comment_skip;
+ s->comment_skip = 0;
+ } else {
+ s->comment_skip -= len - *cnt;
+ *cnt = len;
+ }
+ continue;
+ }
+
+ /* load complete marker segments into s->buffer for processing */
+ if (s->buf_len > 0) {
+ assert(s->buffer[0] == MARKER_ESC);
+ while (s->buf_len < 2 && *cnt < len)
+ s->buffer[s->buf_len++] = data[(*cnt)++];
+ if (s->buf_len < 2) continue;
+ switch (s->buffer[1]) {
+ case MARKER_COMMENT: required_length = 6; break;
+ case MARKER_ATMOVE: required_length = 8; break;
+ case MARKER_NEWLEN: required_length = 6; break;
+ case MARKER_ABORT:
+ case MARKER_SDNORM:
+ case MARKER_SDRST: required_length = 2; break;
+ case MARKER_STUFF:
+ /* forward stuffed 0xff to arithmetic decoder */
+ s->buf_len = 0;
+ decode_pscd(s, s->buffer, 2);
+ continue;
+ default:
+ return JBG_EMARKER;
+ }
+ while (s->buf_len < required_length && *cnt < len)
+ s->buffer[s->buf_len++] = data[(*cnt)++];
+ if (s->buf_len < required_length) continue;
+ /* now the buffer is filled with exactly one marker segment */
+ switch (s->buffer[1]) {
+ case MARKER_COMMENT:
+ s->comment_skip =
+ (((long) s->buffer[2] << 24) | ((long) s->buffer[3] << 16) |
+ ((long) s->buffer[4] << 8) | (long) s->buffer[5]);
+ break;
+ case MARKER_ATMOVE:
+ if (s->at_moves < JBG_ATMOVES_MAX) {
+ s->at_line[s->at_moves] =
+ (((long) s->buffer[2] << 24) | ((long) s->buffer[3] << 16) |
+ ((long) s->buffer[4] << 8) | (long) s->buffer[5]);
+ s->at_tx[s->at_moves] = (signed char) s->buffer[6];
+ s->at_ty[s->at_moves] = s->buffer[7];
+ if (s->at_tx[s->at_moves] < - (int) s->mx ||
+ s->at_tx[s->at_moves] > (int) s->mx ||
+ s->at_ty[s->at_moves] > (int) s->my ||
+ (s->at_ty[s->at_moves] == 0 && s->at_tx[s->at_moves] < 0))
+ return JBG_EINVAL;
+ if (s->at_ty[s->at_moves] != 0)
+ return JBG_EIMPL;
+ s->at_moves++;
+ } else
+ return JBG_EIMPL;
+ break;
+ case MARKER_NEWLEN:
+ y = (((long) s->buffer[2] << 24) | ((long) s->buffer[3] << 16) |
+ ((long) s->buffer[4] << 8) | (long) s->buffer[5]);
+ if (y > s->yd || !(s->options & JBG_VLENGTH))
+ return JBG_EINVAL;
+ s->yd = y;
+ /* calculate again number of stripes that will be required */
+ s->stripes = jbg_stripes(s->l0, s->yd, s->d);
+ break;
+ case MARKER_ABORT:
+ return JBG_EABORT;
+
+ case MARKER_SDNORM:
+ case MARKER_SDRST:
+ /* decode final pixels based on trailing zero bytes */
+ decode_pscd(s, s->buffer, 2);
+
+ arith_decode_init(s->s[s->ii[iindex[s->order & 7][PLANE]]] +
+ s->ii[iindex[s->order & 7][LAYER]] - s->dl,
+ s->ii[iindex[s->order & 7][STRIPE]] != s->stripes - 1
+ && s->buffer[1] != MARKER_SDRST);
+
+ s->reset[s->ii[iindex[s->order & 7][PLANE]]]
+ [s->ii[iindex[s->order & 7][LAYER]] - s->dl] =
+ (s->buffer[1] == MARKER_SDRST);
+
+ /* prepare for next SDE */
+ s->x = 0;
+ s->i = 0;
+ s->pseudo = 1;
+ s->at_moves = 0;
+
+ /* increment layer/stripe/plane loop variables */
+ /* start and end value for each loop: */
+ is[iindex[s->order & 7][STRIPE]] = 0;
+ ie[iindex[s->order & 7][STRIPE]] = s->stripes - 1;
+ is[iindex[s->order & 7][LAYER]] = s->dl;
+ ie[iindex[s->order & 7][LAYER]] = s->d;
+ is[iindex[s->order & 7][PLANE]] = 0;
+ ie[iindex[s->order & 7][PLANE]] = s->planes - 1;
+ i = 2; /* index to innermost loop */
+ do {
+ j = 0; /* carry flag */
+ if (++s->ii[i] > ie[i]) {
+ /* handling overflow of loop variable */
+ j = 1;
+ if (i > 0)
+ s->ii[i] = is[i];
+ }
+ } while (--i >= 0 && j);
+
+ s->buf_len = 0;
+
+ /* check whether this have been all SDEs */
+ if (j) {
+#ifdef DEBUG
+ fprintf(stderr, "This was the final SDE in this BIE, "
+ "%d bytes left.\n", len - *cnt);
+#endif
+ s->bie_len = 0;
+ return JBG_EOK;
+ }
+
+ /* check whether we have to abort because of xmax/ymax */
+ if (iindex[s->order & 7][LAYER] == 0 && i < 0) {
+ /* LAYER is the outermost loop and we have just gone to next layer */
+ if (jbg_ceil_half(s->xd, s->d - s->ii[0]) > s->xmax ||
+ jbg_ceil_half(s->yd, s->d - s->ii[0]) > s->ymax) {
+ s->xmax = 4294967295UL;
+ s->ymax = 4294967295UL;
+ return JBG_EOK_INTR;
+ }
+ if (s->ii[0] > (unsigned long) s->dmax) {
+ s->dmax = 256;
+ return JBG_EOK_INTR;
+ }
+ }
+
+ break;
+ }
+ s->buf_len = 0;
+
+ } else if (data[*cnt] == MARKER_ESC)
+ s->buffer[s->buf_len++] = data[(*cnt)++];
+
+ else {
+
+ /* we have found PSCD bytes */
+ *cnt += decode_pscd(s, data + *cnt, len - *cnt);
+ if (*cnt < len && data[*cnt] != 0xff) {
+#ifdef DEBUG
+ fprintf(stderr, "PSCD was longer than expected, unread bytes "
+ "%02x %02x %02x %02x ...\n", data[*cnt], data[*cnt+1],
+ data[*cnt+2], data[*cnt+3]);
+#endif
+ return JBG_EINVAL;
+ }
+
+ }
+ } /* of BID processing loop 'while (*cnt < len) ...' */
+
+ return JBG_EAGAIN;
+}
+
+
+/*
+ * After jbg_dec_in() returned JBG_EOK or JBG_EOK_INTR, you can call this
+ * function in order to find out the width of the image.
+ */
+long jbg_dec_getwidth(const struct jbg_dec_state *s)
+{
+ if (s->d < 0)
+ return -1;
+ if (iindex[s->order & 7][LAYER] == 0) {
+ if (s->ii[0] < 1)
+ return -1;
+ else
+ return jbg_ceil_half(s->xd, s->d - (s->ii[0] - 1));
+ }
+
+ return s->xd;
+}
+
+
+/*
+ * After jbg_dec_in() returned JBG_EOK or JBG_EOK_INTR, you can call this
+ * function in order to find out the height of the image.
+ */
+long jbg_dec_getheight(const struct jbg_dec_state *s)
+{
+ if (s->d < 0)
+ return -1;
+ if (iindex[s->order & 7][LAYER] == 0) {
+ if (s->ii[0] < 1)
+ return -1;
+ else
+ return jbg_ceil_half(s->yd, s->d - (s->ii[0] - 1));
+ }
+
+ return s->yd;
+}
+
+
+/*
+ * After jbg_dec_in() returned JBG_EOK or JBG_EOK_INTR, you can call this
+ * function in order to get a pointer to the image.
+ */
+unsigned char *jbg_dec_getimage(const struct jbg_dec_state *s, int plane)
+{
+ if (s->d < 0)
+ return NULL;
+ if (iindex[s->order & 7][LAYER] == 0) {
+ if (s->ii[0] < 1)
+ return NULL;
+ else
+ return s->lhp[(s->ii[0] - 1) & 1][plane];
+ }
+
+ return s->lhp[s->d & 1][plane];
+}
+
+
+/*
+ * After jbg_dec_in() returned JBG_EOK or JBG_EOK_INTR, you can call
+ * this function in order to find out the size in bytes of one
+ * bitplane of the image.
+ */
+long jbg_dec_getsize(const struct jbg_dec_state *s)
+{
+ if (s->d < 0)
+ return -1;
+ if (iindex[s->order & 7][LAYER] == 0) {
+ if (s->ii[0] < 1)
+ return -1;
+ else
+ return
+ jbg_ceil_half(s->xd, s->d - (s->ii[0] - 1) + 3) *
+ jbg_ceil_half(s->yd, s->d - (s->ii[0] - 1));
+ }
+
+ return jbg_ceil_half(s->xd, 3) * s->yd;
+}
+
+
+/*
+ * After jbg_dec_in() returned JBG_EOK or JBG_EOK_INTR, you can call
+ * this function in order to find out the size of the image that you
+ * can retrieve with jbg_merge_planes().
+ */
+long jbg_dec_getsize_merged(const struct jbg_dec_state *s)
+{
+ if (s->d < 0)
+ return -1;
+ if (iindex[s->order & 7][LAYER] == 0) {
+ if (s->ii[0] < 1)
+ return -1;
+ else
+ return
+ jbg_ceil_half(s->xd, s->d - (s->ii[0] - 1)) *
+ jbg_ceil_half(s->yd, s->d - (s->ii[0] - 1)) *
+ ((s->planes + 7) / 8);
+ }
+
+ return s->xd * s->yd * ((s->planes + 7) / 8);
+}
+
+
+/*
+ * The destructor function which releases any resources obtained by the
+ * other decoder functions.
+ */
+void jbg_dec_free(struct jbg_dec_state *s)
+{
+ int i;
+ extern char jbg_dptable[];
+
+ if (s->d < 0 || s->s == NULL)
+ return;
+ s->d = -2;
+
+ for (i = 0; i < s->planes; i++) {
+ checked_free(s->s[i]);
+ checked_free(s->tx[i]);
+ checked_free(s->ty[i]);
+ checked_free(s->reset[i]);
+ checked_free(s->lntp[i]);
+ checked_free(s->lhp[0][i]);
+ checked_free(s->lhp[1][i]);
+ }
+
+ checked_free(s->s);
+ checked_free(s->tx);
+ checked_free(s->ty);
+ checked_free(s->reset);
+ checked_free(s->lntp);
+ checked_free(s->lhp[0]);
+ checked_free(s->lhp[1]);
+ if (s->dppriv && s->dppriv != jbg_dptable)
+ checked_free(s->dppriv);
+
+ s->s = NULL;
+
+ return;
+}
+
+
+/*
+ * Split bigendian integer pixel field into separate bit planes. In the
+ * src array, every pixel is represented by a ((has_planes + 7) / 8) byte
+ * long word, most significant byte first. While has_planes describes
+ * the number of used bits per pixel in the source image, encode_plane
+ * is the number of most significant bits among those that we
+ * actually transfer to dest.
+ */
+void jbg_split_planes(unsigned long x, unsigned long y, int has_planes,
+ int encode_planes,
+ const unsigned char *src, unsigned char **dest,
+ int use_graycode)
+{
+ unsigned long bpl = jbg_ceil_half(x, 3); /* bytes per line in dest plane */
+ unsigned long line, i;
+ unsigned k = 8;
+ int p;
+ unsigned prev; /* previous *src byte shifted by 8 bit to the left */
+ register int bits, msb = has_planes - 1;
+ int bitno;
+
+ /* sanity checks */
+ if (encode_planes > has_planes)
+ encode_planes = has_planes;
+ use_graycode = use_graycode != 0 && encode_planes > 1;
+
+ for (p = 0; p < encode_planes; p++)
+ memset(dest[p], 0, bpl * y);
+
+ for (line = 0; line < y; line++) { /* lines loop */
+ for (i = 0; i * 8 < x; i++) { /* dest bytes loop */
+ for (k = 0; k < 8 && i * 8 + k < x; k++) { /* pixel loop */
+ prev = 0;
+ for (p = 0; p < encode_planes; p++) { /* bit planes loop */
+ /* calculate which bit in *src do we want */
+ bitno = (msb - p) & 7;
+ /* put this bit with its left neighbor right adjusted into bits */
+ bits = (prev | *src) >> bitno;
+ /* go to next *src byte, but keep old */
+ if (bitno == 0)
+ prev = *src++ << 8;
+ /* make space for inserting new bit */
+ dest[p][bpl * line + i] <<= 1;
+ /* insert bit, if requested apply Gray encoding */
+ dest[p][bpl * line + i] |= (bits ^ (use_graycode & (bits>>1))) & 1;
+ /*
+ * Theorem: Let b(n),...,b(1),b(0) be the digits of a
+ * binary word and let g(n),...,g(1),g(0) be the digits of the
+ * corresponding Gray code word, then g(i) = b(i) xor b(i+1).
+ */
+ }
+ /* skip unused *src bytes */
+ for (;p < has_planes; p++)
+ if (((msb - p) & 7) == 0)
+ src++;
+ }
+ }
+ for (p = 0; p < encode_planes; p++) /* right padding loop */
+ dest[p][bpl * (line + 1) - 1] <<= 8 - k;
+ }
+
+ return;
+}
+
+/*
+ * Merge the separate bit planes decoded by the JBIG decoder into an
+ * integer pixel field. This is essentially the counterpart to
+ * jbg_split_planes().
+ */
+void jbg_dec_merge_planes(const struct jbg_dec_state *s, int use_graycode,
+ void (*data_out)(unsigned char *start, size_t len,
+ void *file), void *file)
+{
+#define BUFLEN 4096
+ int bpp;
+ unsigned long bpl, line, i;
+ unsigned k = 8;
+ int p;
+ unsigned char buf[BUFLEN];
+ unsigned char *bp = buf;
+ unsigned char **src;
+ unsigned long x, y;
+ unsigned v;
+
+ /* sanity check */
+ use_graycode = use_graycode != 0;
+
+ x = jbg_dec_getwidth(s);
+ y = jbg_dec_getheight(s);
+ if (x <= 0 || y <= 0)
+ return;
+ bpp = (s->planes + 7) / 8; /* bytes per pixel in dest image */
+ bpl = jbg_ceil_half(x, 3); /* bytes per line in src plane */
+
+ if (iindex[s->order & 7][LAYER] == 0)
+ if (s->ii[0] < 1)
+ return;
+ else
+ src = s->lhp[(s->ii[0] - 1) & 1];
+ else
+ src = s->lhp[s->d & 1];
+
+ for (line = 0; line < y; line++) { /* lines loop */
+ for (i = 0; i * 8 < x; i++) { /* src bytes loop */
+ for (k = 0; k < 8 && i * 8 + k < x; k++) { /* pixel loop */
+ v = 0;
+ for (p = 0; p < s->planes;) { /* dest bytes loop */
+ do {
+ v = (v << 1) |
+ (((src[p][bpl * line + i] >> (7 - k)) & 1) ^
+ (use_graycode & v));
+ } while ((s->planes - ++p) & 7);
+ *bp++ = v;
+ if (bp - buf == BUFLEN) {
+ data_out(buf, BUFLEN, file);
+ bp = buf;
+ }
+ }
+ }
+ }
+ }
+
+ if (bp - buf > 0)
+ data_out(buf, bp - buf, file);
+
+ return;
+}
+
+
+/*
+ * Given a pointer p to the first byte of either a marker segment or a
+ * PSCD, as well as the length len of the remaining data, return
+ * either the pointer to the first byte of the next marker segment or
+ * PSCD, or p+len if this was the last one, or NULL if some error was
+ * encountered.
+ */
+unsigned char *jbg_next_pscdms(unsigned char *p, size_t len)
+{
+ unsigned char *pp;
+ unsigned long l;
+
+ if (len < 2)
+ return NULL;
+
+ if (p[0] != MARKER_ESC || p[1] == MARKER_STUFF) {
+ do {
+ while (p[0] == MARKER_ESC && p[1] == MARKER_STUFF) {
+ p += 2;
+ len -= 2;
+ if (len < 2) return NULL;
+ }
+ pp = (unsigned char *) memchr(p, MARKER_ESC, len - 1);
+ if (!pp) return NULL;
+ l = pp - p;
+ assert(l < len);
+ p += l;
+ len -= l;
+ } while (p[1] == MARKER_STUFF);
+ } else {
+ switch (p[1]) {
+ case MARKER_SDNORM:
+ case MARKER_SDRST:
+ case MARKER_ABORT:
+ return p + 2;
+ case MARKER_NEWLEN:
+ if (len < 6) return NULL;
+ return p + 6;
+ case MARKER_ATMOVE:
+ if (len < 8) return NULL;
+ return p + 8;
+ case MARKER_COMMENT:
+ if (len < 6) return NULL;
+ l = (((long) p[2] << 24) | ((long) p[3] << 16) |
+ ((long) p[4] << 8) | (long) p[5]);
+ if (len - 6 < l) return NULL;
+ return p + 6 + l;
+ default:
+ return NULL;
+ }
+ }
+
+ return p;
+}
+
+
+/*
+ * Scan a complete BIE for a NEWLEN marker segment, then read the new
+ * YD value found in it and use it to overwrite the one in the BIE
+ * header. Use this procedure if a BIE initially declares an
+ * unreasonably high provisional YD value (e.g., 0xffffffff) or
+ * depends on the fact that section 6.2.6.2 of ITU-T T.82 says that a
+ * NEWLEN marker segment "could refer to a line in the immediately
+ * preceding stripe due to an unexpected termination of the image or
+ * the use of only such stripe". ITU-T.85 explicitely suggests the
+ * use of this for fax machines that start transmission before having
+ * encountered the end of the page. None of this is necessary for
+ * BIEs produced by JBIG-KIT, which normally does not use NEWLEN.
+ */
+int jbg_newlen(unsigned char *bie, size_t len)
+{
+ unsigned char *p = bie + 20;
+ int i;
+
+ if (len < 20)
+ return JBG_EAGAIN;
+ if ((bie[19] & (JBG_DPON | JBG_DPPRIV | JBG_DPLAST))
+ == (JBG_DPON | JBG_DPPRIV))
+ p += 1728; /* skip DPTABLE */
+ if (p >= bie + len)
+ return JBG_EAGAIN;
+
+ while ((p = jbg_next_pscdms(p, len - (p - bie)))) {
+ if (p == bie + len)
+ return JBG_EOK;
+ else if (p[0] == MARKER_ESC)
+ switch (p[1]) {
+ case MARKER_NEWLEN:
+ /* overwrite YD in BIH with YD from NEWLEN */
+ for (i = 0; i < 4; i++) {
+ bie[8+i] = p[2+i];
+ }
+ return JBG_EOK;
+ case MARKER_ABORT:
+ return JBG_EABORT;
+ }
+ }
+ return JBG_EINVAL;
+}
diff --git a/jbig.h b/jbig.h
new file mode 100644
index 0000000..c095a14
--- /dev/null
+++ b/jbig.h
@@ -0,0 +1,273 @@
+/*
+ * Header file for the portable free JBIG compression library
+ *
+ * Markus Kuhn -- http://www.cl.cam.ac.uk/~mgk25/
+ *
+ * Id: jbig.h,v 1.17 2004-06-11 15:18:21+01 mgk25 Exp $
+ * $Id: jbig.h,v 1.3 2004/06/12 02:33:05 rick Exp $
+ */
+
+#ifndef JBG_H
+#define JBG_H
+
+#include <stddef.h>
+
+/*
+ * JBIG-KIT version number
+ */
+
+#define JBG_VERSION "1.6"
+
+/*
+ * Buffer block for SDEs which are temporarily stored by encoder
+ */
+
+#define JBG_BUFSIZE 4000
+
+struct jbg_buf {
+ unsigned char d[JBG_BUFSIZE]; /* one block of a buffer list */
+ int len; /* length of the data in this block */
+ struct jbg_buf *next; /* pointer to next block */
+ struct jbg_buf *previous; /* pointer to previous block *
+ * (unused in freelist) */
+ struct jbg_buf *last; /* only used in list head: final block of list */
+ struct jbg_buf **free_list; /* pointer to pointer to head of free list */
+};
+
+/*
+ * Maximum number of ATMOVEs per stripe that decoder can handle
+ */
+
+#define JBG_ATMOVES_MAX 64
+
+/*
+ * Option and order flags
+ */
+
+#define JBG_HITOLO 0x08
+#define JBG_SEQ 0x04
+#define JBG_ILEAVE 0x02
+#define JBG_SMID 0x01
+
+#define JBG_LRLTWO 0x40
+#define JBG_VLENGTH 0x20
+#define JBG_TPDON 0x10
+#define JBG_TPBON 0x08
+#define JBG_DPON 0x04
+#define JBG_DPPRIV 0x02
+#define JBG_DPLAST 0x01
+
+#define JBG_DELAY_AT 0x100 /* delay ATMOVE until the first line of the next
+ * stripe. Option available for compatibility
+ * with conformance test example in clause 7.2.*/
+
+
+/*
+ * Possible error code return values
+ */
+
+#define JBG_EOK 0
+#define JBG_EOK_INTR 1
+#define JBG_EAGAIN 2
+#define JBG_ENOMEM 3
+#define JBG_EABORT 4
+#define JBG_EMARKER 5
+#define JBG_ENOCONT 6
+#define JBG_EINVAL 7
+#define JBG_EIMPL 8
+
+/*
+ * Language code for error message strings (based on ISO 639 2-letter
+ * standard language name abbreviations).
+ */
+
+#define JBG_EN 0 /* English */
+#define JBG_DE_8859_1 1 /* German in ISO Latin 1 character set */
+#define JBG_DE_UTF_8 2 /* German in Unicode UTF-8 encoding */
+
+/*
+ * Status description of an arithmetic encoder
+ */
+
+struct jbg_arenc_state {
+ unsigned char st[4096]; /* probability status for contexts, MSB = MPS */
+ unsigned long c; /* C register, base of coding intervall, *
+ * layout as in Table 23 */
+ unsigned long a; /* A register, normalized size of coding intervall */
+ long sc; /* counter for buffered 0xff values which might overflow */
+ int ct; /* bit shift counter, determines when next byte will be written */
+ int buffer; /* buffer for most recent output byte != 0xff */
+ void (*byte_out)(int, void *); /* function which receives all PSCD bytes */
+ void *file; /* parameter passed to byte_out */
+};
+
+
+/*
+ * Status description of an arithmetic decoder
+ */
+
+enum jbg_ardec_result {
+ JBG_OK, /* symbol has been successfully decoded */
+ JBG_READY, /* no more bytes of this PSCD required, marker *
+ * encountered, probably more symbols available */
+ JBG_MORE, /* more PSCD data bytes required to decode a symbol */
+ JBG_MARKER /* more PSCD data bytes required, ignored final 0xff byte */
+};
+
+struct jbg_ardec_state {
+ unsigned char st[4096]; /* probability status for contexts, MSB = MPS */
+ unsigned long c; /* C register, base of coding intervall, *
+ * layout as in Table 25 */
+ unsigned long a; /* A register, normalized size of coding intervall */
+ int ct; /* bit shift counter, determines when next byte will be read */
+ unsigned char *pscd_ptr; /* pointer to next PSCD data byte */
+ unsigned char *pscd_end; /* pointer to byte after PSCD */
+ enum jbg_ardec_result result; /* result of previous decode call */
+ int startup; /* controls initial fill of s->c */
+};
+
+#ifdef TEST_CODEC
+void arith_encode_init(struct jbg_arenc_state *s, int reuse_st);
+void arith_encode_flush(struct jbg_arenc_state *s);
+void arith_encode(struct jbg_arenc_state *s, int cx, int pix);
+void arith_decode_init(struct jbg_ardec_state *s, int reuse_st);
+int arith_decode(struct jbg_ardec_state *s, int cx);
+#endif
+
+
+/*
+ * Status of a JBIG encoder
+ */
+
+struct jbg_enc_state {
+ int d; /* resolution layer of the input image */
+ unsigned long xd, yd; /* size of the input image (resolution layer d) */
+ unsigned long yd1; /* BIH announced height of image, use yd1 != yd to
+ emulate T.85-style NEWLEN height updates for tests */
+ int planes; /* number of different bitmap planes */
+ int dl; /* lowest resolution layer in the next BIE */
+ int dh; /* highest resolution layer in the next BIE */
+ unsigned long l0; /* number of lines per stripe at lowest *
+ * resolution layer 0 */
+ unsigned long stripes; /* number of stripes required (determ. by l0) */
+ unsigned char **lhp[2]; /* pointers to lower/higher resolution images */
+ int *highres; /* index [plane] of highres image in lhp[] */
+ int order; /* SDE ordering parameters */
+ int options; /* encoding parameters */
+ unsigned mx, my; /* maximum ATMOVE window size */
+ int *tx; /* array [plane] with x-offset of adaptive template pixel */
+ char *dppriv; /* optional private deterministic prediction table */
+ char *res_tab; /* table for the resolution reduction algorithm */
+ struct jbg_buf ****sde; /* array [stripe][layer][plane] pointers to *
+ * buffers for stored SDEs */
+ struct jbg_arenc_state *s; /* array [planes] for arithm. encoder status */
+ struct jbg_buf *free_list; /* list of currently unused SDE block buffers */
+ void (*data_out)(unsigned char *start, size_t len, void *file);
+ /* data write callback */
+ void *file; /* parameter passed to data_out() */
+ char *tp; /* buffer for temp. values used by diff. typical prediction */
+};
+
+
+/*
+ * Status of a JBIG decoder
+ */
+
+struct jbg_dec_state {
+ /* data from BIH */
+ int d; /* resolution layer of the full image */
+ int dl; /* first resolution layer in this BIE */
+ unsigned long xd, yd; /* size of the full image (resolution layer d) */
+ int planes; /* number of different bitmap planes */
+ unsigned long l0; /* number of lines per stripe at lowest *
+ * resolution layer 0 */
+ unsigned long stripes; /* number of stripes required (determ. by l0) */
+ int order; /* SDE ordering parameters */
+ int options; /* encoding parameters */
+ int mx, my; /* maximum ATMOVE window size */
+ char *dppriv; /* optional private deterministic prediction table */
+
+ /* loop variables */
+ unsigned long ii[3]; /* current stripe, layer, plane (outer loop first) */
+
+ /*
+ * Pointers to array [planes] of lower/higher resolution images.
+ * lhp[d & 1] contains image of layer d.
+ */
+ unsigned char **lhp[2];
+
+ /* status information */
+ int **tx, **ty; /* array [plane][layer-dl] with x,y-offset of AT pixel */
+ struct jbg_ardec_state **s; /* array [plane][layer-dl] for arithmetic *
+ * decoder status */
+ int **reset; /* array [plane][layer-dl] remembers if previous stripe *
+ * in that plane/resolution ended with SDRST. */
+ unsigned long bie_len; /* number of bytes read so far */
+ unsigned char buffer[20]; /* used to store BIH or marker segments fragm. */
+ int buf_len; /* number of bytes in buffer */
+ unsigned long comment_skip; /* remaining bytes of a COMMENT segment */
+ unsigned long x; /* x position of next pixel in current SDE */
+ unsigned long i; /* line in current SDE (first line of each stripe is 0) */
+ int at_moves; /* number of AT moves in the current stripe */
+ unsigned long at_line[JBG_ATMOVES_MAX]; /* lines at which an *
+ * AT move will happen */
+ int at_tx[JBG_ATMOVES_MAX], at_ty[JBG_ATMOVES_MAX]; /* ATMOVE offsets in *
+ * current stripe */
+ unsigned long line_h1, line_h2, line_h3; /* variables of decode_pscd */
+ unsigned long line_l1, line_l2, line_l3;
+ int pseudo; /* flag for TPBON/TPDON: next pixel is pseudo pixel */
+ int **lntp; /* flag [plane][layer-dl] for TP: line is not typical */
+
+ unsigned long xmax, ymax; /* if possible abort before image gets *
+ * larger than this size */
+ int dmax; /* abort after this layer */
+};
+
+
+/* some macros (too trivial for a function) */
+
+#define jbg_dec_getplanes(s) ((s)->planes)
+
+
+/* function prototypes */
+
+void jbg_enc_init(struct jbg_enc_state *s, unsigned long x, unsigned long y,
+ int planes, unsigned char **p,
+ void (*data_out)(unsigned char *start, size_t len,
+ void *file),
+ void *file);
+int jbg_enc_lrlmax(struct jbg_enc_state *s, unsigned long mwidth,
+ unsigned long mheight);
+void jbg_enc_layers(struct jbg_enc_state *s, int d);
+int jbg_enc_lrange(struct jbg_enc_state *s, int dl, int dh);
+void jbg_enc_options(struct jbg_enc_state *s, int order, int options,
+ unsigned long l0, int mx, int my);
+void jbg_enc_out(struct jbg_enc_state *s);
+void jbg_enc_free(struct jbg_enc_state *s);
+
+void jbg_dec_init(struct jbg_dec_state *s);
+void jbg_dec_maxsize(struct jbg_dec_state *s, unsigned long xmax,
+ unsigned long ymax);
+int jbg_dec_in(struct jbg_dec_state *s, unsigned char *data, size_t len,
+ size_t *cnt);
+long jbg_dec_getwidth(const struct jbg_dec_state *s);
+long jbg_dec_getheight(const struct jbg_dec_state *s);
+unsigned char *jbg_dec_getimage(const struct jbg_dec_state *s, int plane);
+long jbg_dec_getsize(const struct jbg_dec_state *s);
+void jbg_dec_merge_planes(const struct jbg_dec_state *s, int use_graycode,
+ void (*data_out)(unsigned char *start, size_t len,
+ void *file), void *file);
+long jbg_dec_getsize_merged(const struct jbg_dec_state *s);
+void jbg_dec_free(struct jbg_dec_state *s);
+
+const char *jbg_strerror(int errnum, int language);
+void jbg_int2dppriv(unsigned char *dptable, const char *internal);
+void jbg_dppriv2int(char *internal, const unsigned char *dptable);
+unsigned long jbg_ceil_half(unsigned long x, int n);
+void jbg_split_planes(unsigned long x, unsigned long y, int has_planes,
+ int encode_planes,
+ const unsigned char *src, unsigned char **dest,
+ int use_graycode);
+int jbg_newlen(unsigned char *bie, size_t len);
+
+#endif /* JBG_H */
diff --git a/jbig_tab.c b/jbig_tab.c
new file mode 100644
index 0000000..bea768a
--- /dev/null
+++ b/jbig_tab.c
@@ -0,0 +1,429 @@
+/*
+ * Probability estimation tables for the arithmetic encoder/decoder
+ * given by ITU T.82 Table 24.
+ *
+ * Id: jbig_tab.c,v 1.6 1998-04-05 18:36:19+01 mgk25 Rel $
+ * $Id: jbig_tab.c,v 1.3 2004/06/12 02:33:05 rick Exp $
+ */
+
+short jbg_lsz[113] = {
+ 0x5a1d, 0x2586, 0x1114, 0x080b, 0x03d8, 0x01da, 0x00e5, 0x006f,
+ 0x0036, 0x001a, 0x000d, 0x0006, 0x0003, 0x0001, 0x5a7f, 0x3f25,
+ 0x2cf2, 0x207c, 0x17b9, 0x1182, 0x0cef, 0x09a1, 0x072f, 0x055c,
+ 0x0406, 0x0303, 0x0240, 0x01b1, 0x0144, 0x00f5, 0x00b7, 0x008a,
+ 0x0068, 0x004e, 0x003b, 0x002c, 0x5ae1, 0x484c, 0x3a0d, 0x2ef1,
+ 0x261f, 0x1f33, 0x19a8, 0x1518, 0x1177, 0x0e74, 0x0bfb, 0x09f8,
+ 0x0861, 0x0706, 0x05cd, 0x04de, 0x040f, 0x0363, 0x02d4, 0x025c,
+ 0x01f8, 0x01a4, 0x0160, 0x0125, 0x00f6, 0x00cb, 0x00ab, 0x008f,
+ 0x5b12, 0x4d04, 0x412c, 0x37d8, 0x2fe8, 0x293c, 0x2379, 0x1edf,
+ 0x1aa9, 0x174e, 0x1424, 0x119c, 0x0f6b, 0x0d51, 0x0bb6, 0x0a40,
+ 0x5832, 0x4d1c, 0x438e, 0x3bdd, 0x34ee, 0x2eae, 0x299a, 0x2516,
+ 0x5570, 0x4ca9, 0x44d9, 0x3e22, 0x3824, 0x32b4, 0x2e17, 0x56a8,
+ 0x4f46, 0x47e5, 0x41cf, 0x3c3d, 0x375e, 0x5231, 0x4c0f, 0x4639,
+ 0x415e, 0x5627, 0x50e7, 0x4b85, 0x5597, 0x504f, 0x5a10, 0x5522,
+ 0x59eb
+};
+
+unsigned char jbg_nmps[113] = {
+ 1, 2, 3, 4, 5, 6, 7, 8,
+ 9, 10, 11, 12, 13, 13, 15, 16,
+ 17, 18, 19, 20, 21, 22, 23, 24,
+ 25, 26, 27, 28, 29, 30, 31, 32,
+ 33, 34, 35, 9, 37, 38, 39, 40,
+ 41, 42, 43, 44, 45, 46, 47, 48,
+ 49, 50, 51, 52, 53, 54, 55, 56,
+ 57, 58, 59, 60, 61, 62, 63, 32,
+ 65, 66, 67, 68, 69, 70, 71, 72,
+ 73, 74, 75, 76, 77, 78, 79, 48,
+ 81, 82, 83, 84, 85, 86, 87, 71,
+ 89, 90, 91, 92, 93, 94, 86, 96,
+ 97, 98, 99, 100, 93, 102, 103, 104,
+ 99, 106, 107, 103, 109, 107, 111, 109,
+ 111
+};
+
+/*
+ * least significant 7 bits (mask 0x7f) of jbg_nlps[] contain NLPS value,
+ * most significant bit (mask 0x80) contains SWTCH bit
+ */
+unsigned char jbg_nlps[113] = {
+ 129, 14, 16, 18, 20, 23, 25, 28,
+ 30, 33, 35, 9, 10, 12, 143, 36,
+ 38, 39, 40, 42, 43, 45, 46, 48,
+ 49, 51, 52, 54, 56, 57, 59, 60,
+ 62, 63, 32, 33, 165, 64, 65, 67,
+ 68, 69, 70, 72, 73, 74, 75, 77,
+ 78, 79, 48, 50, 50, 51, 52, 53,
+ 54, 55, 56, 57, 58, 59, 61, 61,
+ 193, 80, 81, 82, 83, 84, 86, 87,
+ 87, 72, 72, 74, 74, 75, 77, 77,
+ 208, 88, 89, 90, 91, 92, 93, 86,
+ 216, 95, 96, 97, 99, 99, 93, 223,
+ 101, 102, 103, 104, 99, 105, 106, 107,
+ 103, 233, 108, 109, 110, 111, 238, 112,
+ 240
+};
+
+/*
+ * Resolution reduction table given by ITU-T T.82 Table 17
+ */
+
+char jbg_resred[4096] = {
+ 0,0,0,1,0,0,0,1,0,1,1,1,0,0,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,
+ 0,0,1,1,0,0,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,
+ 0,0,0,0,0,0,0,1,0,1,1,1,0,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,
+ 0,0,1,1,0,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,
+ 0,0,1,1,0,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,
+ 0,1,1,1,1,1,0,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,
+ 0,0,1,1,0,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,1,1,1,1,1,1,1,0,1,1,1,1,1,0,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,
+ 0,0,0,0,0,0,0,1,0,0,1,1,0,1,1,1,1,1,1,1,1,1,0,1,1,1,1,1,1,1,1,1,
+ 0,0,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,1,1,
+ 0,0,1,1,0,1,1,1,0,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,0,1,1,1,1,1,1,1,
+ 0,1,1,1,1,1,1,1,0,1,1,1,1,1,1,1,0,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,
+ 0,0,1,1,0,1,0,1,1,1,1,1,1,1,1,1,1,1,1,1,0,1,1,1,1,1,1,1,1,1,1,1,
+ 1,1,0,1,1,1,1,1,0,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,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,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,1,1,1,
+ 0,0,0,0,0,0,0,1,0,0,1,0,0,0,1,1,0,0,0,0,0,1,0,1,0,0,1,1,1,0,1,1,
+ 0,0,0,1,0,0,0,1,0,0,1,0,0,0,1,1,0,1,1,1,0,0,0,1,1,1,1,1,1,1,1,1,
+ 0,0,0,0,0,0,0,1,0,1,1,1,0,1,0,1,0,0,1,1,1,0,1,1,0,1,1,1,1,1,1,1,
+ 0,0,0,0,0,0,0,0,0,1,0,1,0,0,1,1,1,1,1,1,1,1,1,0,1,1,1,1,1,1,1,1,
+ 0,0,0,0,0,0,0,1,0,1,0,0,0,0,0,1,0,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,
+ 0,0,0,0,1,0,0,1,1,0,1,1,0,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,
+ 0,0,0,0,0,0,0,0,0,1,0,1,0,0,1,1,0,1,1,1,1,1,1,1,1,1,1,1,1,0,1,1,
+ 1,0,0,1,0,0,1,1,0,1,1,1,1,0,0,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,
+ 0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,1,1,1,0,0,1,1,1,1,1,1,1,1,1,1,
+ 0,0,1,1,0,0,0,1,0,0,0,1,0,0,1,1,0,1,1,1,0,1,0,1,1,1,1,1,1,1,1,1,
+ 0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,1,1,0,1,1,0,1,1,1,1,1,1,0,1,1,1,0,
+ 0,0,0,0,0,0,0,1,0,0,1,0,0,0,0,1,1,1,1,1,1,1,0,0,1,1,1,1,1,1,1,1,
+ 0,0,0,0,0,0,0,0,1,0,0,1,0,0,1,1,0,1,1,1,0,1,0,1,1,1,1,1,1,1,1,1,
+ 0,0,0,1,0,0,0,1,0,1,1,0,1,0,1,1,1,1,1,1,0,1,0,1,1,1,1,1,1,1,1,1,
+ 1,1,1,0,1,0,0,1,1,1,1,1,0,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,0,1,1,
+ 1,0,1,1,0,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,0,1,1,1,1,1,1,1,1,1,1,
+ 0,0,0,0,0,0,0,1,0,0,1,0,0,0,1,1,0,0,0,0,0,0,0,1,0,0,1,1,1,1,1,1,
+ 0,0,0,1,0,0,0,1,0,0,0,0,0,0,0,1,0,1,1,1,0,1,1,1,1,1,1,1,1,1,1,1,
+ 0,0,0,0,0,0,0,1,0,1,1,1,0,1,0,1,0,1,1,0,1,0,1,1,0,1,1,1,1,1,1,1,
+ 0,0,0,0,0,0,0,0,0,1,0,1,0,0,1,1,1,1,1,1,1,1,1,0,1,1,1,1,1,1,1,1,
+ 0,0,0,0,0,0,0,1,0,1,1,0,0,0,0,1,0,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,
+ 0,0,1,0,1,0,0,1,0,0,1,1,0,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,
+ 0,0,0,0,0,0,0,0,0,1,1,1,0,0,1,1,0,0,1,1,1,1,1,1,0,1,1,1,1,0,1,1,
+ 1,0,0,1,0,0,1,0,0,1,1,1,1,1,0,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,
+ 0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,1,1,1,1,0,1,1,1,1,1,1,1,1,1,0,
+ 0,0,1,0,1,1,1,1,0,0,0,1,1,0,1,1,0,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,
+ 0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,1,0,0,1,1,0,1,1,1,1,1,1,1,1,1,1,0,
+ 0,0,0,0,1,0,0,1,0,0,1,1,0,1,1,1,0,1,1,1,1,1,1,0,0,1,1,1,1,1,1,1,
+ 0,0,0,0,0,0,0,0,1,1,0,1,0,0,1,0,0,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,
+ 0,0,0,1,1,0,1,1,0,1,1,0,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,
+ 0,0,0,0,0,0,0,0,0,1,1,1,0,1,0,1,0,1,1,1,1,1,1,1,0,1,1,1,0,1,1,1,
+ 0,0,1,0,0,1,1,1,0,1,1,1,1,1,1,1,0,1,1,1,1,0,1,1,0,1,1,1,1,1,1,1,
+ 0,0,0,0,0,0,0,1,0,0,0,0,0,0,1,1,0,0,0,0,0,0,0,1,0,0,0,0,1,0,0,1,
+ 0,0,0,1,0,0,0,1,0,0,0,0,0,0,0,1,0,1,0,0,0,0,0,1,1,0,0,1,0,0,1,1,
+ 0,0,0,0,0,0,0,1,0,1,1,1,0,1,0,1,0,0,1,0,0,0,0,1,0,1,0,1,0,1,0,1,
+ 0,0,0,0,0,0,0,0,0,1,0,1,0,0,0,1,1,0,0,0,0,0,0,0,1,1,1,1,0,1,1,1,
+ 0,0,0,0,0,0,0,1,0,1,0,0,0,0,0,1,0,1,1,0,1,0,1,1,0,0,0,1,0,0,1,1,
+ 0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,1,1,1,1,1,0,1,1,1,1,1,1,1,1,1,1,
+ 0,0,0,0,0,0,0,0,0,1,0,1,0,0,0,1,0,0,0,0,0,0,0,1,0,1,1,1,0,0,1,1,
+ 0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,1,1,0,1,1,0,1,1,1,1,1,1,1,1,1,1,1,
+ 0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,1,1,0,0,0,0,1,1,0,0,0,0,0,0,1,
+ 0,0,1,0,0,1,1,1,0,0,0,0,1,0,0,1,0,0,0,1,1,1,1,0,1,0,1,1,1,1,1,1,
+ 0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,1,0,1,0,1,1,0,
+ 0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,1,1,1,1,1,1,1,
+ 0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,1,0,0,0,0,1,0,1,1,1,0,1,1,1,
+ 0,0,0,0,0,0,1,1,0,0,0,0,0,0,0,1,0,0,1,1,1,1,1,1,1,1,1,1,1,1,1,1,
+ 0,1,1,0,1,0,0,0,1,1,0,1,0,0,0,0,1,1,1,1,0,0,1,1,1,0,1,1,0,0,1,1,
+ 0,0,0,0,0,0,0,0,1,1,0,1,0,0,1,1,1,1,1,1,1,0,1,1,1,1,1,1,1,1,1,1,
+ 0,0,0,0,0,0,0,1,0,0,0,0,0,0,1,1,0,0,1,1,0,1,1,1,1,1,1,1,1,1,1,1,
+ 0,0,1,1,0,0,1,1,0,0,1,1,0,1,1,1,0,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,
+ 0,0,0,0,0,0,0,1,0,1,1,1,0,1,1,1,0,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,
+ 0,0,0,1,0,0,0,1,0,1,1,1,1,0,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,
+ 0,0,0,0,0,0,0,1,1,1,1,1,0,1,1,1,0,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,
+ 0,0,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,0,1,1,1,1,1,1,1,1,1,
+ 0,0,0,1,0,0,1,0,1,1,1,1,0,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,1,1,1,1,1,0,1,1,1,1,1,1,1,1,1,0,1,1,1,1,1,1,1,
+ 0,0,0,0,0,0,0,1,0,0,0,1,0,0,1,0,0,1,1,1,1,1,0,1,1,1,1,1,1,1,1,1,
+ 0,0,1,1,1,1,1,1,0,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,
+ 0,0,0,0,0,0,0,0,0,1,1,0,0,0,1,0,1,1,1,1,1,1,1,1,0,1,1,1,1,1,1,1,
+ 0,0,1,1,1,1,1,1,0,0,1,1,1,1,1,1,0,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,
+ 0,0,0,1,0,0,0,0,1,1,1,1,1,1,1,1,1,1,1,1,0,1,1,1,1,1,1,1,1,1,1,1,
+ 0,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,0,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,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,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,
+ 0,0,0,0,0,0,0,1,0,0,1,0,0,0,1,1,0,0,0,0,0,0,0,1,0,0,0,1,1,0,1,1,
+ 0,0,0,1,0,0,0,1,0,0,1,0,0,0,1,1,0,1,1,1,0,1,1,1,1,1,1,1,1,1,1,1,
+ 0,0,0,0,0,0,0,1,0,1,1,1,0,1,0,1,0,0,1,0,1,0,1,1,0,1,1,1,0,1,1,1,
+ 0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,1,1,0,1,1,1,1,1,0,1,1,1,1,1,1,1,1,
+ 0,0,0,0,0,0,0,1,1,1,0,0,0,0,0,1,0,1,0,1,1,0,1,1,0,1,1,1,1,1,1,1,
+ 0,0,0,0,1,0,0,1,0,0,1,1,0,0,1,1,0,1,1,1,1,1,0,1,1,1,1,1,1,1,1,1,
+ 0,0,0,0,0,0,0,0,0,1,0,1,0,0,0,1,0,0,1,1,0,1,1,1,1,1,1,1,1,0,1,1,
+ 1,0,1,0,1,0,0,1,1,0,1,1,0,0,0,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,
+ 0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,1,1,1,0,0,0,1,1,0,1,1,0,1,1,1,
+ 0,0,1,0,0,0,0,1,0,0,0,0,0,0,1,1,0,1,1,1,0,1,0,1,1,1,1,1,1,1,1,1,
+ 0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,1,0,1,1,1,0,1,1,0,1,1,1,1,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,1,1,1,1,1,0,1,1,1,1,1,1,1,1,1,
+ 0,0,0,0,0,0,0,0,1,1,0,0,0,0,0,1,0,1,1,1,0,1,0,1,1,1,1,1,1,1,1,1,
+ 0,0,0,0,0,0,0,1,1,0,1,0,1,0,1,1,0,1,0,1,0,0,0,1,1,1,1,1,1,1,1,1,
+ 1,1,1,0,1,0,0,0,1,1,0,1,0,0,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,0,1,1,
+ 1,0,1,1,1,0,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,0,1,1,1,1,1,1,1,1,1,1,
+ 0,0,0,0,0,0,0,1,0,0,1,0,0,0,1,1,0,0,0,0,0,0,0,1,0,0,0,1,1,0,1,1,
+ 0,0,1,1,0,0,0,1,0,0,0,0,0,0,0,1,0,1,0,1,0,0,1,1,0,1,1,1,1,1,1,1,
+ 0,0,0,0,0,0,0,1,0,1,1,1,0,1,0,1,0,0,1,0,1,0,0,1,0,1,1,1,1,1,1,1,
+ 0,0,0,0,0,0,0,0,0,1,0,1,0,0,0,1,1,0,1,1,0,1,1,0,1,1,1,1,1,1,1,1,
+ 0,0,0,0,0,0,0,1,1,1,1,0,0,0,0,0,0,1,1,1,1,0,1,1,1,1,1,1,1,1,1,1,
+ 0,0,0,0,1,0,1,0,0,0,1,1,1,0,1,1,0,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,
+ 0,0,0,0,0,0,0,0,0,1,1,1,0,0,0,1,0,1,1,1,1,1,1,1,1,1,1,1,1,0,1,1,
+ 1,0,0,0,1,0,0,0,0,1,1,1,0,1,0,1,1,1,1,1,1,1,1,1,0,1,1,1,1,1,1,1,
+ 0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,1,1,0,0,0,0,1,1,1,1,1,0,1,1,0,
+ 0,0,1,1,1,1,1,1,0,0,0,0,1,0,0,1,0,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,
+ 0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,1,0,1,1,1,0,1,1,1,1,1,1,1,
+ 0,0,0,0,1,0,0,0,0,0,0,1,0,0,1,1,0,1,1,1,1,1,1,0,0,1,1,1,1,1,1,1,
+ 0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,1,1,1,0,1,1,1,1,1,1,1,1,1,1,1,
+ 0,0,1,0,1,0,1,1,0,0,1,0,1,1,1,1,0,1,1,1,1,1,1,1,0,1,1,1,1,1,1,1,
+ 0,0,0,0,0,0,0,0,0,1,1,1,0,0,0,1,0,1,1,1,1,1,1,1,0,1,1,1,0,1,1,1,
+ 0,0,1,0,1,0,1,1,0,1,1,1,1,1,1,1,0,0,1,1,1,0,1,1,0,1,1,1,1,1,1,1,
+ 0,0,0,0,0,0,0,1,0,0,0,0,0,0,1,1,0,0,0,0,0,0,0,1,0,0,0,0,1,0,0,1,
+ 0,0,0,1,0,0,0,1,0,0,0,0,0,0,0,1,0,1,0,0,0,0,0,1,0,0,0,0,0,0,0,1,
+ 0,0,0,0,0,0,0,1,0,1,1,1,0,1,0,1,0,0,1,0,0,0,0,1,0,1,0,1,0,1,0,1,
+ 0,0,0,0,0,0,0,0,0,1,0,1,0,0,0,1,1,0,0,0,0,0,0,0,0,1,0,1,0,0,1,1,
+ 0,0,0,0,0,0,0,1,0,1,0,0,0,0,0,1,0,1,0,0,1,0,0,1,0,0,0,0,0,0,0,1,
+ 0,0,0,0,1,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,1,0,0,1,1,
+ 0,0,0,0,0,0,0,0,0,1,0,1,0,0,0,1,0,0,0,0,0,0,0,0,0,1,0,1,0,0,1,1,
+ 1,0,0,0,0,0,0,0,0,1,0,0,0,0,0,1,0,0,0,1,0,0,1,1,0,1,1,1,1,1,1,1,
+ 0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,1,1,0,0,0,0,1,1,0,0,0,0,0,0,0,
+ 0,0,1,0,0,0,0,1,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,1,0,0,0,1,0,0,1,1,
+ 0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,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,1,0,0,1,1,
+ 0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,1,1,
+ 0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,1,0,1,0,1,0,0,0,1,0,1,1,1,1,1,1,1,
+ 0,0,0,0,0,0,0,0,0,1,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,1,0,0,1,1,
+ 0,0,0,0,0,0,0,1,0,1,0,1,0,1,0,0,0,0,1,1,0,0,0,1,0,1,1,1,0,1,1,1
+};
+
+/*
+ * Deterministic prediction tables given by ITU-T T.82 tables
+ * 19 to 22. The table below is organized differently, the
+ * index bits are permutated for higher efficiency.
+ */
+
+char jbg_dptable[256 + 512 + 2048 + 4096] = {
+ /* phase 0: offset=0 */
+ 0,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,0,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,
+ 0,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,0,2,0,2,2,2,2,2,2,2,2,2,2,2,2,2,
+ 0,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,0,0,2,2,2,2,2,2,0,2,2,2,2,2,2,2,
+ 0,2,0,2,2,2,2,2,2,2,2,2,2,2,2,2,0,0,2,2,2,2,2,2,0,2,0,2,2,2,2,2,
+ 2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,0,2,0,2,2,2,2,2,2,2,2,2,2,2,2,2,
+ 2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,1,
+ 2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,0,0,2,2,2,2,2,2,2,2,2,2,2,2,2,2,
+ 2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,
+ /* phase 1: offset=256 */
+ 2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,0,2,2,2,2,2,2,2,2,2,2,2,2,2,
+ 0,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,0,0,2,2,2,2,2,0,2,0,2,2,2,2,2,
+ 2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,0,2,2,2,2,2,2,2,2,2,2,2,2,2,
+ 0,2,2,2,2,1,2,1,2,2,2,2,1,1,1,1,2,0,2,0,2,2,2,2,0,2,0,2,2,2,2,2,
+ 0,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,0,0,0,2,2,2,2,0,2,2,2,2,2,2,2,
+ 0,2,0,2,2,2,2,2,2,2,2,2,2,0,2,0,2,2,0,0,2,2,2,2,2,0,0,2,2,2,2,2,
+ 0,2,2,2,2,1,2,1,2,2,2,2,1,1,1,1,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,1,
+ 1,2,1,2,2,2,2,2,2,2,2,2,2,1,2,2,2,2,1,1,2,2,2,2,2,0,2,2,2,2,2,2,
+ 2,2,2,2,2,0,2,0,2,2,2,2,0,0,0,0,0,2,0,2,2,2,2,2,0,2,2,2,2,2,2,2,
+ 0,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,0,2,0,2,2,2,2,0,2,0,2,2,2,2,2,
+ 2,2,2,2,2,1,1,1,2,2,2,2,1,1,1,1,1,2,1,2,2,2,2,2,2,2,2,2,2,2,2,1,
+ 2,2,2,2,2,2,2,2,2,2,2,2,2,0,1,2,0,2,0,2,2,2,2,2,0,2,0,2,2,2,2,1,
+ 0,2,0,2,2,1,2,1,2,2,2,2,1,1,1,1,0,0,0,0,2,2,2,2,0,2,0,2,2,2,2,1,
+ 2,2,0,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,0,2,2,2,2,2,0,0,0,2,2,2,2,2,
+ 2,2,2,2,2,1,2,1,2,2,2,2,2,2,2,1,2,2,2,2,2,2,2,2,1,2,1,2,2,2,2,1,
+ 2,2,2,2,2,2,2,2,0,2,0,2,2,1,2,2,2,2,2,2,2,2,2,2,0,0,0,2,2,2,2,2,
+ /* phase 2: offset=768 */
+ 2,2,2,2,1,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,1,1,1,1,2,2,2,2,1,1,1,1,
+ 0,2,2,2,2,1,2,1,2,2,2,2,1,2,1,2,0,0,0,0,1,1,1,1,0,0,0,0,1,1,1,1,
+ 2,2,0,2,2,2,1,2,2,2,2,2,2,2,2,2,2,2,0,2,2,1,2,1,2,2,2,2,2,1,1,1,
+ 2,0,2,2,2,1,2,1,0,2,2,2,1,2,1,2,2,2,2,0,2,2,2,2,0,2,0,2,2,2,2,2,
+ 0,2,0,0,1,1,1,1,2,2,2,2,1,1,1,1,0,2,0,2,1,1,1,1,2,2,2,2,1,1,1,1,
+ 2,2,0,2,2,2,1,2,2,2,2,2,1,2,1,2,2,2,0,2,2,1,2,1,0,2,0,2,1,1,1,1,
+ 2,0,0,2,2,2,2,2,0,2,0,2,2,0,2,0,2,0,2,0,2,2,2,1,2,2,0,2,1,1,2,1,
+ 2,2,2,0,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,0,2,2,2,1,2,1,
+ 2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,1,1,1,1,2,2,2,2,1,1,1,1,
+ 0,0,0,0,2,2,2,2,0,0,0,0,2,2,2,2,0,2,0,2,2,2,2,2,2,2,2,2,2,2,2,2,
+ 2,2,0,2,2,2,2,1,0,2,2,2,1,1,1,1,2,0,2,2,2,2,2,2,0,2,0,2,2,1,2,1,
+ 2,0,2,0,2,2,2,2,0,2,0,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,0,2,2,2,2,2,
+ 0,2,2,2,1,2,1,2,2,2,2,2,2,2,2,2,0,2,2,2,2,2,1,2,2,2,2,2,2,2,2,2,
+ 2,2,0,2,2,2,2,2,2,2,2,2,2,2,0,2,2,0,0,2,2,1,2,1,0,2,2,2,1,1,1,1,
+ 2,2,2,0,2,2,2,2,2,2,0,2,2,0,2,0,2,1,2,2,2,2,2,2,1,2,1,2,2,2,2,2,
+ 2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,0,2,0,2,2,2,1,
+ 0,2,2,2,1,2,2,2,2,2,2,2,2,2,2,2,0,2,2,2,2,1,1,1,2,2,2,2,1,1,1,1,
+ 2,2,2,1,2,2,2,2,2,2,1,2,0,0,0,0,2,2,0,2,2,1,2,2,2,2,2,2,1,1,1,1,
+ 2,0,0,0,2,2,2,2,0,2,2,2,2,2,2,0,2,2,2,0,2,2,2,2,2,0,0,2,2,2,2,2,
+ 2,2,2,2,2,2,2,2,2,2,0,2,2,1,2,2,2,2,2,2,2,2,2,2,2,0,2,2,2,1,2,1,
+ 0,2,0,2,2,1,1,2,2,2,2,2,2,2,2,2,1,2,2,2,2,2,2,2,2,2,2,2,2,1,2,2,
+ 2,0,2,0,2,1,2,1,0,2,0,2,2,2,1,2,2,0,2,0,2,2,2,2,0,2,0,2,2,2,1,2,
+ 2,2,2,0,2,2,2,2,2,2,0,2,2,2,2,2,2,2,1,2,2,2,2,2,2,0,1,2,2,2,2,1,
+ 2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,1,2,2,2,2,2,2,2,2,2,2,2,0,2,2,2,1,
+ 0,2,2,2,1,2,1,2,2,2,2,2,2,2,2,2,0,2,2,2,2,2,1,2,2,2,2,2,2,2,2,2,
+ 2,0,2,0,2,2,2,2,2,2,2,2,2,2,2,2,2,0,0,2,2,1,2,1,0,2,2,2,1,1,1,1,
+ 2,0,2,0,2,1,2,2,0,2,0,2,2,2,1,2,2,2,2,2,2,2,2,2,2,2,0,2,2,1,2,2,
+ 2,0,2,2,2,2,2,2,2,0,2,2,2,2,2,2,2,0,2,0,2,2,2,2,0,0,0,0,2,1,2,1,
+ 2,2,2,2,2,2,2,0,2,2,2,2,2,2,2,0,2,2,2,2,2,1,2,0,0,2,2,2,1,2,2,2,
+ 0,0,2,0,2,2,2,2,0,2,0,2,2,0,2,0,1,1,1,2,2,2,2,2,2,2,2,2,2,1,1,1,
+ 2,2,2,2,2,2,2,2,2,0,2,2,2,2,2,1,2,2,2,2,2,2,2,2,2,0,2,0,2,2,2,1,
+ 2,2,0,0,2,2,2,2,2,2,2,0,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,
+ 2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,1,1,1,1,2,2,2,2,1,1,1,1,
+ 0,2,2,2,1,2,1,2,2,2,2,2,2,2,2,2,0,2,2,2,2,2,1,2,2,2,2,2,2,2,2,2,
+ 2,0,0,2,2,2,2,2,0,2,0,2,2,2,2,2,1,0,1,2,2,2,2,1,0,2,2,2,1,1,1,1,
+ 2,2,2,2,2,2,2,2,2,2,0,2,2,0,2,0,2,1,2,2,2,2,2,2,2,2,0,2,2,1,2,2,
+ 0,2,0,0,1,1,1,1,0,2,2,2,1,1,1,1,2,2,2,2,2,2,2,2,2,0,2,2,1,2,1,1,
+ 2,2,0,2,2,1,2,2,2,2,2,2,1,2,2,2,2,0,2,2,2,2,2,2,0,2,0,2,1,2,1,1,
+ 2,0,2,0,2,2,2,2,0,2,0,2,2,1,2,2,2,2,2,2,2,2,2,2,2,1,2,2,2,2,2,1,
+ 2,2,2,2,2,2,2,2,2,0,2,2,2,2,2,1,2,2,2,2,2,2,2,2,2,2,2,0,2,2,2,1,
+ 0,2,2,2,1,2,2,2,2,2,2,2,2,2,2,2,0,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,
+ 0,2,2,2,2,0,2,0,2,2,2,2,0,0,0,0,2,2,2,2,2,1,1,2,2,2,2,2,1,2,2,2,
+ 2,0,2,2,2,1,2,1,0,2,2,2,2,2,1,2,2,0,2,0,2,2,2,2,0,2,0,2,2,1,2,2,
+ 0,2,0,0,2,2,2,2,1,2,2,2,2,2,2,0,2,1,2,2,2,2,2,2,1,2,2,2,2,2,2,2,
+ 0,2,0,2,2,2,1,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,0,2,2,2,2,1,0,2,2,
+ 0,0,0,2,2,1,1,1,2,2,2,2,1,2,2,2,2,0,2,0,2,2,2,1,2,2,2,2,1,2,1,2,
+ 0,0,0,0,2,2,2,2,2,2,0,2,2,1,2,2,2,1,2,1,2,2,2,2,1,2,1,2,0,2,2,2,
+ 2,0,2,0,2,2,2,2,2,0,2,2,2,2,2,1,2,2,2,2,2,2,2,2,2,2,2,0,2,2,2,1,
+ 0,2,2,2,1,2,1,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,
+ 2,1,2,2,2,2,2,0,2,2,1,2,2,0,0,0,2,2,2,2,2,1,2,2,0,2,2,2,1,2,1,2,
+ 2,0,2,0,2,2,2,2,0,2,0,2,2,1,2,2,0,2,0,0,2,2,2,2,2,2,2,2,2,1,2,2,
+ 2,2,2,2,2,2,2,2,2,0,2,2,2,2,2,1,2,2,2,2,2,2,2,2,2,0,2,0,2,2,2,1,
+ 1,2,0,2,2,1,2,1,2,2,2,2,1,2,2,2,2,0,2,0,2,2,2,2,2,0,2,2,1,1,1,1,
+ 0,2,2,2,2,2,2,1,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,0,2,0,2,2,1,2,1,
+ 2,2,0,0,2,2,2,2,2,0,2,2,2,1,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,1,1,
+ 2,2,2,0,2,2,2,2,2,2,2,0,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,
+ 2,2,2,2,2,2,2,2,1,2,1,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,0,0,2,
+ 2,0,2,0,2,2,2,2,2,1,1,2,2,2,2,2,2,2,2,2,2,2,2,1,0,2,0,2,2,2,1,2,
+ 2,0,2,0,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,0,2,2,2,1,2,2,
+ 2,0,2,0,2,2,2,2,2,0,2,0,2,2,2,2,2,0,2,0,2,2,2,2,0,0,0,0,2,1,2,1,
+ 2,2,2,2,2,1,2,1,0,2,0,2,2,2,2,2,2,0,2,0,2,2,2,2,0,2,0,2,2,2,2,1,
+ 2,0,2,0,2,2,2,2,2,1,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,0,2,2,2,1,2,0,
+ 2,0,2,0,2,2,2,1,2,2,2,0,2,2,2,1,2,0,2,0,2,2,2,2,0,0,0,2,2,2,2,1,
+ 2,0,2,0,2,2,2,2,2,2,2,0,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,0,2,2,2,2,
+ /* phase 3: offset=2816 */
+ 2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,0,2,2,2,1,2,2,2,2,2,2,2,2,2,2,2,
+ 2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,0,0,0,0,1,1,1,1,0,0,0,0,1,1,1,1,
+ 0,2,2,2,1,2,2,2,2,2,2,2,2,2,2,2,2,1,2,1,2,0,2,0,1,2,1,2,0,2,0,2,
+ 2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,
+ 2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,
+ 2,2,0,2,2,2,1,2,0,2,2,2,1,2,2,2,2,0,2,0,2,1,2,1,0,0,0,0,1,1,1,1,
+ 2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,0,2,2,2,1,2,2,0,2,2,2,1,2,
+ 2,2,2,1,2,2,2,0,1,1,1,1,0,0,0,0,2,2,2,2,2,2,2,2,2,0,2,0,2,1,2,1,
+ 2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,0,2,2,2,1,2,2,0,0,0,0,1,1,1,1,
+ 2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,0,2,0,2,1,2,1,0,0,0,0,1,1,1,1,
+ 2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,1,2,1,2,0,2,0,2,
+ 2,2,0,2,2,2,1,2,2,2,2,2,2,2,2,2,2,0,2,0,2,1,2,1,2,0,2,0,2,1,2,1,
+ 2,0,0,0,2,1,1,1,0,0,0,0,1,1,1,1,2,2,2,0,2,2,2,1,2,2,2,2,2,2,2,2,
+ 2,0,2,2,2,1,2,2,2,2,0,2,2,2,1,2,2,2,2,2,2,2,2,2,0,0,2,0,1,1,2,1,
+ 2,2,2,0,2,2,2,1,2,1,2,2,2,0,2,2,2,2,2,2,2,2,2,2,2,0,2,2,2,1,2,2,
+ 2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,0,2,2,2,1,
+ 2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,
+ 2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,0,0,0,0,1,1,1,1,0,0,0,0,1,1,1,1,
+ 0,0,0,0,1,1,1,1,0,0,0,0,1,1,1,1,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,
+ 0,0,0,0,1,1,1,1,0,0,0,0,1,1,1,1,2,0,2,0,2,1,2,1,0,0,0,0,1,1,1,1,
+ 2,0,0,2,2,1,1,2,2,2,2,2,2,2,2,2,2,1,2,1,2,0,2,0,2,1,1,1,2,0,0,0,
+ 2,1,2,1,2,0,2,0,1,2,1,2,0,2,0,2,2,2,2,0,2,2,2,1,2,0,2,0,2,1,2,1,
+ 2,0,2,0,2,1,2,1,0,0,0,0,1,1,1,1,2,2,2,2,2,2,2,2,2,0,2,0,2,1,2,1,
+ 2,2,2,2,2,2,2,2,2,0,0,0,2,1,1,1,2,2,2,2,2,2,2,2,2,0,2,0,2,1,2,1,
+ 2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,0,2,2,2,1,2,2,2,2,2,2,2,2,2,
+ 0,2,2,2,1,2,2,2,2,2,2,2,2,2,2,2,2,2,0,2,2,2,1,2,2,2,2,2,2,2,2,2,
+ 2,0,0,0,2,1,1,1,0,0,0,0,1,1,1,1,2,0,2,0,2,1,2,1,0,0,2,0,1,1,2,1,
+ 2,2,1,2,2,2,0,2,2,2,2,2,2,2,2,2,2,2,2,0,2,2,2,1,2,0,0,0,2,1,1,1,
+ 2,2,2,1,2,2,2,0,2,1,1,1,2,0,0,0,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,
+ 2,2,2,0,2,2,2,1,2,2,2,2,2,2,2,2,2,1,2,1,2,0,2,0,1,2,1,2,0,2,0,2,
+ 2,2,2,2,2,2,2,2,2,2,2,0,2,2,2,1,2,2,2,2,2,2,2,2,2,2,2,0,2,2,2,1,
+ 2,2,2,2,2,2,2,2,2,0,2,2,2,1,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,
+ 2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,
+ 0,2,2,2,1,2,2,2,2,2,2,2,2,2,2,2,2,0,0,0,2,1,1,1,0,0,0,0,1,1,1,1,
+ 2,0,2,2,2,1,2,2,0,0,2,0,1,1,2,1,2,1,2,1,2,0,2,0,2,2,2,2,2,2,2,2,
+ 2,2,0,2,2,2,1,2,2,2,2,2,2,2,2,2,2,0,2,2,2,1,2,2,0,0,0,0,1,1,1,1,
+ 2,0,0,0,2,1,1,1,0,0,0,0,1,1,1,1,2,2,2,2,2,2,2,2,2,1,0,2,2,0,1,2,
+ 2,2,2,1,2,2,2,0,2,1,1,1,2,0,0,0,2,2,2,2,2,2,2,2,2,2,2,0,2,2,2,1,
+ 2,2,2,2,2,2,2,2,2,2,0,2,2,2,1,2,2,2,2,2,2,2,2,2,2,0,2,2,2,1,2,2,
+ 2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,0,2,2,2,1,
+ 0,2,2,2,1,2,2,2,2,2,2,2,2,2,2,2,2,1,2,2,2,0,2,2,2,2,2,2,2,2,2,2,
+ 2,1,2,1,2,0,2,0,1,2,1,1,0,2,0,0,0,0,2,1,1,1,2,0,0,0,0,0,1,1,1,1,
+ 2,2,2,2,2,2,2,2,1,2,2,2,0,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,
+ 2,0,2,1,2,1,2,0,0,2,2,2,1,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,
+ 2,2,2,0,2,2,2,1,2,2,0,2,2,2,1,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,
+ 2,2,2,2,2,2,2,2,2,1,2,2,2,0,2,2,2,2,0,2,2,2,1,2,2,2,0,0,2,2,1,1,
+ 2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,0,2,2,2,1,
+ 2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,
+ 2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,0,2,2,2,1,2,2,2,2,2,2,2,2,2,
+ 0,2,2,2,1,2,2,2,2,2,2,2,2,2,2,2,2,2,1,2,2,2,0,2,2,2,2,2,2,2,2,2,
+ 2,0,2,0,2,1,2,1,0,0,0,0,1,1,1,1,2,2,2,2,2,2,2,2,0,0,0,0,1,1,1,1,
+ 2,2,0,2,2,2,1,2,2,2,2,2,2,2,2,2,2,2,2,0,2,2,2,1,2,0,0,0,2,1,1,1,
+ 2,2,2,0,2,2,2,1,0,2,2,2,1,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,
+ 2,2,2,2,2,2,2,2,2,2,0,2,2,2,1,2,2,2,2,2,2,2,2,2,2,0,2,2,2,1,2,2,
+ 2,0,2,2,2,1,2,2,2,0,2,0,2,1,2,1,2,2,2,2,2,2,2,2,2,2,2,0,2,2,2,1,
+ 2,1,2,1,2,0,2,0,1,2,1,2,0,2,0,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,
+ 2,1,2,1,2,0,2,0,1,2,1,1,0,2,0,0,2,0,2,2,2,1,2,2,0,2,1,2,1,2,0,2,
+ 2,2,2,1,2,2,2,0,2,2,1,2,2,2,0,2,2,1,2,2,2,0,2,2,2,2,0,2,2,2,1,2,
+ 0,0,2,0,1,1,2,1,0,0,1,0,1,1,0,1,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,
+ 2,2,2,0,2,2,2,1,1,2,2,2,0,2,2,2,0,0,0,0,1,1,1,1,0,0,0,0,1,1,1,1,
+ 2,2,2,2,2,2,2,2,2,1,2,2,2,0,2,2,2,2,2,2,2,2,2,2,2,2,2,0,2,2,2,1,
+ 2,2,2,2,2,2,2,2,2,0,2,2,2,1,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,
+ 2,2,0,0,2,2,1,1,2,2,2,0,2,2,2,1,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,
+ 2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,
+ 2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,
+ 2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,0,0,0,0,1,1,1,1,0,0,0,0,1,1,1,1,
+ 2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,0,2,2,2,1,2,2,2,2,2,2,2,2,2,
+ 0,2,2,2,1,2,2,2,2,2,2,2,2,2,2,2,2,2,1,2,2,2,0,2,2,2,2,2,2,2,2,2,
+ 2,0,0,0,2,1,1,1,0,0,0,0,1,1,1,1,2,2,2,1,2,2,2,0,2,1,2,1,2,0,2,0,
+ 2,1,2,2,2,0,2,2,2,2,2,2,2,2,2,2,0,2,0,0,1,2,1,1,2,0,0,0,2,1,1,1,
+ 2,2,2,2,2,2,2,2,2,1,1,1,2,0,0,0,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,
+ 2,2,2,0,2,2,2,1,2,2,0,2,2,2,1,2,2,1,2,1,2,0,2,0,2,0,2,2,2,1,2,2,
+ 2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,1,2,2,2,0,2,2,2,1,1,1,2,0,0,0,
+ 2,2,2,2,2,2,2,2,2,0,2,2,2,1,2,2,2,2,2,2,2,2,2,2,0,2,0,0,1,2,1,1,
+ 2,2,0,2,2,2,1,2,2,2,2,2,2,2,2,2,2,0,2,2,2,1,2,2,0,2,2,2,1,2,2,2,
+ 2,1,2,1,2,0,2,0,2,1,2,2,2,0,2,2,2,2,2,0,2,2,2,1,2,0,2,0,2,1,2,1,
+ 2,0,2,0,2,1,2,1,0,2,0,2,1,2,1,2,2,2,2,2,2,2,2,2,2,0,2,2,2,1,2,2,
+ 2,2,2,2,2,2,2,2,0,2,0,2,1,2,1,2,2,2,2,2,2,2,2,2,0,1,0,0,1,0,1,1,
+ 2,2,2,2,2,2,2,2,2,1,2,2,2,0,2,2,2,2,2,2,2,2,2,2,2,2,2,0,2,2,2,1,
+ 2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,
+ 2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,
+ 0,2,2,2,1,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,
+ 0,0,0,0,1,1,1,1,0,0,0,0,1,1,1,1,2,2,1,2,2,2,0,2,2,2,2,2,2,2,2,2,
+ 2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,0,1,2,2,1,0,2,0,2,2,2,1,2,2,2,
+ 2,2,2,2,2,2,2,2,1,2,2,2,0,2,2,2,2,2,2,0,2,2,2,1,2,2,0,2,2,2,1,2,
+ 2,0,2,0,2,1,2,1,0,2,0,2,1,2,1,2,2,2,2,2,2,2,2,2,2,0,2,2,2,1,2,2,
+ 0,2,0,0,1,2,1,1,2,0,0,0,2,1,1,1,2,2,2,2,2,2,2,2,1,0,1,2,0,1,0,2,
+ 2,2,2,2,2,2,2,2,2,0,2,2,2,1,2,2,2,1,2,2,2,0,2,2,1,1,2,2,0,0,2,2,
+ 0,2,2,2,1,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,
+ 2,1,2,1,2,0,2,0,2,1,2,2,2,0,2,2,2,0,2,2,2,1,2,2,0,2,2,2,1,2,2,2,
+ 0,2,2,2,1,2,2,2,2,2,2,2,2,2,2,2,2,2,2,0,2,2,2,1,1,2,2,2,0,2,2,2,
+ 2,0,2,2,2,1,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,0,2,0,2,1,2,1,2,
+ 0,0,0,0,1,1,1,1,2,2,0,2,2,2,1,2,2,2,2,2,2,2,2,2,2,0,2,2,2,1,2,2,
+ 2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,1,2,1,2,0,2,0,2,2,0,2,2,2,1,2,
+ 2,0,2,0,2,1,2,1,2,0,2,2,2,1,2,2,2,2,2,2,2,2,2,2,2,2,2,0,2,2,2,1,
+ 2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,
+ 2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,0,2,2,2,1,2,2,2,2,2,2,2,2,2,
+ 0,2,2,2,1,2,2,2,2,2,2,2,2,2,2,2,0,2,2,2,1,2,2,2,2,2,2,2,2,2,2,2,
+ 2,2,2,1,2,2,2,0,1,1,2,1,0,0,2,0,2,0,2,2,2,1,2,2,0,2,2,2,1,2,2,2,
+ 2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,1,2,2,2,0,2,2,2,2,0,2,2,2,1,2,
+ 2,0,2,0,2,1,2,1,0,2,0,2,1,2,1,2,2,2,2,2,2,2,2,2,2,1,2,2,2,0,2,2,
+ 0,2,0,0,1,2,1,1,0,2,0,2,1,2,1,2,2,2,2,2,2,2,2,2,0,0,0,2,1,1,1,2,
+ 2,2,2,2,2,2,2,2,2,0,2,2,2,1,2,2,2,2,2,2,2,2,2,2,2,2,2,0,2,2,2,1,
+ 2,2,2,2,2,2,2,2,2,0,2,2,2,1,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,
+ 2,2,0,2,2,2,1,2,2,2,2,2,2,2,2,2,0,0,2,1,1,1,2,0,0,2,2,2,1,2,2,2,
+ 2,1,2,1,2,0,2,0,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,0,2,0,0,1,2,1,1,
+ 0,0,2,2,1,1,2,2,0,2,1,2,1,2,0,2,2,1,2,1,2,0,2,0,1,2,1,2,0,2,0,2,
+ 2,2,2,2,2,2,2,2,1,2,1,2,0,2,0,2,2,2,2,2,2,2,2,2,2,0,2,0,2,1,2,1,
+ 2,2,0,0,2,2,1,1,2,2,0,0,2,2,1,1,2,2,2,2,2,2,2,2,2,2,0,0,2,2,1,1,
+ 2,2,2,2,2,2,2,2,0,2,2,2,1,2,2,2,2,2,2,2,2,2,2,2,0,2,0,0,1,2,1,1,
+ 2,2,2,0,2,2,2,1,2,2,2,0,2,2,2,1,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,
+ 2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,
+ 2,2,2,2,2,2,2,2,2,0,2,2,2,1,2,2,2,2,2,2,2,2,2,2,1,1,1,2,0,0,0,2,
+ 2,2,2,2,2,2,2,2,1,1,1,2,0,0,0,2,2,2,2,2,2,2,2,2,0,2,2,2,1,2,2,2,
+ 2,0,2,0,2,1,2,1,2,2,2,0,2,2,2,1,2,2,2,2,2,2,2,2,2,0,0,0,2,1,1,1,
+ 2,0,2,2,2,1,2,2,0,2,2,2,1,2,2,2,2,0,2,0,2,1,2,1,2,2,2,2,2,2,2,2,
+ 2,0,2,0,2,1,2,1,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,
+ 2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,
+ 2,0,2,0,2,1,2,1,2,1,2,0,2,0,2,1,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,
+ 2,0,2,0,2,1,2,1,1,2,1,2,0,2,0,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,
+ 2,2,2,2,2,2,2,2,1,2,1,2,0,2,0,2,2,1,2,1,2,0,2,0,2,2,2,2,2,2,2,2,
+ 2,0,2,1,2,1,2,0,0,2,1,2,1,2,0,2,2,2,2,2,2,2,2,2,2,2,2,0,2,2,2,1,
+ 2,0,2,0,2,1,2,1,2,2,2,0,2,2,2,1,2,2,2,2,2,2,2,2,2,0,2,0,2,1,2,1,
+ 2,2,2,2,2,2,2,2,2,2,2,0,2,2,2,1,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,
+ 2,0,2,2,2,1,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,
+ 2,1,2,1,2,0,2,0,1,1,1,2,0,0,0,2,2,2,2,2,2,2,2,2,2,2,2,0,2,2,2,1,
+ 2,0,2,0,2,1,2,1,2,2,2,0,2,2,2,1,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,
+ 2,2,2,2,2,2,2,2,2,2,2,0,2,2,2,1,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,
+};
diff --git a/lavadecode.1in b/lavadecode.1in
new file mode 100644
index 0000000..83361fb
--- /dev/null
+++ b/lavadecode.1in
@@ -0,0 +1,263 @@
+.TH lavadecode 1 "${MODpage}" "lavadecode ${MODver}"
+'\"==========================================================================
+'\" STRINGS and MACROS
+'\"==========================================================================
+'\"
+'\" Define strings for special characters that nroff doesn't have
+'\"
+'\" N.B. using .if cua to test for special characters did not work.
+'\"
+.if !'\*[.T]'ps' .ds ua up
+.if '\*[.T]'ps' .ds ua \(ua
+.if !'\*[.T]'ps' .ds da down
+.if '\*[.T]'ps' .ds da \(da
+.if !'\*[.T]'ps' .ds <- left
+.if '\*[.T]'ps' .ds <- \(<-
+.if !'\*[.T]'ps' .ds -> right
+.if '\*[.T]'ps' .ds -> \(->
+'\"
+'\" bx - box a Courier string for making keycaps
+'\"
+'\" N.B. this mess is to make the line drawing come out only
+'\" if we are really generating postscript
+'\"
+.de bx
+.ie !'\*[.T]'ps' \{\
+. RB [ \\$1 ]\\$2
+.\}
+.el \{\
+. ie !r ps4html \{\
+'\" \(br\|\s-1\f(CB\\$1\fP\s+1\|\(br\l'|0\(rn'\l'|0\(ul'
+. ft CW
+. nr par*bxw \w'\\$1'+.4m
+\Z'\v'.25m'\D'l 0 -1m'\D'l \\n[par*bxw]u 0'\D'l 0 1m'\D'l -\\n[par*bxw]u 0''\
+\Z'\h'.2m'\s-1\\$1\s+1'\
+\h'\\n[par*bxw]u'\\$2
+. ft P
+. \}
+. el \{\
+. RB [ \\$1 ]\\$2
+. \}
+.\}
+..
+'\"
+'\" strings to set current color (null with old groff)
+'\"
+.if mred .ds red \m[red]
+.if mgreen .ds green \m[green]
+.if mblue .ds blue \m[blue]
+.if mblack .ds black \m[black]
+.if mblack .ds mP \mP
+'\"
+'\" fix for grotty + xterm. We call for orange, grotty outputs yellow,
+'\" but xterm displays yellow as orange. The cycle is complete.
+'\"
+.if n .defcolor orange rgb #ffff00
+'\"
+'\" color <color> - set the current color (ignores request with old groff)
+'\"
+.de color
+.if mred \m[\\$1]\c
+..
+'\"
+'\" colorword <color> <word> - colorize a word (ignored by old groff)
+'\"
+.de colorword
+.ie m\\$1 \m[\\$1]\\$2\mP\c
+.el \\$2\c
+..
+'\"
+'\" colbox <fg> <bg> <word> - colorize a word in a filled box
+'\"
+.de colbox
+.ie mred \M[\\$2]\
+\v'+.167v'\
+\D'P 0 -0.9v \w'\\$3'u 0 0 +0.9v -\w'\\$3'u 0'\
+\v'-.167v'\
+\m[\\$1]\\$3\mP\MP
+.el \\$3\c
+..
+'\"
+'\" Macros for doing pdfmarks
+'\"
+.de specialps
+\\k_\X'ps: \\$*'\h'|\\n_u'\c
+..
+'\"
+'\" pdfmark PDFMARKCODE
+'\"
+.ds pdfmarks
+.if d pdfmarks \{\
+.de pdfmark
+. specialps exec [\\$1 pdfmark
+..
+'\"
+'\" pdfdest LINKNAME
+'\"
+.de pdfdest
+.pdfmark "/Dest /\\$1 /View [/XYZ -5 PL null] /DEST"
+..
+'\"
+'\" pdfbookmark COUNT LINKNAME STRING
+'\"
+.de pdfbookmark
+. pdfmark "/View [/XYZ 44 730 1.0] /Count \\$1 /Dest /\\$2 /Title (\\$3) /OUT"
+..
+'\"
+'\" Define the SH and SS macros to save pdfmark information
+'\" in "arrays" of numbers and strings.
+'\"
+.if !r rr_n \{\
+.nr rr_n 0 1
+.am SH
+. nr rr_levels!\\n+[rr_n] 2
+. ds rr_labels!\\n[rr_n] \\$*
+. pdfdest Link\\n[rr_n]
+..
+.am SS
+. nr rr_levels!\\n+[rr_n] 3
+. ds rr_labels!\\n[rr_n] \\$*
+. pdfdest Link\\n[rr_n]
+..
+.\}
+'\"
+'\" Called at the end of the document to generate the pdfmark outline
+'\"
+.de pdf_outline
+.nr rr_levels!\\n+[rr_n] 1
+.nr rr_i 0 1
+.while \\n+[rr_i]<\\n[rr_n] \{\
+. nr rr_ip1 \\n[rr_i]+1
+. nr rr_count 0
+. if \\n[rr_levels!\\n[rr_ip1]]>\\n[rr_levels!\\n[rr_i]] \{\
+. nr rr_j \\n[rr_i] 1
+. while \\n+[rr_j]<\\n[rr_n] \{\
+. if \\n[rr_levels!\\n[rr_j]]<=\\n[rr_levels!\\n[rr_i]] \{\
+. break
+. \}
+. if \\n[rr_levels!\\n[rr_j]]==(\\n[rr_levels!\\n[rr_i]]+1) \{\
+. nr rr_count \\n[rr_count]+1
+. \}
+. \}
+. \}
+. ds hhh \\*[rr_labels!\\n[rr_i]]
+. pdfbookmark \\n[rr_count] Link\\n[rr_i] "\\*[hhh]"
+.\}
+..
+'\"
+'\" Some postscript to make pdfmarks harmless on old interpreters...
+'\"
+.specialps "def /pdfmark where {pop} {userdict /pdfmark /cleartomark load put} ifelse"
+'\"
+'\" Force display of Bookmarks in Acrobat when document is viewed.
+'\"
+.pdfmark "[/PageMode /UseOutlines /Page 1 /View [/XYZ null null null] /DOCVIEW"
+'\"
+'\" Output the document info in pdfmarks
+'\"
+.pdfmark "\
+ /Title (\*[an-title](\*[an-section])) \
+ /Subject (zjsdecode Manual Page) \
+ /Author (Rick Richardson) \
+ /Keywords (printing, ZjStream) \
+ /Creator (groff \n(.x.\n(.y.\n(.Y -man) \
+ /CreationDate (\*[an-extra1]) \
+ /ModDate (\*[an-extra1]) \
+ /DOCINFO"
+\}
+'\"
+'\" The manual page name is only 1st level mark
+'\"
+.nr rr_levels!\n+[rr_n] 1
+.ds rr_labels!\n[rr_n] \*[an-title](\*[an-section])
+.pdfdest Link\n[rr_n]
+'\"==========================================================================
+'\" MANUAL PAGE SOURCE
+'\"==========================================================================
+.SH NAME
+lavadecode \- Decode a XQX stream into human readable form.
+.SH SYNOPSIS
+.B lavadecode
+.RI [ options "] <" zjs-file
+.SH DESCRIPTION
+.B lavadecode
+decodes a LAVAFLOW stream into human readable form.
+.P
+A LAVAFLOW stream is the printer langauge used by some Konica Minolta
+printers, such as the KM magicolor 2530 DL.
+
+.SH COMMAND LINE OPTIONS
+These are the options that can appear on the command line.
+.TP
+.BI \-d\0 basename
+Basename of .pbm file for saving decompressed planes.
+.TP
+.BI \-h
+Print hex file offsets.
+.TP
+.BI \-o
+Print file offsets.
+.TP
+.BI \-D\0 level
+Set Debug level [0].
+
+.SH EXAMPLES
+Decode an LAVAFLOW stream file created by foo2lava.
+
+.nf
+.ft CW
+$ lavadecode -h < testpage.prn
+ 0: \\033%-12345X@PJL JOB NAME="stdin"
+ 1f: \\033%-12345X@PJL JOB USERNAME=""
+ 3d: \\033%-12345X@PJL JOB TIMESTAMP="12/12/2006"
+ 66: \\033%-12345X@PJL JOB OSINFO="Linux/2.6.17-1.2187_FC5"
+ 99: \\033%-12345X@PJL ENTER LANGUAGE=LAVAFLOW
+ bf: \\033E RESET
+ c1: \\033&l0S DUPLEX
+ c6: \\033&l0G
+ cb: \\033&u1200D X RESOLUTION
+ d3: \\033&l1X COPIES
+ d8: \\033&x1X TRANSMIT ONCE COPIES
+ dd: \\033&l0O ORIENTATION
+ e2: \\033*r1U NBIE
+ e7: \\033*g8W BW/COLOR
+ ec: \\033*b1234M COMPRESSION
+ f4: \\033&l2A PAGE SIZE
+ f9: \\033&l255H PAPER SOURCE
+ 100: \\033&l0M MEDIA TYPE
+ 105: \\033&l0E TOP MARGIN
+ 10a: \\033*r9820S X RASTER
+ 112: \\033*r6410T Y RASTER
+ 11a: \\033&l0U
+ 11f: \\033&l0Z
+ 124: \\033*p200X X OFFSET
+ 12b: \\033*p200Y Y OFFSET
+ 132: \\033*r1A [Page 1]
+ 137: \\033*b20V [black]
+ DL = 0, D = 0, P = 1, - = 0, XY = 9820 x 6410
+ L0 = 128, MX = 16, MY = 0
+ Order = 3 ILEAVE SMID
+ Options = 92 LRLTWO TPDON TPBON DPON
+ 51 stripes, 0 layers, 1 planes
+
+ 151: \\033*b65536W JBIG data (cont)
+ 1015a: \\033*b27374W JBIG data (cont)
+ 16c51: \\033*r0C END PAGE
+ 16c56: \\033E RESET
+ 16c58: \\033%-12345X
+.ft P
+.fi
+
+.SH FILES
+.BR /usr/bin/lavadecode
+.SH SEE ALSO
+.BR foo2lava-wrapper (1),
+.BR foo2lava (1)
+.SH "AUTHOR"
+Rick Richardson <rick.richardson@comcast.net>
+.br
+${URLXQX}/
+'/"
+'/"
+'/"
+.em pdf_outline
diff --git a/lavadecode.c b/lavadecode.c
new file mode 100644
index 0000000..30f9010
--- /dev/null
+++ b/lavadecode.c
@@ -0,0 +1,453 @@
+/*
+ * $Id: lavadecode.c,v 1.15 2006/12/23 13:40:51 rick Exp $
+ */
+
+/*b
+ * Copyright (C) 2003-2006 Rick Richardson
+ *
+ * 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.
+ *
+ * Author: Rick Richardson <rick.richardson@comcast.net>
+b*/
+
+#include <stdio.h>
+#include <stdlib.h>
+#include <stdarg.h>
+#include <string.h>
+#include <unistd.h>
+#include <errno.h>
+
+#include "jbig.h"
+
+/*
+ * Global option flags
+ */
+int Debug = 0;
+char *DecFile;
+int PrintOffset = 0;
+int PrintHexOffset = 0;
+
+void
+debug(int level, char *fmt, ...)
+{
+ va_list ap;
+
+ if (Debug < level)
+ return;
+
+ va_start(ap, fmt);
+ vfprintf(stderr, fmt, ap);
+ va_end(ap);
+}
+
+int
+error(int fatal, char *fmt, ...)
+{
+ va_list ap;
+
+ fprintf(stderr, fatal ? "Error: " : "Warning: ");
+ if (errno)
+ fprintf(stderr, "%s: ", strerror(errno));
+ va_start(ap, fmt);
+ vfprintf(stderr, fmt, ap);
+ va_end(ap);
+ if (fatal > 0)
+ exit(fatal);
+ else
+ {
+ errno = 0;
+ return (fatal);
+ }
+}
+
+void
+usage(void)
+{
+ fprintf(stderr,
+"Usage:\n"
+" xqxdecode [options] < zjs-file\n"
+"\n"
+" Decode a XQX stream into human readable form.\n"
+"\n"
+" A XQX stream is the printer langauge used by some HP LaserJet\n"
+" printers, such as the HP LaserJet M1005 (MFP).\n"
+"\n"
+"\n"
+"Options:\n"
+" -d basename Basename of .pbm file for saving decompressed planes\n"
+" -o Print file offsets\n"
+" -h Print hex file offsets\n"
+" -D lvl Set Debug level [%d]\n"
+ , Debug
+ );
+
+ exit(1);
+}
+
+void
+print_bih(unsigned char bih[20])
+{
+ unsigned int xd, yd, l0;
+
+ xd = (bih[4] << 24) | (bih[5] << 16) | (bih[6] << 8) | (bih[7] << 0);
+ yd = (bih[8] << 24) | (bih[9] << 16) | (bih[10] << 8) | (bih[11] << 0);
+ l0 = (bih[12] << 24) | (bih[13] << 16) | (bih[14] << 8) | (bih[15] << 0);
+
+ printf(" DL = %d, D = %d, P = %d, - = %d, XY = %d x %d\n",
+ bih[0], bih[1], bih[2], bih[3], xd, yd);
+
+ printf(" L0 = %d, MX = %d, MY = %d\n",
+ l0, bih[16], bih[17]);
+
+ printf(" Order = %d %s%s%s%s%s\n", bih[18],
+ bih[18] & JBG_HITOLO ? " HITOLO" : "",
+ bih[18] & JBG_SEQ ? " SEQ" : "",
+ bih[18] & JBG_ILEAVE ? " ILEAVE" : "",
+ bih[18] & JBG_SMID ? " SMID" : "",
+ bih[18] & 0xf0 ? " other" : "");
+
+ printf(" Options = %d %s%s%s%s%s%s%s%s\n", bih[19],
+ bih[19] & JBG_LRLTWO ? " LRLTWO" : "",
+ bih[19] & JBG_VLENGTH ? " VLENGTH" : "",
+ bih[19] & JBG_TPDON ? " TPDON" : "",
+ bih[19] & JBG_TPBON ? " TPBON" : "",
+ bih[19] & JBG_DPON ? " DPON" : "",
+ bih[19] & JBG_DPPRIV ? " DPPRIV" : "",
+ bih[19] & JBG_DPLAST ? " DPLAST" : "",
+ bih[19] & 0x80 ? " other" : "");
+ printf(" %u stripes, %d layers, %d planes\n",
+ ((yd >> bih[1]) + ((((1UL << bih[1]) - 1) & xd) != 0) + l0 - 1) / l0,
+ bih[1] - bih[0], bih[2]);
+}
+
+void
+proff(int curOff)
+{
+ if (PrintOffset)
+ printf("%d: ", curOff);
+ else if (PrintHexOffset)
+ printf("%6x: ", curOff);
+}
+
+void
+decode(FILE *fp)
+{
+ int c;
+ int rc;
+ FILE *dfp = NULL;
+ int pageNum = 0;
+ int curOff = 0;
+ struct jbg_dec_state s[5];
+ unsigned char bih[20];
+ int bihlen = 0;
+ int imageCnt[5] = {0,0,0,0,0};
+ int pn = 0;
+ int nbie = 0;
+ int incrY = 0;
+ int totSize = 0;
+ char buf[1024];
+ char *strpage[837+1];
+ int i;
+
+ for (i = 0; i < sizeof(strpage)/sizeof(strpage[0]); ++i)
+ strpage[i] = "unk";
+ strpage[1] = "exec";
+ strpage[2] = "letter";
+ strpage[3] = "legal";
+ strpage[25] = "a5";
+ strpage[26] = "a4";
+ strpage[45] = "b5jis";
+ strpage[65] = "b5iso";
+ strpage[80] = "envMonarch";
+ strpage[81] = "env#10";
+ strpage[90] = "envDL";
+ strpage[91] = "envC5";
+ strpage[92] = "envC6";
+ strpage[835] = "photo4x6";
+ strpage[837] = "photo10x15";
+
+ while (fgets(buf, sizeof(buf), fp))
+ {
+ proff(curOff);
+ if (buf[0] == '\033')
+ {
+ printf("\\033");
+ fputs(buf+1, stdout);
+ }
+ else
+ fputs(buf, stdout);
+ curOff += strlen(buf);
+
+ if (strcmp(buf, "\033%-12345X@PJL ENTER LANGUAGE=LAVAFLOW\n") == 0)
+ {
+ int state = 0;
+ char intro = 0, groupc = 0;
+ int val = 0;
+ size_t cnt;
+ unsigned char ch;
+
+ while ( (c = fgetc(fp)) != EOF)
+ {
+ curOff++;
+ switch (state)
+ {
+ case 0:
+ if (c == '\033') state = '\033';
+ if (c == '\033') proff(curOff-1);
+ break;
+ case '\033':
+ if (c >= 'A' && c <= 'Z')
+ {
+ printf("\\033%c", c);
+ if (c == 'E')
+ printf("\t\t\tRESET");
+ printf("\n");
+ state = 0;
+ }
+ else
+ {
+ intro = c;
+ state = 'i';
+ }
+ break;
+ case 'i':
+ if (c >= 'A' && c <= 'Z')
+ state = 0;
+ else
+ {
+ groupc = c;
+ state = 'v';
+ val = 0;
+ }
+ break;
+ case 'v':
+ if (c >= 'A' && c <= 'Z')
+ {
+ #define STRARY(X, A) \
+ ((X) >= 0 && (X) < sizeof(A)/sizeof(A[0])) \
+ ? A[X] : "UNK"
+ char *strduplex[] = {
+ "off", "long", "short", "manlong", "manshort"
+ };
+ char *strorient[] = { "port", "land" };
+ char *strsource[] = {
+ /*00*/ "unk", "tray1", "unk", "unk", "tray2",
+ /*05*/ "unk", "unk", "auto"
+ };
+ char *strmedia[] = {
+ /*00*/ "plain", "unk", "unk", "unk", "transparency",
+ /*05*/ "unk", "unk", "unk", "unk", "unk",
+ /*10*/ "unk", "unk", "unk", "unk", "unk",
+ /*15*/ "unk", "unk", "unk", "unk", "unk",
+ /*20*/ "thick", "unk", "env", "letterhead", "unk",
+ /*25*/ "postcard", "labels", "recycled", "glossy",
+ };
+
+ printf("\\033%c%c%d%c", intro, groupc, val, c);
+ state = 0;
+ if (intro == '&' && groupc == 'l' && c == 'S')
+ printf("\t\tDUPLEX: [%s]", STRARY(val, strduplex));
+ if (intro == '&' && groupc == 'u' && c == 'D')
+ printf("\t\tX RESOLUTION: [%d]", val);
+ if (intro == '&' && groupc == 'l' && c == 'X')
+ printf("\t\tCOPIES: [%d]", val);
+ if (intro == '&' && groupc == 'x' && c == 'X')
+ printf("\t\tTRANSMIT ONCE COPIES: [%d]", val);
+ if (intro == '&' && groupc == 'l' && c == 'O')
+ printf("\t\tORIENTATION: [%s]",
+ STRARY(val, strorient));
+ if (intro == '&' && groupc == 'l' && c == 'A')
+ printf("\t\tPAGE SIZE: [%s]",
+ STRARY(val, strpage));
+ if (intro == '&' && groupc == 'l' && c == 'E')
+ printf("\t\tTOP MARGIN: [%d]", val);
+ if (intro == '&' && groupc == 'l' && c == 'H')
+ printf("\t\tPAPER SOURCE: [%s]",
+ STRARY(val&7, strsource));
+ if (intro == '&' && groupc == 'l' && c == 'M')
+ printf("\t\tMEDIA TYPE: [%s]",
+ STRARY(val, strmedia));
+ if (intro == '*' && groupc == 'r' && c == 'S')
+ printf("\t\tX RASTER: [%d]", val);
+ if (intro == '*' && groupc == 'r' && c == 'T')
+ printf("\t\tY RASTER: [%d]", val);
+ if (intro == '*' && groupc == 'r' && c == 'U')
+ {
+ nbie = val & 7;
+ printf("\t\tNBIE: [%d]", nbie);
+ }
+ if (intro == '*' && groupc == 'g' && c == 'W')
+ printf("\t\tBW/COLOR: [%d]", val);
+ if (intro == '*' && groupc == 'b' && c == 'M')
+ printf("\t\tCOMPRESSION: [%d]", val);
+ if (intro == '*' && groupc == 'r' && c == 'C')
+ printf("\t\tEND PAGE");
+ if (intro == '*' && groupc == 'p' && c == 'X')
+ printf("\t\tX OFFSET: [%d]", val);
+ if (intro == '*' && groupc == 'p' && c == 'Y')
+ printf("\t\tY OFFSET: [%d]", val);
+ if (intro == '*' && groupc == 'x' && c == 'Y')
+ printf("\t\tYELLOW DOTS: [%d]", val);
+ if (intro == '*' && groupc == 'x' && c == 'M')
+ printf("\t\tMAGENTA DOTS: [%d]", val);
+ if (intro == '*' && groupc == 'x' && c == 'C')
+ printf("\t\tCYAN DOTS: [%d]", val);
+ if (intro == '*' && groupc == 'x' && c == 'K')
+ printf("\t\tBLACK DOTS: [%d]", val);
+ if (intro == '*' && groupc == 'x' && c == 'U')
+ printf("\t\tYELLOW WHITEDOTS: [%d]", val);
+ if (intro == '*' && groupc == 'x' && c == 'V')
+ printf("\t\tMAGENTA WHITEDOTS: [%d]", val);
+ if (intro == '*' && groupc == 'x' && c == 'Z')
+ printf("\t\tCYAN WHITEDOTS: [%d]", val);
+ if (intro == '*' && groupc == 'x' && c == 'W')
+ printf("\t\tBLACK WHITEDOTS: [%d]", val);
+
+ if (intro == '%' && val == 12345 && c == 'X')
+ goto out;
+ if (intro == '*' && groupc == 'r' && c == 'A')
+ {
+ ++pageNum;
+ printf("\t\t[Page %d]", pageNum);
+ pn = 0;
+ }
+ if (intro == '*' && groupc == 'b' && c == 'W')
+ {
+ printf("\tJBIG data (end)");
+ state = 'd';
+ }
+ if (intro == '*' && groupc == 'b' && c == 'V')
+ {
+ if (val == 20)
+ {
+ char *color[] =
+ { "yellow", "magenta", "cyan", "black" };
+
+ ++pn;
+ rc = fread(bih, bihlen = sizeof(bih), 1, fp);
+ curOff += bihlen;
+ if (nbie == 4 && pn >= 1 && pn <= 4)
+ printf("\t\t[%s]\n", color[pn-1]);
+ else if (nbie == 1)
+ printf("\t\t[%s]\n", "black");
+ else
+ printf("\t\t[%s]\n", "unknown");
+ print_bih(bih);
+ if (DecFile)
+ {
+ size_t cnt;
+
+ jbg_dec_init(&s[pn]);
+ rc = jbg_dec_in(&s[pn], bih, bihlen, &cnt);
+ if (rc == JBG_EIMPL)
+ error(1, "JBIG uses unimpl feature\n");
+ }
+ }
+ else
+ {
+ printf("\tJBIG data (first)");
+ state = 'd';
+ }
+ }
+ printf("\n");
+ }
+ else if (c >= '0' && c <= '9')
+ {
+ val *= 10; val += c - '0';
+ }
+ break;
+ case 'd':
+ --val;
+ if (val == 0)
+ state = 0;
+ if (!DecFile)
+ break;
+
+ ch = c;
+ rc = JBG_EAGAIN;
+ rc = jbg_dec_in(&s[pn], &ch, 1, &cnt);
+ if (rc == JBG_EOK)
+ {
+ int h, w, len;
+ unsigned char *image;
+
+ //debug(0, "JBG_OK: %d\n", pn);
+ h = jbg_dec_getheight(&s[pn]);
+ w = jbg_dec_getwidth(&s[pn]);
+ image = jbg_dec_getimage(&s[pn], 0);
+ len = jbg_dec_getsize(&s[pn]);
+ if (image)
+ {
+ char buf[512];
+ sprintf(buf, "%s-%02d-%d.pbm",
+ DecFile, pageNum, pn);
+ dfp = fopen(buf, imageCnt[pn] ? "a" : "w");
+ if (dfp)
+ {
+ if (imageCnt[pn] == 0)
+ fprintf(dfp, "P4\n%8d %8d\n", w, h);
+ imageCnt[pn] += incrY;
+ fwrite(image, 1, len, dfp);
+ fclose(dfp);
+ }
+ }
+ else
+ debug(0, "Missing image %dx%d!\n", h, w);
+ jbg_dec_free(&s[pn]);
+ }
+ break;
+ }
+ }
+ out:
+ ;
+ }
+ }
+ if (feof(fp))
+ return;
+
+ printf("Total size: %d bytes\n", totSize);
+}
+
+int
+main(int argc, char *argv[])
+{
+ extern int optind;
+ extern char *optarg;
+ int c;
+
+ while ( (c = getopt(argc, argv, "d:hoD:?h")) != EOF)
+ switch (c)
+ {
+ case 'd': DecFile = optarg; break;
+ case 'o': PrintOffset = 1; break;
+ case 'h': PrintHexOffset = 1; break;
+ case 'D': Debug = atoi(optarg); break;
+ default: usage(); exit(1);
+ }
+
+ argc -= optind;
+ argv += optind;
+
+ for(;;)
+ {
+ decode(stdin);
+ c = getc(stdin); ungetc(c, stdin);
+ if (feof(stdin))
+ break;
+ }
+ printf("\n");
+
+ exit(0);
+}
diff --git a/msexpand b/msexpand
new file mode 100755
index 0000000..fe39f44
--- /dev/null
+++ b/msexpand
@@ -0,0 +1,183 @@
+#!/usr/bin/perl
+# msexpand written by Paul Laufer, 2001, to help him learn perl ;)
+# - added fillup with zeros if expanded file is less than original;
+# - added binmode() to work on platforms which need it; by G. Knauf.
+# last change: 10-May-2002 gk.
+#
+# 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.
+#
+# Microsoft compress file structure:
+# Uses a 12 bit (4k) sliding window Lempel Ziv variant.
+#
+# header: 13 bytes
+# int MAGIC1 = 0x44445a53; // "SZDD"
+# int MAGIC2 = 0x3327f088;
+# char MAGIC3 = 0x41;
+# char last_char_of_filename; // offset 0x09
+# unsigned short int size_low;
+# unsigned short int size_high;
+#
+# data portion:
+# Flag byte followed by eight data elements, for each of the eight flag bits.
+# If a flag bit is 1, the corresponding element is a data byte (just copied).
+# If the flag bit is 0, the corresponding element is a code, comprised of two
+# bytes. The two bytes are divided into two parts. The upper 12 bits are the
+# offset into the 4k window, and the lower 4 bits are the length of the string,
+# minus 3. Thus the string length is between 3 and 18 bytes.
+
+# Flag byte Eight data elements
+# 10010011
+# |||||||+----byte
+# ||||||+-----byte
+# |||||+------code
+# ||||+-------code
+# |||+--------byte
+# ||+---------code
+# |+----------code
+# +-----------byte
+#
+# The window is wrapped, ie: with an offset of 4092 and a length of 10, you
+# will get the last 4 bytes then the first 6 bytes of the window in the output.
+#
+# Of course, the window must be updated with expanded strings and bytes as they
+# are read. Oh, yeah, the window needs to be initialized with spaces, not
+# zeros.
+
+$MAGIC1 = 0x44445a53;
+$MAGIC2 = 0x3327f088;
+$MAGIC3 = 0x41;
+
+$WINSIZE = 4096; # Window Size
+$HEADSIZE = 14; # Size of file header
+
+sub LENGTH {
+ my $x = shift;
+ return ($x & 0x0F) + 3;
+}
+sub OFFSET {
+ my ($x1, $x2) = @_;
+ return (((($x2 & 0xF0) << 4) + $x1 + 0x0010) & 0x0FFF)
+}
+sub WRAPFIX {
+ my $x = shift;
+ return ($x & ($WINSIZE - 1));
+}
+sub BITSET {
+ my ($byte, $bit) = @_;
+ return (($byte & (1<<$bit)) > 0);
+}
+# This sub directly translated from my C source. Runs slow in perl...
+sub LZ_expand {
+ my ($input, $size_uncomp) = @_;
+ local ($curr_pos, $location, $bit_map, $byte1, $byte2);
+ local ($window[$WINSIZE], $length, $counter, $x, $max);
+
+ # initialize window to all spaces (cleaner way?)
+ for($x = 0; $x < $WINSIZE; $x += 1) {
+ $window[$x] = ' ';
+ }
+
+ $curr_pos = 0;
+ $index = $HEADSIZE;
+ while($curr_pos < $size_uncomp) {
+ $bit_map = unpack('C', substr($input, $index, 1));
+ $index++;
+ if($index >= $size_orig) {
+ return $curr_pos;
+ }
+
+ for($counter = 0; $counter < 8; $counter++) {
+ if(!BITSET($bit_map, $counter)) {
+ # Its a code, so process
+ ($byte1, $byte2) =
+ unpack('CC', substr($input, $index, 2));
+ $index += 2;
+ if($index >= $size_orig) {
+ return $curr_pos;
+ }
+
+ $length = LENGTH($byte2);
+ $location = OFFSET($byte1, $byte2);
+
+ while($length > 0) {
+ $byte1 = $window[WRAPFIX($location)];
+ $window[WRAPFIX($curr_pos)] = $byte1;
+ printf(OUTFILE "%c", $byte1);
+ $curr_pos++;
+ $location++;
+ $length--;
+ }
+ } else {
+ # Its just a data byte
+ $byte1 = unpack('C', substr($input, $index, 1));
+ $index++;
+ $window[WRAPFIX($curr_pos)] = $byte1;
+ printf(OUTFILE "%c", $byte1);
+ $curr_pos++;
+ }
+ if ($index >= $size_orig) {
+ return $curr_pos;
+ }
+ }
+ }
+
+ return $curr_pos;
+}
+
+# start here
+
+if($#ARGV < 0) {
+ print "Microsoft Compressed File Expander\n";
+ print "Written by Paul Laufer 2001-03-13\n\n";
+ print "Usage:\n\tmsexpand.pl FILE\n\n";
+ print "Where FILE is a valid Microsoft Compressed file. Files of this type\nusually have the last letter replaced with an underscore, ie rmquasar.vx_.\nThe expanded file will be the original filename with the last underscore\nreplaced with the original letter, ie rmquasar.vxd.\n\n";
+ exit(1);
+}
+
+open(INFILE,"<$ARGV[0]") or die "Can't open file for input:";
+binmode(INFILE);
+undef $/;
+$input = <INFILE>;
+close(INFILE);
+
+($magic1, $magic2, $magic3, $lastchar, $size_low, $size_high) =
+ unpack 'IICa1SS', substr($input, 0, $HEADSIZE);
+
+if( $magic1 != $MAGIC1 || $magic2 != $MAGIC2 || $magic3 != $MAGIC3 ) {
+ print "Error: Input file is not a Microsoft Compress format.\n";
+ exit(1);
+} else {
+ print "Input file appears to be Microsoft Compress format, proceeding\n";
+}
+
+$outfile = $ARGV[0];
+substr($outfile, -1, 1) = $lastchar;
+
+print "Output filename = ", $outfile, "\n";
+$size_uncomp = ($size_high << 0x10) + $size_low;
+$size_orig = -s $ARGV[0];
+print "Original file size: ", $size_uncomp, " bytes\n";
+printf "Compression ratio: %.1f%%\n", $size_orig*100/$size_uncomp;
+
+open(OUTFILE, ">$outfile") or die "Can't open file for output:";
+binmode(OUTFILE);
+# Time to start expanding the file
+$size_expand = LZ_expand($input, $size_uncomp);
+printf("Expanded size: %d bytes\n", $size_expand);
+printf(OUTFILE "%s", ("\x0" x ($size_uncomp-$size_expand))) if ($size_expand < $size_uncomp);
+close(OUTFILE);
+
+printf("Output file size: %d bytes\n", (stat($outfile))[7]);
+
diff --git a/oakdecode.1in b/oakdecode.1in
new file mode 100644
index 0000000..08638a8
--- /dev/null
+++ b/oakdecode.1in
@@ -0,0 +1,267 @@
+.TH oakdecode 1 "${MODpage}" "oakdecode ${MODver}"
+'\"==========================================================================
+'\" STRINGS and MACROS
+'\"==========================================================================
+'\"
+'\" Define strings for special characters that nroff doesn't have
+'\"
+'\" N.B. using .if cua to test for special characters did not work.
+'\"
+.if !'\*[.T]'ps' .ds ua up
+.if '\*[.T]'ps' .ds ua \(ua
+.if !'\*[.T]'ps' .ds da down
+.if '\*[.T]'ps' .ds da \(da
+.if !'\*[.T]'ps' .ds <- left
+.if '\*[.T]'ps' .ds <- \(<-
+.if !'\*[.T]'ps' .ds -> right
+.if '\*[.T]'ps' .ds -> \(->
+'\"
+'\" bx - box a Courier string for making keycaps
+'\"
+'\" N.B. this mess is to make the line drawing come out only
+'\" if we are really generating postscript
+'\"
+.de bx
+.ie !'\*[.T]'ps' \{\
+. RB [ \\$1 ]\\$2
+.\}
+.el \{\
+. ie !r ps4html \{\
+'\" \(br\|\s-1\f(CB\\$1\fP\s+1\|\(br\l'|0\(rn'\l'|0\(ul'
+. ft CW
+. nr par*bxw \w'\\$1'+.4m
+\Z'\v'.25m'\D'l 0 -1m'\D'l \\n[par*bxw]u 0'\D'l 0 1m'\D'l -\\n[par*bxw]u 0''\
+\Z'\h'.2m'\s-1\\$1\s+1'\
+\h'\\n[par*bxw]u'\\$2
+. ft P
+. \}
+. el \{\
+. RB [ \\$1 ]\\$2
+. \}
+.\}
+..
+'\"
+'\" strings to set current color (null with old groff)
+'\"
+.if mred .ds red \m[red]
+.if mgreen .ds green \m[green]
+.if mblue .ds blue \m[blue]
+.if mblack .ds black \m[black]
+.if mblack .ds mP \mP
+'\"
+'\" fix for grotty + xterm. We call for orange, grotty outputs yellow,
+'\" but xterm displays yellow as orange. The cycle is complete.
+'\"
+.if n .defcolor orange rgb #ffff00
+'\"
+'\" color <color> - set the current color (ignores request with old groff)
+'\"
+.de color
+.if mred \m[\\$1]\c
+..
+'\"
+'\" colorword <color> <word> - colorize a word (ignored by old groff)
+'\"
+.de colorword
+.ie m\\$1 \m[\\$1]\\$2\mP\c
+.el \\$2\c
+..
+'\"
+'\" colbox <fg> <bg> <word> - colorize a word in a filled box
+'\"
+.de colbox
+.ie mred \M[\\$2]\
+\v'+.167v'\
+\D'P 0 -0.9v \w'\\$3'u 0 0 +0.9v -\w'\\$3'u 0'\
+\v'-.167v'\
+\m[\\$1]\\$3\mP\MP
+.el \\$3\c
+..
+'\"
+'\" Macros for doing pdfmarks
+'\"
+.de specialps
+\\k_\X'ps: \\$*'\h'|\\n_u'\c
+..
+'\"
+'\" pdfmark PDFMARKCODE
+'\"
+.ds pdfmarks
+.if d pdfmarks \{\
+.de pdfmark
+. specialps exec [\\$1 pdfmark
+..
+'\"
+'\" pdfdest LINKNAME
+'\"
+.de pdfdest
+.pdfmark "/Dest /\\$1 /View [/XYZ -5 PL null] /DEST"
+..
+'\"
+'\" pdfbookmark COUNT LINKNAME STRING
+'\"
+.de pdfbookmark
+. pdfmark "/View [/XYZ 44 730 1.0] /Count \\$1 /Dest /\\$2 /Title (\\$3) /OUT"
+..
+'\"
+'\" Define the SH and SS macros to save pdfmark information
+'\" in "arrays" of numbers and strings.
+'\"
+.if !r rr_n \{\
+.nr rr_n 0 1
+.am SH
+. nr rr_levels!\\n+[rr_n] 2
+. ds rr_labels!\\n[rr_n] \\$*
+. pdfdest Link\\n[rr_n]
+..
+.am SS
+. nr rr_levels!\\n+[rr_n] 3
+. ds rr_labels!\\n[rr_n] \\$*
+. pdfdest Link\\n[rr_n]
+..
+.\}
+'\"
+'\" Called at the end of the document to generate the pdfmark outline
+'\"
+.de pdf_outline
+.nr rr_levels!\\n+[rr_n] 1
+.nr rr_i 0 1
+.while \\n+[rr_i]<\\n[rr_n] \{\
+. nr rr_ip1 \\n[rr_i]+1
+. nr rr_count 0
+. if \\n[rr_levels!\\n[rr_ip1]]>\\n[rr_levels!\\n[rr_i]] \{\
+. nr rr_j \\n[rr_i] 1
+. while \\n+[rr_j]<\\n[rr_n] \{\
+. if \\n[rr_levels!\\n[rr_j]]<=\\n[rr_levels!\\n[rr_i]] \{\
+. break
+. \}
+. if \\n[rr_levels!\\n[rr_j]]==(\\n[rr_levels!\\n[rr_i]]+1) \{\
+. nr rr_count \\n[rr_count]+1
+. \}
+. \}
+. \}
+. ds hhh \\*[rr_labels!\\n[rr_i]]
+. pdfbookmark \\n[rr_count] Link\\n[rr_i] "\\*[hhh]"
+.\}
+..
+'\"
+'\" Some postscript to make pdfmarks harmless on old interpreters...
+'\"
+.specialps "def /pdfmark where {pop} {userdict /pdfmark /cleartomark load put} ifelse"
+'\"
+'\" Force display of Bookmarks in Acrobat when document is viewed.
+'\"
+.pdfmark "[/PageMode /UseOutlines /Page 1 /View [/XYZ null null null] /DOCVIEW"
+'\"
+'\" Output the document info in pdfmarks
+'\"
+.pdfmark "\
+ /Title (\*[an-title](\*[an-section])) \
+ /Subject (oakdecode Manual Page) \
+ /Author (Rick Richardson) \
+ /Keywords (printing, OAKT) \
+ /Creator (groff \n(.x.\n(.y.\n(.Y -man) \
+ /CreationDate (\*[an-extra1]) \
+ /ModDate (\*[an-extra1]) \
+ /DOCINFO"
+\}
+'\"
+'\" The manual page name is only 1st level mark
+'\"
+.nr rr_levels!\n+[rr_n] 1
+.ds rr_labels!\n[rr_n] \*[an-title](\*[an-section])
+.pdfdest Link\n[rr_n]
+'\"==========================================================================
+'\" MANUAL PAGE SOURCE
+'\"==========================================================================
+.SH NAME
+oakdecode \- Decode an OAKT printer stream into human readable form.
+.SH SYNOPSIS
+.B oakdecode
+.RI [ options "] <" OAKT-file
+.SH DESCRIPTION
+.B oakdecode
+decodes an OAKT printer stream into human readable form.
+.P
+An OAKT printer stream is the printer langauge used by the HP Color LaserJet
+1500 and other printers.
+
+.SH COMMAND LINE OPTIONS
+These are the options that can appear on the command line.
+.TP
+.BI \-d\0 basename
+Basename of .pbm file for saving decompressed planes.
+.TP
+.BI \-r\0 basename
+Basename of .jbg file for saving raw planes
+.TP
+.BI \-i
+Suppress display of image records.
+.TP
+.BI \-o
+Print file offsets.
+.TP
+.BI \-D\0 level
+Set Debug level [0].
+
+.SH EXAMPLES
+Decode an OAKT file created by foo2oak.
+
+.nf
+.ft CW
+$ oakdecode < testpage.oak
+0d (80) 1 OTHER
+0c (64) Wed Nov 05 16:30:50 2003 a07d3 100005 32001e
+0a (80) testpage.pdf
+14 (16) (no args)
+28 (16) Source=Tray1
+29 (80) PaperType=0 UNK8=2,0,0,0, blanks(63)
+2a (32) Copies=1 UNK=0
+2b (32) papercode=25 xwid=4648 ywid=9000 UNK=0
+33 (64)
+ u0 u1 w h resx resy nBits
+ x0 x0 2128 4300 600 600 x1
+15 (16) (no args)
+ bih0 w h l0 bih5 dlen plen unk yOff P subP
+3c (64) 00010000 2176 256 256 58030020 1050 1056 000 64 3 0
+ DL = 0, D = 0, P = 1, - = 0, XY = 2176 x 256
+ L0 = 256, MX = 32, MY = 0
+ Order = 3 ILEAVE SMID
+ Options = 88 LRLTWO TPDON TPBON
+ 1 stripes, 0 layers, 1 planes
+3c (64) 00010000 2176 256 256 58030020 3668 3680 000 320 3 0
+3c (64) 00010000 2176 256 256 58030020 1463 1472 000 640 3 0
+3c (64) 00010000 2176 256 256 58030020 1975 1984 000 896 3 0
+3c (64) 00010000 2176 224 224 58030020 2744 2752 000 1152 3 0
+3c (64) 00010000 2176 256 256 58030020 988 992 000 1440 3 0
+3c (64) 00010000 2176 256 256 58030020 2892 2896 000 1696 3 0
+3c (64) 00010000 2176 256 256 58030020 3634 3648 000 1952 3 0
+3c (64) 00010000 2176 256 256 58030020 3236 3248 000 2208 3 0
+3c (64) 00010000 2176 256 256 58030020 2279 2288 000 2464 3 0
+3c (64) 00010000 2176 256 256 58030020 3746 3760 000 2720 3 0
+3c (64) 00010000 2176 200 200 58030020 2404 2416 000 2976 3 0
+3c (64) 00010000 2176 256 256 58030020 3114 3120 000 3240 3 0
+3c (64) 00010000 2176 96 96 58030020 1142 1152 000 3496 3 0
+3c (64) 00010000 2176 256 256 58030020 2094 2112 000 3752 3 0
+3c (64) 00010000 2176 256 256 58030020 1319 1328 000 4008 3 0
+3c (64) 00010000 2176 36 36 58030020 208 224 000 4264 3 0
+17 (16) (no args)
+18 (16) UNK=0
+0b (16) (no args)
+.ft P
+.fi
+
+.SH FILES
+.BR /usr/bin/oakdecode
+.SH SEE ALSO
+.BR foo2oak-wrapper (1),
+.BR foo2oak (1),
+.BR jbg2pbm (1)
+.SH "AUTHOR"
+Rick Richardson <rick.richardson@comcast.net>
+.br
+${URLOAK}/
+'/"
+'/"
+'/"
+.em pdf_outline
diff --git a/oki.h b/oki.h
new file mode 100644
index 0000000..bc2f2fc
--- /dev/null
+++ b/oki.h
@@ -0,0 +1,58 @@
+/*
+ * Manifest constants for the ZjStream protocol (okidata flavor)
+ */
+
+#include <inttypes.h>
+typedef uint32_t DWORD;
+typedef uint16_t WORD;
+typedef uint8_t BYTE;
+
+typedef enum {
+ OKI_START_PAGE = 0,
+ OKI_DATA = 1,
+ OKI_END_PAGE = 255,
+} OKI_RECTYPE;
+
+typedef union _SWAP_32{
+ char byte[sizeof(uint32_t)];
+ uint32_t dword;
+} SWAP_32;
+
+typedef union _SWAP_16{
+ char byte[sizeof(uint16_t)];
+ uint16_t word;
+} SWAP_16;
+
+static inline uint32_t
+be32(uint32_t dword)
+{
+ SWAP_32 swap;
+ uint32_t probe = 1;
+
+ if (((char *)&probe)[0] == 1)
+ {
+ swap.byte[3] = (( SWAP_32 )dword).byte[0];
+ swap.byte[2] = (( SWAP_32 )dword).byte[1];
+ swap.byte[1] = (( SWAP_32 )dword).byte[2];
+ swap.byte[0] = (( SWAP_32 )dword).byte[3];
+ return swap.dword;
+ }
+ else
+ return dword;
+}
+
+static inline uint16_t
+be16(uint16_t word)
+{
+ SWAP_16 swap;
+ uint16_t probe = 1;
+
+ if (((char *)&probe)[0] == 1)
+ {
+ swap.byte[1] = (( SWAP_16 )word).byte[0];
+ swap.byte[0] = (( SWAP_16 )word).byte[1];
+ return swap.word;
+ }
+ else
+ return word;
+}
diff --git a/okidecode.c b/okidecode.c
new file mode 100644
index 0000000..beab73b
--- /dev/null
+++ b/okidecode.c
@@ -0,0 +1,384 @@
+/*
+ * $Id: okidecode.c,v 1.9 2006/12/07 13:33:50 rick Exp $
+ */
+
+/*b
+ * Copyright (C) 2003-2006 Rick Richardson
+ *
+ * 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.
+ *
+ * Author: Rick Richardson <rick.richardson@comcast.net>
+b*/
+
+#include <stdio.h>
+#include <stdlib.h>
+#include <stdarg.h>
+#include <string.h>
+#include <unistd.h>
+#include <errno.h>
+
+#include "oki.h"
+#include "jbig.h"
+
+/*
+ * Global option flags
+ */
+int Debug = 0;
+char *RawFile;
+char *DecFile;
+int PrintOffset = 0;
+int PrintHexOffset = 0;
+
+void
+debug(int level, char *fmt, ...)
+{
+ va_list ap;
+
+ if (Debug < level)
+ return;
+
+ va_start(ap, fmt);
+ vfprintf(stderr, fmt, ap);
+ va_end(ap);
+}
+
+int
+error(int fatal, char *fmt, ...)
+{
+ va_list ap;
+
+ fprintf(stderr, fatal ? "Error: " : "Warning: ");
+ if (errno)
+ fprintf(stderr, "%s: ", strerror(errno));
+ va_start(ap, fmt);
+ vfprintf(stderr, fmt, ap);
+ va_end(ap);
+ if (fatal > 0)
+ exit(fatal);
+ else
+ {
+ errno = 0;
+ return (fatal);
+ }
+}
+
+void
+usage(void)
+{
+ fprintf(stderr,
+"Usage:\n"
+" okidecode [options] < oki-file\n"
+"\n"
+" Decode a ZjStream into human readable form.\n"
+"\n"
+" A ZjStream is the printer langauge used by some Minolta/QMS and\n"
+" HP printers, such as the 2300DL and LJ-1000.\n"
+"\n"
+" More information on Zenographics ZjStream can be found at:\n"
+"\n"
+" http://ddk.zeno.com\n"
+"\n"
+"Options:\n"
+" -d basename Basename of .pbm file for saving decompressed planes\n"
+" -r basename Basename of .jbg file for saving raw planes\n"
+" -o Print file offsets\n"
+" -h Print hex file offsets\n"
+" -D lvl Set Debug level [%d]\n"
+ , Debug
+ );
+
+ exit(1);
+}
+
+static int
+getdword(unsigned char buf[4])
+{
+ return (buf[0] << 24) | (buf[1] << 16) | (buf[2] << 8) | (buf[3] << 0);
+}
+
+void
+print_bih(unsigned char bih[20])
+{
+ unsigned int xd, yd, l0;
+
+ xd = (bih[4] << 24) | (bih[5] << 16) | (bih[6] << 8) | (bih[7] << 0);
+ yd = (bih[8] << 24) | (bih[9] << 16) | (bih[10] << 8) | (bih[11] << 0);
+ l0 = (bih[12] << 24) | (bih[13] << 16) | (bih[14] << 8) | (bih[15] << 0);
+
+ printf(" DL = %d, D = %d, P = %d, - = %d, XY = %d x %d\n",
+ bih[0], bih[1], bih[2], bih[3], xd, yd);
+
+ printf(" L0 = %d, MX = %d, MY = %d\n",
+ l0, bih[16], bih[17]);
+
+ printf(" Order = %d %s%s%s%s%s\n", bih[18],
+ bih[18] & JBG_HITOLO ? " HITOLO" : "",
+ bih[18] & JBG_SEQ ? " SEQ" : "",
+ bih[18] & JBG_ILEAVE ? " ILEAVE" : "",
+ bih[18] & JBG_SMID ? " SMID" : "",
+ bih[18] & 0xf0 ? " other" : "");
+
+ printf(" Options = %d %s%s%s%s%s%s%s%s\n", bih[19],
+ bih[19] & JBG_LRLTWO ? " LRLTWO" : "",
+ bih[19] & JBG_VLENGTH ? " VLENGTH" : "",
+ bih[19] & JBG_TPDON ? " TPDON" : "",
+ bih[19] & JBG_TPBON ? " TPBON" : "",
+ bih[19] & JBG_DPON ? " DPON" : "",
+ bih[19] & JBG_DPPRIV ? " DPPRIV" : "",
+ bih[19] & JBG_DPLAST ? " DPLAST" : "",
+ bih[19] & 0x80 ? " other" : "");
+ printf(" %u stripes, %d layers, %d planes\n",
+ ((yd >> bih[1]) + ((((1UL << bih[1]) - 1) & xd) != 0) + l0 - 1) / l0,
+ bih[1] - bih[0], bih[2]);
+}
+
+void
+decode(FILE *fp)
+{
+ int c;
+ int rc;
+ FILE *dfp = NULL;
+ int pageNum = 1;
+ int len;
+ int curOff = 0;
+ struct jbg_dec_state s[5];
+ unsigned char bih[4][20];
+ int imageCnt[4] = {0,0,0,0};
+ int pn = 0;
+ char buf[1024];
+
+ c = getc(fp);
+ if (c == EOF)
+ {
+ printf("EOF on file\n");
+ return;
+ }
+ ungetc(c, fp);
+ if (c == '\033')
+ {
+ while (fgets(buf, sizeof(buf), fp))
+ {
+ if (PrintOffset)
+ printf("%d: ", curOff);
+ else if (PrintHexOffset)
+ printf("%6x: ", curOff);
+ fputs(buf, stdout);
+ curOff += strlen(buf);
+ if (strcmp(buf, "@PJL ENTER LANGUAGE=HIPERC\n") == 0)
+ break;
+ }
+ }
+
+ for (;;)
+ {
+ unsigned int reclen;
+ unsigned int rectype;
+ unsigned int blknum;
+
+ rc = fread(&reclen, 4, 1, fp);
+ if (rc != 1) break;
+ rc = fread(&rectype, 4, 1, fp);
+ if (rc != 1) break;
+
+ reclen = be32(reclen);
+ rectype = be32(rectype);
+ if (PrintOffset) printf("%d: ", curOff);
+ else if (PrintHexOffset) printf("%6x: ", curOff);
+ printf("RECTYPE %d (len=%d)\n", rectype, reclen);
+ curOff += 8;
+
+ blknum = 0;
+ reclen -= 8;
+ while (reclen)
+ {
+ int blklen;
+ int i;
+ unsigned char blk[200*1024];
+
+ if (PrintOffset) printf("%d: ", curOff);
+ else if (PrintHexOffset) printf("%6x: ", curOff);
+
+ rc = fread(&blklen, 4, 1, fp);
+ if (rc != 1) break;
+ curOff += 4;
+ reclen -= 4;
+
+ blklen = be32(blklen);
+ rc = fread(&blk, blklen, 1, fp);
+ if (rc != 1) return;
+ curOff += blklen;
+ reclen -= blklen;
+
+
+ switch (rectype)
+ {
+ case 0:
+ switch (blknum)
+ {
+ case 0:
+ printf("\tBLKNUM %d, nbie=%d, pn=%d",
+ blknum, blk[0], blk[1]);
+ switch (pn = blk[1])
+ {
+ case 0: printf(" [cyan] "); break;
+ case 1: printf(" [yello]"); break;
+ case 2: printf(" [magen]"); break;
+ case 3: printf(" [black]"); break;
+ }
+ printf(" uc=%d,%d, wid=%d ud=%d,%x\n",
+ blk[2], blk[3],
+ getdword(blk+4), getdword(blk+8), getdword(blk+12));
+ if (pn < 0 || pn > 3)
+ error(1, "Plane %d is not 0-3.\n", pn);
+ break;
+ case 1: /* BIH */
+ printf("\tBLKNUM %d (len=%d), bie:\n",
+ blknum, blklen);
+ memcpy(bih[pn], blk, 20);
+ // bih[18] |= JBG_ILEAVE | JBG_SMID;
+ // bih[19] |= JBG_TPDON | JBG_DPON;
+ // bih[19] |= JBG_DELAY_AT;
+ print_bih(bih[pn]);
+ imageCnt[pn] = 0;
+ break;
+ }
+ break;
+ case 1:
+ switch (blknum)
+ {
+ case 0: /* PLANE */
+ printf("\tBLKNUM %d (len=%d), plane=%d, uc=%d,%d,%d\n",
+ blknum, blklen, pn = blk[0], blk[1], blk[2], blk[3]);
+ break;
+ case 1: /* DATA */
+ printf("\tBLKNUM %d (len=%d), Data=", blknum, blklen);
+ for (i = 0; i < blklen && i < 11; ++i)
+ printf("%02x ", blk[i]);
+ if (blklen >= 11)
+ printf("...");
+ printf("\n");
+ if (DecFile)
+ {
+ size_t cnt;
+ unsigned char *image;
+
+ if (imageCnt[pn] == 0)
+ {
+ jbg_dec_init(&s[pn]);
+ rc = jbg_dec_in(&s[pn], bih[pn], 20, NULL);
+ if (rc == JBG_EIMPL)
+ error(1, "JBIG uses unimplemented feature\n");
+ // fwrite(bih, 20, 1, dfp);
+ imageCnt[pn] = 20;
+ len = jbg_dec_getsize(&s[pn]);
+ image = jbg_dec_getimage(&s[pn], 0);
+ if (image && len)
+ memset(image, 0, len);
+ }
+ for (i = 0; i < blklen; ++i)
+ {
+ rc = jbg_dec_in(&s[pn], &blk[i], 1, &cnt);
+ if (rc == JBG_EAGAIN && rc == JBG_OK)
+ error(1, "jbg_dec_in rc=%d (%s)\n",
+ rc, jbg_strerror(rc, 0));
+ }
+ if (rc == JBG_OK)
+ {
+ int w, h;
+
+ h = jbg_dec_getheight(&s[pn]);
+ w = jbg_dec_getwidth(&s[pn]);
+ len = jbg_dec_getsize(&s[pn]);
+ image = jbg_dec_getimage(&s[pn], 0);
+ printf("\trc=%d(%s) %dx%d len=%d\n",
+ rc, jbg_strerror(rc, 0), w, h, len);
+
+ sprintf(buf, "%s-%02d-%d.pbm",
+ DecFile, pageNum, pn);
+ dfp = fopen(buf, "w");
+ if (!dfp)
+ error(1, "Couldn't open '%s'.\n", buf);
+ fprintf(dfp, "P4\n%8d %8d\n", w, h);
+ fwrite(image, 1, len, dfp);
+ fclose(dfp);
+
+ jbg_dec_free(&s[pn]);
+ imageCnt[pn] = 0;
+ }
+ }
+ break;
+ }
+ break;
+ default:
+ printf("\t");
+ for (i = 0; i < blklen && i < 20; ++i)
+ printf("%02x ", blk[i]);
+ if (blklen >= 22)
+ printf("...");
+ printf("\n");
+ break;
+ }
+
+ ++blknum;
+ }
+ if (rectype == 255)
+ {
+ c = getc(fp);
+ if (c == EOF) break;
+ ungetc(c, fp);
+ if (c == '\033') break;
+ ++pageNum;
+ }
+ }
+
+ while (fgets(buf, sizeof(buf), fp))
+ {
+ if (PrintOffset)
+ printf("%d: ", curOff);
+ else if (PrintHexOffset)
+ printf("%6x: ", curOff);
+ fputs(buf, stdout);
+ curOff += strlen(buf);
+ if (strcmp(buf, "@PJL ENTER LANGUAGE=HIPERC\n") == 0)
+ break;
+ }
+ printf("\n");
+}
+
+int
+main(int argc, char *argv[])
+{
+ extern int optind;
+ extern char *optarg;
+ int c;
+
+ while ( (c = getopt(argc, argv, "d:hor:D:?h")) != EOF)
+ switch (c)
+ {
+ case 'd': DecFile = optarg; break;
+ case 'r': RawFile = optarg; break;
+ case 'o': PrintOffset = 1; break;
+ case 'h': PrintHexOffset = 1; break;
+ case 'D': Debug = atoi(optarg); break;
+ default: usage(); exit(1);
+ }
+
+ argc -= optind;
+ argv += optind;
+
+ decode(stdin);
+
+ exit(0);
+}
diff --git a/testpage.ps b/testpage.ps
new file mode 100644
index 0000000..3184363
--- /dev/null
+++ b/testpage.ps
@@ -0,0 +1,416 @@
+%!PS-Adobe-2.0
+%%Title: testpage.fig
+%%Creator: fig2dev Version 3.2.3 Patchlevel
+%%CreationDate: Wed Aug 30 15:28:56 2000
+%%For: prospector@porky.devel.redhat.com ()
+%%Orientation: Portrait
+%%Pages: 1
+%%BoundingBox: 0 0 612 792
+%%BeginSetup
+%%IncludeFeature: *PageSize Letter
+%%EndSetup
+%%Magnification: 1.0000
+%%EndComments
+/$F2psDict 200 dict def
+$F2psDict begin
+$F2psDict /mtrx matrix put
+/col-1 {0 setgray} bind def
+/col0 {0.000 0.000 0.000 srgb} bind def
+/col1 {0.000 0.000 1.000 srgb} bind def
+/col2 {0.000 1.000 0.000 srgb} bind def
+/col3 {0.000 1.000 1.000 srgb} bind def
+/col4 {1.000 0.000 0.000 srgb} bind def
+/col5 {1.000 0.000 1.000 srgb} bind def
+/col6 {1.000 1.000 0.000 srgb} bind def
+/col7 {1.000 1.000 1.000 srgb} bind def
+/col8 {0.000 0.000 0.560 srgb} bind def
+/col9 {0.000 0.000 0.690 srgb} bind def
+/col10 {0.000 0.000 0.820 srgb} bind def
+/col11 {0.530 0.810 1.000 srgb} bind def
+/col12 {0.000 0.560 0.000 srgb} bind def
+/col13 {0.000 0.690 0.000 srgb} bind def
+/col14 {0.000 0.820 0.000 srgb} bind def
+/col15 {0.000 0.560 0.560 srgb} bind def
+/col16 {0.000 0.690 0.690 srgb} bind def
+/col17 {0.000 0.820 0.820 srgb} bind def
+/col18 {0.560 0.000 0.000 srgb} bind def
+/col19 {0.690 0.000 0.000 srgb} bind def
+/col20 {0.820 0.000 0.000 srgb} bind def
+/col21 {0.560 0.000 0.560 srgb} bind def
+/col22 {0.690 0.000 0.690 srgb} bind def
+/col23 {0.820 0.000 0.820 srgb} bind def
+/col24 {0.500 0.190 0.000 srgb} bind def
+/col25 {0.630 0.250 0.000 srgb} bind def
+/col26 {0.750 0.380 0.000 srgb} bind def
+/col27 {1.000 0.500 0.500 srgb} bind def
+/col28 {1.000 0.630 0.630 srgb} bind def
+/col29 {1.000 0.750 0.750 srgb} bind def
+/col30 {1.000 0.880 0.880 srgb} bind def
+/col31 {1.000 0.840 0.000 srgb} bind def
+
+end
+save
+newpath 0 792 moveto 0 0 lineto 612 0 lineto 612 792 lineto closepath clip newpath
+0.0 792.0 translate
+1 -1 scale
+
+/cp {closepath} bind def
+/ef {eofill} bind def
+/gr {grestore} bind def
+/gs {gsave} bind def
+/sa {save} bind def
+/rs {restore} bind def
+/l {lineto} bind def
+/m {moveto} bind def
+/rm {rmoveto} bind def
+/n {newpath} bind def
+/s {stroke} bind def
+/sh {show} bind def
+/slc {setlinecap} bind def
+/slj {setlinejoin} bind def
+/slw {setlinewidth} bind def
+/srgb {setrgbcolor} bind def
+/rot {rotate} bind def
+/sc {scale} bind def
+/sd {setdash} bind def
+/ff {findfont} bind def
+/sf {setfont} bind def
+/scf {scalefont} bind def
+/sw {stringwidth} bind def
+/tr {translate} bind def
+/tnt {dup dup currentrgbcolor
+ 4 -2 roll dup 1 exch sub 3 -1 roll mul add
+ 4 -2 roll dup 1 exch sub 3 -1 roll mul add
+ 4 -2 roll dup 1 exch sub 3 -1 roll mul add srgb}
+ bind def
+/shd {dup dup currentrgbcolor 4 -2 roll mul 4 -2 roll mul
+ 4 -2 roll mul srgb} bind def
+/$F2psBegin {$F2psDict begin /$F2psEnteredState save def} def
+/$F2psEnd {$F2psEnteredState restore end} def
+
+$F2psBegin
+%%Page: 1 1
+10 setmiterlimit
+ 0.06000 0.06000 sc
+%%Page: 1 1
+/Helvetica-Bold ff 270.00 scf sf
+4800 2100 m
+gs 1 -1 sc (This is the Red Hat Printconf) dup sw pop 2 div neg 0 rm col-1 sh gr
+/Helvetica-Bold ff 270.00 scf sf
+4800 2445 m
+gs 1 -1 sc (US Letter PostScript Test Page) dup sw pop 2 div neg 0 rm col-1 sh gr
+% Polyline
+7.500 slw
+n 2400 7200 m 3000 7200 l 3000 7500 l 2400 7500 l
+ cp gs col10 1.00 shd ef gr gs col-1 s gr
+% Polyline
+n 3600 7200 m 4200 7200 l 4200 7500 l 3600 7500 l
+ cp gs col6 1.00 shd ef gr gs col-1 s gr
+% Polyline
+n 4200 7200 m 4800 7200 l 4800 7500 l 4200 7500 l
+ cp gs col5 1.00 shd ef gr gs col-1 s gr
+% Polyline
+n 4800 7200 m 5400 7200 l 5400 7500 l 4800 7500 l
+ cp gs col26 1.00 shd ef gr gs col-1 s gr
+% Polyline
+n 5400 7200 m 6000 7200 l 6000 7500 l 5400 7500 l
+ cp gs col31 1.00 shd ef gr gs col-1 s gr
+% Polyline
+n 6000 7200 m 6600 7200 l 6600 7500 l 6000 7500 l
+ cp gs col3 1.00 shd ef gr gs col-1 s gr
+% Polyline
+n 3000 7200 m 3600 7200 l 3600 7500 l 3000 7500 l
+ cp gs col20 1.00 shd ef gr gs col-1 s gr
+% Polyline
+n 6600 7200 m 7200 7200 l 7200 7500 l 6600 7500 l
+ cp gs col2 1.00 shd ef gr gs col-1 s gr
+/Helvetica-Bold ff 150.00 scf sf
+5100 7800 m
+gs 1 -1 sc (Brown) dup sw pop 2 div neg 0 rm col-1 sh gr
+/Helvetica-Bold ff 150.00 scf sf
+5700 7800 m
+gs 1 -1 sc (Gold) dup sw pop 2 div neg 0 rm col-1 sh gr
+/Helvetica-Bold ff 150.00 scf sf
+6900 7800 m
+gs 1 -1 sc (Green) dup sw pop 2 div neg 0 rm col-1 sh gr
+/Helvetica-Bold ff 150.00 scf sf
+3900 7800 m
+gs 1 -1 sc (Yellow) dup sw pop 2 div neg 0 rm col-1 sh gr
+/Helvetica-Bold ff 150.00 scf sf
+3300 7800 m
+gs 1 -1 sc (Red) dup sw pop 2 div neg 0 rm col-1 sh gr
+/Helvetica-Bold ff 150.00 scf sf
+2700 7800 m
+gs 1 -1 sc (Blue) dup sw pop 2 div neg 0 rm col-1 sh gr
+/Helvetica-Bold ff 150.00 scf sf
+4500 7800 m
+gs 1 -1 sc (Purple) dup sw pop 2 div neg 0 rm col-1 sh gr
+/Helvetica-Bold ff 150.00 scf sf
+6300 7800 m
+gs 1 -1 sc (Cyan) dup sw pop 2 div neg 0 rm col-1 sh gr
+% Polyline
+15.000 slw
+n 600 600 m 9600 600 l 9600 12600 l 600 12600 l
+ cp gs col-1 s gr
+% Polyline
+n 1200 1200 m 9000 1200 l 9000 12000 l 1200 12000 l
+ cp gs col-1 s gr
+% Polyline
+%
+% Originally from a GIF File: redhat-logo-new.gif
+
+% Begin Imported PCX File: redhat-logo-new.gif
+
+n gs
+2925 3135 tr
+15.000000 -15.000000 sc
+0 -91 tr
+0 0 tr
+sa
+/showpage {} def
+% PCX image follows:
+250 91 sc
+%***********************************************************************
+%* *
+%* Object: Image decoding PS-routine Date: 01.02.93 *
+%* Author: Evgeni CHERNYAEV (chernaev@vxcern.cern.ch) *
+%* *
+%* Function: Display a run-length encoded color image. *
+%* The image is displayed in color on viewers and printers *
+%* that support color Postscript, otherwise it is displayed *
+%* as grayscale. *
+%* *
+%***********************************************************************
+/byte 1 string def
+/color 3 string def
+systemdict /colorimage known { /cnt 3 def } { /cnt 1 def } ifelse
+/String 256 cnt mul string def
+%***********************************************************************
+/DecodePacket % Decode color packet *
+%***********************************************************************
+{
+ currentfile byte readhexstring pop 0 get
+ /Nbyte exch 1 add cnt mul def
+ /color ColorMap currentfile byte readhexstring pop 0 get get def
+ String dup
+ 0 cnt Nbyte 1 sub { color putinterval dup } for
+ pop 0 Nbyte getinterval
+} bind def
+%***********************************************************************
+/DisplayImage % Display run-length encoded color image *
+%***********************************************************************
+{
+ gsave
+ currentfile String readline pop
+ token { /columns exch def } { } ifelse
+ token { /rows exch def pop } { } ifelse
+ currentfile String readline pop
+ token { /Ncol exch def pop } { } ifelse
+ /ColorMap Ncol array def
+ systemdict /colorimage known {
+ 0 1 Ncol 1 sub {
+ ColorMap exch
+ currentfile 3 string readhexstring pop put
+ } for
+ columns rows 8
+ [ columns 0 0 rows neg 0 rows ]
+ { DecodePacket } false 3 colorimage
+ }{
+ 0 1 Ncol 1 sub {
+ ColorMap exch
+ 1 string dup 0
+ currentfile color readhexstring pop pop
+ color 0 get 0.299 mul
+ color 1 get 0.587 mul add
+ color 2 get 0.114 mul add
+ cvi put put
+ } for
+ columns rows 8
+ [ columns 0 0 rows neg 0 rows ]
+ { DecodePacket } image
+ } ifelse
+ grestore
+} bind def
+%***********************************************************************
+%* Image decoding *
+%***********************************************************************
+DisplayImage
+250 91
+256
+000000 390000 7b7b7b 737373 636363 fefefe fcfcfc d4d4d4 1f1f1f 843129
+c0c0c0 bebebe c63121 ff0000 787878 ef1010 fdfdfd 521010 424242 efefef
+dddddd a53129 101010 bdbdbd 000000 000000 000000 000000 000000 000000
+000000 000000 000000 000000 000000 000000 000000 000000 000000 000000
+000000 000000 000000 000000 000000 000000 000000 000000 000000 000000
+000000 000000 000000 000000 000000 000000 000000 000000 000000 000000
+000000 000000 000000 000000 000000 000000 000000 000000 000000 000000
+000000 000000 000000 000000 000000 000000 000000 000000 000000 000000
+000000 000000 000000 000000 000000 000000 000000 000000 000000 000000
+000000 000000 000000 000000 000000 000000 000000 000000 000000 000000
+000000 000000 000000 000000 000000 000000 000000 000000 000000 000000
+000000 000000 000000 000000 000000 000000 000000 000000 000000 000000
+000000 000000 000000 000000 000000 000000 000000 000000 000000 000000
+000000 000000 000000 000000 000000 000000 000000 000000 000000 000000
+000000 000000 000000 000000 000000 000000 000000 000000 000000 000000
+000000 000000 000000 000000 000000 000000 000000 000000 000000 000000
+000000 000000 000000 000000 000000 000000 000000 000000 000000 000000
+000000 000000 000000 000000 000000 000000 000000 000000 000000 000000
+000000 000000 000000 000000 000000 000000 000000 000000 000000 000000
+000000 000000 000000 000000 000000 000000 000000 000000 000000 000000
+000000 000000 000000 000000 000000 000000 000000 000000 000000 000000
+000000 000000 000000 000000 000000 000000 000000 000000 000000 000000
+000000 000000 000000 000000 000000 000000 000000 000000 000000 000000
+000000 000000 000000 000000 000000 000000 000000 000000 000000 000000
+000000 000000 000000 000000 000000 000000 000000 000000 000000 000000
+000000 000000 000000 000000 000000 000000
+360a0112080000160012e70a0004001613000012df0a00121a000012d90a000200161f00
+d60a00162300d20a00162700ce0a00122a000016cb0a1b0003010e000012c70a00120a00
+00010011000c040f000c010903010009000c010f010d020f000c001100010a000016c50a
+00160a000001000c180d000c001100010a00c20a000200160a000001000f100d000f000c
+00150209000c000f020d001500010a000004bf0a00020c000015120d010f000c00150011
+000000010015020d00090b000012be0a0c000001000f160d000901000001000f020d0011
+0b000012bc0a0d000011160d000c0001000000010015030d000c0c000012ba0a0e000015
+150d000f010c000f060d00110c000004b80a00160e00000f020d0015000f1b0d00150d00
+0002b60a00120e000001020d000c00010009000f1a0d000f00010d00b60a0f000009020d
+0015010000010109000c001502090015000f120d00090d000016b40a10000015020d000c
+000109000001000f110d000c0e000012b20a00161000000c030d00090300000100110009
+0015010c000f130d00110e00b10a000410000001000f040d00090101000c1a0d00150e00
+0016b00a11000001060d010f1b0d000f00010e00af0a001211000001250d00090f00ae0a
+12000001000f240d000c0f00ad0a00120700000100090015010c050f00000009240d000f
+00010f00ac0a060000010015000f080d000f000000010015240d00110f00ab0a00040500
+0011000f0a0d0015010000010009000f220d00150f000016aa0a001604000011000f0b0d
+0009030000010009000f200d000c1000aa0a050000150c0d00150500000100110015000c
+1d0d000f10000012a80a00040500000c0c0d000f00110800000100090015000f190d000f
+1100a80a0016050000150d0d000f00110a00000100110009000f160d000c000000120016
+0e00a80a060000110f0d001500010b0000010011000c140d00150001000f000d000c0011
+00010b000004a70a06000001000c0f0d000f000900010b0000010015130d00110009030d
+000f0009000109000016a60a001207000011110d000f001500010a000001000f110d000f
+0001000f050d000c00110900a60a001608000009130d000c001100010800000c110d000f
+0015080d001500010700420a0002021200160002260a001700020013330a090000010015
+140d000c00090001060000151d0d001500010600350a00170300070a001203000002260a
+001200000004330a0a0000010015150d000f0015001104000011000f1d0d00090600350a
+0013011700020000070a001300170013001600000002260a001200000012330a0b000001
+0015170d000c00090001020000111d0d000c06000012370a001700000a0a001200000002
+260a001200000012330a0c0000010009190d000c00150109000c1d0d000105000012370a
+001700000a0a001200000002000a0013021700130d0a001700020103000200170c0a0012
+00000012330a0e000009000f3a0d000105000016370a001700000a0a0012000000020003
+040000040013090a00130012050000120013070a001300160600001600132e0a0f000011
+000f390d00010600120a001701020017070a0013000400160100001600040013090a0013
+00020016000000160012011700000a0a0012030001120016010000120013080a00120100
+00120102001201000012070a00130700001600132e0a100000010009380d000106000a0a
+00020300000a0017001200000012001600000002050a0017011600020117000201160013
+070a00130012000000040017000200120000000300000a0a0012010000120013020a0003
+01000002070a001701000004030a000401000013070a001300170012000000120217300a
+12000011000c350d000f000106000a0a00130117000200000013001600120013000a0013
+00000016050a001600120013030a001300160012070a000300160017030a000401000a0a
+001201000013040a001200000012070a00170200030a001701000017090a001200000012
+330a130000010009000f330d001507000d0a0017000000120004020a00020100040a0002
+00000017050a001700000017050a001300000002050a001600000a0a001200000012050a
+000200000012070a0013001200000012030a000201000017090a001200000012330a1500
+00010015000f310d001107000d0a001700000012030a001300020017040a0112070a0012
+0003050a000200000013050a000200000a0a001200000003050a000201000b0a01170002
+000402000017090a001200000012330a1100000e00060105000600080011000c2f0d0009
+070000120d0a0017000000170b0a00120016071200160012050a00020012060a00020000
+0a0a001200000002050a00020100080a0017001207000017090a001200000012330a1000
+00080505000e00000011000c2c0d000c0001070000120d0a001700000c0a01120902050a
+00020012060a000200000a0a001200000002050a00020100070a00020300001600120003
+000201000017090a001200000012020a0003000000022d0a1000000b0605000801000011
+000c290d000c0001080000120d0a001700000c0a001200040f0a00020012060a00020000
+0a0a001200000002050a00020100060a00130016000000160017030a001701000017000a
+00120002060a001200000012020a0012000000022d0a100000140605000603000011000c
+260d000c000109000e0a001700000c0a00030016070a00030002050a001700000013050a
+001200000a0a001200000002050a00020100060a001701000017040a0002010000170013
+0100060a001200000012020a0012000000022d0a100000140705000b0000010e01000011
+0015000f220d000900010a000e0a001700000c0a001700000002050a001300000002050a
+001300160002040a001701000a0a001200000002050a000200000016060a001701000017
+040a00120100001700130100060a001200000012020a0012000000022d0a00120f000008
+08050006010500140008010000010009000f1e0d000f00110c000e0a001700000d0a0004
+00160017030a00170112070a000200000002020a0017001601000a0a001200000004050a
+00030100060a0013010000120013010a001300120200011700000012060a000201000017
+000a0017010000172d0a00031000000b0b0500060300000100110009000c000f180d000f
+000900010d000c0a01020004000002020a0a001300120000001201020012000000120013
+080a0004000000120002001205000002040a000200160012020000120016001700130016
+001200160100001200160002040a000302000116010001160000011600000012060a0017
+050000122e0a00020200070e0005000e0008030000140b0500140600000100110015000c
+000f110d000f000c001100010e0000120c0a000305120c0a001700030112000400020b0a
+000202120102010401170013040a000306000002001706000012050a0002001603000012
+01170016010000160017070a000200160200001200172f0a02000a050006000801000008
+0c05000b09000101001100090015010c060f010c010901011100440a0117020a0117010a
+0117020a00130017080a02170013110a01170013310a0012010000060a0500060200000e
+0c05000b2e00a80a0002010e0c0500140200000800060b050014000807000008000e0008
+0b00001613000016a90a00080e0500060008010000140e05050603050006011402050006
+03140005001413000003a80a1205010625050007120000167a0a00120200001200030012
+270a3a05000e1100001600127b0a00120017001200160112270a3a051100011600027b0a
+001200170012001600000012280a38050014110001167c0a000200130302280a29050114
+0205010607050014100001160002ab0a28050014010000080007000b0000000e0705000b
+100000120016ad0a27050006000e000803000014070500080f000116af0a290502140006
+0705000610000112af0a3505000e0300000b040a020e0007000e0008001200160010af0a
+3405000e0400000a0d05b00a320500140500000a0d05b10a310500080300000e00060d05
+b30a2f05000e0200000b1005b40a2d0500140100000800061005b50a2c05000602000006
+1005b70a2b050008010000141005b90a2905000e0000000800061005bb0a2805000e0014
+1105bd0a3a05c00a3705c20a3405c50a3205c80a2e05cc0a2b05ce0a2805d30a2305d70a
+1e05de0a1705e60a0d05ff0aff0aff0aff0aff0a960a
+restore grestore
+%
+% End Imported PIC File: redhat-logo-new.gif
+%
+/Times-Roman ff 180.00 scf sf
+4800 12375 m
+gs 1 -1 sc (0.5") col-1 sh gr
+/Times-Roman ff 180.00 scf sf
+4725 900 m
+gs 1 -1 sc (0.5") col-1 sh gr
+/Times-Roman ff 180.00 scf sf
+4800 11850 m
+gs 1 -1 sc (1") col-1 sh gr
+/Times-Roman ff 180.00 scf sf
+4800 1500 m
+gs 1 -1 sc (1") col-1 sh gr
+/Times-Roman ff 180.00 scf sf
+750 7500 m
+gs 1 -1 sc (0.5") col-1 sh gr
+/Times-Roman ff 180.00 scf sf
+1350 7500 m
+gs 1 -1 sc (1") col-1 sh gr
+/Times-Roman ff 180.00 scf sf
+8700 7500 m
+gs 1 -1 sc (1") col-1 sh gr
+/Times-Roman ff 180.00 scf sf
+9225 7500 m
+gs 1 -1 sc (0.5") col-1 sh gr
+/Helvetica-Bold ff 270.00 scf sf
+4800 5040 m
+gs 1 -1 sc (This logo has a red hat, so) dup sw pop 2 div neg 0 rm col-1 sh gr
+/Helvetica-Bold ff 270.00 scf sf
+4800 5385 m
+gs 1 -1 sc (if your printer is configured for) dup sw pop 2 div neg 0 rm col-1 sh gr
+/Helvetica-Bold ff 270.00 scf sf
+4800 5730 m
+gs 1 -1 sc (color it should be red!) dup sw pop 2 div neg 0 rm col-1 sh gr
+/Helvetica-Bold ff 270.00 scf sf
+4800 6420 m
+gs 1 -1 sc (Here are some other colors; they) dup sw pop 2 div neg 0 rm col-1 sh gr
+/Helvetica-Bold ff 270.00 scf sf
+4800 6765 m
+gs 1 -1 sc (will appear as greys on a B&W printer...) dup sw pop 2 div neg 0 rm col-1 sh gr
+/Helvetica-Bold ff 270.00 scf sf
+4800 9225 m
+gs 1 -1 sc (are spaced at 0.5" and 1") dup sw pop 2 div neg 0 rm col-1 sh gr
+/Helvetica-Bold ff 270.00 scf sf
+4800 8880 m
+gs 1 -1 sc (The boxes bordering this page) dup sw pop 2 div neg 0 rm col-1 sh gr
+/Helvetica-Bold ff 270.00 scf sf
+4800 9600 m
+gs 1 -1 sc (from the sides of the paper.) dup sw pop 2 div neg 0 rm col-1 sh gr
+/Helvetica-Bold ff 270.00 scf sf
+4800 10500 m
+gs 1 -1 sc (It is not unusual for the 0.5" bottom margin) dup sw pop 2 div neg 0 rm col-1 sh gr
+/Helvetica-Bold ff 270.00 scf sf
+4800 10845 m
+gs 1 -1 sc (not to show. Many printers cannot) dup sw pop 2 div neg 0 rm col-1 sh gr
+/Helvetica-Bold ff 270.00 scf sf
+4800 11190 m
+gs 1 -1 sc (print that close to the bottom of the page.) dup sw pop 2 div neg 0 rm col-1 sh gr
+$F2psEnd
+rs
+showpage
diff --git a/usb_printerid.c b/usb_printerid.c
new file mode 100644
index 0000000..7d111af
--- /dev/null
+++ b/usb_printerid.c
@@ -0,0 +1,74 @@
+/*
+ * Test program to try to query device id from printer.
+ */
+#include <stdio.h>
+#include <stdlib.h>
+#include <stdarg.h>
+#include <unistd.h>
+#include <errno.h>
+#include <sys/types.h>
+#include <sys/stat.h>
+#include <fcntl.h>
+#include <string.h>
+#include <sys/ioctl.h>
+
+#define IOCNR_GET_DEVICE_ID 1
+#define LPIOC_GET_DEVICE_ID(len) \
+ _IOC(_IOC_READ, 'P', IOCNR_GET_DEVICE_ID, len) // get device_id string
+#define LPGETSTATUS 0x060b // drivers/char/lp.c
+
+int
+error(int fatal, char *fmt, ...)
+{
+ va_list ap;
+
+ fprintf(stderr, fatal ? "Error: " : "Warning: ");
+ if (errno)
+ fprintf(stderr, "%s: ", strerror(errno));
+ va_start(ap, fmt);
+ vfprintf(stderr, fmt, ap);
+ va_end(ap);
+ if (fatal > 0)
+ exit(fatal);
+ else
+ {
+ errno = 0;
+ return (fatal);
+ }
+}
+
+int
+main (int argc, char *argv[])
+{
+ int fd;
+ unsigned char argp[1024];
+ int length;
+
+ --argc;
+ ++argv;
+
+ if (argc != 1)
+ error(1, "usage: usb_id_test /dev/usb/lp0\n");
+
+ fd = open(argv[0], O_RDWR);
+ if (fd < 0)
+ error(1, "can't open '%s'\n", argv[0]);
+
+ if (ioctl(fd, LPIOC_GET_DEVICE_ID(sizeof(argp)), argp) < 0)
+ error(1, "GET_DEVICE_ID on '%s'\n", argv[0]);
+
+ length = (argp[0] << 8) + argp[1] - 2;
+ printf("GET_DEVICE_ID string:\n");
+ fwrite(argp + 2, 1, length, stdout);
+ printf("\n");
+
+ #if 0
+ if (ioctl(fd, LPGETSTATUS, &status) < 0)
+ error(1, "LPGETSTATUS on '%s'\n", argv[0]);
+
+ printf("Status: 0x%02x\n", status);
+ #endif
+
+ close(fd);
+ exit(0);
+}
diff --git a/xqx.h b/xqx.h
new file mode 100644
index 0000000..a7b97ee
--- /dev/null
+++ b/xqx.h
@@ -0,0 +1,224 @@
+/*
+ * Manifest constants for the ZjStream protocol
+ *
+ * I'm told that a lot of this stuff came from a file called "zjrca.h".
+ * But a Google search does not turn up that file. I added my own
+ * improvements and missing pieces. -Rick
+ */
+
+#include <inttypes.h>
+typedef uint32_t DWORD;
+typedef uint16_t WORD;
+typedef uint8_t BYTE;
+
+typedef enum {
+ XQX_START_DOC = 1,
+ XQX_END_DOC = 2,
+ XQX_START_PAGE = 3,
+ XQX_END_PAGE = 4,
+ XQX_START_PLANE = 5,
+ XQX_END_PLANE = 6,
+ XQX_JBIG = 7,
+
+ // XQX_2600N_PAUSE =11,
+ // XQX_2600N =12,
+} XQX_TYPE;
+
+typedef struct _XQX_HEADER {
+ DWORD type; /* ZJ_TYPE */
+ DWORD items; /* total record size, includes sizeof(ZJ_HEADER) */
+} XQX_HEADER;
+
+typedef enum {
+ XQXI_DMDUPLEX = 0x10000002, // from DEVMODE (DMBIN?)
+ XQXI_DMDEFAULTSOURCE= 0x20000006, // from DEVMODE (DMBIN?)
+ XQXI_DMMEDIATYPE = 0x20000000, // from DEVMODE
+ XQXI_RESOLUTION_X = 0x20000008, // dots per inch
+ XQXI_RESOLUTION_Y = 0x20000009,
+ XQXI_RASTER_X = 0x2000000d, // dots per inch
+ XQXI_RASTER_Y = 0x2000000e,
+ XQXI_VIDEO_BPP = 0x2000000a, // video bits per pixel
+ XQXI_VIDEO_X = 0x2000000f, // video dimensions
+ XQXI_VIDEO_Y = 0x20000010,
+ XQXI_ECONOMODE = 0x20000011, // HP's "EconoMode", 0=OFF, 1=ON
+ XQXI_DMPAPER = 0x20000001,
+ XQXI_DUPLEX_PAUSE = 0x20000012, // 0,1=front side; 2-3=back side
+ XQXI_BIH = 0x40000002,
+ XQXI_END = 0x80000001,
+
+ ZJI_LAST
+} XQX_ITEM;
+
+typedef enum
+{
+ DMDUPLEX_OFF = 1,
+ DMDUPLEX_LONGEDGE = 2,
+ DMDUPLEX_SHORTEDGE = 3,
+ DMDUPLEX_MANUALLONG = 4,
+ DMDUPLEX_MANUALSHORT= 5
+} DMDUPLEX;
+
+typedef enum {
+ DMBIN_TRAY1 = 1,
+ DMBIN_MANUAL = 4,
+ DMBIN_AUTO = 7,
+} DM_BIN;
+
+typedef enum {
+ DMMEDIA_UNSPECIFIED = 0, // Unspecified
+ DMMEDIA_PLAIN = 1, // Plain paper
+ DMMEDIA_HP_MULTIPURPOSE = 301,
+ DMMEDIA_HP_OFFICE = 300,
+ DMMEDIA_HP_ALL_IN_ONE = 303,
+ DMMEDIA_HP_LASERJET = 302,
+ DMMEDIA_HP_PREMIUM_LASERJET = 304,
+ DMMEDIA_PREPRINTED = 514,
+ DMMEDIA_LETTERHEAD = 513, // Letterhead
+ DMMEDIA_TRANSPARENCY = 2, // Transparency
+ DMMEDIA_PREPUNCHED = 515,
+ DMMEDIA_LABELS = 265, // Labels
+ DMMEDIA_BOND = 260,
+ DMMEDIA_RECYCLED = 516,
+ DMMEDIA_COLOR = 512,
+ DMMEDIA_LIGHT = 258,
+ DMMEDIA_HEAVY = 262,
+ DMMEDIA_CARDSTOCK = 261,
+ DMMEDIA_ENVELOPE = 267, // Envelope
+ DMMEDIA_ROUGH = 263,
+} DMMEDIA;
+
+typedef enum {
+ DMCOLOR_MONOCHROME = 1,
+ DMCOLOR_COLOR = 2,
+} DMCOLOR;
+
+typedef enum {
+ DMORIENT_PORTRAIT = 1,
+ DMORIENT_LANDSCAPE = 2,
+} DMORIENT;
+
+typedef enum {
+ DMPAPER_LETTER = 1, // Letter, 8 1/2- by 11-inches
+ DMPAPER_LETTERSMALL = 2, // Letter Small, 8 1/2- by 11-inches
+ DMPAPER_TABLOID = 3, // Tabloid, 11- by 17-inches
+ DMPAPER_LEDGER = 4, // Ledger, 17- by 11-inches
+ DMPAPER_LEGAL = 5, // Legal, 8 1/2- by 14-inches
+ DMPAPER_STATEMENT = 6, // Statement, 5 1/2- by 8 1/2-inches
+ DMPAPER_EXECUTIVE = 7, // Executive, 7 1/4- by 10 1/2-inches
+ DMPAPER_A3 = 8, // A3 sheet, 297- by 420-millimeters
+ DMPAPER_A4 = 9, // A4 Sheet, 210- by 297-millimeters
+ DMPAPER_A4SMALL =10, // A4 small sheet, 210- by 297-millimeters
+ DMPAPER_A5 =11, // A5 sheet, 148- by 210-millimeters
+ DMPAPER_B4 =12, // B4 sheet, 250- by 354-millimeters
+ DMPAPER_B5 =13, // B5 sheet, 182- by 257-millimeter paper
+ DMPAPER_FOLIO =14, // Folio, 8 1/2- by 13-inch paper
+ DMPAPER_QUARTO =15, // Quarto, 215- by 275-millimeter paper
+ DMPAPER_10X14 =16, // 10- by 14-inch sheet
+ DMPAPER_11X17 =17, // 11- by 17-inch sheet
+ DMPAPER_NOTE =18, // Note, 8 1/2- by 11-inches
+ DMPAPER_ENV_9 =19, // #9 Envelope, 3 7/8- by 8 7/8-inches
+ DMPAPER_ENV_10 =20, // #10 Envelope, 4 1/8- by 9 1/2-inches
+ DMPAPER_ENV_11 =21, // #11 Envelope, 4 1/2- by 10 3/8-inches
+ DMPAPER_ENV_12 =22, // #12 Envelope, 4 3/4- by 11-inches
+ DMPAPER_ENV_14 =23, // #14 Envelope, 5- by 11 1/2-inches
+ DMPAPER_CSHEET =24, // C Sheet, 17- by 22-inches
+ DMPAPER_DSHEET =25, // D Sheet, 22- by 34-inches
+ DMPAPER_ESHEET =26, // E Sheet, 34- by 44-inches
+ DMPAPER_ENV_DL =27, // DL Envelope, 110- by 220-millimeters
+ DMPAPER_ENV_C5 =28, // C5 Envelope, 162- by 229-millimeters
+ DMPAPER_ENV_C3 =29, // C3 Envelope, 324- by 458-millimeters
+ DMPAPER_ENV_C4 =30, // C4 Envelope, 229- by 324-millimeters
+ DMPAPER_ENV_C6 =31, // C6 Envelope, 114- by 162-millimeters
+ DMPAPER_ENV_C65 =32, // C65 Envelope, 114- by 229-millimeters
+ DMPAPER_ENV_B4 =33, // B4 Envelope, 250- by 353-millimeters
+ DMPAPER_ENV_B5 =34, // B5 Envelope, 176- by 250-millimeters
+ DMPAPER_ENV_B6 =35, // B6 Envelope, 176- by 125-millimeters
+ DMPAPER_ENV_ITALY =36, // Italy Envelope, 110- by 230-millimeters
+ DMPAPER_ENV_MONARCH =37, // Monarch Envelope, 3 7/8- by 7 1/2-inches
+ DMPAPER_ENV_PERSONAL=38, // 6 3/4 Envelope, 3 5/8- by 6 1/2-inches
+ DMPAPER_FANFOLD_US =39, // US Std Fanfold, 14 7/8- by 11-inches
+ DMPAPER_FANFOLD_STD_GERMAN =40, // German Std Fanfold, 8 1/2 x 12 in
+ DMPAPER_FANFOLD_LGL_GERMAN =41, // German Legal Fanfold, 8 1/2 x 13 in
+
+ DMPAPER_ISO_B4 =42, // B4 (ISO) 250 x 353 mm
+ DMPAPER_JAPANESE_POSTCARD =43, // Japanese Postcard 100 x 148 mm
+ DMPAPER_9X11 =44, // 9 x 11 in
+ DMPAPER_10X11 =45, // 10 x 11 in
+ DMPAPER_15X11 =46, // 15 x 11 in
+ DMPAPER_ENV_INVITE =47, // Envelope Invite 220 x 220 mm
+ DMPAPER_RESERVED_48 =48, // RESERVED--DO NOT USE
+ DMPAPER_RESERVED_49 =49, // RESERVED--DO NOT USE
+ DMPAPER_LETTER_EXTRA =50, // Letter Extra 9 \275 x 12 in
+ DMPAPER_LEGAL_EXTRA =51, // Legal Extra 9 \275 x 15 in
+ DMPAPER_TABLOID_EXTRA =52, // Tabloid Extra 11.69 x 18 in
+ DMPAPER_A4_EXTRA =53, // A4 Extra 9.27 x 12.69 in
+ DMPAPER_LETTER_TRANSVERSE =54, // Letter Transverse 8 \275 x 11 in
+ DMPAPER_A4_TRANSVERSE =55, // A4 Transverse 210 x 297 mm
+ DMPAPER_LETTER_EXTRA_TRANSVERSE=56, // Letter Extra Transverse 9\275 x 12 in
+ DMPAPER_A_PLUS =57, // SuperA/SuperA/A4 227 x 356 mm
+ DMPAPER_B_PLUS =58, // SuperB/SuperB/A3 305 x 487 mm
+ DMPAPER_LETTER_PLUS =59, // Letter Plus 8.5 x 12.69 in
+ DMPAPER_A4_PLUS =60, // A4 Plus 210 x 330 mm
+ DMPAPER_A5_TRANSVERSE =61, // A5 Transverse 148 x 210 mm
+ DMPAPER_B5_TRANSVERSE =62, // B5 (JIS) Transverse 182 x 257 mm
+ DMPAPER_A3_EXTRA =63, // A3 Extra 322 x 445 mm
+ DMPAPER_A5_EXTRA =64, // A5 Extra 174 x 235 mm
+ DMPAPER_B5_EXTRA =65, // B5 (ISO) Extra 201 x 276 mm
+ DMPAPER_A2 =66, // A2 420 x 594 mm
+ DMPAPER_A3_TRANSVERSE =67, // A3 Transverse 297 x 420 mm
+ DMPAPER_A3_EXTRA_TRANSVERSE =68, // A3 Extra Transverse 322 x 445 mm
+} DMPAPER;
+
+typedef struct _XQX_ITEM_HEADER {
+ DWORD type; // type
+ DWORD size; // total record size following
+} XQX_ITEM_HEADER;
+
+typedef struct _XQX_ITEM_UINT32 {
+ XQX_ITEM_HEADER header;
+ DWORD value;
+} XQX_ITEM_UINT32;
+
+typedef union _SWAP_32{
+ char byte[sizeof(uint32_t)];
+ uint32_t dword;
+} SWAP_32;
+
+typedef union _SWAP_16{
+ char byte[sizeof(uint16_t)];
+ uint16_t word;
+} SWAP_16;
+
+static inline uint32_t
+be32(uint32_t dword)
+{
+ SWAP_32 swap;
+ uint32_t probe = 1;
+
+ if (((char *)&probe)[0] == 1)
+ {
+ swap.byte[3] = (( SWAP_32 )dword).byte[0];
+ swap.byte[2] = (( SWAP_32 )dword).byte[1];
+ swap.byte[1] = (( SWAP_32 )dword).byte[2];
+ swap.byte[0] = (( SWAP_32 )dword).byte[3];
+ return swap.dword;
+ }
+ else
+ return dword;
+}
+
+static inline uint16_t
+be16(uint16_t word)
+{
+ SWAP_16 swap;
+ uint16_t probe = 1;
+
+ if (((char *)&probe)[0] == 1)
+ {
+ swap.byte[1] = (( SWAP_16 )word).byte[0];
+ swap.byte[0] = (( SWAP_16 )word).byte[1];
+ return swap.word;
+ }
+ else
+ return word;
+}
diff --git a/xqxdecode.1in b/xqxdecode.1in
new file mode 100644
index 0000000..242fcde
--- /dev/null
+++ b/xqxdecode.1in
@@ -0,0 +1,280 @@
+.TH xqxdecode 1 "${MODpage}" "xqxdecode ${MODver}"
+'\"==========================================================================
+'\" STRINGS and MACROS
+'\"==========================================================================
+'\"
+'\" Define strings for special characters that nroff doesn't have
+'\"
+'\" N.B. using .if cua to test for special characters did not work.
+'\"
+.if !'\*[.T]'ps' .ds ua up
+.if '\*[.T]'ps' .ds ua \(ua
+.if !'\*[.T]'ps' .ds da down
+.if '\*[.T]'ps' .ds da \(da
+.if !'\*[.T]'ps' .ds <- left
+.if '\*[.T]'ps' .ds <- \(<-
+.if !'\*[.T]'ps' .ds -> right
+.if '\*[.T]'ps' .ds -> \(->
+'\"
+'\" bx - box a Courier string for making keycaps
+'\"
+'\" N.B. this mess is to make the line drawing come out only
+'\" if we are really generating postscript
+'\"
+.de bx
+.ie !'\*[.T]'ps' \{\
+. RB [ \\$1 ]\\$2
+.\}
+.el \{\
+. ie !r ps4html \{\
+'\" \(br\|\s-1\f(CB\\$1\fP\s+1\|\(br\l'|0\(rn'\l'|0\(ul'
+. ft CW
+. nr par*bxw \w'\\$1'+.4m
+\Z'\v'.25m'\D'l 0 -1m'\D'l \\n[par*bxw]u 0'\D'l 0 1m'\D'l -\\n[par*bxw]u 0''\
+\Z'\h'.2m'\s-1\\$1\s+1'\
+\h'\\n[par*bxw]u'\\$2
+. ft P
+. \}
+. el \{\
+. RB [ \\$1 ]\\$2
+. \}
+.\}
+..
+'\"
+'\" strings to set current color (null with old groff)
+'\"
+.if mred .ds red \m[red]
+.if mgreen .ds green \m[green]
+.if mblue .ds blue \m[blue]
+.if mblack .ds black \m[black]
+.if mblack .ds mP \mP
+'\"
+'\" fix for grotty + xterm. We call for orange, grotty outputs yellow,
+'\" but xterm displays yellow as orange. The cycle is complete.
+'\"
+.if n .defcolor orange rgb #ffff00
+'\"
+'\" color <color> - set the current color (ignores request with old groff)
+'\"
+.de color
+.if mred \m[\\$1]\c
+..
+'\"
+'\" colorword <color> <word> - colorize a word (ignored by old groff)
+'\"
+.de colorword
+.ie m\\$1 \m[\\$1]\\$2\mP\c
+.el \\$2\c
+..
+'\"
+'\" colbox <fg> <bg> <word> - colorize a word in a filled box
+'\"
+.de colbox
+.ie mred \M[\\$2]\
+\v'+.167v'\
+\D'P 0 -0.9v \w'\\$3'u 0 0 +0.9v -\w'\\$3'u 0'\
+\v'-.167v'\
+\m[\\$1]\\$3\mP\MP
+.el \\$3\c
+..
+'\"
+'\" Macros for doing pdfmarks
+'\"
+.de specialps
+\\k_\X'ps: \\$*'\h'|\\n_u'\c
+..
+'\"
+'\" pdfmark PDFMARKCODE
+'\"
+.ds pdfmarks
+.if d pdfmarks \{\
+.de pdfmark
+. specialps exec [\\$1 pdfmark
+..
+'\"
+'\" pdfdest LINKNAME
+'\"
+.de pdfdest
+.pdfmark "/Dest /\\$1 /View [/XYZ -5 PL null] /DEST"
+..
+'\"
+'\" pdfbookmark COUNT LINKNAME STRING
+'\"
+.de pdfbookmark
+. pdfmark "/View [/XYZ 44 730 1.0] /Count \\$1 /Dest /\\$2 /Title (\\$3) /OUT"
+..
+'\"
+'\" Define the SH and SS macros to save pdfmark information
+'\" in "arrays" of numbers and strings.
+'\"
+.if !r rr_n \{\
+.nr rr_n 0 1
+.am SH
+. nr rr_levels!\\n+[rr_n] 2
+. ds rr_labels!\\n[rr_n] \\$*
+. pdfdest Link\\n[rr_n]
+..
+.am SS
+. nr rr_levels!\\n+[rr_n] 3
+. ds rr_labels!\\n[rr_n] \\$*
+. pdfdest Link\\n[rr_n]
+..
+.\}
+'\"
+'\" Called at the end of the document to generate the pdfmark outline
+'\"
+.de pdf_outline
+.nr rr_levels!\\n+[rr_n] 1
+.nr rr_i 0 1
+.while \\n+[rr_i]<\\n[rr_n] \{\
+. nr rr_ip1 \\n[rr_i]+1
+. nr rr_count 0
+. if \\n[rr_levels!\\n[rr_ip1]]>\\n[rr_levels!\\n[rr_i]] \{\
+. nr rr_j \\n[rr_i] 1
+. while \\n+[rr_j]<\\n[rr_n] \{\
+. if \\n[rr_levels!\\n[rr_j]]<=\\n[rr_levels!\\n[rr_i]] \{\
+. break
+. \}
+. if \\n[rr_levels!\\n[rr_j]]==(\\n[rr_levels!\\n[rr_i]]+1) \{\
+. nr rr_count \\n[rr_count]+1
+. \}
+. \}
+. \}
+. ds hhh \\*[rr_labels!\\n[rr_i]]
+. pdfbookmark \\n[rr_count] Link\\n[rr_i] "\\*[hhh]"
+.\}
+..
+'\"
+'\" Some postscript to make pdfmarks harmless on old interpreters...
+'\"
+.specialps "def /pdfmark where {pop} {userdict /pdfmark /cleartomark load put} ifelse"
+'\"
+'\" Force display of Bookmarks in Acrobat when document is viewed.
+'\"
+.pdfmark "[/PageMode /UseOutlines /Page 1 /View [/XYZ null null null] /DOCVIEW"
+'\"
+'\" Output the document info in pdfmarks
+'\"
+.pdfmark "\
+ /Title (\*[an-title](\*[an-section])) \
+ /Subject (zjsdecode Manual Page) \
+ /Author (Rick Richardson) \
+ /Keywords (printing, ZjStream) \
+ /Creator (groff \n(.x.\n(.y.\n(.Y -man) \
+ /CreationDate (\*[an-extra1]) \
+ /ModDate (\*[an-extra1]) \
+ /DOCINFO"
+\}
+'\"
+'\" The manual page name is only 1st level mark
+'\"
+.nr rr_levels!\n+[rr_n] 1
+.ds rr_labels!\n[rr_n] \*[an-title](\*[an-section])
+.pdfdest Link\n[rr_n]
+'\"==========================================================================
+'\" MANUAL PAGE SOURCE
+'\"==========================================================================
+.SH NAME
+xqxdecode \- Decode a XQX stream into human readable form.
+.SH SYNOPSIS
+.B xqxdecode
+.RI [ options "] <" zjs-file
+.SH DESCRIPTION
+.B xqxdecode
+decodes a XQX stream into human readable form.
+.P
+An XQX stream is the printer langauge used by some HP LaserJet
+printers, such as the HP LaserJet M1005 (MFP).
+
+.SH COMMAND LINE OPTIONS
+These are the options that can appear on the command line.
+.TP
+.BI \-d\0 basename
+Basename of .pbm file for saving decompressed planes.
+.TP
+.BI \-h
+Print hex file offsets.
+.TP
+.BI \-o
+Print file offsets.
+.TP
+.BI \-D\0 level
+Set Debug level [0].
+
+.SH EXAMPLES
+Decode an XQX stream file created by foo2xqx.
+
+.nf
+.ft CW
+$ xqxdecode -h < testpage.xm
+ 0: \\033%-12345X@PJL JOB
+ 12: @PJL SET JAMRECOVERY=OFF
+ 2b: @PJL SET DENSITY=3
+ 3e: @PJL SET ECONOMODE=OFF
+ 55: @PJL SET RET=MEDIUM
+ 69: @PJL INFO STATUS
+ 7a: @PJL USTATUS DEVICE = ON
+ 93: @PJL USTATUS JOB = ON
+ a9: @PJL USTATUS PAGE = ON
+ c0: @PJL USTATUS TIMED = 30
+ 10c: @PJL SET JOBATTR="JobAttr4=20061118160242"
+ 10c: XQX_MAGIC, 0x5851582c (,XQX)
+ 110: XQX_START_DOC(1), 7 items
+ 118: XQX_0x80000000, 84 (0x54)
+ 124: XQX_0x10000005, 1 (0x1)
+ 130: XQX_0x10000001, 0 (0x0)
+ 13c: XQXI_DMDUPLEX, 0 (0x0)
+ 148: XQX_0x10000000, 0 (0x0)
+ 154: XQX_0x10000003, 1 (0x1)
+ 160: XQXI_END, 3735928559 (0xdeadbeef)
+ 16c: XQX_START_PAGE(3), 15 items [Page 1]
+ 174: XQX_0x80000000, 180 (0xb4)
+ 180: XQX_0x20000005, 1 (0x1)
+ 18c: XQXI_DMDEFAULTSOURCE, 7 (0x7)
+ 198: XQXI_DMMEDIATYPE, 1 (0x1)
+ 1a4: XQX_0x20000007, 1 (0x1)
+ 1b0: XQXI_RESOLUTION_X, 600 (0x258)
+ 1bc: XQXI_RESOLUTION_Y, 600 (0x258)
+ 1c8: XQXI_RASTER_X, 9856 (0x2680)
+ 1d4: XQXI_RASTER_Y, 6432 (0x1920)
+ 1e0: XQXI_VIDEO_BPP, 2 (0x2)
+ 1ec: XQXI_VIDEO_X, 4923 (0x133b)
+ 1f8: XQXI_VIDEO_Y, 6432 (0x1920)
+ 204: XQXI_ECONOMODE, 0 (0x0)
+ 210: XQX_0x20000001, 1 (0x1)
+ 21c: XQXI_END, 3735928559 (0xdeadbeef)
+ 228: XQX_START_PLANE(5), 4 items
+ 230: XQX_0x80000000, 64 (0x40)
+ 23c: XQX_0x40000000, 0 (0x0)
+ 248: XQXI_BIH(0x40000002)
+ DL = 0, D = 0, P = 1, - = 0, XY = 9856 x 6432
+ L0 = 128, MX = 16, MY = 0
+ Order = 3 ILEAVE SMID
+ Options = 92 LRLTWO TPDON TPBON DPON
+ 51 stripes, 0 layers, 1 planes
+
+ 264: XQXI_END, 3735928559 (0xdeadbeef)
+ 270: XQX_JBIG(7), 110 items
+ 2e6: XQX_END_PLANE(6), 0 items
+ 2ee: XQX_END_PAGE(4), 0 items
+ 2f6: XQX_END_DOC(2), 0 items
+Total size: 110 bytes
+ 0: \\033%-12345X@PJL EOJ
+ 12: \\033%-12345X
+
+.ft P
+.fi
+
+.SH FILES
+.BR /usr/bin/xqxdecode
+.SH SEE ALSO
+.BR foo2xqx-wrapper (1),
+.BR foo2xqx (1)
+.SH "AUTHOR"
+Rick Richardson <rick.richardson@comcast.net>
+.br
+${URLXQX}/
+'/"
+'/"
+'/"
+.em pdf_outline
diff --git a/xqxdecode.c b/xqxdecode.c
new file mode 100644
index 0000000..2d306c1
--- /dev/null
+++ b/xqxdecode.c
@@ -0,0 +1,424 @@
+/*
+ * $Id: xqxdecode.c,v 1.12 2006/12/07 13:33:50 rick Exp $
+ */
+
+/*b
+ * Copyright (C) 2003-2006 Rick Richardson
+ *
+ * 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.
+ *
+ * Author: Rick Richardson <rick.richardson@comcast.net>
+b*/
+
+#include <stdio.h>
+#include <stdlib.h>
+#include <stdarg.h>
+#include <string.h>
+#include <unistd.h>
+#include <errno.h>
+
+#include "xqx.h"
+#include "jbig.h"
+
+/*
+ * Global option flags
+ */
+int Debug = 0;
+char *DecFile;
+int PrintOffset = 0;
+int PrintHexOffset = 0;
+
+void
+debug(int level, char *fmt, ...)
+{
+ va_list ap;
+
+ if (Debug < level)
+ return;
+
+ va_start(ap, fmt);
+ vfprintf(stderr, fmt, ap);
+ va_end(ap);
+}
+
+int
+error(int fatal, char *fmt, ...)
+{
+ va_list ap;
+
+ fprintf(stderr, fatal ? "Error: " : "Warning: ");
+ if (errno)
+ fprintf(stderr, "%s: ", strerror(errno));
+ va_start(ap, fmt);
+ vfprintf(stderr, fmt, ap);
+ va_end(ap);
+ if (fatal > 0)
+ exit(fatal);
+ else
+ {
+ errno = 0;
+ return (fatal);
+ }
+}
+
+void
+usage(void)
+{
+ fprintf(stderr,
+"Usage:\n"
+" xqxdecode [options] < zjs-file\n"
+"\n"
+" Decode a XQX stream into human readable form.\n"
+"\n"
+" A XQX stream is the printer langauge used by some HP LaserJet\n"
+" printers, such as the HP LaserJet M1005 (MFP).\n"
+"\n"
+"\n"
+"Options:\n"
+" -d basename Basename of .pbm file for saving decompressed planes\n"
+" -o Print file offsets\n"
+" -h Print hex file offsets\n"
+" -D lvl Set Debug level [%d]\n"
+ , Debug
+ );
+
+ exit(1);
+}
+
+void
+print_bih(unsigned char bih[20])
+{
+ unsigned int xd, yd, l0;
+
+ xd = (bih[4] << 24) | (bih[5] << 16) | (bih[6] << 8) | (bih[7] << 0);
+ yd = (bih[8] << 24) | (bih[9] << 16) | (bih[10] << 8) | (bih[11] << 0);
+ l0 = (bih[12] << 24) | (bih[13] << 16) | (bih[14] << 8) | (bih[15] << 0);
+
+ printf(" DL = %d, D = %d, P = %d, - = %d, XY = %d x %d\n",
+ bih[0], bih[1], bih[2], bih[3], xd, yd);
+
+ printf(" L0 = %d, MX = %d, MY = %d\n",
+ l0, bih[16], bih[17]);
+
+ printf(" Order = %d %s%s%s%s%s\n", bih[18],
+ bih[18] & JBG_HITOLO ? " HITOLO" : "",
+ bih[18] & JBG_SEQ ? " SEQ" : "",
+ bih[18] & JBG_ILEAVE ? " ILEAVE" : "",
+ bih[18] & JBG_SMID ? " SMID" : "",
+ bih[18] & 0xf0 ? " other" : "");
+
+ printf(" Options = %d %s%s%s%s%s%s%s%s\n", bih[19],
+ bih[19] & JBG_LRLTWO ? " LRLTWO" : "",
+ bih[19] & JBG_VLENGTH ? " VLENGTH" : "",
+ bih[19] & JBG_TPDON ? " TPDON" : "",
+ bih[19] & JBG_TPBON ? " TPBON" : "",
+ bih[19] & JBG_DPON ? " DPON" : "",
+ bih[19] & JBG_DPPRIV ? " DPPRIV" : "",
+ bih[19] & JBG_DPLAST ? " DPLAST" : "",
+ bih[19] & 0x80 ? " other" : "");
+ printf(" %u stripes, %d layers, %d planes\n",
+ ((yd >> bih[1]) + ((((1UL << bih[1]) - 1) & xd) != 0) + l0 - 1) / l0,
+ bih[1] - bih[0], bih[2]);
+}
+
+void
+proff(int curOff)
+{
+ if (PrintOffset)
+ printf("%d: ", curOff);
+ else if (PrintHexOffset)
+ printf("%6x: ", curOff);
+}
+
+void
+decode(FILE *fp)
+{
+ DWORD magic;
+ XQX_HEADER hdr;
+ int c;
+ int rc;
+ int i;
+ char *codestr;
+ FILE *dfp = NULL;
+ int planeNum = 1;
+ int pageNum = 0;
+ int len;
+ int curOff = 0;
+ struct jbg_dec_state s[5];
+ unsigned char bih[20];
+ int bihlen = 0;
+ int imageCnt[5] = {0,0,0,0,0};
+ int pn = 0;
+ int incrY = 0;
+ int totSize = 0;
+
+ /*
+ * <unknown> XQX format
+ */
+ c = getc(fp);
+ if (c == EOF)
+ {
+ printf("EOF on file reading header.\n");
+ return;
+ }
+ ungetc(c, fp);
+ if (c == '\033')
+ {
+ char buf[1024];
+
+ while (fgets(buf, sizeof(buf), fp))
+ {
+ proff(curOff);
+ if (buf[0] == '\033')
+ {
+ printf("\\033");
+ fputs(buf+1, stdout);
+ }
+ else
+ fputs(buf, stdout);
+ curOff += strlen(buf);
+ if (strcmp(buf, "@PJL USTATUS TIMED = 30\n") == 0)
+ {
+ rc = fread(buf, 52, 1, fp);
+ if (rc != 1) return;
+ proff(curOff);
+ buf[51] = 0;
+ printf("%s\n", buf);
+ curOff += 43;
+ proff(curOff);
+ printf("\\033%s\n", buf+44);
+ curOff += 9;
+ break;
+ }
+ }
+ if (feof(fp))
+ return;
+ }
+
+ /*
+ * ??? XQX_MAGIC format
+ */
+ rc = fread(&magic, len = sizeof(magic), 1, fp);
+ if (rc != 1)
+ {
+ printf("Missing XQX Magic number\n");
+ return;
+ }
+
+ proff(curOff);
+ printf("XQX_MAGIC, 0x%lx (%.4s)\n", (long)magic, (char *) &magic);
+
+ if (memcmp((char *) &magic, ",XQX", 4))
+ {
+ printf(" Don't understand magic number 0x%lx\n", (long)magic);
+ return;
+ }
+
+ curOff += len;
+ for (;;)
+ {
+ proff(curOff);
+
+ rc = fread(&hdr, len = sizeof(hdr), 1, fp);
+ if (rc != 1) break;
+ curOff += len;
+
+ hdr.type = be32(hdr.type);
+ hdr.items = be32(hdr.items);
+
+ #define CODESTR(X) case X: codestr = #X;
+ switch (hdr.type)
+ {
+ CODESTR(XQX_START_DOC) break;
+ CODESTR(XQX_END_DOC) break;
+ CODESTR(XQX_START_PAGE) ++pageNum; break;
+ CODESTR(XQX_END_PAGE) break;
+ CODESTR(XQX_START_PLANE) break;
+ CODESTR(XQX_END_PLANE) break;
+ CODESTR(XQX_JBIG) break;
+ default: codestr = NULL; break;
+ }
+
+ if (codestr)
+ printf("%s(%ld), %ld items",
+ codestr, (long) hdr.type, (long) hdr.items);
+ else
+ printf("XQX_0x%lx, %ld items", (long) hdr.type, (long) hdr.items);
+
+ if (hdr.type == XQX_START_PAGE)
+ printf(" [Page %d]", pageNum);
+ printf("\n");
+
+ if (hdr.type == XQX_JBIG)
+ {
+ for (i = 0; i < hdr.items; ++i)
+ {
+ c = fgetc(fp);
+ if (DecFile)
+ {
+ size_t cnt;
+ unsigned char ch = c;
+
+ rc = JBG_EAGAIN;
+ rc = jbg_dec_in(&s[pn], &ch, 1, &cnt);
+ if (rc == JBG_EOK)
+ {
+ int h, w, len;
+ unsigned char *image;
+
+ // debug(0, "JBG_OK: %d\n", pn);
+ h = jbg_dec_getheight(&s[pn]);
+ w = jbg_dec_getwidth(&s[pn]);
+ image = jbg_dec_getimage(&s[pn], 0);
+ len = jbg_dec_getsize(&s[pn]);
+ if (image)
+ {
+ char buf[512];
+ sprintf(buf, "%s-%02d-%d.pbm",
+ DecFile, pageNum, planeNum-1);
+ dfp = fopen(buf,
+ imageCnt[planeNum] ? "a" : "w");
+ if (dfp)
+ {
+ if (imageCnt[planeNum] == 0)
+ fprintf(dfp, "P4\n%8d %8d\n", w, h);
+ imageCnt[planeNum] += incrY;
+ fwrite(image, 1, len, dfp);
+ fclose(dfp);
+ }
+ }
+ else
+ debug(0, "Missing image %dx%d!\n", h, w);
+ jbg_dec_free(&s[pn]);
+ }
+ }
+ }
+ curOff += hdr.items;
+ totSize += hdr.items;
+ }
+ else if (hdr.type == 2 && hdr.items == 0)
+ break;
+ else
+ {
+ for (i = 0; i < hdr.items; ++i)
+ {
+ XQX_ITEM_HEADER item;
+ DWORD val;
+ int j;
+
+ proff(curOff);
+ rc = fread(&item, len = sizeof(item), 1, fp);
+ if (rc != 1) break;
+ curOff += len;
+
+ item.type = be32(item.type);
+ item.size = be32(item.size);
+ switch (item.type)
+ {
+ CODESTR(XQXI_DMDUPLEX) break;
+ CODESTR(XQXI_DMDEFAULTSOURCE) break;
+ CODESTR(XQXI_DMMEDIATYPE) break;
+ CODESTR(XQXI_RESOLUTION_X) break;
+ CODESTR(XQXI_RESOLUTION_Y) break;
+ CODESTR(XQXI_RASTER_X) break;
+ CODESTR(XQXI_RASTER_Y) break;
+ CODESTR(XQXI_VIDEO_BPP) break;
+ CODESTR(XQXI_VIDEO_X) break;
+ CODESTR(XQXI_VIDEO_Y) break;
+ CODESTR(XQXI_ECONOMODE) break;
+ CODESTR(XQXI_DMPAPER) break;
+ CODESTR(XQXI_DUPLEX_PAUSE) break;
+ CODESTR(XQXI_BIH) break;
+ CODESTR(XQXI_END) break;
+ default: codestr = NULL; break;
+ }
+ if (item.size == 4)
+ {
+ rc = fread(&val, len = sizeof(val), 1, fp);
+ if (rc != 1) break;
+ val = be32(val);
+ if (codestr)
+ printf(" %s, %ld (0x%lx)",
+ codestr, (long) val, (long) val);
+ else
+ printf(" XQXI_0x%x, %ld (0x%lx)",
+ item.type, (long) val, (long) val);
+ }
+ else if (item.size == 20)
+ {
+ rc = fread(bih, bihlen = sizeof(bih), 1, fp);
+ if (rc != 1) break;
+ printf(" %s(0x%lx)\n", codestr, (long) item.type);
+ print_bih(bih);
+ if (DecFile)
+ {
+ size_t cnt;
+
+ jbg_dec_init(&s[pn]);
+ rc = jbg_dec_in(&s[pn], bih, bihlen, &cnt);
+ if (rc == JBG_EIMPL)
+ error(1, "JBIG uses unimplemented feature\n");
+ }
+ }
+ else
+ {
+ printf(" XQXI_0x%lx, %ld size,",
+ (long) item.type, (long) item.size);
+
+ for (j = 0; j < item.size; ++j)
+ {
+ c = fgetc(fp);
+ printf(" %02x" , c);
+ }
+ }
+ curOff += item.size;
+ printf("\n");
+ }
+ }
+ }
+ printf("Total size: %d bytes\n", totSize);
+}
+
+int
+main(int argc, char *argv[])
+{
+ extern int optind;
+ extern char *optarg;
+ int c;
+
+ while ( (c = getopt(argc, argv, "d:hoD:?h")) != EOF)
+ switch (c)
+ {
+ case 'd': DecFile = optarg; break;
+ case 'o': PrintOffset = 1; break;
+ case 'h': PrintHexOffset = 1; break;
+ case 'D': Debug = atoi(optarg); break;
+ default: usage(); exit(1);
+ }
+
+ argc -= optind;
+ argv += optind;
+
+ for(;;)
+ {
+ decode(stdin);
+ c = getc(stdin); ungetc(c, stdin);
+ if (feof(stdin))
+ break;
+ }
+ printf("\n");
+
+ exit(0);
+}
diff --git a/zjs.h b/zjs.h
new file mode 100644
index 0000000..8bc0b70
--- /dev/null
+++ b/zjs.h
@@ -0,0 +1,304 @@
+/*
+ * Manifest constants for the ZjStream protocol
+ *
+ * I'm told that a lot of this stuff came from a file called "zjrca.h".
+ * But a Google search does not turn up that file. I added my own
+ * improvements and missing pieces. -Rick
+ */
+
+#include <inttypes.h>
+typedef uint32_t DWORD;
+typedef uint16_t WORD;
+typedef uint8_t BYTE;
+
+typedef enum {
+ ZJT_START_DOC = 0,
+ ZJT_END_DOC = 1,
+ ZJT_START_PAGE = 2,
+ ZJT_END_PAGE = 3,
+ ZJT_JBIG_BIH = 4, // Bi-level Image Header
+ ZJT_JBIG_BID = 5, // Bi-level Image Data blocks
+ ZJT_END_JBIG = 6,
+ ZJT_SIGNATURE = 7,
+ ZJT_RAW_IMAGE = 8, // full uncompressed plane follows
+ ZJT_START_PLANE = 9,
+ ZJT_END_PLANE =10,
+
+ ZJT_2600N_PAUSE =11,
+ ZJT_2600N =12, // hplj2600n
+
+ ZJT_ZX_0x0d =0x0d,
+ ZJT_ZX_0x0e =0x0e,
+ ZJT_ZX_0x0f =0x0f
+} ZJ_TYPE;
+
+typedef struct _ZJ_HEADER {
+ DWORD size; /* total record size, includes sizeof(ZJ_HEADER) */
+ DWORD type; /* ZJ_TYPE */
+ DWORD items; /* use varies by Type, e.g. item count */
+ WORD reserved; /* later to be sumcheck or CRC */
+ WORD signature; /* 'ZZ' */
+} ZJ_HEADER;
+
+typedef enum {
+/*
+ * 0x0000-0x7FFF : Zenographics reserved
+ */
+ /* for START_DOC */
+ ZJI_PAGECOUNT = 0, // number of ZJT_START_PAGE / ZJT_END_PAGE
+ // pairs, if known
+ ZJI_DMCOLLATE = 1, // from DEVMODE
+ ZJI_DMDUPLEX = 2, // from DEVMODE
+
+ /* for START_PAGE */
+ ZJI_DMPAPER = 3, // from DEVMODE
+ ZJI_DMCOPIES = 4, // from DEVMODE
+ ZJI_DMDEFAULTSOURCE = 5, // from DEVMODE (DMBIN?)
+ ZJI_DMMEDIATYPE = 6, // from DEVMODE
+ ZJI_NBIE = 7, // number of Bi-level Image Entities,
+ // e.g. 1 for monochrome, 4 for color
+ ZJI_RESOLUTION_X = 8, // dots per inch
+ ZJI_RESOLUTION_Y = 9,
+ ZJI_OFFSET_X =10, // upper left corner
+ ZJI_OFFSET_Y =11,
+ ZJI_RASTER_X =12, // raster dimensions
+ ZJI_RASTER_Y =13,
+
+ ZJI_COLLATE =14, // asks for collated copies
+ ZJI_QUANTITY =15, // copy count
+
+ ZJI_VIDEO_BPP =16, // video bits per pixel
+ ZJI_VIDEO_X =17, // video dimensions (if different than raster)
+ ZJI_VIDEO_Y =18,
+ ZJI_INTERLACE =19, // 0 or 1
+ ZJI_PLANE =20, // Plane number, 1=C, 2=M, 3=Y, 4=K
+ ZJI_PALETTE =21, // translation table (dimensions in item type)
+
+ ZJI_ECONOMODE =23, // HP's "EconoMode", 0=OFF, 1=ON
+
+ ZJI_JBIG_BIH =0x66, // Bi-level Image Header
+ ZJI_INCRY =0x69, // Incremental Y
+
+ ZJI_ZX_0x6c =0x6c, // ZX: color order ???
+ // cmyk=04030201, rgb=0b0a09, mono=0c
+ ZJI_ZX_COLOR_OPT =0x6e, // ZX: Color Options. 1=mono, 3=rgb, 4=cmyk
+ ZJI_ZX_0x6f =0x6f, // ZX: ???
+
+ ZJI_PAD =99, // bogus item type for padding stream
+
+/*
+ * 0x8000-0x80FF : Item tags for QMS specific features.
+ */
+ ZJI_QMS_FINEMODE = 0x8000, // for 668, 671
+ ZJI_QMS_OUTBIN = 0x8001, // for 671 output bin
+
+/*
+ * 0x8100-0x81FF : Item tags for Minolta specific features.
+ */
+ /* for START_DOC */
+ ZJI_MINOLTA_USERNAME = 0x810e, // C string
+ ZJI_MINOLTA_FILENAME = 0x8115, // C string
+ // Also 8100-810F; meanings unknown
+
+ /* for START_PAGE */
+ ZJI_MINOLTA_PAGE_NUMBER = 0x8110, // Number of this page
+ // Also 8111, 8113, 8114, 8116-811D; meanings unknown
+
+ /* for END_PAGE */
+ // Also 8101, 8110; meanings unknown
+
+/*
+ * 0x8200-0x82FF : Item tags for the next OEM specific features.
+ */
+
+ ZJI_LAST
+} ZJ_ITEM;
+
+typedef enum
+{
+ DMDUPLEX_OFF = 1,
+ DMDUPLEX_LONGEDGE = 2,
+ DMDUPLEX_SHORTEDGE = 3,
+ DMDUPLEX_MANUALLONG = 4,
+ DMDUPLEX_MANUALSHORT= 5
+} DMDUPLEX;
+
+typedef enum {
+ DMBIN_UPPER = 1,
+ DMBIN_ONLYONE = 1,
+ DMBIN_LOWER = 2,
+ DMBIN_MIDDLE = 3,
+ DMBIN_MANUAL = 4,
+ DMBIN_ENVELOPE = 5,
+ DMBIN_ENVMANUAL = 6,
+ DMBIN_AUTO = 7,
+ DMBIN_TRACTOR = 8,
+ DMBIN_SMALLFMT = 9,
+ DMBIN_LARGEFMT =10,
+ DMBIN_LARGECAPACITY =11,
+ DMBIN_CASSETTE =14,
+ DMBIN_FORMSOURCE =15
+} DM_BIN;
+
+typedef enum {
+ DMMEDIA_STANDARD = 1, // Standard paper
+ DMMEDIA_TRANSPARENCY= 2, // Transparency
+ DMMEDIA_GLOSSY = 3, // Glossy paper
+ DMMEDIA_USER = 4, // Device-specific media start here
+
+ DMMEDIA_ENVELOPE = 0x101, // Envelope
+ DMMEDIA_LETTERHEAD = 0x103, // Letterhead
+ DMMEDIA_THICK_STOCK = 0x105, // Thick Stock
+ DMMEDIA_POSTCARD = 0x106, // Postcard
+ DMMEDIA_LABELS = 0x107, // Labels
+} DMMEDIA;
+
+typedef enum {
+ DMCOLOR_MONOCHROME = 1,
+ DMCOLOR_COLOR = 2,
+} DMCOLOR;
+
+typedef enum {
+ DMORIENT_PORTRAIT = 1,
+ DMORIENT_LANDSCAPE = 2,
+} DMORIENT;
+
+typedef enum {
+ DMPAPER_LETTER = 1, // Letter, 8 1/2- by 11-inches
+ DMPAPER_LETTERSMALL = 2, // Letter Small, 8 1/2- by 11-inches
+ DMPAPER_TABLOID = 3, // Tabloid, 11- by 17-inches
+ DMPAPER_LEDGER = 4, // Ledger, 17- by 11-inches
+ DMPAPER_LEGAL = 5, // Legal, 8 1/2- by 14-inches
+ DMPAPER_STATEMENT = 6, // Statement, 5 1/2- by 8 1/2-inches
+ DMPAPER_EXECUTIVE = 7, // Executive, 7 1/4- by 10 1/2-inches
+ DMPAPER_A3 = 8, // A3 sheet, 297- by 420-millimeters
+ DMPAPER_A4 = 9, // A4 Sheet, 210- by 297-millimeters
+ DMPAPER_A4SMALL =10, // A4 small sheet, 210- by 297-millimeters
+ DMPAPER_A5 =11, // A5 sheet, 148- by 210-millimeters
+ DMPAPER_B4 =12, // B4 sheet, 250- by 354-millimeters
+ DMPAPER_B5 =13, // B5 sheet, 182- by 257-millimeter paper
+ DMPAPER_FOLIO =14, // Folio, 8 1/2- by 13-inch paper
+ DMPAPER_QUARTO =15, // Quarto, 215- by 275-millimeter paper
+ DMPAPER_10X14 =16, // 10- by 14-inch sheet
+ DMPAPER_11X17 =17, // 11- by 17-inch sheet
+ DMPAPER_NOTE =18, // Note, 8 1/2- by 11-inches
+ DMPAPER_ENV_9 =19, // #9 Envelope, 3 7/8- by 8 7/8-inches
+ DMPAPER_ENV_10 =20, // #10 Envelope, 4 1/8- by 9 1/2-inches
+ DMPAPER_ENV_11 =21, // #11 Envelope, 4 1/2- by 10 3/8-inches
+ DMPAPER_ENV_12 =22, // #12 Envelope, 4 3/4- by 11-inches
+ DMPAPER_ENV_14 =23, // #14 Envelope, 5- by 11 1/2-inches
+ DMPAPER_CSHEET =24, // C Sheet, 17- by 22-inches
+ DMPAPER_DSHEET =25, // D Sheet, 22- by 34-inches
+ DMPAPER_ESHEET =26, // E Sheet, 34- by 44-inches
+ DMPAPER_ENV_DL =27, // DL Envelope, 110- by 220-millimeters
+ DMPAPER_ENV_C5 =28, // C5 Envelope, 162- by 229-millimeters
+ DMPAPER_ENV_C3 =29, // C3 Envelope, 324- by 458-millimeters
+ DMPAPER_ENV_C4 =30, // C4 Envelope, 229- by 324-millimeters
+ DMPAPER_ENV_C6 =31, // C6 Envelope, 114- by 162-millimeters
+ DMPAPER_ENV_C65 =32, // C65 Envelope, 114- by 229-millimeters
+ DMPAPER_ENV_B4 =33, // B4 Envelope, 250- by 353-millimeters
+ DMPAPER_ENV_B5 =34, // B5 Envelope, 176- by 250-millimeters
+ DMPAPER_ENV_B6 =35, // B6 Envelope, 176- by 125-millimeters
+ DMPAPER_ENV_ITALY =36, // Italy Envelope, 110- by 230-millimeters
+ DMPAPER_ENV_MONARCH =37, // Monarch Envelope, 3 7/8- by 7 1/2-inches
+ DMPAPER_ENV_PERSONAL=38, // 6 3/4 Envelope, 3 5/8- by 6 1/2-inches
+ DMPAPER_FANFOLD_US =39, // US Std Fanfold, 14 7/8- by 11-inches
+ DMPAPER_FANFOLD_STD_GERMAN =40, // German Std Fanfold, 8 1/2 x 12 in
+ DMPAPER_FANFOLD_LGL_GERMAN =41, // German Legal Fanfold, 8 1/2 x 13 in
+
+ DMPAPER_ISO_B4 =42, // B4 (ISO) 250 x 353 mm
+ DMPAPER_JAPANESE_POSTCARD =43, // Japanese Postcard 100 x 148 mm
+ DMPAPER_9X11 =44, // 9 x 11 in
+ DMPAPER_10X11 =45, // 10 x 11 in
+ DMPAPER_15X11 =46, // 15 x 11 in
+ DMPAPER_ENV_INVITE =47, // Envelope Invite 220 x 220 mm
+ DMPAPER_RESERVED_48 =48, // RESERVED--DO NOT USE
+ DMPAPER_RESERVED_49 =49, // RESERVED--DO NOT USE
+ DMPAPER_LETTER_EXTRA =50, // Letter Extra 9 \275 x 12 in
+ DMPAPER_LEGAL_EXTRA =51, // Legal Extra 9 \275 x 15 in
+ DMPAPER_TABLOID_EXTRA =52, // Tabloid Extra 11.69 x 18 in
+ DMPAPER_A4_EXTRA =53, // A4 Extra 9.27 x 12.69 in
+ DMPAPER_LETTER_TRANSVERSE =54, // Letter Transverse 8 \275 x 11 in
+ DMPAPER_A4_TRANSVERSE =55, // A4 Transverse 210 x 297 mm
+ DMPAPER_LETTER_EXTRA_TRANSVERSE=56, // Letter Extra Transverse 9\275 x 12 in
+ DMPAPER_A_PLUS =57, // SuperA/SuperA/A4 227 x 356 mm
+ DMPAPER_B_PLUS =58, // SuperB/SuperB/A3 305 x 487 mm
+ DMPAPER_LETTER_PLUS =59, // Letter Plus 8.5 x 12.69 in
+ DMPAPER_A4_PLUS =60, // A4 Plus 210 x 330 mm
+ DMPAPER_A5_TRANSVERSE =61, // A5 Transverse 148 x 210 mm
+ DMPAPER_B5_TRANSVERSE =62, // B5 (JIS) Transverse 182 x 257 mm
+ DMPAPER_A3_EXTRA =63, // A3 Extra 322 x 445 mm
+ DMPAPER_A5_EXTRA =64, // A5 Extra 174 x 235 mm
+ DMPAPER_B5_EXTRA =65, // B5 (ISO) Extra 201 x 276 mm
+ DMPAPER_A2 =66, // A2 420 x 594 mm
+ DMPAPER_A3_TRANSVERSE =67, // A3 Transverse 297 x 420 mm
+ DMPAPER_A3_EXTRA_TRANSVERSE =68, // A3 Extra Transverse 322 x 445 mm
+} DMPAPER;
+
+typedef enum {
+ ZJIT_UINT32 = 1, // unsigned integer
+ ZJIT_INT32 = 2, // signed integer
+ ZJIT_STRING = 3, // byte string, NUL-terminated, DWORD-aligned
+ ZJIT_BYTELUT= 4 // DWORD count followed by that many byte entries
+} ZJ_ITEM_TYPE;
+
+typedef struct _ZJ_ITEM_HEADER {
+ DWORD size; // total record size, includes sizeof(ZJ_ITEM_HEADER)
+ WORD item; // ZJ_ITEM
+ BYTE type; // ZJ_ITEM_TYPE
+ BYTE param; // general use
+} ZJ_ITEM_HEADER;
+
+typedef struct _ZJ_ITEM_UINT32 {
+ ZJ_ITEM_HEADER header;
+ DWORD value;
+} ZJ_ITEM_UINT32;
+
+typedef struct _ZJ_ITEM_INT32 {
+ ZJ_ITEM_HEADER header;
+ int32_t value;
+} ZJ_ITEM_INT32;
+
+typedef union _SWAP_32{
+ char byte[sizeof(uint32_t)];
+ uint32_t dword;
+} SWAP_32;
+
+typedef union _SWAP_16{
+ char byte[sizeof(uint16_t)];
+ uint16_t word;
+} SWAP_16;
+
+static inline uint32_t
+be32(uint32_t dword)
+{
+ SWAP_32 swap;
+ uint32_t probe = 1;
+
+ if (((char *)&probe)[0] == 1)
+ {
+ swap.byte[3] = (( SWAP_32 )dword).byte[0];
+ swap.byte[2] = (( SWAP_32 )dword).byte[1];
+ swap.byte[1] = (( SWAP_32 )dword).byte[2];
+ swap.byte[0] = (( SWAP_32 )dword).byte[3];
+ return swap.dword;
+ }
+ else
+ return dword;
+}
+
+static inline uint16_t
+be16(uint16_t word)
+{
+ SWAP_16 swap;
+ uint16_t probe = 1;
+
+ if (((char *)&probe)[0] == 1)
+ {
+ swap.byte[1] = (( SWAP_16 )word).byte[0];
+ swap.byte[0] = (( SWAP_16 )word).byte[1];
+ return swap.word;
+ }
+ else
+ return word;
+}
diff --git a/zjsdecode.1in b/zjsdecode.1in
new file mode 100644
index 0000000..00c0237
--- /dev/null
+++ b/zjsdecode.1in
@@ -0,0 +1,271 @@
+.TH zjsdecode 1 "${MODpage}" "zjsdecode ${MODver}"
+'\"==========================================================================
+'\" STRINGS and MACROS
+'\"==========================================================================
+'\"
+'\" Define strings for special characters that nroff doesn't have
+'\"
+'\" N.B. using .if cua to test for special characters did not work.
+'\"
+.if !'\*[.T]'ps' .ds ua up
+.if '\*[.T]'ps' .ds ua \(ua
+.if !'\*[.T]'ps' .ds da down
+.if '\*[.T]'ps' .ds da \(da
+.if !'\*[.T]'ps' .ds <- left
+.if '\*[.T]'ps' .ds <- \(<-
+.if !'\*[.T]'ps' .ds -> right
+.if '\*[.T]'ps' .ds -> \(->
+'\"
+'\" bx - box a Courier string for making keycaps
+'\"
+'\" N.B. this mess is to make the line drawing come out only
+'\" if we are really generating postscript
+'\"
+.de bx
+.ie !'\*[.T]'ps' \{\
+. RB [ \\$1 ]\\$2
+.\}
+.el \{\
+. ie !r ps4html \{\
+'\" \(br\|\s-1\f(CB\\$1\fP\s+1\|\(br\l'|0\(rn'\l'|0\(ul'
+. ft CW
+. nr par*bxw \w'\\$1'+.4m
+\Z'\v'.25m'\D'l 0 -1m'\D'l \\n[par*bxw]u 0'\D'l 0 1m'\D'l -\\n[par*bxw]u 0''\
+\Z'\h'.2m'\s-1\\$1\s+1'\
+\h'\\n[par*bxw]u'\\$2
+. ft P
+. \}
+. el \{\
+. RB [ \\$1 ]\\$2
+. \}
+.\}
+..
+'\"
+'\" strings to set current color (null with old groff)
+'\"
+.if mred .ds red \m[red]
+.if mgreen .ds green \m[green]
+.if mblue .ds blue \m[blue]
+.if mblack .ds black \m[black]
+.if mblack .ds mP \mP
+'\"
+'\" fix for grotty + xterm. We call for orange, grotty outputs yellow,
+'\" but xterm displays yellow as orange. The cycle is complete.
+'\"
+.if n .defcolor orange rgb #ffff00
+'\"
+'\" color <color> - set the current color (ignores request with old groff)
+'\"
+.de color
+.if mred \m[\\$1]\c
+..
+'\"
+'\" colorword <color> <word> - colorize a word (ignored by old groff)
+'\"
+.de colorword
+.ie m\\$1 \m[\\$1]\\$2\mP\c
+.el \\$2\c
+..
+'\"
+'\" colbox <fg> <bg> <word> - colorize a word in a filled box
+'\"
+.de colbox
+.ie mred \M[\\$2]\
+\v'+.167v'\
+\D'P 0 -0.9v \w'\\$3'u 0 0 +0.9v -\w'\\$3'u 0'\
+\v'-.167v'\
+\m[\\$1]\\$3\mP\MP
+.el \\$3\c
+..
+'\"
+'\" Macros for doing pdfmarks
+'\"
+.de specialps
+\\k_\X'ps: \\$*'\h'|\\n_u'\c
+..
+'\"
+'\" pdfmark PDFMARKCODE
+'\"
+.ds pdfmarks
+.if d pdfmarks \{\
+.de pdfmark
+. specialps exec [\\$1 pdfmark
+..
+'\"
+'\" pdfdest LINKNAME
+'\"
+.de pdfdest
+.pdfmark "/Dest /\\$1 /View [/XYZ -5 PL null] /DEST"
+..
+'\"
+'\" pdfbookmark COUNT LINKNAME STRING
+'\"
+.de pdfbookmark
+. pdfmark "/View [/XYZ 44 730 1.0] /Count \\$1 /Dest /\\$2 /Title (\\$3) /OUT"
+..
+'\"
+'\" Define the SH and SS macros to save pdfmark information
+'\" in "arrays" of numbers and strings.
+'\"
+.if !r rr_n \{\
+.nr rr_n 0 1
+.am SH
+. nr rr_levels!\\n+[rr_n] 2
+. ds rr_labels!\\n[rr_n] \\$*
+. pdfdest Link\\n[rr_n]
+..
+.am SS
+. nr rr_levels!\\n+[rr_n] 3
+. ds rr_labels!\\n[rr_n] \\$*
+. pdfdest Link\\n[rr_n]
+..
+.\}
+'\"
+'\" Called at the end of the document to generate the pdfmark outline
+'\"
+.de pdf_outline
+.nr rr_levels!\\n+[rr_n] 1
+.nr rr_i 0 1
+.while \\n+[rr_i]<\\n[rr_n] \{\
+. nr rr_ip1 \\n[rr_i]+1
+. nr rr_count 0
+. if \\n[rr_levels!\\n[rr_ip1]]>\\n[rr_levels!\\n[rr_i]] \{\
+. nr rr_j \\n[rr_i] 1
+. while \\n+[rr_j]<\\n[rr_n] \{\
+. if \\n[rr_levels!\\n[rr_j]]<=\\n[rr_levels!\\n[rr_i]] \{\
+. break
+. \}
+. if \\n[rr_levels!\\n[rr_j]]==(\\n[rr_levels!\\n[rr_i]]+1) \{\
+. nr rr_count \\n[rr_count]+1
+. \}
+. \}
+. \}
+. ds hhh \\*[rr_labels!\\n[rr_i]]
+. pdfbookmark \\n[rr_count] Link\\n[rr_i] "\\*[hhh]"
+.\}
+..
+'\"
+'\" Some postscript to make pdfmarks harmless on old interpreters...
+'\"
+.specialps "def /pdfmark where {pop} {userdict /pdfmark /cleartomark load put} ifelse"
+'\"
+'\" Force display of Bookmarks in Acrobat when document is viewed.
+'\"
+.pdfmark "[/PageMode /UseOutlines /Page 1 /View [/XYZ null null null] /DOCVIEW"
+'\"
+'\" Output the document info in pdfmarks
+'\"
+.pdfmark "\
+ /Title (\*[an-title](\*[an-section])) \
+ /Subject (zjsdecode Manual Page) \
+ /Author (Rick Richardson) \
+ /Keywords (printing, ZjStream) \
+ /Creator (groff \n(.x.\n(.y.\n(.Y -man) \
+ /CreationDate (\*[an-extra1]) \
+ /ModDate (\*[an-extra1]) \
+ /DOCINFO"
+\}
+'\"
+'\" The manual page name is only 1st level mark
+'\"
+.nr rr_levels!\n+[rr_n] 1
+.ds rr_labels!\n[rr_n] \*[an-title](\*[an-section])
+.pdfdest Link\n[rr_n]
+'\"==========================================================================
+'\" MANUAL PAGE SOURCE
+'\"==========================================================================
+.SH NAME
+zjsdecode \- Decode a ZjStream into human readable form.
+.SH SYNOPSIS
+.B zjsdecode
+.RI [ options "] <" zjs-file
+.SH DESCRIPTION
+.B zjsdecode
+decodes a ZjStream into human readable form.
+.P
+A ZjStream is the printer langauge used by some Minolta/QMS and
+HP printers, such as the 2300DL and LJ-1000.
+.P
+More information on Zenographics ZjStream can be found at:
+.P
+.RS
+http://ddk.zeno.com
+.RE
+
+.SH COMMAND LINE OPTIONS
+These are the options that can appear on the command line.
+.TP
+.BI \-d\0 basename
+Basename of .pbm file for saving decompressed planes.
+.TP
+.BI \-r\0 basename
+Basename of .jbg file for saving raw planes
+.TP
+.BI \-h
+Print hex file offsets.
+.TP
+.BI \-o
+Print file offsets.
+.TP
+.BI \-D\0 level
+Set Debug level [0].
+
+.SH EXAMPLES
+Decode an ZjStream file created by foo2zjs.
+
+.nf
+.ft CW
+$ zjsdecode < testpage.zm
+ZJT_START_DOC, 3 items
+ ZJI_PAGECOUNT, 0 (0x0)
+ ZJI_DMDUPLEX, 1 (0x1)
+ ZJI_QUANTITY, 1 (0x1)
+ZJT_START_PAGE, 17 items
+ ZJI_0x17, 0 (0x0)
+ ZJI_0x16, 1 (0x1)
+ ZJI_VIDEO_X, 10200 (0x27d8)
+ ZJI_VIDEO_Y, 6600 (0x19c8)
+ ZJI_VIDEO_BPP, 1 (0x1)
+ ZJI_RASTER_X, 10200 (0x27d8)
+ ZJI_RASTER_Y, 6600 (0x19c8)
+ ZJI_OFFSET_X, 0 (0x0)
+ ZJI_OFFSET_Y, 0 (0x0)
+ ZJI_NBIE, 1 (0x1)
+ ZJI_RESOLUTION_X, 1200 (0x4b0)
+ ZJI_RESOLUTION_Y, 600 (0x258)
+ ZJI_DMDEFAULTSOURCE, 7 (0x7)
+ ZJI_DMCOPIES, 1 (0x1)
+ ZJI_DMPAPER, 1 (0x1)
+ ZJI_DMMEDIATYPE, 1 (0x1)
+ ZJI_MINOLTA_PAGE_NUMBER, 1 (0x1)
+ZJT_JBIG_BIH, 0 items
+ Data: 20 bytes
+ DL = 0, D = 0, P = 1, - = 0, XY = 10200 x 6600
+ L0 = 128, MX = 16, MY = 0
+ Order = 3 ILEAVE SMID
+ Options = 92 LRLTWO TPDON TPBON DPON
+ 52 stripes, 0 layers, 1 planes
+ZJT_JBIG_BID, 0 items
+ Data: 65536 bytes
+ZJT_JBIG_BID, 0 items
+ Data: 29120 bytes
+ZJT_END_JBIG, 0 items
+ZJT_END_PAGE, 0 items
+ZJT_END_DOC, 0 items
+.ft P
+.fi
+
+.SH FILES
+.BR /usr/bin/zjsdecode
+.SH SEE ALSO
+.BR foo2zjs-wrapper (1),
+.BR foo2zjs (1),
+.BR jbg2pbm (1)
+.SH "AUTHOR"
+Rick Richardson <rick.richardson@comcast.net>
+.br
+${URLZJS}/
+'/"
+'/"
+'/"
+.em pdf_outline
diff --git a/zjsdecode.c b/zjsdecode.c
new file mode 100644
index 0000000..39055f1
--- /dev/null
+++ b/zjsdecode.c
@@ -0,0 +1,661 @@
+/*
+ * $Id: zjsdecode.c,v 1.53 2006/12/07 13:33:51 rick Exp $
+ */
+
+/*b
+ * Copyright (C) 2003-2006 Rick Richardson
+ *
+ * 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.
+ *
+ * Author: Rick Richardson <rick.richardson@comcast.net>
+b*/
+
+#include <stdio.h>
+#include <stdlib.h>
+#include <stdarg.h>
+#include <string.h>
+#include <unistd.h>
+#include <errno.h>
+
+#include "zjs.h"
+#include "jbig.h"
+
+/*
+ * Global option flags
+ */
+int Debug = 0;
+char *RawFile;
+char *DecFile;
+int PrintOffset = 0;
+int PrintHexOffset = 0;
+
+void
+debug(int level, char *fmt, ...)
+{
+ va_list ap;
+
+ if (Debug < level)
+ return;
+
+ va_start(ap, fmt);
+ vfprintf(stderr, fmt, ap);
+ va_end(ap);
+}
+
+int
+error(int fatal, char *fmt, ...)
+{
+ va_list ap;
+
+ fprintf(stderr, fatal ? "Error: " : "Warning: ");
+ if (errno)
+ fprintf(stderr, "%s: ", strerror(errno));
+ va_start(ap, fmt);
+ vfprintf(stderr, fmt, ap);
+ va_end(ap);
+ if (fatal > 0)
+ exit(fatal);
+ else
+ {
+ errno = 0;
+ return (fatal);
+ }
+}
+
+void
+usage(void)
+{
+ fprintf(stderr,
+"Usage:\n"
+" zjsdecode [options] < zjs-file\n"
+"\n"
+" Decode a ZjStream into human readable form.\n"
+"\n"
+" A ZjStream is the printer langauge used by some Minolta/QMS and\n"
+" HP printers, such as the 2300DL and LJ-1000.\n"
+"\n"
+" More information on Zenographics ZjStream can be found at:\n"
+"\n"
+" http://ddk.zeno.com\n"
+"\n"
+"Options:\n"
+" -d basename Basename of .pbm file for saving decompressed planes\n"
+" -r basename Basename of .jbg file for saving raw planes\n"
+" -o Print file offsets\n"
+" -h Print hex file offsets\n"
+" -D lvl Set Debug level [%d]\n"
+ , Debug
+ );
+
+ exit(1);
+}
+
+void
+print_bih(unsigned char bih[20])
+{
+ unsigned int xd, yd, l0;
+
+ xd = (bih[4] << 24) | (bih[5] << 16) | (bih[6] << 8) | (bih[7] << 0);
+ yd = (bih[8] << 24) | (bih[9] << 16) | (bih[10] << 8) | (bih[11] << 0);
+ l0 = (bih[12] << 24) | (bih[13] << 16) | (bih[14] << 8) | (bih[15] << 0);
+
+ printf(" DL = %d, D = %d, P = %d, - = %d, XY = %d x %d\n",
+ bih[0], bih[1], bih[2], bih[3], xd, yd);
+
+ printf(" L0 = %d, MX = %d, MY = %d\n",
+ l0, bih[16], bih[17]);
+
+ printf(" Order = %d %s%s%s%s%s\n", bih[18],
+ bih[18] & JBG_HITOLO ? " HITOLO" : "",
+ bih[18] & JBG_SEQ ? " SEQ" : "",
+ bih[18] & JBG_ILEAVE ? " ILEAVE" : "",
+ bih[18] & JBG_SMID ? " SMID" : "",
+ bih[18] & 0xf0 ? " other" : "");
+
+ printf(" Options = %d %s%s%s%s%s%s%s%s\n", bih[19],
+ bih[19] & JBG_LRLTWO ? " LRLTWO" : "",
+ bih[19] & JBG_VLENGTH ? " VLENGTH" : "",
+ bih[19] & JBG_TPDON ? " TPDON" : "",
+ bih[19] & JBG_TPBON ? " TPBON" : "",
+ bih[19] & JBG_DPON ? " DPON" : "",
+ bih[19] & JBG_DPPRIV ? " DPPRIV" : "",
+ bih[19] & JBG_DPLAST ? " DPLAST" : "",
+ bih[19] & 0x80 ? " other" : "");
+ printf(" %u stripes, %d layers, %d planes\n",
+ ((yd >> bih[1]) + ((((1UL << bih[1]) - 1) & xd) != 0) + l0 - 1) / l0,
+ bih[1] - bih[0], bih[2]);
+}
+
+void
+decode(FILE *fp)
+{
+ DWORD magic;
+ ZJ_HEADER hdr;
+ int c;
+ int rc;
+ int size;
+ int items;
+ char *codestr;
+ FILE *dfp = NULL;
+ FILE *rfp = NULL;
+ int planeNum = 1;
+ int pageNum = 0;
+ int padding;
+ int len;
+ int curOff = 0;
+ struct jbg_dec_state s[5];
+ unsigned char bih[20];
+ int bihlen = 0;
+ int imageCnt[5] = {0,0,0,0,0};
+ int pn = 0;
+ int incrY = 0;
+ int totSize = 0;
+
+ /*
+ * Zenographics ZX format
+ */
+ c = getc(fp);
+ if (c == EOF)
+ {
+ printf("EOF on file reading header.\n");
+ return;
+ }
+ ungetc(c, fp);
+ if (c == '\033')
+ {
+ char buf[1024];
+
+ while (fgets(buf, sizeof(buf), fp))
+ {
+ if (PrintOffset)
+ printf("%d: ", curOff);
+ else if (PrintHexOffset)
+ printf("%6x: ", curOff);
+ fputs(buf, stdout);
+ curOff += strlen(buf);
+ if (strcmp(buf, "@PJL ENTER LANGUAGE = ZJS\r\n") == 0)
+ break;
+ if (strcmp(buf, "@PJL USTATUS TIMED = 30\n") == 0)
+ {
+ rc = fread(buf, 52, 1, fp);
+ break;
+ }
+ }
+ if (feof(fp))
+ return;
+ }
+
+ /*
+ * Zenographics ZJS_MAGIC format
+ */
+ rc = fread(&magic, len = sizeof(magic), 1, fp);
+ if (rc != 1)
+ {
+ printf("Missing ZJS Magic number\n");
+ return;
+ }
+ if (PrintOffset)
+ printf("%d: ", curOff);
+ else if (PrintHexOffset)
+ printf("%6x: ", curOff);
+ printf("ZJS_MAGIC, 0x%lx (%.4s)\n", (long)magic, (char *) &magic);
+
+ if (memcmp((char *) &magic, "JZJZ", 4)
+ && memcmp((char *) &magic, ",XQX", 4))
+ {
+ printf(" Don't understand magic number 0x%lx\n", (long)magic);
+ return;
+ }
+
+ curOff += len;
+ for (;;)
+ {
+ if (PrintOffset)
+ printf("%d: ", curOff);
+ else if (PrintHexOffset)
+ printf("%6x: ", curOff);
+
+ rc = fread(&hdr, len = sizeof(hdr), 1, fp);
+ if (rc != 1) break;
+ curOff += len;
+
+ hdr.type = be32(hdr.type);
+ hdr.size = be32(hdr.size);
+ hdr.items = be32(hdr.items);
+ hdr.reserved = be16(hdr.reserved);
+ hdr.signature = be16(hdr.signature);
+
+ #define CODESTR(X) case X: codestr = #X;
+ switch (hdr.type)
+ {
+ CODESTR(ZJT_START_DOC) break;
+ CODESTR(ZJT_END_DOC) break;
+ CODESTR(ZJT_START_PAGE) ++pageNum;
+ memset(imageCnt, 0, sizeof(imageCnt));
+ totSize = 0;
+ break;
+ CODESTR(ZJT_END_PAGE) planeNum = 1;
+ break;
+ CODESTR(ZJT_JBIG_BIH) break;
+ CODESTR(ZJT_JBIG_BID) break;
+ CODESTR(ZJT_END_JBIG) break;
+ CODESTR(ZJT_SIGNATURE) break;
+ CODESTR(ZJT_RAW_IMAGE) break;
+ CODESTR(ZJT_START_PLANE) break;
+ CODESTR(ZJT_END_PLANE) break;
+ CODESTR(ZJT_2600N_PAUSE) break;
+ CODESTR(ZJT_2600N) break;
+
+ CODESTR(ZJT_ZX_0x0d) break;
+ CODESTR(ZJT_ZX_0x0e) break;
+ CODESTR(ZJT_ZX_0x0f) break;
+ default: codestr = NULL; break;
+ }
+
+ if (codestr)
+ printf("%s, %ld items", codestr, (long) hdr.items);
+ else
+ printf("ZJT_0x%lx, %ld items", (long) hdr.type, (long) hdr.items);
+ if (hdr.size & 3)
+ {
+ printf(" (unaligned size)");
+ padding = 4 - (hdr.size & 3);
+ }
+ else
+ padding = 0;
+ if (hdr.reserved)
+ printf(" (reserved=0x%x)", hdr.reserved);
+ if (hdr.signature != 0x5a5a)
+ printf(" (funny siggy 0x%x)", hdr.signature);
+ if (hdr.type == ZJT_START_PAGE)
+ printf(" [Page %d]", pageNum);
+ printf("\n");
+ fflush(stdout);
+
+ items = hdr.items;
+ size = hdr.size - sizeof(hdr);
+
+ if (hdr.type == ZJT_ZX_0x0e)
+ {
+ int i, c;
+
+ if (PrintOffset)
+ printf(" %d:", curOff);
+ else if (PrintHexOffset)
+ printf(" %6x:", curOff);
+ printf(" Data: %d bytes (0x%x)\n", size, size);
+ fflush(stdout);
+ totSize += size;
+
+ printf("%s0:\t", (PrintOffset||PrintHexOffset) ? "\t\t" : "\t");
+ for (i = 0; size--; ++i)
+ {
+ c = fgetc(fp);
+ ++curOff;
+ if (i < 16)
+ printf("%02x ", c);
+ else if (size < 16)
+ printf("%02x ", c);
+ if (i == 16)
+ printf(" ...\n%s",
+ (PrintOffset||PrintHexOffset) ? "\t\t" : "\t");
+ if (size == 16)
+ printf("%x:\t", i);
+ }
+ printf("\n");
+ continue;
+ }
+
+ while (items--)
+ {
+ ZJ_ITEM_HEADER ihdr;
+ int isize;
+ DWORD val;
+ char buf[512];
+ int i, c;
+
+ if (PrintOffset)
+ printf(" %d: ", curOff);
+ else if (PrintHexOffset)
+ printf(" %6x: ", curOff);
+
+ size -= sizeof(ihdr);
+
+ rc = fread(&ihdr, len = sizeof(ihdr), 1, fp);
+ if (rc != 1) break;
+ curOff += len;
+
+ ihdr.size = be32(ihdr.size);
+ ihdr.item = be16(ihdr.item);
+
+ isize = ihdr.size - sizeof(ihdr);
+ size -= isize;
+
+ switch (ihdr.item)
+ {
+ CODESTR(ZJI_PAGECOUNT) break;
+ CODESTR(ZJI_DMCOLLATE) break;
+ CODESTR(ZJI_DMDUPLEX) break;
+ CODESTR(ZJI_DMPAPER) break;
+ CODESTR(ZJI_DMCOPIES) break;
+ CODESTR(ZJI_DMDEFAULTSOURCE) break;
+ CODESTR(ZJI_DMMEDIATYPE) break;
+ CODESTR(ZJI_NBIE) break;
+ CODESTR(ZJI_RESOLUTION_X) break;
+ CODESTR(ZJI_RESOLUTION_Y) break;
+ CODESTR(ZJI_OFFSET_X) break;
+ CODESTR(ZJI_OFFSET_Y) break;
+ CODESTR(ZJI_RASTER_X) break;
+ CODESTR(ZJI_RASTER_Y) break;
+ CODESTR(ZJI_COLLATE) break;
+ CODESTR(ZJI_QUANTITY) break;
+ CODESTR(ZJI_VIDEO_BPP) break;
+ CODESTR(ZJI_VIDEO_X) break;
+ CODESTR(ZJI_VIDEO_Y) break;
+ CODESTR(ZJI_INTERLACE) break;
+ CODESTR(ZJI_PLANE) break;
+ CODESTR(ZJI_PALETTE) break;
+ CODESTR(ZJI_PAD) break;
+ CODESTR(ZJI_QMS_FINEMODE) break;
+ CODESTR(ZJI_QMS_OUTBIN) break;
+ CODESTR(ZJI_MINOLTA_PAGE_NUMBER) break;
+ CODESTR(ZJI_MINOLTA_FILENAME) break;
+ CODESTR(ZJI_MINOLTA_USERNAME) break;
+ CODESTR(ZJI_INCRY) break;
+ CODESTR(ZJI_JBIG_BIH) break;
+ CODESTR(ZJI_ECONOMODE) break;
+
+ // Zenographics ZJ format
+ CODESTR(ZJI_ZX_0x6c) break;
+ CODESTR(ZJI_ZX_COLOR_OPT) break;
+ CODESTR(ZJI_ZX_0x6f) break;
+ default: codestr = NULL; break;
+ }
+
+ switch (ihdr.type)
+ {
+ case ZJIT_UINT32:
+ case ZJIT_INT32:
+ fread(&val, len = sizeof(val), 1, fp);
+ curOff += len;
+ val = be32(val);
+ isize -= 4;
+ if (codestr)
+ printf(" %s, %ld (0x%lx)",
+ codestr, (long) val, (long) val);
+ else
+ printf(" ZJI_0x%x, %ld (0x%lx)",
+ ihdr.item, (long) val, (long) val);
+ if (ihdr.item == ZJI_PLANE)
+ {
+ switch (planeNum = val)
+ {
+ case 0: case 4: printf(" [black]"); break;
+ case 1: printf(" [cyan]"); break;
+ case 2: printf(" [yellow]"); break;
+ case 3: printf(" [magenta]"); break;
+ }
+ }
+ else if (ihdr.item == ZJI_INCRY)
+ incrY = val;
+ else if (ihdr.item == ZJI_ZX_COLOR_OPT)
+ {
+ switch (val)
+ {
+ case 1: printf(" [mono]"); break;
+ case 3: printf(" [rgb]"); break;
+ case 4: printf(" [cmyk]"); break;
+ }
+ }
+ break;
+ case ZJIT_STRING:
+ for (i = 0; i < sizeof(buf) - 1; )
+ {
+ c = fgetc(fp);
+ if (c == EOF) break;
+ ++curOff;
+ buf[i++] = c;
+ --isize;
+ if (isize == 0 || c == 0) break;
+ }
+ buf[i] = 0;
+ if (codestr)
+ printf(" %s, '%s'", codestr, buf);
+ else
+ printf(" ZJI_0x%x, '%s'", ihdr.item, buf);
+ break;
+ default:
+ case ZJIT_BYTELUT:
+ fread(&val, len = sizeof(val), 1, fp);
+ curOff += len;
+ val = be32(val);
+ isize -= 4;
+ if (codestr)
+ printf(" %s, BYTELUT (len=%d)", codestr, val);
+ else
+ printf(" ZJI_0x%x, BYTELUT (len=%d)", ihdr.item, val);
+ if (ihdr.item == ZJI_JBIG_BIH && val == 20)
+ {
+ bihlen = fread(bih, 1, len = sizeof(bih), stdin);
+ if (bihlen <= 0)
+ isize = 0;
+ else
+ {
+ isize -= bihlen;
+ curOff += len;
+ }
+ if (bihlen == 20)
+ {
+ printf("\n");
+ print_bih(bih);
+ }
+ }
+ break;
+ }
+
+ if (ihdr.param != 0)
+ printf(" (reserved=0x%x)", ihdr.param);
+ printf("\n");
+ fflush(stdout);
+
+ while (isize-- > 0)
+ {
+ fgetc(fp);
+ ++curOff;
+ }
+
+ if (size <= 0 && items)
+ {
+ printf(" #items is wrong!\n");
+ break;
+ }
+ }
+
+ if (size)
+ {
+ if (PrintOffset)
+ printf(" %d:", curOff);
+ else if (PrintHexOffset)
+ printf(" %6x:", curOff);
+ printf(" Data: %d bytes\n", size);
+ fflush(stdout);
+ totSize += size;
+
+ if (hdr.type == ZJT_JBIG_BIH)
+ {
+ bihlen = fread(bih, 1, len = sizeof(bih), stdin);
+ if (bihlen <= 0)
+ size = 0;
+ else
+ {
+ size -= bihlen;
+ curOff += len;
+ }
+ if (bihlen == 20)
+ print_bih(bih);
+ }
+
+ if (hdr.type == ZJT_2600N && hdr.items < 6)
+ {
+ pn = planeNum;
+ jbg_dec_init(&s[pn]);
+ rc = jbg_dec_in(&s[pn], bih, 20, NULL);
+ if (rc == JBG_EIMPL)
+ error(1, "JBIG uses unimplemented feature\n");
+ }
+
+ if ( (RawFile || DecFile) &&
+ (hdr.type == ZJT_JBIG_BIH || hdr.type == ZJT_JBIG_BID
+ || hdr.type == ZJT_2600N) )
+ {
+ if (hdr.type == ZJT_JBIG_BIH)
+ {
+ if (RawFile)
+ {
+ char buf[512];
+ sprintf(buf, "%s-%02d-%d.jbg",
+ RawFile, pageNum, planeNum);
+ rfp = fopen(buf, "w");
+ }
+ ++planeNum;
+ if (rfp)
+ fwrite(bih, bihlen, 1, rfp);
+ if (DecFile)
+ {
+ size_t cnt;
+
+ jbg_dec_init(&s[pn]);
+ rc = jbg_dec_in(&s[pn], bih, bihlen, &cnt);
+ if (rc == JBG_EIMPL)
+ error(1, "JBIG uses unimplemented feature\n");
+ }
+ }
+ while (size--)
+ {
+ int c;
+ c = fgetc(fp);
+ ++curOff;
+ if (rfp)
+ fputc(c, rfp);
+ if (DecFile)
+ {
+ size_t cnt;
+ unsigned char ch = c;
+
+ rc = JBG_EAGAIN;
+ rc = jbg_dec_in(&s[pn], &ch, 1, &cnt);
+ if (rc == JBG_EOK)
+ {
+ int h, w, len;
+ unsigned char *image;
+
+ // debug(0, "JBG_OK: %d\n", pn);
+ h = jbg_dec_getheight(&s[pn]);
+ w = jbg_dec_getwidth(&s[pn]);
+ image = jbg_dec_getimage(&s[pn], 0);
+ len = jbg_dec_getsize(&s[pn]);
+ if (image)
+ {
+ char buf[512];
+ sprintf(buf, "%s-%02d-%d.pbm",
+ DecFile, pageNum, planeNum-1);
+ dfp = fopen(buf,
+ imageCnt[planeNum] ? "a" : "w");
+ if (dfp)
+ {
+ if (imageCnt[planeNum] == 0)
+ fprintf(dfp, "P4\n%8d %8d\n", w, h);
+ imageCnt[planeNum] += incrY;
+ fwrite(image, 1, len, dfp);
+ fclose(dfp);
+ }
+ }
+ else
+ debug(0, "Missing image %dx%d!\n", h, w);
+ jbg_dec_free(&s[pn]);
+ }
+ }
+ }
+ if (hdr.type == ZJT_2600N && hdr.items == 3)
+ {
+ char buf[512];
+ sprintf(buf, "%s-%02d-%d.pbm",
+ DecFile, pageNum, planeNum-1);
+ dfp = fopen(buf, "r+");
+ fseek(dfp, 12, 0);
+ fprintf(dfp, "%8d\n", imageCnt[planeNum]);
+ fclose(dfp);
+ }
+ }
+ else
+ {
+ while (size--)
+ {
+ fgetc(fp);
+ ++curOff;
+ }
+ if (rfp)
+ {
+ fclose(rfp);
+ rfp = NULL;
+ }
+ }
+ }
+
+ while (padding--)
+ {
+ fgetc(fp);
+ ++curOff;
+ }
+
+ if (hdr.type == ZJT_END_DOC)
+ break;
+ }
+ if (rfp)
+ fclose(rfp);
+ printf("Total size: %d bytes\n", totSize);
+}
+
+int
+main(int argc, char *argv[])
+{
+ extern int optind;
+ extern char *optarg;
+ int c;
+
+ while ( (c = getopt(argc, argv, "d:hor:D:?h")) != EOF)
+ switch (c)
+ {
+ case 'd': DecFile = optarg; break;
+ case 'r': RawFile = optarg; break;
+ case 'o': PrintOffset = 1; break;
+ case 'h': PrintHexOffset = 1; break;
+ case 'D': Debug = atoi(optarg); break;
+ default: usage(); exit(1);
+ }
+
+ argc -= optind;
+ argv += optind;
+
+ for(;;)
+ {
+ decode(stdin);
+ c = getc(stdin); ungetc(c, stdin);
+ if (feof(stdin))
+ break;
+ }
+
+ exit(0);
+}