diff --git a/3rdparty/3rdparty.pro b/3rdparty/3rdparty.pro
index 7630102..75d28ff 100644
--- a/3rdparty/3rdparty.pro
+++ b/3rdparty/3rdparty.pro
@@ -1,6 +1,5 @@
-ZINT_PATH = $$PWD/zint-2.4.4/
-ZINT_VERSION = 2.4.4
-INCLUDEPATH += $${ZINT_PATH}/backend $${ZINT_PATH}/backend_qt4
-DEPENDPATH += $${ZINT_PATH}/backend $${ZINT_PATH}/backend_qt4
-include($${ZINT_PATH}/backend_qt4/Zint.pro)
-
+ZINT_PATH = $$PWD/zint-2.6.1/
+ZINT_VERSION = 2.6.1
+INCLUDEPATH += $${ZINT_PATH}/backend $${ZINT_PATH}/backend_qt
+DEPENDPATH += $${ZINT_PATH}/backend $${ZINT_PATH}/backend_qt
+include($${ZINT_PATH}/backend_qt/backend_qt.pro)
diff --git a/3rdparty/zint-2.6.1/COPYING b/3rdparty/zint-2.6.1/COPYING
new file mode 100644
index 0000000..94a9ed0
--- /dev/null
+++ b/3rdparty/zint-2.6.1/COPYING
@@ -0,0 +1,674 @@
+ GNU GENERAL PUBLIC LICENSE
+ Version 3, 29 June 2007
+
+ Copyright (C) 2007 Free Software Foundation, Inc.
+ Everyone is permitted to copy and distribute verbatim copies
+ of this license document, but changing it is not allowed.
+
+ Preamble
+
+ The GNU General Public License is a free, copyleft license for
+software and other kinds of works.
+
+ The licenses for most software and other practical works are designed
+to take away your freedom to share and change the works. By contrast,
+the GNU General Public License is intended to guarantee your freedom to
+share and change all versions of a program--to make sure it remains free
+software for all its users. We, the Free Software Foundation, use the
+GNU General Public License for most of our software; it applies also to
+any other work released this way by its authors. You can apply it to
+your programs, too.
+
+ When we speak of free software, we are referring to freedom, not
+price. Our General Public Licenses are designed to make sure that you
+have the freedom to distribute copies of free software (and charge for
+them if you wish), that you receive source code or can get it if you
+want it, that you can change the software or use pieces of it in new
+free programs, and that you know you can do these things.
+
+ To protect your rights, we need to prevent others from denying you
+these rights or asking you to surrender the rights. Therefore, you have
+certain responsibilities if you distribute copies of the software, or if
+you modify it: responsibilities to respect the freedom of others.
+
+ For example, if you distribute copies of such a program, whether
+gratis or for a fee, you must pass on to the recipients the same
+freedoms that you received. You must make sure that they, too, receive
+or can get the source code. And you must show them these terms so they
+know their rights.
+
+ Developers that use the GNU GPL protect your rights with two steps:
+(1) assert copyright on the software, and (2) offer you this License
+giving you legal permission to copy, distribute and/or modify it.
+
+ For the developers' and authors' protection, the GPL clearly explains
+that there is no warranty for this free software. For both users' and
+authors' sake, the GPL requires that modified versions be marked as
+changed, so that their problems will not be attributed erroneously to
+authors of previous versions.
+
+ Some devices are designed to deny users access to install or run
+modified versions of the software inside them, although the manufacturer
+can do so. This is fundamentally incompatible with the aim of
+protecting users' freedom to change the software. The systematic
+pattern of such abuse occurs in the area of products for individuals to
+use, which is precisely where it is most unacceptable. Therefore, we
+have designed this version of the GPL to prohibit the practice for those
+products. If such problems arise substantially in other domains, we
+stand ready to extend this provision to those domains in future versions
+of the GPL, as needed to protect the freedom of users.
+
+ Finally, every program is threatened constantly by software patents.
+States should not allow patents to restrict development and use of
+software on general-purpose computers, but in those that do, we wish to
+avoid the special danger that patents applied to a free program could
+make it effectively proprietary. To prevent this, the GPL assures that
+patents cannot be used to render the program non-free.
+
+ The precise terms and conditions for copying, distribution and
+modification follow.
+
+ TERMS AND CONDITIONS
+
+ 0. Definitions.
+
+ "This License" refers to version 3 of the GNU General Public License.
+
+ "Copyright" also means copyright-like laws that apply to other kinds of
+works, such as semiconductor masks.
+
+ "The Program" refers to any copyrightable work licensed under this
+License. Each licensee is addressed as "you". "Licensees" and
+"recipients" may be individuals or organizations.
+
+ To "modify" a work means to copy from or adapt all or part of the work
+in a fashion requiring copyright permission, other than the making of an
+exact copy. The resulting work is called a "modified version" of the
+earlier work or a work "based on" the earlier work.
+
+ A "covered work" means either the unmodified Program or a work based
+on the Program.
+
+ To "propagate" a work means to do anything with it that, without
+permission, would make you directly or secondarily liable for
+infringement under applicable copyright law, except executing it on a
+computer or modifying a private copy. Propagation includes copying,
+distribution (with or without modification), making available to the
+public, and in some countries other activities as well.
+
+ To "convey" a work means any kind of propagation that enables other
+parties to make or receive copies. Mere interaction with a user through
+a computer network, with no transfer of a copy, is not conveying.
+
+ An interactive user interface displays "Appropriate Legal Notices"
+to the extent that it includes a convenient and prominently visible
+feature that (1) displays an appropriate copyright notice, and (2)
+tells the user that there is no warranty for the work (except to the
+extent that warranties are provided), that licensees may convey the
+work under this License, and how to view a copy of this License. If
+the interface presents a list of user commands or options, such as a
+menu, a prominent item in the list meets this criterion.
+
+ 1. Source Code.
+
+ The "source code" for a work means the preferred form of the work
+for making modifications to it. "Object code" means any non-source
+form of a work.
+
+ A "Standard Interface" means an interface that either is an official
+standard defined by a recognized standards body, or, in the case of
+interfaces specified for a particular programming language, one that
+is widely used among developers working in that language.
+
+ The "System Libraries" of an executable work include anything, other
+than the work as a whole, that (a) is included in the normal form of
+packaging a Major Component, but which is not part of that Major
+Component, and (b) serves only to enable use of the work with that
+Major Component, or to implement a Standard Interface for which an
+implementation is available to the public in source code form. A
+"Major Component", in this context, means a major essential component
+(kernel, window system, and so on) of the specific operating system
+(if any) on which the executable work runs, or a compiler used to
+produce the work, or an object code interpreter used to run it.
+
+ The "Corresponding Source" for a work in object code form means all
+the source code needed to generate, install, and (for an executable
+work) run the object code and to modify the work, including scripts to
+control those activities. However, it does not include the work's
+System Libraries, or general-purpose tools or generally available free
+programs which are used unmodified in performing those activities but
+which are not part of the work. For example, Corresponding Source
+includes interface definition files associated with source files for
+the work, and the source code for shared libraries and dynamically
+linked subprograms that the work is specifically designed to require,
+such as by intimate data communication or control flow between those
+subprograms and other parts of the work.
+
+ The Corresponding Source need not include anything that users
+can regenerate automatically from other parts of the Corresponding
+Source.
+
+ The Corresponding Source for a work in source code form is that
+same work.
+
+ 2. Basic Permissions.
+
+ All rights granted under this License are granted for the term of
+copyright on the Program, and are irrevocable provided the stated
+conditions are met. This License explicitly affirms your unlimited
+permission to run the unmodified Program. The output from running a
+covered work is covered by this License only if the output, given its
+content, constitutes a covered work. This License acknowledges your
+rights of fair use or other equivalent, as provided by copyright law.
+
+ You may make, run and propagate covered works that you do not
+convey, without conditions so long as your license otherwise remains
+in force. You may convey covered works to others for the sole purpose
+of having them make modifications exclusively for you, or provide you
+with facilities for running those works, provided that you comply with
+the terms of this License in conveying all material for which you do
+not control copyright. Those thus making or running the covered works
+for you must do so exclusively on your behalf, under your direction
+and control, on terms that prohibit them from making any copies of
+your copyrighted material outside their relationship with you.
+
+ Conveying under any other circumstances is permitted solely under
+the conditions stated below. Sublicensing is not allowed; section 10
+makes it unnecessary.
+
+ 3. Protecting Users' Legal Rights From Anti-Circumvention Law.
+
+ No covered work shall be deemed part of an effective technological
+measure under any applicable law fulfilling obligations under article
+11 of the WIPO copyright treaty adopted on 20 December 1996, or
+similar laws prohibiting or restricting circumvention of such
+measures.
+
+ When you convey a covered work, you waive any legal power to forbid
+circumvention of technological measures to the extent such circumvention
+is effected by exercising rights under this License with respect to
+the covered work, and you disclaim any intention to limit operation or
+modification of the work as a means of enforcing, against the work's
+users, your or third parties' legal rights to forbid circumvention of
+technological measures.
+
+ 4. Conveying Verbatim Copies.
+
+ You may convey verbatim copies of the Program's source code as you
+receive it, in any medium, provided that you conspicuously and
+appropriately publish on each copy an appropriate copyright notice;
+keep intact all notices stating that this License and any
+non-permissive terms added in accord with section 7 apply to the code;
+keep intact all notices of the absence of any warranty; and give all
+recipients a copy of this License along with the Program.
+
+ You may charge any price or no price for each copy that you convey,
+and you may offer support or warranty protection for a fee.
+
+ 5. Conveying Modified Source Versions.
+
+ You may convey a work based on the Program, or the modifications to
+produce it from the Program, in the form of source code under the
+terms of section 4, provided that you also meet all of these conditions:
+
+ a) The work must carry prominent notices stating that you modified
+ it, and giving a relevant date.
+
+ b) The work must carry prominent notices stating that it is
+ released under this License and any conditions added under section
+ 7. This requirement modifies the requirement in section 4 to
+ "keep intact all notices".
+
+ c) You must license the entire work, as a whole, under this
+ License to anyone who comes into possession of a copy. This
+ License will therefore apply, along with any applicable section 7
+ additional terms, to the whole of the work, and all its parts,
+ regardless of how they are packaged. This License gives no
+ permission to license the work in any other way, but it does not
+ invalidate such permission if you have separately received it.
+
+ d) If the work has interactive user interfaces, each must display
+ Appropriate Legal Notices; however, if the Program has interactive
+ interfaces that do not display Appropriate Legal Notices, your
+ work need not make them do so.
+
+ A compilation of a covered work with other separate and independent
+works, which are not by their nature extensions of the covered work,
+and which are not combined with it such as to form a larger program,
+in or on a volume of a storage or distribution medium, is called an
+"aggregate" if the compilation and its resulting copyright are not
+used to limit the access or legal rights of the compilation's users
+beyond what the individual works permit. Inclusion of a covered work
+in an aggregate does not cause this License to apply to the other
+parts of the aggregate.
+
+ 6. Conveying Non-Source Forms.
+
+ You may convey a covered work in object code form under the terms
+of sections 4 and 5, provided that you also convey the
+machine-readable Corresponding Source under the terms of this License,
+in one of these ways:
+
+ a) Convey the object code in, or embodied in, a physical product
+ (including a physical distribution medium), accompanied by the
+ Corresponding Source fixed on a durable physical medium
+ customarily used for software interchange.
+
+ b) Convey the object code in, or embodied in, a physical product
+ (including a physical distribution medium), accompanied by a
+ written offer, valid for at least three years and valid for as
+ long as you offer spare parts or customer support for that product
+ model, to give anyone who possesses the object code either (1) a
+ copy of the Corresponding Source for all the software in the
+ product that is covered by this License, on a durable physical
+ medium customarily used for software interchange, for a price no
+ more than your reasonable cost of physically performing this
+ conveying of source, or (2) access to copy the
+ Corresponding Source from a network server at no charge.
+
+ c) Convey individual copies of the object code with a copy of the
+ written offer to provide the Corresponding Source. This
+ alternative is allowed only occasionally and noncommercially, and
+ only if you received the object code with such an offer, in accord
+ with subsection 6b.
+
+ d) Convey the object code by offering access from a designated
+ place (gratis or for a charge), and offer equivalent access to the
+ Corresponding Source in the same way through the same place at no
+ further charge. You need not require recipients to copy the
+ Corresponding Source along with the object code. If the place to
+ copy the object code is a network server, the Corresponding Source
+ may be on a different server (operated by you or a third party)
+ that supports equivalent copying facilities, provided you maintain
+ clear directions next to the object code saying where to find the
+ Corresponding Source. Regardless of what server hosts the
+ Corresponding Source, you remain obligated to ensure that it is
+ available for as long as needed to satisfy these requirements.
+
+ e) Convey the object code using peer-to-peer transmission, provided
+ you inform other peers where the object code and Corresponding
+ Source of the work are being offered to the general public at no
+ charge under subsection 6d.
+
+ A separable portion of the object code, whose source code is excluded
+from the Corresponding Source as a System Library, need not be
+included in conveying the object code work.
+
+ A "User Product" is either (1) a "consumer product", which means any
+tangible personal property which is normally used for personal, family,
+or household purposes, or (2) anything designed or sold for incorporation
+into a dwelling. In determining whether a product is a consumer product,
+doubtful cases shall be resolved in favor of coverage. For a particular
+product received by a particular user, "normally used" refers to a
+typical or common use of that class of product, regardless of the status
+of the particular user or of the way in which the particular user
+actually uses, or expects or is expected to use, the product. A product
+is a consumer product regardless of whether the product has substantial
+commercial, industrial or non-consumer uses, unless such uses represent
+the only significant mode of use of the product.
+
+ "Installation Information" for a User Product means any methods,
+procedures, authorization keys, or other information required to install
+and execute modified versions of a covered work in that User Product from
+a modified version of its Corresponding Source. The information must
+suffice to ensure that the continued functioning of the modified object
+code is in no case prevented or interfered with solely because
+modification has been made.
+
+ If you convey an object code work under this section in, or with, or
+specifically for use in, a User Product, and the conveying occurs as
+part of a transaction in which the right of possession and use of the
+User Product is transferred to the recipient in perpetuity or for a
+fixed term (regardless of how the transaction is characterized), the
+Corresponding Source conveyed under this section must be accompanied
+by the Installation Information. But this requirement does not apply
+if neither you nor any third party retains the ability to install
+modified object code on the User Product (for example, the work has
+been installed in ROM).
+
+ The requirement to provide Installation Information does not include a
+requirement to continue to provide support service, warranty, or updates
+for a work that has been modified or installed by the recipient, or for
+the User Product in which it has been modified or installed. Access to a
+network may be denied when the modification itself materially and
+adversely affects the operation of the network or violates the rules and
+protocols for communication across the network.
+
+ Corresponding Source conveyed, and Installation Information provided,
+in accord with this section must be in a format that is publicly
+documented (and with an implementation available to the public in
+source code form), and must require no special password or key for
+unpacking, reading or copying.
+
+ 7. Additional Terms.
+
+ "Additional permissions" are terms that supplement the terms of this
+License by making exceptions from one or more of its conditions.
+Additional permissions that are applicable to the entire Program shall
+be treated as though they were included in this License, to the extent
+that they are valid under applicable law. If additional permissions
+apply only to part of the Program, that part may be used separately
+under those permissions, but the entire Program remains governed by
+this License without regard to the additional permissions.
+
+ When you convey a copy of a covered work, you may at your option
+remove any additional permissions from that copy, or from any part of
+it. (Additional permissions may be written to require their own
+removal in certain cases when you modify the work.) You may place
+additional permissions on material, added by you to a covered work,
+for which you have or can give appropriate copyright permission.
+
+ Notwithstanding any other provision of this License, for material you
+add to a covered work, you may (if authorized by the copyright holders of
+that material) supplement the terms of this License with terms:
+
+ a) Disclaiming warranty or limiting liability differently from the
+ terms of sections 15 and 16 of this License; or
+
+ b) Requiring preservation of specified reasonable legal notices or
+ author attributions in that material or in the Appropriate Legal
+ Notices displayed by works containing it; or
+
+ c) Prohibiting misrepresentation of the origin of that material, or
+ requiring that modified versions of such material be marked in
+ reasonable ways as different from the original version; or
+
+ d) Limiting the use for publicity purposes of names of licensors or
+ authors of the material; or
+
+ e) Declining to grant rights under trademark law for use of some
+ trade names, trademarks, or service marks; or
+
+ f) Requiring indemnification of licensors and authors of that
+ material by anyone who conveys the material (or modified versions of
+ it) with contractual assumptions of liability to the recipient, for
+ any liability that these contractual assumptions directly impose on
+ those licensors and authors.
+
+ All other non-permissive additional terms are considered "further
+restrictions" within the meaning of section 10. If the Program as you
+received it, or any part of it, contains a notice stating that it is
+governed by this License along with a term that is a further
+restriction, you may remove that term. If a license document contains
+a further restriction but permits relicensing or conveying under this
+License, you may add to a covered work material governed by the terms
+of that license document, provided that the further restriction does
+not survive such relicensing or conveying.
+
+ If you add terms to a covered work in accord with this section, you
+must place, in the relevant source files, a statement of the
+additional terms that apply to those files, or a notice indicating
+where to find the applicable terms.
+
+ Additional terms, permissive or non-permissive, may be stated in the
+form of a separately written license, or stated as exceptions;
+the above requirements apply either way.
+
+ 8. Termination.
+
+ You may not propagate or modify a covered work except as expressly
+provided under this License. Any attempt otherwise to propagate or
+modify it is void, and will automatically terminate your rights under
+this License (including any patent licenses granted under the third
+paragraph of section 11).
+
+ However, if you cease all violation of this License, then your
+license from a particular copyright holder is reinstated (a)
+provisionally, unless and until the copyright holder explicitly and
+finally terminates your license, and (b) permanently, if the copyright
+holder fails to notify you of the violation by some reasonable means
+prior to 60 days after the cessation.
+
+ Moreover, your license from a particular copyright holder is
+reinstated permanently if the copyright holder notifies you of the
+violation by some reasonable means, this is the first time you have
+received notice of violation of this License (for any work) from that
+copyright holder, and you cure the violation prior to 30 days after
+your receipt of the notice.
+
+ Termination of your rights under this section does not terminate the
+licenses of parties who have received copies or rights from you under
+this License. If your rights have been terminated and not permanently
+reinstated, you do not qualify to receive new licenses for the same
+material under section 10.
+
+ 9. Acceptance Not Required for Having Copies.
+
+ You are not required to accept this License in order to receive or
+run a copy of the Program. Ancillary propagation of a covered work
+occurring solely as a consequence of using peer-to-peer transmission
+to receive a copy likewise does not require acceptance. However,
+nothing other than this License grants you permission to propagate or
+modify any covered work. These actions infringe copyright if you do
+not accept this License. Therefore, by modifying or propagating a
+covered work, you indicate your acceptance of this License to do so.
+
+ 10. Automatic Licensing of Downstream Recipients.
+
+ Each time you convey a covered work, the recipient automatically
+receives a license from the original licensors, to run, modify and
+propagate that work, subject to this License. You are not responsible
+for enforcing compliance by third parties with this License.
+
+ An "entity transaction" is a transaction transferring control of an
+organization, or substantially all assets of one, or subdividing an
+organization, or merging organizations. If propagation of a covered
+work results from an entity transaction, each party to that
+transaction who receives a copy of the work also receives whatever
+licenses to the work the party's predecessor in interest had or could
+give under the previous paragraph, plus a right to possession of the
+Corresponding Source of the work from the predecessor in interest, if
+the predecessor has it or can get it with reasonable efforts.
+
+ You may not impose any further restrictions on the exercise of the
+rights granted or affirmed under this License. For example, you may
+not impose a license fee, royalty, or other charge for exercise of
+rights granted under this License, and you may not initiate litigation
+(including a cross-claim or counterclaim in a lawsuit) alleging that
+any patent claim is infringed by making, using, selling, offering for
+sale, or importing the Program or any portion of it.
+
+ 11. Patents.
+
+ A "contributor" is a copyright holder who authorizes use under this
+License of the Program or a work on which the Program is based. The
+work thus licensed is called the contributor's "contributor version".
+
+ A contributor's "essential patent claims" are all patent claims
+owned or controlled by the contributor, whether already acquired or
+hereafter acquired, that would be infringed by some manner, permitted
+by this License, of making, using, or selling its contributor version,
+but do not include claims that would be infringed only as a
+consequence of further modification of the contributor version. For
+purposes of this definition, "control" includes the right to grant
+patent sublicenses in a manner consistent with the requirements of
+this License.
+
+ Each contributor grants you a non-exclusive, worldwide, royalty-free
+patent license under the contributor's essential patent claims, to
+make, use, sell, offer for sale, import and otherwise run, modify and
+propagate the contents of its contributor version.
+
+ In the following three paragraphs, a "patent license" is any express
+agreement or commitment, however denominated, not to enforce a patent
+(such as an express permission to practice a patent or covenant not to
+sue for patent infringement). To "grant" such a patent license to a
+party means to make such an agreement or commitment not to enforce a
+patent against the party.
+
+ If you convey a covered work, knowingly relying on a patent license,
+and the Corresponding Source of the work is not available for anyone
+to copy, free of charge and under the terms of this License, through a
+publicly available network server or other readily accessible means,
+then you must either (1) cause the Corresponding Source to be so
+available, or (2) arrange to deprive yourself of the benefit of the
+patent license for this particular work, or (3) arrange, in a manner
+consistent with the requirements of this License, to extend the patent
+license to downstream recipients. "Knowingly relying" means you have
+actual knowledge that, but for the patent license, your conveying the
+covered work in a country, or your recipient's use of the covered work
+in a country, would infringe one or more identifiable patents in that
+country that you have reason to believe are valid.
+
+ If, pursuant to or in connection with a single transaction or
+arrangement, you convey, or propagate by procuring conveyance of, a
+covered work, and grant a patent license to some of the parties
+receiving the covered work authorizing them to use, propagate, modify
+or convey a specific copy of the covered work, then the patent license
+you grant is automatically extended to all recipients of the covered
+work and works based on it.
+
+ A patent license is "discriminatory" if it does not include within
+the scope of its coverage, prohibits the exercise of, or is
+conditioned on the non-exercise of one or more of the rights that are
+specifically granted under this License. You may not convey a covered
+work if you are a party to an arrangement with a third party that is
+in the business of distributing software, under which you make payment
+to the third party based on the extent of your activity of conveying
+the work, and under which the third party grants, to any of the
+parties who would receive the covered work from you, a discriminatory
+patent license (a) in connection with copies of the covered work
+conveyed by you (or copies made from those copies), or (b) primarily
+for and in connection with specific products or compilations that
+contain the covered work, unless you entered into that arrangement,
+or that patent license was granted, prior to 28 March 2007.
+
+ Nothing in this License shall be construed as excluding or limiting
+any implied license or other defenses to infringement that may
+otherwise be available to you under applicable patent law.
+
+ 12. No Surrender of Others' Freedom.
+
+ If conditions are imposed on you (whether by court order, agreement or
+otherwise) that contradict the conditions of this License, they do not
+excuse you from the conditions of this License. If you cannot convey a
+covered work so as to satisfy simultaneously your obligations under this
+License and any other pertinent obligations, then as a consequence you may
+not convey it at all. For example, if you agree to terms that obligate you
+to collect a royalty for further conveying from those to whom you convey
+the Program, the only way you could satisfy both those terms and this
+License would be to refrain entirely from conveying the Program.
+
+ 13. Use with the GNU Affero General Public License.
+
+ Notwithstanding any other provision of this License, you have
+permission to link or combine any covered work with a work licensed
+under version 3 of the GNU Affero General Public License into a single
+combined work, and to convey the resulting work. The terms of this
+License will continue to apply to the part which is the covered work,
+but the special requirements of the GNU Affero General Public License,
+section 13, concerning interaction through a network will apply to the
+combination as such.
+
+ 14. Revised Versions of this License.
+
+ The Free Software Foundation may publish revised and/or new versions of
+the GNU General Public License from time to time. Such new versions will
+be similar in spirit to the present version, but may differ in detail to
+address new problems or concerns.
+
+ Each version is given a distinguishing version number. If the
+Program specifies that a certain numbered version of the GNU General
+Public License "or any later version" applies to it, you have the
+option of following the terms and conditions either of that numbered
+version or of any later version published by the Free Software
+Foundation. If the Program does not specify a version number of the
+GNU General Public License, you may choose any version ever published
+by the Free Software Foundation.
+
+ If the Program specifies that a proxy can decide which future
+versions of the GNU General Public License can be used, that proxy's
+public statement of acceptance of a version permanently authorizes you
+to choose that version for the Program.
+
+ Later license versions may give you additional or different
+permissions. However, no additional obligations are imposed on any
+author or copyright holder as a result of your choosing to follow a
+later version.
+
+ 15. Disclaimer of Warranty.
+
+ THERE IS NO WARRANTY FOR THE PROGRAM, TO THE EXTENT PERMITTED BY
+APPLICABLE LAW. EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT
+HOLDERS AND/OR OTHER PARTIES PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY
+OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO,
+THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
+PURPOSE. THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE PROGRAM
+IS WITH YOU. SHOULD THE PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF
+ALL NECESSARY SERVICING, REPAIR OR CORRECTION.
+
+ 16. Limitation of Liability.
+
+ IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING
+WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MODIFIES AND/OR CONVEYS
+THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, INCLUDING ANY
+GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THE
+USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED TO LOSS OF
+DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD
+PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER PROGRAMS),
+EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF
+SUCH DAMAGES.
+
+ 17. Interpretation of Sections 15 and 16.
+
+ If the disclaimer of warranty and limitation of liability provided
+above cannot be given local legal effect according to their terms,
+reviewing courts shall apply local law that most closely approximates
+an absolute waiver of all civil liability in connection with the
+Program, unless a warranty or assumption of liability accompanies a
+copy of the Program in return for a fee.
+
+ END OF TERMS AND CONDITIONS
+
+ How to Apply These Terms to Your New Programs
+
+ If you develop a new program, and you want it to be of the greatest
+possible use to the public, the best way to achieve this is to make it
+free software which everyone can redistribute and change under these terms.
+
+ To do so, attach the following notices to the program. It is safest
+to attach them to the start of each source file to most effectively
+state the exclusion of warranty; and each file should have at least
+the "copyright" line and a pointer to where the full notice is found.
+
+
+ Copyright (C)
+
+ This program is free software: you can redistribute it and/or modify
+ it under the terms of the GNU General Public License as published by
+ the Free Software Foundation, either version 3 of the License, or
+ (at your option) any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ GNU General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with this program. If not, see .
+
+Also add information on how to contact you by electronic and paper mail.
+
+ If the program does terminal interaction, make it output a short
+notice like this when it starts in an interactive mode:
+
+ Copyright (C)
+ This program comes with ABSOLUTELY NO WARRANTY; for details type `show w'.
+ This is free software, and you are welcome to redistribute it
+ under certain conditions; type `show c' for details.
+
+The hypothetical commands `show w' and `show c' should show the appropriate
+parts of the General Public License. Of course, your program's commands
+might be different; for a GUI interface, you would use an "about box".
+
+ You should also get your employer (if you work as a programmer) or school,
+if any, to sign a "copyright disclaimer" for the program, if necessary.
+For more information on this, and how to apply and follow the GNU GPL, see
+.
+
+ The GNU General Public License does not permit incorporating your program
+into proprietary programs. If your program is a subroutine library, you
+may consider it more useful to permit linking proprietary applications with
+the library. If this is what you want to do, use the GNU Lesser General
+Public License instead of this License. But first, please read
+.
diff --git a/3rdparty/zint-2.6.1/backend/2of5.c b/3rdparty/zint-2.6.1/backend/2of5.c
new file mode 100644
index 0000000..60010b8
--- /dev/null
+++ b/3rdparty/zint-2.6.1/backend/2of5.c
@@ -0,0 +1,357 @@
+/* 2of5.c - Handles Code 2 of 5 barcodes */
+
+/*
+ libzint - the open source barcode library
+ Copyright (C) 2008-2017 Robin Stuart
+
+ Redistribution and use in source and binary forms, with or without
+ modification, are permitted provided that the following conditions
+ are met:
+
+ 1. Redistributions of source code must retain the above copyright
+ notice, this list of conditions and the following disclaimer.
+ 2. Redistributions in binary form must reproduce the above copyright
+ notice, this list of conditions and the following disclaimer in the
+ documentation and/or other materials provided with the distribution.
+ 3. Neither the name of the project nor the names of its contributors
+ may be used to endorse or promote products derived from this software
+ without specific prior written permission.
+
+ THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND
+ ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+ ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE
+ FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+ DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
+ OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
+ HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
+ LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
+ OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+ SUCH DAMAGE.
+ */
+
+#include
+#include
+#include
+#include "common.h"
+#ifdef _MSC_VER
+#include
+#define inline _inline
+#endif
+
+static const char *C25MatrixTable[10] = {
+ "113311", "311131", "131131", "331111", "113131", "313111",
+ "133111", "111331", "311311", "131311"
+};
+
+static const char *C25IndustTable[10] = {
+ "1111313111", "3111111131", "1131111131", "3131111111", "1111311131",
+ "3111311111", "1131311111", "1111113131", "3111113111", "1131113111"
+};
+
+static const char *C25InterTable[10] = {
+ "11331", "31113", "13113", "33111", "11313", "31311", "13311", "11133",
+ "31131", "13131"
+};
+
+static inline char check_digit(unsigned int count) {
+ return itoc((10 - (count % 10)) % 10);
+}
+
+/* Code 2 of 5 Standard (Code 2 of 5 Matrix) */
+int matrix_two_of_five(struct zint_symbol *symbol, unsigned char source[], int length) {
+
+ int i, error_number;
+ char dest[512]; /* 6 + 80 * 6 + 6 + 1 ~ 512*/
+
+ if (length > 80) {
+ strcpy(symbol->errtxt, "301: Input too long");
+ return ZINT_ERROR_TOO_LONG;
+ }
+ error_number = is_sane(NEON, source, length);
+ if (error_number == ZINT_ERROR_INVALID_DATA) {
+ strcpy(symbol->errtxt, "302: Invalid characters in data");
+ return error_number;
+ }
+
+ /* start character */
+ strcpy(dest, "411111");
+
+ for (i = 0; i < length; i++) {
+ lookup(NEON, C25MatrixTable, source[i], dest);
+ }
+
+ /* Stop character */
+ strcat(dest, "41111");
+
+ expand(symbol, dest);
+ ustrcpy(symbol->text, source);
+ return error_number;
+}
+
+/* Code 2 of 5 Industrial */
+int industrial_two_of_five(struct zint_symbol *symbol, unsigned char source[], int length) {
+
+ int i, error_number;
+ char dest[512]; /* 6 + 40 * 10 + 6 + 1 */
+
+ if (length > 45) {
+ strcpy(symbol->errtxt, "303: Input too long");
+ return ZINT_ERROR_TOO_LONG;
+ }
+ error_number = is_sane(NEON, source, length);
+ if (error_number == ZINT_ERROR_INVALID_DATA) {
+ strcpy(symbol->errtxt, "304: Invalid character in data");
+ return error_number;
+ }
+
+ /* start character */
+ strcpy(dest, "313111");
+
+ for (i = 0; i < length; i++) {
+ lookup(NEON, C25IndustTable, source[i], dest);
+ }
+
+ /* Stop character */
+ strcat(dest, "31113");
+
+ expand(symbol, dest);
+ ustrcpy(symbol->text, source);
+ return error_number;
+}
+
+/* Code 2 of 5 IATA */
+int iata_two_of_five(struct zint_symbol *symbol, unsigned char source[], int length) {
+ int i, error_number;
+ char dest[512]; /* 4 + 45 * 10 + 3 + 1 */
+
+ if (length > 45) {
+ strcpy(symbol->errtxt, "305: Input too long");
+ return ZINT_ERROR_TOO_LONG;
+ }
+ error_number = is_sane(NEON, source, length);
+ if (error_number == ZINT_ERROR_INVALID_DATA) {
+ strcpy(symbol->errtxt, "306: Invalid characters in data");
+ return error_number;
+ }
+
+ /* start */
+ strcpy(dest, "1111");
+
+ for (i = 0; i < length; i++) {
+ lookup(NEON, C25IndustTable, source[i], dest);
+ }
+
+ /* stop */
+ strcat(dest, "311");
+
+ expand(symbol, dest);
+ ustrcpy(symbol->text, source);
+ return error_number;
+}
+
+/* Code 2 of 5 Data Logic */
+int logic_two_of_five(struct zint_symbol *symbol, unsigned char source[], int length) {
+
+ int i, error_number;
+ char dest[512]; /* 4 + 80 * 6 + 3 + 1 */
+
+ if (length > 80) {
+ strcpy(symbol->errtxt, "307: Input too long");
+ return ZINT_ERROR_TOO_LONG;
+ }
+ error_number = is_sane(NEON, source, length);
+ if (error_number == ZINT_ERROR_INVALID_DATA) {
+ strcpy(symbol->errtxt, "308: Invalid characters in data");
+ return error_number;
+ }
+
+ /* start character */
+ strcpy(dest, "1111");
+
+ for (i = 0; i < length; i++) {
+ lookup(NEON, C25MatrixTable, source[i], dest);
+ }
+
+ /* Stop character */
+ strcat(dest, "311");
+
+ expand(symbol, dest);
+ ustrcpy(symbol->text, source);
+ return error_number;
+}
+
+/* Code 2 of 5 Interleaved */
+int interleaved_two_of_five(struct zint_symbol *symbol, const unsigned char source[], size_t length) {
+
+ int i, j, k, error_number;
+ char bars[7], spaces[7], mixed[14], dest[1000];
+#ifndef _MSC_VER
+ unsigned char temp[length + 2];
+#else
+ unsigned char* temp = (unsigned char *) _alloca((length + 2) * sizeof (unsigned char));
+#endif
+
+ if (length > 89) {
+ strcpy(symbol->errtxt, "309: Input too long");
+ return ZINT_ERROR_TOO_LONG;
+ }
+ error_number = is_sane(NEON, source, length);
+ if (error_number == ZINT_ERROR_INVALID_DATA) {
+ strcpy(symbol->errtxt, "310: Invalid characters in data");
+ return error_number;
+ }
+
+ ustrcpy(temp, (unsigned char *) "");
+ /* Input must be an even number of characters for Interlaced 2 of 5 to work:
+ if an odd number of characters has been entered then add a leading zero */
+ if (length & 1) {
+ ustrcpy(temp, (unsigned char *) "0");
+ length++;
+ }
+ strcat((char*) temp, (char*) source);
+
+ /* start character */
+ strcpy(dest, "1111");
+
+ for (i = 0; i < length; i += 2) {
+ /* look up the bars and the spaces and put them in two strings */
+ strcpy(bars, "");
+ lookup(NEON, C25InterTable, temp[i], bars);
+ strcpy(spaces, "");
+ lookup(NEON, C25InterTable, temp[i + 1], spaces);
+
+ /* then merge (interlace) the strings together */
+ k = 0;
+ for (j = 0; j <= 4; j++) {
+ mixed[k] = bars[j];
+ k++;
+ mixed[k] = spaces[j];
+ k++;
+ }
+ mixed[k] = '\0';
+ strcat(dest, mixed);
+ }
+
+ /* Stop character */
+ strcat(dest, "311");
+
+ expand(symbol, dest);
+ ustrcpy(symbol->text, temp);
+ return error_number;
+
+}
+
+/* Interleaved 2-of-5 (ITF) */
+int itf14(struct zint_symbol *symbol, unsigned char source[], int length) {
+ int i, error_number, zeroes;
+ unsigned int count;
+ char localstr[16];
+
+ count = 0;
+
+ if (length > 13) {
+ strcpy(symbol->errtxt, "311: Input too long");
+ return ZINT_ERROR_TOO_LONG;
+ }
+
+ error_number = is_sane(NEON, source, length);
+ if (error_number == ZINT_ERROR_INVALID_DATA) {
+ strcpy(symbol->errtxt, "312: Invalid character in data");
+ return error_number;
+ }
+
+ /* Add leading zeros as required */
+ zeroes = 13 - length;
+ for (i = 0; i < zeroes; i++) {
+ localstr[i] = '0';
+ }
+ strcpy(localstr + zeroes, (char *) source);
+
+ /* Calculate the check digit - the same method used for EAN-13 */
+ for (i = 12; i >= 0; i--) {
+ count += ctoi(localstr[i]);
+
+ if (!(i & 1)) {
+ count += 2 * ctoi(localstr[i]);
+ }
+ }
+ localstr[13] = check_digit(count);
+ localstr[14] = '\0';
+ error_number = interleaved_two_of_five(symbol, (unsigned char *) localstr, strlen(localstr));
+ ustrcpy(symbol->text, (unsigned char*) localstr);
+ return error_number;
+}
+
+/* Deutshe Post Leitcode */
+int dpleit(struct zint_symbol *symbol, unsigned char source[], int length) {
+ int i, error_number;
+ unsigned int count;
+ char localstr[16];
+ int zeroes;
+
+ count = 0;
+ if (length > 13) {
+ strcpy(symbol->errtxt, "313: Input wrong length");
+ return ZINT_ERROR_TOO_LONG;
+ }
+ error_number = is_sane(NEON, source, length);
+ if (error_number == ZINT_ERROR_INVALID_DATA) {
+ strcpy(symbol->errtxt, "314: Invalid characters in data");
+ return error_number;
+ }
+
+ zeroes = 13 - length;
+ for (i = 0; i < zeroes; i++)
+ localstr[i] = '0';
+ strcpy(localstr + zeroes, (char *) source);
+
+ for (i = 12; i >= 0; i--) {
+ count += 4 * ctoi(localstr[i]);
+
+ if (i & 1) {
+ count += 5 * ctoi(localstr[i]);
+ }
+ }
+ localstr[13] = check_digit(count);
+ localstr[14] = '\0';
+ error_number = interleaved_two_of_five(symbol, (unsigned char *) localstr, strlen(localstr));
+ ustrcpy(symbol->text, (unsigned char*) localstr);
+ return error_number;
+}
+
+/* Deutsche Post Identcode */
+int dpident(struct zint_symbol *symbol, unsigned char source[], int length) {
+ int i, error_number, zeroes;
+ unsigned int count;
+ char localstr[16];
+
+ count = 0;
+ if (length > 11) {
+ strcpy(symbol->errtxt, "315: Input wrong length");
+ return ZINT_ERROR_TOO_LONG;
+ }
+ error_number = is_sane(NEON, source, length);
+ if (error_number == ZINT_ERROR_INVALID_DATA) {
+ strcpy(symbol->errtxt, "316: Invalid characters in data");
+ return error_number;
+ }
+
+ zeroes = 11 - length;
+ for (i = 0; i < zeroes; i++)
+ localstr[i] = '0';
+ strcpy(localstr + zeroes, (char *) source);
+
+ for (i = 10; i >= 0; i--) {
+ count += 4 * ctoi(localstr[i]);
+
+ if (i & 1) {
+ count += 5 * ctoi(localstr[i]);
+ }
+ }
+ localstr[11] = check_digit(count);
+ localstr[12] = '\0';
+ error_number = interleaved_two_of_five(symbol, (unsigned char *) localstr, strlen(localstr));
+ ustrcpy(symbol->text, (unsigned char*) localstr);
+ return error_number;
+}
diff --git a/3rdparty/zint-2.6.1/backend/CMakeLists.txt b/3rdparty/zint-2.6.1/backend/CMakeLists.txt
new file mode 100644
index 0000000..9de4127
--- /dev/null
+++ b/3rdparty/zint-2.6.1/backend/CMakeLists.txt
@@ -0,0 +1,31 @@
+# (c) 2008 by BogDan Vatra < bogdan@licentia.eu >
+
+project(zint)
+
+find_package(PNG)
+
+set(zint_COMMON_SRCS common.c library.c render.c large.c reedsol.c gs1.c eci.c)
+set(zint_ONEDIM_SRCS code.c code128.c 2of5.c upcean.c telepen.c medical.c plessey.c rss.c)
+set(zint_POSTAL_SRCS postal.c auspost.c imail.c)
+set(zint_TWODIM_SRCS code16k.c codablock.c dmatrix.c pdf417.c qr.c maxicode.c composite.c aztec.c code49.c code1.c gridmtx.c hanxin.c dotcode.c)
+set(zint_OUTPUT_SRCS render.c ps.c svg.c emf.c bmp.c pcx.c gif.c png.c tif.c raster.c)
+set(zint_SRCS ${zint_OUTPUT_SRCS} ${zint_COMMON_SRCS} ${zint_ONEDIM_SRCS} ${zint_POSTAL_SRCS} ${zint_TWODIM_SRCS})
+
+if(PNG_FOUND)
+ include_directories( ${PNG_INCLUDES} )
+else(PNG_FOUND)
+ add_definitions (-DNO_PNG)
+endif(PNG_FOUND)
+
+add_library(zint SHARED ${zint_SRCS})
+
+set_target_properties(zint PROPERTIES SOVERSION "${ZINT_VERSION_MAJOR}.${ZINT_VERSION_MINOR}"
+ VERSION ${ZINT_VERSION})
+
+if(PNG_FOUND)
+ target_link_libraries(zint ${PNG_LIBRARIES} )
+endif(PNG_FOUND)
+target_link_libraries(zint -lm)
+
+install(TARGETS zint ${INSTALL_TARGETS_DEFAULT_ARGS} )
+install(FILES zint.h DESTINATION ${INCLUDE_INSTALL_DIR} COMPONENT Devel)
diff --git a/3rdparty/zint-2.6.1/backend/DEVELOPER b/3rdparty/zint-2.6.1/backend/DEVELOPER
new file mode 100644
index 0000000..478c78a
--- /dev/null
+++ b/3rdparty/zint-2.6.1/backend/DEVELOPER
@@ -0,0 +1,133 @@
+Contents
+--------
+
+Here is a guide to which bit of source code does what.
+
+2of5.c:
+ Matrix 2 of 5
+ Industrial 2 of 5
+ IATA 2 of 5
+ Data Logic
+ Interleaved 2 of 5
+ ITF-14
+ Deutche Post Leitcode
+ Deutche Post Identcode
+
+auspost.c:
+ Australia Post Standard Customer Barcode
+ Australia Post Customer Barcode 2
+ Australia Post Customer Barcode 3
+ Australia Post Reply Paid Barcode
+ Australia Post Routing Barcode
+ Australia Post Redirect Barcode
+
+aztec.c:
+ Aztec Code
+ Compact Aztec Code
+ Aztec Runes
+
+blockf.c:
+ Codablock-F
+
+code128.c:
+ Code 128
+ Code 128 Subset B
+ NVE-18
+ GS1-128 (UCC/EAN-128)
+ EAN-14
+
+code16k.c:
+ Code 16k
+
+code.c:
+ Code 11
+ Code 39
+ Pharmazentral Nummer (PZN)
+ Extended Code 39 (Code 39+)
+ Code 93
+ LOGMARS
+ Channel Code
+
+code1.c:
+ Code One
+
+code49.c:
+ Code 49
+
+composite.c:
+ CC-A Composite Symbology
+ CC-B Composite Symbology
+ CC-C Composite Symbology
+
+dotcode.c:
+ Dot Code
+
+dm200.c:
+ Data Matrix ECC 200
+
+gridmtx.c:
+ Grid Matrix
+
+hanxin.c:
+ Han Xin Code
+
+imail.c:
+ USPS OneCode (Intelligent Mail)
+
+maxicode.c:
+ UPS Maxicode
+
+medical.c:
+ Pharma Code
+ Two Track Pharma Code
+ Codabar
+ Code 32
+
+pdf417.c:
+ PDF417
+ Truncated PDF417
+ MicroPDF417
+
+plessey.c:
+ UK Plessey Code (bidirectional)
+ MSI Plessey
+
+postal.c:
+ PostNet
+ PLANET
+ Facing Identification Mark (FIM)
+ Royal Mail 4-State Country Code (RM4SCC)
+ KIX Code
+ DAFT Code
+ Flattermarken
+ Korean Postal Code
+ Japanese Postal Code
+
+qr.c:
+ QR Code
+ Micro QR Code
+ UPNQR
+
+rss.c:
+ GS1 DataBar (DataBar-14) (RSS-14)
+ GS1 DataBar Stacked (RSS-14 Stacked)
+ GS1 DataBar Stacked Omnidirectional (DataBar-14 Stacked Omnidirectional)
+ (RSS-14 Stacked Omnidirectional)
+ GS1 DataBar Limited (RSS Limited)
+ GS1 DataBar Expanded (RSS Expanded)
+ GS1 DataBar Expanded Stacked (RSS Expanded Stacked)
+
+telepen.c:
+ Telepen ASCII
+ Telepen Numeric
+
+upcean.c:
+ UPC-A
+ UPC-E
+ EAN-2 add-on
+ EAN-5 add-on
+ EAN-8
+ EAN-13
+ SBN (verification)
+ ISBN (verification)
+ ISBN-13 (verification)
\ No newline at end of file
diff --git a/3rdparty/zint-2.6.1/backend/LICENSE b/3rdparty/zint-2.6.1/backend/LICENSE
new file mode 100644
index 0000000..723ef63
--- /dev/null
+++ b/3rdparty/zint-2.6.1/backend/LICENSE
@@ -0,0 +1,13 @@
+ZINT was originally developed by Robin Stuart and licensed under the terms of the GPL (Gnu
+Public License). In 2013 Robin Stuart and all developers that contributed to the code agreed
+to change the license to a less restrictive one (see ZINT mailing list of May 2013 for
+related mails) under the following conditions:
+- the names of original copyright holder Robin Stuart and contributors are not removed,
+ neither from sources nor from the manual
+- the documentation is done in British English (as Robin said: "Oh, and please don't
+ replace the word "colour" with "color" in the documentation - that really annoys me!")
+
+Change to BSD-license is done for backend and therefore for ZINT shared library only, for
+the frontends and Qt4-backend the GPL is still valid. Since BSD-license is GPL-compatible
+this gives the possibility to include ZINT library in own products or link against it from
+own software.
diff --git a/3rdparty/zint-2.6.1/backend/auspost.c b/3rdparty/zint-2.6.1/backend/auspost.c
new file mode 100644
index 0000000..35438a7
--- /dev/null
+++ b/3rdparty/zint-2.6.1/backend/auspost.c
@@ -0,0 +1,254 @@
+/* auspost.c - Handles Australia Post 4-State Barcode */
+
+/*
+ libzint - the open source barcode library
+ Copyright (C) 2008-2017 Robin Stuart
+
+ Redistribution and use in source and binary forms, with or without
+ modification, are permitted provided that the following conditions
+ are met:
+
+ 1. Redistributions of source code must retain the above copyright
+ notice, this list of conditions and the following disclaimer.
+ 2. Redistributions in binary form must reproduce the above copyright
+ notice, this list of conditions and the following disclaimer in the
+ documentation and/or other materials provided with the distribution.
+ 3. Neither the name of the project nor the names of its contributors
+ may be used to endorse or promote products derived from this software
+ without specific prior written permission.
+
+ THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND
+ ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+ ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE
+ FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+ DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
+ OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
+ HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
+ LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
+ OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+ SUCH DAMAGE.
+ */
+
+#define GDSET "0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz #"
+
+static const char *AusNTable[10] = {
+ "00", "01", "02", "10", "11", "12", "20", "21", "22", "30"
+};
+
+static const char *AusCTable[64] = {
+ "222", "300", "301", "302", "310", "311", "312", "320", "321", "322",
+ "000", "001", "002", "010", "011", "012", "020", "021", "022", "100", "101", "102", "110",
+ "111", "112", "120", "121", "122", "200", "201", "202", "210", "211", "212", "220", "221",
+ "023", "030", "031", "032", "033", "103", "113", "123", "130", "131", "132", "133", "203",
+ "213", "223", "230", "231", "232", "233", "303", "313", "323", "330", "331", "332", "333",
+ "003", "013"
+};
+
+static const char *AusBarTable[64] = {
+ "000", "001", "002", "003", "010", "011", "012", "013", "020", "021",
+ "022", "023", "030", "031", "032", "033", "100", "101", "102", "103", "110", "111", "112",
+ "113", "120", "121", "122", "123", "130", "131", "132", "133", "200", "201", "202", "203",
+ "210", "211", "212", "213", "220", "221", "222", "223", "230", "231", "232", "233", "300",
+ "301", "302", "303", "310", "311", "312", "313", "320", "321", "322", "323", "330", "331",
+ "332", "333"
+};
+
+#include
+#include
+#include
+#include "common.h"
+#include "reedsol.h"
+#ifdef _MSC_VER
+#define inline _inline
+#endif
+
+static inline char convert_pattern(char data, int shift) {
+ return (data - '0') << shift;
+}
+
+/* Adds Reed-Solomon error correction to auspost */
+void rs_error(char data_pattern[]) {
+ size_t reader, triple_writer = 0;
+ char triple[31], inv_triple[31];
+ unsigned char result[5];
+
+ for (reader = 2; reader < strlen(data_pattern); reader += 3, triple_writer++) {
+ triple[triple_writer] = convert_pattern(data_pattern[reader], 4)
+ + convert_pattern(data_pattern[reader + 1], 2)
+ + convert_pattern(data_pattern[reader + 2], 0);
+ }
+
+ for (reader = 0; reader < triple_writer; reader++) {
+ inv_triple[reader] = triple[(triple_writer - 1) - reader];
+ }
+
+ rs_init_gf(0x43);
+ rs_init_code(4, 1);
+ rs_encode(triple_writer, (unsigned char*) inv_triple, result);
+
+ for (reader = 4; reader > 0; reader--) {
+ strcat(data_pattern, AusBarTable[(int) result[reader - 1]]);
+ }
+ rs_free();
+}
+
+/* Handles Australia Posts's 4 State Codes */
+int australia_post(struct zint_symbol *symbol, unsigned char source[], int length) {
+ /* Customer Standard Barcode, Barcode 2 or Barcode 3 system determined automatically
+ (i.e. the FCC doesn't need to be specified by the user) dependent
+ on the length of the input string */
+
+ /* The contents of data_pattern conform to the following standard:
+ 0 = Tracker, Ascender and Descender
+ 1 = Tracker and Ascender
+ 2 = Tracker and Descender
+ 3 = Tracker only */
+ int error_number, zeroes;
+ int writer;
+ unsigned int loopey, reader;
+ size_t h;
+
+ char data_pattern[200];
+ char fcc[3] = {0, 0, 0}, dpid[10];
+ char localstr[30];
+
+ error_number = 0;
+ strcpy(localstr, "");
+
+ /* Do all of the length checking first to avoid stack smashing */
+ if (symbol->symbology == BARCODE_AUSPOST) {
+ /* Format control code (FCC) */
+ switch (length) {
+ case 8:
+ strcpy(fcc, "11");
+ break;
+ case 13:
+ strcpy(fcc, "59");
+ break;
+ case 16:
+ strcpy(fcc, "59");
+ error_number = is_sane(NEON, source, length);
+ break;
+ case 18:
+ strcpy(fcc, "62");
+ break;
+ case 23:
+ strcpy(fcc, "62");
+ error_number = is_sane(NEON, source, length);
+ break;
+ default:
+ strcpy(symbol->errtxt, "401: Auspost input is wrong length");
+ return ZINT_ERROR_TOO_LONG;
+ }
+ if (error_number == ZINT_ERROR_INVALID_DATA) {
+ strcpy(symbol->errtxt, "402: Invalid characters in data");
+ return error_number;
+ }
+ } else {
+ if (length > 8) {
+ strcpy(symbol->errtxt, "403: Auspost input is too long");
+ return ZINT_ERROR_TOO_LONG;
+ }
+ switch (symbol->symbology) {
+ case BARCODE_AUSREPLY: strcpy(fcc, "45");
+ break;
+ case BARCODE_AUSROUTE: strcpy(fcc, "87");
+ break;
+ case BARCODE_AUSREDIRECT: strcpy(fcc, "92");
+ break;
+ }
+
+ /* Add leading zeros as required */
+ zeroes = 8 - length;
+ memset(localstr, '0', zeroes);
+ localstr[8] = '\0';
+ }
+
+ strcat(localstr, (char*) source);
+ h = strlen(localstr);
+ error_number = is_sane(GDSET, (unsigned char *) localstr, h);
+ if (error_number == ZINT_ERROR_INVALID_DATA) {
+ strcpy(symbol->errtxt, "404: Invalid characters in data");
+ return error_number;
+ }
+
+ /* Verifiy that the first 8 characters are numbers */
+ memcpy(dpid, localstr, 8);
+ dpid[8] = '\0';
+ error_number = is_sane(NEON, (unsigned char *) dpid, strlen(dpid));
+ if (error_number == ZINT_ERROR_INVALID_DATA) {
+ strcpy(symbol->errtxt, "405: Invalid characters in DPID");
+ return error_number;
+ }
+
+ /* Start character */
+ strcpy(data_pattern, "13");
+
+ /* Encode the FCC */
+ for (reader = 0; reader < 2; reader++) {
+ lookup(NEON, AusNTable, fcc[reader], data_pattern);
+ }
+
+ /* printf("AUSPOST FCC: %s ", fcc); */
+
+ /* Delivery Point Identifier (DPID) */
+ for (reader = 0; reader < 8; reader++) {
+ lookup(NEON, AusNTable, dpid[reader], data_pattern);
+ }
+
+ /* Customer Information */
+ if (h > 8) {
+ if ((h == 13) || (h == 18)) {
+ for (reader = 8; reader < h; reader++) {
+ lookup(GDSET, AusCTable, localstr[reader], data_pattern);
+ }
+ } else if ((h == 16) || (h == 23)) {
+ for (reader = 8; reader < h; reader++) {
+ lookup(NEON, AusNTable, localstr[reader], data_pattern);
+ }
+ }
+ }
+
+ /* Filler bar */
+ h = strlen(data_pattern);
+ switch (h) {
+ case 22:
+ case 37:
+ case 52:
+ strcat(data_pattern, "3");
+ break;
+ default:
+ break;
+ }
+
+ /* Reed Solomon error correction */
+ rs_error(data_pattern);
+
+ /* Stop character */
+ strcat(data_pattern, "13");
+
+ /* Turn the symbol into a bar pattern ready for plotting */
+ writer = 0;
+ h = strlen(data_pattern);
+ for (loopey = 0; loopey < h; loopey++) {
+ if ((data_pattern[loopey] == '1') || (data_pattern[loopey] == '0')) {
+ set_module(symbol, 0, writer);
+ }
+ set_module(symbol, 1, writer);
+ if ((data_pattern[loopey] == '2') || (data_pattern[loopey] == '0')) {
+ set_module(symbol, 2, writer);
+ }
+ writer += 2;
+ }
+
+ symbol->row_height[0] = 3;
+ symbol->row_height[1] = 2;
+ symbol->row_height[2] = 3;
+
+ symbol->rows = 3;
+ symbol->width = writer - 1;
+
+ return error_number;
+}
+
diff --git a/3rdparty/zint-2.6.1/backend/aztec.c b/3rdparty/zint-2.6.1/backend/aztec.c
new file mode 100644
index 0000000..9b17375
--- /dev/null
+++ b/3rdparty/zint-2.6.1/backend/aztec.c
@@ -0,0 +1,1681 @@
+/* aztec.c - Handles Aztec 2D Symbols */
+
+/*
+ libzint - the open source barcode library
+ Copyright (C) 2009-2017 Robin Stuart
+
+ Redistribution and use in source and binary forms, with or without
+ modification, are permitted provided that the following conditions
+ are met:
+
+ 1. Redistributions of source code must retain the above copyright
+ notice, this list of conditions and the following disclaimer.
+ 2. Redistributions in binary form must reproduce the above copyright
+ notice, this list of conditions and the following disclaimer in the
+ documentation and/or other materials provided with the distribution.
+ 3. Neither the name of the project nor the names of its contributors
+ may be used to endorse or promote products derived from this software
+ without specific prior written permission.
+
+ THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND
+ ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+ ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE
+ FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+ DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
+ OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
+ HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
+ LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
+ OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+ SUCH DAMAGE.
+ */
+
+#include
+#include
+#include
+#ifdef _MSC_VER
+#include
+#endif
+#include "common.h"
+#include "aztec.h"
+#include "reedsol.h"
+
+static int AztecMap[22801];
+
+static int count_doubles(const unsigned char source[], const int posn, const size_t src_len) {
+ int c = 0;
+ int i = posn;
+ int cond = 1;
+
+ do {
+ if (((source[i] == '.') || (source[i] == ',')) && (source[i + 1] == ' ')) {
+ c++;
+ } else {
+ cond = 0;
+ }
+ i += 2;
+ } while ((i < src_len) && cond);
+
+ return c;
+}
+
+static int count_cr(char source[], int posn, int length) {
+ int c = 0;
+ int i = posn;
+ int cond = 1;
+
+ do {
+ if (source[i] == 13) {
+ c++;
+ } else {
+ cond = 0;
+ }
+ i++;
+ } while ((i < length) && cond);
+
+ return c;
+}
+
+static int count_dotcomma(char source[], int posn, int length) {
+ int c = 0;
+ int i = posn;
+ int cond = 1;
+
+ do {
+ if ((source[i] == '.') || (source[i] == ',')) {
+ c++;
+ } else {
+ cond = 0;
+ }
+ i++;
+ } while ((i < length) && cond);
+
+ return c;
+}
+
+static int count_spaces(char source[], int posn, int length) {
+ int c = 0;
+ int i = posn;
+ int cond = 1;
+
+ do {
+ if (source[i] == ' ') {
+ c++;
+ } else {
+ cond = 0;
+ }
+ i++;
+ } while ((i < length) && cond);
+
+ return c;
+}
+
+static char get_next_mode(char encode_mode[], const size_t src_len, const int posn) {
+ int i = posn;
+
+ do {
+ i++;
+ } while ((i < src_len) && (encode_mode[i] == encode_mode[posn]));
+ if (i >= src_len) {
+ return 'E';
+ } else {
+ return encode_mode[i];
+ }
+}
+
+static int aztec_text_process(const unsigned char source[], const size_t src_len, char binary_string[], const int gs1, const int eci, const int debug) {
+
+ char *encode_mode;
+ int i, j;
+ char current_mode;
+ int count;
+ char next_mode;
+ char *reduced_source;
+ char *reduced_encode_mode;
+ int reduced_length;
+ int byte_mode = 0;
+
+ encode_mode=(char*)alloca(src_len);
+ reduced_source=(char*)alloca(src_len);
+ reduced_encode_mode=(char*)alloca(src_len);
+
+ if ((!encode_mode) ||
+ (!reduced_source) ||
+ (!reduced_encode_mode)) return -1;
+
+ for (i = 0; i < src_len; i++) {
+ if (source[i] > 128) {
+ encode_mode[i] = 'B';
+ } else {
+ encode_mode[i] = AztecModes[(int) source[i]];
+ }
+ }
+
+ // Deal first with letter combinations which can be combined to one codeword
+ // Combinations are (CR LF) (. SP) (, SP) (: SP) in Punct mode
+ current_mode = 'U';
+ for (i = 0; i < src_len - 1; i++) {
+ // Combination (CR LF) should always be in Punct mode
+ if ((source[i] == 13) && (source[i + 1] == 10)) {
+ encode_mode[i] = 'P';
+ encode_mode[i + 1] = 'P';
+ }
+
+ // Combination (: SP) should always be in Punct mode
+ if ((source[i] == ':') && (source[i + 1] == ' ')) {
+ encode_mode[i + 1] = 'P';
+ }
+
+ // Combinations (. SP) and (, SP) sometimes use fewer bits in Digit mode
+ if (((source[i] == '.') || (source[i] == ',')) && (source[i + 1] == ' ') && (encode_mode[i] == 'X')) {
+ count = count_doubles(source, i, src_len);
+ next_mode = get_next_mode(encode_mode, src_len, i);
+
+ if (current_mode == 'U') {
+ if ((next_mode == 'D') && (count <= 5)) {
+ for (j = 0; j < (2 * count); j++) {
+ encode_mode[i + j] = 'D';
+ }
+ }
+ }
+
+ if (current_mode == 'L') {
+ if ((next_mode == 'U') && (count == 1)) {
+ encode_mode[i] = 'D';
+ encode_mode[i + 1] = 'D';
+ }
+ if ((next_mode == 'D') && (count <= 4)) {
+ for (j = 0; j < (2 * count); j++) {
+ encode_mode[i + j] = 'D';
+ }
+ }
+ }
+
+ if (current_mode == 'M') {
+ if ((next_mode == 'D') && (count == 1)) {
+ encode_mode[i] = 'D';
+ encode_mode[i + 1] = 'D';
+ }
+ }
+
+ if (current_mode == 'D') {
+ if ((next_mode != 'D') && (count <= 4)) {
+ for (j = 0; j < (2 * count); j++) {
+ encode_mode[i + j] = 'D';
+ }
+ }
+ if ((next_mode == 'D') && (count <= 7)) {
+ for (j = 0; j < (2 * count); j++) {
+ encode_mode[i + j] = 'D';
+ }
+ }
+ }
+
+ // Default is Punct mode
+ if (encode_mode[i] == 'X') {
+ encode_mode[i] = 'P';
+ encode_mode[i + 1] = 'P';
+ }
+ }
+
+ if ((encode_mode[i] != 'X') && (encode_mode[i] != 'B')) {
+ current_mode = encode_mode[i];
+ }
+ }
+
+ if (debug) {
+ printf("First Pass:\n");
+ for (i = 0; i < src_len; i++) {
+ printf("%c", encode_mode[i]);
+ }
+ printf("\n");
+ }
+
+ // Reduce two letter combinations to one codeword marked as [abcd] in Punct mode
+ i = 0;
+ j = 0;
+ do {
+ if ((source[i] == 13) && (source[i + 1] == 10)) { // CR LF
+ reduced_source[j] = 'a';
+ reduced_encode_mode[j] = encode_mode[i];
+ i += 2;
+ } else if (((source[i] == '.') && (source[i + 1] == ' ')) && (encode_mode[i] == 'P')) {
+ reduced_source[j] = 'b';
+ reduced_encode_mode[j] = encode_mode[i];
+ i += 2;
+ } else if (((source[i] == ',') && (source[i + 1] == ' ')) && (encode_mode[i] == 'P')) {
+ reduced_source[j] = 'c';
+ reduced_encode_mode[j] = encode_mode[i];
+ i += 2;
+ } else if ((source[i] == ':') && (source[i + 1] == ' ')) {
+ reduced_source[j] = 'd';
+ reduced_encode_mode[j] = encode_mode[i];
+ i += 2;
+ } else {
+ reduced_source[j] = source[i];
+ reduced_encode_mode[j] = encode_mode[i];
+ i++;
+ }
+ j++;
+ } while (i < src_len);
+
+ reduced_length = j;
+
+ current_mode = 'U';
+ for(i = 0; i < reduced_length; i++) {
+
+ // Resolve Carriage Return (CR) which can be Punct or Mixed mode
+ if (reduced_source[i] == 13) {
+ count = count_cr(reduced_source, i, reduced_length);
+ next_mode = get_next_mode(reduced_encode_mode, reduced_length, i);
+
+ if ((current_mode == 'U') && ((next_mode == 'U') || (next_mode == 'B')) && (count == 1)) {
+ reduced_encode_mode[i] = 'P';
+ }
+
+ if ((current_mode == 'L') && ((next_mode == 'L') || (next_mode == 'B')) && (count == 1)) {
+ reduced_encode_mode[i] = 'P';
+ }
+
+ if ((current_mode == 'P') || (next_mode == 'P')) {
+ reduced_encode_mode[i] = 'P';
+ }
+
+ if (current_mode == 'D') {
+ if (((next_mode == 'E') || (next_mode == 'U') || (next_mode == 'D') || (next_mode == 'B')) && (count <= 2)) {
+ for (j = 0; j < count; j++) {
+ reduced_encode_mode[i + j] = 'P';
+ }
+ }
+ if ((next_mode == 'L') && (count == 1)) {
+ reduced_encode_mode[i] = 'P';
+ }
+ }
+
+ // Default is Mixed mode
+ if (reduced_encode_mode[i] == 'X') {
+ reduced_encode_mode[i] = 'M';
+ }
+ }
+
+ // Resolve full stop and comma which can be in Punct or Digit mode
+ if ((reduced_source[i] == '.') || (reduced_source[i] == ',')) {
+ count = count_dotcomma(reduced_source, i, reduced_length);
+ next_mode = get_next_mode(reduced_encode_mode, reduced_length, i);
+
+ if (current_mode == 'U') {
+ if (((next_mode == 'U') || (next_mode == 'L') || (next_mode == 'M') || (next_mode == 'B')) && (count == 1)) {
+ reduced_encode_mode[i] = 'P';
+ }
+ }
+
+ if (current_mode == 'L') {
+ if ((next_mode == 'L') && (count <= 2)) {
+ for (j = 0; j < count; j++) {
+ reduced_encode_mode[i + j] = 'P';
+ }
+ }
+ if (((next_mode == 'M') || (next_mode == 'B')) && (count == 1)) {
+ reduced_encode_mode[i] = 'P';
+ }
+ }
+
+ if (current_mode == 'M') {
+ if (((next_mode == 'E') || (next_mode == 'U') || (next_mode == 'L') || (next_mode == 'M')) && (count <= 4)) {
+ for (j = 0; j < count; j++) {
+ reduced_encode_mode[i + j] = 'P';
+ }
+ }
+ if ((next_mode == 'B') && (count <= 2)) {
+ for (j = 0; j < count; j++) {
+ reduced_encode_mode[i + j] = 'P';
+ }
+ }
+ }
+
+ if ((current_mode == 'P') && (next_mode != 'D') && (count <= 9)) {
+ for (j = 0; j < count; j++) {
+ reduced_encode_mode[i + j] = 'P';
+ }
+ }
+
+ // Default is Digit mode
+ if (reduced_encode_mode[i] == 'X') {
+ reduced_encode_mode[i] = 'D';
+ }
+ }
+
+ // Resolve Space (SP) which can be any mode except Punct
+ if (reduced_source[i] == ' ') {
+ count = count_spaces(reduced_source, i, reduced_length);
+ next_mode = get_next_mode(reduced_encode_mode, reduced_length, i);
+
+ if (current_mode == 'U') {
+ if ((next_mode == 'E') && (count <= 5)) {
+ for (j = 0; j < count; j++) {
+ reduced_encode_mode[i + j] = 'U';
+ }
+ }
+ if (((next_mode == 'U') || (next_mode == 'L') || (next_mode == 'M') || (next_mode == 'P') || (next_mode == 'B')) && (count <= 9)) {
+ for (j = 0; j < count; j++) {
+ reduced_encode_mode[i + j] = 'U';
+ }
+ }
+ }
+
+ if (current_mode == 'L') {
+ if ((next_mode == 'E') && (count <= 5)) {
+ for (j = 0; j < count; j++) {
+ reduced_encode_mode[i + j] = 'L';
+ }
+ }
+ if ((next_mode == 'U') && (count == 1)) {
+ reduced_encode_mode[i] = 'L';
+ }
+ if ((next_mode == 'L') && (count <= 14)) {
+ for (j = 0; j < count; j++) {
+ reduced_encode_mode[i + j] = 'L';
+ }
+ }
+ if (((next_mode == 'M') || (next_mode == 'P') || (next_mode == 'B')) && (count <= 9)) {
+ for (j = 0; j < count; j++) {
+ reduced_encode_mode[i + j] = 'L';
+ }
+ }
+ }
+
+ if (current_mode == 'M') {
+ if (((next_mode == 'E') || (next_mode == 'U')) && (count <= 9)) {
+ for (j = 0; j < count; j++) {
+ reduced_encode_mode[i + j] = 'M';
+ }
+ }
+
+ if (((next_mode == 'L') || (next_mode == 'B')) && (count <= 14)) {
+ for (j = 0; j < count; j++) {
+ reduced_encode_mode[i + j] = 'M';
+ }
+ }
+
+ if (((next_mode == 'M') || (next_mode == 'P')) && (count <= 19)) {
+ for (j = 0; j < count; j++) {
+ reduced_encode_mode[i + j] = 'M';
+ }
+ }
+ }
+
+ if (current_mode == 'P') {
+ if ((next_mode == 'E') && (count <= 5)) {
+ for (j = 0; j < count; j++) {
+ reduced_encode_mode[i + j] = 'U';
+ }
+ }
+
+ if (((next_mode == 'U') || (next_mode == 'L') || (next_mode == 'M') || (next_mode == 'P') || (next_mode == 'B')) && (count <= 9)) {
+ for (j = 0; j < count; j++) {
+ reduced_encode_mode[i + j] = 'U';
+ }
+ }
+ }
+
+ // Default is Digit mode
+ if (reduced_encode_mode[i] == 'X') {
+ reduced_encode_mode[i] = 'D';
+ }
+ }
+
+ if (reduced_encode_mode[i] != 'B') {
+ current_mode = reduced_encode_mode[i];
+ }
+ }
+
+ // Decide when to use P/S instead of P/L and U/S instead of U/L
+ current_mode = 'U';
+ for(i = 0; i < reduced_length; i++) {
+
+ if (reduced_encode_mode[i] != current_mode) {
+
+ for (count = 0; ((i + count) <= reduced_length) && (reduced_encode_mode[i + count] == reduced_encode_mode[i]); count++);
+ next_mode = get_next_mode(reduced_encode_mode, reduced_length, i);
+
+ if (reduced_encode_mode[i] == 'P') {
+ if ((current_mode == 'U') && (count <= 2)) {
+ for (j = 0; j < count; j++) {
+ reduced_encode_mode[i + j] = 'p';
+ }
+ }
+
+ if ((current_mode == 'L') && (next_mode != 'U') && (count <= 2)) {
+ for (j = 0; j < count; j++) {
+ reduced_encode_mode[i + j] = 'p';
+ }
+ }
+
+ if ((current_mode == 'L') && (next_mode == 'U') && (count == 1)) {
+ reduced_encode_mode[i] = 'p';
+ }
+
+ if ((current_mode == 'M') && (next_mode != 'M') && (count == 1)) {
+ reduced_encode_mode[i] = 'p';
+ }
+
+ if ((current_mode == 'M') && (next_mode == 'M') && (count <= 2)) {
+ for (j = 0; j < count; j++) {
+ reduced_encode_mode[i + j] = 'p';
+ }
+ }
+
+ if ((current_mode == 'D') && (next_mode != 'D') && (count <= 3)) {
+ for (j = 0; j < count; j++) {
+ reduced_encode_mode[i + j] = 'p';
+ }
+ }
+
+ if ((current_mode == 'D') && (next_mode == 'D') && (count <= 6)) {
+ for (j = 0; j < count; j++) {
+ reduced_encode_mode[i + j] = 'p';
+ }
+ }
+ }
+
+ if (reduced_encode_mode[i] == 'U') {
+ if ((current_mode == 'L') && ((next_mode == 'L') || (next_mode == 'M')) && (count <= 2)) {
+ for (j = 0; j < count; j++) {
+ reduced_encode_mode[i + j] = 'u';
+ }
+ }
+
+ if ((current_mode == 'L') && ((next_mode == 'E') || (next_mode == 'D') || (next_mode == 'B') || (next_mode == 'P')) && (count == 1)) {
+ reduced_encode_mode[i] = 'u';
+ }
+
+ if ((current_mode == 'D') && (next_mode == 'D') && (count == 1)) {
+ reduced_encode_mode[i] = 'u';
+ }
+
+ if ((current_mode == 'D') && (next_mode == 'P') && (count <= 2)) {
+ for (j = 0; j < count; j++) {
+ reduced_encode_mode[i + j] = 'u';
+ }
+ }
+ }
+ }
+
+ if ((reduced_encode_mode[i] != 'p') && (reduced_encode_mode[i] != 'u') && (reduced_encode_mode[i] != 'B')) {
+ current_mode = reduced_encode_mode[i];
+ }
+ }
+
+ if (debug) {
+ for (i = 0; i < reduced_length; i++) {
+ printf("%c", reduced_source[i]);
+ }
+ printf("\n");
+ for (i = 0; i < reduced_length; i++) {
+ printf("%c", reduced_encode_mode[i]);
+ }
+ printf("\n");
+ }
+
+ strcpy(binary_string, "");
+
+ if (gs1) {
+ bin_append(0, 5, binary_string); // P/S
+ bin_append(0, 5, binary_string); // FLG(n)
+ bin_append(0, 3, binary_string); // FLG(0)
+ }
+
+ if (eci != 3) {
+ bin_append(0, 5, binary_string); // P/S
+ bin_append(0, 5, binary_string); // FLG(n)
+ if (eci < 10) {
+ bin_append(1, 3, binary_string); // FLG(1)
+ bin_append(2 + eci, 4, binary_string);
+ }
+ if ((eci >= 10) && (eci <= 99)) {
+ bin_append(2, 3, binary_string); // FLG(2)
+ bin_append(2 + (eci / 10), 4, binary_string);
+ bin_append(2 + (eci % 10), 4, binary_string);
+ }
+ if ((eci >= 100) && (eci <= 999)) {
+ bin_append(3, 3, binary_string); // FLG(3)
+ bin_append(2 + (eci / 100), 4, binary_string);
+ bin_append(2 + ((eci % 100) / 10), 4, binary_string);
+ bin_append(2 + (eci % 10), 4, binary_string);
+ }
+ if ((eci >= 1000) && (eci <= 9999)) {
+ bin_append(4, 3, binary_string); // FLG(4)
+ bin_append(2 + (eci / 1000), 4, binary_string);
+ bin_append(2 + ((eci % 1000) / 100), 4, binary_string);
+ bin_append(2 + ((eci % 100) / 10), 4, binary_string);
+ bin_append(2 + (eci % 10), 4, binary_string);
+ }
+ if ((eci >= 10000) && (eci <= 99999)) {
+ bin_append(5, 3, binary_string); // FLG(5)
+ bin_append(2 + (eci / 10000), 4, binary_string);
+ bin_append(2 + ((eci % 10000) / 1000), 4, binary_string);
+ bin_append(2 + ((eci % 1000) / 100), 4, binary_string);
+ bin_append(2 + ((eci % 100) / 10), 4, binary_string);
+ bin_append(2 + (eci % 10), 4, binary_string);
+ }
+ if (eci >= 100000) {
+ bin_append(6, 3, binary_string); // FLG(6)
+ bin_append(2 + (eci / 100000), 4, binary_string);
+ bin_append(2 + ((eci % 100000) / 10000), 4, binary_string);
+ bin_append(2 + ((eci % 10000) / 1000), 4, binary_string);
+ bin_append(2 + ((eci % 1000) / 100), 4, binary_string);
+ bin_append(2 + ((eci % 100) / 10), 4, binary_string);
+ bin_append(2 + (eci % 10), 4, binary_string);
+ }
+ }
+
+ current_mode = 'U';
+ for(i = 0; i < reduced_length; i++) {
+ if (reduced_encode_mode[i] != current_mode) {
+ // Change mode
+ if (current_mode == 'U') {
+ switch (reduced_encode_mode[i]) {
+ case 'L':
+ bin_append(28, 5, binary_string); // L/L
+ break;
+ case 'M':
+ bin_append(29, 5, binary_string); // M/L
+ break;
+ case 'P':
+ bin_append(29, 5, binary_string); // M/L
+ bin_append(30, 5, binary_string); // P/L
+ break;
+ case 'p':
+ bin_append(0, 5, binary_string); // P/S
+ break;
+ case 'D':
+ bin_append(30, 5, binary_string); // D/L
+ break;
+ case 'B':
+ bin_append(31, 5, binary_string); // B/S
+ break;
+ }
+ }
+
+ if (current_mode == 'L') {
+ switch (reduced_encode_mode[i]) {
+ case 'U':
+ bin_append(30, 5, binary_string); // D/L
+ bin_append(14, 4, binary_string); // U/L
+ break;
+ case 'u':
+ bin_append(28, 5, binary_string); // U/S
+ break;
+ case 'M':
+ bin_append(29, 5, binary_string); // M/L
+ break;
+ case 'P':
+ bin_append(30, 5, binary_string); // P/L
+ break;
+ case 'p':
+ bin_append(0, 5, binary_string); // P/S
+ break;
+ case 'D':
+ bin_append(30, 5, binary_string); // D/L
+ break;
+ case 'B':
+ bin_append(31, 5, binary_string); // B/S
+ break;
+ }
+ }
+
+ if (current_mode == 'M') {
+ switch (reduced_encode_mode[i]) {
+ case 'U':
+ bin_append(29, 5, binary_string); // U/L
+ break;
+ case 'L':
+ bin_append(28, 5, binary_string); // L/L
+ break;
+ case 'P':
+ bin_append(30, 5, binary_string); // P/L
+ break;
+ case 'p':
+ bin_append(0, 5, binary_string); // P/S
+ break;
+ case 'D':
+ bin_append(29, 5, binary_string); // U/L
+ bin_append(30, 5, binary_string); // D/L
+ break;
+ case 'B':
+ bin_append(31, 5, binary_string); // B/S
+ break;
+ }
+ }
+
+ if (current_mode == 'P') {
+ switch (reduced_encode_mode[i]) {
+ case 'U':
+ bin_append(31, 5, binary_string); // U/L
+ break;
+ case 'L':
+ bin_append(31, 5, binary_string); // U/L
+ bin_append(28, 5, binary_string); // L/L
+ break;
+ case 'M':
+ bin_append(31, 5, binary_string); // U/L
+ bin_append(29, 5, binary_string); // M/L
+ break;
+ case 'D':
+ bin_append(31, 5, binary_string); // U/L
+ bin_append(30, 5, binary_string); // D/L
+ break;
+ case 'B':
+ bin_append(31, 5, binary_string); // U/L
+ current_mode = 'U';
+ bin_append(31, 5, binary_string); // B/S
+ break;
+ }
+ }
+
+ if (current_mode == 'D') {
+ switch (reduced_encode_mode[i]) {
+ case 'U':
+ bin_append(14, 4, binary_string); // U/L
+ break;
+ case 'u':
+ bin_append(15, 4, binary_string); // U/S
+ break;
+ case 'L':
+ bin_append(14, 4, binary_string); // U/L
+ bin_append(28, 5, binary_string); // L/L
+ break;
+ case 'M':
+ bin_append(14, 4, binary_string); // U/L
+ bin_append(29, 5, binary_string); // M/L
+ break;
+ case 'P':
+ bin_append(14, 4, binary_string); // U/L
+ bin_append(29, 5, binary_string); // M/L
+ bin_append(30, 5, binary_string); // P/L
+ break;
+ case 'p':
+ bin_append(0, 4, binary_string); // P/S
+ break;
+ case 'B':
+ bin_append(14, 4, binary_string); // U/L
+ current_mode = 'U';
+ bin_append(31, 5, binary_string); // B/S
+ break;
+ }
+ }
+
+ // Byte mode length descriptor
+ if ((reduced_encode_mode[i] == 'B') && (!byte_mode)) {
+ for (count = 0; ((i + count) < reduced_length) && (reduced_encode_mode[i] == 'B'); count++);
+
+ if (count > 2079) {
+ return ZINT_ERROR_TOO_LONG;
+ }
+
+ if (count > 31) {
+ /* Put 00000 followed by 11-bit number of bytes less 31 */
+ bin_append(0, 5, binary_string);
+ bin_append(count - 31, 11, binary_string);
+ } else {
+ /* Put 5-bit number of bytes */
+ bin_append(count, 5, binary_string);
+ }
+ byte_mode = 1;
+ }
+
+ if ((reduced_encode_mode[i] != 'B') && byte_mode) {
+ byte_mode = 0;
+ }
+
+ if ((reduced_encode_mode[i] != 'B') && (reduced_encode_mode[i] != 'u') && (reduced_encode_mode[i] != 'p')) {
+ current_mode = reduced_encode_mode[i];
+ }
+ }
+
+ if ((reduced_encode_mode[i] == 'U') || (reduced_encode_mode[i] == 'u')) {
+ if (reduced_source[i] == ' ') {
+ bin_append(1, 5, binary_string); // SP
+ } else {
+ bin_append(AztecSymbolChar[(int) reduced_source[i]], 5, binary_string);
+ }
+ }
+
+ if (reduced_encode_mode[i] == 'L') {
+ if (reduced_source[i] == ' ') {
+ bin_append(1, 5, binary_string); // SP
+ } else {
+ bin_append(AztecSymbolChar[(int) reduced_source[i]], 5, binary_string);
+ }
+ }
+
+ if (reduced_encode_mode[i] == 'M') {
+ if (reduced_source[i] == ' ') {
+ bin_append(1, 5, binary_string); // SP
+ } else if (reduced_source[i] == 13) {
+ bin_append(14, 5, binary_string); // CR
+ } else {
+ bin_append(AztecSymbolChar[(int) reduced_source[i]], 5, binary_string);
+ }
+ }
+
+ if ((reduced_encode_mode[i] == 'P') || (reduced_encode_mode[i] == 'p')) {
+ if (gs1 && (reduced_source[i] == '[')) {
+ bin_append(0, 5, binary_string); // FLG(0) = FNC1
+ } else if (reduced_source[i] == 13) {
+ bin_append(1, 5, binary_string); // CR
+ } else if (reduced_source[i] == 'a') {
+ bin_append(2, 5, binary_string); // CR LF
+ } else if (reduced_source[i] == 'b') {
+ bin_append(3, 5, binary_string); // . SP
+ } else if (reduced_source[i] == 'c') {
+ bin_append(4, 5, binary_string); // , SP
+ } else if (reduced_source[i] == 'd') {
+ bin_append(5, 5, binary_string); // : SP
+ } else if (reduced_source[i] == ',') {
+ bin_append(17, 5, binary_string); // Comma
+ } else if (reduced_source[i] == '.') {
+ bin_append(19, 5, binary_string); // Full stop
+ } else {
+ bin_append(AztecSymbolChar[(int) reduced_source[i]], 5, binary_string);
+ }
+ }
+
+ if (reduced_encode_mode[i] == 'D') {
+ if (reduced_source[i] == ' ') {
+ bin_append(1, 4, binary_string); // SP
+ } else if (reduced_source[i] == ',') {
+ bin_append(12, 4, binary_string); // Comma
+ } else if (reduced_source[i] == '.') {
+ bin_append(13, 4, binary_string); // Full stop
+ } else {
+ bin_append(AztecSymbolChar[(int) reduced_source[i]], 4, binary_string);
+ }
+ }
+
+ if (reduced_encode_mode[i] == 'B') {
+ bin_append(reduced_source[i], 8, binary_string);
+ }
+ }
+
+ if (debug) {
+ printf("Binary String:\n");
+ printf("%s\n", binary_string);
+ }
+
+ return 0;
+}
+
+/* Prevent data from obscuring reference grid */
+static int avoidReferenceGrid(int output) {
+
+ if (output > 10) {
+ output++;
+ }
+ if (output > 26) {
+ output++;
+ }
+ if (output > 42) {
+ output++;
+ }
+ if (output > 58) {
+ output++;
+ }
+ if (output > 74) {
+ output++;
+ }
+ if (output > 90) {
+ output++;
+ }
+ if (output > 106) {
+ output++;
+ }
+ if (output > 122) {
+ output++;
+ }
+ if (output > 138) {
+ output++;
+ }
+
+ return output;
+}
+
+/* Calculate the position of the bits in the grid */
+static void populate_map() {
+ int layer, start, length, n, i;
+ int x, y;
+
+ for (x = 0; x < 151; x++) {
+ for (y = 0; y < 151; y++) {
+ AztecMap[(x * 151) + y] = 0;
+ }
+ }
+
+ for (layer = 1; layer < 33; layer++) {
+ start = (112 * (layer - 1)) + (16 * (layer - 1) * (layer - 1)) + 2;
+ length = 28 + ((layer - 1) * 4) + (layer * 4);
+ /* Top */
+ i = 0;
+ x = 64 - ((layer - 1) * 2);
+ y = 63 - ((layer - 1) * 2);
+ for (n = start; n < (start + length); n += 2) {
+ AztecMap[(avoidReferenceGrid(x + i) * 151) + avoidReferenceGrid(y)] = n;
+ AztecMap[(avoidReferenceGrid(x + i) * 151) + avoidReferenceGrid(y - 1)] = n + 1;
+ i++;
+ }
+ /* Right */
+ i = 0;
+ x = 78 + ((layer - 1) * 2);
+ y = 64 - ((layer - 1) * 2);
+ for (n = start + length; n < (start + (length * 2)); n += 2) {
+ AztecMap[(avoidReferenceGrid(x) * 151) + avoidReferenceGrid(y + i)] = n;
+ AztecMap[(avoidReferenceGrid(x + 1) * 151) + avoidReferenceGrid(y + i)] = n + 1;
+ i++;
+ }
+ /* Bottom */
+ i = 0;
+ x = 77 + ((layer - 1) * 2);
+ y = 78 + ((layer - 1) * 2);
+ for (n = start + (length * 2); n < (start + (length * 3)); n += 2) {
+ AztecMap[(avoidReferenceGrid(x - i) * 151) + avoidReferenceGrid(y)] = n;
+ AztecMap[(avoidReferenceGrid(x - i) * 151) + avoidReferenceGrid(y + 1)] = n + 1;
+ i++;
+ }
+ /* Left */
+ i = 0;
+ x = 63 - ((layer - 1) * 2);
+ y = 77 + ((layer - 1) * 2);
+ for (n = start + (length * 3); n < (start + (length * 4)); n += 2) {
+ AztecMap[(avoidReferenceGrid(x) * 151) + avoidReferenceGrid(y - i)] = n;
+ AztecMap[(avoidReferenceGrid(x - 1) * 151) + avoidReferenceGrid(y - i)] = n + 1;
+ i++;
+ }
+ }
+
+ /* Central finder pattern */
+ for (y = 69; y <= 81; y++) {
+ for (x = 69; x <= 81; x++) {
+ AztecMap[(x * 151) + y] = 1;
+ }
+ }
+ for (y = 70; y <= 80; y++) {
+ for (x = 70; x <= 80; x++) {
+ AztecMap[(x * 151) + y] = 0;
+ }
+ }
+ for (y = 71; y <= 79; y++) {
+ for (x = 71; x <= 79; x++) {
+ AztecMap[(x * 151) + y] = 1;
+ }
+ }
+ for (y = 72; y <= 78; y++) {
+ for (x = 72; x <= 78; x++) {
+ AztecMap[(x * 151) + y] = 0;
+ }
+ }
+ for (y = 73; y <= 77; y++) {
+ for (x = 73; x <= 77; x++) {
+ AztecMap[(x * 151) + y] = 1;
+ }
+ }
+ for (y = 74; y <= 76; y++) {
+ for (x = 74; x <= 76; x++) {
+ AztecMap[(x * 151) + y] = 0;
+ }
+ }
+
+ /* Guide bars */
+ for (y = 11; y < 151; y += 16) {
+ for (x = 1; x < 151; x += 2) {
+ AztecMap[(x * 151) + y] = 1;
+ AztecMap[(y * 151) + x] = 1;
+ }
+ }
+
+ /* Descriptor */
+ for (i = 0; i < 10; i++) {
+ /* Top */
+ AztecMap[(avoidReferenceGrid(66 + i) * 151) + avoidReferenceGrid(64)] = 20000 + i;
+ }
+ for (i = 0; i < 10; i++) {
+ /* Right */
+ AztecMap[(avoidReferenceGrid(77) * 151) + avoidReferenceGrid(66 + i)] = 20010 + i;
+ }
+ for (i = 0; i < 10; i++) {
+ /* Bottom */
+ AztecMap[(avoidReferenceGrid(75 - i) * 151) + avoidReferenceGrid(77)] = 20020 + i;
+ }
+ for (i = 0; i < 10; i++) {
+ /* Left */
+ AztecMap[(avoidReferenceGrid(64) * 151) + avoidReferenceGrid(75 - i)] = 20030 + i;
+ }
+
+ /* Orientation */
+ AztecMap[(avoidReferenceGrid(64) * 151) + avoidReferenceGrid(64)] = 1;
+ AztecMap[(avoidReferenceGrid(65) * 151) + avoidReferenceGrid(64)] = 1;
+ AztecMap[(avoidReferenceGrid(64) * 151) + avoidReferenceGrid(65)] = 1;
+ AztecMap[(avoidReferenceGrid(77) * 151) + avoidReferenceGrid(64)] = 1;
+ AztecMap[(avoidReferenceGrid(77) * 151) + avoidReferenceGrid(65)] = 1;
+ AztecMap[(avoidReferenceGrid(77) * 151) + avoidReferenceGrid(76)] = 1;
+}
+
+int aztec(struct zint_symbol *symbol, unsigned char source[], const size_t length) {
+ int x, y, i, j, p, data_blocks, ecc_blocks, layers, total_bits;
+ char binary_string[20000], bit_pattern[20045], descriptor[42];
+ char adjusted_string[20000];
+ unsigned char desc_data[4], desc_ecc[6];
+ int err_code, ecc_level, compact, data_length, data_maxsize, codeword_size, adjusted_length;
+ int remainder, padbits, count, gs1, adjustment_size;
+ int debug = symbol->debug, reader = 0;
+ int comp_loop = 4;
+
+#ifdef _MSC_VER
+ unsigned int* data_part;
+ unsigned int* ecc_part;
+#endif
+
+ memset(binary_string, 0, 20000);
+ memset(adjusted_string, 0, 20000);
+
+ if (symbol->input_mode == GS1_MODE) {
+ gs1 = 1;
+ } else {
+ gs1 = 0;
+ }
+ if (symbol->output_options & READER_INIT) {
+ reader = 1;
+ comp_loop = 1;
+ }
+ if (gs1 && reader) {
+ strcpy(symbol->errtxt, "501: Cannot encode in GS1 and Reader Initialisation mode at the same time");
+ return ZINT_ERROR_INVALID_OPTION;
+ }
+
+ populate_map();
+
+ err_code = aztec_text_process(source, length, binary_string, gs1, symbol->eci, symbol->debug);
+
+ if (err_code != 0) {
+ strcpy(symbol->errtxt, "502: Input too long or too many extended ASCII characters");
+ return err_code;
+ }
+
+ if (!((symbol->option_1 >= -1) && (symbol->option_1 <= 4))) {
+ strcpy(symbol->errtxt, "503: Invalid error correction level - using default instead");
+ err_code = ZINT_WARN_INVALID_OPTION;
+ symbol->option_1 = -1;
+ }
+
+ ecc_level = symbol->option_1;
+
+ if ((ecc_level == -1) || (ecc_level == 0)) {
+ ecc_level = 2;
+ }
+
+ data_length = (int) strlen(binary_string);
+
+ layers = 0; /* Keep compiler happy! */
+ data_maxsize = 0; /* Keep compiler happy! */
+ adjustment_size = 0;
+ if (symbol->option_2 == 0) { /* The size of the symbol can be determined by Zint */
+ do {
+ /* Decide what size symbol to use - the smallest that fits the data */
+ compact = 0; /* 1 = Aztec Compact, 0 = Normal Aztec */
+ layers = 0;
+
+ switch (ecc_level) {
+ /* For each level of error correction work out the smallest symbol which
+ the data will fit in */
+ case 1: for (i = 32; i > 0; i--) {
+ if ((data_length + adjustment_size) < Aztec10DataSizes[i - 1]) {
+ layers = i;
+ compact = 0;
+ data_maxsize = Aztec10DataSizes[i - 1];
+ }
+ }
+ for (i = comp_loop; i > 0; i--) {
+ if ((data_length + adjustment_size) < AztecCompact10DataSizes[i - 1]) {
+ layers = i;
+ compact = 1;
+ data_maxsize = AztecCompact10DataSizes[i - 1];
+ }
+ }
+ break;
+ case 2: for (i = 32; i > 0; i--) {
+ if ((data_length + adjustment_size) < Aztec23DataSizes[i - 1]) {
+ layers = i;
+ compact = 0;
+ data_maxsize = Aztec23DataSizes[i - 1];
+ }
+ }
+ for (i = comp_loop; i > 0; i--) {
+ if ((data_length + adjustment_size) < AztecCompact23DataSizes[i - 1]) {
+ layers = i;
+ compact = 1;
+ data_maxsize = AztecCompact23DataSizes[i - 1];
+ }
+ }
+ break;
+ case 3: for (i = 32; i > 0; i--) {
+ if ((data_length + adjustment_size) < Aztec36DataSizes[i - 1]) {
+ layers = i;
+ compact = 0;
+ data_maxsize = Aztec36DataSizes[i - 1];
+ }
+ }
+ for (i = comp_loop; i > 0; i--) {
+ if ((data_length + adjustment_size) < AztecCompact36DataSizes[i - 1]) {
+ layers = i;
+ compact = 1;
+ data_maxsize = AztecCompact36DataSizes[i - 1];
+ }
+ }
+ break;
+ case 4: for (i = 32; i > 0; i--) {
+ if ((data_length + adjustment_size) < Aztec50DataSizes[i - 1]) {
+ layers = i;
+ compact = 0;
+ data_maxsize = Aztec50DataSizes[i - 1];
+ }
+ }
+ for (i = comp_loop; i > 0; i--) {
+ if ((data_length + adjustment_size) < AztecCompact50DataSizes[i - 1]) {
+ layers = i;
+ compact = 1;
+ data_maxsize = AztecCompact50DataSizes[i - 1];
+ }
+ }
+ break;
+ }
+
+ if (layers == 0) { /* Couldn't find a symbol which fits the data */
+ strcpy(symbol->errtxt, "504: Input too long (too many bits for selected ECC)");
+ return ZINT_ERROR_TOO_LONG;
+ }
+
+ /* Determine codeword bitlength - Table 3 */
+ codeword_size = 6; /* if (layers <= 2) */
+ if ((layers >= 3) && (layers <= 8)) {
+ codeword_size = 8;
+ }
+ if ((layers >= 9) && (layers <= 22)) {
+ codeword_size = 10;
+ }
+ if (layers >= 23) {
+ codeword_size = 12;
+ }
+
+ j = 0;
+ i = 0;
+ do {
+ if ((j + 1) % codeword_size == 0) {
+ /* Last bit of codeword */
+ int t, done = 0;
+ count = 0;
+
+ /* Discover how many '1's in current codeword */
+ for (t = 0; t < (codeword_size - 1); t++) {
+ if (binary_string[(i - (codeword_size - 1)) + t] == '1') count++;
+ }
+
+ if (count == (codeword_size - 1)) {
+ adjusted_string[j] = '0';
+ j++;
+ done = 1;
+ }
+
+ if (count == 0) {
+ adjusted_string[j] = '1';
+ j++;
+ done = 1;
+ }
+
+ if (done == 0) {
+ adjusted_string[j] = binary_string[i];
+ j++;
+ i++;
+ }
+ }
+ adjusted_string[j] = binary_string[i];
+ j++;
+ i++;
+ } while (i <= (data_length + 1));
+ adjusted_string[j] = '\0';
+ adjusted_length = (int) strlen(adjusted_string);
+ adjustment_size = adjusted_length - data_length;
+
+ /* Add padding */
+ remainder = adjusted_length % codeword_size;
+
+ padbits = codeword_size - remainder;
+ if (padbits == codeword_size) {
+ padbits = 0;
+ }
+
+ for (i = 0; i < padbits; i++) {
+ strcat(adjusted_string, "1");
+ }
+ adjusted_length = (int) strlen(adjusted_string);
+
+ count = 0;
+ for (i = (adjusted_length - codeword_size); i < adjusted_length; i++) {
+ if (adjusted_string[i] == '1') {
+ count++;
+ }
+ }
+ if (count == codeword_size) {
+ adjusted_string[adjusted_length - 1] = '0';
+ }
+
+ if (debug) {
+ printf("Codewords:\n");
+ for (i = 0; i < (adjusted_length / codeword_size); i++) {
+ for (j = 0; j < codeword_size; j++) {
+ printf("%c", adjusted_string[(i * codeword_size) + j]);
+ }
+ printf("\n");
+ }
+ }
+
+ } while (adjusted_length > data_maxsize);
+ /* This loop will only repeat on the rare occasions when the rule about not having all 1s or all 0s
+ means that the binary string has had to be lengthened beyond the maximum number of bits that can
+ be encoded in a symbol of the selected size */
+
+ } else { /* The size of the symbol has been specified by the user */
+ if ((reader == 1) && ((symbol->option_2 >= 2) && (symbol->option_2 <= 4))) {
+ symbol->option_2 = 5;
+ }
+ if ((symbol->option_2 >= 1) && (symbol->option_2 <= 4)) {
+ compact = 1;
+ layers = symbol->option_2;
+ }
+ if ((symbol->option_2 >= 5) && (symbol->option_2 <= 36)) {
+ compact = 0;
+ layers = symbol->option_2 - 4;
+ }
+ if ((symbol->option_2 < 0) || (symbol->option_2 > 36)) {
+ strcpy(symbol->errtxt, "510: Invalid Aztec Code size");
+ return ZINT_ERROR_INVALID_OPTION;
+ }
+
+ /* Determine codeword bitlength - Table 3 */
+ if ((layers >= 0) && (layers <= 2)) {
+ codeword_size = 6;
+ }
+ if ((layers >= 3) && (layers <= 8)) {
+ codeword_size = 8;
+ }
+ if ((layers >= 9) && (layers <= 22)) {
+ codeword_size = 10;
+ }
+ if (layers >= 23) {
+ codeword_size = 12;
+ }
+
+ j = 0;
+ i = 0;
+ do {
+ if ((j + 1) % codeword_size == 0) {
+ /* Last bit of codeword */
+ int t, done = 0;
+ count = 0;
+
+ /* Discover how many '1's in current codeword */
+ for (t = 0; t < (codeword_size - 1); t++) {
+ if (binary_string[(i - (codeword_size - 1)) + t] == '1') count++;
+ }
+
+ if (count == (codeword_size - 1)) {
+ adjusted_string[j] = '0';
+ j++;
+ done = 1;
+ }
+
+ if (count == 0) {
+ adjusted_string[j] = '1';
+ j++;
+ done = 1;
+ }
+
+ if (done == 0) {
+ adjusted_string[j] = binary_string[i];
+ j++;
+ i++;
+ }
+ }
+ adjusted_string[j] = binary_string[i];
+ j++;
+ i++;
+ } while (i <= (data_length + 1));
+ adjusted_string[j] = '\0';
+ adjusted_length = (int) strlen(adjusted_string);
+
+ remainder = adjusted_length % codeword_size;
+
+ padbits = codeword_size - remainder;
+ if (padbits == codeword_size) {
+ padbits = 0;
+ }
+
+ for (i = 0; i < padbits; i++) {
+ strcat(adjusted_string, "1");
+ }
+ adjusted_length = (int) strlen(adjusted_string);
+
+ count = 0;
+ for (i = (adjusted_length - codeword_size); i < adjusted_length; i++) {
+ if (adjusted_string[i] == '1') {
+ count++;
+ }
+ }
+ if (count == codeword_size) {
+ adjusted_string[adjusted_length - 1] = '0';
+ }
+
+ /* Check if the data actually fits into the selected symbol size */
+ if (compact) {
+ data_maxsize = codeword_size * (AztecCompactSizes[layers - 1] - 3);
+ } else {
+ data_maxsize = codeword_size * (AztecSizes[layers - 1] - 3);
+ }
+
+ if (adjusted_length > data_maxsize) {
+ strcpy(symbol->errtxt, "505: Data too long for specified Aztec Code symbol size");
+ return ZINT_ERROR_TOO_LONG;
+ }
+
+ if (debug) {
+ printf("Codewords:\n");
+ for (i = 0; i < (adjusted_length / codeword_size); i++) {
+ for (j = 0; j < codeword_size; j++) {
+ printf("%c", adjusted_string[(i * codeword_size) + j]);
+ }
+ printf("\n");
+ }
+ }
+
+ }
+
+ if (reader && (layers > 22)) {
+ strcpy(symbol->errtxt, "506: Data too long for reader initialisation symbol");
+ return ZINT_ERROR_TOO_LONG;
+ }
+
+ data_blocks = adjusted_length / codeword_size;
+
+ if (compact) {
+ ecc_blocks = AztecCompactSizes[layers - 1] - data_blocks;
+ } else {
+ ecc_blocks = AztecSizes[layers - 1] - data_blocks;
+ }
+
+ if (debug) {
+ printf("Generating a ");
+ if (compact) {
+ printf("compact");
+ } else {
+ printf("full-size");
+ }
+ printf(" symbol with %d layers\n", layers);
+ printf("Requires ");
+ if (compact) {
+ printf("%d", AztecCompactSizes[layers - 1]);
+ } else {
+ printf("%d", AztecSizes[layers - 1]);
+ }
+ printf(" codewords of %d-bits\n", codeword_size);
+ printf(" (%d data words, %d ecc words)\n", data_blocks, ecc_blocks);
+ }
+
+#ifndef _MSC_VER
+ unsigned int data_part[data_blocks + 3], ecc_part[ecc_blocks + 3];
+#else
+ data_part = (unsigned int*) _alloca((data_blocks + 3) * sizeof (unsigned int));
+ ecc_part = (unsigned int*) _alloca((ecc_blocks + 3) * sizeof (unsigned int));
+#endif
+ /* Copy across data into separate integers */
+ memset(data_part, 0, (data_blocks + 2) * sizeof (int));
+ memset(ecc_part, 0, (ecc_blocks + 2) * sizeof (int));
+
+ /* Split into codewords and calculate reed-solomon error correction codes */
+ for (i = 0; i < data_blocks; i++) {
+ for (p = 0; p < codeword_size; p++) {
+ if (adjusted_string[i * codeword_size + p] == '1') {
+ data_part[i] += 0x01 << (codeword_size - (p + 1));
+ }
+ }
+ }
+
+ switch (codeword_size) {
+ case 6:
+ rs_init_gf(0x43);
+ break;
+ case 8:
+ rs_init_gf(0x12d);
+ break;
+ case 10:
+ rs_init_gf(0x409);
+ break;
+ case 12:
+ rs_init_gf(0x1069);
+ break;
+ }
+
+ rs_init_code(ecc_blocks, 1);
+ rs_encode_long(data_blocks, data_part, ecc_part);
+ for (i = (ecc_blocks - 1); i >= 0; i--) {
+ bin_append(ecc_part[i], codeword_size, adjusted_string);
+ }
+ rs_free();
+
+ /* Invert the data so that actual data is on the outside and reed-solomon on the inside */
+ memset(bit_pattern, '0', 20045);
+
+ total_bits = (data_blocks + ecc_blocks) * codeword_size;
+ for (i = 0; i < total_bits; i++) {
+ bit_pattern[i] = adjusted_string[total_bits - i - 1];
+ }
+
+ /* Now add the symbol descriptor */
+ memset(desc_data, 0, 4);
+ memset(desc_ecc, 0, 6);
+ memset(descriptor, 0, 42);
+
+ if (compact) {
+ /* The first 2 bits represent the number of layers minus 1 */
+ if ((layers - 1) & 0x02) {
+ descriptor[0] = '1';
+ } else {
+ descriptor[0] = '0';
+ }
+ if ((layers - 1) & 0x01) {
+ descriptor[1] = '1';
+ } else {
+ descriptor[1] = '0';
+ }
+ /* The next 6 bits represent the number of data blocks minus 1 */
+ if (reader) {
+ descriptor[2] = '1';
+ } else {
+ if ((data_blocks - 1) & 0x20) {
+ descriptor[2] = '1';
+ } else {
+ descriptor[2] = '0';
+ }
+ }
+
+ for (i = 3; i < 8; i++) {
+ if ((data_blocks - 1) & (0x10 >> (i - 3))) {
+ descriptor[i] = '1';
+ } else {
+ descriptor[i] = '0';
+ }
+ }
+
+ descriptor[8] = '\0';
+ if (debug) printf("Mode Message = %s\n", descriptor);
+ } else {
+ /* The first 5 bits represent the number of layers minus 1 */
+ for (i = 0; i < 5; i++) {
+ if ((layers - 1) & (0x10 >> i)) {
+ descriptor[i] = '1';
+ } else {
+ descriptor[i] = '0';
+ }
+ }
+
+ /* The next 11 bits represent the number of data blocks minus 1 */
+ if (reader) {
+ descriptor[5] = '1';
+ } else {
+ if ((data_blocks - 1) & 0x400) {
+ descriptor[5] = '1';
+ } else {
+ descriptor[5] = '0';
+ }
+ }
+ for (i = 6; i < 16; i++) {
+ if ((data_blocks - 1) & (0x200 >> (i - 6))) {
+ descriptor[i] = '1';
+ } else {
+ descriptor[i] = '0';
+ }
+ }
+ descriptor[16] = '\0';
+ if (debug) printf("Mode Message = %s\n", descriptor);
+ }
+
+ /* Split into 4-bit codewords */
+ for (i = 0; i < 4; i++) {
+ if (descriptor[i * 4] == '1') {
+ desc_data[i] += 8;
+ }
+ if (descriptor[(i * 4) + 1] == '1') {
+ desc_data[i] += 4;
+ }
+ if (descriptor[(i * 4) + 2] == '1') {
+ desc_data[i] += 2;
+ }
+ if (descriptor[(i * 4) + 3] == '1') {
+ desc_data[i] += 1;
+ }
+ }
+
+ /* Add reed-solomon error correction with Galois field GF(16) and prime modulus
+ x^4 + x + 1 (section 7.2.3)*/
+
+ rs_init_gf(0x13);
+ if (compact) {
+ rs_init_code(5, 1);
+ rs_encode(2, desc_data, desc_ecc);
+ for (i = 0; i < 5; i++) {
+ if (desc_ecc[4 - i] & 0x08) {
+ descriptor[(i * 4) + 8] = '1';
+ } else {
+ descriptor[(i * 4) + 8] = '0';
+ }
+ if (desc_ecc[4 - i] & 0x04) {
+ descriptor[(i * 4) + 9] = '1';
+ } else {
+ descriptor[(i * 4) + 9] = '0';
+ }
+ if (desc_ecc[4 - i] & 0x02) {
+ descriptor[(i * 4) + 10] = '1';
+ } else {
+ descriptor[(i * 4) + 10] = '0';
+ }
+ if (desc_ecc[4 - i] & 0x01) {
+ descriptor[(i * 4) + 11] = '1';
+ } else {
+ descriptor[(i * 4) + 11] = '0';
+ }
+ }
+ } else {
+ rs_init_code(6, 1);
+ rs_encode(4, desc_data, desc_ecc);
+ for (i = 0; i < 6; i++) {
+ if (desc_ecc[5 - i] & 0x08) {
+ descriptor[(i * 4) + 16] = '1';
+ } else {
+ descriptor[(i * 4) + 16] = '0';
+ }
+ if (desc_ecc[5 - i] & 0x04) {
+ descriptor[(i * 4) + 17] = '1';
+ } else {
+ descriptor[(i * 4) + 17] = '0';
+ }
+ if (desc_ecc[5 - i] & 0x02) {
+ descriptor[(i * 4) + 18] = '1';
+ } else {
+ descriptor[(i * 4) + 18] = '0';
+ }
+ if (desc_ecc[5 - i] & 0x01) {
+ descriptor[(i * 4) + 19] = '1';
+ } else {
+ descriptor[(i * 4) + 19] = '0';
+ }
+ }
+ }
+ rs_free();
+
+ /* Merge descriptor with the rest of the symbol */
+ for (i = 0; i < 40; i++) {
+ if (compact) {
+ bit_pattern[2000 + i - 2] = descriptor[i];
+ } else {
+ bit_pattern[20000 + i - 2] = descriptor[i];
+ }
+ }
+
+ /* Plot all of the data into the symbol in pre-defined spiral pattern */
+ if (compact) {
+
+ for (y = AztecCompactOffset[layers - 1]; y < (27 - AztecCompactOffset[layers - 1]); y++) {
+ for (x = AztecCompactOffset[layers - 1]; x < (27 - AztecCompactOffset[layers - 1]); x++) {
+ if (CompactAztecMap[(y * 27) + x] == 1) {
+ set_module(symbol, y - AztecCompactOffset[layers - 1], x - AztecCompactOffset[layers - 1]);
+ }
+ if (CompactAztecMap[(y * 27) + x] >= 2) {
+ if (bit_pattern[CompactAztecMap[(y * 27) + x] - 2] == '1') {
+ set_module(symbol, y - AztecCompactOffset[layers - 1], x - AztecCompactOffset[layers - 1]);
+ }
+ }
+ }
+ symbol->row_height[y - AztecCompactOffset[layers - 1]] = 1;
+ }
+ symbol->rows = 27 - (2 * AztecCompactOffset[layers - 1]);
+ symbol->width = 27 - (2 * AztecCompactOffset[layers - 1]);
+ } else {
+
+ for (y = AztecOffset[layers - 1]; y < (151 - AztecOffset[layers - 1]); y++) {
+ for (x = AztecOffset[layers - 1]; x < (151 - AztecOffset[layers - 1]); x++) {
+ if (AztecMap[(y * 151) + x] == 1) {
+ set_module(symbol, y - AztecOffset[layers - 1], x - AztecOffset[layers - 1]);
+ }
+ if (AztecMap[(y * 151) + x] >= 2) {
+ if (bit_pattern[AztecMap[(y * 151) + x] - 2] == '1') {
+ set_module(symbol, y - AztecOffset[layers - 1], x - AztecOffset[layers - 1]);
+ }
+ }
+ }
+ symbol->row_height[y - AztecOffset[layers - 1]] = 1;
+ }
+ symbol->rows = 151 - (2 * AztecOffset[layers - 1]);
+ symbol->width = 151 - (2 * AztecOffset[layers - 1]);
+ }
+
+ return err_code;
+}
+
+/* Encodes Aztec runes as specified in ISO/IEC 24778:2008 Annex A */
+int aztec_runes(struct zint_symbol *symbol, unsigned char source[], int length) {
+ int input_value, error_number, i, y, x;
+ char binary_string[28];
+ unsigned char data_codewords[3], ecc_codewords[6];
+
+ error_number = 0;
+ input_value = 0;
+ if (length > 3) {
+ strcpy(symbol->errtxt, "507: Input too large");
+ return ZINT_ERROR_INVALID_DATA;
+ }
+ error_number = is_sane(NEON, source, length);
+ if (error_number != 0) {
+ strcpy(symbol->errtxt, "508: Invalid characters in input");
+ return ZINT_ERROR_INVALID_DATA;
+ }
+ switch (length) {
+ case 3: input_value = 100 * ctoi(source[0]);
+ input_value += 10 * ctoi(source[1]);
+ input_value += ctoi(source[2]);
+ break;
+ case 2: input_value = 10 * ctoi(source[0]);
+ input_value += ctoi(source[1]);
+ break;
+ case 1: input_value = ctoi(source[0]);
+ break;
+ }
+
+ if (input_value > 255) {
+ strcpy(symbol->errtxt, "509: Input too large");
+ return ZINT_ERROR_INVALID_DATA;
+ }
+
+ strcpy(binary_string, "");
+ bin_append(input_value, 8, binary_string);
+
+ data_codewords[0] = 0;
+ data_codewords[1] = 0;
+
+ for (i = 0; i < 2; i++) {
+ if (binary_string[i * 4] == '1') {
+ data_codewords[i] += 8;
+ }
+ if (binary_string[(i * 4) + 1] == '1') {
+ data_codewords[i] += 4;
+ }
+ if (binary_string[(i * 4) + 2] == '1') {
+ data_codewords[i] += 2;
+ }
+ if (binary_string[(i * 4) + 3] == '1') {
+ data_codewords[i] += 1;
+ }
+ }
+
+ rs_init_gf(0x13);
+ rs_init_code(5, 1);
+ rs_encode(2, data_codewords, ecc_codewords);
+ rs_free();
+
+ strcpy(binary_string, "");
+
+ for (i = 0; i < 5; i++) {
+ if (ecc_codewords[4 - i] & 0x08) {
+ binary_string[(i * 4) + 8] = '1';
+ } else {
+ binary_string[(i * 4) + 8] = '0';
+ }
+ if (ecc_codewords[4 - i] & 0x04) {
+ binary_string[(i * 4) + 9] = '1';
+ } else {
+ binary_string[(i * 4) + 9] = '0';
+ }
+ if (ecc_codewords[4 - i] & 0x02) {
+ binary_string[(i * 4) + 10] = '1';
+ } else {
+ binary_string[(i * 4) + 10] = '0';
+ }
+ if (ecc_codewords[4 - i] & 0x01) {
+ binary_string[(i * 4) + 11] = '1';
+ } else {
+ binary_string[(i * 4) + 11] = '0';
+ }
+ }
+
+ for (i = 0; i < 28; i += 2) {
+ if (binary_string[i] == '1') {
+ binary_string[i] = '0';
+ } else {
+ binary_string[i] = '1';
+ }
+ }
+
+ for (y = 8; y < 19; y++) {
+ for (x = 8; x < 19; x++) {
+ if (CompactAztecMap[(y * 27) + x] == 1) {
+ set_module(symbol, y - 8, x - 8);
+ }
+ if (CompactAztecMap[(y * 27) + x] >= 2) {
+ if (binary_string[CompactAztecMap[(y * 27) + x] - 2000] == '1') {
+ set_module(symbol, y - 8, x - 8);
+ }
+ }
+ }
+ symbol->row_height[y - 8] = 1;
+ }
+ symbol->rows = 11;
+ symbol->width = 11;
+
+ return 0;
+}
diff --git a/3rdparty/zint-2.6.1/backend/aztec.h b/3rdparty/zint-2.6.1/backend/aztec.h
new file mode 100644
index 0000000..8760568
--- /dev/null
+++ b/3rdparty/zint-2.6.1/backend/aztec.h
@@ -0,0 +1,145 @@
+/* aztec.c - Handles Aztec Mesa 2D Symbols */
+
+/*
+ libzint - the open source barcode library
+ Copyright (C) 2008-2017 Robin Stuart
+
+ Redistribution and use in source and binary forms, with or without
+ modification, are permitted provided that the following conditions
+ are met:
+
+ 1. Redistributions of source code must retain the above copyright
+ notice, this list of conditions and the following disclaimer.
+ 2. Redistributions in binary form must reproduce the above copyright
+ notice, this list of conditions and the following disclaimer in the
+ documentation and/or other materials provided with the distribution.
+ 3. Neither the name of the project nor the names of its contributors
+ may be used to endorse or promote products derived from this software
+ without specific prior written permission.
+
+ THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND
+ ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+ ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE
+ FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+ DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
+ OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
+ HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
+ LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
+ OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+ SUCH DAMAGE.
+ */
+
+#define UPPER 1
+#define LOWER 2
+#define MIXED 4
+#define PUNC 8
+#define DIGIT 16
+#define BINARY 32
+
+static const unsigned short int CompactAztecMap[] = {
+ /* 27 x 27 data grid */
+ 609, 608, 411, 413, 415, 417, 419, 421, 423, 425, 427, 429, 431, 433, 435, 437, 439, 441, 443, 445, 447, 449, 451, 453, 455, 457, 459,
+ 607, 606, 410, 412, 414, 416, 418, 420, 422, 424, 426, 428, 430, 432, 434, 436, 438, 440, 442, 444, 446, 448, 450, 452, 454, 456, 458,
+ 605, 604, 409, 408, 243, 245, 247, 249, 251, 253, 255, 257, 259, 261, 263, 265, 267, 269, 271, 273, 275, 277, 279, 281, 283, 460, 461,
+ 603, 602, 407, 406, 242, 244, 246, 248, 250, 252, 254, 256, 258, 260, 262, 264, 266, 268, 270, 272, 274, 276, 278, 280, 282, 462, 463,
+ 601, 600, 405, 404, 241, 240, 107, 109, 111, 113, 115, 117, 119, 121, 123, 125, 127, 129, 131, 133, 135, 137, 139, 284, 285, 464, 465,
+ 599, 598, 403, 402, 239, 238, 106, 108, 110, 112, 114, 116, 118, 120, 122, 124, 126, 128, 130, 132, 134, 136, 138, 286, 287, 466, 467,
+ 597, 596, 401, 400, 237, 236, 105, 104, 3, 5, 7, 9, 11, 13, 15, 17, 19, 21, 23, 25, 27, 140, 141, 288, 289, 468, 469,
+ 595, 594, 399, 398, 235, 234, 103, 102, 2, 4, 6, 8, 10, 12, 14, 16, 18, 20, 22, 24, 26, 142, 143, 290, 291, 470, 471,
+ 593, 592, 397, 396, 233, 232, 101, 100, 1, 1, 2000, 2001, 2002, 2003, 2004, 2005, 2006, 0, 1, 28, 29, 144, 145, 292, 293, 472, 473,
+ 591, 590, 395, 394, 231, 230, 99, 98, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 30, 31, 146, 147, 294, 295, 474, 475,
+ 589, 588, 393, 392, 229, 228, 97, 96, 2027, 1, 0, 0, 0, 0, 0, 0, 0, 1, 2007, 32, 33, 148, 149, 296, 297, 476, 477,
+ 587, 586, 391, 390, 227, 226, 95, 94, 2026, 1, 0, 1, 1, 1, 1, 1, 0, 1, 2008, 34, 35, 150, 151, 298, 299, 478, 479,
+ 585, 584, 389, 388, 225, 224, 93, 92, 2025, 1, 0, 1, 0, 0, 0, 1, 0, 1, 2009, 36, 37, 152, 153, 300, 301, 480, 481,
+ 583, 582, 387, 386, 223, 222, 91, 90, 2024, 1, 0, 1, 0, 1, 0, 1, 0, 1, 2010, 38, 39, 154, 155, 302, 303, 482, 483,
+ 581, 580, 385, 384, 221, 220, 89, 88, 2023, 1, 0, 1, 0, 0, 0, 1, 0, 1, 2011, 40, 41, 156, 157, 304, 305, 484, 485,
+ 579, 578, 383, 382, 219, 218, 87, 86, 2022, 1, 0, 1, 1, 1, 1, 1, 0, 1, 2012, 42, 43, 158, 159, 306, 307, 486, 487,
+ 577, 576, 381, 380, 217, 216, 85, 84, 2021, 1, 0, 0, 0, 0, 0, 0, 0, 1, 2013, 44, 45, 160, 161, 308, 309, 488, 489,
+ 575, 574, 379, 378, 215, 214, 83, 82, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 46, 47, 162, 163, 310, 311, 490, 491,
+ 573, 572, 377, 376, 213, 212, 81, 80, 0, 0, 2020, 2019, 2018, 2017, 2016, 2015, 2014, 0, 0, 48, 49, 164, 165, 312, 313, 492, 493,
+ 571, 570, 375, 374, 211, 210, 78, 76, 74, 72, 70, 68, 66, 64, 62, 60, 58, 56, 54, 50, 51, 166, 167, 314, 315, 494, 495,
+ 569, 568, 373, 372, 209, 208, 79, 77, 75, 73, 71, 69, 67, 65, 63, 61, 59, 57, 55, 52, 53, 168, 169, 316, 317, 496, 497,
+ 567, 566, 371, 370, 206, 204, 202, 200, 198, 196, 194, 192, 190, 188, 186, 184, 182, 180, 178, 176, 174, 170, 171, 318, 319, 498, 499,
+ 565, 564, 369, 368, 207, 205, 203, 201, 199, 197, 195, 193, 191, 189, 187, 185, 183, 181, 179, 177, 175, 172, 173, 320, 321, 500, 501,
+ 563, 562, 366, 364, 362, 360, 358, 356, 354, 352, 350, 348, 346, 344, 342, 340, 338, 336, 334, 332, 330, 328, 326, 322, 323, 502, 503,
+ 561, 560, 367, 365, 363, 361, 359, 357, 355, 353, 351, 349, 347, 345, 343, 341, 339, 337, 335, 333, 331, 329, 327, 324, 325, 504, 505,
+ 558, 556, 554, 552, 550, 548, 546, 544, 542, 540, 538, 536, 534, 532, 530, 528, 526, 524, 522, 520, 518, 516, 514, 512, 510, 506, 507,
+ 559, 557, 555, 553, 551, 549, 547, 545, 543, 541, 539, 537, 535, 533, 531, 529, 527, 525, 523, 521, 519, 517, 515, 513, 511, 508, 509
+};
+
+static const char AztecSymbolChar[128] = {
+ /* From Table 2 */
+ 0, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 0, 14, 15, 16, 17, 18, 19,
+ 20, 21, 22, 23, 24, 25, 26, 15, 16, 17, 18, 19, 1, 6, 7, 8, 9, 10, 11, 12,
+ 13, 14, 15, 16, 0, 18, 0, 20, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 21, 22,
+ 23, 24, 25, 26, 20, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16,
+ 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 27, 21, 28, 22, 23, 24, 2, 3, 4,
+ 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24,
+ 25, 26, 27, 29, 25, 30, 26, 27
+};
+
+static const char AztecModes[129] = "BMMMMMMMMMMMMXBBBBBBBBBBBBBMMMMMXPPPPPPPPPPPXPXPDDDDDDDDDDPPPPPPMUUUUUUUUUUUUUUUUUUUUUUUUUUPMPMMMLLLLLLLLLLLLLLLLLLLLLLLLLLPMPMM";
+
+static const unsigned short int AztecSizes[32] = {
+ /* Codewords per symbol */
+ 21, 48, 60, 88, 120, 156, 196, 240, 230, 272, 316, 364, 416, 470, 528, 588, 652, 720, 790,
+ 864, 940, 1020, 920, 992, 1066, 1144, 1224, 1306, 1392, 1480, 1570, 1664
+};
+
+static const int AztecCompactSizes[4] = {
+ 17, 40, 51, 76
+};
+
+static const unsigned short int Aztec10DataSizes[32] = {
+ /* Data bits per symbol maximum with 10% error correction */
+ 96, 246, 408, 616, 840, 1104, 1392, 1704, 2040, 2420, 2820, 3250, 3720, 4200, 4730,
+ 5270, 5840, 6450, 7080, 7750, 8430, 9150, 9900, 10680, 11484, 12324, 13188, 14076,
+ 15000, 15948, 16920, 17940
+};
+
+static const unsigned short int Aztec23DataSizes[32] = {
+ /* Data bits per symbol maximum with 23% error correction */
+ 84, 204, 352, 520, 720, 944, 1184, 1456, 1750, 2070, 2410, 2780, 3180, 3590, 4040,
+ 4500, 5000, 5520, 6060, 6630, 7210, 7830, 8472, 9132, 9816, 10536, 11280, 12036,
+ 12828, 13644, 14472, 15348
+};
+
+static const unsigned short int Aztec36DataSizes[32] = {
+ /* Data bits per symbol maximum with 36% error correction */
+ 66, 168, 288, 432, 592, 776, 984, 1208, 1450, 1720, 2000, 2300, 2640, 2980, 3350,
+ 3740, 4150, 4580, 5030, 5500, 5990, 6500, 7032, 7584, 8160, 8760, 9372, 9996, 10656,
+ 11340, 12024, 12744
+};
+
+static const unsigned short int Aztec50DataSizes[32] = {
+ /* Data bits per symbol maximum with 50% error correction */
+ 48, 126, 216, 328, 456, 600, 760, 936, 1120, 1330, 1550, 1790, 2050, 2320, 2610,
+ 2910, 3230, 3570, 3920, 4290, 4670, 5070, 5484, 5916, 6360, 6828, 7308, 7800, 8316,
+ 8844, 9384, 9948
+};
+
+static const unsigned short int AztecCompact10DataSizes [4] = {
+ 78, 198, 336, 520
+};
+
+static const unsigned short int AztecCompact23DataSizes [4] = {
+ 66, 168, 288, 440
+};
+
+static const unsigned short int AztecCompact36DataSizes [4] = {
+ 48, 138, 232, 360
+};
+
+static const unsigned short int AztecCompact50DataSizes [4] = {
+ 36, 102, 176, 280
+};
+
+static const char AztecOffset[32] = {
+ 66, 64, 62, 60, 57, 55, 53, 51, 49, 47, 45, 42, 40, 38, 36, 34, 32, 30, 28, 25, 23, 21,
+ 19, 17, 15, 13, 10, 8, 6, 4, 2, 0
+};
+
+static const char AztecCompactOffset[4] = {
+ 6, 4, 2, 0
+};
diff --git a/3rdparty/zint-2.6.1/backend/bmp.c b/3rdparty/zint-2.6.1/backend/bmp.c
new file mode 100644
index 0000000..536bb4f
--- /dev/null
+++ b/3rdparty/zint-2.6.1/backend/bmp.c
@@ -0,0 +1,147 @@
+/* bmp.c - Handles output to Windows Bitmap file */
+
+/*
+ libzint - the open source barcode library
+ Copyright (C) 2009-2017 Robin Stuart
+
+ Redistribution and use in source and binary forms, with or without
+ modification, are permitted provided that the following conditions
+ are met:
+
+ 1. Redistributions of source code must retain the above copyright
+ notice, this list of conditions and the following disclaimer.
+ 2. Redistributions in binary form must reproduce the above copyright
+ notice, this list of conditions and the following disclaimer in the
+ documentation and/or other materials provided with the distribution.
+ 3. Neither the name of the project nor the names of its contributors
+ may be used to endorse or promote products derived from this software
+ without specific prior written permission.
+
+ THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND
+ ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+ ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE
+ FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+ DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
+ OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
+ HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
+ LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
+ OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+ SUCH DAMAGE.
+ */
+
+#include
+#include
+#include
+#include "common.h"
+#include "bmp.h" /* Bitmap header structure */
+#include
+#ifdef _MSC_VER
+#include
+#include
+#endif
+
+#define SSET "0123456789ABCDEF"
+
+int bmp_pixel_plot(struct zint_symbol *symbol, char *pixelbuf) {
+ int i, row, column;
+ int fgred, fggrn, fgblu, bgred, bggrn, bgblu;
+ int row_size;
+ unsigned int data_size;
+ unsigned char *bitmap_file_start, *bmp_posn;
+ char *bitmap;
+ FILE *bmp_file;
+ bitmap_file_header_t file_header;
+ bitmap_info_header_t info_header;
+
+ if (symbol->bitmap != NULL)
+ free(symbol->bitmap);
+
+ row_size = 4 * floor((24.0 * symbol->bitmap_width + 31) / 32);
+ bitmap = (char *) malloc(row_size * symbol->bitmap_height);
+
+ fgred = (16 * ctoi(symbol->fgcolour[0])) + ctoi(symbol->fgcolour[1]);
+ fggrn = (16 * ctoi(symbol->fgcolour[2])) + ctoi(symbol->fgcolour[3]);
+ fgblu = (16 * ctoi(symbol->fgcolour[4])) + ctoi(symbol->fgcolour[5]);
+ bgred = (16 * ctoi(symbol->bgcolour[0])) + ctoi(symbol->bgcolour[1]);
+ bggrn = (16 * ctoi(symbol->bgcolour[2])) + ctoi(symbol->bgcolour[3]);
+ bgblu = (16 * ctoi(symbol->bgcolour[4])) + ctoi(symbol->bgcolour[5]);
+
+ /* Pixel Plotting */
+ i = 0;
+ for (row = 0; row < symbol->bitmap_height; row++) {
+ for (column = 0; column < symbol->bitmap_width; column++) {
+ i = (3 * column) + (row * row_size);
+ switch (*(pixelbuf + (symbol->bitmap_width * (symbol->bitmap_height - row - 1)) + column)) {
+ case '1':
+ bitmap[i] = fgblu;
+ bitmap[i + 1] = fggrn;
+ bitmap[i + 2] = fgred;
+ break;
+ default:
+ bitmap[i] = bgblu;
+ bitmap[i + 1] = bggrn;
+ bitmap[i + 2] = bgred;
+ break;
+
+ }
+ }
+ }
+
+ data_size = symbol->bitmap_height * row_size;
+ symbol->bitmap_byte_length = data_size;
+
+ file_header.header_field = 0x4d42; // "BM"
+ file_header.file_size = sizeof (bitmap_file_header_t) + sizeof (bitmap_info_header_t) + data_size;
+ file_header.reserved = 0;
+ file_header.data_offset = sizeof (bitmap_file_header_t) + sizeof (bitmap_info_header_t);
+
+ info_header.header_size = sizeof (bitmap_info_header_t);
+ info_header.width = symbol->bitmap_width;
+ info_header.height = symbol->bitmap_height;
+ info_header.colour_planes = 1;
+ info_header.bits_per_pixel = 24;
+ info_header.compression_method = 0; // BI_RGB
+ info_header.image_size = 0;
+ info_header.horiz_res = 0;
+ info_header.vert_res = 0;
+ info_header.colours = 0;
+ info_header.important_colours = 0;
+
+ bitmap_file_start = (unsigned char*) malloc(file_header.file_size);
+ memset(bitmap_file_start, 0xff, file_header.file_size);
+
+ bmp_posn = bitmap_file_start;
+ memcpy(bitmap_file_start, &file_header, sizeof (bitmap_file_header_t));
+ bmp_posn += sizeof (bitmap_file_header_t);
+ memcpy(bmp_posn, &info_header, sizeof (bitmap_info_header_t));
+ bmp_posn += sizeof (bitmap_info_header_t);
+ memcpy(bmp_posn, bitmap, data_size);
+
+ /* Open output file in binary mode */
+ if ((symbol->output_options & BARCODE_STDOUT) != 0) {
+#ifdef _MSC_VER
+ if (-1 == _setmode(_fileno(stdout), _O_BINARY)) {
+ strcpy(symbol->errtxt, "600: Can't open output file");
+ free(bitmap_file_start);
+ free(bitmap);
+ return ZINT_ERROR_FILE_ACCESS;
+ }
+#endif
+ bmp_file = stdout;
+ } else {
+ if (!(bmp_file = fopen(symbol->outfile, "wb"))) {
+ free(bitmap_file_start);
+ free(bitmap);
+ strcpy(symbol->errtxt, "601: Can't open output file");
+ return ZINT_ERROR_FILE_ACCESS;
+ }
+ }
+
+ fwrite(bitmap_file_start, file_header.file_size, 1, bmp_file);
+ fclose(bmp_file);
+
+ free(bitmap_file_start);
+ free(bitmap);
+ return 0;
+}
diff --git a/3rdparty/zint-2.6.1/backend/bmp.h b/3rdparty/zint-2.6.1/backend/bmp.h
new file mode 100644
index 0000000..ed88f86
--- /dev/null
+++ b/3rdparty/zint-2.6.1/backend/bmp.h
@@ -0,0 +1,76 @@
+/* bmp.h - header structure for Windows bitmap files
+
+ libzint - the open source barcode library
+ Copyright (C) 2009-2017 Robin Stuart
+
+ Redistribution and use in source and binary forms, with or without
+ modification, are permitted provided that the following conditions
+ are met:
+
+ 1. Redistributions of source code must retain the above copyright
+ notice, this list of conditions and the following disclaimer.
+ 2. Redistributions in binary form must reproduce the above copyright
+ notice, this list of conditions and the following disclaimer in the
+ documentation and/or other materials provided with the distribution.
+ 3. Neither the name of the project nor the names of its contributors
+ may be used to endorse or promote products derived from this software
+ without specific prior written permission.
+
+ THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND
+ ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+ ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE
+ FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+ DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
+ OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
+ HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
+ LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
+ OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+ SUCH DAMAGE.
+ */
+
+#ifndef BMP_H
+#define BMP_H
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+#ifdef _MSC_VER
+#include
+#include "stdint_msvc.h"
+#else
+#include
+#endif
+
+#pragma pack (1)
+
+ typedef struct bitmap_file_header {
+ uint16_t header_field;
+ uint32_t file_size;
+ uint32_t reserved;
+ uint32_t data_offset;
+ } bitmap_file_header_t;
+
+ typedef struct bitmap_info_header {
+ uint32_t header_size;
+ int32_t width;
+ int32_t height;
+ uint16_t colour_planes;
+ uint16_t bits_per_pixel;
+ uint32_t compression_method;
+ uint32_t image_size;
+ int32_t horiz_res;
+ int32_t vert_res;
+ uint32_t colours;
+ uint32_t important_colours;
+ } bitmap_info_header_t;
+
+#pragma pack ()
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif /* BMP_H */
+
diff --git a/3rdparty/zint-2.6.1/backend/codablock.c b/3rdparty/zint-2.6.1/backend/codablock.c
new file mode 100644
index 0000000..d6e1524
--- /dev/null
+++ b/3rdparty/zint-2.6.1/backend/codablock.c
@@ -0,0 +1,1008 @@
+/* codablock.c - Handles Codablock-F and Codablock-E */
+
+/*
+ libzint - the open source barcode library
+ Copyright (C) 2016 Harald Oehlmann
+
+ Redistribution and use in source and binary forms, with or without
+ modification, are permitted provided that the following conditions
+ are met:
+
+ 1. Redistributions of source code must retain the above copyright
+ notice, this list of conditions and the following disclaimer.
+ 2. Redistributions in binary form must reproduce the above copyright
+ notice, this list of conditions and the following disclaimer in the
+ documentation and/or other materials provided with the distribution.
+ 3. Neither the name of the project nor the names of its contributors
+ may be used to endorse or promote products derived from this software
+ without specific prior written permission.
+
+ THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND
+ ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+ ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE
+ FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+ DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
+ OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
+ HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
+ LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
+ OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+ SUCH DAMAGE.
+ */
+
+#include
+#include
+#include
+#include
+#ifdef _MSC_VER
+#include
+#endif
+#include "common.h"
+#include "gs1.h"
+
+#define uchar unsigned char
+
+/* FTab C128 flags - may be added */
+#define CodeA 1
+#define CodeB 2
+#define CodeC 4
+#define CEnd 8
+#define CShift 16
+#define CFill 32
+#define CodeFNC1 64
+#define ZTNum (CodeA+CodeB+CodeC)
+#define ZTFNC1 (CodeA+CodeB+CodeC+CodeFNC1)
+
+/* ASCII-Extension for Codablock-F */
+#define aFNC1 (uchar)(128)
+#define aFNC2 (uchar)(129)
+#define aFNC3 (uchar)(130)
+#define aFNC4 (uchar)(131)
+#define aCodeA (uchar)(132)
+#define aCodeB (uchar)(133)
+#define aCodeC (uchar)(134)
+#define aShift (uchar)(135)
+
+static const char *C128Table[107] = {
+ /* Code 128 character encodation - Table 1 */
+ "212222", "222122", "222221", "121223", "121322", "131222", "122213",
+ "122312", "132212", "221213", "221312", "231212", "112232", "122132", "122231", "113222",
+ "123122", "123221", "223211", "221132", "221231", "213212", "223112", "312131", "311222",
+ "321122", "321221", "312212", "322112", "322211", "212123", "212321", "232121", "111323",
+ "131123", "131321", "112313", "132113", "132311", "211313", "231113", "231311", "112133",
+ "112331", "132131", "113123", "113321", "133121", "313121", "211331", "231131", "213113",
+ "213311", "213131", "311123", "311321", "331121", "312113", "312311", "332111", "314111",
+ "221411", "431111", "111224", "111422", "121124", "121421", "141122", "141221", "112214",
+ "112412", "122114", "122411", "142112", "142211", "241211", "221114", "413111", "241112",
+ "134111", "111242", "121142", "121241", "114212", "124112", "124211", "411212", "421112",
+ "421211", "212141", "214121", "412121", "111143", "111341", "131141", "114113", "114311",
+ "411113", "411311", "113141", "114131", "311141", "411131", "211412", "211214", "211232",
+ "2331112"
+};
+
+/* Code F Analysing-Chart */
+typedef struct sCharacterSetTable
+{
+ int CharacterSet; /* Still possible character sets for actual*/
+ int AFollowing; /* Still following Characters in Charset A */
+ int BFollowing; /* Still following Characters in Charset B */
+ int CFollowing; /* Still following Characters in Charset C */
+} CharacterSetTable;
+
+/* Find the possible Code-128 Character sets for a character
+ * The result is an or of CodeA,CodeB,CodeC,CodeFNC1 in dependency of the
+ * possible Code 128 character sets.
+ */
+int GetPossibleCharacterSet(unsigned char C)
+{
+ if (C<='\x19') /* Dec:31 */
+ return CodeA;
+ if (C>='0' && C<='9')
+ return ZTNum; /* ZTNum=CodeA+CodeB+CodeC */
+ if (C==aFNC1)
+ return ZTFNC1; /* ZTFNC1=CodeA+CodeB+CodeC+CodeFNC1 */
+ if (C>='\x60' && C<='\x7f') /* 60 to 127 */
+ return CodeB;
+ return CodeA+CodeB;
+}
+
+/* Create a Table with the following information for each Data character:
+ * int CharacterSet is an or of CodeA,CodeB,CodeC,CodeFNC1, in
+ * dependency which character set is applicable.
+ * (Result of GetPossibleCharacterSet)
+ * int AFollowing,BFollowing The number of source characters you still may encode
+ * in this character set.
+ * int CFollowing The number of characters encodable in CodeC if we
+ * start here.
+ */
+static void CreateCharacterSetTable(CharacterSetTable T[], unsigned char *data,const size_t dataLength)
+{
+ int charCur;
+ int runChar;
+
+ /* Treat the Data backwards */
+ charCur=dataLength-1;
+ T[charCur].CharacterSet=GetPossibleCharacterSet(data[charCur]);
+ T[charCur].AFollowing=((T[charCur].CharacterSet & CodeA)==0)?0:1;
+ T[charCur].BFollowing=((T[charCur].CharacterSet & CodeB)==0)?0:1;
+ T[charCur].CFollowing=0;
+
+ for (charCur--;charCur>=0;charCur--)
+ {
+ T[charCur].CharacterSet=GetPossibleCharacterSet(data[charCur]);
+ T[charCur].AFollowing=
+ ((T[charCur].CharacterSet & CodeA)==0)?0:T[charCur+1].AFollowing+1;
+ T[charCur].BFollowing=
+ ((T[charCur].CharacterSet & CodeB)==0)?0:T[charCur+1].BFollowing+1;
+ T[charCur].CFollowing=0;
+
+ }
+ /* Find the CodeC-chains */
+ for (charCur=0;charCur=dataLength)
+ break;
+ /* Only a Number may follow */
+ if (T[runChar].CharacterSet==ZTNum)
+ T[charCur].CFollowing+=2;
+ else
+ break;
+ }
+ ++runChar;
+ } while (runChar0 && runChar44) are requested the columns is extended.
+ * A oneLigner may be choosen if shorter.
+ * Parameters :
+ * T Pointer on the Characters which fit in the row
+ * If a different count is calculated it is corrected
+ * in the callers workspace.
+ * pFillings Output of filling characters
+ * pSet Output of the character sets used, allocated by me.
+ * Data The Data string to encode, exceptionnally not an out
+ * Return value Resulting row count
+ */
+
+static int Columns2Rows(CharacterSetTable *T, unsigned char *data, const size_t dataLength,
+ int * pRows, int * pUseColumns, int * pSet, int * pFillings)
+{
+ int useColumns; /* Usable Characters per line */
+ int fillings; /* Number of filling characters */
+ int rowsCur;
+ int charCur;
+ int runChar;
+ int emptyColumns; /* Number of codes still empty in line. */
+ int emptyColumns2; /* Alternative emptyColumns to compare */
+ int fOneLiner; /* Flag if One Liner */
+ int CPaires; /* Number of digit pairs which may fit in the line */
+ int characterSetCur; /* Current Character Set */
+
+ useColumns=*pUseColumns;
+ if (useColumns<3)
+ useColumns=3;
+
+ /* >>> Loop until rowsCur<44 */
+ do {
+ memset(pSet,0,dataLength*sizeof(int));
+ charCur=0;
+ rowsCur=0;
+ fOneLiner=1; /* First try one-Liner */
+
+ /* >>> Line and OneLiner-try Loop */
+ do{
+ /* >> Start Character */
+ emptyColumns=useColumns; /* Remained place in Line */
+ if (fOneLiner)
+ emptyColumns+=2;
+
+ /* >>Choose in Set A or B */
+ /* (C is changed as an option later on) */
+
+ pSet[charCur]=characterSetCur=
+ (T[charCur].AFollowing > T[charCur].BFollowing)
+ ? CodeA : CodeB;
+
+ /* >> Test on Numeric Mode C */
+ CPaires=RemainingDigits(T,charCur, emptyColumns);
+ if (CPaires>=4)
+ {
+ /* 4 Digits in Numeric compression ->OK */
+ /* > May an odd start find more ? */
+ /* Skip leading 's */
+ /* Typical structure : 12... */
+ /* Test if numeric after one isn't better.*/
+ runChar=charCur;
+ emptyColumns2=emptyColumns;
+ while (T[runChar].CharacterSet==ZTFNC1)
+ {
+ ++runChar;
+ --emptyColumns2;
+ }
+ if (CPaires>=RemainingDigits(T,runChar+1,emptyColumns2-1))
+ {
+ /* Start odd is not better */
+ /* We start in C */
+ pSet[charCur]=characterSetCur=CodeC;
+ /* Inkrement charCur */
+ if (T[charCur].CharacterSet!=ZTFNC1)
+ ++charCur; /* 2 Num.Digits */
+ }
+ }
+ ++charCur;
+ --emptyColumns;
+
+ /* >> Following characters */
+ while(emptyColumns>0 && charCur> Check switching to CodeC */
+ /* Switch if :
+ * - Character not FNC1
+ * - 4 real Digits will fit in line
+ * - an odd Start will not be better
+ */
+ if (T[charCur].CharacterSet==ZTNum
+ && (CPaires=RemainingDigits(T,charCur, emptyColumns-1))>=4
+ && CPaires > RemainingDigits(T,charCur+1,emptyColumns-2))
+ {
+ /* > Change to C */
+ pSet[charCur]=characterSetCur=CodeC;
+ charCur+=2; /* 2 Digit */
+ emptyColumns-=2; /* 12 */
+ } else if (characterSetCur==CodeA)
+ {
+ if(T[charCur].AFollowing==0)
+ {
+ /* Must change to B */
+ if (emptyColumns==1)
+ {
+ /* Can't switch: */
+ pSet[charCur-1]|=CEnd+CFill;
+ emptyColumns=0;
+ }else{
+ /* or ? */
+ if (T[charCur].BFollowing==1)
+ {
+ pSet[charCur]|=CShift;
+ } else {
+ pSet[charCur]|=CodeB;
+ characterSetCur = CodeB;
+ }
+ emptyColumns-=2;
+ ++charCur;
+ }
+ }else{
+ --emptyColumns;
+ ++charCur;
+ }
+ } else { /* Last possibility : CodeB */
+ if(T[charCur].BFollowing==0)
+ {
+ /* Must change to A */
+ if (emptyColumns==1)
+ {
+ /* Can't switch: */
+ pSet[charCur-1]|=CEnd+CFill;
+ emptyColumns=0;
+ } else {
+ /* or ? */
+ if (T[charCur].AFollowing==1)
+ {
+ pSet[charCur]|=CShift;
+ } else {
+ pSet[charCur]|=CodeA;
+ characterSetCur = CodeA;
+ }
+ emptyColumns-=2;
+ ++charCur;
+ }
+ }else{
+ --emptyColumns;
+ ++charCur;
+ }
+ }
+ break;
+ case CodeC:
+ if(T[charCur].CFollowing>0)
+ {
+ charCur+=(T[charCur].CharacterSet==ZTFNC1)?1:2;
+ emptyColumns--;
+ }else{
+ /* Must change to A or B */
+ if (emptyColumns==1)
+ {
+ /* Can't switch: */
+ pSet[charCur-1]|=CEnd+CFill;
+ emptyColumns=0;
+ }else{
+ /* or ?*/
+ characterSetCur=pSet[charCur]=
+ (T[charCur].AFollowing > T[charCur].BFollowing)
+ ?CodeA:CodeB;
+ emptyColumns-=2;
+ ++charCur;
+ }
+ }
+ break;
+ } /* switch */
+ } /* while */
+
+ /* > End of Codeline */
+ pSet[charCur-1]|=CEnd;
+ ++rowsCur;
+ if ( fOneLiner)
+ {
+ if (charCur44) {
+ ++useColumns;
+ if (useColumns > 62) {
+ return ZINT_ERROR_TOO_LONG;
+ }
+ }
+ } while(rowsCur>44);
+ #ifdef _DEBUG
+ printf(" -> out: rowsCur <%i>, useColumns <%i>, fillings <%i>\n",rowsCur,useColumns,fillings);
+ #endif
+ *pUseColumns=useColumns;
+ *pRows=rowsCur;
+ *pFillings=fillings;
+ return 0;
+}
+/* Find columns if row count is given.
+ */
+static int Rows2Columns(CharacterSetTable *T, unsigned char *data, const size_t dataLength,
+ int * pRows, int * pUseColumns, int * pSet, int * pFillings)
+{
+ int errorCur;
+ int rowsCur;
+ int rowsRequested; /* Number of requested rows */
+ int backupRows = 0;
+ int fillings;
+ int backupFillings = 0;
+ int useColumns;
+ int testColumns; /* To enter into Width2Rows */
+ int backupColumns = 0;
+ int fBackupOk = 0; /* The memorysed set is o.k. */
+ int testListSize = 0;
+ int pTestList[62];
+#ifndef _MSC_VER
+ int *pBackupSet[dataLength];
+#else
+ int *pBackupSet = (int *)_alloca(dataLength*sizeof(int));
+#endif
+
+ rowsRequested=*pRows;
+
+ #ifdef _DEBUG
+ fprintf(stderr,"Optimizer : Searching <%i> rows\n",rowsRequested);
+ #endif
+
+ if (rowsRequested==1)
+ /* OneLiners are self-calibrating */
+ testColumns=32767;
+ else {
+ /* First guess */
+ testColumns=dataLength/rowsRequested;
+ if (testColumns > 62)
+ testColumns = 62;
+ else if (testColumns < 1)
+ testColumns = 1;
+ }
+
+ for (;;) {
+ pTestList[testListSize] = testColumns;
+ testListSize++;
+ useColumns=testColumns; /* Make a copy because it may be modified */
+ errorCur = Columns2Rows(T, data, dataLength, &rowsCur, &useColumns, pSet, &fillings);
+ if (errorCur != 0)
+ return errorCur;
+ if (rowsCur<=rowsRequested) {
+ /* Less or exactly line number found */
+ /* check if column count below already tested or Count = 1*/
+ int fInTestList = (rowsCur == 1 || testColumns == 1);
+ int posCur;
+ for (posCur = 0; posCur < testListSize && ! fInTestList; posCur++) {
+ if ( pTestList[posCur] == testColumns-1 )
+ fInTestList = 1;
+ }
+ if (fInTestList) {
+ /* >> Smaller Width already tested
+ * if rowsCur=rowsRequested->Exit
+ * if rowsCur0
+ * -> New search for rowsRequested:=rowsCur
+ */
+ if ( rowsCur == rowsRequested || fillings == 0 || testColumns == 1 ) {
+ /* Exit with actual */
+ *pFillings=fillings;
+ *pRows=rowsCur;
+ *pUseColumns = useColumns;
+ return 0;
+ }
+ /* Search again for smaller Line number */
+ rowsRequested=rowsCur;
+ pTestList[0] = testColumns;
+ testListSize = 1;
+ }
+ /* > Test more rows (shorter CDB) */
+ fBackupOk=(rowsCur==rowsRequested);
+ memcpy(pBackupSet,pSet,dataLength*sizeof(int));
+ backupFillings=fillings;
+ backupColumns=useColumns;
+ backupRows=rowsCur;
+ --testColumns;
+ } else {
+ /* > To many rows */
+ int fInTestList = fBackupOk;
+ int posCur;
+ for (posCur = 0; posCur < testListSize && ! fInTestList; posCur++) {
+ if ( pTestList[posCur] == testColumns+1 )
+ fInTestList = 1;
+ }
+ if (fInTestList) {
+ /* The next less-rows (larger) code was
+ * already tested. So give the larger
+ * back.
+ */
+ memcpy(pSet,pBackupSet,dataLength*sizeof(int));
+ *pFillings=backupFillings;
+ *pRows=backupRows;
+ *pUseColumns=backupColumns;
+ return 0;
+ }
+ /* > Test less rows (longer code) */
+ backupRows=rowsCur;
+ memcpy(pBackupSet,pSet,dataLength*sizeof(int));
+ backupFillings=fillings;
+ backupColumns=useColumns;
+ fBackupOk=0;
+ ++testColumns;
+ }
+ }
+}
+
+/* Print a character in character set A
+ */
+void A2C128_A(uchar **ppOutPos,uchar c)
+{
+ uchar * pOutPos = *ppOutPos;
+ switch(c){
+ case aCodeB: *pOutPos=100; break;
+ case aFNC4: *pOutPos=101; break;
+ case aFNC1: *pOutPos=102; break;
+ case aFNC2: *pOutPos=97; break;
+ case aFNC3: *pOutPos=96; break;
+ case aCodeC: *pOutPos=99; break;
+ case aShift: *pOutPos=98; break;
+ default:
+ /* +++ HaO 13.11.98 c>' ' && c < '\x1F' corrected */
+ if(c>=' ' && c<='_')
+ *pOutPos=(uchar)(c-' ');
+ else
+ *pOutPos=(uchar)(c+64);
+ break;
+ }
+ (*ppOutPos)++;
+}
+/* Output c in Set B
+ */
+void A2C128_B(uchar **ppOutPos,uchar c)
+{
+ uchar * pOutPos = *ppOutPos;
+ switch(c){
+ case aFNC1: *pOutPos=102; break;
+ case aFNC2: *pOutPos=97; break;
+ case aFNC3: *pOutPos=96; break;
+ case aFNC4: *pOutPos=100; break;
+ case aCodeA: *pOutPos=101; break;
+ case aCodeC: *pOutPos=99; break;
+ case aShift: *pOutPos=98; break;
+ default: *pOutPos=(uchar)(c-' '); break;
+ }
+ ++(*ppOutPos);
+}
+/* Output c1, c2 in Set C
+ */
+void A2C128_C(uchar **ppOutPos,uchar c1,uchar c2)
+{
+ uchar * pOutPos = *ppOutPos;
+ switch(c1){
+ case aFNC1: *pOutPos=102; break;
+ case aCodeB: *pOutPos=100; break;
+ case aCodeA: *pOutPos=101; break;
+ default: *pOutPos=(char)(10 * (c1- '0') + (c2 - '0'));break;
+ }
+ (*ppOutPos)++;
+}
+/* Output a character in Characterset
+ */
+void ASCIIZ128(uchar **ppOutPos, int CharacterSet,uchar c1, uchar c2)
+{
+ if (CharacterSet==CodeA)
+ A2C128_A(ppOutPos,c1);
+ else if(CharacterSet==CodeB)
+ A2C128_B(ppOutPos,c1);
+ else
+ A2C128_C(ppOutPos,c1,c2);
+}
+/* XLate Table A of Codablock-F Specification and call output
+ */
+void SumASCII(uchar **ppOutPos, int Sum, int CharacterSet)
+{
+ switch (CharacterSet){
+ case CodeA:
+ A2C128_A(ppOutPos, (uchar)Sum);
+ break;
+ case CodeB:
+ if (Sum<=31)
+ A2C128_B(ppOutPos, (uchar)(Sum+96));
+ else if(Sum<=47)
+ A2C128_B(ppOutPos, (uchar)Sum);
+ else
+ A2C128_B(ppOutPos, (uchar)(Sum+10));
+ break;
+ case CodeC:
+ A2C128_C(ppOutPos
+ ,(char)(Sum/10+'0') ,(uchar)(Sum%10+'0'));
+ break;
+ }
+}
+
+/* Main function called by zint framework
+ */
+int codablock(struct zint_symbol *symbol,const unsigned char source[], const size_t length) {
+ size_t charCur,dataLength;
+ int Error;
+ int rows, columns, useColumns;
+ int fillings;
+ int Sum1,Sum2;
+ uchar * pOutPos;
+ int rowCur;
+ int characterSetCur;
+ int emptyColumns;
+ char dest[1000];
+ int r, c;
+#ifdef _MSC_VER
+ CharacterSetTable *T;
+ unsigned char *data;
+ int *pSet;
+ uchar * pOutput;
+#endif
+
+ /* Parameter check */
+ /* option1: rows 0: automatic, 1..44 */
+ rows = symbol->option_1;
+ if (rows > 44) {
+ strcpy(symbol->errtxt, "410: Row parameter not in 0..44");
+ return ZINT_ERROR_INVALID_OPTION;
+ }
+ /* option_2: (usable data) columns: 0: automatic, 6..66 */
+ columns = symbol->option_2;
+ if ( ! (columns <= 0 || (columns >= 6 && columns <=66)) ) {
+ strcpy(symbol->errtxt, "411: Columns parameter not in 0,6..66");
+ return ZINT_ERROR_INVALID_OPTION;
+ }
+ /* GS1 not implemented */
+ if (symbol->input_mode == GS1_MODE) {
+ strcpy(symbol->errtxt, "412: GS1 mode not supported");
+ return ZINT_ERROR_INVALID_OPTION;
+ }
+#ifndef _MSC_VER
+ unsigned char data[length*2+1];
+#else
+ data = (unsigned char *) _alloca(length * 2+1);
+#endif
+
+ dataLength = 0;
+ if (symbol->output_options & READER_INIT) {
+ data[dataLength] = aFNC3;
+ dataLength++;
+ }
+ /* Replace all Codes>127 with Code-128 */
+ for (charCur=0;charCur127)
+ {
+ data[dataLength] = aFNC4;
+ dataLength++;
+ data[dataLength] = (unsigned char)(source[charCur]&127);
+ } else
+ data[dataLength] = source[charCur];
+ dataLength++;
+ }
+
+ /* Build character set table */
+#ifndef _MSC_VER
+ CharacterSetTable T[dataLength];
+ int pSet[dataLength];
+#else
+ T=(CharacterSetTable *)_alloca(dataLength*sizeof(CharacterSetTable));
+ pSet = (int *)_alloca(dataLength*sizeof(int));
+#endif
+ CreateCharacterSetTable(T,data,dataLength);
+
+ /* Find final row and column count */
+ /* nor row nor column count given */
+ if ( rows <= 0 && columns <= 5 ) {
+ /* Use Code128 until reasonable size */
+ if (dataLength < 9) {
+ rows = 1;
+ } else {
+ /* use 1/1 aspect/ratio Codablock */
+ columns = ((int)floor(sqrt(1.0*dataLength))+5);
+ if (columns > 64)
+ columns = 64;
+ #ifdef _DEBUG
+ printf("Auto column count for %d characters:%d\n",dataLength,columns);
+ #endif
+ }
+ }
+ /* There are 5 Codewords for Organisation Start(2),row(1),CheckSum,Stop */
+ useColumns = columns - 5;
+ if ( rows > 0 ) {
+ /* row count given */
+ Error=Rows2Columns(T,data,dataLength,&rows,&useColumns,pSet,&fillings);
+ } else {
+ /* column count given */
+ Error=Columns2Rows(T,data,dataLength,&rows,&useColumns,pSet,&fillings);
+ }
+ if (Error != 0) {
+ strcpy(symbol->errtxt, "413: Data string to long");
+ return Error;
+ }
+ /* Checksum */
+ Sum1=Sum2=0;
+ if (rows>1)
+ {
+ size_t charCur;
+ for (charCur=0 ; charCur>> Build C128 code numbers */
+ /* The C128 column count contains Start (2CW), Row ID, Checksum, Stop */
+#ifndef _MSC_VER
+ uchar pOutput[columns * rows];
+#else
+ pOutput = (unsigned char *)_alloca(columns * rows * sizeof(char));
+#endif
+ pOutPos = pOutput;
+ charCur=0;
+ /* >> Loop over rows */
+ for (rowCur=0 ; rowCur=dataLength)
+ {
+ /* >> Empty line with StartCCodeBCodeC */
+ characterSetCur=CodeC;
+ /* CDB Start C*/
+ *pOutPos='\x67';
+ pOutPos++;
+ *pOutPos='\x63';
+ pOutPos++;
+ SumASCII(&pOutPos,rowCur+42,CodeC);
+ emptyColumns=useColumns-2;
+ while (emptyColumns>0)
+ {
+ if(characterSetCur==CodeC)
+ {
+ A2C128_C(&pOutPos,aCodeB,'\0');
+ characterSetCur=CodeB;
+ }else{
+ A2C128_B(&pOutPos,aCodeC);
+ characterSetCur=CodeC;
+ }
+ --emptyColumns;
+ }
+ }else{
+ /* >> Normal Line */
+ /* > Startcode */
+ switch (pSet[charCur] & (CodeA+CodeB+CodeC)){
+ case CodeA:
+ *pOutPos = '\x67';
+ pOutPos++;
+ if (rows>1) {
+ *pOutPos = '\x62';
+ pOutPos++;
+ }
+ characterSetCur=CodeA;
+ break;
+ case CodeB:
+ if (rows==1) {
+ *pOutPos = '\x68';
+ pOutPos++;
+ } else {
+ *pOutPos = '\x67';
+ pOutPos++;
+ *pOutPos = '\x64';
+ pOutPos++;
+ }
+ characterSetCur=CodeB;
+ break;
+ case CodeC:
+ default:
+ if (rows==1) {
+ *pOutPos = '\x69';
+ pOutPos++;
+ } else {
+ *pOutPos = '\x67';
+ pOutPos++;
+ *pOutPos = '\x63';
+ pOutPos++;
+ }
+ characterSetCur=CodeC;
+ break;
+ }
+ if (rows>1)
+ {
+ /* > Set F1 */
+ /* In first line : # of rows */
+ /* In Case of CodeA we shifted to CodeB */
+ SumASCII(&pOutPos
+ ,(rowCur==0)?rows-2:rowCur+42
+ ,(characterSetCur==CodeA)?CodeB:characterSetCur
+ );
+ }
+ /* >>> Data */
+ emptyColumns=useColumns;
+ /* +++ One liner don't have start/stop code */
+ if (rows == 1)
+ emptyColumns +=2;
+ /* >> Character loop */
+ while (emptyColumns>0)
+ {
+ /* ? Change character set */
+ /* not at first possition (It was then the start set) */
+ /* +++ special case for one-ligner */
+ if (emptyColumns> Shift it and put out the shifted character */
+ ASCIIZ128(&pOutPos,characterSetCur,aShift,'\0');
+ emptyColumns-=2;
+ characterSetCur=(characterSetCur==CodeB)?CodeA:CodeB;
+ ASCIIZ128(&pOutPos,characterSetCur,data[charCur],'\0');
+ characterSetCur=(characterSetCur==CodeB)?CodeA:CodeB;
+ }else{
+ /* Normal Character */
+ if (characterSetCur==CodeC)
+ {
+ if (data[charCur]==aFNC1)
+ A2C128_C(&pOutPos,aFNC1,'\0');
+ else
+ {
+ A2C128_C(&pOutPos,data[charCur],data[charCur+1]);
+ ++charCur;
+ /* We need this here to get the good index */
+ /* for the termination flags in Set. */
+ }
+ }else
+ ASCIIZ128(&pOutPos,characterSetCur,data[charCur],'\0');
+ --emptyColumns;
+ }
+ /* >> End Criteria */
+ if ((pSet[charCur] & CFill)!=0)
+ {
+ /* Fill Line but leave space for checks in last line */
+ if(rowCur==rows-1 && emptyColumns>=2)
+ emptyColumns-=2;
+ while(emptyColumns>0)
+ {
+ switch(characterSetCur){
+ case CodeC:
+ A2C128_C(&pOutPos,aCodeB,'\0');
+ characterSetCur=CodeB;
+ break;
+ case CodeB:
+ A2C128_B(&pOutPos,aCodeC);
+ characterSetCur=CodeC;
+ break;
+ case CodeA:
+ A2C128_A(&pOutPos,aCodeC);
+ characterSetCur=CodeC;
+ break;
+ }
+ --emptyColumns;
+ }
+ }
+ if ((pSet[charCur] & CEnd)!=0)
+ emptyColumns=0;
+ ++charCur;
+ } /* Loop over characters */
+ } /* if filling-Line / normal */
+
+ /* Add checksum in last line */
+ if(rows>1 && rowCur==rows-1)
+ {
+ SumASCII(&pOutPos,Sum1,characterSetCur);
+ SumASCII(&pOutPos,Sum2,characterSetCur);
+ }
+ /* Add Code 128 checksum */
+ {
+ int Sum=0;
+ int Pos=0;
+ for ( ; Pos < useColumns+3 ; Pos++)
+ {
+ Sum = (Sum +
+ ((Pos==0?1:Pos) * pOutput[columns*rowCur+Pos]) % 103
+ ) % 103;
+ }
+ *pOutPos=(uchar)Sum;
+ pOutPos++;
+ }
+ /* Add end character */
+ *pOutPos=106;
+ pOutPos++;
+ } /* End Lineloop */
+
+ #ifdef _DEBUG
+ /* Dump the output to the screen
+ */
+ printf("\nCode 128 Code Numbers:\n");
+ { /* start a new level of local variables */
+ int DPos, DPos2;
+ for (DPos=0 ; DPos< rows ; DPos++)
+ {
+ for (DPos2=0 ; DPos2 < columns ; DPos2++)
+ {
+ printf("%3d ",(int)(pOutput[DPos*columns+DPos2]));
+ }
+ printf("\n");
+ }
+ }
+ printf("rows=%i columns=%i fillings=%i\n", rows, columns, fillings);
+ #endif
+
+ /* Paint the C128 patterns */
+ for (r = 0; r < rows; r++) {
+ strcpy(dest, "");
+ for(c = 0; c < columns; c++) {
+ strcat(dest, C128Table[pOutput[r * columns + c]]);
+ }
+ expand(symbol, dest);
+ symbol->row_height[r] = 10;
+ }
+
+ if (!(symbol->output_options & BARCODE_BIND)) {
+ symbol->output_options += BARCODE_BIND;
+ }
+
+ if (symbol->border_width < 2) {
+ symbol->border_width = 2;
+ }
+ return 0;
+}
diff --git a/3rdparty/zint-2.6.1/backend/code.c b/3rdparty/zint-2.6.1/backend/code.c
new file mode 100644
index 0000000..cac63ae
--- /dev/null
+++ b/3rdparty/zint-2.6.1/backend/code.c
@@ -0,0 +1,591 @@
+/* code.c - Handles Code 11, 39, 39+ and 93 */
+
+/*
+ libzint - the open source barcode library
+ Copyright (C) 2008-2017 Robin Stuart
+
+ Redistribution and use in source and binary forms, with or without
+ modification, are permitted provided that the following conditions
+ are met:
+
+ 1. Redistributions of source code must retain the above copyright
+ notice, this list of conditions and the following disclaimer.
+ 2. Redistributions in binary form must reproduce the above copyright
+ notice, this list of conditions and the following disclaimer in the
+ documentation and/or other materials provided with the distribution.
+ 3. Neither the name of the project nor the names of its contributors
+ may be used to endorse or promote products derived from this software
+ without specific prior written permission.
+
+ THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND
+ ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+ ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE
+ FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+ DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
+ OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
+ HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
+ LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
+ OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+ SUCH DAMAGE.
+ */
+
+/* In version 0.5 this file was 1,553 lines long! */
+
+#include
+#include
+#include
+#include "common.h"
+
+#define SODIUM "0123456789-"
+#define SILVER "0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ-. $/+%abcd"
+
+static const char *C11Table[11] = {
+ "111121", "211121", "121121", "221111", "112121", "212111", "122111",
+ "111221", "211211", "211111", "112111"
+};
+
+/* Code 39 tables checked against ISO/IEC 16388:2007 */
+
+/* Incorporates Table A1 */
+
+static const char *C39Table[43] = {
+ /* Code 39 character assignments (Table 1) */
+ "1112212111", "2112111121", "1122111121", "2122111111", "1112211121",
+ "2112211111", "1122211111", "1112112121", "2112112111", "1122112111", "2111121121",
+ "1121121121", "2121121111", "1111221121", "2111221111", "1121221111", "1111122121",
+ "2111122111", "1121122111", "1111222111", "2111111221", "1121111221", "2121111211",
+ "1111211221", "2111211211", "1121211211", "1111112221", "2111112211", "1121112211",
+ "1111212211", "2211111121", "1221111121", "2221111111", "1211211121", "2211211111",
+ "1221211111", "1211112121", "2211112111", "1221112111", "1212121111", "1212111211",
+ "1211121211", "1112121211"
+};
+
+static const char *EC39Ctrl[128] = {
+ /* Encoding the full ASCII character set in Code 39 (Table A2) */
+ "%U", "$A", "$B", "$C", "$D", "$E", "$F", "$G", "$H", "$I", "$J", "$K",
+ "$L", "$M", "$N", "$O", "$P", "$Q", "$R", "$S", "$T", "$U", "$V", "$W", "$X", "$Y", "$Z",
+ "%A", "%B", "%C", "%D", "%E", " ", "/A", "/B", "/C", "/D", "/E", "/F", "/G", "/H", "/I", "/J",
+ "/K", "/L", "-", ".", "/O", "0", "1", "2", "3", "4", "5", "6", "7", "8", "9", "/Z", "%F",
+ "%G", "%H", "%I", "%J", "%V", "A", "B", "C", "D", "E", "F", "G", "H", "I", "J", "K", "L", "M",
+ "N", "O", "P", "Q", "R", "S", "T", "U", "V", "W", "X", "Y", "Z", "%K", "%L", "%M", "%N", "%O",
+ "%W", "+A", "+B", "+C", "+D", "+E", "+F", "+G", "+H", "+I", "+J", "+K", "+L", "+M", "+N", "+O",
+ "+P", "+Q", "+R", "+S", "+T", "+U", "+V", "+W", "+X", "+Y", "+Z", "%P", "%Q", "%R", "%S", "%T"
+};
+
+static const char *C93Ctrl[128] = {
+ "bU", "aA", "aB", "aC", "aD", "aE", "aF", "aG", "aH", "aI", "aJ", "aK",
+ "aL", "aM", "aN", "aO", "aP", "aQ", "aR", "aS", "aT", "aU", "aV", "aW", "aX", "aY", "aZ",
+ "bA", "bB", "bC", "bD", "bE", " ", "cA", "cB", "cC", "$", "%", "cF", "cG", "cH", "cI", "cJ",
+ "+", "cL", "-", ".", "/", "0", "1", "2", "3", "4", "5", "6", "7", "8", "9", "cZ", "bF",
+ "bG", "bH", "bI", "bJ", "bV", "A", "B", "C", "D", "E", "F", "G", "H", "I", "J", "K", "L", "M",
+ "N", "O", "P", "Q", "R", "S", "T", "U", "V", "W", "X", "Y", "Z", "bK", "bL", "bM", "bN", "bO",
+ "bW", "dA", "dB", "dC", "dD", "dE", "dF", "dG", "dH", "dI", "dJ", "dK", "dL", "dM", "dN", "dO",
+ "dP", "dQ", "dR", "dS", "dT", "dU", "dV", "dW", "dX", "dY", "dZ", "bP", "bQ", "bR", "bS", "bT"
+};
+
+static const char *C93Table[47] = {
+ "131112", "111213", "111312", "111411", "121113", "121212", "121311",
+ "111114", "131211", "141111", "211113", "211212", "211311", "221112", "221211", "231111",
+ "112113", "112212", "112311", "122112", "132111", "111123", "111222", "111321", "121122",
+ "131121", "212112", "212211", "211122", "211221", "221121", "222111", "112122", "112221",
+ "122121", "123111", "121131", "311112", "311211", "321111", "112131", "113121", "211131",
+ "121221", "312111", "311121", "122211"
+};
+
+/* Global Variables for Channel Code */
+int S[11], B[11];
+long value;
+long target_value;
+char pattern[30];
+
+/* Function Prototypes */
+void NextS(int Chan, int i, int MaxS, int MaxB);
+void NextB(int Chan, int i, int MaxB, int MaxS);
+
+/* *********************** CODE 11 ******************** */
+int code_11(struct zint_symbol *symbol, unsigned char source[], int length) { /* Code 11 */
+
+ unsigned int i;
+ int h, c_digit, c_weight, c_count, k_digit, k_weight, k_count;
+ int weight[128], error_number;
+ char dest[1024]; /* 6 + 121 * 6 + 2 * 6 + 5 + 1 ~ 1024*/
+ char checkstr[3];
+
+ if (length > 121) {
+ strcpy(symbol->errtxt, "320: Input too long");
+ return ZINT_ERROR_TOO_LONG;
+ }
+ error_number = is_sane(SODIUM, source, length);
+ if (error_number == ZINT_ERROR_INVALID_DATA) {
+ strcpy(symbol->errtxt, "321: Invalid characters in data");
+ return error_number;
+ }
+ c_weight = 1;
+ c_count = 0;
+ k_weight = 1;
+ k_count = 0;
+
+ /* start character */
+ strcpy(dest, "112211");
+
+ /* Draw main body of barcode */
+ for (i = 0; i < (unsigned int) length; i++) {
+ lookup(SODIUM, C11Table, source[i], dest);
+ if (source[i] == '-')
+ weight[i] = 10;
+ else
+ weight[i] = ctoi(source[i]);
+ }
+
+ /* Calculate C checksum */
+ for (h = length - 1; h >= 0; h--) {
+ c_count += (c_weight * weight[h]);
+ c_weight++;
+
+ if (c_weight > 10) {
+ c_weight = 1;
+ }
+ }
+ c_digit = c_count % 11;
+
+ weight[length] = c_digit;
+
+ /* Calculate K checksum */
+ for (h = length; h >= 0; h--) {
+ k_count += (k_weight * weight[h]);
+ k_weight++;
+
+ if (k_weight > 9) {
+ k_weight = 1;
+ }
+ }
+ k_digit = k_count % 11;
+
+ checkstr[0] = itoc(c_digit);
+ checkstr[1] = itoc(k_digit);
+ if (checkstr[0] == 'A') {
+ checkstr[0] = '-';
+ }
+ if (checkstr[1] == 'A') {
+ checkstr[1] = '-';
+ }
+ checkstr[2] = '\0';
+ lookup(SODIUM, C11Table, checkstr[0], dest);
+ lookup(SODIUM, C11Table, checkstr[1], dest);
+
+ /* Stop character */
+ strcat(dest, "11221");
+
+ expand(symbol, dest);
+
+ ustrcpy(symbol->text, source);
+ strcat((char*) symbol->text, checkstr);
+ return error_number;
+}
+
+/* Code 39 */
+int c39(struct zint_symbol *symbol, unsigned char source[], const size_t length) {
+ unsigned int i;
+ unsigned int counter;
+ char check_digit;
+ int error_number;
+ char dest[775];
+ char localstr[2] = {0};
+
+ counter = 0;
+
+ if ((symbol->option_2 < 0) || (symbol->option_2 > 1)) {
+ symbol->option_2 = 0;
+ }
+
+ if ((symbol->symbology == BARCODE_LOGMARS) && (length > 59)) {
+ strcpy(symbol->errtxt, "322: Input too long");
+ return ZINT_ERROR_TOO_LONG;
+ } else if (length > 74) {
+ strcpy(symbol->errtxt, "323: Input too long");
+ return ZINT_ERROR_TOO_LONG;
+ }
+ to_upper(source);
+ error_number = is_sane(SILVER, source, length);
+ if (error_number == ZINT_ERROR_INVALID_DATA) {
+ strcpy(symbol->errtxt, "324: Invalid characters in data");
+ return error_number;
+ }
+
+ /* Start character */
+ strcpy(dest, "1211212111");
+
+ for (i = 0; i < (unsigned int) length; i++) {
+ lookup(SILVER, C39Table, source[i], dest);
+ counter += posn(SILVER, source[i]);
+ }
+
+ if ((symbol->symbology == BARCODE_LOGMARS) || (symbol->option_2 == 1)) {
+
+ counter = counter % 43;
+ if (counter < 10) {
+ check_digit = itoc(counter);
+ } else {
+ if (counter < 36) {
+ check_digit = (counter - 10) + 'A';
+ } else {
+ switch (counter) {
+ case 36: check_digit = '-';
+ break;
+ case 37: check_digit = '.';
+ break;
+ case 38: check_digit = ' ';
+ break;
+ case 39: check_digit = '$';
+ break;
+ case 40: check_digit = '/';
+ break;
+ case 41: check_digit = '+';
+ break;
+ case 42: check_digit = 37;
+ break;
+ default: check_digit = ' ';
+ break; /* Keep compiler happy */
+ }
+ }
+ }
+ lookup(SILVER, C39Table, check_digit, dest);
+
+ /* Display a space check digit as _, otherwise it looks like an error */
+ if (check_digit == ' ') {
+ check_digit = '_';
+ }
+
+ localstr[0] = check_digit;
+ localstr[1] = '\0';
+ }
+
+ /* Stop character */
+ strcat(dest, "121121211");
+
+ if ((symbol->symbology == BARCODE_LOGMARS) || (symbol->symbology == BARCODE_HIBC_39)) {
+ /* LOGMARS uses wider 'wide' bars than normal Code 39 */
+ counter = (unsigned int) strlen(dest);
+ for (i = 0; i < counter; i++) {
+ if (dest[i] == '2') {
+ dest[i] = '3';
+ }
+ }
+ }
+
+ expand(symbol, dest);
+
+ if (symbol->symbology == BARCODE_CODE39) {
+ strcpy((char*) symbol->text, "*");
+ strcat((char*) symbol->text, (char*) source);
+ strcat((char*) symbol->text, localstr);
+ strcat((char*) symbol->text, "*");
+ } else {
+ strcpy((char*) symbol->text, (char*) source);
+ strcat((char*) symbol->text, localstr);
+ }
+ return error_number;
+}
+
+/* Pharmazentral Nummer (PZN) */
+int pharmazentral(struct zint_symbol *symbol, unsigned char source[], int length) {
+
+ int i, error_number, zeroes;
+ unsigned int count, check_digit;
+ char localstr[11];
+
+ count = 0;
+ if (length > 7) {
+ strcpy(symbol->errtxt, "325: Input wrong length");
+ return ZINT_ERROR_TOO_LONG;
+ }
+ error_number = is_sane(NEON, source, length);
+ if (error_number == ZINT_ERROR_INVALID_DATA) {
+ strcpy(symbol->errtxt, "326: Invalid characters in data");
+ return error_number;
+ }
+
+ localstr[0] = '-';
+ zeroes = 7 - length + 1;
+ for (i = 1; i < zeroes; i++)
+ localstr[i] = '0';
+ strcpy(localstr + zeroes, (char *) source);
+
+ for (i = 1; i < 8; i++) {
+ count += i * ctoi(localstr[i]);
+ }
+
+ check_digit = count % 11;
+ if (check_digit == 11) {
+ check_digit = 0;
+ }
+ localstr[8] = itoc(check_digit);
+ localstr[9] = '\0';
+ if (localstr[8] == 'A') {
+ strcpy(symbol->errtxt, "327: Invalid PZN Data");
+ return ZINT_ERROR_INVALID_DATA;
+ }
+ error_number = c39(symbol, (unsigned char *) localstr, strlen(localstr));
+ ustrcpy(symbol->text, (unsigned char *) "PZN");
+ strcat((char*) symbol->text, localstr);
+ return error_number;
+}
+
+/* Extended Code 39 - ISO/IEC 16388:2007 Annex A */
+int ec39(struct zint_symbol *symbol, unsigned char source[], int length) {
+
+ unsigned char buffer[150] = {0};
+ unsigned int i;
+ int error_number;
+
+ if (length > 74) {
+ strcpy(symbol->errtxt, "328: Input too long");
+ return ZINT_ERROR_TOO_LONG;
+ }
+
+ /* Creates a buffer string and places control characters into it */
+ for (i = 0; i < (unsigned int) length; i++) {
+ if (source[i] > 127) {
+ /* Cannot encode extended ASCII */
+ strcpy(symbol->errtxt, "329: Invalid characters in input data");
+ return ZINT_ERROR_INVALID_DATA;
+ }
+ strcat((char*) buffer, EC39Ctrl[source[i]]);
+ }
+
+ /* Then sends the buffer to the C39 function */
+ error_number = c39(symbol, buffer, ustrlen(buffer));
+
+ for (i = 0; i < (unsigned int) length; i++)
+ symbol->text[i] = source[i] ? source[i] : ' ';
+ symbol->text[length] = '\0';
+
+ return error_number;
+}
+
+/* Code 93 is an advancement on Code 39 and the definition is a lot tighter */
+int c93(struct zint_symbol *symbol, unsigned char source[], int length) {
+
+ /* SILVER includes the extra characters a, b, c and d to represent Code 93 specific
+ shift characters 1, 2, 3 and 4 respectively. These characters are never used by
+ c39() and ec39() */
+
+ int i;
+ int h, weight, c, k, values[128], error_number;
+ char buffer[220];
+ char dest[670];
+ char set_copy[] = SILVER;
+
+ error_number = 0;
+ strcpy(buffer, "");
+
+ if (length > 107) {
+ strcpy(symbol->errtxt, "330: Input too long");
+ return ZINT_ERROR_TOO_LONG;
+ }
+
+ /* Message Content */
+ for (i = 0; i < length; i++) {
+ if (source[i] > 127) {
+ /* Cannot encode extended ASCII */
+ strcpy(symbol->errtxt, "331: Invalid characters in input data");
+ return ZINT_ERROR_INVALID_DATA;
+ }
+ strcat(buffer, C93Ctrl[source[i]]);
+ symbol->text[i] = source[i] ? source[i] : ' ';
+ }
+
+ /* Now we can check the true length of the barcode */
+ h = (int) strlen(buffer);
+ if (h > 107) {
+ strcpy(symbol->errtxt, "332: Input too long");
+ return ZINT_ERROR_TOO_LONG;
+ }
+
+ for (i = 0; i < h; i++) {
+ values[i] = posn(SILVER, buffer[i]);
+ }
+
+ /* Putting the data into dest[] is not done until after check digits are calculated */
+
+ /* Check digit C */
+ c = 0;
+ weight = 1;
+ for (i = h - 1; i >= 0; i--) {
+ c += values[i] * weight;
+ weight++;
+ if (weight == 21)
+ weight = 1;
+ }
+ c = c % 47;
+ values[h] = c;
+ buffer[h] = set_copy[c];
+
+ /* Check digit K */
+ k = 0;
+ weight = 1;
+ for (i = h; i >= 0; i--) {
+ k += values[i] * weight;
+ weight++;
+ if (weight == 16)
+ weight = 1;
+ }
+ k = k % 47;
+ buffer[++h] = set_copy[k];
+ buffer[++h] = '\0';
+
+ /* Start character */
+ strcpy(dest, "111141");
+
+ for (i = 0; i < h; i++) {
+ lookup(SILVER, C93Table, buffer[i], dest);
+ }
+
+ /* Stop character */
+ strcat(dest, "1111411");
+ expand(symbol, dest);
+
+ symbol->text[length] = set_copy[c];
+ symbol->text[length + 1] = set_copy[k];
+ symbol->text[length + 2] = '\0';
+
+ return error_number;
+}
+
+/* NextS() and NextB() are from ANSI/AIM BC12-1998 and are Copyright (c) AIM 1997 */
+
+/* Their are used here on the understanding that they form part of the specification
+ for Channel Code and therefore their use is permitted under the following terms
+ set out in that document:
+
+ "It is the intent and understanding of AIM [t]hat the symbology presented in this
+ specification is entirely in the public domain and free of all use restrictions,
+ licenses and fees. AIM USA, its memer companies, or individual officers
+ assume no liability for the use of this document." */
+
+void CheckCharacter() {
+ int i;
+ char part[3];
+
+ if (value == target_value) {
+ /* Target reached - save the generated pattern */
+ strcpy(pattern, "11110");
+ for (i = 0; i < 11; i++) {
+ part[0] = itoc(S[i]);
+ part[1] = itoc(B[i]);
+ part[2] = '\0';
+ strcat(pattern, part);
+ }
+ }
+}
+
+void NextB(int Chan, int i, int MaxB, int MaxS) {
+ int b;
+
+ b = (S[i] + B[i - 1] + S[i - 1] + B[i - 2] > 4) ? 1 : 2;
+ if (i < Chan + 2) {
+ for (; b <= MaxB; b++) {
+ B[i] = b;
+ NextS(Chan, i + 1, MaxS, MaxB + 1 - b);
+ }
+ } else if (b <= MaxB) {
+ B[i] = MaxB;
+ CheckCharacter();
+ value++;
+ }
+}
+
+void NextS(int Chan, int i, int MaxS, int MaxB) {
+ int s;
+
+ for (s = (i < Chan + 2) ? 1 : MaxS; s <= MaxS; s++) {
+ S[i] = s;
+ NextB(Chan, i, MaxB, MaxS + 1 - s);
+ }
+}
+
+/* Channel Code - According to ANSI/AIM BC12-1998 */
+int channel_code(struct zint_symbol *symbol, unsigned char source[], int length) {
+ int channels, i;
+ int error_number = 0, range = 0, zeroes;
+ char hrt[9];
+
+ target_value = 0;
+
+ if (length > 7) {
+ strcpy(symbol->errtxt, "333: Input too long");
+ return ZINT_ERROR_TOO_LONG;
+ }
+ error_number = is_sane(NEON, source, length);
+ if (error_number == ZINT_ERROR_INVALID_DATA) {
+ strcpy(symbol->errtxt, "334: Invalid characters in data");
+ return error_number;
+ }
+
+ if ((symbol->option_2 < 3) || (symbol->option_2 > 8)) {
+ channels = 0;
+ } else {
+ channels = symbol->option_2;
+ }
+ if (channels == 0) {
+ channels = length + 1;
+ }
+ if (channels == 2) {
+ channels = 3;
+ }
+
+ for (i = 0; i < length; i++) {
+ target_value *= 10;
+ target_value += ctoi((char) source[i]);
+ }
+
+ switch (channels) {
+ case 3: if (target_value > 26) {
+ range = 1;
+ }
+ break;
+ case 4: if (target_value > 292) {
+ range = 1;
+ }
+ break;
+ case 5: if (target_value > 3493) {
+ range = 1;
+ }
+ break;
+ case 6: if (target_value > 44072) {
+ range = 1;
+ }
+ break;
+ case 7: if (target_value > 576688) {
+ range = 1;
+ }
+ break;
+ case 8: if (target_value > 7742862) {
+ range = 1;
+ }
+ break;
+ }
+ if (range) {
+ strcpy(symbol->errtxt, "335: Value out of range");
+ return ZINT_ERROR_INVALID_DATA;
+ }
+
+ for (i = 0; i < 11; i++) {
+ B[i] = 0;
+ S[i] = 0;
+ }
+
+ B[0] = S[1] = B[1] = S[2] = B[2] = 1;
+ value = 0;
+ NextS(channels, 3, channels, channels);
+
+ zeroes = channels - 1 - length;
+ memset(hrt, '0', zeroes);
+ strcpy(hrt + zeroes, (char *) source);
+ ustrcpy(symbol->text, (unsigned char *) hrt);
+
+ expand(symbol, pattern);
+
+ return error_number;
+}
diff --git a/3rdparty/zint-2.6.1/backend/code1.c b/3rdparty/zint-2.6.1/backend/code1.c
new file mode 100644
index 0000000..5e5861a
--- /dev/null
+++ b/3rdparty/zint-2.6.1/backend/code1.c
@@ -0,0 +1,1765 @@
+/* code1.c - USS Code One */
+
+/*
+ libzint - the open source barcode library
+ Copyright (C) 2009-2017 Robin Stuart
+
+ Redistribution and use in source and binary forms, with or without
+ modification, are permitted provided that the following conditions
+ are met:
+
+ 1. Redistributions of source code must retain the above copyright
+ notice, this list of conditions and the following disclaimer.
+ 2. Redistributions in binary form must reproduce the above copyright
+ notice, this list of conditions and the following disclaimer in the
+ documentation and/or other materials provided with the distribution.
+ 3. Neither the name of the project nor the names of its contributors
+ may be used to endorse or promote products derived from this software
+ without specific prior written permission.
+
+ THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND
+ ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+ ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE
+ FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+ DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
+ OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
+ HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
+ LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
+ OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+ SUCH DAMAGE.
+ */
+
+#include "common.h"
+#include "code1.h"
+#include "reedsol.h"
+#include "large.h"
+#include
+#include
+#include
+
+void horiz(struct zint_symbol *symbol, int row_no, int full) {
+ int i;
+
+ if (full) {
+ for (i = 0; i < symbol->width; i++) {
+ set_module(symbol, row_no, i);
+ }
+ } else {
+ for (i = 1; i < symbol->width - 1; i++) {
+ set_module(symbol, row_no, i);
+ }
+ }
+}
+
+void central_finder(struct zint_symbol *symbol, int start_row, int row_count, int full_rows) {
+ int i;
+
+ for (i = 0; i < row_count; i++) {
+ if (i < full_rows) {
+ horiz(symbol, start_row + (i * 2), 1);
+ } else {
+ horiz(symbol, start_row + (i * 2), 0);
+ if (i != row_count - 1) {
+ set_module(symbol, start_row + (i * 2) + 1, 1);
+ set_module(symbol, start_row + (i * 2) + 1, symbol->width - 2);
+ }
+ }
+ }
+}
+
+void vert(struct zint_symbol *symbol, int column, int height, int top) {
+ int i;
+
+ if (top) {
+ for (i = 0; i < height; i++) {
+ set_module(symbol, i, column);
+ }
+ } else {
+ for (i = 0; i < height; i++) {
+ set_module(symbol, symbol->rows - i - 1, column);
+ }
+ }
+}
+
+void spigot(struct zint_symbol *symbol, int row_no) {
+ int i;
+
+ for (i = symbol->width - 1; i > 0; i--) {
+ if (module_is_set(symbol, row_no, i - 1)) {
+ set_module(symbol, row_no, i);
+ }
+ }
+}
+
+int isedi(unsigned char input) {
+ int result = 0;
+
+ if (input == 13) {
+ result = 1;
+ }
+ if (input == '*') {
+ result = 1;
+ }
+ if (input == '>') {
+ result = 1;
+ }
+ if (input == ' ') {
+ result = 1;
+ }
+ if ((input >= '0') && (input <= '9')) {
+ result = 1;
+ }
+ if ((input >= 'A') && (input <= 'Z')) {
+ result = 1;
+ }
+
+ return result;
+}
+
+int dq4bi(unsigned char source[], int sourcelen, int position) {
+ int i;
+
+ for (i = position; isedi(source[position + i]) && ((position + i) < sourcelen); i++);
+
+ if ((position + i) == sourcelen) {
+ /* Reached end of input */
+ return 0;
+ }
+
+ if (source[position + i - 1] == 13) {
+ return 1;
+ }
+ if (source[position + i - 1] == '*') {
+ return 1;
+ }
+ if (source[position + i - 1] == '>') {
+ return 1;
+ }
+
+ return 0;
+}
+
+static int c1_look_ahead_test(unsigned char source[], int sourcelen, int position, int current_mode, int gs1) {
+ float ascii_count, c40_count, text_count, edi_count, byte_count;
+ char reduced_char;
+ int done, best_scheme, best_count, sp;
+
+ /* Step J */
+ if (current_mode == C1_ASCII) {
+ ascii_count = 0.0;
+ c40_count = 1.0;
+ text_count = 1.0;
+ edi_count = 1.0;
+ byte_count = 2.0;
+ } else {
+ ascii_count = 1.0;
+ c40_count = 2.0;
+ text_count = 2.0;
+ edi_count = 2.0;
+ byte_count = 3.0;
+ }
+
+ switch (current_mode) {
+ case C1_C40: c40_count = 0.0;
+ break;
+ case C1_TEXT: text_count = 0.0;
+ break;
+ case C1_BYTE: byte_count = 0.0;
+ break;
+ case C1_EDI: edi_count = 0.0;
+ break;
+ }
+
+ for (sp = position; (sp < sourcelen) && (sp <= (position + 8)); sp++) {
+
+ if (source[sp] <= 127) {
+ reduced_char = source[sp];
+ } else {
+ reduced_char = source[sp] - 127;
+ }
+
+ /* Step L */
+ if ((source[sp] >= '0') && (source[sp] <= '9')) {
+ ascii_count += 0.5;
+ } else {
+ ascii_count = ceil(ascii_count);
+ if (source[sp] > 127) {
+ ascii_count += 2.0;
+ } else {
+ ascii_count += 1.0;
+ }
+ }
+
+ /* Step M */
+ done = 0;
+ if (reduced_char == ' ') {
+ c40_count += (2.0 / 3.0);
+ done = 1;
+ }
+ if ((reduced_char >= '0') && (reduced_char <= '9')) {
+ c40_count += (2.0 / 3.0);
+ done = 1;
+ }
+ if ((reduced_char >= 'A') && (reduced_char <= 'Z')) {
+ c40_count += (2.0 / 3.0);
+ done = 1;
+ }
+ if (source[sp] > 127) {
+ c40_count += (4.0 / 3.0);
+ }
+ if (done == 0) {
+ c40_count += (4.0 / 3.0);
+ }
+
+ /* Step N */
+ done = 0;
+ if (reduced_char == ' ') {
+ text_count += (2.0 / 3.0);
+ done = 1;
+ }
+ if ((reduced_char >= '0') && (reduced_char <= '9')) {
+ text_count += (2.0 / 3.0);
+ done = 1;
+ }
+ if ((reduced_char >= 'a') && (reduced_char <= 'z')) {
+ text_count += (2.0 / 3.0);
+ done = 1;
+ }
+ if (source[sp] > 127) {
+ text_count += (4.0 / 3.0);
+ }
+ if (done == 0) {
+ text_count += (4.0 / 3.0);
+ }
+
+ /* Step O */
+ done = 0;
+ if (source[sp] == 13) {
+ edi_count += (2.0 / 3.0);
+ done = 1;
+ }
+ if (source[sp] == '*') {
+ edi_count += (2.0 / 3.0);
+ done = 1;
+ }
+ if (source[sp] == '>') {
+ edi_count += (2.0 / 3.0);
+ done = 1;
+ }
+ if (source[sp] == ' ') {
+ edi_count += (2.0 / 3.0);
+ done = 1;
+ }
+ if ((source[sp] >= '0') && (source[sp] <= '9')) {
+ edi_count += (2.0 / 3.0);
+ done = 1;
+ }
+ if ((source[sp] >= 'A') && (source[sp] <= 'Z')) {
+ edi_count += (2.0 / 3.0);
+ done = 1;
+ }
+ if (source[sp] > 127) {
+ edi_count += (13.0 / 3.0);
+ } else {
+ if (done == 0) {
+ edi_count += (10.0 / 3.0);
+ }
+ }
+
+ /* Step P */
+ if (gs1 && (source[sp] == '[')) {
+ byte_count += 3.0;
+ } else {
+ byte_count += 1.0;
+ }
+
+ }
+
+ ascii_count = ceil(ascii_count);
+ c40_count = ceil(c40_count);
+ text_count = ceil(text_count);
+ edi_count = ceil(edi_count);
+ byte_count = ceil(byte_count);
+ best_scheme = C1_ASCII;
+
+ if (sp == sourcelen) {
+ /* Step K */
+ best_count = (int) edi_count;
+
+ if (text_count <= best_count) {
+ best_count = (int) text_count;
+ best_scheme = C1_TEXT;
+ }
+
+ if (c40_count <= best_count) {
+ best_count = (int) c40_count;
+ best_scheme = C1_C40;
+ }
+
+ if (ascii_count <= best_count) {
+ best_count = (int) ascii_count;
+ best_scheme = C1_ASCII;
+ }
+
+ if (byte_count <= best_count) {
+ best_count = (int) byte_count;
+ best_scheme = C1_BYTE;
+ }
+ } else {
+ /* Step Q */
+
+ if (((edi_count + 1.0 <= ascii_count) && (edi_count + 1.0 <= c40_count)) &&
+ ((edi_count + 1.0 <= byte_count) && (edi_count + 1.0 <= text_count))) {
+ best_scheme = C1_EDI;
+ }
+
+ if ((c40_count + 1.0 <= ascii_count) && (c40_count + 1.0 <= text_count)) {
+
+ if (c40_count < edi_count) {
+ best_scheme = C1_C40;
+ } else {
+ done = 0;
+ if (c40_count == edi_count) {
+ if (dq4bi(source, sourcelen, position)) {
+ best_scheme = C1_EDI;
+ } else {
+ best_scheme = C1_C40;
+ }
+ }
+ }
+ }
+
+ if (((text_count + 1.0 <= ascii_count) && (text_count + 1.0 <= c40_count)) &&
+ ((text_count + 1.0 <= byte_count) && (text_count + 1.0 <= edi_count))) {
+ best_scheme = C1_TEXT;
+ }
+
+ if (((ascii_count + 1.0 <= byte_count) && (ascii_count + 1.0 <= c40_count)) &&
+ ((ascii_count + 1.0 <= text_count) && (ascii_count + 1.0 <= edi_count))) {
+ best_scheme = C1_ASCII;
+ }
+
+ if (((byte_count + 1.0 <= ascii_count) && (byte_count + 1.0 <= c40_count)) &&
+ ((byte_count + 1.0 <= text_count) && (byte_count + 1.0 <= edi_count))) {
+ best_scheme = C1_BYTE;
+ }
+ }
+
+ return best_scheme;
+}
+
+int c1_encode(struct zint_symbol *symbol, unsigned char source[], unsigned int target[], int length) {
+ int current_mode, next_mode;
+ int sp, tp, gs1, i, j, p, latch;
+ int c40_buffer[6], c40_p;
+ int text_buffer[6], text_p;
+ int edi_buffer[6], edi_p;
+ char decimal_binary[40];
+ int byte_start = 0;
+
+ sp = 0;
+ tp = 0;
+ latch = 0;
+ memset(c40_buffer, 0, 6);
+ c40_p = 0;
+ memset(text_buffer, 0, 6);
+ text_p = 0;
+ memset(edi_buffer, 0, 6);
+ edi_p = 0;
+ strcpy(decimal_binary, "");
+
+ if (symbol->input_mode == GS1_MODE) {
+ gs1 = 1;
+ } else {
+ gs1 = 0;
+ }
+ if (gs1) {
+ /* FNC1 */
+ target[tp] = 232;
+ tp++;
+ }
+
+ /* Step A */
+ current_mode = C1_ASCII;
+ next_mode = C1_ASCII;
+
+ do {
+ if (current_mode != next_mode) {
+ /* Change mode */
+ switch (next_mode) {
+ case C1_C40: target[tp] = 230;
+ tp++;
+ break;
+ case C1_TEXT: target[tp] = 239;
+ tp++;
+ break;
+ case C1_EDI: target[tp] = 238;
+ tp++;
+ break;
+ case C1_BYTE: target[tp] = 231;
+ tp++;
+ break;
+ }
+ }
+
+ if ((current_mode != C1_BYTE) && (next_mode == C1_BYTE)) {
+ byte_start = tp;
+ }
+ current_mode = next_mode;
+
+ if (current_mode == C1_ASCII) {
+ /* Step B - ASCII encodation */
+ next_mode = C1_ASCII;
+
+ if ((length - sp) >= 21) {
+ /* Step B1 */
+ j = 0;
+
+ for (i = 0; i < 21; i++) {
+ if ((source[sp + i] >= '0') && (source[sp + i] <= '9')) {
+ j++;
+ }
+ }
+
+ if (j == 21) {
+ next_mode = C1_DECIMAL;
+ bin_append(15, 4, decimal_binary);
+ }
+ }
+
+ if ((next_mode == C1_ASCII) && ((length - sp) >= 13)) {
+ /* Step B2 */
+ j = 0;
+
+ for (i = 0; i < 13; i++) {
+ if ((source[sp + i] >= '0') && (source[sp + i] <= '9')) {
+ j++;
+ }
+ }
+
+ if (j == 13) {
+ latch = 0;
+ for (i = sp + 13; i < length; i++) {
+ if (!((source[sp + i] >= '0') && (source[sp + i] <= '9'))) {
+ latch = 1;
+ }
+ }
+
+ if (!(latch)) {
+ next_mode = C1_DECIMAL;
+ bin_append(15, 4, decimal_binary);
+ }
+ }
+ }
+
+ if (next_mode == C1_ASCII) { /* Step B3 */
+ if (istwodigits(source, sp) && ((sp + 1) != length)) {
+ target[tp] = (10 * ctoi(source[sp])) + ctoi(source[sp + 1]) + 130;
+ tp++;
+ sp += 2;
+ } else {
+ if ((gs1) && (source[sp] == '[')) {
+ if ((length - sp) >= 15) {
+ /* Step B4 */
+ j = 0;
+
+ for (i = 0; i < 15; i++) {
+ if ((source[sp + i] >= '0') && (source[sp + i] <= '9')) {
+ j++;
+ }
+ }
+
+ if (j == 15) {
+ target[tp] = 236; /* FNC1 and change to Decimal */
+ tp++;
+ sp++;
+ next_mode = C1_DECIMAL;
+ }
+ }
+
+ if ((length - sp) >= 7) { /* Step B5 */
+ j = 0;
+
+ for (i = 0; i < 7; i++) {
+ if ((source[sp + i] >= '0') && (source[sp + i] <= '9')) {
+ j++;
+ }
+ }
+
+ if (j == 7) {
+ latch = 0;
+ for (i = sp + 7; i < length; i++) {
+ if (!((source[sp + i] >= '0') && (source[sp + i] <= '9'))) {
+ latch = 1;
+ }
+ }
+
+ if (!(latch)) {
+ target[tp] = 236; /* FNC1 and change to Decimal */
+ tp++;
+ sp++;
+ next_mode = C1_DECIMAL;
+ }
+ }
+ }
+ }
+
+ if (next_mode == C1_ASCII) {
+
+ /* Step B6 */
+ next_mode = c1_look_ahead_test(source, length, sp, current_mode, gs1);
+
+ if (next_mode == C1_ASCII) {
+ if (source[sp] > 127) {
+ /* Step B7 */
+ target[tp] = 235; /* FNC4 */
+ tp++;
+ target[tp] = (source[sp] - 128) + 1;
+ tp++;
+ sp++;
+ } else {
+ /* Step B8 */
+ if ((gs1) && (source[sp] == '[')) {
+ target[tp] = 232; /* FNC1 */
+ tp++;
+ sp++;
+ } else {
+ target[tp] = source[sp] + 1;
+ tp++;
+ sp++;
+ }
+ }
+ }
+ }
+ }
+ }
+ }
+
+ if (current_mode == C1_C40) {
+ /* Step C - C40 encodation */
+ int shift_set, value, done = 0, latch = 0;
+
+ next_mode = C1_C40;
+ if (c40_p == 0) {
+ if ((length - sp) >= 12) {
+ j = 0;
+
+ for (i = 0; i < 12; i++) {
+ if ((source[sp + i] >= '0') && (source[sp + i] <= '9')) {
+ j++;
+ }
+ }
+
+ if (j == 12) {
+ next_mode = C1_ASCII;
+ done = 1;
+ }
+ }
+
+ if ((length - sp) >= 8) {
+ j = 0;
+
+ for (i = 0; i < 8; i++) {
+ if ((source[sp + i] >= '0') && (source[sp + i] <= '9')) {
+ j++;
+ }
+ }
+
+ if ((length - sp) == 8) {
+ latch = 1;
+ } else {
+ latch = 1;
+ for (j = sp + 8; j < length; j++) {
+ if ((source[j] <= '0') || (source[j] >= '9')) {
+ latch = 0;
+ }
+ }
+ }
+
+ if ((j == 8) && latch) {
+ next_mode = C1_ASCII;
+ done = 1;
+ }
+ }
+
+ if (!(done)) {
+ next_mode = c1_look_ahead_test(source, length, sp, current_mode, gs1);
+ }
+ }
+
+ if (next_mode != C1_C40) {
+ target[tp] = 255; /* Unlatch */
+ tp++;
+ } else {
+ if (source[sp] > 127) {
+ c40_buffer[c40_p] = 1;
+ c40_p++;
+ c40_buffer[c40_p] = 30; /* Upper Shift */
+ c40_p++;
+ shift_set = c40_shift[source[sp] - 128];
+ value = c40_value[source[sp] - 128];
+ } else {
+ shift_set = c40_shift[source[sp]];
+ value = c40_value[source[sp]];
+ }
+
+ if (gs1 && (source[sp] == '[')) {
+ shift_set = 2;
+ value = 27; /* FNC1 */
+ }
+
+ if (shift_set != 0) {
+ c40_buffer[c40_p] = shift_set - 1;
+ c40_p++;
+ }
+ c40_buffer[c40_p] = value;
+ c40_p++;
+
+ if (c40_p >= 3) {
+ int iv;
+
+ iv = (1600 * c40_buffer[0]) + (40 * c40_buffer[1]) + (c40_buffer[2]) + 1;
+ target[tp] = iv / 256;
+ tp++;
+ target[tp] = iv % 256;
+ tp++;
+
+ c40_buffer[0] = c40_buffer[3];
+ c40_buffer[1] = c40_buffer[4];
+ c40_buffer[2] = c40_buffer[5];
+ c40_buffer[3] = 0;
+ c40_buffer[4] = 0;
+ c40_buffer[5] = 0;
+ c40_p -= 3;
+ }
+ sp++;
+ }
+ }
+
+ if (current_mode == C1_TEXT) {
+ /* Step D - Text encodation */
+ int shift_set, value, done = 0, latch = 0;
+
+ next_mode = C1_TEXT;
+ if (text_p == 0) {
+ if ((length - sp) >= 12) {
+ j = 0;
+
+ for (i = 0; i < 12; i++) {
+ if ((source[sp + i] >= '0') && (source[sp + i] <= '9')) {
+ j++;
+ }
+ }
+
+ if (j == 12) {
+ next_mode = C1_ASCII;
+ done = 1;
+ }
+ }
+
+ if ((length - sp) >= 8) {
+ j = 0;
+
+ for (i = 0; i < 8; i++) {
+ if ((source[sp + i] >= '0') && (source[sp + i] <= '9')) {
+ j++;
+ }
+ }
+
+ if ((length - sp) == 8) {
+ latch = 1;
+ } else {
+ latch = 1;
+ for (j = sp + 8; j < length; j++) {
+ if ((source[j] <= '0') || (source[j] >= '9')) {
+ latch = 0;
+ }
+ }
+ }
+
+ if ((j == 8) && latch) {
+ next_mode = C1_ASCII;
+ done = 1;
+ }
+ }
+
+ if (!(done)) {
+ next_mode = c1_look_ahead_test(source, length, sp, current_mode, gs1);
+ }
+ }
+
+ if (next_mode != C1_TEXT) {
+ target[tp] = 255;
+ tp++; /* Unlatch */
+ } else {
+ if (source[sp] > 127) {
+ text_buffer[text_p] = 1;
+ text_p++;
+ text_buffer[text_p] = 30;
+ text_p++; /* Upper Shift */
+ shift_set = text_shift[source[sp] - 128];
+ value = text_value[source[sp] - 128];
+ } else {
+ shift_set = text_shift[source[sp]];
+ value = text_value[source[sp]];
+ }
+
+ if (gs1 && (source[sp] == '[')) {
+ shift_set = 2;
+ value = 27; /* FNC1 */
+ }
+
+ if (shift_set != 0) {
+ text_buffer[text_p] = shift_set - 1;
+ text_p++;
+ }
+ text_buffer[text_p] = value;
+ text_p++;
+
+ if (text_p >= 3) {
+ int iv;
+
+ iv = (1600 * text_buffer[0]) + (40 * text_buffer[1]) + (text_buffer[2]) + 1;
+ target[tp] = iv / 256;
+ tp++;
+ target[tp] = iv % 256;
+ tp++;
+
+ text_buffer[0] = text_buffer[3];
+ text_buffer[1] = text_buffer[4];
+ text_buffer[2] = text_buffer[5];
+ text_buffer[3] = 0;
+ text_buffer[4] = 0;
+ text_buffer[5] = 0;
+ text_p -= 3;
+ }
+ sp++;
+ }
+ }
+
+ if (current_mode == C1_EDI) {
+ /* Step E - EDI Encodation */
+ int value = 0, latch = 0;
+
+ next_mode = C1_EDI;
+ if (edi_p == 0) {
+ if ((length - sp) >= 12) {
+ j = 0;
+
+ for (i = 0; i < 12; i++) {
+ if ((source[sp + i] >= '0') && (source[sp + i] <= '9')) {
+ j++;
+ }
+ }
+
+ if (j == 12) {
+ next_mode = C1_ASCII;
+ }
+ }
+
+ if ((length - sp) >= 8) {
+ j = 0;
+
+ for (i = 0; i < 8; i++) {
+ if ((source[sp + i] >= '0') && (source[sp + i] <= '9')) {
+ j++;
+ }
+ }
+
+ if ((length - sp) == 8) {
+ latch = 1;
+ } else {
+ latch = 1;
+ for (j = sp + 8; j < length; j++) {
+ if ((source[j] <= '0') || (source[j] >= '9')) {
+ latch = 0;
+ }
+ }
+ }
+
+ if ((j == 8) && latch) {
+ next_mode = C1_ASCII;
+ }
+ }
+
+ if (!((isedi(source[sp]) && isedi(source[sp + 1])) && isedi(source[sp + 2]))) {
+ next_mode = C1_ASCII;
+ }
+ }
+
+ if (next_mode != C1_EDI) {
+ target[tp] = 255; /* Unlatch */
+ tp++;
+ } else {
+ if (source[sp] == 13) {
+ value = 0;
+ }
+ if (source[sp] == '*') {
+ value = 1;
+ }
+ if (source[sp] == '>') {
+ value = 2;
+ }
+ if (source[sp] == ' ') {
+ value = 3;
+ }
+ if ((source[sp] >= '0') && (source[sp] <= '9')) {
+ value = source[sp] - '0' + 4;
+ }
+ if ((source[sp] >= 'A') && (source[sp] <= 'Z')) {
+ value = source[sp] - 'A' + 14;
+ }
+
+ edi_buffer[edi_p] = value;
+ edi_p++;
+
+ if (edi_p >= 3) {
+ int iv;
+
+ iv = (1600 * edi_buffer[0]) + (40 * edi_buffer[1]) + (edi_buffer[2]) + 1;
+ target[tp] = iv / 256;
+ tp++;
+ target[tp] = iv % 256;
+ tp++;
+
+ edi_buffer[0] = edi_buffer[3];
+ edi_buffer[1] = edi_buffer[4];
+ edi_buffer[2] = edi_buffer[5];
+ edi_buffer[3] = 0;
+ edi_buffer[4] = 0;
+ edi_buffer[5] = 0;
+ edi_p -= 3;
+ }
+ sp++;
+ }
+ }
+
+ if (current_mode == C1_DECIMAL) {
+ /* Step F - Decimal encodation */
+ int decimal_count, data_left;
+
+ next_mode = C1_DECIMAL;
+
+ data_left = length - sp;
+ decimal_count = 0;
+
+ if (data_left >= 1) {
+ if ((source[sp] >= '0') && (source[sp] <= '9')) {
+ decimal_count = 1;
+ }
+ }
+ if (data_left >= 2) {
+ if ((decimal_count == 1) && ((source[sp + 1] >= '0') && (source[sp + 1] <= '9'))) {
+ decimal_count = 2;
+ }
+ }
+ if (data_left >= 3) {
+ if ((decimal_count == 2) && ((source[sp + 2] >= '0') && (source[sp + 2] <= '9'))) {
+ decimal_count = 3;
+ }
+ }
+
+ if (decimal_count != 3) {
+ size_t bits_left_in_byte, target_count;
+ int sub_target;
+ /* Finish Decimal mode and go back to ASCII */
+
+ bin_append(63, 6, decimal_binary); /* Unlatch */
+
+ target_count = 3;
+ if (strlen(decimal_binary) <= 16) {
+ target_count = 2;
+ }
+ if (strlen(decimal_binary) <= 8) {
+ target_count = 1;
+ }
+ bits_left_in_byte = (8 * target_count) - strlen(decimal_binary);
+ if (bits_left_in_byte == 8) {
+ bits_left_in_byte = 0;
+ }
+
+ if (bits_left_in_byte == 2) {
+ bin_append(1, 2, decimal_binary);
+ }
+
+ if ((bits_left_in_byte == 4) || (bits_left_in_byte == 6)) {
+ if (decimal_count >= 1) {
+ bin_append(ctoi(source[sp]) + 1, 4, decimal_binary);
+ sp++;
+ } else {
+ bin_append(15, 4, decimal_binary);
+ }
+ }
+
+ if (bits_left_in_byte == 6) {
+ bin_append(1, 2, decimal_binary);
+ }
+
+ /* Binary buffer is full - transfer to target */
+ if (target_count >= 1) {
+ sub_target = 0;
+
+ for (i = 0; i < 8; i++) {
+ if (decimal_binary[i] == '1') {
+ sub_target += 128 >> i;
+ }
+ }
+ target[tp] = sub_target;
+ tp++;
+ }
+ if (target_count >= 2) {
+ sub_target = 0;
+
+ for (i = 0; i < 8; i++) {
+ if (decimal_binary[i + 8] == '1') {
+ sub_target += 128 >> i;
+ }
+ }
+ target[tp] = sub_target;
+ tp++;
+ }
+ if (target_count == 3) {
+ sub_target = 0;
+
+ for (i = 0; i < 8; i++) {
+ if (decimal_binary[i + 16] == '1') {
+ sub_target += 128 >> i;
+ }
+ }
+ target[tp] = sub_target;
+ tp++;
+ }
+
+ next_mode = C1_ASCII;
+ } else {
+ /* There are three digits - convert the value to binary */
+ bin_append((100 * ctoi(source[sp])) + (10 * ctoi(source[sp + 1])) + ctoi(source[sp + 2]) + 1, 10, decimal_binary);
+ sp += 3;
+ }
+
+ if (strlen(decimal_binary) >= 24) {
+ int target1 = 0, target2 = 0, target3 = 0;
+ char temp_binary[40];
+
+ /* Binary buffer is full - transfer to target */
+
+ for (p = 0; p < 8; p++) {
+ if (decimal_binary[p] == '1') {
+ target1 += (0x80 >> p);
+ }
+ if (decimal_binary[p + 8] == '1') {
+ target2 += (0x80 >> p);
+ }
+ if (decimal_binary[p + 16] == '1') {
+ target3 += (0x80 >> p);
+ }
+ }
+ target[tp] = target1;
+ tp++;
+ target[tp] = target2;
+ tp++;
+ target[tp] = target3;
+ tp++;
+
+ strcpy(temp_binary, "");
+ if (strlen(decimal_binary) > 24) {
+ for (i = 0; i <= (int) (strlen(decimal_binary) - 24); i++) {
+ temp_binary[i] = decimal_binary[i + 24];
+ }
+ strcpy(decimal_binary, temp_binary);
+ }
+ }
+ }
+
+ if (current_mode == C1_BYTE) {
+ next_mode = C1_BYTE;
+
+ if (gs1 && (source[sp] == '[')) {
+ next_mode = C1_ASCII;
+ } else {
+ if (source[sp] <= 127) {
+ next_mode = c1_look_ahead_test(source, length, sp, current_mode, gs1);
+ }
+ }
+
+ if (next_mode != C1_BYTE) {
+ /* Insert byte field length */
+ if ((tp - byte_start) <= 249) {
+ for (i = tp; i >= byte_start; i--) {
+ target[i + 1] = target[i];
+ }
+ target[byte_start] = (tp - byte_start);
+ tp++;
+ } else {
+ for (i = tp; i >= byte_start; i--) {
+ target[i + 2] = target[i];
+ }
+ target[byte_start] = 249 + ((tp - byte_start) / 250);
+ target[byte_start + 1] = ((tp - byte_start) % 250);
+ tp += 2;
+ }
+ } else {
+ target[tp] = source[sp];
+ tp++;
+ sp++;
+ }
+ }
+
+ if (tp > 1480) {
+ /* Data is too large for symbol */
+ strcpy(symbol->errtxt, "511: Input data too long");
+ return 0;
+ }
+ } while (sp < length);
+
+ /* Empty buffers */
+ if (c40_p == 2) {
+ int iv;
+
+ c40_buffer[2] = 1;
+ iv = (1600 * c40_buffer[0]) + (40 * c40_buffer[1]) + (c40_buffer[2]) + 1;
+ target[tp] = iv / 256;
+ tp++;
+ target[tp] = iv % 256;
+ tp++;
+ target[tp] = 255;
+ tp++; /* Unlatch */
+ }
+ if (c40_p == 1) {
+ int iv;
+
+ c40_buffer[1] = 1;
+ c40_buffer[2] = 31; /* Pad */
+ iv = (1600 * c40_buffer[0]) + (40 * c40_buffer[1]) + (c40_buffer[2]) + 1;
+ target[tp] = iv / 256;
+ tp++;
+ target[tp] = iv % 256;
+ tp++;
+ target[tp] = 255;
+ tp++; /* Unlatch */
+ }
+ if (text_p == 2) {
+ int iv;
+
+ text_buffer[2] = 1;
+ iv = (1600 * text_buffer[0]) + (40 * text_buffer[1]) + (text_buffer[2]) + 1;
+ target[tp] = iv / 256;
+ tp++;
+ target[tp] = iv % 256;
+ tp++;
+ target[tp] = 255;
+ tp++; /* Unlatch */
+ }
+ if (text_p == 1) {
+ int iv;
+
+ text_buffer[1] = 1;
+ text_buffer[2] = 31; /* Pad */
+ iv = (1600 * text_buffer[0]) + (40 * text_buffer[1]) + (text_buffer[2]) + 1;
+ target[tp] = iv / 256;
+ tp++;
+ target[tp] = iv % 256;
+ tp++;
+ target[tp] = 255;
+ tp++; /* Unlatch */
+ }
+
+ if (current_mode == C1_DECIMAL) {
+ size_t bits_left_in_byte, target_count;
+ int sub_target;
+ /* Finish Decimal mode and go back to ASCII */
+
+ bin_append(63, 6, decimal_binary); /* Unlatch */
+
+ target_count = 3;
+ if (strlen(decimal_binary) <= 16) {
+ target_count = 2;
+ }
+ if (strlen(decimal_binary) <= 8) {
+ target_count = 1;
+ }
+ bits_left_in_byte = (8 * target_count) - strlen(decimal_binary);
+ if (bits_left_in_byte == 8) {
+ bits_left_in_byte = 0;
+ }
+
+ if (bits_left_in_byte == 2) {
+ bin_append(1, 2, decimal_binary);
+ }
+
+ if ((bits_left_in_byte == 4) || (bits_left_in_byte == 6)) {
+ bin_append(15, 4, decimal_binary);
+ }
+
+ if (bits_left_in_byte == 6) {
+ bin_append(1, 2, decimal_binary);
+ }
+
+ /* Binary buffer is full - transfer to target */
+ if (target_count >= 1) {
+ sub_target = 0;
+
+ for (i = 0; i < 8; i++) {
+ if (decimal_binary[i] == '1') {
+ sub_target += 128 >> i;
+ }
+ }
+ target[tp] = sub_target;
+ tp++;
+ }
+ if (target_count >= 2) {
+ sub_target = 0;
+
+ for (i = 0; i < 8; i++) {
+ if (decimal_binary[i + 8] == '1') {
+ sub_target += 128 >> i;
+ }
+ }
+ target[tp] = sub_target;
+ tp++;
+ }
+ if (target_count == 3) {
+ sub_target = 0;
+
+ for (i = 0; i < 8; i++) {
+ if (decimal_binary[i + 16] == '1') {
+ sub_target += 128 >> i;
+ }
+ }
+ target[tp] = sub_target;
+ tp++;
+ }
+ }
+
+ if (current_mode == C1_BYTE) {
+ /* Insert byte field length */
+ if ((tp - byte_start) <= 249) {
+ for (i = tp; i >= byte_start; i--) {
+ target[i + 1] = target[i];
+ }
+ target[byte_start] = (tp - byte_start);
+ tp++;
+ } else {
+ for (i = tp; i >= byte_start; i--) {
+ target[i + 2] = target[i];
+ }
+ target[byte_start] = 249 + ((tp - byte_start) / 250);
+ target[byte_start + 1] = ((tp - byte_start) % 250);
+ tp += 2;
+ }
+ }
+
+ /* Re-check length of data */
+ if (tp > 1480) {
+ /* Data is too large for symbol */
+ strcpy(symbol->errtxt, "512: Input data too long");
+ return 0;
+ }
+ /*
+ printf("targets:\n");
+ for(i = 0; i < tp; i++) {
+ printf("[%d]", target[i]);
+ }
+ printf("\n");
+ */
+ return tp;
+}
+
+void block_copy(struct zint_symbol *symbol, char grid[][120], int start_row, int start_col, int height, int width, int row_offset, int col_offset) {
+ int i, j;
+
+ for (i = start_row; i < (start_row + height); i++) {
+ for (j = start_col; j < (start_col + width); j++) {
+ if (grid[i][j] == '1') {
+ set_module(symbol, i + row_offset, j + col_offset);
+ }
+ }
+ }
+}
+
+int code_one(struct zint_symbol *symbol, unsigned char source[], int length) {
+ int size = 1, i, j, data_blocks;
+
+ char datagrid[136][120];
+ int row, col;
+ int sub_version = 0;
+
+ if ((symbol->option_2 < 0) || (symbol->option_2 > 10)) {
+ strcpy(symbol->errtxt, "513: Invalid symbol size");
+ return ZINT_ERROR_INVALID_OPTION;
+ }
+
+ if (symbol->option_2 == 9) {
+ /* Version S */
+ int codewords;
+ short int elreg[112];
+ unsigned int data[15], ecc[15];
+ int stream[30];
+ int block_width;
+
+ if (length > 18) {
+ strcpy(symbol->errtxt, "514: Input data too long");
+ return ZINT_ERROR_TOO_LONG;
+ }
+ if (is_sane(NEON, source, length) == ZINT_ERROR_INVALID_DATA) {
+ strcpy(symbol->errtxt, "515: Invalid input data (Version S encodes numeric input only)");
+ return ZINT_ERROR_INVALID_DATA;
+ }
+
+ sub_version = 3;
+ codewords = 12;
+ block_width = 6; /* Version S-30 */
+ if (length <= 12) {
+ /* Version S-20 */
+ sub_version = 2;
+ codewords = 8;
+ block_width = 4;
+ }
+ if (length <= 6) {
+ /* Version S-10 */
+ sub_version = 1;
+ codewords = 4;
+ block_width = 2;
+ }
+
+ binary_load(elreg, (char *) source, length);
+
+ for (i = 0; i < 15; i++) {
+ data[i] = 0;
+ ecc[i] = 0;
+ }
+
+ for (i = 0; i < codewords; i++) {
+ data[codewords - i - 1] += 1 * elreg[(i * 5)];
+ data[codewords - i - 1] += 2 * elreg[(i * 5) + 1];
+ data[codewords - i - 1] += 4 * elreg[(i * 5) + 2];
+ data[codewords - i - 1] += 8 * elreg[(i * 5) + 3];
+ data[codewords - i - 1] += 16 * elreg[(i * 5) + 4];
+ }
+
+ rs_init_gf(0x25);
+ rs_init_code(codewords, 1);
+ rs_encode_long(codewords, data, ecc);
+ rs_free();
+
+ for (i = 0; i < codewords; i++) {
+ stream[i] = data[i];
+ stream[i + codewords] = ecc[codewords - i - 1];
+ }
+
+ for (i = 0; i < 136; i++) {
+ for (j = 0; j < 120; j++) {
+ datagrid[i][j] = '0';
+ }
+ }
+
+ i = 0;
+ for (row = 0; row < 2; row++) {
+ for (col = 0; col < block_width; col++) {
+ if (stream[i] & 0x10) {
+ datagrid[row * 2][col * 5] = '1';
+ }
+ if (stream[i] & 0x08) {
+ datagrid[row * 2][(col * 5) + 1] = '1';
+ }
+ if (stream[i] & 0x04) {
+ datagrid[row * 2][(col * 5) + 2] = '1';
+ }
+ if (stream[i] & 0x02) {
+ datagrid[(row * 2) + 1][col * 5] = '1';
+ }
+ if (stream[i] & 0x01) {
+ datagrid[(row * 2) + 1][(col * 5) + 1] = '1';
+ }
+ if (stream[i + 1] & 0x10) {
+ datagrid[row * 2][(col * 5) + 3] = '1';
+ }
+ if (stream[i + 1] & 0x08) {
+ datagrid[row * 2][(col * 5) + 4] = '1';
+ }
+ if (stream[i + 1] & 0x04) {
+ datagrid[(row * 2) + 1][(col * 5) + 2] = '1';
+ }
+ if (stream[i + 1] & 0x02) {
+ datagrid[(row * 2) + 1][(col * 5) + 3] = '1';
+ }
+ if (stream[i + 1] & 0x01) {
+ datagrid[(row * 2) + 1][(col * 5) + 4] = '1';
+ }
+ i += 2;
+ }
+ }
+
+ size = 9;
+ symbol->rows = 8;
+ symbol->width = 10 * sub_version + 1;
+ }
+
+ if (symbol->option_2 == 10) {
+ /* Version T */
+ unsigned int data[40], ecc[25];
+ unsigned int stream[65];
+ int data_length;
+ int data_cw, ecc_cw, block_width;
+
+ for (i = 0; i < 40; i++) {
+ data[i] = 0;
+ }
+ data_length = c1_encode(symbol, source, data, length);
+
+ if (data_length == 0) {
+ return ZINT_ERROR_TOO_LONG;
+ }
+
+ if (data_length > 38) {
+ strcpy(symbol->errtxt, "516: Input data too long");
+ return ZINT_ERROR_TOO_LONG;
+ }
+
+ size = 10;
+ sub_version = 3;
+ data_cw = 38;
+ ecc_cw = 22;
+ block_width = 12;
+ if (data_length <= 24) {
+ sub_version = 2;
+ data_cw = 24;
+ ecc_cw = 16;
+ block_width = 8;
+ }
+ if (data_length <= 10) {
+ sub_version = 1;
+ data_cw = 10;
+ ecc_cw = 10;
+ block_width = 4;
+ }
+
+ for (i = data_length; i < data_cw; i++) {
+ data[i] = 129; /* Pad */
+ }
+
+ /* Calculate error correction data */
+ rs_init_gf(0x12d);
+ rs_init_code(ecc_cw, 1);
+ rs_encode_long(data_cw, data, ecc);
+ rs_free();
+
+ /* "Stream" combines data and error correction data */
+ for (i = 0; i < data_cw; i++) {
+ stream[i] = data[i];
+ }
+ for (i = 0; i < ecc_cw; i++) {
+ stream[data_cw + i] = ecc[ecc_cw - i - 1];
+ }
+
+ for (i = 0; i < 136; i++) {
+ for (j = 0; j < 120; j++) {
+ datagrid[i][j] = '0';
+ }
+ }
+
+ i = 0;
+ for (row = 0; row < 5; row++) {
+ for (col = 0; col < block_width; col++) {
+ if (stream[i] & 0x80) {
+ datagrid[row * 2][col * 4] = '1';
+ }
+ if (stream[i] & 0x40) {
+ datagrid[row * 2][(col * 4) + 1] = '1';
+ }
+ if (stream[i] & 0x20) {
+ datagrid[row * 2][(col * 4) + 2] = '1';
+ }
+ if (stream[i] & 0x10) {
+ datagrid[row * 2][(col * 4) + 3] = '1';
+ }
+ if (stream[i] & 0x08) {
+ datagrid[(row * 2) + 1][col * 4] = '1';
+ }
+ if (stream[i] & 0x04) {
+ datagrid[(row * 2) + 1][(col * 4) + 1] = '1';
+ }
+ if (stream[i] & 0x02) {
+ datagrid[(row * 2) + 1][(col * 4) + 2] = '1';
+ }
+ if (stream[i] & 0x01) {
+ datagrid[(row * 2) + 1][(col * 4) + 3] = '1';
+ }
+ i++;
+ }
+ }
+
+ symbol->rows = 16;
+ symbol->width = (sub_version * 16) + 1;
+ }
+
+ if ((symbol->option_2 != 9) && (symbol->option_2 != 10)) {
+ /* Version A to H */
+ unsigned int data[1500], ecc[600];
+ unsigned int sub_data[190], sub_ecc[75];
+ unsigned int stream[2100];
+ int data_length;
+
+ for (i = 0; i < 1500; i++) {
+ data[i] = 0;
+ }
+ data_length = c1_encode(symbol, source, data, length);
+
+ if (data_length == 0) {
+ strcpy(symbol->errtxt, "517: Input data is too long");
+ return ZINT_ERROR_TOO_LONG;
+ }
+
+ for (i = 7; i >= 0; i--) {
+ if (c1_data_length[i] >= data_length) {
+ size = i + 1;
+ }
+ }
+
+ if (symbol->option_2 > size) {
+ size = symbol->option_2;
+ }
+
+ if ((symbol-> option_2 != 0) && (symbol->option_2 < size)) {
+ strcpy(symbol->errtxt, "518: Input too long for selected symbol size");
+ return ZINT_ERROR_TOO_LONG;
+ }
+
+ for (i = data_length; i < c1_data_length[size - 1]; i++) {
+ data[i] = 129; /* Pad */
+ }
+
+ /* Calculate error correction data */
+ data_length = c1_data_length[size - 1];
+ for (i = 0; i < 190; i++) {
+ sub_data[i] = 0;
+ }
+ for (i = 0; i < 75; i++) {
+ sub_ecc[i] = 0;
+ }
+
+ data_blocks = c1_blocks[size - 1];
+
+ rs_init_gf(0x12d);
+ rs_init_code(c1_ecc_blocks[size - 1], 0);
+ for (i = 0; i < data_blocks; i++) {
+ for (j = 0; j < c1_data_blocks[size - 1]; j++) {
+
+ sub_data[j] = data[j * data_blocks + i];
+ }
+ rs_encode_long(c1_data_blocks[size - 1], sub_data, sub_ecc);
+ for (j = 0; j < c1_ecc_blocks[size - 1]; j++) {
+ ecc[c1_ecc_length[size - 1] - (j * data_blocks + i) - 1] = sub_ecc[j];
+ }
+ }
+ rs_free();
+
+ /* "Stream" combines data and error correction data */
+ for (i = 0; i < data_length; i++) {
+ stream[i] = data[i];
+ }
+ for (i = 0; i < c1_ecc_length[size - 1]; i++) {
+ stream[data_length + i] = ecc[i];
+ }
+
+ for (i = 0; i < 136; i++) {
+ for (j = 0; j < 120; j++) {
+ datagrid[i][j] = '0';
+ }
+ }
+
+ i = 0;
+ for (row = 0; row < c1_grid_height[size - 1]; row++) {
+ for (col = 0; col < c1_grid_width[size - 1]; col++) {
+ if (stream[i] & 0x80) {
+ datagrid[row * 2][col * 4] = '1';
+ }
+ if (stream[i] & 0x40) {
+ datagrid[row * 2][(col * 4) + 1] = '1';
+ }
+ if (stream[i] & 0x20) {
+ datagrid[row * 2][(col * 4) + 2] = '1';
+ }
+ if (stream[i] & 0x10) {
+ datagrid[row * 2][(col * 4) + 3] = '1';
+ }
+ if (stream[i] & 0x08) {
+ datagrid[(row * 2) + 1][col * 4] = '1';
+ }
+ if (stream[i] & 0x04) {
+ datagrid[(row * 2) + 1][(col * 4) + 1] = '1';
+ }
+ if (stream[i] & 0x02) {
+ datagrid[(row * 2) + 1][(col * 4) + 2] = '1';
+ }
+ if (stream[i] & 0x01) {
+ datagrid[(row * 2) + 1][(col * 4) + 3] = '1';
+ }
+ i++;
+ }
+ }
+
+ symbol->rows = c1_height[size - 1];
+ symbol->width = c1_width[size - 1];
+ }
+
+ switch (size) {
+ case 1: /* Version A */
+ central_finder(symbol, 6, 3, 1);
+ vert(symbol, 4, 6, 1);
+ vert(symbol, 12, 5, 0);
+ set_module(symbol, 5, 12);
+ spigot(symbol, 0);
+ spigot(symbol, 15);
+ block_copy(symbol, datagrid, 0, 0, 5, 4, 0, 0);
+ block_copy(symbol, datagrid, 0, 4, 5, 12, 0, 2);
+ block_copy(symbol, datagrid, 5, 0, 5, 12, 6, 0);
+ block_copy(symbol, datagrid, 5, 12, 5, 4, 6, 2);
+ break;
+ case 2: /* Version B */
+ central_finder(symbol, 8, 4, 1);
+ vert(symbol, 4, 8, 1);
+ vert(symbol, 16, 7, 0);
+ set_module(symbol, 7, 16);
+ spigot(symbol, 0);
+ spigot(symbol, 21);
+ block_copy(symbol, datagrid, 0, 0, 7, 4, 0, 0);
+ block_copy(symbol, datagrid, 0, 4, 7, 16, 0, 2);
+ block_copy(symbol, datagrid, 7, 0, 7, 16, 8, 0);
+ block_copy(symbol, datagrid, 7, 16, 7, 4, 8, 2);
+ break;
+ case 3: /* Version C */
+ central_finder(symbol, 11, 4, 2);
+ vert(symbol, 4, 11, 1);
+ vert(symbol, 26, 13, 1);
+ vert(symbol, 4, 10, 0);
+ vert(symbol, 26, 10, 0);
+ spigot(symbol, 0);
+ spigot(symbol, 27);
+ block_copy(symbol, datagrid, 0, 0, 10, 4, 0, 0);
+ block_copy(symbol, datagrid, 0, 4, 10, 20, 0, 2);
+ block_copy(symbol, datagrid, 0, 24, 10, 4, 0, 4);
+ block_copy(symbol, datagrid, 10, 0, 10, 4, 8, 0);
+ block_copy(symbol, datagrid, 10, 4, 10, 20, 8, 2);
+ block_copy(symbol, datagrid, 10, 24, 10, 4, 8, 4);
+ break;
+ case 4: /* Version D */
+ central_finder(symbol, 16, 5, 1);
+ vert(symbol, 4, 16, 1);
+ vert(symbol, 20, 16, 1);
+ vert(symbol, 36, 16, 1);
+ vert(symbol, 4, 15, 0);
+ vert(symbol, 20, 15, 0);
+ vert(symbol, 36, 15, 0);
+ spigot(symbol, 0);
+ spigot(symbol, 12);
+ spigot(symbol, 27);
+ spigot(symbol, 39);
+ block_copy(symbol, datagrid, 0, 0, 15, 4, 0, 0);
+ block_copy(symbol, datagrid, 0, 4, 15, 14, 0, 2);
+ block_copy(symbol, datagrid, 0, 18, 15, 14, 0, 4);
+ block_copy(symbol, datagrid, 0, 32, 15, 4, 0, 6);
+ block_copy(symbol, datagrid, 15, 0, 15, 4, 10, 0);
+ block_copy(symbol, datagrid, 15, 4, 15, 14, 10, 2);
+ block_copy(symbol, datagrid, 15, 18, 15, 14, 10, 4);
+ block_copy(symbol, datagrid, 15, 32, 15, 4, 10, 6);
+ break;
+ case 5: /* Version E */
+ central_finder(symbol, 22, 5, 2);
+ vert(symbol, 4, 22, 1);
+ vert(symbol, 26, 24, 1);
+ vert(symbol, 48, 22, 1);
+ vert(symbol, 4, 21, 0);
+ vert(symbol, 26, 21, 0);
+ vert(symbol, 48, 21, 0);
+ spigot(symbol, 0);
+ spigot(symbol, 12);
+ spigot(symbol, 39);
+ spigot(symbol, 51);
+ block_copy(symbol, datagrid, 0, 0, 21, 4, 0, 0);
+ block_copy(symbol, datagrid, 0, 4, 21, 20, 0, 2);
+ block_copy(symbol, datagrid, 0, 24, 21, 20, 0, 4);
+ block_copy(symbol, datagrid, 0, 44, 21, 4, 0, 6);
+ block_copy(symbol, datagrid, 21, 0, 21, 4, 10, 0);
+ block_copy(symbol, datagrid, 21, 4, 21, 20, 10, 2);
+ block_copy(symbol, datagrid, 21, 24, 21, 20, 10, 4);
+ block_copy(symbol, datagrid, 21, 44, 21, 4, 10, 6);
+ break;
+ case 6: /* Version F */
+ central_finder(symbol, 31, 5, 3);
+ vert(symbol, 4, 31, 1);
+ vert(symbol, 26, 35, 1);
+ vert(symbol, 48, 31, 1);
+ vert(symbol, 70, 35, 1);
+ vert(symbol, 4, 30, 0);
+ vert(symbol, 26, 30, 0);
+ vert(symbol, 48, 30, 0);
+ vert(symbol, 70, 30, 0);
+ spigot(symbol, 0);
+ spigot(symbol, 12);
+ spigot(symbol, 24);
+ spigot(symbol, 45);
+ spigot(symbol, 57);
+ spigot(symbol, 69);
+ block_copy(symbol, datagrid, 0, 0, 30, 4, 0, 0);
+ block_copy(symbol, datagrid, 0, 4, 30, 20, 0, 2);
+ block_copy(symbol, datagrid, 0, 24, 30, 20, 0, 4);
+ block_copy(symbol, datagrid, 0, 44, 30, 20, 0, 6);
+ block_copy(symbol, datagrid, 0, 64, 30, 4, 0, 8);
+ block_copy(symbol, datagrid, 30, 0, 30, 4, 10, 0);
+ block_copy(symbol, datagrid, 30, 4, 30, 20, 10, 2);
+ block_copy(symbol, datagrid, 30, 24, 30, 20, 10, 4);
+ block_copy(symbol, datagrid, 30, 44, 30, 20, 10, 6);
+ block_copy(symbol, datagrid, 30, 64, 30, 4, 10, 8);
+ break;
+ case 7: /* Version G */
+ central_finder(symbol, 47, 6, 2);
+ vert(symbol, 6, 47, 1);
+ vert(symbol, 27, 49, 1);
+ vert(symbol, 48, 47, 1);
+ vert(symbol, 69, 49, 1);
+ vert(symbol, 90, 47, 1);
+ vert(symbol, 6, 46, 0);
+ vert(symbol, 27, 46, 0);
+ vert(symbol, 48, 46, 0);
+ vert(symbol, 69, 46, 0);
+ vert(symbol, 90, 46, 0);
+ spigot(symbol, 0);
+ spigot(symbol, 12);
+ spigot(symbol, 24);
+ spigot(symbol, 36);
+ spigot(symbol, 67);
+ spigot(symbol, 79);
+ spigot(symbol, 91);
+ spigot(symbol, 103);
+ block_copy(symbol, datagrid, 0, 0, 46, 6, 0, 0);
+ block_copy(symbol, datagrid, 0, 6, 46, 19, 0, 2);
+ block_copy(symbol, datagrid, 0, 25, 46, 19, 0, 4);
+ block_copy(symbol, datagrid, 0, 44, 46, 19, 0, 6);
+ block_copy(symbol, datagrid, 0, 63, 46, 19, 0, 8);
+ block_copy(symbol, datagrid, 0, 82, 46, 6, 0, 10);
+ block_copy(symbol, datagrid, 46, 0, 46, 6, 12, 0);
+ block_copy(symbol, datagrid, 46, 6, 46, 19, 12, 2);
+ block_copy(symbol, datagrid, 46, 25, 46, 19, 12, 4);
+ block_copy(symbol, datagrid, 46, 44, 46, 19, 12, 6);
+ block_copy(symbol, datagrid, 46, 63, 46, 19, 12, 8);
+ block_copy(symbol, datagrid, 46, 82, 46, 6, 12, 10);
+ break;
+ case 8: /* Version H */
+ central_finder(symbol, 69, 6, 3);
+ vert(symbol, 6, 69, 1);
+ vert(symbol, 26, 73, 1);
+ vert(symbol, 46, 69, 1);
+ vert(symbol, 66, 73, 1);
+ vert(symbol, 86, 69, 1);
+ vert(symbol, 106, 73, 1);
+ vert(symbol, 126, 69, 1);
+ vert(symbol, 6, 68, 0);
+ vert(symbol, 26, 68, 0);
+ vert(symbol, 46, 68, 0);
+ vert(symbol, 66, 68, 0);
+ vert(symbol, 86, 68, 0);
+ vert(symbol, 106, 68, 0);
+ vert(symbol, 126, 68, 0);
+ spigot(symbol, 0);
+ spigot(symbol, 12);
+ spigot(symbol, 24);
+ spigot(symbol, 36);
+ spigot(symbol, 48);
+ spigot(symbol, 60);
+ spigot(symbol, 87);
+ spigot(symbol, 99);
+ spigot(symbol, 111);
+ spigot(symbol, 123);
+ spigot(symbol, 135);
+ spigot(symbol, 147);
+ block_copy(symbol, datagrid, 0, 0, 68, 6, 0, 0);
+ block_copy(symbol, datagrid, 0, 6, 68, 18, 0, 2);
+ block_copy(symbol, datagrid, 0, 24, 68, 18, 0, 4);
+ block_copy(symbol, datagrid, 0, 42, 68, 18, 0, 6);
+ block_copy(symbol, datagrid, 0, 60, 68, 18, 0, 8);
+ block_copy(symbol, datagrid, 0, 78, 68, 18, 0, 10);
+ block_copy(symbol, datagrid, 0, 96, 68, 18, 0, 12);
+ block_copy(symbol, datagrid, 0, 114, 68, 6, 0, 14);
+ block_copy(symbol, datagrid, 68, 0, 68, 6, 12, 0);
+ block_copy(symbol, datagrid, 68, 6, 68, 18, 12, 2);
+ block_copy(symbol, datagrid, 68, 24, 68, 18, 12, 4);
+ block_copy(symbol, datagrid, 68, 42, 68, 18, 12, 6);
+ block_copy(symbol, datagrid, 68, 60, 68, 18, 12, 8);
+ block_copy(symbol, datagrid, 68, 78, 68, 18, 12, 10);
+ block_copy(symbol, datagrid, 68, 96, 68, 18, 12, 12);
+ block_copy(symbol, datagrid, 68, 114, 68, 6, 12, 14);
+ break;
+ case 9: /* Version S */
+ horiz(symbol, 5, 1);
+ horiz(symbol, 7, 1);
+ set_module(symbol, 6, 0);
+ set_module(symbol, 6, symbol->width - 1);
+ unset_module(symbol, 7, 1);
+ unset_module(symbol, 7, symbol->width - 2);
+ switch (sub_version) {
+ case 1: /* Version S-10 */
+ set_module(symbol, 0, 5);
+ block_copy(symbol, datagrid, 0, 0, 4, 5, 0, 0);
+ block_copy(symbol, datagrid, 0, 5, 4, 5, 0, 1);
+ break;
+ case 2: /* Version S-20 */
+ set_module(symbol, 0, 10);
+ set_module(symbol, 4, 10);
+ block_copy(symbol, datagrid, 0, 0, 4, 10, 0, 0);
+ block_copy(symbol, datagrid, 0, 10, 4, 10, 0, 1);
+ break;
+ case 3: /* Version S-30 */
+ set_module(symbol, 0, 15);
+ set_module(symbol, 4, 15);
+ set_module(symbol, 6, 15);
+ block_copy(symbol, datagrid, 0, 0, 4, 15, 0, 0);
+ block_copy(symbol, datagrid, 0, 15, 4, 15, 0, 1);
+ break;
+ }
+ break;
+ case 10: /* Version T */
+ horiz(symbol, 11, 1);
+ horiz(symbol, 13, 1);
+ horiz(symbol, 15, 1);
+ set_module(symbol, 12, 0);
+ set_module(symbol, 12, symbol->width - 1);
+ set_module(symbol, 14, 0);
+ set_module(symbol, 14, symbol->width - 1);
+ unset_module(symbol, 13, 1);
+ unset_module(symbol, 13, symbol->width - 2);
+ unset_module(symbol, 15, 1);
+ unset_module(symbol, 15, symbol->width - 2);
+ switch (sub_version) {
+ case 1: /* Version T-16 */
+ set_module(symbol, 0, 8);
+ set_module(symbol, 10, 8);
+ block_copy(symbol, datagrid, 0, 0, 10, 8, 0, 0);
+ block_copy(symbol, datagrid, 0, 8, 10, 8, 0, 1);
+ break;
+ case 2: /* Version T-32 */
+ set_module(symbol, 0, 16);
+ set_module(symbol, 10, 16);
+ set_module(symbol, 12, 16);
+ block_copy(symbol, datagrid, 0, 0, 10, 16, 0, 0);
+ block_copy(symbol, datagrid, 0, 16, 10, 16, 0, 1);
+ break;
+ case 3: /* Verion T-48 */
+ set_module(symbol, 0, 24);
+ set_module(symbol, 10, 24);
+ set_module(symbol, 12, 24);
+ set_module(symbol, 14, 24);
+ block_copy(symbol, datagrid, 0, 0, 10, 24, 0, 0);
+ block_copy(symbol, datagrid, 0, 24, 10, 24, 0, 1);
+ break;
+ }
+ break;
+ }
+
+ for (i = 0; i < symbol->rows; i++) {
+ symbol->row_height[i] = 1;
+ }
+
+ return 0;
+}
diff --git a/3rdparty/zint-2.6.1/backend/code1.h b/3rdparty/zint-2.6.1/backend/code1.h
new file mode 100644
index 0000000..e517544
--- /dev/null
+++ b/3rdparty/zint-2.6.1/backend/code1.h
@@ -0,0 +1,102 @@
+/* code1.h - Lookup info for USS Code One */
+
+/*
+ libzint - the open source barcode library
+ Copyright (C) 2009-2017 Robin Stuart
+
+ Redistribution and use in source and binary forms, with or without
+ modification, are permitted provided that the following conditions
+ are met:
+
+ 1. Redistributions of source code must retain the above copyright
+ notice, this list of conditions and the following disclaimer.
+ 2. Redistributions in binary form must reproduce the above copyright
+ notice, this list of conditions and the following disclaimer in the
+ documentation and/or other materials provided with the distribution.
+ 3. Neither the name of the project nor the names of its contributors
+ may be used to endorse or promote products derived from this software
+ without specific prior written permission.
+
+ THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND
+ ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+ ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE
+ FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+ DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
+ OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
+ HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
+ LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
+ OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+ SUCH DAMAGE.
+ */
+
+static const char c40_shift[] = {
+ 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, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 2, 2, 2, 2, 2, 2, 2, 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,
+ 2, 2, 2, 2, 2, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3
+};
+
+static const char c40_value[] = {
+ 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31,
+ 3, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13,
+ 15, 16, 17, 18, 19, 20, 21, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39,
+ 22, 23, 24, 25, 26, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31
+};
+
+static const char text_shift[] = {
+ 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, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 2, 2, 2, 2, 2, 2, 2, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3,
+ 2, 2, 2, 2, 2, 3, 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, 3, 3, 3, 3, 3
+};
+
+static const char text_value[] = {
+ 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31,
+ 3, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13,
+ 15, 16, 17, 18, 19, 20, 21, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26,
+ 22, 23, 24, 25, 26, 0, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 27, 28, 29, 30, 31
+};
+
+static const unsigned short int c1_height[] = {
+ 16, 22, 28, 40, 52, 70, 104, 148
+};
+
+static const unsigned short int c1_width[] = {
+ 18, 22, 32, 42, 54, 76, 98, 134
+};
+
+static const unsigned short int c1_data_length[] = {
+ 10, 19, 44, 91, 182, 370, 732, 1480
+};
+
+static const unsigned short int c1_ecc_length[] = {
+ 10, 16, 26, 44, 70, 140, 280, 560
+};
+
+static const unsigned short int c1_blocks[] = {
+ 1, 1, 1, 1, 1, 2, 4, 8
+};
+
+static const unsigned short int c1_data_blocks[] = {
+ 10, 19, 44, 91, 182, 185, 183, 185
+};
+
+static const unsigned short int c1_ecc_blocks[] = {
+ 10, 16, 26, 44, 70, 70, 70, 70
+};
+
+static const unsigned short int c1_grid_width[] = {
+ 4, 5, 7, 9, 12, 17, 22, 30
+};
+
+static const unsigned short int c1_grid_height[] = {
+ 5, 7, 10, 15, 21, 30, 46, 68
+};
+
+#define C1_ASCII 1
+#define C1_C40 2
+#define C1_DECIMAL 3
+#define C1_TEXT 4
+#define C1_EDI 5
+#define C1_BYTE 6
\ No newline at end of file
diff --git a/3rdparty/zint-2.6.1/backend/code128.c b/3rdparty/zint-2.6.1/backend/code128.c
new file mode 100644
index 0000000..54ccf60
--- /dev/null
+++ b/3rdparty/zint-2.6.1/backend/code128.c
@@ -0,0 +1,1088 @@
+/* code128.c - Handles Code 128 and derivatives */
+
+/*
+ libzint - the open source barcode library
+ Copyright (C) 2008-2017 Robin Stuart
+ Bugfixes thanks to Christian Sakowski and BogDan Vatra
+
+ Redistribution and use in source and binary forms, with or without
+ modification, are permitted provided that the following conditions
+ are met:
+
+ 1. Redistributions of source code must retain the above copyright
+ notice, this list of conditions and the following disclaimer.
+ 2. Redistributions in binary form must reproduce the above copyright
+ notice, this list of conditions and the following disclaimer in the
+ documentation and/or other materials provided with the distribution.
+ 3. Neither the name of the project nor the names of its contributors
+ may be used to endorse or promote products derived from this software
+ without specific prior written permission.
+
+ THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND
+ ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+ ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE
+ FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+ DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
+ OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
+ HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
+ LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
+ OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+ SUCH DAMAGE.
+ */
+
+#include
+#include
+#include
+#ifdef _MSC_VER
+#include
+#endif
+#include "common.h"
+#include "gs1.h"
+
+#define TRUE 1
+#define FALSE 0
+#define SHIFTA 90
+#define LATCHA 91
+#define SHIFTB 92
+#define LATCHB 93
+#define SHIFTC 94
+#define LATCHC 95
+#define AORB 96
+#define ABORC 97
+
+#define DPDSET "0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ*"
+
+static int list[2][170];
+
+/* Code 128 tables checked against ISO/IEC 15417:2007 */
+
+static const char *C128Table[107] = {
+ /* Code 128 character encodation - Table 1 */
+ "212222", "222122", "222221", "121223", "121322", "131222", "122213",
+ "122312", "132212", "221213", "221312", "231212", "112232", "122132", "122231", "113222",
+ "123122", "123221", "223211", "221132", "221231", "213212", "223112", "312131", "311222",
+ "321122", "321221", "312212", "322112", "322211", "212123", "212321", "232121", "111323",
+ "131123", "131321", "112313", "132113", "132311", "211313", "231113", "231311", "112133",
+ "112331", "132131", "113123", "113321", "133121", "313121", "211331", "231131", "213113",
+ "213311", "213131", "311123", "311321", "331121", "312113", "312311", "332111", "314111",
+ "221411", "431111", "111224", "111422", "121124", "121421", "141122", "141221", "112214",
+ "112412", "122114", "122411", "142112", "142211", "241211", "221114", "413111", "241112",
+ "134111", "111242", "121142", "121241", "114212", "124112", "124211", "411212", "421112",
+ "421211", "212141", "214121", "412121", "111143", "111341", "131141", "114113", "114311",
+ "411113", "411311", "113141", "114131", "311141", "411131", "211412", "211214", "211232",
+ "2331112"
+};
+
+/* Determine appropriate mode for a given character */
+int parunmodd(const unsigned char llyth) {
+ int modd;
+ modd = 0;
+
+ if (llyth <= 31) {
+ modd = SHIFTA;
+ } else if ((llyth >= 48) && (llyth <= 57)) {
+ modd = ABORC;
+ } else if (llyth <= 95) {
+ modd = AORB;
+ } else if (llyth <= 127) {
+ modd = SHIFTB;
+ } else if (llyth <= 159) {
+ modd = SHIFTA;
+ } else if (llyth <= 223) {
+ modd = AORB;
+ } else {
+ modd = SHIFTB;
+ }
+
+ return modd;
+}
+
+/**
+ * bring together same type blocks
+ */
+void grwp(int *indexliste) {
+ int i, j;
+
+ /* bring together same type blocks */
+ if (*(indexliste) > 1) {
+ i = 1;
+ while (i < *(indexliste)) {
+ if (list[1][i - 1] == list[1][i]) {
+ /* bring together */
+ list[0][i - 1] = list[0][i - 1] + list[0][i];
+ j = i + 1;
+
+ /* decreace the list */
+ while (j < *(indexliste)) {
+ list[0][j - 1] = list[0][j];
+ list[1][j - 1] = list[1][j];
+ j++;
+ }
+ *(indexliste) = *(indexliste) - 1;
+ i--;
+ }
+ i++;
+ }
+ }
+}
+
+/**
+ * Implements rules from ISO 15417 Annex E
+ */
+void dxsmooth(int *indexliste) {
+ int i, current, last, next, length;
+
+ for (i = 0; i < *(indexliste); i++) {
+ current = list[1][i];
+ length = list[0][i];
+ if (i != 0) {
+ last = list[1][i - 1];
+ } else {
+ last = FALSE;
+ }
+ if (i != *(indexliste) - 1) {
+ next = list[1][i + 1];
+ } else {
+ next = FALSE;
+ }
+
+ if (i == 0) { /* first block */
+ if ((*(indexliste) == 1) && ((length == 2) && (current == ABORC))) {
+ /* Rule 1a */
+ list[1][i] = LATCHC;
+ }
+ if (current == ABORC) {
+ if (length >= 4) {
+ /* Rule 1b */
+ list[1][i] = LATCHC;
+ } else {
+ list[1][i] = AORB;
+ current = AORB;
+ }
+ }
+ if (current == SHIFTA) {
+ /* Rule 1c */
+ list[1][i] = LATCHA;
+ }
+ if ((current == AORB) && (next == SHIFTA)) {
+ /* Rule 1c */
+ list[1][i] = LATCHA;
+ current = LATCHA;
+ }
+ if (current == AORB) {
+ /* Rule 1d */
+ list[1][i] = LATCHB;
+ }
+ } else {
+ if ((current == ABORC) && (length >= 4)) {
+ /* Rule 3 */
+ list[1][i] = LATCHC;
+ current = LATCHC;
+ }
+ if (current == ABORC) {
+ list[1][i] = AORB;
+ current = AORB;
+ }
+ if ((current == AORB) && (last == LATCHA)) {
+ list[1][i] = LATCHA;
+ current = LATCHA;
+ }
+ if ((current == AORB) && (last == LATCHB)) {
+ list[1][i] = LATCHB;
+ current = LATCHB;
+ }
+ if ((current == AORB) && (next == SHIFTA)) {
+ list[1][i] = LATCHA;
+ current = LATCHA;
+ }
+ if ((current == AORB) && (next == SHIFTB)) {
+ list[1][i] = LATCHB;
+ current = LATCHB;
+ }
+ if (current == AORB) {
+ list[1][i] = LATCHB;
+ current = LATCHB;
+ }
+ if ((current == SHIFTA) && (length > 1)) {
+ /* Rule 4 */
+ list[1][i] = LATCHA;
+ current = LATCHA;
+ }
+ if ((current == SHIFTB) && (length > 1)) {
+ /* Rule 5 */
+ list[1][i] = LATCHB;
+ current = LATCHB;
+ }
+ if ((current == SHIFTA) && (last == LATCHA)) {
+ list[1][i] = LATCHA;
+ current = LATCHA;
+ }
+ if ((current == SHIFTB) && (last == LATCHB)) {
+ list[1][i] = LATCHB;
+ current = LATCHB;
+ }
+ if ((current == SHIFTA) && (last == LATCHC)) {
+ list[1][i] = LATCHA;
+ current = LATCHA;
+ }
+ if ((current == SHIFTB) && (last == LATCHC)) {
+ list[1][i] = LATCHB;
+ current = LATCHB;
+ }
+ } /* Rule 2 is implimented elsewhere, Rule 6 is implied */
+ }
+ grwp(indexliste);
+
+}
+
+/**
+ * Translate Code 128 Set A characters into barcodes.
+ * This set handles all control characters NULL to US.
+ */
+void c128_set_a(unsigned char source, char dest[], int values[], int *bar_chars) {
+
+ if (source > 127) {
+ if (source < 160) {
+ strcat(dest, C128Table[(source - 128) + 64]);
+ values[(*bar_chars)] = (source - 128) + 64;
+ } else {
+ strcat(dest, C128Table[(source - 128) - 32]);
+ values[(*bar_chars)] = (source - 128) - 32;
+ }
+ } else {
+ if (source < 32) {
+ strcat(dest, C128Table[source + 64]);
+ values[(*bar_chars)] = source + 64;
+ } else {
+ strcat(dest, C128Table[source - 32]);
+ values[(*bar_chars)] = source - 32;
+ }
+ }
+ (*bar_chars)++;
+}
+
+/**
+ * Translate Code 128 Set B characters into barcodes.
+ * This set handles all characters which are not part of long numbers and not
+ * control characters.
+ */
+void c128_set_b(unsigned char source, char dest[], int values[], int *bar_chars) {
+ if (source > 127) {
+ strcat(dest, C128Table[source - 32 - 128]);
+ values[(*bar_chars)] = source - 32 - 128;
+ } else {
+ strcat(dest, C128Table[source - 32]);
+ values[(*bar_chars)] = source - 32;
+ }
+ (*bar_chars)++;
+}
+
+/* Translate Code 128 Set C characters into barcodes
+ * This set handles numbers in a compressed form
+ */
+void c128_set_c(unsigned char source_a, unsigned char source_b, char dest[], int values[], int *bar_chars) {
+ int weight;
+
+ weight = (10 * ctoi(source_a)) + ctoi(source_b);
+ strcat(dest, C128Table[weight]);
+ values[(*bar_chars)] = weight;
+ (*bar_chars)++;
+}
+
+/* Handle Code 128 and NVE-18 */
+int code_128(struct zint_symbol *symbol, unsigned char source[], const size_t length) {
+ int i, j, k, values[170] = {0}, bar_characters, read, total_sum;
+ int error_number, indexchaine, indexliste, f_state;
+ size_t sourcelen;
+ char set[170] = {' '}, fset[170] = {' '}, mode, last_set, current_set = ' ';
+ float glyph_count;
+ char dest[1000];
+
+ error_number = 0;
+ strcpy(dest, "");
+
+ sourcelen = length;
+
+ j = 0;
+ bar_characters = 0;
+ f_state = 0;
+
+ if (sourcelen > 160) {
+ /* This only blocks rediculously long input - the actual length of the
+ resulting barcode depends on the type of data, so this is trapped later */
+ strcpy(symbol->errtxt, "340: Input too long");
+ return ZINT_ERROR_TOO_LONG;
+ }
+
+ /* Detect extended ASCII characters */
+ for (i = 0; i < sourcelen; i++) {
+ if (source[i] >= 128)
+ fset[i] = 'f';
+ }
+ fset[i] = '\0';
+
+ /* Decide when to latch to extended mode - Annex E note 3 */
+ j = 0;
+ for (i = 0; i < sourcelen; i++) {
+ if (fset[i] == 'f') {
+ j++;
+ } else {
+ j = 0;
+ }
+
+ if (j >= 5) {
+ for (k = i; k > (i - 5); k--) {
+ fset[k] = 'F';
+ }
+ }
+
+ if ((j >= 3) && (i == (sourcelen - 1))) {
+ for (k = i; k > (i - 3); k--) {
+ fset[k] = 'F';
+ }
+ }
+ }
+
+ /* Decide if it is worth reverting to 646 encodation for a few characters as described in 4.3.4.2 (d) */
+ for (i = 1; i < sourcelen; i++) {
+ if ((fset[i - 1] == 'F') && (fset[i] == ' ')) {
+ /* Detected a change from 8859-1 to 646 - count how long for */
+ for (j = 0; (fset[i + j] == ' ') && ((i + j) < sourcelen); j++);
+ if ((j < 5) || ((j < 3) && ((i + j) == (sourcelen - 1)))) {
+ /* Uses the same figures recommended by Annex E note 3 */
+ /* Change to shifting back rather than latching back */
+ for (k = 0; k < j; k++) {
+ fset[i + k] = 'n';
+ }
+ }
+ }
+ }
+
+ /* Decide on mode using same system as PDF417 and rules of ISO 15417 Annex E */
+ indexliste = 0;
+ indexchaine = 0;
+
+ mode = parunmodd(source[indexchaine]);
+ if ((symbol->symbology == BARCODE_CODE128B) && (mode == ABORC)) {
+ mode = AORB;
+ }
+
+ for (i = 0; i < 170; i++) {
+ list[0][i] = 0;
+ }
+
+ do {
+ list[1][indexliste] = mode;
+ while ((list[1][indexliste] == mode) && (indexchaine < sourcelen)) {
+ list[0][indexliste]++;
+ indexchaine++;
+ mode = parunmodd(source[indexchaine]);
+ if ((symbol->symbology == BARCODE_CODE128B) && (mode == ABORC)) {
+ mode = AORB;
+ }
+ }
+ indexliste++;
+ } while (indexchaine < sourcelen);
+
+ dxsmooth(&indexliste);
+
+ /* Resolve odd length LATCHC blocks */
+ if ((list[1][0] == LATCHC) && (list[0][0] & 1)) {
+ /* Rule 2 */
+ list[0][1]++;
+ list[0][0]--;
+ if (indexliste == 1) {
+ list[0][1] = 1;
+ list[1][1] = LATCHB;
+ indexliste = 2;
+ }
+ }
+ if (indexliste > 1) {
+ for (i = 1; i < indexliste; i++) {
+ if ((list[1][i] == LATCHC) && (list[0][i] & 1)) {
+ /* Rule 3b */
+ list[0][i - 1]++;
+ list[0][i]--;
+ }
+ }
+ }
+
+ /* Put set data into set[] */
+
+ read = 0;
+ for (i = 0; i < indexliste; i++) {
+ for (j = 0; j < list[0][i]; j++) {
+ switch (list[1][i]) {
+ case SHIFTA: set[read] = 'a';
+ break;
+ case LATCHA: set[read] = 'A';
+ break;
+ case SHIFTB: set[read] = 'b';
+ break;
+ case LATCHB: set[read] = 'B';
+ break;
+ case LATCHC: set[read] = 'C';
+ break;
+ }
+ read++;
+ }
+ }
+
+ /* Adjust for strings which start with shift characters - make them latch instead */
+ if (set[0] == 'a') {
+ i = 0;
+ do {
+ set[i] = 'A';
+ i++;
+ } while (set[i] == 'a');
+ }
+
+ if (set[0] == 'b') {
+ i = 0;
+ do {
+ set[i] = 'B';
+ i++;
+ } while (set[i] == 'b');
+ }
+
+ /* Now we can calculate how long the barcode is going to be - and stop it from
+ being too long */
+ last_set = ' ';
+ glyph_count = 0.0;
+ for (i = 0; i < sourcelen; i++) {
+ if ((set[i] == 'a') || (set[i] == 'b')) {
+ glyph_count = glyph_count + 1.0;
+ }
+ if ((fset[i] == 'f') || (fset[i] == 'n')) {
+ glyph_count = glyph_count + 1.0;
+ }
+ if (((set[i] == 'A') || (set[i] == 'B')) || (set[i] == 'C')) {
+ if (set[i] != last_set) {
+ last_set = set[i];
+ glyph_count = glyph_count + 1.0;
+ }
+ }
+ if (i == 0) {
+ if (fset[i] == 'F') {
+ glyph_count = glyph_count + 2.0;
+ }
+ } else {
+ if ((fset[i] == 'F') && (fset[i - 1] != 'F')) {
+ glyph_count = glyph_count + 2.0;
+ }
+ if ((fset[i] != 'F') && (fset[i - 1] == 'F')) {
+ glyph_count = glyph_count + 2.0;
+ }
+ }
+
+ if (set[i] == 'C') {
+ glyph_count = glyph_count + 0.5;
+ } else {
+ glyph_count = glyph_count + 1.0;
+ }
+ }
+ if (glyph_count > 60.0) {
+ strcpy(symbol->errtxt, "341: Input too long");
+ return ZINT_ERROR_TOO_LONG;
+ }
+
+ /* So now we know what start character to use - we can get on with it! */
+ if (symbol->output_options & READER_INIT) {
+ /* Reader Initialisation mode */
+ switch (set[0]) {
+ case 'A': /* Start A */
+ strcat(dest, C128Table[103]);
+ values[0] = 103;
+ current_set = 'A';
+ strcat(dest, C128Table[96]); /* FNC3 */
+ values[1] = 96;
+ bar_characters++;
+ break;
+ case 'B': /* Start B */
+ strcat(dest, C128Table[104]);
+ values[0] = 104;
+ current_set = 'B';
+ strcat(dest, C128Table[96]); /* FNC3 */
+ values[1] = 96;
+ bar_characters++;
+ break;
+ case 'C': /* Start C */
+ strcat(dest, C128Table[104]); /* Start B */
+ values[0] = 105;
+ strcat(dest, C128Table[96]); /* FNC3 */
+ values[1] = 96;
+ strcat(dest, C128Table[99]); /* Code C */
+ values[2] = 99;
+ bar_characters += 2;
+ current_set = 'C';
+ break;
+ }
+ } else {
+ /* Normal mode */
+ switch (set[0]) {
+ case 'A': /* Start A */
+ strcat(dest, C128Table[103]);
+ values[0] = 103;
+ current_set = 'A';
+ break;
+ case 'B': /* Start B */
+ strcat(dest, C128Table[104]);
+ values[0] = 104;
+ current_set = 'B';
+ break;
+ case 'C': /* Start C */
+ strcat(dest, C128Table[105]);
+ values[0] = 105;
+ current_set = 'C';
+ break;
+ }
+ }
+ bar_characters++;
+ last_set = set[0];
+
+ if (fset[0] == 'F') {
+ switch (current_set) {
+ case 'A':
+ strcat(dest, C128Table[101]);
+ strcat(dest, C128Table[101]);
+ values[bar_characters] = 101;
+ values[bar_characters + 1] = 101;
+ break;
+ case 'B':
+ strcat(dest, C128Table[100]);
+ strcat(dest, C128Table[100]);
+ values[bar_characters] = 100;
+ values[bar_characters + 1] = 100;
+ break;
+ }
+ bar_characters += 2;
+ f_state = 1;
+ }
+
+ /* Encode the data */
+ read = 0;
+ do {
+
+ if ((read != 0) && (set[read] != current_set)) {
+ /* Latch different code set */
+ switch (set[read]) {
+ case 'A': strcat(dest, C128Table[101]);
+ values[bar_characters] = 101;
+ bar_characters++;
+ current_set = 'A';
+ break;
+ case 'B': strcat(dest, C128Table[100]);
+ values[bar_characters] = 100;
+ bar_characters++;
+ current_set = 'B';
+ break;
+ case 'C': strcat(dest, C128Table[99]);
+ values[bar_characters] = 99;
+ bar_characters++;
+ current_set = 'C';
+ break;
+ }
+ }
+
+ if (read != 0) {
+ if ((fset[read] == 'F') && (f_state == 0)) {
+ /* Latch beginning of extended mode */
+ switch (current_set) {
+ case 'A':
+ strcat(dest, C128Table[101]);
+ strcat(dest, C128Table[101]);
+ values[bar_characters] = 101;
+ values[bar_characters + 1] = 101;
+ break;
+ case 'B':
+ strcat(dest, C128Table[100]);
+ strcat(dest, C128Table[100]);
+ values[bar_characters] = 100;
+ values[bar_characters + 1] = 100;
+ break;
+ }
+ bar_characters += 2;
+ f_state = 1;
+ }
+ if ((fset[read] == ' ') && (f_state == 1)) {
+ /* Latch end of extended mode */
+ switch (current_set) {
+ case 'A':
+ strcat(dest, C128Table[101]);
+ strcat(dest, C128Table[101]);
+ values[bar_characters] = 101;
+ values[bar_characters + 1] = 101;
+ break;
+ case 'B':
+ strcat(dest, C128Table[100]);
+ strcat(dest, C128Table[100]);
+ values[bar_characters] = 100;
+ values[bar_characters + 1] = 100;
+ break;
+ }
+ bar_characters += 2;
+ f_state = 0;
+ }
+ }
+
+ if ((fset[read] == 'f') || (fset[read] == 'n')) {
+ /* Shift to or from extended mode */
+ switch (current_set) {
+ case 'A':
+ strcat(dest, C128Table[101]); /* FNC 4 */
+ values[bar_characters] = 101;
+ break;
+ case 'B':
+ strcat(dest, C128Table[100]); /* FNC 4 */
+ values[bar_characters] = 100;
+ break;
+ }
+ bar_characters++;
+ }
+
+ if ((set[read] == 'a') || (set[read] == 'b')) {
+ /* Insert shift character */
+ strcat(dest, C128Table[98]);
+ values[bar_characters] = 98;
+ bar_characters++;
+ }
+
+ switch (set[read]) { /* Encode data characters */
+ case 'a':
+ case 'A': c128_set_a(source[read], dest, values, &bar_characters);
+ read++;
+ break;
+ case 'b':
+ case 'B': c128_set_b(source[read], dest, values, &bar_characters);
+ read++;
+ break;
+ case 'C': c128_set_c(source[read], source[read + 1], dest, values, &bar_characters);
+ read += 2;
+ break;
+ }
+
+ } while (read < sourcelen);
+
+ /* check digit calculation */
+ total_sum = 0;
+
+ for (i = 0; i < bar_characters; i++) {
+ if (i > 0) {
+ values[i] *= i;
+ }
+ total_sum += values[i];
+ }
+ strcat(dest, C128Table[total_sum % 103]);
+
+ /* Stop character */
+ strcat(dest, C128Table[106]);
+ expand(symbol, dest);
+ return error_number;
+}
+
+/* Handle EAN-128 (Now known as GS1-128) */
+int ean_128(struct zint_symbol *symbol, unsigned char source[], const size_t length) {
+ int i, j, values[170], bar_characters, read, total_sum;
+ int error_number, indexchaine, indexliste;
+ char set[170], mode, last_set;
+ float glyph_count;
+ char dest[1000];
+ int separator_row, linkage_flag, c_count;
+#ifndef _MSC_VER
+ char reduced[length + 1];
+#else
+ char* reduced = (char*) _alloca(length + 1);
+#endif
+ error_number = 0;
+ strcpy(dest, "");
+ linkage_flag = 0;
+
+ j = 0;
+ bar_characters = 0;
+ separator_row = 0;
+
+ memset(values, 0, sizeof (values));
+ memset(set, ' ', sizeof (set));
+
+ if (length > 160) {
+ /* This only blocks rediculously long input - the actual length of the
+ resulting barcode depends on the type of data, so this is trapped later */
+ strcpy(symbol->errtxt, "342: Input too long");
+ return ZINT_ERROR_TOO_LONG;
+ }
+ for (i = 0; i < length; i++) {
+ if (source[i] == '\0') {
+ /* Null characters not allowed! */
+ strcpy(symbol->errtxt, "343: NULL character in input data");
+ return ZINT_ERROR_INVALID_DATA;
+ }
+ }
+
+ /* if part of a composite symbol make room for the separator pattern */
+ if (symbol->symbology == BARCODE_EAN128_CC) {
+ separator_row = symbol->rows;
+ symbol->row_height[symbol->rows] = 1;
+ symbol->rows += 1;
+ }
+
+ if (symbol->input_mode != GS1_MODE) {
+ /* GS1 data has not been checked yet */
+ error_number = gs1_verify(symbol, source, length, reduced);
+ if (error_number != 0) {
+ return error_number;
+ }
+ }
+
+ /* Decide on mode using same system as PDF417 and rules of ISO 15417 Annex E */
+ indexliste = 0;
+ indexchaine = 0;
+
+ mode = parunmodd(reduced[indexchaine]);
+ if (reduced[indexchaine] == '[') {
+ mode = ABORC;
+ }
+
+ for (i = 0; i < 170; i++) {
+ list[0][i] = 0;
+ }
+
+ do {
+ list[1][indexliste] = mode;
+ while ((list[1][indexliste] == mode) && (indexchaine < (int) strlen(reduced))) {
+ list[0][indexliste]++;
+ indexchaine++;
+ mode = parunmodd(reduced[indexchaine]);
+ if (reduced[indexchaine] == '[') {
+ mode = ABORC;
+ }
+ }
+ indexliste++;
+ } while (indexchaine < (int) strlen(reduced));
+
+ dxsmooth(&indexliste);
+
+ /* Put set data into set[] */
+ read = 0;
+ for (i = 0; i < indexliste; i++) {
+ for (j = 0; j < list[0][i]; j++) {
+ switch (list[1][i]) {
+ case SHIFTA: set[read] = 'a';
+ break;
+ case LATCHA: set[read] = 'A';
+ break;
+ case SHIFTB: set[read] = 'b';
+ break;
+ case LATCHB: set[read] = 'B';
+ break;
+ case LATCHC: set[read] = 'C';
+ break;
+ }
+ read++;
+ }
+ }
+
+ /* Watch out for odd-length Mode C blocks */
+ c_count = 0;
+ for (i = 0; i < read; i++) {
+ if (set[i] == 'C') {
+ if (reduced[i] == '[') {
+ if (c_count & 1) {
+ if ((i - c_count) != 0) {
+ set[i - c_count] = 'B';
+ } else {
+ set[i - 1] = 'B';
+ }
+ }
+ c_count = 0;
+ } else {
+ c_count++;
+ }
+ } else {
+ if (c_count & 1) {
+ if ((i - c_count) != 0) {
+ set[i - c_count] = 'B';
+ } else {
+ set[i - 1] = 'B';
+ }
+ }
+ c_count = 0;
+ }
+ }
+ if (c_count & 1) {
+ if ((i - c_count) != 0) {
+ set[i - c_count] = 'B';
+ } else {
+ set[i - 1] = 'B';
+ }
+ }
+ for (i = 1; i < read - 1; i++) {
+ if ((set[i] == 'C') && ((set[i - 1] == 'B') && (set[i + 1] == 'B'))) {
+ set[i] = 'B';
+ }
+ }
+
+ /* Now we can calculate how long the barcode is going to be - and stop it from
+ being too long */
+ last_set = ' ';
+ glyph_count = 0.0;
+ for (i = 0; i < (int) strlen(reduced); i++) {
+ if ((set[i] == 'a') || (set[i] == 'b')) {
+ glyph_count = glyph_count + 1.0;
+ }
+ if (((set[i] == 'A') || (set[i] == 'B')) || (set[i] == 'C')) {
+ if (set[i] != last_set) {
+ last_set = set[i];
+ glyph_count = glyph_count + 1.0;
+ }
+ }
+
+ if ((set[i] == 'C') && (reduced[i] != '[')) {
+ glyph_count = glyph_count + 0.5;
+ } else {
+ glyph_count = glyph_count + 1.0;
+ }
+ }
+ if (glyph_count > 60.0) {
+ strcpy(symbol->errtxt, "344: Input too long");
+ return ZINT_ERROR_TOO_LONG;
+ }
+
+ /* So now we know what start character to use - we can get on with it! */
+ switch (set[0]) {
+ case 'A': /* Start A */
+ strcat(dest, C128Table[103]);
+ values[0] = 103;
+ break;
+ case 'B': /* Start B */
+ strcat(dest, C128Table[104]);
+ values[0] = 104;
+ break;
+ case 'C': /* Start C */
+ strcat(dest, C128Table[105]);
+ values[0] = 105;
+ break;
+ }
+ bar_characters++;
+
+ strcat(dest, C128Table[102]);
+ values[1] = 102;
+ bar_characters++;
+
+ /* Encode the data */
+ read = 0;
+ do {
+
+ if ((read != 0) && (set[read] != set[read - 1])) { /* Latch different code set */
+ switch (set[read]) {
+ case 'A': strcat(dest, C128Table[101]);
+ values[bar_characters] = 101;
+ bar_characters++;
+ break;
+ case 'B': strcat(dest, C128Table[100]);
+ values[bar_characters] = 100;
+ bar_characters++;
+ break;
+ case 'C': strcat(dest, C128Table[99]);
+ values[bar_characters] = 99;
+ bar_characters++;
+ break;
+ }
+ }
+
+ if ((set[read] == 'a') || (set[read] == 'b')) {
+ /* Insert shift character */
+ strcat(dest, C128Table[98]);
+ values[bar_characters] = 98;
+ bar_characters++;
+ }
+
+ if (reduced[read] != '[') {
+ switch (set[read]) { /* Encode data characters */
+ case 'A':
+ case 'a':
+ c128_set_a(reduced[read], dest, values, &bar_characters);
+ read++;
+ break;
+ case 'B':
+ case 'b':
+ c128_set_b(reduced[read], dest, values, &bar_characters);
+ read++;
+ break;
+ case 'C':
+ c128_set_c(reduced[read], reduced[read + 1], dest, values, &bar_characters);
+ read += 2;
+ break;
+ }
+ } else {
+ strcat(dest, C128Table[102]);
+ values[bar_characters] = 102;
+ bar_characters++;
+ read++;
+ }
+ } while (read < (int) strlen(reduced));
+
+ /* "...note that the linkage flag is an extra code set character between
+ the last data character and the Symbol Check Character" (GS1 Specification) */
+
+ /* Linkage flags in GS1-128 are determined by ISO/IEC 24723 section 7.4 */
+
+ switch (symbol->option_1) {
+ case 1:
+ case 2:
+ /* CC-A or CC-B 2D component */
+ switch (set[strlen(reduced) - 1]) {
+ case 'A': linkage_flag = 100;
+ break;
+ case 'B': linkage_flag = 99;
+ break;
+ case 'C': linkage_flag = 101;
+ break;
+ }
+ break;
+ case 3:
+ /* CC-C 2D component */
+ switch (set[strlen(reduced) - 1]) {
+ case 'A': linkage_flag = 99;
+ break;
+ case 'B': linkage_flag = 101;
+ break;
+ case 'C': linkage_flag = 100;
+ break;
+ }
+ break;
+ }
+
+ if (linkage_flag != 0) {
+ strcat(dest, C128Table[linkage_flag]);
+ values[bar_characters] = linkage_flag;
+ bar_characters++;
+ }
+
+ /* check digit calculation */
+ total_sum = 0;
+ for (i = 0; i < bar_characters; i++) {
+ if (i > 0) {
+ values[i] *= i;
+
+ }
+ total_sum += values[i];
+ }
+ strcat(dest, C128Table[total_sum % 103]);
+ values[bar_characters] = total_sum % 103;
+ bar_characters++;
+
+ /* Stop character */
+ strcat(dest, C128Table[106]);
+ values[bar_characters] = 106;
+ bar_characters++;
+ expand(symbol, dest);
+
+ /* Add the separator pattern for composite symbols */
+ if (symbol->symbology == BARCODE_EAN128_CC) {
+ for (i = 0; i < symbol->width; i++) {
+ if (!(module_is_set(symbol, separator_row + 1, i))) {
+ set_module(symbol, separator_row, i);
+ }
+ }
+ }
+
+ for (i = 0; i < length; i++) {
+ if ((source[i] != '[') && (source[i] != ']')) {
+ symbol->text[i] = source[i];
+ }
+ if (source[i] == '[') {
+ symbol->text[i] = '(';
+ }
+ if (source[i] == ']') {
+ symbol->text[i] = ')';
+ }
+ }
+
+ return error_number;
+}
+
+/* Add check digit if encoding an NVE18 symbol */
+int nve_18(struct zint_symbol *symbol, unsigned char source[], int length) {
+ int error_number, zeroes, i, nve_check, total_sum, sourcelen;
+ unsigned char ean128_equiv[25];
+
+ memset(ean128_equiv, 0, 25);
+ sourcelen = length;
+
+ if (sourcelen > 17) {
+ strcpy(symbol->errtxt, "345: Input too long");
+ return ZINT_ERROR_TOO_LONG;
+ }
+
+ error_number = is_sane(NEON, source, length);
+ if (error_number == ZINT_ERROR_INVALID_DATA) {
+ strcpy(symbol->errtxt, "346: Invalid characters in data");
+ return error_number;
+ }
+ zeroes = 17 - sourcelen;
+ strcpy((char *) ean128_equiv, "[00]");
+ memset(ean128_equiv + 4, '0', zeroes);
+ strcpy((char*) ean128_equiv + 4 + zeroes, (char*) source);
+
+ total_sum = 0;
+ for (i = sourcelen - 1; i >= 0; i--) {
+ total_sum += ctoi(source[i]);
+
+ if (!(i & 1)) {
+ total_sum += 2 * ctoi(source[i]);
+ }
+ }
+ nve_check = 10 - total_sum % 10;
+ if (nve_check == 10) {
+ nve_check = 0;
+ }
+ ean128_equiv[21] = itoc(nve_check);
+ ean128_equiv[22] = '\0';
+
+ error_number = ean_128(symbol, ean128_equiv, ustrlen(ean128_equiv));
+
+ return error_number;
+}
+
+/* EAN-14 - A version of EAN-128 */
+int ean_14(struct zint_symbol *symbol, unsigned char source[], int length) {
+ int i, count, check_digit;
+ int error_number, zeroes;
+ unsigned char ean128_equiv[20];
+
+ if (length > 13) {
+ strcpy(symbol->errtxt, "347: Input wrong length");
+ return ZINT_ERROR_TOO_LONG;
+ }
+
+ error_number = is_sane(NEON, source, length);
+ if (error_number == ZINT_ERROR_INVALID_DATA) {
+ strcpy(symbol->errtxt, "348: Invalid character in data");
+ return error_number;
+ }
+
+ zeroes = 13 - length;
+ strcpy((char*) ean128_equiv, "[01]");
+ memset(ean128_equiv + 4, '0', zeroes);
+ ustrcpy(ean128_equiv + 4 + zeroes, source);
+
+ count = 0;
+ for (i = length - 1; i >= 0; i--) {
+ count += ctoi(source[i]);
+
+ if (!(i & 1)) {
+ count += 2 * ctoi(source[i]);
+ }
+ }
+ check_digit = 10 - (count % 10);
+ if (check_digit == 10) {
+ check_digit = 0;
+ }
+ ean128_equiv[17] = itoc(check_digit);
+ ean128_equiv[18] = '\0';
+
+ error_number = ean_128(symbol, ean128_equiv, ustrlen(ean128_equiv));
+
+ return error_number;
+}
diff --git a/3rdparty/zint-2.6.1/backend/code16k.c b/3rdparty/zint-2.6.1/backend/code16k.c
new file mode 100644
index 0000000..f4578f3
--- /dev/null
+++ b/3rdparty/zint-2.6.1/backend/code16k.c
@@ -0,0 +1,733 @@
+/* code16k.c - Handles Code 16k stacked symbology */
+
+/*
+ libzint - the open source barcode library
+ Copyright (C) 2008-2017 Robin Stuart
+
+ Redistribution and use in source and binary forms, with or without
+ modification, are permitted provided that the following conditions
+ are met:
+
+ 1. Redistributions of source code must retain the above copyright
+ notice, this list of conditions and the following disclaimer.
+ 2. Redistributions in binary form must reproduce the above copyright
+ notice, this list of conditions and the following disclaimer in the
+ documentation and/or other materials provided with the distribution.
+ 3. Neither the name of the project nor the names of its contributors
+ may be used to endorse or promote products derived from this software
+ without specific prior written permission.
+
+ THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND
+ ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+ ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE
+ FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+ DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
+ OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
+ HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
+ LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
+ OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+ SUCH DAMAGE.
+ */
+
+/* Updated to comply with BS EN 12323:2005 */
+
+/* Code 16k can hold up to 77 characters or 154 numbers */
+
+#include
+#include
+#include
+#include "common.h"
+
+#define TRUE 1
+#define FALSE 0
+#define SHIFTA 90
+#define LATCHA 91
+#define SHIFTB 92
+#define LATCHB 93
+#define SHIFTC 94
+#define LATCHC 95
+#define AORB 96
+#define ABORC 97
+#define CANDB 98
+#define CANDBB 99
+
+extern int parunmodd(const unsigned char llyth);
+
+static int list[2][170];
+
+static const char *C16KTable[107] = {
+ /* EN 12323 Table 1 - "Code 16K" character encodations */
+ "212222", "222122", "222221", "121223", "121322", "131222", "122213",
+ "122312", "132212", "221213", "221312", "231212", "112232", "122132", "122231", "113222",
+ "123122", "123221", "223211", "221132", "221231", "213212", "223112", "312131", "311222",
+ "321122", "321221", "312212", "322112", "322211", "212123", "212321", "232121", "111323",
+ "131123", "131321", "112313", "132113", "132311", "211313", "231113", "231311", "112133",
+ "112331", "132131", "113123", "113321", "133121", "313121", "211331", "231131", "213113",
+ "213311", "213131", "311123", "311321", "331121", "312113", "312311", "332111", "314111",
+ "221411", "431111", "111224", "111422", "121124", "121421", "141122", "141221", "112214",
+ "112412", "122114", "122411", "142112", "142211", "241211", "221114", "413111", "241112",
+ "134111", "111242", "121142", "121241", "114212", "124112", "124211", "411212", "421112",
+ "421211", "212141", "214121", "412121", "111143", "111341", "131141", "114113", "114311",
+ "411113", "411311", "113141", "114131", "311141", "411131", "211412", "211214", "211232",
+ "211133"
+};
+
+
+static const char *C16KStartStop[8] = {
+ /* EN 12323 Table 3 and Table 4 - Start patterns and stop patterns */
+ "3211", "2221", "2122", "1411", "1132", "1231", "1114", "3112"
+};
+
+/* EN 12323 Table 5 - Start and stop values defining row numbers */
+static const int C16KStartValues[16] = {
+ 0, 1, 2, 3, 4, 5, 6, 7, 0, 1, 2, 3, 4, 5, 6, 7
+};
+
+static const int C16KStopValues[16] = {
+ 0, 1, 2, 3, 4, 5, 6, 7, 4, 5, 6, 7, 0, 1, 2, 3
+};
+
+static void grwp16(unsigned int *indexliste) {
+ int i, j;
+
+ /* bring together same type blocks */
+ if (*(indexliste) > 1) {
+ i = 1;
+ while(i < (int)*(indexliste)) {
+ if (list[1][i - 1] == list[1][i]) {
+ /* bring together */
+ list[0][i - 1] = list[0][i - 1] + list[0][i];
+ j = i + 1;
+
+ /* decreace the list */
+ while(j < (int)*(indexliste)) {
+ list[0][j - 1] = list[0][j];
+ list[1][j - 1] = list[1][j];
+ j++;
+ }
+ *(indexliste) = *(indexliste) - 1;
+ i--;
+ }
+ i++;
+ }
+ }
+}
+
+/* Implements rules from ISO 15417 Annex E */
+static void dxsmooth16(unsigned int *indexliste) {
+ int i, current, last, next, length;
+
+ for(i = 0; i < (int)*(indexliste); i++) {
+ current = list[1][i];
+ length = list[0][i];
+ if (i != 0) {
+ last = list[1][i - 1];
+ } else {
+ last = FALSE;
+ }
+ if (i != *(indexliste) - 1) {
+ next = list[1][i + 1];
+ } else {
+ next = FALSE;
+ }
+
+ if (i == 0) {
+ /* first block */
+ if ((*(indexliste) == 1) && ((length == 2) && (current == ABORC))) {
+ /* Rule 1a */
+ list[1][i] = LATCHC;
+ }
+ if (current == ABORC) {
+ if (length >= 4) {
+ /* Rule 1b */
+ list[1][i] = LATCHC;
+ } else {
+ list[1][i] = AORB;
+ current = AORB;
+ }
+ }
+ if (current == SHIFTA) {
+ /* Rule 1c */
+ list[1][i] = LATCHA;
+ }
+ if ((current == AORB) && (next == SHIFTA)) {
+ /* Rule 1c */
+ list[1][i] = LATCHA;
+ current = LATCHA;
+ }
+ if (current == AORB) {
+ /* Rule 1d */
+ list[1][i] = LATCHB;
+ }
+ } else {
+ if ((current == ABORC) && (length >= 4)) {
+ /* Rule 3 */
+ list[1][i] = LATCHC;
+ current = LATCHC;
+ }
+ if (current == ABORC) {
+ list[1][i] = AORB;
+ current = AORB;
+ }
+ if ((current == AORB) && (last == LATCHA)) {
+ list[1][i] = LATCHA;
+ current = LATCHA;
+ }
+ if ((current == AORB) && (last == LATCHB)) {
+ list[1][i] = LATCHB;
+ current = LATCHB;
+ }
+ if ((current == AORB) && (next == SHIFTA)) {
+ list[1][i] = LATCHA;
+ current = LATCHA;
+ }
+ if ((current == AORB) && (next == SHIFTB)) {
+ list[1][i] = LATCHB;
+ current = LATCHB;
+ }
+ if (current == AORB) {
+ list[1][i] = LATCHB;
+ current = LATCHB;
+ }
+ if ((current == SHIFTA) && (length > 1)) {
+ /* Rule 4 */
+ list[1][i] = LATCHA;
+ current = LATCHA;
+ }
+ if ((current == SHIFTB) && (length > 1)) {
+ /* Rule 5 */
+ list[1][i] = LATCHB;
+ current = LATCHB;
+ }
+ if ((current == SHIFTA) && (last == LATCHA)) {
+ list[1][i] = LATCHA;
+ current = LATCHA;
+ }
+ if ((current == SHIFTB) && (last == LATCHB)) {
+ list[1][i] = LATCHB;
+ current = LATCHB;
+ }
+ if ((current == SHIFTA) && (last == LATCHC)) {
+ list[1][i] = LATCHA;
+ current = LATCHA;
+ }
+ if ((current == SHIFTB) && (last == LATCHC)) {
+ list[1][i] = LATCHB;
+ current = LATCHB;
+ }
+ } /* Rule 2 is implimented elsewhere, Rule 6 is implied */
+ }
+ grwp16(indexliste);
+
+}
+
+static void c16k_set_a(const unsigned char source, unsigned int values[], unsigned int *bar_chars) {
+ if (source > 127) {
+ if (source < 160) {
+ values[(*bar_chars)] = source + 64 - 128;
+ } else {
+ values[(*bar_chars)] = source - 32 - 128;
+ }
+ } else {
+ if (source < 32) {
+ values[(*bar_chars)] = source + 64;
+ } else {
+ values[(*bar_chars)] = source - 32;
+ }
+ }
+ (*bar_chars)++;
+}
+
+static void c16k_set_b(const unsigned char source, unsigned int values[], unsigned int *bar_chars) {
+ if (source > 127) {
+ values[(*bar_chars)] = source - 32 - 128;
+ } else {
+ values[(*bar_chars)] = source - 32;
+ }
+ (*bar_chars)++;
+}
+
+static void c16k_set_c(const unsigned char source_a, unsigned char source_b, unsigned int values[], unsigned int *bar_chars) {
+ int weight;
+
+ weight = (10 * ctoi(source_a)) + ctoi(source_b);
+ values[(*bar_chars)] = weight;
+ (*bar_chars)++;
+}
+
+int code16k(struct zint_symbol *symbol, unsigned char source[], const size_t length) {
+ char width_pattern[100];
+ int current_row, rows_needed, flip_flop, looper, first_check, second_check;
+ int indexchaine, f_state;
+ char set[160] = {' '}, fset[160] = {' '}, mode, last_set, current_set;
+ unsigned int pads_needed, indexliste, i, j, k, m, read, mx_reader, writer;
+ unsigned int values[160] = {0};
+ unsigned int bar_characters;
+ float glyph_count;
+ int errornum, first_sum, second_sum;
+ size_t input_length;
+ int gs1, c_count;
+
+ errornum = 0;
+ strcpy(width_pattern, "");
+ input_length = length;
+
+ if (symbol->input_mode == GS1_MODE) {
+ gs1 = 1;
+ } else {
+ gs1 = 0;
+ }
+
+ if (input_length > 157) {
+ strcpy(symbol->errtxt, "420: Input too long");
+ return ZINT_ERROR_TOO_LONG;
+ }
+
+ bar_characters = 0;
+
+ /* Detect extended ASCII characters */
+ for (i = 0; i < (unsigned int) input_length; i++) {
+ if (source[i] >= 128) {
+ fset[i] = 'f';
+ }
+ }
+ fset[i] = '\0';
+
+ /* Decide when to latch to extended mode */
+ for (i = 0; i < (unsigned int) input_length; i++) {
+ j = 0;
+ if (fset[i] == 'f') {
+ do {
+ j++;
+ } while (fset[i + j] == 'f');
+ if ((j >= 5) || ((j >= 3) && ((i + j) == (input_length - 1)))) {
+ for (k = 0; k <= j; k++) {
+ fset[i + k] = 'F';
+ }
+ }
+ }
+ }
+
+ /* Decide if it is worth reverting to 646 encodation for a few characters */
+ if (input_length > 1) {
+ for (i = 1; i < (unsigned int) input_length; i++) {
+ if ((fset[i - 1] == 'F') && (fset[i] == ' ')) {
+ /* Detected a change from 8859-1 to 646 - count how long for */
+ for (j = 0; (fset[i + j] == ' ') && ((i + j) < (unsigned int) input_length); j++);
+ if ((j < 5) || ((j < 3) && ((i + j) == (input_length - 1)))) {
+ /* Change to shifting back rather than latching back */
+ for (k = 0; k < j; k++) {
+ fset[i + k] = 'n';
+ }
+ }
+ }
+ }
+ }
+ /* Detect mode A, B and C characters */
+ indexliste = 0;
+ indexchaine = 0;
+
+ mode = parunmodd(source[indexchaine]);
+ if ((gs1) && (source[indexchaine] == '[')) {
+ mode = ABORC;
+ } /* FNC1 */
+
+ for (i = 0; i < 160; i++) {
+ list[0][i] = 0;
+ }
+
+ do {
+ list[1][indexliste] = mode;
+ while ((list[1][indexliste] == mode) && (indexchaine < input_length)) {
+ list[0][indexliste]++;
+ indexchaine++;
+ mode = parunmodd(source[indexchaine]);
+ if ((gs1) && (source[indexchaine] == '[')) {
+ mode = ABORC;
+ } /* FNC1 */
+ }
+ indexliste++;
+ } while (indexchaine < input_length);
+
+ dxsmooth16(&indexliste);
+
+ /* Put set data into set[] */
+ read = 0;
+ for (i = 0; i < indexliste; i++) {
+ for (j = 0; j < list[0][i]; j++) {
+ switch (list[1][i]) {
+ case SHIFTA: set[read] = 'a';
+ break;
+ case LATCHA: set[read] = 'A';
+ break;
+ case SHIFTB: set[read] = 'b';
+ break;
+ case LATCHB: set[read] = 'B';
+ break;
+ case LATCHC: set[read] = 'C';
+ break;
+ }
+ read++;
+ }
+ }
+
+ /* Adjust for strings which start with shift characters - make them latch instead */
+ if (set[0] == 'a') {
+ i = 0;
+ do {
+ set[i] = 'A';
+ i++;
+ } while (set[i] == 'a');
+ }
+
+ if (set[0] == 'b') {
+ i = 0;
+ do {
+ set[i] = 'B';
+ i++;
+ } while (set[i] == 'b');
+ }
+
+ /* Watch out for odd-length Mode C blocks */
+ c_count = 0;
+ for (i = 0; i < read; i++) {
+ if (set[i] == 'C') {
+ if (source[i] == '[') {
+ if (c_count & 1) {
+ if ((i - c_count) != 0) {
+ set[i - c_count] = 'B';
+ } else {
+ set[i - 1] = 'B';
+ }
+ }
+ c_count = 0;
+ } else {
+ c_count++;
+ }
+ } else {
+ if (c_count & 1) {
+ if ((i - c_count) != 0) {
+ set[i - c_count] = 'B';
+ } else {
+ set[i - 1] = 'B';
+ }
+ }
+ c_count = 0;
+ }
+ }
+ if (c_count & 1) {
+ if ((i - c_count) != 0) {
+ set[i - c_count] = 'B';
+ } else {
+ set[i - 1] = 'B';
+ }
+ }
+ for (i = 1; i < read - 1; i++) {
+ if ((set[i] == 'C') && ((set[i - 1] == 'B') && (set[i + 1] == 'B'))) {
+ set[i] = 'B';
+ }
+ }
+
+ /* Make sure the data will fit in the symbol */
+ last_set = ' ';
+ glyph_count = 0.0;
+ for (i = 0; i < input_length; i++) {
+ if ((set[i] == 'a') || (set[i] == 'b')) {
+ glyph_count = glyph_count + 1.0;
+ }
+ if ((fset[i] == 'f') || (fset[i] == 'n')) {
+ glyph_count = glyph_count + 1.0;
+ }
+ if (((set[i] == 'A') || (set[i] == 'B')) || (set[i] == 'C')) {
+ if (set[i] != last_set) {
+ last_set = set[i];
+ glyph_count = glyph_count + 1.0;
+ }
+ }
+ if (i == 0) {
+ if ((set[i] == 'B') && (set[1] == 'C')) {
+ glyph_count = glyph_count - 1.0;
+ }
+ if ((set[i] == 'B') && (set[1] == 'B')) {
+ if (set[2] == 'C') {
+ glyph_count = glyph_count - 1.0;
+ }
+ }
+ if (fset[i] == 'F') {
+ glyph_count = glyph_count + 2.0;
+ }
+ } else {
+ if ((fset[i] == 'F') && (fset[i - 1] != 'F')) {
+ glyph_count = glyph_count + 2.0;
+ }
+ if ((fset[i] != 'F') && (fset[i - 1] == 'F')) {
+ glyph_count = glyph_count + 2.0;
+ }
+ }
+
+ if ((set[i] == 'C') && (!((gs1) && (source[i] == '[')))) {
+ glyph_count = glyph_count + 0.5;
+ } else {
+ glyph_count = glyph_count + 1.0;
+ }
+ }
+
+ if ((gs1) && (set[0] != 'A')) {
+ /* FNC1 can be integrated with mode character */
+ glyph_count--;
+ }
+
+ if (glyph_count > 77.0) {
+ strcpy(symbol->errtxt, "421: Input too long");
+ return ZINT_ERROR_TOO_LONG;
+ }
+
+ /* Calculate how tall the symbol will be */
+ glyph_count = glyph_count + 2.0;
+ i = (int)glyph_count;
+ rows_needed = (i / 5);
+ if (i % 5 > 0) {
+ rows_needed++;
+ }
+
+ if (rows_needed == 1) {
+ rows_needed = 2;
+ }
+
+ /* start with the mode character - Table 2 */
+ m = 0;
+ switch (set[0]) {
+ case 'A': m = 0;
+ break;
+ case 'B': m = 1;
+ break;
+ case 'C': m = 2;
+ break;
+ }
+
+ if (symbol->output_options & READER_INIT) {
+ if (m == 2) {
+ m = 5;
+ }
+ if (gs1) {
+ strcpy(symbol->errtxt, "422: Cannot use both GS1 mode and Reader Initialisation");
+ return ZINT_ERROR_INVALID_OPTION;
+ } else {
+ if ((set[0] == 'B') && (set[1] == 'C')) {
+ m = 6;
+ }
+ }
+ values[bar_characters] = (7 * (rows_needed - 2)) + m; /* see 4.3.4.2 */
+ values[bar_characters + 1] = 96; /* FNC3 */
+ bar_characters += 2;
+ } else {
+ if (gs1) {
+ /* Integrate FNC1 */
+ switch (set[0]) {
+ case 'B': m = 3;
+ break;
+ case 'C': m = 4;
+ break;
+ }
+ } else {
+ if ((set[0] == 'B') && (set[1] == 'C')) {
+ m = 5;
+ }
+ if (((set[0] == 'B') && (set[1] == 'B')) && (set[2] == 'C')) {
+ m = 6;
+ }
+ }
+ values[bar_characters] = (7 * (rows_needed - 2)) + m; /* see 4.3.4.2 */
+ bar_characters++;
+ }
+
+ current_set = set[0];
+ f_state = 0;
+ /* f_state remembers if we are in Extended ASCII mode (value 1) or
+ in ISO/IEC 646 mode (value 0) */
+ if (fset[0] == 'F') {
+ switch (current_set) {
+ case 'A':
+ values[bar_characters] = 101;
+ values[bar_characters + 1] = 101;
+ break;
+ case 'B':
+ values[bar_characters] = 100;
+ values[bar_characters + 1] = 100;
+ break;
+ }
+ bar_characters += 2;
+ f_state = 1;
+ }
+
+ read = 0;
+
+ /* Encode the data */
+ do {
+
+ if ((read != 0) && (set[read] != set[read - 1])) {
+ /* Latch different code set */
+ switch (set[read]) {
+ case 'A':
+ values[bar_characters] = 101;
+ bar_characters++;
+ current_set = 'A';
+ break;
+ case 'B':
+ values[bar_characters] = 100;
+ bar_characters++;
+ current_set = 'B';
+ break;
+ case 'C':
+ if (!((read == 1) && (set[0] == 'B'))) {
+ /* Not Mode C/Shift B */
+ if (!((read == 2) && ((set[0] == 'B') && (set[1] == 'B')))) {
+ /* Not Mode C/Double Shift B */
+ values[bar_characters] = 99;
+ bar_characters++;
+ }
+ }
+ current_set = 'C';
+ break;
+ }
+ }
+
+ if (read != 0) {
+ if ((fset[read] == 'F') && (f_state == 0)) {
+ /* Latch beginning of extended mode */
+ switch (current_set) {
+ case 'A':
+ values[bar_characters] = 101;
+ values[bar_characters + 1] = 101;
+ break;
+ case 'B':
+ values[bar_characters] = 100;
+ values[bar_characters + 1] = 100;
+ break;
+ }
+ bar_characters += 2;
+ f_state = 1;
+ }
+ if ((fset[read] == ' ') && (f_state == 1)) {
+ /* Latch end of extended mode */
+ switch (current_set) {
+ case 'A':
+ values[bar_characters] = 101;
+ values[bar_characters + 1] = 101;
+ break;
+ case 'B':
+ values[bar_characters] = 100;
+ values[bar_characters + 1] = 100;
+ break;
+ }
+ bar_characters += 2;
+ f_state = 0;
+ }
+ }
+
+ if ((fset[i] == 'f') || (fset[i] == 'n')) {
+ /* Shift extended mode */
+ switch (current_set) {
+ case 'A':
+ values[bar_characters] = 101; /* FNC 4 */
+ break;
+ case 'B':
+ values[bar_characters] = 100; /* FNC 4 */
+ break;
+ }
+ bar_characters++;
+ }
+
+ if ((set[i] == 'a') || (set[i] == 'b')) {
+ /* Insert shift character */
+ values[bar_characters] = 98;
+ bar_characters++;
+ }
+
+ if (!((gs1) && (source[read] == '['))) {
+ switch (set[read]) { /* Encode data characters */
+ case 'A':
+ case 'a':
+ c16k_set_a(source[read], values, &bar_characters);
+ read++;
+ break;
+ case 'B':
+ case 'b':
+ c16k_set_b(source[read], values, &bar_characters);
+ read++;
+ break;
+ case 'C': c16k_set_c(source[read], source[read + 1], values, &bar_characters);
+ read += 2;
+ break;
+ }
+ } else {
+ values[bar_characters] = 102;
+ bar_characters++;
+ read++;
+ }
+ } while (read < ustrlen(source));
+
+ pads_needed = 5 - ((bar_characters + 2) % 5);
+ if (pads_needed == 5) {
+ pads_needed = 0;
+ }
+ if ((bar_characters + pads_needed) < 8) {
+ pads_needed += 8 - (bar_characters + pads_needed);
+ }
+ for (i = 0; i < pads_needed; i++) {
+ values[bar_characters] = 106;
+ bar_characters++;
+ }
+
+ /* Calculate check digits */
+ first_sum = 0;
+ second_sum = 0;
+ for (i = 0; i < bar_characters; i++) {
+ first_sum += (i + 2) * values[i];
+ second_sum += (i + 1) * values[i];
+ }
+ first_check = first_sum % 107;
+ second_sum += first_check * (bar_characters + 1);
+ second_check = second_sum % 107;
+ values[bar_characters] = first_check;
+ values[bar_characters + 1] = second_check;
+ bar_characters += 2;
+
+ for (current_row = 0; current_row < rows_needed; current_row++) {
+
+ strcpy(width_pattern, "");
+ strcat(width_pattern, C16KStartStop[C16KStartValues[current_row]]);
+ strcat(width_pattern, "1");
+ for (i = 0; i < 5; i++) {
+ strcat(width_pattern, C16KTable[values[(current_row * 5) + i]]);
+ }
+ strcat(width_pattern, C16KStartStop[C16KStopValues[current_row]]);
+
+ /* Write the information into the symbol */
+ writer = 0;
+ flip_flop = 1;
+ for (mx_reader = 0; mx_reader < strlen(width_pattern); mx_reader++) {
+ for (looper = 0; looper < ctoi(width_pattern[mx_reader]); looper++) {
+ if (flip_flop == 1) {
+ set_module(symbol, current_row, writer);
+ writer++;
+ } else {
+ writer++;
+ }
+ }
+ if (flip_flop == 0) {
+ flip_flop = 1;
+ } else {
+ flip_flop = 0;
+ }
+ }
+ symbol->row_height[current_row] = 10;
+ }
+
+ symbol->rows = rows_needed;
+ symbol->width = 70;
+ return errornum;
+}
+
+
diff --git a/3rdparty/zint-2.6.1/backend/code49.c b/3rdparty/zint-2.6.1/backend/code49.c
new file mode 100644
index 0000000..8ab92a6
--- /dev/null
+++ b/3rdparty/zint-2.6.1/backend/code49.c
@@ -0,0 +1,345 @@
+/* code49.c - Handles Code 49 */
+
+/*
+ libzint - the open source barcode library
+ Copyright (C) 2009-2017 Robin Stuart
+
+ Redistribution and use in source and binary forms, with or without
+ modification, are permitted provided that the following conditions
+ are met:
+
+ 1. Redistributions of source code must retain the above copyright
+ notice, this list of conditions and the following disclaimer.
+ 2. Redistributions in binary form must reproduce the above copyright
+ notice, this list of conditions and the following disclaimer in the
+ documentation and/or other materials provided with the distribution.
+ 3. Neither the name of the project nor the names of its contributors
+ may be used to endorse or promote products derived from this software
+ without specific prior written permission.
+
+ THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND
+ ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+ ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE
+ FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+ DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
+ OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
+ HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
+ LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
+ OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+ SUCH DAMAGE.
+ */
+
+#include
+#include
+#include
+#include "common.h"
+#include "code49.h"
+
+#define INSET "0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ-. $/+%!&*"
+
+/* "!" represents Shift 1 and "&" represents Shift 2, "*" represents FNC1 */
+
+int code_49(struct zint_symbol *symbol, unsigned char source[], const int length) {
+ int i, j, rows, M, x_count, y_count, z_count, posn_val, local_value;
+ char intermediate[170] = "";
+ int codewords[170], codeword_count;
+ int c_grid[8][8]; /* Refers to table 3 */
+ int w_grid[8][4]; /* Refets to table 2 */
+ int pad_count = 0;
+ char pattern[80];
+ int gs1;
+ size_t h;
+
+ if (length > 81) {
+ strcpy(symbol->errtxt, "430: Input too long");
+ return ZINT_ERROR_TOO_LONG;
+ }
+ if (symbol->input_mode == GS1_MODE) {
+ gs1 = 1;
+ strcpy(intermediate, "*"); /* FNC1 */
+ } else {
+ gs1 = 0;
+ }
+
+ for (i = 0; i < length; i++) {
+ if (source[i] > 127) {
+ strcpy(symbol->errtxt, "431: Invalid characters in input data");
+ return ZINT_ERROR_INVALID_DATA;
+ }
+ if (gs1 && (source[i] == '['))
+ strcat(intermediate, "*"); /* FNC1 */
+ else
+ strcat(intermediate, c49_table7[source[i]]);
+ }
+
+ codeword_count = 0;
+ i = 0;
+ h = strlen(intermediate);
+ do {
+ if ((intermediate[i] >= '0') && (intermediate[i] <= '9')) {
+ /* Numeric data */
+ for (j = 0; (intermediate[i + j] >= '0') && (intermediate[i + j] <= '9'); j++);
+ if (j >= 5) {
+ /* Use Numeric Encodation Method */
+ int block_count, c;
+ int block_remain;
+ int block_value;
+
+ codewords[codeword_count] = 48; /* Numeric Shift */
+ codeword_count++;
+
+ block_count = j / 5;
+ block_remain = j % 5;
+
+ for (c = 0; c < block_count; c++) {
+ if ((c == block_count - 1) && (block_remain == 2)) {
+ /* Rule (d) */
+ block_value = 100000;
+ block_value += ctoi(intermediate[i]) * 1000;
+ block_value += ctoi(intermediate[i + 1]) * 100;
+ block_value += ctoi(intermediate[i + 2]) * 10;
+ block_value += ctoi(intermediate[i + 3]);
+
+ codewords[codeword_count] = block_value / (48 * 48);
+ block_value = block_value - (48 * 48) * codewords[codeword_count];
+ codeword_count++;
+ codewords[codeword_count] = block_value / 48;
+ block_value = block_value - 48 * codewords[codeword_count];
+ codeword_count++;
+ codewords[codeword_count] = block_value;
+ codeword_count++;
+ i += 4;
+ block_value = ctoi(intermediate[i]) * 100;
+ block_value += ctoi(intermediate[i + 1]) * 10;
+ block_value += ctoi(intermediate[i + 2]);
+
+ codewords[codeword_count] = block_value / 48;
+ block_value = block_value - 48 * codewords[codeword_count];
+ codeword_count++;
+ codewords[codeword_count] = block_value;
+ codeword_count++;
+ i += 3;
+ } else {
+ block_value = ctoi(intermediate[i]) * 10000;
+ block_value += ctoi(intermediate[i + 1]) * 1000;
+ block_value += ctoi(intermediate[i + 2]) * 100;
+ block_value += ctoi(intermediate[i + 3]) * 10;
+ block_value += ctoi(intermediate[i + 4]);
+
+ codewords[codeword_count] = block_value / (48 * 48);
+ block_value = block_value - (48 * 48) * codewords[codeword_count];
+ codeword_count++;
+ codewords[codeword_count] = block_value / 48;
+ block_value = block_value - 48 * codewords[codeword_count];
+ codeword_count++;
+ codewords[codeword_count] = block_value;
+ codeword_count++;
+ i += 5;
+ }
+ }
+
+ switch (block_remain) {
+ case 1:
+ /* Rule (a) */
+ codewords[codeword_count] = posn(INSET, intermediate[i]);
+ codeword_count++;
+ i++;
+ break;
+ case 3:
+ /* Rule (b) */
+ block_value = ctoi(intermediate[i]) * 100;
+ block_value += ctoi(intermediate[i + 1]) * 10;
+ block_value += ctoi(intermediate[i + 2]);
+
+ codewords[codeword_count] = block_value / 48;
+ block_value = block_value - 48 * codewords[codeword_count];
+ codeword_count++;
+ codewords[codeword_count] = block_value;
+ codeword_count++;
+ i += 3;
+ break;
+ case 4:
+ /* Rule (c) */
+ block_value = 100000;
+ block_value += ctoi(intermediate[i]) * 1000;
+ block_value += ctoi(intermediate[i + 1]) * 100;
+ block_value += ctoi(intermediate[i + 2]) * 10;
+ block_value += ctoi(intermediate[i + 3]);
+
+ codewords[codeword_count] = block_value / (48 * 48);
+ block_value = block_value - (48 * 48) * codewords[codeword_count];
+ codeword_count++;
+ codewords[codeword_count] = block_value / 48;
+ block_value = block_value - 48 * codewords[codeword_count];
+ codeword_count++;
+ codewords[codeword_count] = block_value;
+ codeword_count++;
+ i += 4;
+ break;
+ }
+ if (i < h) {
+ /* There is more to add */
+ codewords[codeword_count] = 48; /* Numeric Shift */
+ codeword_count++;
+ }
+ } else {
+ codewords[codeword_count] = posn(INSET, intermediate[i]);
+ codeword_count++;
+ i++;
+ }
+ } else {
+ codewords[codeword_count] = posn(INSET, intermediate[i]);
+ codeword_count++;
+ i++;
+ }
+ } while (i < h);
+
+ switch (codewords[0]) {
+ /* Set starting mode value */
+ case 48: M = 2;
+ break;
+ case 43: M = 4;
+ break;
+ case 44: M = 5;
+ break;
+ default: M = 0;
+ break;
+ }
+
+ if (M != 0) {
+ codeword_count--;
+ for (i = 0; i < codeword_count; i++) {
+ codewords[i] = codewords[i + 1];
+ }
+ }
+
+ if (codeword_count > 49) {
+ strcpy(symbol->errtxt, "432: Input too long");
+ return ZINT_ERROR_TOO_LONG;
+ }
+
+ /* Place codewords in code character array (c grid) */
+ rows = 0;
+ do {
+ for (i = 0; i < 7; i++) {
+ if (((rows * 7) + i) < codeword_count) {
+ c_grid[rows][i] = codewords[(rows * 7) + i];
+ } else {
+ c_grid[rows][i] = 48; /* Pad */
+ pad_count++;
+ }
+ }
+ rows++;
+ } while ((rows * 7) < codeword_count);
+
+ if ((((rows <= 6) && (pad_count < 5))) || (rows > 6) || (rows == 1)) {
+ /* Add a row */
+ for (i = 0; i < 7; i++) {
+ c_grid[rows][i] = 48; /* Pad */
+ }
+ rows++;
+ }
+
+ /* Add row count and mode character */
+ c_grid[rows - 1][6] = (7 * (rows - 2)) + M;
+
+ /* Add row check character */
+ for (i = 0; i < rows - 1; i++) {
+ int row_sum = 0;
+
+ for (j = 0; j < 7; j++) {
+ row_sum += c_grid[i][j];
+ }
+ c_grid[i][7] = row_sum % 49;
+ }
+
+ /* Calculate Symbol Check Characters */
+ posn_val = 0;
+ x_count = c_grid[rows - 1][6] * 20;
+ y_count = c_grid[rows - 1][6] * 16;
+ z_count = c_grid[rows - 1][6] * 38;
+ for (i = 0; i < rows - 1; i++) {
+ for (j = 0; j < 4; j++) {
+ local_value = (c_grid[i][2 * j] * 49) + c_grid[i][(2 * j) + 1];
+ x_count += c49_x_weight[posn_val] * local_value;
+ y_count += c49_y_weight[posn_val] * local_value;
+ z_count += c49_z_weight[posn_val] * local_value;
+ posn_val++;
+ }
+ }
+
+ if (rows > 6) {
+ /* Add Z Symbol Check */
+ c_grid[rows - 1][0] = (z_count % 2401) / 49;
+ c_grid[rows - 1][1] = (z_count % 2401) % 49;
+ }
+
+ local_value = (c_grid[rows - 1][0] * 49) + c_grid[rows - 1][1];
+ x_count += c49_x_weight[posn_val] * local_value;
+ y_count += c49_y_weight[posn_val] * local_value;
+ posn_val++;
+
+ /* Add Y Symbol Check */
+ c_grid[rows - 1][2] = (y_count % 2401) / 49;
+ c_grid[rows - 1][3] = (y_count % 2401) % 49;
+
+ local_value = (c_grid[rows - 1][2] * 49) + c_grid[rows - 1][3];
+ x_count += c49_x_weight[posn_val] * local_value;
+
+ /* Add X Symbol Check */
+ c_grid[rows - 1][4] = (x_count % 2401) / 49;
+ c_grid[rows - 1][5] = (x_count % 2401) % 49;
+
+ /* Add last row check character */
+ j = 0;
+ for (i = 0; i < 7; i++) {
+ j += c_grid[rows - 1][i];
+ }
+ c_grid[rows - 1][7] = j % 49;
+
+ /* Transfer data to symbol character array (w grid) */
+ for (i = 0; i < rows; i++) {
+ for (j = 0; j < 4; j++) {
+ w_grid[i][j] = (c_grid[i][2 * j] * 49) + c_grid[i][(2 * j) + 1];
+ }
+ }
+
+ for (i = 0; i < rows; i++) {
+ strcpy(pattern, "10"); /* Start character */
+ for (j = 0; j < 4; j++) {
+ if (i != (rows - 1)) {
+ if (c49_table4[i][j] == 'E') {
+ /* Even Parity */
+ bin_append(c49_even_bitpattern[w_grid[i][j]], 16, pattern);
+ } else {
+ /* Odd Parity */
+ bin_append(c49_odd_bitpattern[w_grid[i][j]], 16, pattern);
+ }
+ } else {
+ /* Last row uses all even parity */
+ bin_append(c49_even_bitpattern[w_grid[i][j]], 16, pattern);
+ }
+ }
+ strcat(pattern, "1111"); /* Stop character */
+
+ /* Expand into symbol */
+ symbol->row_height[i] = 10;
+
+ for (j = 0; j < strlen(pattern); j++) {
+ if (pattern[j] == '1') {
+ set_module(symbol, i, j);
+ }
+ }
+ }
+
+ symbol->rows = rows;
+ symbol->width = strlen(pattern);
+ symbol->whitespace_width = 10;
+ if (!(symbol->output_options & BARCODE_BIND)) {
+ symbol->output_options += BARCODE_BIND;
+ }
+ symbol->border_width = 2;
+
+ return 0;
+}
diff --git a/3rdparty/zint-2.6.1/backend/code49.h b/3rdparty/zint-2.6.1/backend/code49.h
new file mode 100644
index 0000000..01dec46
--- /dev/null
+++ b/3rdparty/zint-2.6.1/backend/code49.h
@@ -0,0 +1,558 @@
+/* code49.h - Code 49 Tables */
+
+/*
+ libzint - the open source barcode library
+ Copyright (C) 2009-2017 Robin Stuart
+
+ Redistribution and use in source and binary forms, with or without
+ modification, are permitted provided that the following conditions
+ are met:
+
+ 1. Redistributions of source code must retain the above copyright
+ notice, this list of conditions and the following disclaimer.
+ 2. Redistributions in binary form must reproduce the above copyright
+ notice, this list of conditions and the following disclaimer in the
+ documentation and/or other materials provided with the distribution.
+ 3. Neither the name of the project nor the names of its contributors
+ may be used to endorse or promote products derived from this software
+ without specific prior written permission.
+
+ THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND
+ ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+ ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE
+ FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+ DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
+ OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
+ HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
+ LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
+ OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+ SUCH DAMAGE.
+ */
+
+/* This data set taken from ANSI/AIM-BC6-2000, 4th April 2000 */
+
+static const char *c49_table7[128] = {
+ /* Table 7: Code 49 ASCII Chart */
+ "! ", "!A", "!B", "!C", "!D", "!E", "!F", "!G", "!H", "!I", "!J", "!K", "!L",
+ "!M", "!N", "!O", "!P", "!Q", "!R", "!S", "!T", "!U", "!V", "!W", "!X", "!Y",
+ "!Z", "!1", "!2", "!3", "!4", "!5", " ", "!6", "!7", "!8", "$", "%", "!9", "!0",
+ "!-", "!.", "!$", "+", "!/", "-", ".", "/", "0", "1", "2", "3", "4", "5", "6",
+ "7", "8", "9", "!+", "&1", "&2", "&3", "&4", "&5", "&6", "A", "B", "C", "D", "E",
+ "F", "G", "H", "I", "J", "K", "L", "M", "N", "O", "P", "Q", "R", "S", "T", "U",
+ "V", "W", "X", "Y", "Z", "&7", "&8", "&9", "&0", "&-", "&.", "&A", "&B", "&C",
+ "&D", "&E", "&F", "&G", "&H", "&I", "&J", "&K", "&L", "&M", "&N", "&O", "&P",
+ "&Q", "&R", "&S", "&T", "&U", "&V", "&W", "&X", "&Y", "&Z", "&$", "&/", "&+",
+ "&%", "& "
+};
+
+/* Table 5: Check Character Weighting Values */
+static const char c49_x_weight[] = {
+ 1, 9, 31, 26, 2, 12, 17, 23, 37, 18, 22, 6, 27, 44, 15, 43,
+ 39, 11, 13, 5, 41, 33, 36, 8, 4, 32, 3, 19, 40, 25, 29, 10
+};
+
+static const char c49_y_weight[] = {
+ 9, 31, 26, 2, 12, 17, 23, 37, 18, 22, 6, 27, 44, 15, 43, 39,
+ 11, 13, 5, 41, 33, 36, 8, 4, 32, 3, 19, 40, 25, 29, 10, 24
+};
+
+static const char c49_z_weight[] = {
+ 31, 26, 2, 12, 17, 23, 37, 18, 22, 6, 27, 44, 15, 43, 39, 11,
+ 13, 5, 41, 33, 36, 8, 4, 32, 3, 19, 40, 25, 29, 10, 24, 30
+};
+
+static const char *c49_table4[8] = {
+ /* Table 4: Row Parity Pattern for Code 49 Symbols */
+ "OEEO", "EOEO", "OOEE", "EEOO", "OEOE", "EOOE", "OOOO", "EEEE"
+};
+
+static const unsigned short int c49_even_bitpattern[] = {
+ /* Appendix E - Code 49 Encodation Patterns (Even Symbol Character Parity) */
+ 0xBE5C, 0xC16E, 0x86DC, 0xC126, 0x864C, 0x9EDC, 0xC726, 0x9E4C, 0xDF26, 0x82CC,
+ 0x8244, 0x8ECC, 0xC322, 0x8E44, 0xBECC, 0xCF22, 0xBE44, 0xC162, 0x86C4, 0xC762,
+ 0x9EC4, 0xDF62, 0x812E, 0x872E, 0x9F2E, 0x836E, 0x8326, 0x8F6E, 0x8F26, 0xBF6E,
+ 0x8166, 0x8122, 0x8766, 0x8722, 0x9F66, 0x9F22, 0x8362, 0x8F62, 0xBF62, 0xA2E0,
+ 0xE8B8, 0xFA2E, 0xD370, 0xF4DC, 0xD130, 0xF44C, 0xAEE0, 0xEBB8, 0xFAEE, 0xA660,
+ 0xE998, 0xFA66, 0xA220, 0xE888, 0xFA22, 0xD730, 0xF5CC, 0xD310, 0xF4C4, 0xAE20,
+ 0xEB88, 0xFAE2, 0x9170, 0xE45C, 0xD8B8, 0xF62E, 0xC9B8, 0xF26E, 0xB370, 0xC898,
+ 0xF226, 0xB130, 0xEC4C, 0x9770, 0xE5DC, 0x9330, 0xE4CC, 0x9110, 0xE444, 0xD888,
+ 0xF622, 0xCB98, 0xF2E6, 0xB730, 0xC988, 0xF262, 0xB310, 0xECC4, 0x9710, 0xE5C4,
+ 0xDB88, 0xF6E2, 0x88B8, 0xE22E, 0xCC5C, 0xB8B8, 0xEE2E, 0xC4DC, 0x99B8, 0xC44C,
+ 0x9898, 0xE626, 0xDC4C, 0x8BB8, 0xE2EE, 0x8998, 0xE266, 0xBBB8, 0x8888, 0xE222,
+ 0xB998, 0xCC44, 0xB888, 0xEE22, 0xC5CC, 0x9B98, 0xC4C4, 0x9988, 0xE662, 0xDCC4,
+ 0x8B88, 0xE2E2, 0xCDC4, 0xBB88, 0xEEE2, 0x845C, 0xC62E, 0x9C5C, 0xDE2E, 0xC26E,
+ 0x8CDC, 0xC226, 0x8C4C, 0xBCDC, 0xCE26, 0xBC4C, 0x85DC, 0x84CC, 0x9DDC, 0x8444,
+ 0x9CCC, 0xC622, 0x9C44, 0xDE22, 0xC2E6, 0x8DCC, 0xC262, 0x8CC4, 0xBDCC, 0xCE62,
+ 0xBCC4, 0x85C4, 0xC6E2, 0x9DC4, 0xDEE2, 0x822E, 0x8E2E, 0x866E, 0x8626, 0x9E6E,
+ 0x9E26, 0x82EE, 0x8266, 0x8EEE, 0x8222, 0x8E66, 0xBEEE, 0x8E22, 0xBE66, 0x86E6,
+ 0x8662, 0x9EE6, 0x9E62, 0x82E2, 0x8EE2, 0xBEE2, 0xA170, 0xE85C, 0xD1B8, 0xF46E,
+ 0xD098, 0xF426, 0xA770, 0xE9DC, 0xA330, 0xE8CC, 0xA110, 0xE844, 0xD7B8, 0xF5EE,
+ 0xD398, 0xF4E6, 0xD188, 0xF462, 0xAF30, 0xEBCC, 0xA710, 0xE9C4, 0xD788, 0xF5E2,
+ 0x90B8, 0xE42E, 0xD85C, 0xC8DC, 0xB1B8, 0xC84C, 0xB098, 0xEC26, 0x93B8, 0xE4EE,
+ 0x9198, 0xE466, 0x9088, 0xE422, 0xD844, 0xCBDC, 0xB7B8, 0xC9CC, 0xB398, 0xC8C4,
+ 0xB188, 0xEC62, 0x9798, 0xE5E6, 0x9388, 0xE4E2, 0xD9C4, 0xCBC4, 0xB788, 0xEDE2,
+ 0x885C, 0xCC2E, 0xB85C, 0xC46E, 0x98DC, 0xC426, 0x984C, 0xDC26, 0x89DC, 0x88CC,
+ 0xB9DC, 0x8844, 0xB8CC, 0xCC22, 0xB844, 0xC5EE, 0x9BDC, 0xC4E6, 0x99CC, 0xC462,
+ 0x98C4, 0xDC62, 0x8BCC, 0x89C4, 0xBBCC, 0xCCE2, 0xB9C4, 0xC5E2, 0x9BC4, 0xDDE2,
+ 0x842E, 0x9C2E, 0x8C6E, 0x8C26, 0xBC6E, 0x84EE, 0x8466, 0x9CEE, 0x8422, 0x9C66,
+ 0x9C22, 0x8DEE, 0x8CE6, 0xBDEE, 0x8C62, 0xBCE6, 0xBC62, 0x85E6, 0x84E2, 0x9DE6,
+ 0x9CE2, 0x8DE2, 0xBDE2, 0xA0B8, 0xE82E, 0xD0DC, 0xD04C, 0xA3B8, 0xE8EE, 0xA198,
+ 0xE866, 0xA088, 0xE822, 0xD3DC, 0xD1CC, 0xD0C4, 0xAFB8, 0xEBEE, 0xA798, 0xE9E6,
+ 0xA388, 0xE8E2, 0xD7CC, 0xD3C4, 0x905C, 0xD82E, 0xC86E, 0xB0DC, 0xC826, 0xB04C,
+ 0x91DC, 0x90CC, 0x9044, 0xD822, 0xC9EE, 0xB3DC, 0xC8E6, 0xB1CC, 0xC862, 0xB0C4,
+ 0x97DC, 0x93CC, 0x91C4, 0xD8E2, 0xCBE6, 0xB7CC, 0xC9E2, 0xB3C4, 0x882E, 0x986E,
+ 0x9826, 0x88EE, 0x8866, 0xB8EE, 0x8822, 0xB866, 0x99EE, 0x98E6, 0x9862, 0x8BEE,
+ 0x89E6, 0xBBEE, 0x88E2, 0xB9E6, 0xB8E2, 0x9BE6, 0x99E2, 0xA05C, 0xD06E, 0xD026,
+ 0xA1DC, 0xA0CC, 0xA044, 0xD1EE, 0xD0E6, 0xD062, 0xA7DC, 0xA3CC, 0xA1C4, 0xD7EE,
+ 0xD3E6, 0xD1E2, 0x902E, 0xB06E, 0x90EE, 0x9066, 0x9022, 0xB1EE, 0xB0E6, 0xB062,
+ 0x93EE, 0x91E6, 0x90E2, 0xB7EE, 0xB3E6, 0xB1E2, 0xA9C0, 0xEA70, 0xFA9C, 0xD460,
+ 0xF518, 0xFD46, 0xA840, 0xEA10, 0xFA84, 0xED78, 0xFB5E, 0x94E0, 0xE538, 0xF94E,
+ 0xDA70, 0xF69C, 0xCA30, 0xF28C, 0xB460, 0xED18, 0xFB46, 0x9420, 0xE508, 0xF942,
+ 0xDA10, 0xF684, 0x9AF0, 0xE6BC, 0xDD78, 0xF75E, 0x8A70, 0xE29C, 0xCD38, 0xF34E,
+ 0xBA70, 0xEE9C, 0xC518, 0xF146, 0x9A30, 0xE68C, 0xDD18, 0xF746, 0x8A10, 0xE284,
+ 0xCD08, 0xF342, 0xBA10, 0xEE84, 0x8D78, 0xE35E, 0xCEBC, 0xBD78, 0xEF5E, 0x8538,
+ 0xE14E, 0xC69C, 0x9D38, 0xE74E, 0xDE9C, 0xC28C, 0x8D18, 0xE346, 0xCE8C, 0xBD18,
+ 0xEF46, 0x8508, 0xE142, 0xC684, 0x9D08, 0xE742, 0xDE84, 0x86BC, 0xC75E, 0x9EBC,
+ 0xDF5E, 0x829C, 0xC34E, 0x8E9C, 0xCF4E, 0xBE9C, 0xC146, 0x868C, 0xC746, 0x9E8C,
+ 0xDF46, 0x8284, 0xC342, 0x8E84, 0xCF42, 0xBE84, 0x835E, 0x8F5E, 0xBF5E, 0x814E,
+ 0x874E, 0x9F4E, 0x8346, 0x8F46, 0xBF46, 0x8142, 0x8742, 0x9F42, 0xD2F0, 0xF4BC,
+ 0xADE0, 0xEB78, 0xFADE, 0xA4E0, 0xE938, 0xFA4E, 0xD670, 0xF59C, 0xD230, 0xF48C,
+ 0xAC60, 0xEB18, 0xFAC6, 0xA420, 0xE908, 0xFA42, 0xD610, 0xF584, 0xC978, 0xF25E,
+ 0xB2F0, 0xECBC, 0x96F0, 0xE5BC, 0x9270, 0xE49C, 0xD938, 0xF64E, 0xCB38, 0xF2CE,
+ 0xB670, 0xC918, 0xF246, 0xB230, 0xEC8C, 0x9630, 0xE58C, 0x9210, 0xE484, 0xD908,
+ 0xF642, 0xCB08, 0xF2C2, 0xB610, 0xED84, 0xC4BC, 0x9978, 0xE65E, 0xDCBC, 0x8B78,
+ 0xE2DE, 0x8938, 0xE24E, 0xBB78, 0xCC9C, 0xB938, 0xEE4E, 0xC59C, 0x9B38, 0xC48C,
+ 0x9918, 0xE646, 0xDC8C, 0x8B18, 0xE2C6, 0x8908, 0xE242, 0xBB18, 0xCC84, 0xB908,
+ 0xEE42, 0xC584, 0x9B08, 0xE6C2, 0xDD84, 0xC25E, 0x8CBC, 0xCE5E, 0xBCBC, 0x85BC,
+ 0x849C, 0x9DBC, 0xC64E, 0x9C9C, 0xDE4E, 0xC2CE, 0x8D9C, 0xC246, 0x8C8C, 0xBD9C,
+ 0xCE46, 0xBC8C, 0x858C, 0x8484, 0x9D8C, 0xC642, 0x9C84, 0xDE42, 0xC2C2, 0x8D84,
+ 0xCEC2, 0xBD84, 0x865E, 0x9E5E, 0x82DE, 0x824E, 0x8EDE, 0x8E4E, 0xBEDE, 0xBE4E,
+ 0x86CE, 0x8646, 0x9ECE, 0x9E46, 0x82C6, 0x8242, 0x8EC6, 0x8E42, 0xBEC6, 0xBE42,
+ 0x86C2, 0x9EC2, 0xD178, 0xF45E, 0xA6F0, 0xE9BC, 0xA270, 0xE89C, 0xD778, 0xF5DE,
+ 0xD338, 0xF4CE, 0xD118, 0xF446, 0xAE70, 0xEB9C, 0xA630, 0xE98C, 0xA210, 0xE884,
+ 0xD718, 0xF5C6, 0xD308, 0xF4C2, 0xAE10, 0xEB84, 0xC8BC, 0xB178, 0xEC5E, 0x9378,
+ 0xE4DE, 0x9138, 0xE44E, 0xD89C, 0xCBBC, 0xB778, 0xC99C, 0xB338, 0xC88C, 0xB118,
+ 0xEC46, 0x9738, 0xE5CE, 0x9318, 0xE4C6, 0x9108, 0xE442, 0xD884, 0xCB8C, 0xB718,
+ 0xC984, 0xB308, 0xECC2, 0x9708, 0xE5C2, 0xDB84, 0xC45E, 0x98BC, 0xDC5E, 0x89BC,
+ 0x889C, 0xB9BC, 0xCC4E, 0xB89C, 0xC5DE, 0x9BBC, 0xC4CE, 0x999C, 0xC446, 0x988C,
+ 0xDC46, 0x8B9C, 0x898C, 0xBB9C, 0x8884, 0xB98C, 0xCC42, 0xB884, 0xC5C6, 0x9B8C,
+ 0xC4C2, 0x9984, 0xDCC2, 0x8B84, 0xCDC2, 0xBB84, 0x8C5E, 0xBC5E, 0x84DE, 0x844E,
+ 0x9CDE, 0x9C4E, 0x8DDE, 0x8CCE, 0xBDDE, 0x8C46, 0xBCCE, 0xBC46, 0x85CE, 0x84C6,
+ 0x9DCE, 0x8442, 0x9CC6, 0x9C42, 0x8DC6, 0x8CC2, 0xBDC6, 0xBCC2, 0x85C2, 0x9DC2,
+ 0xD0BC, 0xA378, 0xE8DE, 0xA138, 0xE84E, 0xD3BC, 0xD19C, 0xD08C, 0xAF78, 0xEBDE,
+ 0xA738, 0xE9CE, 0xA318, 0xE8C6, 0xA108, 0xE842, 0xD79C, 0xD38C, 0xD184, 0xAF18,
+ 0xEBC6, 0xA708, 0xE9C2, 0xC85E, 0xB0BC, 0x91BC, 0x909C, 0xD84E, 0xC9DE, 0xB3BC,
+ 0xC8CE, 0xB19C, 0xC846, 0xB08C, 0x97BC, 0x939C, 0x918C, 0x9084, 0xD842, 0xCBCE,
+ 0xB79C, 0xC9C6, 0xB38C, 0xC8C2, 0xB184, 0x978C, 0x9384, 0xD9C2, 0x985E, 0x88DE,
+ 0x884E, 0xB8DE, 0xB84E, 0x99DE, 0x98CE, 0x9846, 0x8BDE, 0x89CE, 0xBBDE, 0x88C6,
+ 0xB9CE, 0x8842, 0xB8C6, 0xB842, 0x9BCE, 0x99C6, 0x98C2, 0x8BC6, 0x89C2, 0xBBC6,
+ 0xB9C2, 0xD05E, 0xA1BC, 0xA09C, 0xD1DE, 0xD0CE, 0xD046, 0xA7BC, 0xA39C, 0xA18C,
+ 0xA084, 0xD7DE, 0xD3CE, 0xD1C6, 0xD0C2, 0xAF9C, 0xA78C, 0xA384, 0xB05E, 0x90DE,
+ 0x904E, 0xB1DE, 0xB0CE, 0xB046, 0x93DE, 0x91CE, 0x90C6, 0x9042, 0xB7DE, 0xB3CE,
+ 0xB1C6, 0xB0C2, 0x97CE, 0x93C6, 0x91C2, 0xA0DE, 0xA04E, 0xA3DE, 0xA1CE, 0xA0C6,
+ 0xA042, 0xAFDE, 0xA7CE, 0xA3C6, 0xA1C2, 0xD4F0, 0xF53C, 0xA8E0, 0xEA38, 0xFA8E,
+ 0xD430, 0xF50C, 0xA820, 0xEA08, 0xFA82, 0xDAF8, 0xF6BE, 0xCA78, 0xF29E, 0xB4F0,
+ 0xED3C, 0x9470, 0xE51C, 0xDA38, 0xF68E, 0xCA18, 0xF286, 0xB430, 0xED0C, 0x9410,
+ 0xE504, 0xDA08, 0xF682, 0xCD7C, 0xBAF8, 0xEEBE, 0xC53C, 0x9A78, 0xE69E, 0xDD3C,
+ 0x8A38, 0xE28E, 0xCD1C, 0xBA38, 0xEE8E, 0xC50C, 0x9A18, 0xE686, 0xDD0C, 0x8A08,
+ 0xE282, 0xCD04, 0xBA08, 0xEE82, 0xC6BE, 0x9D7C, 0xDEBE, 0xC29E, 0x8D3C, 0xCE9E,
+ 0xBD3C, 0x851C, 0xC68E, 0x9D1C, 0xDE8E, 0xC286, 0x8D0C, 0xCE86, 0xBD0C, 0x8504,
+ 0xC682, 0x9D04, 0xDE82, 0x8EBE, 0xBEBE, 0x869E, 0x9E9E, 0x828E, 0x8E8E, 0xBE8E,
+ 0x8686, 0x9E86, 0x8282, 0x8E82, 0xBE82, 0xE97C, 0xD6F8, 0xF5BE, 0xD278, 0xF49E,
+ 0xACF0, 0xEB3C, 0xA470, 0xE91C, 0xD638, 0xF58E, 0xD218, 0xF486, 0xAC30, 0xEB0C,
+ 0xA410, 0xE904, 0xD608, 0xF582, 0x92F8, 0xE4BE, 0xD97C, 0xCB7C, 0xB6F8, 0xC93C,
+ 0xB278, 0xEC9E, 0x9678, 0xE59E, 0x9238, 0xE48E, 0xD91C, 0xCB1C, 0xB638, 0xC90C,
+ 0xB218, 0xEC86, 0x9618, 0xE586, 0x9208, 0xE482, 0xD904, 0xCB04, 0xB608, 0xED82,
+ 0x897C, 0xCCBE, 0xB97C, 0xC5BE, 0x9B7C, 0xC49E, 0x993C, 0xDC9E, 0x8B3C, 0x891C,
+ 0xBB3C, 0xCC8E, 0xB91C, 0xC58E, 0x9B1C, 0xC486, 0x990C, 0xDC86, 0x8B0C, 0x8904,
+ 0xBB0C, 0xCC82, 0xB904, 0xC582, 0x9B04, 0xDD82, 0x84BE, 0x9CBE, 0x8DBE, 0x8C9E,
+ 0xBDBE, 0xBC9E, 0x859E, 0x848E, 0x9D9E, 0x9C8E, 0x8D8E, 0x8C86, 0xBD8E, 0xBC86,
+ 0x8586, 0x8482, 0x9D86, 0x9C82, 0x8D82, 0xBD82, 0xA2F8, 0xE8BE, 0xD37C, 0xD13C,
+ 0xAEF8, 0xEBBE, 0xA678, 0xE99E, 0xA238, 0xE88E, 0xD73C, 0xD31C, 0xD10C, 0xAE38,
+ 0xEB8E, 0xA618, 0xE986, 0xA208, 0xE882, 0xD70C, 0xD304, 0x917C, 0xD8BE, 0xC9BE,
+ 0xB37C, 0xC89E, 0xB13C, 0x977C, 0x933C, 0x911C, 0xD88E, 0xCB9E, 0xB73C, 0xC98E,
+ 0xB31C, 0xC886, 0xB10C, 0x971C, 0x930C, 0x9104, 0xD882, 0xCB86, 0xB70C, 0xC982,
+ 0xB304, 0x88BE, 0xB8BE, 0x99BE, 0x989E, 0x8BBE, 0x899E, 0xBBBE, 0x888E, 0xB99E,
+ 0xB88E, 0x9B9E, 0x998E, 0x9886, 0x8B8E, 0x8986, 0xBB8E, 0x8882, 0xB986, 0xB882,
+ 0x9B86, 0x9982, 0xA17C, 0xD1BE, 0xD09E, 0xA77C, 0xA33C, 0xA11C, 0xD7BE, 0xD39E,
+ 0xD18E, 0xD086, 0xAF3C, 0xA71C, 0xA30C, 0xA104, 0xD78E, 0xD386, 0xD182, 0x90BE,
+ 0xB1BE, 0xB09E, 0x93BE, 0x919E, 0x908E, 0xB7BE, 0xB39E, 0xB18E, 0xB086, 0x979E,
+ 0x938E, 0x9186, 0x9082, 0xB78E, 0xB386, 0xB182, 0xA0BE, 0xA3BE, 0xA19E, 0xA08E,
+ 0xAFBE, 0xA79E, 0xA38E, 0xA186, 0xA082, 0xA9F0, 0xEA7C, 0xD478, 0xF51E, 0xA870,
+ 0xEA1C, 0xD418, 0xF506, 0xA810, 0xEA04, 0xED7E, 0x94F8, 0xE53E, 0xDA7C, 0xCA3C,
+ 0xB478, 0xED1E, 0x9438, 0xE50E, 0xDA1C, 0xCA0C, 0xB418, 0xED06, 0x9408, 0xE502,
+ 0xDA04, 0x9AFC, 0xDD7E, 0x8A7C, 0xCD3E, 0xBA7C, 0xC51E, 0x9A3C, 0xDD1E, 0x8A1C,
+ 0xCD0E, 0xBA1C, 0xC506, 0x9A0C, 0xDD06, 0x8A04, 0xCD02, 0xBA04, 0x8D7E, 0xBD7E,
+ 0x853E, 0x9D3E, 0x8D1E, 0xBD1E, 0x850E, 0x9D0E, 0x8D06, 0xBD06, 0x8502, 0x9D02,
+ 0xD2FC, 0xADF8, 0xEB7E, 0xA4F8, 0xE93E, 0xD67C, 0xD23C, 0xAC78, 0xEB1E, 0xA438,
+ 0xE90E, 0xD61C, 0xD20C, 0xAC18, 0xEB06, 0xA408, 0xE902, 0xC97E, 0xB2FC, 0x96FC,
+ 0x927C, 0xD93E, 0xCB3E, 0xB67C, 0xC91E, 0xB23C, 0x963C, 0x921C, 0xD90E, 0xCB0E,
+ 0xB61C, 0xC906, 0xB20C, 0x960C, 0x9204, 0xD902, 0x997E, 0x8B7E, 0x893E, 0xBB7E,
+ 0xB93E, 0xE4A0, 0xF928, 0xD940, 0xF650, 0xFD94, 0xCB40, 0xF2D0, 0xEDA0, 0xFB68,
+ 0x8940, 0xE250, 0xCCA0, 0xF328, 0xB940, 0xEE50, 0xFB94, 0xC5A0, 0xF168, 0x9B40,
+ 0xE6D0, 0xF9B4, 0xDDA0, 0xF768, 0xFDDA, 0x84A0, 0xE128, 0xC650, 0xF194, 0x9CA0,
+ 0xE728, 0xF9CA, 0xDE50, 0xF794, 0xC2D0, 0x8DA0, 0xE368, 0xCED0, 0xF3B4, 0xBDA0,
+ 0xEF68, 0xFBDA, 0x8250, 0xC328, 0x8E50, 0xE394, 0xCF28, 0xF3CA, 0xBE50, 0xEF94,
+ 0xC168, 0x86D0, 0xE1B4, 0xC768, 0xF1DA, 0x9ED0, 0xE7B4, 0xDF68, 0xF7DA, 0x8128,
+ 0xC194, 0x8728, 0xE1CA, 0xC794, 0x9F28, 0xE7CA, 0x8368, 0xC3B4, 0x8F68, 0xE3DA,
+ 0xCFB4, 0xBF68, 0xEFDA, 0xE8A0, 0xFA28, 0xD340, 0xF4D0, 0xFD34, 0xEBA0, 0xFAE8,
+ 0x9140, 0xE450, 0xF914, 0xD8A0, 0xF628, 0xFD8A, 0xC9A0, 0xF268, 0xB340, 0xECD0,
+ 0xFB34, 0x9740, 0xE5D0, 0xF974, 0xDBA0, 0xF6E8, 0xFDBA, 0x88A0, 0xE228, 0xCC50,
+ 0xF314, 0xB8A0, 0xEE28, 0xFB8A, 0xC4D0, 0xF134, 0x99A0, 0xE668, 0xF99A, 0xDCD0,
+ 0xF734, 0x8BA0, 0xE2E8, 0xCDD0, 0xF374, 0xBBA0, 0xEEE8, 0xFBBA, 0x8450, 0xE114,
+ 0xC628, 0xF18A, 0x9C50, 0xE714, 0xDE28, 0xF78A, 0xC268, 0x8CD0, 0xE334, 0xCE68,
+ 0xF39A, 0xBCD0, 0xEF34, 0x85D0, 0xE174, 0xC6E8, 0xF1BA, 0x9DD0, 0xE774, 0xDEE8,
+ 0xF7BA, 0x8228, 0xC314, 0x8E28, 0xE38A, 0xCF14, 0xC134, 0x8668, 0xE19A, 0xC734,
+ 0x9E68, 0xE79A, 0xDF34, 0x82E8, 0xC374, 0x8EE8, 0xE3BA, 0xCF74, 0xBEE8, 0xEFBA,
+ 0x8114, 0xC18A, 0x8714, 0xC78A, 0x8334, 0xC39A, 0x8F34, 0xCF9A, 0x8174, 0xC1BA,
+ 0x8774, 0xC7BA, 0x9F74, 0xDFBA, 0xA140, 0xE850, 0xFA14, 0xD1A0, 0xF468, 0xFD1A,
+ 0xA740, 0xE9D0, 0xFA74, 0xD7A0, 0xF5E8, 0xFD7A, 0x90A0, 0xE428, 0xF90A, 0xD850,
+ 0xF614, 0xC8D0, 0xF234, 0xB1A0, 0xEC68, 0xFB1A, 0x93A0, 0xE4E8, 0xF93A, 0xD9D0,
+ 0xF674, 0xCBD0, 0xF2F4, 0xB7A0, 0xEDE8, 0xFB7A, 0x8850, 0xE214, 0xCC28, 0xF30A,
+ 0xB850, 0xEE14, 0xC468, 0xF11A, 0x98D0, 0xE634, 0xDC68, 0xF71A, 0x89D0, 0xE274,
+ 0xCCE8, 0xF33A, 0xB9D0, 0xEE74, 0xC5E8, 0xF17A, 0x9BD0, 0xE6F4, 0xDDE8, 0xF77A,
+ 0x8428, 0xE10A, 0xC614, 0x9C28, 0xE70A, 0xC234, 0x8C68, 0xE31A, 0xCE34, 0xBC68,
+ 0xEF1A, 0x84E8, 0xE13A, 0xC674, 0x9CE8, 0xE73A, 0xDE74, 0xC2F4, 0x8DE8, 0xE37A,
+ 0xCEF4, 0xBDE8, 0xEF7A, 0x8214, 0xC30A, 0x8E14, 0xC11A, 0x8634, 0xC71A, 0x9E34,
+ 0x8274, 0xC33A, 0x8E74, 0xCF3A, 0xBE74, 0xC17A, 0x86F4, 0xC77A, 0x9EF4, 0xDF7A,
+ 0x810A, 0x870A, 0x831A, 0x8F1A, 0x813A, 0x873A, 0x9F3A, 0x837A, 0x8F7A, 0xBF7A,
+ 0xA0A0, 0xE828, 0xFA0A, 0xD0D0, 0xF434, 0xA3A0, 0xE8E8, 0xFA3A, 0xD3D0, 0xF4F4,
+ 0xAFA0, 0xEBE8, 0xFAFA, 0x9050, 0xE414, 0xD828, 0xF60A, 0xC868, 0xF21A, 0xB0D0,
+ 0xEC34, 0x91D0, 0xE474, 0xD8E8, 0xF63A, 0xC9E8, 0xF27A, 0xB3D0, 0xECF4, 0x97D0,
+ 0xE5F4, 0xDBE8, 0xF6FA, 0x8828, 0xE20A, 0xCC14, 0xC434, 0x9868, 0xE61A, 0xDC34,
+ 0x88E8, 0xE23A, 0xCC74, 0xB8E8, 0xEE3A, 0xC4F4, 0x99E8, 0xE67A, 0xDCF4, 0x8BE8,
+ 0xE2FA, 0xCDF4, 0xBBE8, 0xEEFA, 0x8414, 0xC60A, 0xC21A, 0x8C34, 0xCE1A, 0x8474,
+ 0xC63A, 0x9C74, 0xDE3A, 0xC27A, 0x8CF4, 0xCE7A, 0xBCF4, 0x85F4, 0xC6FA, 0x9DF4,
+ 0xDEFA, 0x820A, 0x861A, 0x823A, 0x8E3A, 0x867A, 0x9E7A, 0x82FA, 0x8EFA, 0xBEFA,
+ 0xA050, 0xE814, 0xD068, 0xF41A, 0xA1D0, 0xE874, 0xD1E8, 0xF47A, 0xA7D0, 0xE9F4,
+ 0xD7E8, 0xF5FA, 0x9028, 0xE40A, 0xC834, 0xB068, 0xEC1A, 0x90E8, 0xE43A, 0xD874,
+ 0xC8F4, 0xB1E8, 0xEC7A, 0x93E8, 0xE4FA, 0xD9F4, 0xCBF4, 0xB7E8, 0xEDFA, 0x8814,
+ 0xC41A, 0x9834, 0x8874, 0xCC3A, 0xB874, 0xC47A, 0x98F4, 0xDC7A, 0x89F4, 0xCCFA,
+ 0xB9F4, 0xC5FA, 0x9BF4, 0xDDFA, 0x840A, 0x8C1A, 0x843A, 0x9C3A, 0x8C7A, 0xBC7A,
+ 0x84FA, 0x9CFA, 0x8DFA, 0xBDFA, 0xEA40, 0xFA90, 0xED60, 0xFB58, 0xE520, 0xF948,
+ 0xDA40, 0xF690, 0xFDA4, 0x9AC0, 0xE6B0, 0xF9AC, 0xDD60, 0xF758, 0xFDD6, 0x8A40,
+ 0xE290, 0xCD20, 0xF348, 0xBA40, 0xEE90, 0xFBA4, 0x8D60, 0xE358, 0xCEB0, 0xF3AC,
+ 0xBD60, 0xEF58, 0xFBD6, 0x8520, 0xE148, 0xC690, 0xF1A4, 0x9D20, 0xE748, 0xF9D2,
+ 0xDE90, 0xF7A4, 0x86B0, 0xE1AC, 0xC758, 0xF1D6, 0x9EB0, 0xE7AC, 0xDF58, 0xF7D6,
+ 0x8290, 0xC348, 0x8E90, 0xE3A4, 0xCF48, 0xF3D2, 0xBE90, 0xEFA4, 0x8358, 0xC3AC,
+ 0x8F58, 0xE3D6, 0xCFAC, 0xBF58, 0xEFD6, 0x8148, 0xC1A4, 0x8748, 0xE1D2, 0xC7A4,
+ 0x9F48, 0xE7D2, 0xDFA4, 0xD2C0, 0xF4B0, 0xFD2C, 0xEB60, 0xFAD8, 0xE920, 0xFA48,
+ 0xD640, 0xF590, 0xFD64, 0xC960, 0xF258, 0xB2C0, 0xECB0, 0xFB2C, 0x96C0, 0xE5B0,
+ 0xF96C, 0x9240, 0xE490, 0xF924, 0xD920, 0xF648, 0xFD92, 0xCB20, 0xF2C8, 0xB640,
+ 0xED90, 0xFB64, 0xC4B0, 0xF12C, 0x9960, 0xE658, 0xF996, 0xDCB0, 0xF72C, 0x8B60,
+ 0xE2D8, 0x8920, 0xE248, 0xBB60, 0xCC90, 0xF324, 0xB920, 0xEE48, 0xFB92, 0xC590,
+ 0xF164, 0x9B20, 0xE6C8, 0xF9B2, 0xDD90, 0xF764, 0xC258, 0x8CB0, 0xE32C, 0xCE58,
+ 0xF396, 0xBCB0, 0xEF2C, 0x85B0, 0xE16C, 0x8490, 0xE124, 0x9DB0, 0xC648, 0xF192,
+ 0x9C90, 0xE724, 0xDE48, 0xF792, 0xC2C8, 0x8D90, 0xE364, 0xCEC8, 0xF3B2, 0xBD90,
+ 0xEF64, 0xC12C, 0x8658, 0xE196, 0xC72C, 0x9E58, 0xE796, 0xDF2C, 0x82D8, 0x8248,
+ 0x8ED8, 0xC324, 0x8E48, 0xE392, 0xBED8, 0xCF24, 0xBE48, 0xEF92, 0xC164, 0x86C8,
+ 0xE1B2, 0xC764, 0x9EC8, 0xE7B2, 0xDF64, 0x832C, 0xC396, 0x8F2C, 0xCF96, 0x816C,
+ 0x8124, 0x876C, 0xC192, 0x8724, 0x9F6C, 0xC792, 0x9F24, 0x8364, 0xC3B2, 0x8F64,
+ 0xCFB2, 0xBF64, 0xD160, 0xF458, 0xFD16, 0xA6C0, 0xE9B0, 0xFA6C, 0xA240, 0xE890,
+ 0xFA24, 0xD760, 0xF5D8, 0xFD76, 0xD320, 0xF4C8, 0xFD32, 0xAE40, 0xEB90, 0xFAE4,
+ 0xC8B0, 0xF22C, 0xB160, 0xEC58, 0xFB16, 0x9360, 0xE4D8, 0xF936, 0x9120, 0xE448,
+ 0xF912, 0xD890, 0xF624, 0xCBB0, 0xF2EC, 0xB760, 0xC990, 0xF264, 0xB320, 0xECC8,
+ 0xFB32, 0x9720, 0xE5C8, 0xF972, 0xDB90, 0xF6E4, 0xC458, 0xF116, 0x98B0, 0xE62C,
+ 0xDC58, 0xF716, 0x89B0, 0xE26C, 0x8890, 0xE224, 0xB9B0, 0xCC48, 0xF312, 0xB890,
+ 0xEE24, 0xC5D8, 0xF176, 0x9BB0, 0xC4C8, 0xF132, 0x9990, 0xE664, 0xDCC8, 0xF732,
+ 0x8B90, 0xE2E4, 0xCDC8, 0xF372, 0xBB90, 0xEEE4, 0xC22C, 0x8C58, 0xE316, 0xCE2C,
+ 0xBC58, 0xEF16, 0x84D8, 0xE136, 0x8448, 0xE112, 0x9CD8, 0xC624, 0x9C48, 0xE712,
+ 0xDE24, 0xC2EC, 0x8DD8, 0xC264, 0x8CC8, 0xE332, 0xBDD8, 0xCE64, 0xBCC8, 0xEF32,
+ 0x85C8, 0xE172, 0xC6E4, 0x9DC8, 0xE772, 0xDEE4, 0xC116, 0x862C, 0xC716, 0x9E2C,
+ 0x826C, 0x8224, 0x8E6C, 0xC312, 0x8E24, 0xBE6C, 0xCF12, 0xC176, 0x86EC, 0xC132,
+ 0x8664, 0x9EEC, 0xC732, 0x9E64, 0xDF32, 0x82E4, 0xC372, 0x8EE4, 0xCF72, 0xBEE4,
+ 0x8316, 0x8F16, 0x8136, 0x8112, 0x8736, 0x8712, 0x9F36, 0x8376, 0x8332, 0x8F76,
+ 0x8F32, 0xBF76, 0x8172, 0x8772, 0x9F72, 0xD0B0, 0xF42C, 0xA360, 0xE8D8, 0xFA36,
+ 0xA120, 0xE848, 0xFA12, 0xD3B0, 0xF4EC, 0xD190, 0xF464, 0xAF60, 0xEBD8, 0xFAF6,
+ 0xA720, 0xE9C8, 0xFA72, 0xD790, 0xF5E4, 0xC858, 0xF216, 0xB0B0, 0xEC2C, 0x91B0,
+ 0xE46C, 0x9090, 0xE424, 0xD848, 0xF612, 0xC9D8, 0xF276, 0xB3B0, 0xC8C8, 0xF232,
+ 0xB190, 0xEC64, 0x97B0, 0xE5EC, 0x9390, 0xE4E4, 0xD9C8, 0xF672, 0xCBC8, 0xF2F2,
+ 0xB790, 0xEDE4, 0xC42C, 0x9858, 0xE616, 0xDC2C, 0x88D8, 0xE236, 0x8848, 0xE212,
+ 0xB8D8, 0xCC24, 0xB848, 0xEE12, 0xC4EC, 0x99D8, 0xC464, 0x98C8, 0xE632, 0xDC64,
+ 0x8BD8, 0xE2F6, 0x89C8, 0xE272, 0xBBD8, 0xCCE4, 0xB9C8, 0xEE72, 0xC5E4, 0x9BC8,
+ 0xE6F2, 0xDDE4, 0xC216, 0x8C2C, 0xCE16, 0x846C, 0x8424, 0x9C6C, 0xC612, 0x9C24,
+ 0xC276, 0x8CEC, 0xC232, 0x8C64, 0xBCEC, 0xCE32, 0xBC64, 0x85EC, 0x84E4, 0x9DEC,
+ 0xC672, 0x9CE4, 0xDE72, 0xC2F2, 0x8DE4, 0xCEF2, 0xBDE4, 0x8616, 0x8236, 0x8212,
+ 0x8E36, 0x8E12, 0x8676, 0x8632, 0x9E76, 0x9E32, 0x82F6, 0x8272, 0x8EF6, 0x8E72,
+ 0xBEF6, 0xBE72, 0x86F2, 0x9EF2, 0xD058, 0xF416, 0xA1B0, 0xE86C, 0xA090, 0xE824,
+ 0xD1D8, 0xF476, 0xD0C8, 0xF432, 0xA7B0, 0xE9EC, 0xA390, 0xE8E4, 0xD7D8, 0xF5F6,
+ 0xD3C8, 0xF4F2, 0xAF90, 0xEBE4, 0xC82C, 0xB058, 0xEC16, 0x90D8, 0xE436, 0x9048,
+ 0xE412, 0xD824, 0xC8EC, 0xB1D8, 0xC864, 0xB0C8, 0xEC32, 0x93D8, 0xE4F6, 0x91C8,
+ 0xE472, 0xD8E4, 0xCBEC, 0xB7D8, 0xC9E4, 0xB3C8, 0xECF2, 0x97C8, 0xE5F2, 0xDBE4,
+ 0xC416, 0x982C, 0x886C, 0x8824, 0xB86C, 0xCC12, 0xC476, 0x98EC, 0xC432, 0x9864,
+ 0xDC32, 0x89EC, 0x88E4, 0xB9EC, 0xCC72, 0xB8E4, 0xC5F6, 0x9BEC, 0xC4F2, 0x99E4,
+ 0xDCF2, 0x8BE4, 0xCDF2, 0xBBE4, 0x8C16, 0x8436, 0x8412, 0x9C36, 0x8C76, 0x8C32,
+ 0xBC76, 0x84F6, 0x8472, 0x9CF6, 0x9C72, 0x8DF6, 0x8CF2, 0xBDF6, 0xBCF2, 0x85F2,
+ 0x9DF2, 0xD02C, 0xA0D8, 0xE836, 0xA048, 0xE812, 0xD0EC, 0xD064, 0xA3D8, 0xE8F6,
+ 0xA1C8, 0xE872, 0xD3EC, 0xD1E4, 0xAFD8, 0xEBF6, 0xA7C8, 0xE9F2, 0xC816, 0x906C,
+ 0x9024, 0xC876, 0xB0EC, 0xC832, 0xB064, 0x91EC, 0x90E4, 0xD872, 0xC9F6, 0xB3EC,
+ 0xC8F2, 0xB1E4, 0x97EC, 0x93E4, 0xD9F2, 0x8836, 0x8812, 0x9876, 0x9832, 0x88F6,
+ 0x8872, 0xB8F6, 0xB872, 0x99F6, 0x98F2, 0x8BF6, 0x89F2, 0xBBF6, 0xB9F2, 0xD4C0,
+ 0xF530, 0xFD4C, 0xEA20, 0xFA88, 0xDAE0, 0xF6B8, 0xFDAE, 0xCA60, 0xF298, 0xB4C0,
+ 0xED30, 0xFB4C, 0x9440, 0xE510, 0xF944, 0xDA20, 0xF688, 0xFDA2, 0xCD70, 0xF35C,
+ 0xBAE0, 0xEEB8, 0xFBAE, 0xC530, 0xF14C, 0x9A60, 0xE698, 0xF9A6, 0xDD30, 0xF74C,
+ 0x8A20, 0xE288, 0xCD10, 0xF344, 0xBA20, 0xEE88, 0xFBA2, 0xC6B8, 0xF1AE, 0x9D70,
+ 0xE75C, 0xDEB8, 0xF7AE, 0xC298, 0x8D30, 0xE34C, 0xCE98, 0xF3A6, 0xBD30, 0xEF4C,
+ 0x8510, 0xE144, 0xC688, 0xF1A2, 0x9D10, 0xE744, 0xDE88, 0xF7A2, 0xC35C, 0x8EB8,
+ 0xE3AE, 0xCF5C, 0xBEB8, 0xEFAE, 0xC14C, 0x8698, 0xE1A6, 0xC74C, 0x9E98, 0xE7A6,
+ 0xDF4C, 0x8288, 0xC344, 0x8E88, 0xE3A2, 0xCF44, 0xBE88, 0xEFA2, 0xC1AE, 0x875C,
+ 0xC7AE, 0x9F5C, 0xDFAE, 0x834C, 0xC3A6, 0x8F4C, 0xCFA6, 0xBF4C, 0x8144, 0xC1A2,
+ 0x8744, 0xC7A2, 0x9F44, 0xDFA2, 0xE970, 0xFA5C, 0xD6E0, 0xF5B8, 0xFD6E, 0xD260,
+ 0xF498, 0xFD26, 0xACC0, 0xEB30, 0xFACC, 0xA440, 0xE910, 0xFA44, 0xD620, 0xF588,
+ 0xFD62, 0x92E0, 0xE4B8, 0xF92E, 0xD970, 0xF65C, 0xCB70, 0xF2DC, 0xB6E0, 0xC930,
+ 0xF24C, 0xB260, 0xEC98, 0xFB26, 0x9660, 0xE598, 0xF966, 0x9220, 0xE488, 0xF922,
+ 0xD910, 0xF644, 0xCB10, 0xF2C4, 0xB620, 0xED88, 0xFB62, 0x8970, 0xE25C, 0xCCB8,
+ 0xF32E, 0xB970, 0xEE5C, 0xC5B8, 0xF16E, 0x9B70, 0xC498, 0xF126, 0x9930, 0xE64C,
+ 0xDC98, 0xF726, 0x8B30, 0xE2CC, 0x8910, 0xE244, 0xBB30, 0xCC88, 0xF322, 0xB910,
+ 0xEE44, 0xC588, 0xF162, 0x9B10, 0xE6C4, 0xDD88, 0xF762, 0x84B8, 0xE12E, 0xC65C,
+ 0x9CB8, 0xE72E, 0xDE5C, 0xC2DC, 0x8DB8, 0xC24C, 0x8C98, 0xE326, 0xBDB8, 0xCE4C,
+ 0xBC98, 0xEF26, 0x8598, 0xE166, 0x8488, 0xE122, 0x9D98, 0xC644, 0x9C88, 0xE722,
+ 0xDE44, 0xC2C4, 0x8D88, 0xE362, 0xCEC4, 0xBD88, 0xEF62, 0x825C, 0xC32E, 0x8E5C,
+ 0xCF2E
+};
+
+static const unsigned short int c49_odd_bitpattern[] = {
+ /* Appendix E - Code 49 Encodation Patterns (Odd Symbol Character Parity) */
+ 0xC940, 0xF250, 0xECA0, 0xFB28, 0xE5A0, 0xF968, 0xDB40, 0xF6D0, 0xFDB4, 0xC4A0,
+ 0xF128, 0x9940, 0xE650, 0xF994, 0xDCA0, 0xF728, 0xFDCA, 0x8B40, 0xE2D0, 0xCDA0,
+ 0xF368, 0xBB40, 0xEED0, 0xFBB4, 0xC250, 0x8CA0, 0xE328, 0xCE50, 0xF394, 0xBCA0,
+ 0xEF28, 0xFBCA, 0x85A0, 0xE168, 0xC6D0, 0xF1B4, 0x9DA0, 0xE768, 0xF9DA, 0xDED0,
+ 0xF7B4, 0xC128, 0x8650, 0xE194, 0xC728, 0xF1CA, 0x9E50, 0xE794, 0xDF28, 0xF7CA,
+ 0x82D0, 0xC368, 0x8ED0, 0xE3B4, 0xCF68, 0xF3DA, 0xBED0, 0xEFB4, 0x8328, 0xC394,
+ 0x8F28, 0xE3CA, 0xCF94, 0x8168, 0xC1B4, 0x8768, 0xE1DA, 0xC7B4, 0x9F68, 0xE7DA,
+ 0xDFB4, 0xD140, 0xF450, 0xFD14, 0xE9A0, 0xFA68, 0xD740, 0xF5D0, 0xFD74, 0xC8A0,
+ 0xF228, 0xB140, 0xEC50, 0xFB14, 0x9340, 0xE4D0, 0xF934, 0xD9A0, 0xF668, 0xFD9A,
+ 0xCBA0, 0xF2E8, 0xB740, 0xEDD0, 0xFB74, 0xC450, 0xF114, 0x98A0, 0xE628, 0xF98A,
+ 0xDC50, 0xF714, 0x89A0, 0xE268, 0xCCD0, 0xF334, 0xB9A0, 0xEE68, 0xFB9A, 0xC5D0,
+ 0xF174, 0x9BA0, 0xE6E8, 0xF9BA, 0xDDD0, 0xF774, 0xC228, 0x8C50, 0xE314, 0xCE28,
+ 0xF38A, 0xBC50, 0xEF14, 0x84D0, 0xE134, 0xC668, 0xF19A, 0x9CD0, 0xE734, 0xDE68,
+ 0xF79A, 0xC2E8, 0x8DD0, 0xE374, 0xCEE8, 0xF3BA, 0xBDD0, 0xEF74, 0xC114, 0x8628,
+ 0xE18A, 0xC714, 0x9E28, 0xE78A, 0x8268, 0xC334, 0x8E68, 0xE39A, 0xCF34, 0xBE68,
+ 0xEF9A, 0xC174, 0x86E8, 0xE1BA, 0xC774, 0x9EE8, 0xE7BA, 0xDF74, 0x8314, 0xC38A,
+ 0x8F14, 0x8134, 0xC19A, 0x8734, 0xC79A, 0x9F34, 0x8374, 0xC3BA, 0x8F74, 0xCFBA,
+ 0xBF74, 0xD0A0, 0xF428, 0xFD0A, 0xA340, 0xE8D0, 0xFA34, 0xD3A0, 0xF4E8, 0xFD3A,
+ 0xAF40, 0xEBD0, 0xFAF4, 0xC850, 0xF214, 0xB0A0, 0xEC28, 0xFB0A, 0x91A0, 0xE468,
+ 0xF91A, 0xD8D0, 0xF634, 0xC9D0, 0xF274, 0xB3A0, 0xECE8, 0xFB3A, 0x97A0, 0xE5E8,
+ 0xF97A, 0xDBD0, 0xF6F4, 0xC428, 0xF10A, 0x9850, 0xE614, 0xDC28, 0xF70A, 0x88D0,
+ 0xE234, 0xCC68, 0xF31A, 0xB8D0, 0xEE34, 0xC4E8, 0xF13A, 0x99D0, 0xE674, 0xDCE8,
+ 0xF73A, 0x8BD0, 0xE2F4, 0xCDE8, 0xF37A, 0xBBD0, 0xEEF4, 0xC214, 0x8C28, 0xE30A,
+ 0xCE14, 0x8468, 0xE11A, 0xC634, 0x9C68, 0xE71A, 0xDE34, 0xC274, 0x8CE8, 0xE33A,
+ 0xCE74, 0xBCE8, 0xEF3A, 0x85E8, 0xE17A, 0xC6F4, 0x9DE8, 0xE77A, 0xDEF4, 0xC10A,
+ 0x8614, 0xC70A, 0x8234, 0xC31A, 0x8E34, 0xCF1A, 0xC13A, 0x8674, 0xC73A, 0x9E74,
+ 0xDF3A, 0x82F4, 0xC37A, 0x8EF4, 0xCF7A, 0xBEF4, 0x830A, 0x811A, 0x871A, 0x833A,
+ 0x8F3A, 0x817A, 0x877A, 0x9F7A, 0xD050, 0xF414, 0xA1A0, 0xE868, 0xFA1A, 0xD1D0,
+ 0xF474, 0xA7A0, 0xE9E8, 0xFA7A, 0xD7D0, 0xF5F4, 0xC828, 0xF20A, 0xB050, 0xEC14,
+ 0x90D0, 0xE434, 0xD868, 0xF61A, 0xC8E8, 0xF23A, 0xB1D0, 0xEC74, 0x93D0, 0xE4F4,
+ 0xD9E8, 0xF67A, 0xCBE8, 0xF2FA, 0xB7D0, 0xEDF4, 0xC414, 0x9828, 0xE60A, 0x8868,
+ 0xE21A, 0xCC34, 0xB868, 0xEE1A, 0xC474, 0x98E8, 0xE63A, 0xDC74, 0x89E8, 0xE27A,
+ 0xCCF4, 0xB9E8, 0xEE7A, 0xC5F4, 0x9BE8, 0xE6FA, 0xDDF4, 0xC20A, 0x8C14, 0x8434,
+ 0xC61A, 0x9C34, 0xC23A, 0x8C74, 0xCE3A, 0xBC74, 0x84F4, 0xC67A, 0x9CF4, 0xDE7A,
+ 0xC2FA, 0x8DF4, 0xCEFA, 0xBDF4, 0x860A, 0x821A, 0x8E1A, 0x863A, 0x9E3A, 0x827A,
+ 0x8E7A, 0xBE7A, 0x86FA, 0x9EFA, 0xD028, 0xF40A, 0xA0D0, 0xE834, 0xD0E8, 0xF43A,
+ 0xA3D0, 0xE8F4, 0xD3E8, 0xF4FA, 0xAFD0, 0xEBF4, 0xC814, 0x9068, 0xE41A, 0xD834,
+ 0xC874, 0xB0E8, 0xEC3A, 0x91E8, 0xE47A, 0xD8F4, 0xC9F4, 0xB3E8, 0xECFA, 0x97E8,
+ 0xE5FA, 0xDBF4, 0xC40A, 0x8834, 0xCC1A, 0xC43A, 0x9874, 0xDC3A, 0x88F4, 0xCC7A,
+ 0xB8F4, 0xC4FA, 0x99F4, 0xDCFA, 0x8BF4, 0xCDFA, 0xBBF4, 0x841A, 0x8C3A, 0x847A,
+ 0x9C7A, 0x8CFA, 0xBCFA, 0x85FA, 0x9DFA, 0xF520, 0xFD48, 0xDAC0, 0xF6B0, 0xFDAC,
+ 0xCA40, 0xF290, 0xED20, 0xFB48, 0xCD60, 0xF358, 0xBAC0, 0xEEB0, 0xFBAC, 0xC520,
+ 0xF148, 0x9A40, 0xE690, 0xF9A4, 0xDD20, 0xF748, 0xFDD2, 0xC6B0, 0xF1AC, 0x9D60,
+ 0xE758, 0xF9D6, 0xDEB0, 0xF7AC, 0xC290, 0x8D20, 0xE348, 0xCE90, 0xF3A4, 0xBD20,
+ 0xEF48, 0xFBD2, 0xC358, 0x8EB0, 0xE3AC, 0xCF58, 0xF3D6, 0xBEB0, 0xEFAC, 0xC148,
+ 0x8690, 0xE1A4, 0xC748, 0xF1D2, 0x9E90, 0xE7A4, 0xDF48, 0xF7D2, 0xC1AC, 0x8758,
+ 0xE1D6, 0xC7AC, 0x9F58, 0xE7D6, 0xDFAC, 0x8348, 0xC3A4, 0x8F48, 0xE3D2, 0xCFA4,
+ 0xBF48, 0xEFD2, 0xE960, 0xFA58, 0xD6C0, 0xF5B0, 0xFD6C, 0xD240, 0xF490, 0xFD24,
+ 0xEB20, 0xFAC8, 0x92C0, 0xE4B0, 0xF92C, 0xD960, 0xF658, 0xFD96, 0xCB60, 0xF2D8,
+ 0xB6C0, 0xC920, 0xF248, 0xB240, 0xEC90, 0xFB24, 0x9640, 0xE590, 0xF964, 0xDB20,
+ 0xF6C8, 0xFDB2, 0x8960, 0xE258, 0xCCB0, 0xF32C, 0xB960, 0xEE58, 0xFB96, 0xC5B0,
+ 0xF16C, 0x9B60, 0xC490, 0xF124, 0x9920, 0xE648, 0xF992, 0xDC90, 0xF724, 0x8B20,
+ 0xE2C8, 0xCD90, 0xF364, 0xBB20, 0xEEC8, 0xFBB2, 0x84B0, 0xE12C, 0xC658, 0xF196,
+ 0x9CB0, 0xE72C, 0xDE58, 0xF796, 0xC2D8, 0x8DB0, 0xC248, 0x8C90, 0xE324, 0xBDB0,
+ 0xCE48, 0xF392, 0xBC90, 0xEF24, 0x8590, 0xE164, 0xC6C8, 0xF1B2, 0x9D90, 0xE764,
+ 0xDEC8, 0xF7B2, 0x8258, 0xC32C, 0x8E58, 0xE396, 0xCF2C, 0xBE58, 0xEF96, 0xC16C,
+ 0x86D8, 0xC124, 0x8648, 0xE192, 0x9ED8, 0xC724, 0x9E48, 0xE792, 0xDF24, 0x82C8,
+ 0xC364, 0x8EC8, 0xE3B2, 0xCF64, 0xBEC8, 0xEFB2, 0x812C, 0xC196, 0x872C, 0xC796,
+ 0x9F2C, 0x836C, 0x8324, 0x8F6C, 0xC392, 0x8F24, 0xBF6C, 0xCF92, 0x8164, 0xC1B2,
+ 0x8764, 0xC7B2, 0x9F64, 0xDFB2, 0xA2C0, 0xE8B0, 0xFA2C, 0xD360, 0xF4D8, 0xFD36,
+ 0xD120, 0xF448, 0xFD12, 0xAEC0, 0xEBB0, 0xFAEC, 0xA640, 0xE990, 0xFA64, 0xD720,
+ 0xF5C8, 0xFD72, 0x9160, 0xE458, 0xF916, 0xD8B0, 0xF62C, 0xC9B0, 0xF26C, 0xB360,
+ 0xC890, 0xF224, 0xB120, 0xEC48, 0xFB12, 0x9760, 0xE5D8, 0xF976, 0x9320, 0xE4C8,
+ 0xF932, 0xD990, 0xF664, 0xCB90, 0xF2E4, 0xB720, 0xEDC8, 0xFB72, 0x88B0, 0xE22C,
+ 0xCC58, 0xF316, 0xB8B0, 0xEE2C, 0xC4D8, 0xF136, 0x99B0, 0xC448, 0xF112, 0x9890,
+ 0xE624, 0xDC48, 0xF712, 0x8BB0, 0xE2EC, 0x8990, 0xE264, 0xBBB0, 0xCCC8, 0xF332,
+ 0xB990, 0xEE64, 0xC5C8, 0xF172, 0x9B90, 0xE6E4, 0xDDC8, 0xF772, 0x8458, 0xE116,
+ 0xC62C, 0x9C58, 0xE716, 0xDE2C, 0xC26C, 0x8CD8, 0xC224, 0x8C48, 0xE312, 0xBCD8,
+ 0xCE24, 0xBC48, 0xEF12, 0x85D8, 0xE176, 0x84C8, 0xE132, 0x9DD8, 0xC664, 0x9CC8,
+ 0xE732, 0xDE64, 0xC2E4, 0x8DC8, 0xE372, 0xCEE4, 0xBDC8, 0xEF72, 0x822C, 0xC316,
+ 0x8E2C, 0xCF16, 0xC136, 0x866C, 0xC112, 0x8624, 0x9E6C, 0xC712, 0x9E24, 0x82EC,
+ 0x8264, 0x8EEC, 0xC332, 0x8E64, 0xBEEC, 0xCF32, 0xBE64, 0xC172, 0x86E4, 0xC772,
+ 0x9EE4, 0xDF72, 0x8116, 0x8716, 0x8336, 0x8312, 0x8F36, 0x8F12, 0x8176, 0x8132,
+ 0x8776, 0x8732, 0x9F76, 0x9F32, 0x8372, 0x8F72, 0xBF72, 0xA160, 0xE858, 0xFA16,
+ 0xD1B0, 0xF46C, 0xD090, 0xF424, 0xA760, 0xE9D8, 0xFA76, 0xA320, 0xE8C8, 0xFA32,
+ 0xD7B0, 0xF5EC, 0xD390, 0xF4E4, 0xAF20, 0xEBC8, 0xFAF2, 0x90B0, 0xE42C, 0xD858,
+ 0xF616, 0xC8D8, 0xF236, 0xB1B0, 0xC848, 0xF212, 0xB090, 0xEC24, 0x93B0, 0xE4EC,
+ 0x9190, 0xE464, 0xD8C8, 0xF632, 0xCBD8, 0xF2F6, 0xB7B0, 0xC9C8, 0xF272, 0xB390,
+ 0xECE4, 0x9790, 0xE5E4, 0xDBC8, 0xF6F2, 0x8858, 0xE216, 0xCC2C, 0xB858, 0xEE16,
+ 0xC46C, 0x98D8, 0xC424, 0x9848, 0xE612, 0xDC24, 0x89D8, 0xE276, 0x88C8, 0xE232,
+ 0xB9D8, 0xCC64, 0xB8C8, 0xEE32, 0xC5EC, 0x9BD8, 0xC4E4, 0x99C8, 0xE672, 0xDCE4,
+ 0x8BC8, 0xE2F2, 0xCDE4, 0xBBC8, 0xEEF2, 0x842C, 0xC616, 0x9C2C, 0xC236, 0x8C6C,
+ 0xC212, 0x8C24, 0xBC6C, 0xCE12, 0x84EC, 0x8464, 0x9CEC, 0xC632, 0x9C64, 0xDE32,
+ 0xC2F6, 0x8DEC, 0xC272, 0x8CE4, 0xBDEC, 0xCE72, 0xBCE4, 0x85E4, 0xC6F2, 0x9DE4,
+ 0xDEF2, 0x8216, 0x8E16, 0x8636, 0x8612, 0x9E36, 0x8276, 0x8232, 0x8E76, 0x8E32,
+ 0xBE76, 0x86F6, 0x8672, 0x9EF6, 0x9E72, 0x82F2, 0x8EF2, 0xBEF2, 0xA0B0, 0xE82C,
+ 0xD0D8, 0xF436, 0xD048, 0xF412, 0xA3B0, 0xE8EC, 0xA190, 0xE864, 0xD3D8, 0xF4F6,
+ 0xD1C8, 0xF472, 0xAFB0, 0xEBEC, 0xA790, 0xE9E4, 0xD7C8, 0xF5F2, 0x9058, 0xE416,
+ 0xD82C, 0xC86C, 0xB0D8, 0xC824, 0xB048, 0xEC12, 0x91D8, 0xE476, 0x90C8, 0xE432,
+ 0xD864, 0xC9EC, 0xB3D8, 0xC8E4, 0xB1C8, 0xEC72, 0x97D8, 0xE5F6, 0x93C8, 0xE4F2,
+ 0xD9E4, 0xCBE4, 0xB7C8, 0xEDF2, 0x882C, 0xCC16, 0xC436, 0x986C, 0xC412, 0x9824,
+ 0x88EC, 0x8864, 0xB8EC, 0xCC32, 0xB864, 0xC4F6, 0x99EC, 0xC472, 0x98E4, 0xDC72,
+ 0x8BEC, 0x89E4, 0xBBEC, 0xCCF2, 0xB9E4, 0xC5F2, 0x9BE4, 0xDDF2, 0x8416, 0x8C36,
+ 0x8C12, 0x8476, 0x8432, 0x9C76, 0x9C32, 0x8CF6, 0x8C72, 0xBCF6, 0xBC72, 0x85F6,
+ 0x84F2, 0x9DF6, 0x9CF2, 0x8DF2, 0xBDF2, 0xA058, 0xE816, 0xD06C, 0xD024, 0xA1D8,
+ 0xE876, 0xA0C8, 0xE832, 0xD1EC, 0xD0E4, 0xA7D8, 0xE9F6, 0xA3C8, 0xE8F2, 0xD7EC,
+ 0xD3E4, 0x902C, 0xC836, 0xB06C, 0xC812, 0x90EC, 0x9064, 0xD832, 0xC8F6, 0xB1EC,
+ 0xC872, 0xB0E4, 0x93EC, 0x91E4, 0xD8F2, 0xCBF6, 0xB7EC, 0xC9F2, 0xB3E4, 0x8816,
+ 0x9836, 0x8876, 0x8832, 0xB876, 0x98F6, 0x9872, 0x89F6, 0x88F2, 0xB9F6, 0xB8F2,
+ 0x9BF6, 0x99F2, 0xEA60, 0xFA98, 0xD440, 0xF510, 0xFD44, 0xED70, 0xFB5C, 0x94C0,
+ 0xE530, 0xF94C, 0xDA60, 0xF698, 0xFDA6, 0xCA20, 0xF288, 0xB440, 0xED10, 0xFB44,
+ 0x9AE0, 0xE6B8, 0xF9AE, 0xDD70, 0xF75C, 0x8A60, 0xE298, 0xCD30, 0xF34C, 0xBA60,
+ 0xEE98, 0xFBA6, 0xC510, 0xF144, 0x9A20, 0xE688, 0xF9A2, 0xDD10, 0xF744, 0x8D70,
+ 0xE35C, 0xCEB8, 0xF3AE, 0xBD70, 0xEF5C, 0x8530, 0xE14C, 0xC698, 0xF1A6, 0x9D30,
+ 0xE74C, 0xDE98, 0xF7A6, 0xC288, 0x8D10, 0xE344, 0xCE88, 0xF3A2, 0xBD10, 0xEF44,
+ 0x86B8, 0xE1AE, 0xC75C, 0x9EB8, 0xE7AE, 0xDF5C, 0x8298, 0xC34C, 0x8E98, 0xE3A6,
+ 0xCF4C, 0xBE98, 0xEFA6, 0xC144, 0x8688, 0xE1A2, 0xC744, 0x9E88, 0xE7A2, 0xDF44,
+ 0x835C, 0xC3AE, 0x8F5C, 0xCFAE, 0xBF5C, 0x814C, 0xC1A6, 0x874C, 0xC7A6, 0x9F4C,
+ 0xDFA6, 0x8344, 0xC3A2, 0x8F44, 0xCFA2, 0xBF44, 0xD2E0, 0xF4B8, 0xFD2E, 0xADC0,
+ 0xEB70, 0xFADC, 0xA4C0, 0xE930, 0xFA4C, 0xD660, 0xF598, 0xFD66, 0xD220, 0xF488,
+ 0xFD22, 0xAC40, 0xEB10, 0xFAC4, 0xC970, 0xF25C, 0xB2E0, 0xECB8, 0xFB2E, 0x96E0,
+ 0xE5B8, 0xF96E, 0x9260, 0xE498, 0xF926, 0xD930, 0xF64C, 0xCB30, 0xF2CC, 0xB660,
+ 0xC910, 0xF244, 0xB220, 0xEC88, 0xFB22, 0x9620, 0xE588, 0xF962, 0xDB10, 0xF6C4,
+ 0xC4B8, 0xF12E, 0x9970, 0xE65C, 0xDCB8, 0xF72E, 0x8B70, 0xE2DC, 0x8930, 0xE24C,
+ 0xBB70, 0xCC98, 0xF326, 0xB930, 0xEE4C, 0xC598, 0xF166, 0x9B30, 0xC488, 0xF122,
+ 0x9910, 0xE644, 0xDC88, 0xF722, 0x8B10, 0xE2C4, 0xCD88, 0xF362, 0xBB10, 0xEEC4,
+ 0xC25C, 0x8CB8, 0xE32E, 0xCE5C, 0xBCB8, 0xEF2E, 0x85B8, 0xE16E, 0x8498, 0xE126,
+ 0x9DB8, 0xC64C, 0x9C98, 0xE726, 0xDE4C, 0xC2CC, 0x8D98, 0xC244, 0x8C88, 0xE322,
+ 0xBD98, 0xCE44, 0xBC88, 0xEF22, 0x8588, 0xE162, 0xC6C4, 0x9D88, 0xE762, 0xDEC4,
+ 0xC12E, 0x865C, 0xC72E, 0x9E5C, 0xDF2E, 0x82DC, 0x824C, 0x8EDC, 0xC326, 0x8E4C,
+ 0xBEDC, 0xCF26, 0xBE4C, 0xC166, 0x86CC, 0xC122, 0x8644, 0x9ECC, 0xC722, 0x9E44,
+ 0xDF22, 0x82C4, 0xC362, 0x8EC4, 0xCF62, 0xBEC4, 0x832E, 0x8F2E, 0x816E, 0x8126,
+ 0x876E, 0x8726, 0x9F6E, 0x9F26, 0x8366, 0x8322, 0x8F66, 0x8F22, 0xBF66, 0x8162,
+ 0x8762, 0x9F62, 0xD170, 0xF45C, 0xA6E0, 0xE9B8, 0xFA6E, 0xA260, 0xE898, 0xFA26,
+ 0xD770, 0xF5DC, 0xD330, 0xF4CC, 0xD110, 0xF444, 0xAE60, 0xEB98, 0xFAE6, 0xA620,
+ 0xE988, 0xFA62, 0xD710, 0xF5C4, 0xC8B8, 0xF22E, 0xB170, 0xEC5C, 0x9370, 0xE4DC,
+ 0x9130, 0xE44C, 0xD898, 0xF626, 0xCBB8, 0xF2EE, 0xB770, 0xC998, 0xF266, 0xB330,
+ 0xC888, 0xF222, 0xB110, 0xEC44, 0x9730, 0xE5CC, 0x9310, 0xE4C4, 0xD988, 0xF662,
+ 0xCB88, 0xF2E2, 0xB710, 0xEDC4, 0xC45C, 0x98B8, 0xE62E, 0xDC5C, 0x89B8, 0xE26E,
+ 0x8898, 0xE226, 0xB9B8, 0xCC4C, 0xB898, 0xEE26, 0xC5DC, 0x9BB8, 0xC4CC, 0x9998,
+ 0xC444, 0x9888, 0xE622, 0xDC44, 0x8B98, 0xE2E6, 0x8988, 0xE262, 0xBB98, 0xCCC4,
+ 0xB988, 0xEE62, 0xC5C4, 0x9B88, 0xE6E2, 0xDDC4, 0xC22E, 0x8C5C, 0xCE2E, 0xBC5C,
+ 0x84DC, 0x844C, 0x9CDC, 0xC626, 0x9C4C, 0xDE26, 0xC2EE, 0x8DDC, 0xC266, 0x8CCC,
+ 0xC222, 0xBDDC, 0x8C44, 0xBCCC, 0xCE22, 0xBC44, 0x85CC, 0x84C4, 0x9DCC, 0xC662,
+ 0x9CC4, 0xDE62, 0xC2E2, 0x8DC4, 0xCEE2, 0xBDC4, 0x862E, 0x9E2E, 0x826E, 0x8226,
+ 0x8E6E, 0x8E26, 0xBE6E, 0x86EE, 0x8666, 0x9EEE, 0x8622, 0x9E66, 0x9E22, 0x82E6,
+ 0x8262, 0x8EE6, 0x8E62, 0xBEE6, 0xBE62, 0x86E2, 0x9EE2, 0xD0B8, 0xF42E, 0xA370,
+ 0xE8DC, 0xA130, 0xE84C, 0xD3B8, 0xF4EE, 0xD198, 0xF466, 0xD088, 0xF422, 0xAF70,
+ 0xEBDC, 0xA730, 0xE9CC, 0xA310, 0xE8C4, 0xD798, 0xF5E6, 0xD388, 0xF4E2, 0xAF10,
+ 0xEBC4, 0xC85C, 0xB0B8, 0xEC2E, 0x91B8, 0xE46E, 0x9098, 0xE426, 0xD84C, 0xC9DC,
+ 0xB3B8, 0xC8CC, 0xB198, 0xC844, 0xB088, 0xEC22, 0x97B8, 0xE5EE, 0x9398, 0xE4E6,
+ 0x9188, 0xE462, 0xD8C4, 0xCBCC, 0xB798, 0xC9C4, 0xB388, 0xECE2, 0x9788, 0xE5E2,
+ 0xDBC4, 0xC42E, 0x985C, 0xDC2E, 0x88DC, 0x884C, 0xB8DC, 0xCC26, 0xB84C, 0xC4EE,
+ 0x99DC, 0xC466, 0x98CC, 0xC422, 0x9844, 0xDC22, 0x8BDC, 0x89CC, 0xBBDC, 0x88C4,
+ 0xB9CC, 0xCC62, 0xB8C4, 0xC5E6, 0x9BCC, 0xC4E2, 0x99C4, 0xDCE2, 0x8BC4, 0xCDE2,
+ 0xBBC4, 0x8C2E, 0x846E, 0x8426, 0x9C6E, 0x9C26, 0x8CEE, 0x8C66, 0xBCEE, 0x8C22,
+ 0xBC66, 0x85EE, 0x84E6, 0x9DEE, 0x8462, 0x9CE6, 0x9C62, 0x8DE6, 0x8CE2, 0xBDE6,
+ 0xBCE2, 0x85E2, 0x9DE2, 0xD05C, 0xA1B8, 0xE86E, 0xA098, 0xE826, 0xD1DC, 0xD0CC,
+ 0xD044, 0xA7B8, 0xE9EE, 0xA398, 0xE8E6, 0xA188, 0xE862, 0xD7DC, 0xD3CC, 0xD1C4,
+ 0xAF98, 0xEBE6, 0xA788, 0xE9E2, 0xC82E, 0xB05C, 0x90DC, 0x904C, 0xD826, 0xC8EE,
+ 0xB1DC, 0xC866, 0xB0CC, 0xC822, 0xB044, 0x93DC, 0x91CC, 0x90C4, 0xD862, 0xCBEE,
+ 0xB7DC, 0xC9E6, 0xB3CC, 0xC8E2, 0xB1C4, 0x97CC, 0x93C4, 0xD9E2, 0x982E, 0x886E,
+ 0x8826, 0xB86E, 0x98EE, 0x9866, 0x9822, 0x89EE, 0x88E6, 0xB9EE, 0x8862, 0xB8E6,
+ 0xB862, 0x9BEE, 0x99E6, 0x98E2, 0x8BE6, 0x89E2, 0xBBE6, 0xB9E2, 0xD02E, 0xA0DC,
+ 0xA04C, 0xD0EE, 0xD066, 0xD022, 0xA3DC, 0xA1CC, 0xA0C4, 0xD3EE, 0xD1E6, 0xD0E2,
+ 0xAFDC, 0xA7CC, 0xA3C4, 0x906E, 0x9026, 0xB0EE, 0xB066, 0x91EE, 0x90E6, 0x9062,
+ 0xB3EE, 0xB1E6, 0xB0E2, 0x97EE, 0x93E6, 0x91E2, 0xD4E0, 0xF538, 0xFD4E, 0xA8C0,
+ 0xEA30, 0xFA8C, 0xD420, 0xF508, 0xFD42, 0xDAF0, 0xF6BC, 0xCA70, 0xF29C, 0xB4E0,
+ 0xED38, 0xFB4E, 0x9460, 0xE518, 0xF946, 0xDA30, 0xF68C, 0xCA10, 0xF284, 0xB420,
+ 0xED08, 0xFB42, 0xCD78, 0xF35E, 0xBAF0, 0xEEBC, 0xC538, 0xF14E, 0x9A70, 0xE69C,
+ 0xDD38, 0xF74E, 0x8A30, 0xE28C, 0xCD18, 0xF346, 0xBA30, 0xEE8C, 0xC508, 0xF142,
+ 0x9A10, 0xE684, 0xDD08, 0xF742, 0xC6BC, 0x9D78, 0xE75E, 0xDEBC, 0xC29C, 0x8D38,
+ 0xE34E, 0xCE9C, 0xBD38, 0xEF4E, 0x8518, 0xE146, 0xC68C, 0x9D18, 0xE746, 0xDE8C,
+ 0xC284, 0x8D08, 0xE342, 0xCE84, 0xBD08, 0xEF42, 0xC35E, 0x8EBC, 0xCF5E, 0xBEBC,
+ 0xC14E, 0x869C, 0xC74E, 0x9E9C, 0xDF4E, 0x828C, 0xC346, 0x8E8C, 0xCF46, 0xBE8C,
+ 0xC142, 0x8684, 0xC742, 0x9E84, 0xDF42, 0x875E, 0x9F5E, 0x834E, 0x8F4E, 0xBF4E,
+ 0x8146, 0x8746, 0x9F46, 0x8342, 0x8F42, 0xBF42, 0xE978, 0xFA5E, 0xD6F0, 0xF5BC,
+ 0xD270, 0xF49C, 0xACE0, 0xEB38, 0xFACE, 0xA460, 0xE918, 0xFA46, 0xD630, 0xF58C,
+ 0xD210, 0xF484, 0xAC20, 0xEB08, 0xFAC2, 0x92F0, 0xE4BC, 0xD978, 0xF65E, 0xCB78,
+ 0xF2DE, 0xB6F0, 0xC938, 0xF24E, 0xB270, 0xEC9C, 0x9670, 0xE59C, 0x9230, 0xE48C,
+ 0xD918, 0xF646, 0xCB18, 0xF2C6, 0xB630, 0xC908, 0xF242, 0xB210, 0xEC84, 0x9610,
+ 0xE584, 0xDB08, 0xF6C2, 0x8978, 0xE25E, 0xCCBC, 0xB978, 0xEE5E, 0xC5BC, 0x9B78,
+ 0xC49C, 0x9938, 0xE64E, 0xDC9C, 0x8B38, 0xE2CE, 0x8918, 0xE246, 0xBB38, 0xCC8C,
+ 0xB918, 0xEE46, 0xC58C, 0x9B18, 0xC484, 0x9908, 0xE642, 0xDC84, 0x8B08, 0xE2C2,
+ 0xCD84, 0xBB08, 0xEEC2, 0x84BC, 0xC65E, 0x9CBC, 0xDE5E, 0xC2DE, 0x8DBC, 0xC24E,
+ 0x8C9C, 0xBDBC, 0xCE4E, 0xBC9C, 0x859C, 0x848C, 0x9D9C, 0xC646, 0x9C8C, 0xDE46,
+ 0xC2C6, 0x8D8C, 0xC242, 0x8C84, 0xBD8C, 0xCE42, 0xBC84, 0x8584, 0xC6C2, 0x9D84,
+ 0xDEC2, 0x825E, 0x8E5E, 0xBE5E, 0x86DE, 0x864E, 0x9EDE, 0x9E4E, 0x82CE, 0x8246,
+ 0x8ECE, 0x8E46, 0xBECE, 0xBE46, 0x86C6, 0x8642, 0x9EC6, 0x9E42, 0x82C2, 0x8EC2,
+ 0xBEC2, 0xA2F0, 0xE8BC, 0xD378, 0xF4DE, 0xD138, 0xF44E, 0xAEF0, 0xEBBC, 0xA670,
+ 0xE99C, 0xA230, 0xE88C, 0xD738, 0xF5CE, 0xD318, 0xF4C6, 0xD108, 0xF442, 0xAE30,
+ 0xEB8C, 0xA610, 0xE984, 0xD708, 0xF5C2, 0x9178, 0xE45E, 0xD8BC, 0xC9BC, 0xB378,
+ 0xC89C, 0xB138, 0xEC4E, 0x9778, 0xE5DE, 0x9338, 0xE4CE, 0x9118, 0xE446, 0xD88C,
+ 0xCB9C, 0xB738, 0xC98C, 0xB318, 0xC884, 0xB108, 0xEC42, 0x9718, 0xE5C6, 0x9308,
+ 0xE4C2, 0xD984, 0xCB84, 0xB708, 0xEDC2, 0x88BC, 0xCC5E, 0xB8BC, 0xC4DE, 0x99BC,
+ 0xC44E, 0x989C, 0xDC4E, 0x8BBC, 0x899C, 0xBBBC, 0x888C, 0xB99C, 0xCC46, 0xB88C,
+ 0xC5CE, 0x9B9C, 0xC4C6, 0x998C, 0xC442, 0x9884, 0xDC42, 0x8B8C, 0x8984, 0xBB8C,
+ 0xCCC2, 0xB984, 0xC5C2, 0x9B84, 0xDDC2, 0x845E, 0x9C5E, 0x8CDE, 0x8C4E, 0xBCDE,
+ 0xBC4E, 0x85DE, 0x84CE, 0x9DDE, 0x8446, 0x9CCE, 0x9C46, 0x8DCE, 0x8CC6, 0xBDCE,
+ 0x8C42, 0xBCC6, 0xBC42, 0x85C6, 0x84C2, 0x9DC6, 0x9CC2, 0x8DC2, 0xBDC2, 0xA178,
+ 0xE85E, 0xD1BC, 0xD09C, 0xA778, 0xE9DE, 0xA338, 0xE8CE, 0xA118, 0xE846, 0xD7BC,
+ 0xD39C, 0xD18C, 0xD084, 0xAF38, 0xEBCE, 0xA718, 0xE9C6, 0xA308, 0xE8C2, 0xD78C,
+ 0xD384, 0x90BC, 0xD85E, 0xC8DE, 0xB1BC, 0xC84E, 0xB09C, 0x93BC, 0x919C, 0x908C,
+ 0xD846, 0xCBDE, 0xB7BC, 0xC9CE, 0xB39C, 0xC8C6, 0xB18C, 0xC842, 0xB084, 0x979C,
+ 0x938C, 0x9184, 0xD8C2, 0xCBC6, 0xB78C, 0xC9C2, 0xB384, 0x885E, 0xB85E, 0x98DE,
+ 0x984E, 0x89DE, 0x88CE, 0xB9DE, 0x8846, 0xB8CE, 0xB846, 0x9BDE, 0x99CE, 0x98C6,
+ 0x9842, 0x8BCE, 0x89C6, 0xBBCE, 0x88C2, 0xB9C6, 0xB8C2, 0x9BC6, 0x99C2, 0xA0BC,
+ 0xD0DE, 0xD04E, 0xA3BC, 0xA19C, 0xA08C, 0xD3DE, 0xD1CE, 0xD0C6, 0xD042, 0xAFBC,
+ 0xA79C, 0xA38C, 0xA184, 0xD7CE, 0xD3C6, 0xD1C2, 0x905E, 0xB0DE, 0xB04E, 0x91DE,
+ 0x90CE, 0x9046, 0xB3DE, 0xB1CE, 0xB0C6, 0xB042, 0x97DE, 0x93CE, 0x91C6, 0x90C2,
+ 0xB7CE, 0xB3C6, 0xB1C2, 0xA05E, 0xA1DE, 0xA0CE, 0xA046, 0xA7DE, 0xA3CE, 0xA1C6,
+ 0xA0C2, 0xA9E0, 0xEA78, 0xFA9E, 0xD470, 0xF51C, 0xA860, 0xEA18, 0xFA86, 0xD410,
+ 0xF504, 0xED7C, 0x94F0, 0xE53C, 0xDA78, 0xF69E, 0xCA38, 0xF28E, 0xB470, 0xED1C,
+ 0x9430, 0xE50C, 0xDA18, 0xF686, 0xCA08, 0xF282, 0xB410, 0xED04, 0x9AF8, 0xE6BE,
+ 0xDD7C, 0x8A78, 0xE29E, 0xCD3C, 0xBA78, 0xEE9E, 0xC51C, 0x9A38, 0xE68E, 0xDD1C,
+ 0x8A18, 0xE286, 0xCD0C, 0xBA18, 0xEE86, 0xC504, 0x9A08, 0xE682, 0xDD04, 0x8D7C,
+ 0xCEBE, 0xBD7C, 0x853C, 0xC69E, 0x9D3C, 0xDE9E, 0xC28E, 0x8D1C, 0xCE8E, 0xBD1C,
+ 0x850C, 0xC686, 0x9D0C, 0xDE86, 0xC282, 0x8D04, 0xCE82, 0xBD04, 0x86BE, 0x9EBE,
+ 0x829E, 0x8E9E, 0xBE9E, 0x868E, 0x9E8E, 0x8286, 0x8E86, 0xBE86, 0x8682, 0x9E82,
+ 0xD2F8, 0xF4BE, 0xADF0, 0xEB7C, 0xA4F0, 0xE93C, 0xD678, 0xF59E, 0xD238, 0xF48E,
+ 0xAC70, 0xEB1C, 0xA430, 0xE90C, 0xD618, 0xF586, 0xD208, 0xF482, 0xAC10, 0xEB04,
+ 0xC97C, 0xB2F8, 0xECBE, 0x96F8, 0xE5BE, 0x9278, 0xE49E, 0xD93C, 0xCB3C, 0xB678,
+ 0xC91C, 0xB238, 0xEC8E, 0x9638, 0xE58E, 0x9218, 0xE486, 0xD90C, 0xCB0C, 0xB618,
+ 0xC904, 0xB208, 0xEC82, 0x9608, 0xE582, 0xDB04, 0xC4BE, 0x997C, 0xDCBE, 0x8B7C,
+ 0x893C, 0xBB7C, 0xCC9E, 0xB93C, 0xC59E, 0x9B3C, 0xC48E, 0x991C, 0xDC8E, 0x8B1C,
+ 0x890C, 0xBB1C, 0xCC86, 0xB90C, 0xC586, 0x9B0C, 0xC482, 0x9904, 0xDC82, 0x8B04,
+ 0xCD82, 0xBB04, 0x8CBE, 0xBCBE, 0x85BE, 0x849E, 0x9DBE, 0x9C9E, 0x8D9E, 0x8C8E,
+ 0xBD9E, 0xBC8E, 0x858E, 0x8486, 0x9D8E, 0x9C86, 0x8D86, 0x8C82, 0xBD86, 0xBC82,
+ 0x8582, 0x9D82, 0xD17C, 0xA6F8, 0xE9BE, 0xA278, 0xE89E, 0xD77C, 0xD33C, 0xD11C,
+ 0xAE78, 0xEB9E, 0xA638, 0xE98E, 0xA218, 0xE886, 0xD71C, 0xD30C, 0xD104, 0xAE18,
+ 0xEB86, 0xA608, 0xE982, 0xC8BE, 0xB17C, 0x937C, 0x913C, 0xD89E, 0xCBBE, 0xB77C,
+ 0xC99E, 0xB33C, 0xC88E, 0xB11C, 0x973C, 0x931C, 0x910C, 0xD886, 0xCB8E, 0xB71C,
+ 0xC986, 0xB30C, 0xC882, 0xB104, 0x970C, 0x9304, 0xD982, 0x98BE, 0x89BE, 0x889E,
+ 0xB9BE, 0xB89E, 0x9BBE, 0x999E, 0x988E, 0x8B9E, 0x898E, 0xBB9E, 0x8886, 0xB98E,
+ 0xB886, 0x9B8E, 0x9986, 0x9882, 0x8B86, 0x8982, 0xBB86, 0xB982, 0xD0BE, 0xA37C,
+ 0xA13C, 0xD3BE, 0xD19E, 0xD08E, 0xAF7C, 0xA73C, 0xA31C, 0xA10C, 0xD79E, 0xD38E,
+ 0xD186, 0xD082, 0xAF1C, 0xA70C, 0xA304, 0xB0BE, 0x91BE, 0x909E, 0xB3BE, 0xB19E,
+ 0xB08E, 0x97BE, 0x939E, 0x918E, 0x9086, 0xB79E, 0xB38E, 0xB186, 0xB082, 0x978E,
+ 0x9386, 0x9182, 0xA1BE, 0xA09E, 0xA7BE, 0xA39E, 0xA18E, 0xA086, 0xAF9E, 0xA78E,
+ 0xA386, 0xA182, 0xD4F8, 0xF53E, 0xA8F0, 0xEA3C, 0xD438, 0xF50E, 0xA830, 0xEA0C,
+ 0xD408, 0xF502, 0xDAFC, 0xCA7C, 0xB4F8, 0xED3E, 0x9478, 0xE51E, 0xDA3C, 0xCA1C,
+ 0xB438, 0xED0E, 0x9418, 0xE506, 0xDA0C, 0xCA04, 0xB408, 0xED02, 0xCD7E, 0xBAFC,
+ 0xC53E, 0x9A7C, 0xDD3E, 0x8A3C, 0xCD1E, 0xBA3C, 0xC50E, 0x9A1C, 0xDD0E, 0x8A0C,
+ 0xCD06, 0xBA0C, 0xC502, 0x9A04, 0xDD02, 0x9D7E, 0x8D3E, 0xBD3E, 0x851E, 0x9D1E,
+ 0x8D0E, 0xBD0E, 0x8506, 0x9D06, 0x8D02, 0xBD02, 0xE97E, 0xD6FC, 0xD27C, 0xACF8,
+ 0xEB3E, 0xA478, 0xE91E, 0xD63C, 0xD21C, 0xAC38, 0xEB0E, 0xA418, 0xE906, 0xD60C,
+ 0xD204, 0x92FC, 0xD97E, 0xCB7E, 0xB6FC, 0xC93E, 0xB27C, 0x967C, 0x923C, 0xD91E,
+ 0xCB1E, 0xB63C, 0xC90E, 0xB21C, 0x961C, 0x920C, 0xD906, 0xCB06, 0xB60C, 0xC902,
+ 0xB204, 0x897E, 0xB97E, 0x9B7E, 0x993E, 0x8B3E, 0x891E, 0xBB3E, 0xB91E, 0x9B1E,
+ 0x990E, 0x8B0E, 0x8906, 0xBB0E, 0xB906, 0x9B06, 0x9902, 0xA2FC, 0xD37E, 0xD13E,
+ 0xAEFC
+};
diff --git a/3rdparty/zint-2.6.1/backend/common.c b/3rdparty/zint-2.6.1/backend/common.c
new file mode 100644
index 0000000..708c417
--- /dev/null
+++ b/3rdparty/zint-2.6.1/backend/common.c
@@ -0,0 +1,317 @@
+/* common.c - Contains functions needed for a number of barcodes */
+
+/*
+ libzint - the open source barcode library
+ Copyright (C) 2008-2017 Robin Stuart
+
+ Redistribution and use in source and binary forms, with or without
+ modification, are permitted provided that the following conditions
+ are met:
+
+ 1. Redistributions of source code must retain the above copyright
+ notice, this list of conditions and the following disclaimer.
+ 2. Redistributions in binary form must reproduce the above copyright
+ notice, this list of conditions and the following disclaimer in the
+ documentation and/or other materials provided with the distribution.
+ 3. Neither the name of the project nor the names of its contributors
+ may be used to endorse or promote products derived from this software
+ without specific prior written permission.
+
+ THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND
+ ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+ ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE
+ FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+ DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
+ OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
+ HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
+ LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
+ OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+ SUCH DAMAGE.
+ */
+#include
+#include
+#include
+#include "common.h"
+
+/* Local replacement for strlen() with unsigned char strings */
+size_t ustrlen(const unsigned char data[]) {
+ return strlen((const char*) data);
+}
+
+/* Converts a character 0-9 to its equivalent integer value */
+int ctoi(const char source) {
+ if ((source >= '0') && (source <= '9'))
+ return (source - '0');
+ return (source - 'A' + 10);
+}
+
+
+/* Convert an integer value to a string representing its binary equivalent */
+void bin_append(const int arg, const int length, char *binary) {
+ int i;
+ int start;
+ size_t posn = strlen(binary);
+
+ start = 0x01 << (length - 1);
+
+ for (i = 0; i < length; i++) {
+ binary[posn + i] = '0';
+ if (arg & (start >> i)) {
+ binary[posn + i] = '1';
+ }
+ }
+ binary[posn + length] = '\0';
+
+ return;
+}
+
+/* Converts an integer value to its hexadecimal character */
+char itoc(const int source) {
+ if ((source >= 0) && (source <= 9)) {
+ return ('0' + source);
+ } else {
+ return ('A' + (source - 10));
+ }
+}
+/* Converts lower case characters to upper case in a string source[] */
+void to_upper(unsigned char source[]) {
+ size_t i, src_len = ustrlen(source);
+
+ for (i = 0; i < src_len; i++) {
+ if ((source[i] >= 'a') && (source[i] <= 'z')) {
+ source [i] = (source[i] - 'a') + 'A';
+ }
+ }
+}
+
+/* Verifies that a string only uses valid characters */
+int is_sane(const char test_string[], const unsigned char source[], const size_t length) {
+ unsigned int j, latch;
+ size_t i, lt = strlen(test_string);
+
+ for (i = 0; i < length; i++) {
+ latch = FALSE;
+ for (j = 0; j < lt; j++) {
+ if (source[i] == test_string[j]) {
+ latch = TRUE;
+ break;
+ }
+ }
+ if (!(latch)) {
+ return ZINT_ERROR_INVALID_DATA;
+ }
+ }
+
+ return 0;
+}
+
+/* Replaces huge switch statements for looking up in tables */
+void lookup(const char set_string[], const char *table[], const char data, char dest[]) {
+ size_t i, n = strlen(set_string);
+
+ for (i = 0; i < n; i++) {
+ if (data == set_string[i]) {
+ strcat(dest, table[i]);
+ }
+ }
+}
+
+/* Returns the position of data in set_string */
+int posn(const char set_string[], const char data) {
+ int i, n = (int)strlen(set_string);
+
+ for (i = 0; i < n; i++) {
+ if (data == set_string[i]) {
+ return i;
+ }
+ }
+ return -1;
+}
+
+/* Return true (1) if a module is dark/black, otherwise false (0) */
+int module_is_set(const struct zint_symbol *symbol, const int y_coord, const int x_coord) {
+ return (symbol->encoded_data[y_coord][x_coord / 7] >> (x_coord % 7)) & 1;
+}
+
+/* Set a module to dark/black */
+void set_module(struct zint_symbol *symbol, const int y_coord, const int x_coord) {
+ symbol->encoded_data[y_coord][x_coord / 7] |= 1 << (x_coord % 7);
+}
+
+/* Set (or unset) a module to white */
+void unset_module(struct zint_symbol *symbol, const int y_coord, const int x_coord) {
+ symbol->encoded_data[y_coord][x_coord / 7] &= ~(1 << (x_coord % 7));
+}
+
+/* Expands from a width pattern to a bit pattern */
+void expand(struct zint_symbol *symbol, const char data[]) {
+
+ size_t reader, n = strlen(data);
+ int writer, i;
+ char latch;
+
+ writer = 0;
+ latch = '1';
+
+ for (reader = 0; reader < n; reader++) {
+ for (i = 0; i < ctoi(data[reader]); i++) {
+ if (latch == '1') {
+ set_module(symbol, symbol->rows, writer);
+ }
+ writer++;
+ }
+
+ latch = (latch == '1' ? '0' : '1');
+ }
+
+ if (symbol->symbology != BARCODE_PHARMA) {
+ if (writer > symbol->width) {
+ symbol->width = writer;
+ }
+ } else {
+ /* Pharmacode One ends with a space - adjust for this */
+ if (writer > symbol->width + 2) {
+ symbol->width = writer - 2;
+ }
+ }
+ symbol->rows = symbol->rows + 1;
+}
+
+/* Indicates which symbologies can have row binding */
+int is_stackable(const int symbology) {
+ if (symbology < BARCODE_PDF417) {
+ return 1;
+ }
+
+ switch (symbology) {
+ case BARCODE_CODE128B:
+ case BARCODE_ISBNX:
+ case BARCODE_EAN14:
+ case BARCODE_NVE18:
+ case BARCODE_KOREAPOST:
+ case BARCODE_PLESSEY:
+ case BARCODE_TELEPEN_NUM:
+ case BARCODE_ITF14:
+ case BARCODE_CODE32:
+ case BARCODE_CODABLOCKF:
+ return 1;
+ }
+
+ return 0;
+}
+
+/* Indicates which symbols can have addon (EAN-2 and EAN-5) */
+int is_extendable(const int symbology) {
+ if (symbology == BARCODE_EANX) {
+ return 1;
+ }
+ if (symbology == BARCODE_UPCA) {
+ return 1;
+ }
+ if (symbology == BARCODE_UPCE) {
+ return 1;
+ }
+ if (symbology == BARCODE_ISBNX) {
+ return 1;
+ }
+ if (symbology == BARCODE_UPCA_CC) {
+ return 1;
+ }
+ if (symbology == BARCODE_UPCE_CC) {
+ return 1;
+ }
+ if (symbology == BARCODE_EANX_CC) {
+ return 1;
+ }
+
+ return 0;
+}
+
+int istwodigits(const unsigned char source[], const size_t position) {
+ if ((source[position] >= '0') && (source[position] <= '9')) {
+ if ((source[position + 1] >= '0') && (source[position + 1] <= '9')) {
+ return 1;
+ }
+ }
+
+ return 0;
+}
+
+int utf8toutf16(struct zint_symbol *symbol, const unsigned char source[], int vals[], size_t *length) {
+ size_t bpos;
+ int jpos, error_number;
+ int next;
+
+ bpos = 0;
+ jpos = 0;
+ error_number = 0;
+ next = 0;
+
+ do {
+ if (source[bpos] <= 0x7f) {
+ /* 1 byte mode (7-bit ASCII) */
+ vals[jpos] = source[bpos];
+ next = bpos + 1;
+ jpos++;
+ } else {
+ if ((source[bpos] >= 0x80) && (source[bpos] <= 0xbf)) {
+ strcpy(symbol->errtxt, "240: Corrupt Unicode data");
+ return ZINT_ERROR_INVALID_DATA;
+ }
+ if ((source[bpos] >= 0xc0) && (source[bpos] <= 0xc1)) {
+ strcpy(symbol->errtxt, "241: Overlong encoding not supported");
+ return ZINT_ERROR_INVALID_DATA;
+ }
+
+ if ((source[bpos] >= 0xc2) && (source[bpos] <= 0xdf)) {
+ /* 2 byte mode */
+ vals[jpos] = ((source[bpos] & 0x1f) << 6) + (source[bpos + 1] & 0x3f);
+ next = bpos + 2;
+ jpos++;
+ } else
+ if ((source[bpos] >= 0xe0) && (source[bpos] <= 0xef)) {
+ /* 3 byte mode */
+ vals[jpos] = ((source[bpos] & 0x0f) << 12) + ((source[bpos + 1] & 0x3f) << 6) + (source[bpos + 2] & 0x3f);
+ next = bpos + 3;
+ jpos++;
+ } else
+ if (source[bpos] >= 0xf0) {
+ strcpy(symbol->errtxt, "242: Unicode sequences of more than 3 bytes not supported");
+ return ZINT_ERROR_INVALID_DATA;
+ }
+ }
+
+ bpos = next;
+
+ } while (bpos < *length);
+ *length = jpos;
+
+ return error_number;
+}
+
+
+void set_minimum_height(struct zint_symbol *symbol, const int min_height) {
+ /* Enforce minimum permissable height of rows */
+ int fixed_height = 0;
+ int zero_count = 0;
+ int i;
+
+ for (i = 0; i < symbol->rows; i++) {
+ fixed_height += symbol->row_height[i];
+
+ if (symbol->row_height[i] == 0) {
+ zero_count++;
+ }
+ }
+
+ if (zero_count > 0) {
+ if (((symbol->height - fixed_height) / zero_count) < min_height) {
+ for (i = 0; i < symbol->rows; i++) {
+ if (symbol->row_height[i] == 0) {
+ symbol->row_height[i] = min_height;
+ }
+ }
+ }
+ }
+}
diff --git a/3rdparty/zint-2.6.1/backend/common.h b/3rdparty/zint-2.6.1/backend/common.h
new file mode 100644
index 0000000..4bc3fc1
--- /dev/null
+++ b/3rdparty/zint-2.6.1/backend/common.h
@@ -0,0 +1,79 @@
+/* common.h - Header for all common functions in common.c */
+
+/*
+ libzint - the open source barcode library
+ Copyright (C) 2009-2017 Robin Stuart
+
+ Redistribution and use in source and binary forms, with or without
+ modification, are permitted provided that the following conditions
+ are met:
+
+ 1. Redistributions of source code must retain the above copyright
+ notice, this list of conditions and the following disclaimer.
+ 2. Redistributions in binary form must reproduce the above copyright
+ notice, this list of conditions and the following disclaimer in the
+ documentation and/or other materials provided with the distribution.
+ 3. Neither the name of the project nor the names of its contributors
+ may be used to endorse or promote products derived from this software
+ without specific prior written permission.
+
+ THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND
+ ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+ ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE
+ FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+ DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
+ OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
+ HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
+ LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
+ OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+ SUCH DAMAGE.
+ */
+
+/* Used in some logic */
+#ifndef __COMMON_H
+#define __COMMON_H
+
+#ifndef FALSE
+#define FALSE 0
+#endif
+
+#ifndef TRUE
+#define TRUE 1
+#endif
+
+/* The most commonly used set */
+#define NEON "0123456789"
+
+#include "zint.h"
+#include
+
+#define ustrcpy(target,source) strcpy((char*)target,(const char*)source)
+
+#ifdef __cplusplus
+extern "C" {
+#endif /* __cplusplus */
+
+ extern size_t ustrlen(const unsigned char source[]);
+ extern int ctoi(const char source);
+ extern char itoc(const int source);
+ extern void to_upper(unsigned char source[]);
+ extern int is_sane(const char test_string[], const unsigned char source[], const size_t length);
+ extern void lookup(const char set_string[], const char *table[], const char data, char dest[]);
+ extern void bin_append(const int arg, const int length, char *binary);
+ extern int posn(const char set_string[], const char data);
+ extern int module_is_set(const struct zint_symbol *symbol, const int y_coord, const int x_coord);
+ extern void set_module(struct zint_symbol *symbol, const int y_coord, const int x_coord);
+ extern int istwodigits(const unsigned char source[], const size_t position);
+ extern int parunmodd(const unsigned char llyth);
+ extern void expand(struct zint_symbol *symbol, const char data[]);
+ extern void unset_module(struct zint_symbol *symbol, const int y_coord, const int x_coord);
+ extern int is_stackable(const int symbology);
+ extern int is_extendable(const int symbology);
+ extern int utf8toutf16(struct zint_symbol *symbol, const unsigned char source[], int vals[], size_t *length);
+ extern void set_minimum_height(struct zint_symbol *symbol, const int min_height);
+#ifdef __cplusplus
+}
+#endif /* __cplusplus */
+
+#endif /* __COMMON_H */
diff --git a/3rdparty/zint-2.6.1/backend/composite.c b/3rdparty/zint-2.6.1/backend/composite.c
new file mode 100644
index 0000000..842901c
--- /dev/null
+++ b/3rdparty/zint-2.6.1/backend/composite.c
@@ -0,0 +1,1872 @@
+/* composite.c - Handles GS1 Composite Symbols */
+
+/*
+ libzint - the open source barcode library
+ Copyright (C) 2008-2017 Robin Stuart
+
+ Redistribution and use in source and binary forms, with or without
+ modification, are permitted provided that the following conditions
+ are met:
+
+ 1. Redistributions of source code must retain the above copyright
+ notice, this list of conditions and the following disclaimer.
+ 2. Redistributions in binary form must reproduce the above copyright
+ notice, this list of conditions and the following disclaimer in the
+ documentation and/or other materials provided with the distribution.
+ 3. Neither the name of the project nor the names of its contributors
+ may be used to endorse or promote products derived from this software
+ without specific prior written permission.
+
+ THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND
+ ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+ ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE
+ FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+ DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
+ OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
+ HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
+ LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
+ OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+ SUCH DAMAGE.
+ */
+
+/* The functions "getBit", "init928" and "encode928" are copyright BSI and are
+ released with permission under the following terms:
+
+ "Copyright subsists in all BSI publications. BSI also holds the copyright, in the
+ UK, of the international standardisation bodies. Except as
+ permitted under the Copyright, Designs and Patents Act 1988 no extract may be
+ reproduced, stored in a retrieval system or transmitted in any form or by any
+ means - electronic, photocopying, recording or otherwise - without prior written
+ permission from BSI.
+
+ "This does not preclude the free use, in the course of implementing the standard,
+ of necessary details such as symbols, and size, type or grade designations. If these
+ details are to be used for any other purpose than implementation then the prior
+ written permission of BSI must be obtained."
+
+ The date of publication for these functions is 31 May 2006
+ */
+
+#include
+#include
+#include
+#include
+#include
+#include
+#ifdef _MSC_VER
+#include
+#endif
+#include "common.h"
+#include "large.h"
+#include "composite.h"
+#include "pdf417.h"
+#include "gs1.h"
+
+#define UINT unsigned short
+
+extern int general_rules(char field[], char type[]);
+extern int eanx(struct zint_symbol *symbol, unsigned char source[], int length);
+extern int ean_128(struct zint_symbol *symbol, unsigned char source[], const size_t length);
+extern int rss14(struct zint_symbol *symbol, unsigned char source[], int length);
+extern int rsslimited(struct zint_symbol *symbol, unsigned char source[], int length);
+extern int rssexpanded(struct zint_symbol *symbol, unsigned char source[], int length);
+
+static UINT pwr928[69][7];
+
+static int _min(int first, int second) {
+
+ if (first <= second)
+ return first;
+ else
+ return second;
+}
+
+/* gets bit in bitString at bitPos */
+static int getBit(UINT *bitStr, int bitPos) {
+ return !!(bitStr[bitPos >> 4] & (0x8000 >> (bitPos & 15)));
+}
+
+/* initialize pwr928 encoding table */
+static void init928(void) {
+ int i, j, v;
+ int cw[7];
+ cw[6] = 1L;
+ for (i = 5; i >= 0; i--)
+ cw[i] = 0;
+
+ for (i = 0; i < 7; i++)
+ pwr928[0][i] = cw[i];
+ for (j = 1; j < 69; j++) {
+ for (v = 0, i = 6; i >= 1; i--) {
+ v = (2 * cw[i]) + (v / 928);
+ pwr928[j][i] = cw[i] = v % 928;
+ }
+ pwr928[j][0] = cw[0] = (2 * cw[0]) + (v / 928);
+ }
+ return;
+}
+
+/* converts bit string to base 928 values, codeWords[0] is highest order */
+static int encode928(UINT bitString[], UINT codeWords[], int bitLng) {
+ int i, j, b, bitCnt, cwNdx, cwCnt, cwLng;
+ for (cwNdx = cwLng = b = 0; b < bitLng; b += 69, cwNdx += 7) {
+ bitCnt = _min(bitLng - b, 69);
+ cwLng += cwCnt = bitCnt / 10 + 1;
+ for (i = 0; i < cwCnt; i++)
+ codeWords[cwNdx + i] = 0; /* init 0 */
+ for (i = 0; i < bitCnt; i++) {
+ if (getBit(bitString, b + bitCnt - i - 1)) {
+ for (j = 0; j < cwCnt; j++)
+ codeWords[cwNdx + j] += pwr928[i][j + 7 - cwCnt];
+ }
+ }
+ for (i = cwCnt - 1; i > 0; i--) {
+ /* add "carries" */
+ codeWords[cwNdx + i - 1] += codeWords[cwNdx + i] / 928L;
+ codeWords[cwNdx + i] %= 928L;
+ }
+ }
+ return (cwLng);
+}
+
+/* CC-A 2D component */
+static int cc_a(struct zint_symbol *symbol, char source[], int cc_width) {
+ int i, strpos, segment, bitlen, cwCnt, variant, rows;
+ int k, offset, j, total, rsCodeWords[8];
+ int LeftRAPStart, RightRAPStart, CentreRAPStart, StartCluster;
+ int LeftRAP, RightRAP, CentreRAP, Cluster, dummy[5];
+ int loop;
+ UINT codeWords[28];
+ UINT bitStr[13];
+ char pattern[580];
+ char local_source[210]; /* A copy of source but with padding zeroes to make 208 bits */
+
+ variant = 0;
+
+ for (i = 0; i < 13; i++) {
+ bitStr[i] = 0;
+ }
+ for (i = 0; i < 28; i++) {
+ codeWords[i] = 0;
+ }
+
+ bitlen = (int)strlen(source);
+
+ for (i = 0; i < 208; i++) {
+ local_source[i] = '0';
+ }
+ for (i = 0; i < bitlen; i++) {
+ local_source[i] = source[i];
+ }
+ local_source[208] = '\0';
+
+ for (segment = 0; segment < 13; segment++) {
+ strpos = segment * 16;
+ for (i = 0; i < 16; i++) {
+ if (local_source[strpos + i] == '1') {
+ bitStr[segment] += (0x8000 >> i);
+ }
+ }
+ }
+
+ init928();
+ /* encode codeWords from bitStr */
+ cwCnt = encode928(bitStr, codeWords, bitlen);
+
+ switch (cc_width) {
+ case 2:
+ switch (cwCnt) {
+ case 6: variant = 0;
+ break;
+ case 8: variant = 1;
+ break;
+ case 9: variant = 2;
+ break;
+ case 11: variant = 3;
+ break;
+ case 12: variant = 4;
+ break;
+ case 14: variant = 5;
+ break;
+ case 17: variant = 6;
+ break;
+ }
+ break;
+ case 3:
+ switch (cwCnt) {
+ case 8: variant = 7;
+ break;
+ case 10: variant = 8;
+ break;
+ case 12: variant = 9;
+ break;
+ case 14: variant = 10;
+ break;
+ case 17: variant = 11;
+ break;
+ }
+ break;
+ case 4:
+ switch (cwCnt) {
+ case 8: variant = 12;
+ break;
+ case 11: variant = 13;
+ break;
+ case 14: variant = 14;
+ break;
+ case 17: variant = 15;
+ break;
+ case 20: variant = 16;
+ break;
+ }
+ break;
+ }
+
+ rows = ccaVariants[variant];
+ k = ccaVariants[17 + variant];
+ offset = ccaVariants[34 + variant];
+
+ /* Reed-Solomon error correction */
+
+ for (i = 0; i < 8; i++) {
+ rsCodeWords[i] = 0;
+ }
+ total = 0;
+ for (i = 0; i < cwCnt; i++) {
+ total = (codeWords[i] + rsCodeWords[k - 1]) % 929;
+ for (j = k - 1; j >= 0; j--) {
+ if (j == 0) {
+ rsCodeWords[j] = (929 - (total * ccaCoeffs[offset + j]) % 929) % 929;
+ } else {
+ rsCodeWords[j] = (rsCodeWords[j - 1] + 929 - (total * ccaCoeffs[offset + j]) % 929) % 929;
+ }
+ }
+ }
+
+ for (j = 0; j < k; j++) {
+ if (rsCodeWords[j] != 0) {
+ rsCodeWords[j] = 929 - rsCodeWords[j];
+ }
+ }
+
+ for (i = k - 1; i >= 0; i--) {
+ codeWords[cwCnt] = rsCodeWords[i];
+ cwCnt++;
+ }
+
+ /* Place data into table */
+ LeftRAPStart = aRAPTable[variant];
+ CentreRAPStart = aRAPTable[variant + 17];
+ RightRAPStart = aRAPTable[variant + 34];
+ StartCluster = aRAPTable[variant + 51] / 3;
+
+ LeftRAP = LeftRAPStart;
+ CentreRAP = CentreRAPStart;
+ RightRAP = RightRAPStart;
+ Cluster = StartCluster; /* Cluster can be 0, 1 or 2 for Cluster(0), Cluster(3) and Cluster(6) */
+
+ for (i = 0; i < rows; i++) {
+ strcpy(pattern, "");
+ offset = 929 * Cluster;
+ for (j = 0; j < 5; j++) {
+ dummy[j] = 0;
+ }
+ for (j = 0; j < cc_width; j++) {
+ dummy[j + 1] = codeWords[i * cc_width + j];
+ }
+ /* Copy the data into codebarre */
+ bin_append(rap_side[LeftRAP - 1], 10, pattern);
+ bin_append(pdf_bitpattern[offset + dummy[1]], 16, pattern);
+ strcat(pattern, "0");
+ if (cc_width == 3) {
+ bin_append(rap_centre[CentreRAP - 1], 10, pattern);
+ }
+ if (cc_width >= 2) {
+ bin_append(pdf_bitpattern[offset + dummy[2]], 16, pattern);
+ strcat(pattern, "0");
+ }
+ if (cc_width == 4) {
+ bin_append(rap_centre[CentreRAP - 1], 10, pattern);
+ }
+ if (cc_width >= 3) {
+ bin_append(pdf_bitpattern[offset + dummy[3]], 16, pattern);
+ strcat(pattern, "0");
+ }
+ if (cc_width == 4) {
+ bin_append(pdf_bitpattern[offset + dummy[4]], 16, pattern);
+ strcat(pattern, "0");
+ }
+ bin_append(rap_side[RightRAP - 1], 10, pattern);
+ strcat(pattern, "1"); /* stop */
+
+ /* so now pattern[] holds the string of '1's and '0's. - copy this to the symbol */
+ for (loop = 0; loop < (int) strlen(pattern); loop++) {
+ if (pattern[loop] == '1') {
+ set_module(symbol, i, loop);
+ }
+ }
+ symbol->row_height[i] = 2;
+ symbol->rows++;
+ symbol->width = strlen(pattern);
+
+ /* Set up RAPs and Cluster for next row */
+ LeftRAP++;
+ CentreRAP++;
+ RightRAP++;
+ Cluster++;
+
+ if (LeftRAP == 53) {
+ LeftRAP = 1;
+ }
+ if (CentreRAP == 53) {
+ CentreRAP = 1;
+ }
+ if (RightRAP == 53) {
+ RightRAP = 1;
+ }
+ if (Cluster == 3) {
+ Cluster = 0;
+ }
+ }
+
+ return 0;
+}
+
+/* CC-B 2D component */
+static int cc_b(struct zint_symbol *symbol, char source[], int cc_width) {
+ int length, i, binloc;
+#ifndef _MSC_VER
+ unsigned char data_string[(strlen(source) / 8) + 3];
+#else
+ unsigned char* data_string = (unsigned char*) _alloca((strlen(source) / 8) + 3);
+#endif
+ int chainemc[180], mclength;
+ int k, j, p, longueur, mccorrection[50], offset;
+ int total, dummy[5];
+ char pattern[580];
+ int variant, LeftRAPStart, CentreRAPStart, RightRAPStart, StartCluster;
+ int LeftRAP, CentreRAP, RightRAP, Cluster, loop;
+
+ length = strlen(source) / 8;
+
+ for (i = 0; i < length; i++) {
+ binloc = i * 8;
+
+ data_string[i] = 0;
+ for (p = 0; p < 8; p++) {
+ if (source[binloc + p] == '1') {
+ data_string[i] += (0x80 >> p);
+ }
+ }
+ }
+
+
+ mclength = 0;
+
+ /* "the CC-B component shall have codeword 920 in the first symbol character position" (section 9a) */
+ chainemc[mclength] = 920;
+ mclength++;
+
+ byteprocess(chainemc, &mclength, data_string, 0, length, 0);
+
+ /* Now figure out which variant of the symbol to use and load values accordingly */
+
+ variant = 0;
+
+ if (cc_width == 2) {
+ variant = 13;
+ if (mclength <= 33) {
+ variant = 12;
+ }
+ if (mclength <= 29) {
+ variant = 11;
+ }
+ if (mclength <= 24) {
+ variant = 10;
+ }
+ if (mclength <= 19) {
+ variant = 9;
+ }
+ if (mclength <= 13) {
+ variant = 8;
+ }
+ if (mclength <= 8) {
+ variant = 7;
+ }
+ }
+
+ if (cc_width == 3) {
+ variant = 23;
+ if (mclength <= 70) {
+ variant = 22;
+ }
+ if (mclength <= 58) {
+ variant = 21;
+ }
+ if (mclength <= 46) {
+ variant = 20;
+ }
+ if (mclength <= 34) {
+ variant = 19;
+ }
+ if (mclength <= 24) {
+ variant = 18;
+ }
+ if (mclength <= 18) {
+ variant = 17;
+ }
+ if (mclength <= 14) {
+ variant = 16;
+ }
+ if (mclength <= 10) {
+ variant = 15;
+ }
+ if (mclength <= 6) {
+ variant = 14;
+ }
+ }
+
+ if (cc_width == 4) {
+ variant = 34;
+ if (mclength <= 108) {
+ variant = 33;
+ }
+ if (mclength <= 90) {
+ variant = 32;
+ }
+ if (mclength <= 72) {
+ variant = 31;
+ }
+ if (mclength <= 54) {
+ variant = 30;
+ }
+ if (mclength <= 39) {
+ variant = 29;
+ }
+ if (mclength <= 30) {
+ variant = 28;
+ }
+ if (mclength <= 24) {
+ variant = 27;
+ }
+ if (mclength <= 18) {
+ variant = 26;
+ }
+ if (mclength <= 12) {
+ variant = 25;
+ }
+ if (mclength <= 8) {
+ variant = 24;
+ }
+ }
+
+ /* Now we have the variant we can load the data - from here on the same as MicroPDF417 code */
+ variant--;
+ assert(variant >= 0);
+ symbol->option_2 = MicroVariants[variant]; /* columns */
+ symbol->rows = MicroVariants[variant + 34]; /* rows */
+ k = MicroVariants[variant + 68]; /* number of EC CWs */
+ longueur = (symbol->option_2 * symbol->rows) - k; /* number of non-EC CWs */
+ i = longueur - mclength; /* amount of padding required */
+ offset = MicroVariants[variant + 102]; /* coefficient offset */
+
+ /* We add the padding */
+ while (i > 0) {
+ chainemc[mclength] = 900;
+ mclength++;
+ i--;
+ }
+
+ /* Reed-Solomon error correction */
+ longueur = mclength;
+ for (loop = 0; loop < 50; loop++) {
+ mccorrection[loop] = 0;
+ }
+ total = 0;
+ for (i = 0; i < longueur; i++) {
+ total = (chainemc[i] + mccorrection[k - 1]) % 929;
+ for (j = k - 1; j >= 0; j--) {
+ if (j == 0) {
+ mccorrection[j] = (929 - (total * Microcoeffs[offset + j]) % 929) % 929;
+ } else {
+ mccorrection[j] = (mccorrection[j - 1] + 929 - (total * Microcoeffs[offset + j]) % 929) % 929;
+ }
+ }
+ }
+
+ for (j = 0; j < k; j++) {
+ if (mccorrection[j] != 0) {
+ mccorrection[j] = 929 - mccorrection[j];
+ }
+ }
+ /* we add these codes to the string */
+ for (i = k - 1; i >= 0; i--) {
+ chainemc[mclength] = mccorrection[i];
+ mclength++;
+ }
+
+ /* Now get the RAP (Row Address Pattern) start values */
+ LeftRAPStart = RAPTable[variant];
+ CentreRAPStart = RAPTable[variant + 34];
+ RightRAPStart = RAPTable[variant + 68];
+ StartCluster = RAPTable[variant + 102] / 3;
+
+ /* That's all values loaded, get on with the encoding */
+
+ LeftRAP = LeftRAPStart;
+ CentreRAP = CentreRAPStart;
+ RightRAP = RightRAPStart;
+ Cluster = StartCluster;
+ /* Cluster can be 0, 1 or 2 for Cluster(0), Cluster(3) and Cluster(6) */
+
+ for (i = 0; i < symbol->rows; i++) {
+ strcpy(pattern, "");
+ offset = 929 * Cluster;
+ for (j = 0; j < 5; j++) {
+ dummy[j] = 0;
+ }
+ for (j = 0; j < symbol->option_2; j++) {
+ dummy[j + 1] = chainemc[i * symbol->option_2 + j];
+ }
+ /* Copy the data into codebarre */
+ bin_append(rap_side[LeftRAP - 1], 10, pattern);
+ bin_append(pdf_bitpattern[offset + dummy[1]], 16, pattern);
+ strcat(pattern, "0");
+ if (cc_width == 3) {
+ bin_append(rap_centre[CentreRAP - 1], 10, pattern);
+ }
+ if (cc_width >= 2) {
+ bin_append(pdf_bitpattern[offset + dummy[2]], 16, pattern);
+ strcat(pattern, "0");
+ }
+ if (cc_width == 4) {
+ bin_append(rap_centre[CentreRAP - 1], 10, pattern);
+ }
+ if (cc_width >= 3) {
+ bin_append(pdf_bitpattern[offset + dummy[3]], 16, pattern);
+ strcat(pattern, "0");
+ }
+ if (cc_width == 4) {
+ bin_append(pdf_bitpattern[offset + dummy[4]], 16, pattern);
+ strcat(pattern, "0");
+ }
+ bin_append(rap_side[RightRAP - 1], 10, pattern);
+ strcat(pattern, "1"); /* stop */
+
+ /* so now pattern[] holds the string of '1's and '0's. - copy this to the symbol */
+ for (loop = 0; loop < (int) strlen(pattern); loop++) {
+ if (pattern[loop] == '1') {
+ set_module(symbol, i, loop);
+ }
+ }
+ symbol->row_height[i] = 2;
+ symbol->width = strlen(pattern);
+
+ /* Set up RAPs and Cluster for next row */
+ LeftRAP++;
+ CentreRAP++;
+ RightRAP++;
+ Cluster++;
+
+ if (LeftRAP == 53) {
+ LeftRAP = 1;
+ }
+ if (CentreRAP == 53) {
+ CentreRAP = 1;
+ }
+ if (RightRAP == 53) {
+ RightRAP = 1;
+ }
+ if (Cluster == 3) {
+ Cluster = 0;
+ }
+ }
+
+ return 0;
+}
+
+/* CC-C 2D component - byte compressed PDF417 */
+static int cc_c(struct zint_symbol *symbol, char source[], int cc_width, int ecc_level) {
+ int length, i, p, binloc;
+#ifndef _MSC_VER
+ unsigned char data_string[(strlen(source) / 8) + 4];
+#else
+ unsigned char* data_string = (unsigned char*) _alloca((strlen(source) / 8) + 4);
+#endif
+ int chainemc[1000], mclength, k;
+ int offset, longueur, loop, total, j, mccorrection[520];
+ int c1, c2, c3, dummy[35];
+ char pattern[580];
+
+ length = strlen(source) / 8;
+
+ for (i = 0; i < length; i++) {
+ binloc = i * 8;
+
+ data_string[i] = 0;
+ for (p = 0; p < 8; p++) {
+ if (source[binloc + p] == '1') {
+ data_string[i] += (0x80 >> p);
+ }
+ }
+ }
+
+ mclength = 0;
+
+ chainemc[mclength] = 0; /* space for length descriptor */
+ mclength++;
+ chainemc[mclength] = 920; /* CC-C identifier */
+ mclength++;
+
+ byteprocess(chainemc, &mclength, data_string, 0, length, 0);
+
+ chainemc[0] = mclength;
+
+ k = 1;
+ for (i = 1; i <= (ecc_level + 1); i++) {
+ k *= 2;
+ }
+
+ /* 796 - we now take care of the Reed Solomon codes */
+ switch (ecc_level) {
+ case 1: offset = 2;
+ break;
+ case 2: offset = 6;
+ break;
+ case 3: offset = 14;
+ break;
+ case 4: offset = 30;
+ break;
+ case 5: offset = 62;
+ break;
+ case 6: offset = 126;
+ break;
+ case 7: offset = 254;
+ break;
+ case 8: offset = 510;
+ break;
+ default: offset = 0;
+ break;
+ }
+
+ longueur = mclength;
+ for (loop = 0; loop < 520; loop++) {
+ mccorrection[loop] = 0;
+ }
+ total = 0;
+ for (i = 0; i < longueur; i++) {
+ total = (chainemc[i] + mccorrection[k - 1]) % 929;
+ for (j = k - 1; j >= 0; j--) {
+ if (j == 0) {
+ mccorrection[j] = (929 - (total * coefrs[offset + j]) % 929) % 929;
+ } else {
+ mccorrection[j] = (mccorrection[j - 1] + 929 - (total * coefrs[offset + j]) % 929) % 929;
+ }
+ }
+ }
+
+ for (j = 0; j < k; j++) {
+ if (mccorrection[j] != 0) {
+ mccorrection[j] = 929 - mccorrection[j];
+ }
+ }
+ /* we add these codes to the string */
+ for (i = k - 1; i >= 0; i--) {
+ chainemc[mclength] = mccorrection[i];
+ mclength++;
+ }
+
+ /* 818 - The CW string is finished */
+ c1 = (mclength / cc_width - 1) / 3;
+ c2 = ecc_level * 3 + (mclength / cc_width - 1) % 3;
+ c3 = cc_width - 1;
+
+ /* we now encode each row */
+ for (i = 0; i <= (mclength / cc_width) - 1; i++) {
+ for (j = 0; j < cc_width; j++) {
+ dummy[j + 1] = chainemc[i * cc_width + j];
+ }
+ k = (i / 3) * 30;
+ switch (i % 3) {
+ case 0:
+ dummy[0] = k + c1;
+ dummy[cc_width + 1] = k + c3;
+ offset = 0; /* cluster(0) */
+ break;
+ case 1:
+ dummy[0] = k + c2;
+ dummy[cc_width + 1] = k + c1;
+ offset = 929; /* cluster(3) */
+ break;
+ case 2:
+ dummy[0] = k + c3;
+ dummy[cc_width + 1] = k + c2;
+ offset = 1858; /* cluster(6) */
+ break;
+ }
+ strcpy(pattern, "");
+ bin_append(0x1FEA8, 17, pattern); /* Row start */
+
+ for (j = 0; j <= cc_width + 1; j++) {
+ bin_append(pdf_bitpattern[offset + dummy[j]], 16, pattern);
+ strcat(pattern, "0");
+ }
+ bin_append(0x3FA29, 18, pattern); /* Row Stop */
+
+ for (loop = 0; loop < (int) strlen(pattern); loop++) {
+ if (pattern[loop] == '1') {
+ set_module(symbol, i, loop);
+ }
+ }
+ symbol->row_height[i] = 3;
+ }
+ symbol->rows = (mclength / cc_width);
+ symbol->width = (int)strlen(pattern);
+
+ return 0;
+}
+
+static int calc_padding_cca(int binary_length, int cc_width) {
+ int target_bitsize = 0;
+
+ switch (cc_width) {
+ case 2:
+ if (binary_length <= 167) {
+ target_bitsize = 167;
+ }
+ if (binary_length <= 138) {
+ target_bitsize = 138;
+ }
+ if (binary_length <= 118) {
+ target_bitsize = 118;
+ }
+ if (binary_length <= 108) {
+ target_bitsize = 108;
+ }
+ if (binary_length <= 88) {
+ target_bitsize = 88;
+ }
+ if (binary_length <= 78) {
+ target_bitsize = 78;
+ }
+ if (binary_length <= 59) {
+ target_bitsize = 59;
+ }
+ break;
+ case 3:
+ if (binary_length <= 167) {
+ target_bitsize = 167;
+ }
+ if (binary_length <= 138) {
+ target_bitsize = 138;
+ }
+ if (binary_length <= 118) {
+ target_bitsize = 118;
+ }
+ if (binary_length <= 98) {
+ target_bitsize = 98;
+ }
+ if (binary_length <= 78) {
+ target_bitsize = 78;
+ }
+ break;
+ case 4:
+ if (binary_length <= 197) {
+ target_bitsize = 197;
+ }
+ if (binary_length <= 167) {
+ target_bitsize = 167;
+ }
+ if (binary_length <= 138) {
+ target_bitsize = 138;
+ }
+ if (binary_length <= 108) {
+ target_bitsize = 108;
+ }
+ if (binary_length <= 78) {
+ target_bitsize = 78;
+ }
+ break;
+ }
+
+ return target_bitsize;
+}
+
+int calc_padding_ccb(int binary_length, int cc_width) {
+ int target_bitsize = 0;
+
+ switch (cc_width) {
+ case 2:
+ if (binary_length <= 336) {
+ target_bitsize = 336;
+ }
+ if (binary_length <= 296) {
+ target_bitsize = 296;
+ }
+ if (binary_length <= 256) {
+ target_bitsize = 256;
+ }
+ if (binary_length <= 208) {
+ target_bitsize = 208;
+ }
+ if (binary_length <= 160) {
+ target_bitsize = 160;
+ }
+ if (binary_length <= 104) {
+ target_bitsize = 104;
+ }
+ if (binary_length <= 56) {
+ target_bitsize = 56;
+ }
+ break;
+ case 3:
+ if (binary_length <= 768) {
+ target_bitsize = 768;
+ }
+ if (binary_length <= 648) {
+ target_bitsize = 648;
+ }
+ if (binary_length <= 536) {
+ target_bitsize = 536;
+ }
+ if (binary_length <= 416) {
+ target_bitsize = 416;
+ }
+ if (binary_length <= 304) {
+ target_bitsize = 304;
+ }
+ if (binary_length <= 208) {
+ target_bitsize = 208;
+ }
+ if (binary_length <= 152) {
+ target_bitsize = 152;
+ }
+ if (binary_length <= 112) {
+ target_bitsize = 112;
+ }
+ if (binary_length <= 72) {
+ target_bitsize = 72;
+ }
+ if (binary_length <= 32) {
+ target_bitsize = 32;
+ }
+ break;
+ case 4:
+ if (binary_length <= 1184) {
+ target_bitsize = 1184;
+ }
+ if (binary_length <= 1016) {
+ target_bitsize = 1016;
+ }
+ if (binary_length <= 840) {
+ target_bitsize = 840;
+ }
+ if (binary_length <= 672) {
+ target_bitsize = 672;
+ }
+ if (binary_length <= 496) {
+ target_bitsize = 496;
+ }
+ if (binary_length <= 352) {
+ target_bitsize = 352;
+ }
+ if (binary_length <= 264) {
+ target_bitsize = 264;
+ }
+ if (binary_length <= 208) {
+ target_bitsize = 208;
+ }
+ if (binary_length <= 152) {
+ target_bitsize = 152;
+ }
+ if (binary_length <= 96) {
+ target_bitsize = 96;
+ }
+ if (binary_length <= 56) {
+ target_bitsize = 56;
+ }
+ break;
+ }
+
+ return target_bitsize;
+}
+
+int calc_padding_ccc(int binary_length, int *cc_width, int lin_width, int *ecc) {
+ int target_bitsize = 0;
+ int byte_length, codewords_used, ecc_level, ecc_codewords, rows;
+ int codewords_total, target_codewords, target_bytesize;
+ int i;
+
+ byte_length = binary_length / 8;
+ if (binary_length % 8 != 0) {
+ byte_length++;
+ }
+
+ codewords_used = (byte_length / 6) * 5;
+ codewords_used += byte_length % 6;
+
+ ecc_level = 7;
+ if (codewords_used <= 1280) {
+ ecc_level = 6;
+ }
+ if (codewords_used <= 640) {
+ ecc_level = 5;
+ }
+ if (codewords_used <= 320) {
+ ecc_level = 4;
+ }
+ if (codewords_used <= 160) {
+ ecc_level = 3;
+ }
+ if (codewords_used <= 40) {
+ ecc_level = 2;
+ }
+ *(ecc) = ecc_level;
+ ecc_codewords = 1;
+ for (i = 1; i <= (ecc_level + 1); i++) {
+ ecc_codewords *= 2;
+ }
+
+ codewords_used += ecc_codewords;
+ codewords_used += 3;
+
+ *(cc_width) = (lin_width - 62) / 17;
+ /* stop the symbol from becoming too high */
+ do {
+ *(cc_width) = *(cc_width) + 1;
+ rows = codewords_used / *(cc_width);
+ } while (rows > 90);
+
+ if (codewords_used % *(cc_width) != 0) {
+ rows++;
+ }
+
+ codewords_total = *(cc_width) * rows;
+
+ if (codewords_total > 928) { // PDF_MAX
+ return 0;
+ }
+
+ target_codewords = codewords_total - ecc_codewords;
+ target_codewords -= 3;
+
+ target_bytesize = 6 * (target_codewords / 5);
+ target_bytesize += target_codewords % 5;
+
+ target_bitsize = 8 * target_bytesize;
+
+ return target_bitsize;
+}
+
+static int cc_binary_string(struct zint_symbol *symbol, const char source[], char binary_string[], int cc_mode, int *cc_width, int *ecc, int lin_width) { /* Handles all data encodation from section 5 of ISO/IEC 24723 */
+ int encoding_method, read_posn, d1, d2, alpha_pad;
+ int i, j, ai_crop, fnc1_latch;
+ long int group_val;
+ int ai90_mode, latch, remainder, binary_length;
+ char date_str[4];
+#ifndef _MSC_VER
+ char general_field[strlen(source) + 1], general_field_type[strlen(source) + 1];
+#else
+ char* general_field = (char*) _alloca(strlen(source) + 1);
+ char* general_field_type = (char*) _alloca(strlen(source) + 1);
+#endif
+ int target_bitsize;
+
+ encoding_method = 1;
+ read_posn = 0;
+ ai_crop = 0;
+ fnc1_latch = 0;
+ alpha_pad = 0;
+ ai90_mode = 0;
+ *ecc = 0;
+ target_bitsize = 0;
+
+ if ((source[0] == '1') && ((source[1] == '0') || (source[1] == '1') || (source[1] == '7')) && (strlen(source) > 8)) {
+ /* Source starts (10), (11) or (17) */
+ encoding_method = 2;
+ }
+
+ if ((source[0] == '9') && (source[1] == '0')) {
+ /* Source starts (90) */
+ encoding_method = 3;
+ }
+
+ if (encoding_method == 1) {
+ strcat(binary_string, "0");
+ }
+
+ if (encoding_method == 2) {
+ /* Encoding Method field "10" - date and lot number */
+
+ strcat(binary_string, "10");
+
+ if (source[1] == '0') {
+ /* No date data */
+ strcat(binary_string, "11");
+ read_posn = 2;
+ } else {
+ /* Production Date (11) or Expiration Date (17) */
+ date_str[0] = source[2];
+ date_str[1] = source[3];
+ date_str[2] = '\0';
+ group_val = atoi(date_str) * 384;
+
+ date_str[0] = source[4];
+ date_str[1] = source[5];
+ group_val += (atoi(date_str) - 1) * 32;
+
+ date_str[0] = source[6];
+ date_str[1] = source[7];
+ group_val += atoi(date_str);
+
+ bin_append(group_val, 16, binary_string);
+
+ if (source[1] == '1') {
+ /* Production Date AI 11 */
+ strcat(binary_string, "0");
+ } else {
+ /* Expiration Date AI 17 */
+ strcat(binary_string, "1");
+ }
+ read_posn = 8;
+ }
+
+ if ((source[read_posn] == '1') && (source[read_posn + 1] == '0')) {
+ /* Followed by AI 10 - strip this from general field */
+ read_posn += 2;
+ } else {
+ /* An FNC1 character needs to be inserted in the general field */
+ fnc1_latch = 1;
+ }
+ }
+
+ if (encoding_method == 3) {
+ /* Encodation Method field of "11" - AI 90 */
+#ifndef _MSC_VER
+ char ninety[strlen(source) + 1];
+#else
+ char* ninety = (char*) _alloca(strlen(source) + 1);
+#endif
+ char numeric_part[4];
+ int alpha, alphanum, numeric, test1, test2, test3, next_ai_posn;
+ int numeric_value, table3_letter;
+
+ /* "This encodation method may be used if an element string with an AI
+ 90 occurs at the start of the data message, and if the data field
+ following the two-digit AI 90 starts with an alphanumeric string which
+ complies with a specific format." (para 5.2.2) */
+
+ i = 0;
+ do {
+ ninety[i] = source[i + 2];
+ i++;
+ } while ((strlen(source) > i + 2) && ('[' != source[i + 2]));
+ ninety[i] = '\0';
+
+ /* Find out if the AI 90 data is alphabetic or numeric or both */
+
+ alpha = 0;
+ alphanum = 0;
+ numeric = 0;
+
+ for (i = 0; i < (int) strlen(ninety); i++) {
+
+ if ((ninety[i] >= 'A') && (ninety[i] <= 'Z')) {
+ /* Character is alphabetic */
+ alpha += 1;
+ }
+
+ if ((ninety[i] >= '0') && (ninety[i] <= '9')) {
+ /* Character is numeric */
+ numeric += 1;
+ }
+
+ switch (ninety[i]) {
+ case '*':
+ case ',':
+ case '-':
+ case '.':
+ case '/': alphanum += 1;
+ break;
+ }
+
+ if (!(((ninety[i] >= '0') && (ninety[i] <= '9')) || ((ninety[i] >= 'A') && (ninety[i] <= 'Z')))) {
+ if ((ninety[i] != '*') && (ninety[i] != ',') && (ninety[i] != '-') && (ninety[i] != '.') && (ninety[i] != '/')) {
+ /* An Invalid AI 90 character */
+ strcpy(symbol->errtxt, "440: Invalid AI 90 data");
+ return ZINT_ERROR_INVALID_DATA;
+ }
+ }
+ }
+
+ /* must start with 0, 1, 2 or 3 digits followed by an uppercase character */
+ test1 = -1;
+ for (i = 3; i >= 0; i--) {
+ if ((ninety[i] >= 'A') && (ninety[i] <= 'Z')) {
+ test1 = i;
+ }
+ }
+
+ test2 = 0;
+ for (i = 0; i < test1; i++) {
+ if (!((ninety[i] >= '0') && (ninety[i] <= '9'))) {
+ test2 = 1;
+ }
+ }
+
+ /* leading zeros are not permitted */
+ test3 = 0;
+ if ((test1 >= 1) && (ninety[0] == '0')) {
+ test3 = 1;
+ }
+
+ if ((test1 != -1) && (test2 != 1) && (test3 == 0)) {
+ /* Encodation method "11" can be used */
+ strcat(binary_string, "11");
+
+ numeric -= test1;
+ alpha--;
+
+ /* Decide on numeric, alpha or alphanumeric mode */
+ /* Alpha mode is a special mode for AI 90 */
+
+ if (alphanum > 0) {
+ /* Alphanumeric mode */
+ strcat(binary_string, "0");
+ ai90_mode = 1;
+ } else {
+ if (alpha > numeric) {
+ /* Alphabetic mode */
+ strcat(binary_string, "11");
+ ai90_mode = 2;
+ } else {
+ /* Numeric mode */
+ strcat(binary_string, "10");
+ ai90_mode = 3;
+ }
+ }
+
+ next_ai_posn = 2 + (int)strlen(ninety);
+
+ if (source[next_ai_posn] == '[') {
+ /* There are more AIs afterwords */
+ if ((source[next_ai_posn + 1] == '2') && (source[next_ai_posn + 2] == '1')) {
+ /* AI 21 follows */
+ ai_crop = 1;
+ }
+
+ if ((source[next_ai_posn + 1] == '8') && (source[next_ai_posn + 2] == '0') && (source[next_ai_posn + 3] == '0') && (source[next_ai_posn + 4] == '4')) {
+ /* AI 8004 follows */
+ ai_crop = 2;
+ }
+ }
+
+ switch (ai_crop) {
+ case 0: strcat(binary_string, "0");
+ break;
+ case 1: strcat(binary_string, "10");
+ break;
+ case 2: strcat(binary_string, "11");
+ break;
+ }
+
+ if (test1 == 0) {
+ strcpy(numeric_part, "0");
+ } else {
+ for (i = 0; i < test1; i++) {
+ numeric_part[i] = ninety[i];
+ }
+ numeric_part[i] = '\0';
+ }
+
+ numeric_value = atoi(numeric_part);
+
+ table3_letter = -1;
+ if (numeric_value < 31) {
+ table3_letter = posn("BDHIJKLNPQRSTVWZ", ninety[test1]);
+ }
+
+ if (table3_letter != -1) {
+ /* Encoding can be done according to 5.2.2 c) 2) */
+ /* five bit binary string representing value before letter */
+ bin_append(numeric_value, 5, binary_string);
+
+ /* followed by four bit representation of letter from Table 3 */
+ bin_append(table3_letter, 4, binary_string);
+ } else {
+ /* Encoding is done according to 5.2.2 c) 3) */
+ bin_append(31, 5, binary_string);
+ /* ten bit representation of number */
+ bin_append(numeric_value, 10, binary_string);
+
+ /* five bit representation of ASCII character */
+ bin_append(ninety[test1] - 65, 5, binary_string);
+ }
+
+ read_posn = test1 + 3;
+ } else {
+ /* Use general field encodation instead */
+ strcat(binary_string, "0");
+ read_posn = 0;
+ }
+ }
+
+ /* Now encode the rest of the AI 90 data field */
+ if (ai90_mode == 2) {
+ /* Alpha encodation (section 5.2.3) */
+ do {
+ if ((source[read_posn] >= '0') && (source[read_posn] <= '9')) {
+ bin_append(source[read_posn] + 4, 5, binary_string);
+ }
+
+ if ((source[read_posn] >= 'A') && (source[read_posn] <= 'Z')) {
+ bin_append(source[read_posn] - 65, 6, binary_string);
+ }
+
+ if (source[read_posn] == '[') {
+ bin_append(31, 5, binary_string);
+ }
+
+ read_posn++;
+ } while ((source[read_posn - 1] != '[') && (source[read_posn - 1] != '\0'));
+ alpha_pad = 1; /* This is overwritten if a general field is encoded */
+ }
+
+ if (ai90_mode == 1) {
+ /* Alphanumeric mode */
+ do {
+ if ((source[read_posn] >= '0') && (source[read_posn] <= '9')) {
+ bin_append(source[read_posn] - 43, 5, binary_string);
+ }
+
+ if ((source[read_posn] >= 'A') && (source[read_posn] <= 'Z')) {
+ bin_append(source[read_posn] - 33, 6, binary_string);
+ }
+
+ switch (source[read_posn]) {
+ case '[':
+ bin_append(15, 5, binary_string);
+ break;
+ case '*':
+ bin_append(58, 6, binary_string);
+ break;
+ case ',':
+ bin_append(59, 6, binary_string);
+ break;
+ case '-':
+ bin_append(60, 6, binary_string);
+ break;
+ case '.':
+ bin_append(61, 6, binary_string);
+ break;
+ case '/':
+ bin_append(62, 6, binary_string);
+ break;
+ }
+
+ read_posn++;
+ } while ((source[read_posn - 1] != '[') && (source[read_posn - 1] != '\0'));
+ }
+
+ read_posn += (2 * ai_crop);
+
+ /* The compressed data field has been processed if appropriate - the
+ rest of the data (if any) goes into a general-purpose data compaction field */
+
+ j = 0;
+ if (fnc1_latch == 1) {
+ /* Encodation method "10" has been used but it is not followed by
+ AI 10, so a FNC1 character needs to be added */
+ general_field[j] = '[';
+ j++;
+ }
+
+ for (i = read_posn; i < (int) strlen(source); i++) {
+ general_field[j] = source[i];
+ j++;
+ }
+ general_field[j] = '\0';
+
+ if (strlen(general_field) != 0) {
+ alpha_pad = 0;
+ }
+
+ latch = 0;
+ for (i = 0; i < (int) strlen(general_field); i++) {
+ /* Table 13 - ISO/IEC 646 encodation */
+ if ((general_field[i] < ' ') || (general_field[i] > 'z')) {
+ general_field_type[i] = INVALID_CHAR;
+ latch = 1;
+ } else {
+ general_field_type[i] = ISOIEC;
+ }
+
+ if (general_field[i] == '#') {
+ general_field_type[i] = INVALID_CHAR;
+ latch = 1;
+ }
+ if (general_field[i] == '$') {
+ general_field_type[i] = INVALID_CHAR;
+ latch = 1;
+ }
+ if (general_field[i] == '@') {
+ general_field_type[i] = INVALID_CHAR;
+ latch = 1;
+ }
+ if (general_field[i] == 92) {
+ general_field_type[i] = INVALID_CHAR;
+ latch = 1;
+ }
+ if (general_field[i] == '^') {
+ general_field_type[i] = INVALID_CHAR;
+ latch = 1;
+ }
+ if (general_field[i] == 96) {
+ general_field_type[i] = INVALID_CHAR;
+ latch = 1;
+ }
+
+ /* Table 12 - Alphanumeric encodation */
+ if ((general_field[i] >= 'A') && (general_field[i] <= 'Z')) {
+ general_field_type[i] = ALPHA_OR_ISO;
+ }
+ if (general_field[i] == '*') {
+ general_field_type[i] = ALPHA_OR_ISO;
+ }
+ if (general_field[i] == ',') {
+ general_field_type[i] = ALPHA_OR_ISO;
+ }
+ if (general_field[i] == '-') {
+ general_field_type[i] = ALPHA_OR_ISO;
+ }
+ if (general_field[i] == '.') {
+ general_field_type[i] = ALPHA_OR_ISO;
+ }
+ if (general_field[i] == '/') {
+ general_field_type[i] = ALPHA_OR_ISO;
+ }
+
+ /* Numeric encodation */
+ if ((general_field[i] >= '0') && (general_field[i] <= '9')) {
+ general_field_type[i] = ANY_ENC;
+ }
+ if (general_field[i] == '[') {
+ /* FNC1 can be encoded in any system */
+ general_field_type[i] = ANY_ENC;
+ }
+
+ }
+
+ general_field_type[strlen(general_field)] = '\0';
+
+ if (latch == 1) {
+ /* Invalid characters in input data */
+ strcpy(symbol->errtxt, "441: Invalid characters in input data");
+ return ZINT_ERROR_INVALID_DATA;
+ }
+
+ for (i = 0; i < (int) strlen(general_field); i++) {
+ if ((general_field_type[i] == ISOIEC) && (general_field[i + 1] == '[')) {
+ general_field_type[i + 1] = ISOIEC;
+ }
+ }
+
+ for (i = 0; i < (int) strlen(general_field); i++) {
+ if ((general_field_type[i] == ALPHA_OR_ISO) && (general_field[i + 1] == '[')) {
+ general_field_type[i + 1] = ALPHA_OR_ISO;
+ }
+ }
+
+ latch = general_rules(general_field, general_field_type);
+
+ i = 0;
+ do {
+ switch (general_field_type[i]) {
+ case NUMERIC:
+
+ if (i != 0) {
+ if ((general_field_type[i - 1] != NUMERIC) && (general_field[i - 1] != '[')) {
+ bin_append(0, 3, binary_string); /* Numeric latch */
+ }
+ }
+
+ if (general_field[i] != '[') {
+ d1 = ctoi(general_field[i]);
+ } else {
+ d1 = 10;
+ }
+
+ if (general_field[i + 1] != '[') {
+ d2 = ctoi(general_field[i + 1]);
+ } else {
+ d2 = 10;
+ }
+
+ bin_append((11 * d1) + d2 + 8, 7, binary_string);
+
+ i += 2;
+ break;
+
+ case ALPHA:
+
+ if (i != 0) {
+ if ((general_field_type[i - 1] == NUMERIC) || (general_field[i - 1] == '[')) {
+ bin_append(0, 4, binary_string); /* Alphanumeric latch */
+ }
+ if (general_field_type[i - 1] == ISOIEC) {
+ bin_append(4, 5, binary_string); /* ISO/IEC 646 latch */
+ }
+ }
+
+ if ((general_field[i] >= '0') && (general_field[i] <= '9')) {
+ bin_append(general_field[i] - 43, 5, binary_string);
+ }
+
+ if ((general_field[i] >= 'A') && (general_field[i] <= 'Z')) {
+ bin_append(general_field[i] - 33, 6, binary_string);
+ }
+
+ switch (general_field[i]) {
+ case '[':
+ bin_append(15, 5, binary_string);
+ break;
+ case '*':
+ bin_append(58, 6, binary_string);
+ break;
+ case ',':
+ bin_append(59, 6, binary_string);
+ break;
+ case '-':
+ bin_append(60, 6, binary_string);
+ break;
+ case '.':
+ bin_append(61, 6, binary_string);
+ break;
+ case '/':
+ bin_append(62, 6, binary_string);
+ break;
+ }
+
+ i++;
+ break;
+
+ case ISOIEC:
+
+ if (i != 0) {
+ if ((general_field_type[i - 1] == NUMERIC) || (general_field[i - 1] == '[')) {
+ bin_append(0, 4, binary_string); /* Alphanumeric latch */
+ bin_append(4, 5, binary_string); /* ISO/IEC 646 latch */
+ }
+ if (general_field_type[i - 1] == ALPHA) {
+ bin_append(4, 5, binary_string);; /* ISO/IEC 646 latch */
+ }
+ }
+
+ if ((general_field[i] >= '0') && (general_field[i] <= '9')) {
+ bin_append(general_field[i] - 43, 5, binary_string);
+ }
+
+ if ((general_field[i] >= 'A') && (general_field[i] <= 'Z')) {
+ bin_append(general_field[i] - 1, 7, binary_string);
+ }
+
+ if ((general_field[i] >= 'a') && (general_field[i] <= 'z')) {
+ bin_append(general_field[i] - 7, 7, binary_string);
+ }
+
+ if (general_field[i] == '[') strcat(binary_string, "01111"); /* FNC1/Numeric latch */
+ if (general_field[i] == '!') strcat(binary_string, "11101000"); /* exclamation mark */
+ if (general_field[i] == 34) strcat(binary_string, "11101001"); /* quotation mark */
+ if (general_field[i] == 37) strcat(binary_string, "11101010"); /* percent sign */
+ if (general_field[i] == '&') strcat(binary_string, "11101011"); /* ampersand */
+ if (general_field[i] == 39) strcat(binary_string, "11101100"); /* apostrophe */
+ if (general_field[i] == '(') strcat(binary_string, "11101101"); /* left parenthesis */
+ if (general_field[i] == ')') strcat(binary_string, "11101110"); /* right parenthesis */
+ if (general_field[i] == '*') strcat(binary_string, "11101111"); /* asterisk */
+ if (general_field[i] == '+') strcat(binary_string, "11110000"); /* plus sign */
+ if (general_field[i] == ',') strcat(binary_string, "11110001"); /* comma */
+ if (general_field[i] == '-') strcat(binary_string, "11110010"); /* minus or hyphen */
+ if (general_field[i] == '.') strcat(binary_string, "11110011"); /* period or full stop */
+ if (general_field[i] == '/') strcat(binary_string, "11110100"); /* slash or solidus */
+ if (general_field[i] == ':') strcat(binary_string, "11110101"); /* colon */
+ if (general_field[i] == ';') strcat(binary_string, "11110110"); /* semicolon */
+ if (general_field[i] == '<') strcat(binary_string, "11110111"); /* less-than sign */
+ if (general_field[i] == '=') strcat(binary_string, "11111000"); /* equals sign */
+ if (general_field[i] == '>') strcat(binary_string, "11111001"); /* greater-than sign */
+ if (general_field[i] == '?') strcat(binary_string, "11111010"); /* question mark */
+ if (general_field[i] == '_') strcat(binary_string, "11111011"); /* underline or low line */
+ if (general_field[i] == ' ') strcat(binary_string, "11111100"); /* space */
+
+ i++;
+ break;
+ }
+ } while (i + latch < (int) strlen(general_field));
+
+ binary_length = (int)strlen(binary_string);
+ switch (cc_mode) {
+ case 1:
+ target_bitsize = calc_padding_cca(binary_length, *(cc_width));
+ break;
+ case 2:
+ target_bitsize = calc_padding_ccb(binary_length, *(cc_width));
+ break;
+ case 3:
+ target_bitsize = calc_padding_ccc(binary_length, cc_width, lin_width, ecc);
+ break;
+ }
+
+ if (target_bitsize == 0) {
+ strcpy(symbol->errtxt, "442: Input too long for selected 2d component");
+ return ZINT_ERROR_TOO_LONG;
+ }
+
+ remainder = target_bitsize - binary_length;
+
+ if (latch == 1) {
+ i = 0;
+ /* There is still one more numeric digit to encode */
+
+ if ((remainder >= 4) && (remainder <= 6)) {
+ bin_append(ctoi(general_field[i]) + 1, 4, binary_string);
+ } else {
+ bin_append((11 * ctoi(general_field[i])) + 18, 7, binary_string);
+ /* This may push the symbol up to the next size */
+ }
+ }
+
+ if (strlen(binary_string) > 11805) { /* (2361 * 5) */
+ strcpy(symbol->errtxt, "443: Input too long");
+ return ZINT_ERROR_TOO_LONG;
+ }
+
+
+ binary_length = (int)strlen(binary_string);
+ switch (cc_mode) {
+ case 1:
+ target_bitsize = calc_padding_cca(binary_length, *(cc_width));
+ break;
+ case 2:
+ target_bitsize = calc_padding_ccb(binary_length, *(cc_width));
+ break;
+ case 3:
+ target_bitsize = calc_padding_ccc(binary_length, cc_width, lin_width, ecc);
+ break;
+ }
+
+ if (target_bitsize == 0) {
+ strcpy(symbol->errtxt, "444: Input too long for selected 2d component");
+ return ZINT_ERROR_TOO_LONG;
+ }
+
+ if (binary_length < target_bitsize) {
+ /* Now add padding to binary string */
+ if (alpha_pad == 1) {
+ strcat(binary_string, "11111");
+ alpha_pad = 0;
+ /* Extra FNC1 character required after Alpha encodation (section 5.2.3) */
+ }
+
+ if ((strlen(general_field) != 0) && (general_field_type[strlen(general_field) - 1] == NUMERIC)) {
+ strcat(binary_string, "0000");
+ }
+
+ while (strlen(binary_string) < (unsigned int) target_bitsize) {
+ strcat(binary_string, "00100");
+ }
+
+ if (strlen(binary_string) > (unsigned int) target_bitsize) {
+ binary_string[target_bitsize] = '\0';
+ }
+ }
+
+ return 0;
+}
+
+int linear_dummy_run(unsigned char *source, int length) {
+ struct zint_symbol *dummy;
+ int error_number;
+ int linear_width;
+
+ dummy = ZBarcode_Create();
+ dummy->symbology = BARCODE_EAN128_CC;
+ dummy->option_1 = 3;
+ error_number = ean_128(dummy, source, length);
+ linear_width = dummy->width;
+ ZBarcode_Delete(dummy);
+
+ if (error_number == 0) {
+ return linear_width;
+ } else {
+ return 0;
+ }
+}
+
+int composite(struct zint_symbol *symbol, unsigned char source[], int length) {
+ int error_number, cc_mode, cc_width, ecc_level;
+ int j, i, k;
+ unsigned int rs = length + 1;
+ unsigned int bs = 20 * rs;
+ unsigned int pri_len;
+#ifndef _MSC_VER
+ char reduced[rs];
+ char binary_string[bs];
+#else
+ char* reduced = (char*) _alloca(rs);
+ char* binary_string = (char*) _alloca(bs);
+#endif
+ struct zint_symbol *linear;
+ int top_shift, bottom_shift;
+ int linear_width = 0;
+
+ /* Perform sanity checks on input options first */
+ error_number = 0;
+ pri_len = (int)strlen(symbol->primary);
+ if (pri_len == 0) {
+ strcpy(symbol->errtxt, "445: No primary (linear) message in 2D composite");
+ return ZINT_ERROR_INVALID_OPTION;
+ }
+
+ if (length > 2990) {
+ strcpy(symbol->errtxt, "446: 2D component input data too long");
+ return ZINT_ERROR_TOO_LONG;
+ }
+
+ cc_mode = symbol->option_1;
+ if ((cc_mode == 3) && (symbol->symbology != BARCODE_EAN128_CC)) {
+ /* CC-C can only be used with a GS1-128 linear part */
+ strcpy(symbol->errtxt, "447: Invalid mode (CC-C only valid with GS1-128 linear component)");
+ return ZINT_ERROR_INVALID_OPTION;
+ }
+
+ error_number = gs1_verify(symbol, source, length, reduced);
+ if (error_number != 0) {
+ return error_number;
+ }
+
+ if (symbol->symbology == BARCODE_EAN128_CC) {
+ /* Do a test run of encoding the linear component to establish its width */
+ linear_width = linear_dummy_run((unsigned char *) symbol->primary, pri_len);
+ if (linear_width == 0) {
+ strcpy(symbol->errtxt, "448: Invalid data");
+ return ZINT_ERROR_INVALID_DATA;
+ }
+ }
+
+ switch (symbol->symbology) {
+ /* Determine width of 2D component according to ISO/IEC 24723 Table 1 */
+ case BARCODE_EANX_CC:
+ switch (pri_len) {
+ case 7: /* EAN-8 */
+ case 10: /* EAN-8 + 2 */
+ case 13: /* EAN-8 + 5 */
+ cc_width = 3;
+ break;
+ case 12: /* EAN-13 */
+ case 15: /* EAN-13 + 2 */
+ case 18: /* EAN-13 + 5 */
+ cc_width = 4;
+ break;
+ }
+ break;
+ case BARCODE_EAN128_CC: cc_width = 4;
+ break;
+ case BARCODE_RSS14_CC: cc_width = 4;
+ break;
+ case BARCODE_RSS_LTD_CC: cc_width = 3;
+ break;
+ case BARCODE_RSS_EXP_CC: cc_width = 4;
+ break;
+ case BARCODE_UPCA_CC: cc_width = 4;
+ break;
+ case BARCODE_UPCE_CC: cc_width = 2;
+ break;
+ case BARCODE_RSS14STACK_CC: cc_width = 2;
+ break;
+ case BARCODE_RSS14_OMNI_CC: cc_width = 2;
+ break;
+ case BARCODE_RSS_EXPSTACK_CC: cc_width = 4;
+ break;
+ }
+
+ memset(binary_string, 0, bs);
+
+ if (cc_mode < 1 || cc_mode > 3) {
+ cc_mode = 1;
+ }
+
+ if (cc_mode == 1) {
+ i = cc_binary_string(symbol, reduced, binary_string, cc_mode, &cc_width, &ecc_level, linear_width);
+ if (i == ZINT_ERROR_TOO_LONG) {
+ cc_mode = 2;
+ }
+ }
+
+ if (cc_mode == 2) {
+ /* If the data didn't fit into CC-A it is recalculated for CC-B */
+ i = cc_binary_string(symbol, reduced, binary_string, cc_mode, &cc_width, &ecc_level, linear_width);
+ if (i == ZINT_ERROR_TOO_LONG) {
+ if (symbol->symbology != BARCODE_EAN128_CC) {
+ return ZINT_ERROR_TOO_LONG;
+ } else {
+ cc_mode = 3;
+ }
+ }
+ }
+
+ if (cc_mode == 3) {
+ /* If the data didn't fit in CC-B (and linear part is GS1-128) it is recalculated for CC-C */
+ i = cc_binary_string(symbol, reduced, binary_string, cc_mode, &cc_width, &ecc_level, linear_width);
+ if (i == ZINT_ERROR_TOO_LONG) {
+ return ZINT_ERROR_TOO_LONG;
+ }
+ }
+
+ switch (cc_mode) {
+ /* Note that ecc_level is only relevant to CC-C */
+ case 1: error_number = cc_a(symbol, binary_string, cc_width);
+ break;
+ case 2: error_number = cc_b(symbol, binary_string, cc_width);
+ break;
+ case 3: error_number = cc_c(symbol, binary_string, cc_width, ecc_level);
+ break;
+ }
+
+ if (error_number != 0) {
+ return ZINT_ERROR_ENCODING_PROBLEM;
+ }
+
+ /* 2D component done, now calculate linear component */
+ linear = ZBarcode_Create(); /* Symbol contains the 2D component and Linear contains the rest */
+
+ linear->symbology = symbol->symbology;
+
+ if (linear->symbology != BARCODE_EAN128_CC) {
+ /* Set the "component linkage" flag in the linear component */
+ linear->option_1 = 2;
+ } else {
+ /* GS1-128 needs to know which type of 2D component is used */
+ linear->option_1 = cc_mode;
+ }
+
+ switch (symbol->symbology) {
+ case BARCODE_EANX_CC: error_number = eanx(linear, (unsigned char *) symbol->primary, pri_len);
+ break;
+ case BARCODE_EAN128_CC: error_number = ean_128(linear, (unsigned char *) symbol->primary, pri_len);
+ break;
+ case BARCODE_RSS14_CC: error_number = rss14(linear, (unsigned char *) symbol->primary, pri_len);
+ break;
+ case BARCODE_RSS_LTD_CC: error_number = rsslimited(linear, (unsigned char *) symbol->primary, pri_len);
+ break;
+ case BARCODE_RSS_EXP_CC: error_number = rssexpanded(linear, (unsigned char *) symbol->primary, pri_len);
+ break;
+ case BARCODE_UPCA_CC: error_number = eanx(linear, (unsigned char *) symbol->primary, pri_len);
+ break;
+ case BARCODE_UPCE_CC: error_number = eanx(linear, (unsigned char *) symbol->primary, pri_len);
+ break;
+ case BARCODE_RSS14STACK_CC: error_number = rss14(linear, (unsigned char *) symbol->primary, pri_len);
+ break;
+ case BARCODE_RSS14_OMNI_CC: error_number = rss14(linear, (unsigned char *) symbol->primary, pri_len);
+ break;
+ case BARCODE_RSS_EXPSTACK_CC: error_number = rssexpanded(linear, (unsigned char *) symbol->primary, pri_len);
+ break;
+ }
+
+ if (error_number != 0) {
+ strcpy(symbol->errtxt, linear->errtxt);
+ strcat(symbol->errtxt, " in linear component ");
+ ZBarcode_Delete(linear);
+ return error_number;
+ }
+
+ /* Merge the linear component with the 2D component */
+
+ top_shift = 0;
+ bottom_shift = 0;
+
+ switch (symbol->symbology) {
+ /* Determine horizontal alignment (according to section 12.3) */
+ case BARCODE_EANX_CC:
+ switch (pri_len) {
+ case 7: /* EAN-8 */
+ case 10: /* EAN-8 + 2 */
+ case 13: /* EAN-8 + 5 */
+ bottom_shift = 13;
+ break;
+ case 12: /* EAN-13 */
+ case 15: /* EAN-13 + 2 */
+ case 18: /* EAN-13 + 5 */
+ bottom_shift = 2;
+ break;
+ }
+ break;
+ case BARCODE_EAN128_CC: if (cc_mode == 3) {
+ bottom_shift = 7;
+ }
+ break;
+ case BARCODE_RSS14_CC: bottom_shift = 4;
+ break;
+ case BARCODE_RSS_LTD_CC: bottom_shift = 9;
+ break;
+ case BARCODE_RSS_EXP_CC: k = 1;
+ while ((!(module_is_set(linear, 1, k - 1))) && module_is_set(linear, 1, k)) {
+ k++;
+ }
+ top_shift = k;
+ break;
+ case BARCODE_UPCA_CC: bottom_shift = 2;
+ break;
+ case BARCODE_UPCE_CC: bottom_shift = 2;
+ break;
+ case BARCODE_RSS14STACK_CC: top_shift = 1;
+ break;
+ case BARCODE_RSS14_OMNI_CC: top_shift = 1;
+ break;
+ case BARCODE_RSS_EXPSTACK_CC: k = 1;
+ while ((!(module_is_set(linear, 1, k - 1))) && module_is_set(linear, 1, k)) {
+ k++;
+ }
+ top_shift = k;
+ break;
+ }
+
+ if (top_shift != 0) {
+ /* Move the 2d component of the symbol horizontally */
+ for (i = 0; i <= symbol->rows; i++) {
+ for (j = (symbol->width + top_shift); j >= top_shift; j--) {
+ if (module_is_set(symbol, i, j - top_shift)) {
+ set_module(symbol, i, j);
+ } else {
+ unset_module(symbol, i, j);
+ }
+ }
+ for (j = 0; j < top_shift; j++) {
+ unset_module(symbol, i, j);
+ }
+ }
+ }
+
+ /* Merge linear and 2D components into one structure */
+ for (i = 0; i <= linear->rows; i++) {
+ symbol->row_height[symbol->rows + i] = linear->row_height[i];
+ for (j = 0; j <= linear->width; j++) {
+ if (module_is_set(linear, i, j)) {
+ set_module(symbol, i + symbol->rows, j + bottom_shift);
+ } else {
+ unset_module(symbol, i + symbol->rows, j + bottom_shift);
+ }
+ }
+ }
+ if ((linear->width + bottom_shift) > symbol->width) {
+ symbol->width = linear->width + bottom_shift;
+ }
+ if ((symbol->width + top_shift) > symbol->width) {
+ symbol->width += top_shift;
+ }
+ symbol->rows += linear->rows;
+ ustrcpy(symbol->text, (unsigned char *) linear->text);
+
+ ZBarcode_Delete(linear);
+
+ return error_number;
+}
diff --git a/3rdparty/zint-2.6.1/backend/composite.h b/3rdparty/zint-2.6.1/backend/composite.h
new file mode 100644
index 0000000..c03c11b
--- /dev/null
+++ b/3rdparty/zint-2.6.1/backend/composite.h
@@ -0,0 +1,73 @@
+/* composite.c - Tables for UCC.EAN Composite Symbols */
+
+/*
+ libzint - the open source barcode library
+ Copyright (C) 2008-2017 Robin Stuart
+
+ Redistribution and use in source and binary forms, with or without
+ modification, are permitted provided that the following conditions
+ are met:
+
+ 1. Redistributions of source code must retain the above copyright
+ notice, this list of conditions and the following disclaimer.
+ 2. Redistributions in binary form must reproduce the above copyright
+ notice, this list of conditions and the following disclaimer in the
+ documentation and/or other materials provided with the distribution.
+ 3. Neither the name of the project nor the names of its contributors
+ may be used to endorse or promote products derived from this software
+ without specific prior written permission.
+
+ THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND
+ ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+ ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE
+ FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+ DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
+ OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
+ HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
+ LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
+ OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+ SUCH DAMAGE.
+ */
+
+#define NUMERIC 110
+#define ALPHA 97
+#define ISOIEC 105
+#define INVALID_CHAR 100
+#define ANY_ENC 120
+#define ALPHA_OR_ISO 121
+
+/* CC-A component coefficients from ISO/IEC 24728:2006 Annex F */
+static const unsigned short int ccaCoeffs[30] = {
+ /* k = 4 */
+ 522, 568, 723, 809,
+
+ /* k = 5 */
+ 427, 919, 460, 155, 566,
+
+ /* k = 6 */
+ 861, 285, 19, 803, 17, 766,
+
+ /* k = 7 */
+ 76, 925, 537, 597, 784, 691, 437,
+
+ /* k = 8 */
+ 237, 308, 436, 284, 646, 653, 428, 379
+};
+
+/* rows, error codewords, k-offset of valid CC-A sizes from ISO/IEC 24723:2006 Table 9 */
+static const char ccaVariants[51] = {
+ 5, 6, 7, 8, 9, 10, 12, 4, 5, 6, 7, 8, 3, 4, 5, 6, 7,
+ 4, 4, 5, 5, 6, 6, 7, 4, 5, 6, 7, 7, 4, 5, 6, 7, 8,
+ 0, 0, 4, 4, 9, 9, 15, 0, 4, 9, 15, 15, 0, 4, 9, 15, 22
+};
+
+/* following is Left RAP, Centre RAP, Right RAP and Start Cluster from ISO/IEC 24723:2006 tables 10 and 11 */
+static const char aRAPTable[68] = {
+ 39, 1, 32, 8, 14, 43, 20, 11, 1, 5, 15, 21, 40, 43, 46, 34, 29,
+ 0, 0, 0, 0, 0, 0, 0, 43, 33, 37, 47, 1, 20, 23, 26, 14, 9,
+ 19, 33, 12, 40, 46, 23, 52, 23, 13, 17, 27, 33, 52, 3, 6, 46, 41,
+ 6, 0, 3, 3, 3, 0, 3, 3, 0, 3, 6, 6, 0, 0, 0, 0, 3
+};
+
+/* Row Address Patterns are as defined in pdf417.h */
diff --git a/3rdparty/zint-2.6.1/backend/dllversion.c b/3rdparty/zint-2.6.1/backend/dllversion.c
new file mode 100644
index 0000000..d59725e
--- /dev/null
+++ b/3rdparty/zint-2.6.1/backend/dllversion.c
@@ -0,0 +1,31 @@
+/* Sed: http://msdn.microsoft.com/library/en-us/shellcc/platform/shell/programmersguide/versions.asp */
+#if defined (_WIN32) && (defined(_USRDLL) || defined(DLL_EXPORT) || defined(PIC))
+#include
+#include
+
+#ifdef __cplusplus
+extern "C"
+{
+#endif
+
+__declspec(dllexport) HRESULT DllGetVersion (DLLVERSIONINFO2* pdvi);
+
+#ifdef __cplusplus
+}
+#endif
+
+HRESULT DllGetVersion (DLLVERSIONINFO2* pdvi)
+{
+ if (!pdvi || (sizeof(*pdvi) != pdvi->info1.cbSize))
+ return (E_INVALIDARG);
+
+ pdvi->info1.dwMajorVersion = 2;
+ pdvi->info1.dwMinorVersion = 2;
+ pdvi->info1.dwBuildNumber = 1;
+ pdvi->info1.dwPlatformID = DLLVER_PLATFORM_WINDOWS;
+ if (sizeof(DLLVERSIONINFO2) == pdvi->info1.cbSize)
+ pdvi->ullVersion = MAKEDLLVERULL(2, 2, 1, 0);
+
+ return S_OK;
+}
+#endif /* _WIN32 */
diff --git a/3rdparty/zint-2.6.1/backend/dmatrix.c b/3rdparty/zint-2.6.1/backend/dmatrix.c
new file mode 100644
index 0000000..0fc281d
--- /dev/null
+++ b/3rdparty/zint-2.6.1/backend/dmatrix.c
@@ -0,0 +1,1318 @@
+/* dmatrix.c Handles Data Matrix ECC 200 symbols */
+
+/*
+ libzint - the open source barcode library
+ Copyright (C) 2009-2017 Robin Stuart
+
+ developed from and including some functions from:
+ IEC16022 bar code generation
+ Adrian Kennard, Andrews & Arnold Ltd
+ with help from Cliff Hones on the RS coding
+
+ (c) 2004 Adrian Kennard, Andrews & Arnold Ltd
+ (c) 2006 Stefan Schmidt
+
+ Redistribution and use in source and binary forms, with or without
+ modification, are permitted provided that the following conditions
+ are met:
+
+ 1. Redistributions of source code must retain the above copyright
+ notice, this list of conditions and the following disclaimer.
+ 2. Redistributions in binary form must reproduce the above copyright
+ notice, this list of conditions and the following disclaimer in the
+ documentation and/or other materials provided with the distribution.
+ 3. Neither the name of the project nor the names of its contributors
+ may be used to endorse or promote products derived from this software
+ without specific prior written permission.
+
+ THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND
+ ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+ ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE
+ FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+ DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
+ OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
+ HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
+ LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
+ OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+ SUCH DAMAGE.
+ */
+
+#include
+#include
+#include
+#include
+#include
+#include
+#ifdef _MSC_VER
+#include
+/* ceilf (C99) not before MSVC++2013 (C++ 12.0) */
+#if _MSC_VER < 1800
+#define ceilf ceil
+#endif
+#endif
+#include "reedsol.h"
+#include "common.h"
+#include "dmatrix.h"
+
+/* Annex M placement alorithm low level */
+static void ecc200placementbit(int *array, const int NR, const int NC, int r, int c, const int p, const char b) {
+ if (r < 0) {
+ r += NR;
+ c += 4 - ((NR + 4) % 8);
+ }
+ if (c < 0) {
+ c += NC;
+ r += 4 - ((NC + 4) % 8);
+ }
+ // Necessary for 26x32,26x40,26x48,36x120,36x144,72x120,72x144
+ if (r >= NR) {
+#ifdef DEBUG
+ fprintf(stderr, "r >= NR:%i,%i at r=%i->", p, b, r);
+#endif
+ r -= NR;
+#ifdef DEBUG
+ fprintf(stderr, "%i,c=%i\n", r, c);
+#endif
+ }
+#ifdef DEBUG
+ if (0 != array[r * NC + c]) {
+ int a = array[r * NC + c];
+ fprintf(stderr, "Double:%i,%i->%i,%i at r=%i,c=%i\n", a >> 3, a & 7, p, b, r, c);
+ return;
+ }
+#endif
+ // Check index limits
+ assert(r < NR);
+ assert(c < NC);
+ // Check double-assignment
+ assert(0 == array[r * NC + c]);
+ array[r * NC + c] = (p << 3) + b;
+}
+
+static void ecc200placementblock(int *array, const int NR, const int NC, const int r,
+ const int c, const int p) {
+ ecc200placementbit(array, NR, NC, r - 2, c - 2, p, 7);
+ ecc200placementbit(array, NR, NC, r - 2, c - 1, p, 6);
+ ecc200placementbit(array, NR, NC, r - 1, c - 2, p, 5);
+ ecc200placementbit(array, NR, NC, r - 1, c - 1, p, 4);
+ ecc200placementbit(array, NR, NC, r - 1, c - 0, p, 3);
+ ecc200placementbit(array, NR, NC, r - 0, c - 2, p, 2);
+ ecc200placementbit(array, NR, NC, r - 0, c - 1, p, 1);
+ ecc200placementbit(array, NR, NC, r - 0, c - 0, p, 0);
+}
+
+static void ecc200placementcornerA(int *array, const int NR, const int NC, const int p) {
+ ecc200placementbit(array, NR, NC, NR - 1, 0, p, 7);
+ ecc200placementbit(array, NR, NC, NR - 1, 1, p, 6);
+ ecc200placementbit(array, NR, NC, NR - 1, 2, p, 5);
+ ecc200placementbit(array, NR, NC, 0, NC - 2, p, 4);
+ ecc200placementbit(array, NR, NC, 0, NC - 1, p, 3);
+ ecc200placementbit(array, NR, NC, 1, NC - 1, p, 2);
+ ecc200placementbit(array, NR, NC, 2, NC - 1, p, 1);
+ ecc200placementbit(array, NR, NC, 3, NC - 1, p, 0);
+}
+
+static void ecc200placementcornerB(int *array, const int NR, const int NC, const int p) {
+ ecc200placementbit(array, NR, NC, NR - 3, 0, p, 7);
+ ecc200placementbit(array, NR, NC, NR - 2, 0, p, 6);
+ ecc200placementbit(array, NR, NC, NR - 1, 0, p, 5);
+ ecc200placementbit(array, NR, NC, 0, NC - 4, p, 4);
+ ecc200placementbit(array, NR, NC, 0, NC - 3, p, 3);
+ ecc200placementbit(array, NR, NC, 0, NC - 2, p, 2);
+ ecc200placementbit(array, NR, NC, 0, NC - 1, p, 1);
+ ecc200placementbit(array, NR, NC, 1, NC - 1, p, 0);
+}
+
+static void ecc200placementcornerC(int *array, const int NR, const int NC, const int p) {
+ ecc200placementbit(array, NR, NC, NR - 3, 0, p, 7);
+ ecc200placementbit(array, NR, NC, NR - 2, 0, p, 6);
+ ecc200placementbit(array, NR, NC, NR - 1, 0, p, 5);
+ ecc200placementbit(array, NR, NC, 0, NC - 2, p, 4);
+ ecc200placementbit(array, NR, NC, 0, NC - 1, p, 3);
+ ecc200placementbit(array, NR, NC, 1, NC - 1, p, 2);
+ ecc200placementbit(array, NR, NC, 2, NC - 1, p, 1);
+ ecc200placementbit(array, NR, NC, 3, NC - 1, p, 0);
+}
+
+static void ecc200placementcornerD(int *array, const int NR, const int NC, const int p) {
+ ecc200placementbit(array, NR, NC, NR - 1, 0, p, 7);
+ ecc200placementbit(array, NR, NC, NR - 1, NC - 1, p, 6);
+ ecc200placementbit(array, NR, NC, 0, NC - 3, p, 5);
+ ecc200placementbit(array, NR, NC, 0, NC - 2, p, 4);
+ ecc200placementbit(array, NR, NC, 0, NC - 1, p, 3);
+ ecc200placementbit(array, NR, NC, 1, NC - 3, p, 2);
+ ecc200placementbit(array, NR, NC, 1, NC - 2, p, 1);
+ ecc200placementbit(array, NR, NC, 1, NC - 1, p, 0);
+}
+
+/* Annex M placement alorithm main function */
+static void ecc200placement(int *array, const int NR, const int NC) {
+ int r, c, p;
+ // invalidate
+ for (r = 0; r < NR; r++)
+ for (c = 0; c < NC; c++)
+ array[r * NC + c] = 0;
+ // start
+ p = 1;
+ r = 4;
+ c = 0;
+ do {
+ // check corner
+ if (r == NR && !c)
+ ecc200placementcornerA(array, NR, NC, p++);
+ if (r == NR - 2 && !c && NC % 4)
+ ecc200placementcornerB(array, NR, NC, p++);
+ if (r == NR - 2 && !c && (NC % 8) == 4)
+ ecc200placementcornerC(array, NR, NC, p++);
+ if (r == NR + 4 && c == 2 && !(NC % 8))
+ ecc200placementcornerD(array, NR, NC, p++);
+ // up/right
+ do {
+ if (r < NR && c >= 0 && !array[r * NC + c])
+ ecc200placementblock(array, NR, NC, r, c, p++);
+ r -= 2;
+ c += 2;
+ } while (r >= 0 && c < NC);
+ r++;
+ c += 3;
+ // down/left
+ do {
+ if (r >= 0 && c < NC && !array[r * NC + c])
+ ecc200placementblock(array, NR, NC, r, c, p++);
+ r += 2;
+ c -= 2;
+ } while (r < NR && c >= 0);
+ r += 3;
+ c++;
+ } while (r < NR || c < NC);
+ // unfilled corner
+ if (!array[NR * NC - 1])
+ array[NR * NC - 1] = array[NR * NC - NC - 2] = 1;
+}
+
+/* calculate and append ecc code, and if necessary interleave */
+static void ecc200(unsigned char *binary, const int bytes, const int datablock, const int rsblock, const int skew) {
+ int blocks = (bytes + 2) / datablock, b;
+ int n, p;
+ rs_init_gf(0x12d);
+ rs_init_code(rsblock, 1);
+ for (b = 0; b < blocks; b++) {
+ unsigned char buf[256], ecc[256];
+ p = 0;
+ for (n = b; n < bytes; n += blocks)
+ buf[p++] = binary[n];
+ rs_encode(p, buf, ecc);
+ p = rsblock - 1; // comes back reversed
+ for (n = b; n < rsblock * blocks; n += blocks) {
+ if (skew) {
+ /* Rotate ecc data to make 144x144 size symbols acceptable */
+ /* See http://groups.google.com/group/postscriptbarcode/msg/5ae8fda7757477da */
+ if (b < 8) {
+ binary[bytes + n + 2] = ecc[p--];
+ } else {
+ binary[bytes + n - 8] = ecc[p--];
+ }
+ } else {
+ binary[bytes + n] = ecc[p--];
+ }
+ }
+ }
+ rs_free();
+}
+
+/* Return true (1) if a character is valid in X12 set */
+static int isX12(const int source) {
+
+ switch(source) {
+ case 13: // CR
+ case 42: // *
+ case 62: // >
+ case 32: // space
+ return 1;
+ }
+
+ if ((source >= '0') && (source <= '9')) {
+ return 1;
+ }
+ if ((source >= 'A') && (source <= 'Z')) {
+ return 1;
+ }
+
+ return 0;
+}
+
+/* Insert a character into the middle of a string at position posn */
+static void dminsert(char binary_string[], const int posn, const char newbit) {
+ int i, end;
+
+ end = (int) strlen(binary_string);
+ for (i = end + 1; i > posn; i--) {
+ binary_string[i] = binary_string[i - 1];
+ }
+ binary_string[posn] = newbit;
+}
+
+static void insert_value(unsigned char binary_stream[], const int posn, const int streamlen, const int newbit) {
+ int i;
+
+ for(i = (int)streamlen; i > posn; i--) {
+ binary_stream[i] = binary_stream[i - 1];
+ }
+ binary_stream[posn] = (unsigned char) newbit;
+}
+
+static int p_r_6_2_1(const unsigned char inputData[], const size_t position, const size_t sourcelen) {
+ /* Annex P section (r)(6)(ii)(I)
+ "If one of the three X12 terminator/separator characters first
+ occurs in the yet to be processed data before a non-X12 character..."
+ */
+
+ size_t i;
+ size_t nonX12Position = 0;
+ size_t specialX12Position = 0;
+ int retval = 0;
+
+ for (i = position; i < sourcelen; i++) {
+ if (nonX12Position == 0) {
+ if (isX12(inputData[i]) != 1) {
+ nonX12Position = i;
+ }
+ }
+
+ if (specialX12Position == 0) {
+ if ((inputData[i] == (char) 13) ||
+ (inputData[i] == '*') ||
+ (inputData[i] == '>')) {
+ specialX12Position = i;
+ }
+ }
+ }
+
+ if ((nonX12Position != 0) && (specialX12Position != 0)) {
+ if (specialX12Position < nonX12Position) {
+ retval = 1;
+ }
+ }
+
+ return retval;
+}
+
+/* 'look ahead test' from Annex P */
+static int look_ahead_test(const unsigned char inputData[], const size_t sourcelen, const size_t position, const int current_mode, const int gs1) {
+ float ascii_count, c40_count, text_count, x12_count, edf_count, b256_count, best_count;
+ const float stiction = (1.0F / 24.0F); // smallest change to act on, to get around floating point inaccuracies
+ int best_scheme;
+ size_t sp;
+
+ best_scheme = DM_NULL;
+
+ /* step (j) */
+ if (current_mode == DM_ASCII) {
+ ascii_count = 0.0F;
+ c40_count = 1.0F;
+ text_count = 1.0F;
+ x12_count = 1.0F;
+ edf_count = 1.0F;
+ b256_count = 1.25F;
+ } else {
+ ascii_count = 1.0F;
+ c40_count = 2.0F;
+ text_count = 2.0F;
+ x12_count = 2.0F;
+ edf_count = 2.0F;
+ b256_count = 2.25F;
+ }
+
+ switch (current_mode) {
+ case DM_C40: c40_count = 0.0F;
+ break;
+ case DM_TEXT: text_count = 0.0F;
+ break;
+ case DM_X12: x12_count = 0.0F;
+ break;
+ case DM_EDIFACT: edf_count = 0.0F;
+ break;
+ case DM_BASE256: b256_count = 0.0F;
+ break;
+ }
+
+ sp = position;
+
+ do {
+ if (sp == sourcelen) {
+ /* At the end of data ... step (k) */
+ ascii_count = ceilf(ascii_count);
+ b256_count = ceilf(b256_count);
+ edf_count = ceilf(edf_count);
+ text_count = ceilf(text_count);
+ x12_count = ceilf(x12_count);
+ c40_count = ceilf(c40_count);
+
+ best_count = c40_count;
+ best_scheme = DM_C40; // (k)(7)
+
+ if (x12_count < (best_count - stiction)) {
+ best_count = x12_count;
+ best_scheme = DM_X12; // (k)(6)
+ }
+
+ if (text_count < (best_count - stiction)) {
+ best_count = text_count;
+ best_scheme = DM_TEXT; // (k)(5)
+ }
+
+ if (edf_count < (best_count - stiction)) {
+ best_count = edf_count;
+ best_scheme = DM_EDIFACT; // (k)(4)
+ }
+
+ if (b256_count < (best_count - stiction)) {
+ best_count = b256_count;
+ best_scheme = DM_BASE256; // (k)(3)
+ }
+
+ if (ascii_count <= (best_count + stiction)) {
+ best_scheme = DM_ASCII; // (k)(2)
+ }
+ } else {
+
+ /* ascii ... step (l) */
+ if ((inputData[sp] >= '0') && (inputData[sp] <= '9')) {
+ ascii_count += 0.5F; // (l)(1)
+ } else {
+ if (inputData[sp] > 127) {
+ ascii_count = ceilf(ascii_count) + 2.0F; // (l)(2)
+ } else {
+ ascii_count = ceilf(ascii_count) + 1.0F; // (l)(3)
+ }
+ }
+
+ /* c40 ... step (m) */
+ if ((inputData[sp] == ' ') ||
+ (((inputData[sp] >= '0') && (inputData[sp] <= '9')) ||
+ ((inputData[sp] >= 'A') && (inputData[sp] <= 'Z')))) {
+ c40_count += (2.0F / 3.0F); // (m)(1)
+ } else {
+ if (inputData[sp] > 127) {
+ c40_count += (8.0F / 3.0F); // (m)(2)
+ } else {
+ c40_count += (4.0F / 3.0F); // (m)(3)
+ }
+ }
+
+ /* text ... step (n) */
+ if ((inputData[sp] == ' ') ||
+ (((inputData[sp] >= '0') && (inputData[sp] <= '9')) ||
+ ((inputData[sp] >= 'a') && (inputData[sp] <= 'z')))) {
+ text_count += (2.0F / 3.0F); // (n)(1)
+ } else {
+ if (inputData[sp] > 127) {
+ text_count += (8.0F / 3.0F); // (n)(2)
+ } else {
+ text_count += (4.0F / 3.0F); // (n)(3)
+ }
+ }
+
+ /* x12 ... step (o) */
+ if (isX12(inputData[sp])) {
+ x12_count += (2.0F / 3.0F); // (o)(1)
+ } else {
+ if (inputData[sp] > 127) {
+ x12_count += (13.0F / 3.0F); // (o)(2)
+ } else {
+ x12_count += (10.0F / 3.0F); // (o)(3)
+ }
+ }
+
+ /* edifact ... step (p) */
+ if ((inputData[sp] >= ' ') && (inputData[sp] <= '^')) {
+ edf_count += (3.0F / 4.0F); // (p)(1)
+ } else {
+ if (inputData[sp] > 127) {
+ edf_count += 17.0F; // (p)(2) > Value changed from ISO
+ } else {
+ edf_count += 13.0F; // (p)(3) > Value changed from ISO
+ }
+ }
+ if ((gs1 == 1) && (inputData[sp] == '[')) {
+ edf_count += 13.0F; // > Value changed from ISO
+ }
+
+ /* base 256 ... step (q) */
+ if ((gs1 == 1) && (inputData[sp] == '[')) {
+ b256_count += 4.0F; // (q)(1)
+ } else {
+ b256_count += 1.0F; // (q)(2)
+ }
+ }
+
+
+ if (sp > (position + 3)) {
+ /* 4 data characters processed ... step (r) */
+
+ /* step (r)(6) */
+ if (((c40_count + 1.0F) < (ascii_count - stiction)) &&
+ ((c40_count + 1.0F) < (b256_count - stiction)) &&
+ ((c40_count + 1.0F) < (edf_count - stiction)) &&
+ ((c40_count + 1.0F) < (text_count - stiction))) {
+
+ if (c40_count < (x12_count - stiction)) {
+ best_scheme = DM_C40;
+ }
+
+ if ((c40_count >= (x12_count - stiction))
+ && (c40_count <= (x12_count + stiction))) {
+ if (p_r_6_2_1(inputData, sp, sourcelen) == 1) {
+ // Test (r)(6)(ii)(i)
+ best_scheme = DM_X12;
+ } else {
+ best_scheme = DM_C40;
+ }
+ }
+ }
+
+ /* step (r)(5) */
+ if (((x12_count + 1.0F) < (ascii_count - stiction)) &&
+ ((x12_count + 1.0F) < (b256_count - stiction)) &&
+ ((x12_count + 1.0F) < (edf_count - stiction)) &&
+ ((x12_count + 1.0F) < (text_count - stiction)) &&
+ ((x12_count + 1.0F) < (c40_count - stiction))) {
+ best_scheme = DM_X12;
+ }
+
+ /* step (r)(4) */
+ if (((text_count + 1.0F) < (ascii_count - stiction)) &&
+ ((text_count + 1.0F) < (b256_count - stiction)) &&
+ ((text_count + 1.0F) < (edf_count - stiction)) &&
+ ((text_count + 1.0F) < (x12_count - stiction)) &&
+ ((text_count + 1.0F) < (c40_count - stiction))) {
+ best_scheme = DM_TEXT;
+ }
+
+ /* step (r)(3) */
+ if (((edf_count + 1.0F) < (ascii_count - stiction)) &&
+ ((edf_count + 1.0F) < (b256_count - stiction)) &&
+ ((edf_count + 1.0F) < (text_count - stiction)) &&
+ ((edf_count + 1.0F) < (x12_count - stiction)) &&
+ ((edf_count + 1.0F) < (c40_count - stiction))) {
+ best_scheme = DM_EDIFACT;
+ }
+
+ /* step (r)(2) */
+ if (((b256_count + 1.0F) <= (ascii_count + stiction)) ||
+ (((b256_count + 1.0F) < (edf_count - stiction)) &&
+ ((b256_count + 1.0F) < (text_count - stiction)) &&
+ ((b256_count + 1.0F) < (x12_count - stiction)) &&
+ ((b256_count + 1.0F) < (c40_count - stiction)))) {
+ best_scheme = DM_BASE256;
+ }
+
+ /* step (r)(1) */
+ if (((ascii_count + 1.0F) <= (b256_count + stiction)) &&
+ ((ascii_count + 1.0F) <= (edf_count + stiction)) &&
+ ((ascii_count + 1.0F) <= (text_count + stiction)) &&
+ ((ascii_count + 1.0F) <= (x12_count + stiction)) &&
+ ((ascii_count + 1.0F) <= (c40_count + stiction))) {
+ best_scheme = DM_ASCII;
+ }
+ }
+
+ sp++;
+ } while (best_scheme == DM_NULL); // step (s)
+
+ return best_scheme;
+}
+
+/* Encodes data using ASCII, C40, Text, X12, EDIFACT or Base 256 modes as appropriate
+ Supports encoding FNC1 in supporting systems */
+static int dm200encode(struct zint_symbol *symbol, const unsigned char source[], unsigned char target[], int *last_mode, size_t *length_p, int process_buffer[], int *process_p) {
+
+ size_t sp;
+ int tp, i, gs1;
+ int current_mode, next_mode;
+ size_t inputlen = *length_p;
+ int debug = symbol->debug;
+#ifndef _MSC_VER
+ char binary[2 * inputlen];
+#else
+ char* binary = (char*) _alloca(2 * inputlen);
+#endif
+
+ sp = 0;
+ tp = 0;
+ memset(process_buffer, 0, 8);
+ *process_p = 0;
+ strcpy(binary, "");
+
+ /* step (a) */
+ current_mode = DM_ASCII;
+ next_mode = DM_ASCII;
+
+ if (symbol->input_mode == GS1_MODE) {
+ gs1 = 1;
+ } else {
+ gs1 = 0;
+ }
+
+ if (gs1) {
+ target[tp] = 232;
+ tp++;
+ strcat(binary, " ");
+ if (debug) printf("FN1 ");
+ } /* FNC1 */
+
+ if (symbol->output_options & READER_INIT) {
+ if (gs1) {
+ strcpy(symbol->errtxt, "519: Cannot encode in GS1 mode and Reader Initialisation at the same time");
+ return ZINT_ERROR_INVALID_OPTION;
+ } else {
+ target[tp] = 234;
+ tp++; /* Reader Programming */
+ strcat(binary, " ");
+ if (debug) printf("RP ");
+ }
+ }
+
+ if (symbol->eci > 3) {
+ /* Encode ECI numbers according to Table 6 */
+ target[tp] = 241; /* ECI Character */
+ tp++;
+ if (symbol->eci <= 126) {
+ target[tp] = (unsigned char) symbol->eci + 1;
+ tp++;
+ }
+ if ((symbol->eci >= 127) && (symbol->eci <= 16382)) {
+ target[tp] = (unsigned char) ((symbol->eci - 127) / 254) + 128;
+ tp++;
+ target[tp] = (unsigned char) ((symbol->eci - 127) % 254) + 1;
+ tp++;
+ }
+ if (symbol->eci >= 16383) {
+ target[tp] = (unsigned char) ((symbol->eci - 16383) / 64516) + 192;
+ tp++;
+ target[tp] = (unsigned char) (((symbol->eci - 16383) / 254) % 254) + 1;
+ tp++;
+ target[tp] = (unsigned char) ((symbol->eci - 16383) % 254) + 1;
+ tp++;
+ }
+ if (debug) printf("ECI %d ", symbol->eci + 1);
+ }
+
+ /* Check for Macro05/Macro06 */
+ /* "[)>[RS]05[GS]...[RS][EOT]" -> CW 236 */
+ /* "[)>[RS]06[GS]...[RS][EOT]" -> CW 237 */
+ if (tp == 0 && sp == 0 && inputlen >= 9
+ && source[0] == '[' && source[1] == ')' && source[2] == '>'
+ && source[3] == '\x1e' && source[4] == '0'
+ && (source[5] == '5' || source[5] == '6')
+ && source[6] == '\x1d'
+ && source[inputlen - 2] == '\x1e' && source[inputlen - 1] == '\x04') {
+ /* Output macro Codeword */
+ if (source[5] == '5') {
+ target[tp] = 236;
+ if (debug) printf("Macro05 ");
+ } else {
+ target[tp] = 237;
+ if (debug) printf("Macro06 ");
+ }
+ tp++;
+ strcat(binary, " ");
+ /* Remove macro characters from input string */
+ sp = 7;
+ inputlen -= 2;
+ *length_p -= 2;
+ }
+
+
+ while (sp < inputlen) {
+
+ current_mode = next_mode;
+
+ /* step (b) - ASCII encodation */
+ if (current_mode == DM_ASCII) {
+ next_mode = DM_ASCII;
+
+ if (istwodigits(source, sp) && ((sp + 1) != inputlen)) {
+ target[tp] = (unsigned char) ((10 * ctoi(source[sp])) + ctoi(source[sp + 1]) + 130);
+ if (debug) printf("N%d ", target[tp] - 130);
+ tp++;
+ strcat(binary, " ");
+ sp += 2;
+ } else {
+ next_mode = look_ahead_test(source, inputlen, sp, current_mode, gs1);
+
+ if (next_mode != DM_ASCII) {
+ switch (next_mode) {
+ case DM_C40: target[tp] = 230;
+ tp++;
+ strcat(binary, " ");
+ if (debug) printf("C40 ");
+ break;
+ case DM_TEXT: target[tp] = 239;
+ tp++;
+ strcat(binary, " ");
+ if (debug) printf("TEX ");
+ break;
+ case DM_X12: target[tp] = 238;
+ tp++;
+ strcat(binary, " ");
+ if (debug) printf("X12 ");
+ break;
+ case DM_EDIFACT: target[tp] = 240;
+ tp++;
+ strcat(binary, " ");
+ if (debug) printf("EDI ");
+ break;
+ case DM_BASE256: target[tp] = 231;
+ tp++;
+ strcat(binary, " ");
+ if (debug) printf("BAS ");
+ break;
+ }
+ } else {
+ if (source[sp] > 127) {
+ target[tp] = 235; /* FNC4 */
+ if (debug) printf("FN4 ");
+ tp++;
+ target[tp] = (source[sp] - 128) + 1;
+ if (debug) printf("A%02X ", target[tp] - 1);
+ tp++;
+ strcat(binary, " ");
+ } else {
+ if (gs1 && (source[sp] == '[')) {
+ target[tp] = 232; /* FNC1 */
+ if (debug) printf("FN1 ");
+ } else {
+ target[tp] = source[sp] + 1;
+ if (debug) printf("A%02X ", target[tp] - 1);
+ }
+ tp++;
+ strcat(binary, " ");
+ }
+ sp++;
+ }
+ }
+
+ }
+
+ /* step (c) C40 encodation */
+ if (current_mode == DM_C40) {
+ int shift_set, value;
+
+ next_mode = DM_C40;
+ if (*process_p == 0) {
+ next_mode = look_ahead_test(source, inputlen, sp, current_mode, gs1);
+ }
+
+ if (next_mode != DM_C40) {
+ target[tp] = 254;
+ tp++;
+ strcat(binary, " "); /* Unlatch */
+ next_mode = DM_ASCII;
+ if (debug) printf("ASC ");
+ } else {
+ if (source[sp] > 127) {
+ process_buffer[*process_p] = 1;
+ (*process_p)++;
+ process_buffer[*process_p] = 30;
+ (*process_p)++; /* Upper Shift */
+ shift_set = c40_shift[source[sp] - 128];
+ value = c40_value[source[sp] - 128];
+ } else {
+ shift_set = c40_shift[source[sp]];
+ value = c40_value[source[sp]];
+ }
+
+ if (gs1 && (source[sp] == '[')) {
+ shift_set = 2;
+ value = 27; /* FNC1 */
+ }
+
+ if (shift_set != 0) {
+ process_buffer[*process_p] = shift_set - 1;
+ (*process_p)++;
+ }
+ process_buffer[*process_p] = value;
+ (*process_p)++;
+
+ if (*process_p >= 3) {
+ int iv;
+
+ iv = (1600 * process_buffer[0]) + (40 * process_buffer[1]) + (process_buffer[2]) + 1;
+ target[tp] = (unsigned char) (iv / 256);
+ tp++;
+ target[tp] = iv % 256;
+ tp++;
+ strcat(binary, " ");
+ if (debug) printf("[%d %d %d] ", process_buffer[0], process_buffer[1], process_buffer[2]);
+
+ process_buffer[0] = process_buffer[3];
+ process_buffer[1] = process_buffer[4];
+ process_buffer[2] = process_buffer[5];
+ process_buffer[3] = 0;
+ process_buffer[4] = 0;
+ process_buffer[5] = 0;
+ *process_p -= 3;
+ }
+ sp++;
+ }
+ }
+
+ /* step (d) Text encodation */
+ if (current_mode == DM_TEXT) {
+ int shift_set, value;
+
+ next_mode = DM_TEXT;
+ if (*process_p == 0) {
+ next_mode = look_ahead_test(source, inputlen, sp, current_mode, gs1);
+ }
+
+ if (next_mode != DM_TEXT) {
+ target[tp] = 254;
+ tp++;
+ strcat(binary, " "); /* Unlatch */
+ next_mode = DM_ASCII;
+ if (debug) printf("ASC ");
+ } else {
+ if (source[sp] > 127) {
+ process_buffer[*process_p] = 1;
+ (*process_p)++;
+ process_buffer[*process_p] = 30;
+ (*process_p)++; /* Upper Shift */
+ shift_set = text_shift[source[sp] - 128];
+ value = text_value[source[sp] - 128];
+ } else {
+ shift_set = text_shift[source[sp]];
+ value = text_value[source[sp]];
+ }
+
+ if (gs1 && (source[sp] == '[')) {
+ shift_set = 2;
+ value = 27; /* FNC1 */
+ }
+
+ if (shift_set != 0) {
+ process_buffer[*process_p] = shift_set - 1;
+ (*process_p)++;
+ }
+ process_buffer[*process_p] = value;
+ (*process_p)++;
+
+ if (*process_p >= 3) {
+ int iv;
+
+ iv = (1600 * process_buffer[0]) + (40 * process_buffer[1]) + (process_buffer[2]) + 1;
+ target[tp] = (unsigned char) (iv / 256);
+ tp++;
+ target[tp] = iv % 256;
+ tp++;
+ strcat(binary, " ");
+ if (debug) printf("[%d %d %d] ", process_buffer[0], process_buffer[1], process_buffer[2]);
+
+ process_buffer[0] = process_buffer[3];
+ process_buffer[1] = process_buffer[4];
+ process_buffer[2] = process_buffer[5];
+ process_buffer[3] = 0;
+ process_buffer[4] = 0;
+ process_buffer[5] = 0;
+ *process_p -= 3;
+ }
+ sp++;
+ }
+ }
+
+ /* step (e) X12 encodation */
+ if (current_mode == DM_X12) {
+ int value = 0;
+
+ next_mode = DM_X12;
+ if (*process_p == 0) {
+ next_mode = look_ahead_test(source, inputlen, sp, current_mode, gs1);
+ }
+
+ if (next_mode != DM_X12) {
+ target[tp] = 254;
+ tp++;
+ strcat(binary, " "); /* Unlatch */
+ next_mode = DM_ASCII;
+ if (debug) printf("ASC ");
+ } else {
+ if (source[sp] == 13) {
+ value = 0;
+ }
+ if (source[sp] == '*') {
+ value = 1;
+ }
+ if (source[sp] == '>') {
+ value = 2;
+ }
+ if (source[sp] == ' ') {
+ value = 3;
+ }
+ if ((source[sp] >= '0') && (source[sp] <= '9')) {
+ value = (source[sp] - '0') + 4;
+ }
+ if ((source[sp] >= 'A') && (source[sp] <= 'Z')) {
+ value = (source[sp] - 'A') + 14;
+ }
+
+ process_buffer[*process_p] = value;
+ (*process_p)++;
+
+ if (*process_p >= 3) {
+ int iv;
+
+ iv = (1600 * process_buffer[0]) + (40 * process_buffer[1]) + (process_buffer[2]) + 1;
+ target[tp] = (unsigned char) (iv / 256);
+ tp++;
+ target[tp] = iv % 256;
+ tp++;
+ strcat(binary, " ");
+ if (debug) printf("[%d %d %d] ", process_buffer[0], process_buffer[1], process_buffer[2]);
+
+ process_buffer[0] = process_buffer[3];
+ process_buffer[1] = process_buffer[4];
+ process_buffer[2] = process_buffer[5];
+ process_buffer[3] = 0;
+ process_buffer[4] = 0;
+ process_buffer[5] = 0;
+ *process_p -= 3;
+ }
+ sp++;
+ }
+ }
+
+ /* step (f) EDIFACT encodation */
+ if (current_mode == DM_EDIFACT) {
+ int value = 0;
+
+ next_mode = DM_EDIFACT;
+ if (*process_p == 3) {
+ next_mode = look_ahead_test(source, inputlen, sp, current_mode, gs1);
+ }
+
+ if (next_mode != DM_EDIFACT) {
+ process_buffer[*process_p] = 31;
+ (*process_p)++;
+ next_mode = DM_ASCII;
+ } else {
+ value = source[sp];
+
+ if (source[sp] >= 64) { // '@'
+ value -= 64;
+ }
+
+ process_buffer[*process_p] = value;
+ (*process_p)++;
+ sp++;
+ }
+
+ if (*process_p >= 4) {
+ target[tp] = (unsigned char) ((process_buffer[0] << 2) + ((process_buffer[1] & 0x30) >> 4));
+ tp++;
+ target[tp] = ((process_buffer[1] & 0x0f) << 4) + ((process_buffer[2] & 0x3c) >> 2);
+ tp++;
+ target[tp] = (unsigned char) (((process_buffer[2] & 0x03) << 6) + process_buffer[3]);
+ tp++;
+ strcat(binary, " ");
+ if (debug) printf("[%d %d %d %d] ", process_buffer[0], process_buffer[1], process_buffer[2], process_buffer[3]);
+
+ process_buffer[0] = process_buffer[4];
+ process_buffer[1] = process_buffer[5];
+ process_buffer[2] = process_buffer[6];
+ process_buffer[3] = process_buffer[7];
+ process_buffer[4] = 0;
+ process_buffer[5] = 0;
+ process_buffer[6] = 0;
+ process_buffer[7] = 0;
+ *process_p -= 4;
+ }
+ }
+
+ /* step (g) Base 256 encodation */
+ if (current_mode == DM_BASE256) {
+ next_mode = look_ahead_test(source, inputlen, sp, current_mode, gs1);
+
+ if (next_mode == DM_BASE256) {
+ target[tp] = source[sp];
+ if (debug) printf("B%02X ", target[tp]);
+ tp++;
+ sp++;
+ strcat(binary, "b");
+ } else {
+ next_mode = DM_ASCII;
+ if (debug) printf("ASC ");
+ }
+ }
+
+ if (tp > 1558) {
+ return 0;
+ }
+
+ } /* while */
+
+ /* Add length and randomising algorithm to b256 */
+ i = 0;
+ while (i < tp) {
+ if (binary[i] == 'b') {
+ if ((i == 0) || (binary[i - 1] != 'b')) {
+ /* start of binary data */
+ int binary_count; /* length of b256 data */
+
+ for (binary_count = 0; binary_count + i < tp && binary[binary_count + i] == 'b'; binary_count++);
+
+ if (binary_count <= 249) {
+ dminsert(binary, i, 'b');
+ insert_value(target, i, tp, binary_count);
+ tp++;
+ } else {
+ dminsert(binary, i, 'b');
+ dminsert(binary, i + 1, 'b');
+ insert_value(target, i, tp, (binary_count / 250) + 249);
+ tp++;
+ insert_value(target, i + 1, tp, binary_count % 250);
+ tp++;
+ }
+ }
+ }
+ i++;
+ }
+
+ for (i = 0; i < tp; i++) {
+ if (binary[i] == 'b') {
+ int prn, temp;
+
+ prn = ((149 * (i + 1)) % 255) + 1;
+ temp = target[i] + prn;
+ if (temp <= 255) {
+ target[i] = (unsigned char) (temp);
+ } else {
+ target[i] = (unsigned char) (temp - 256);
+ }
+ }
+ }
+
+ *(last_mode) = current_mode;
+ return tp;
+}
+
+static int dm200encode_remainder(unsigned char target[], int target_length, const unsigned char source[], const size_t inputlen, const int last_mode, const int process_buffer[], const int process_p, const int symbols_left) {
+ int debug = 0;
+
+ switch (last_mode) {
+ case DM_C40:
+ case DM_TEXT:
+ if (process_p == 1) // 1 data character left to encode.
+ {
+ if (symbols_left > 1) {
+ target[target_length] = 254;
+ target_length++; // Unlatch and encode remaining data in ascii.
+ }
+ target[target_length] = source[inputlen - 1] + 1;
+ target_length++;
+ } else if (process_p == 2) // 2 data characters left to encode.
+ {
+ // Pad with shift 1 value (0) and encode as double.
+ int intValue = (1600 * process_buffer[0]) + (40 * process_buffer[1]) + 1; // ie (0 + 1).
+ target[target_length] = (unsigned char) (intValue / 256);
+ target_length++;
+ target[target_length] = (unsigned char) (intValue % 256);
+ target_length++;
+ if (symbols_left > 2) {
+ target[target_length] = 254; // Unlatch
+ target_length++;
+ }
+ } else {
+ if (symbols_left > 0) {
+ target[target_length] = 254; // Unlatch
+ target_length++;
+ }
+ }
+ break;
+
+ case DM_X12:
+ if ((symbols_left == process_p) && (process_p == 1)) {
+ // Unlatch not required!
+ target[target_length] = source[inputlen - 1] + 1;
+ target_length++;
+ } else {
+ target[target_length] = (254);
+ target_length++; // Unlatch.
+
+ if (process_p == 1) {
+ target[target_length] = source[inputlen - 1] + 1;
+ target_length++;
+ }
+
+ if (process_p == 2) {
+ target[target_length] = source[inputlen - 2] + 1;
+ target_length++;
+ target[target_length] = source[inputlen - 1] + 1;
+ target_length++;
+ }
+ }
+ break;
+
+ case DM_EDIFACT:
+ if (symbols_left <= 2) // Unlatch not required!
+ {
+ if (process_p == 1) {
+ target[target_length] = source[inputlen - 1] + 1;
+ target_length++;
+ }
+
+ if (process_p == 2) {
+ target[target_length] = source[inputlen - 2] + 1;
+ target_length++;
+ target[target_length] = source[inputlen - 1] + 1;
+ target_length++;
+ }
+ } else {
+ // Append edifact unlatch value (31) and empty buffer
+ if (process_p == 0) {
+ target[target_length] = (unsigned char) (31 << 2);
+ target_length++;
+ }
+
+ if (process_p == 1) {
+ target[target_length] = (unsigned char) ((process_buffer[0] << 2) + ((31 & 0x30) >> 4));
+ target_length++;
+ target[target_length] = (unsigned char) ((31 & 0x0f) << 4);
+ target_length++;
+ }
+
+ if (process_p == 2) {
+ target[target_length] = (unsigned char) ((process_buffer[0] << 2) + ((process_buffer[1] & 0x30) >> 4));
+ target_length++;
+ target[target_length] = (unsigned char) (((process_buffer[1] & 0x0f) << 4) + ((31 & 0x3c) >> 2));
+ target_length++;
+ target[target_length] = (unsigned char) (((31 & 0x03) << 6));
+ target_length++;
+ }
+
+ if (process_p == 3) {
+ target[target_length] = (unsigned char) ((process_buffer[0] << 2) + ((process_buffer[1] & 0x30) >> 4));
+ target_length++;
+ target[target_length] = (unsigned char) (((process_buffer[1] & 0x0f) << 4) + ((process_buffer[2] & 0x3c) >> 2));
+ target_length++;
+ target[target_length] = (unsigned char) (((process_buffer[2] & 0x03) << 6) + 31);
+ target_length++;
+ }
+ }
+ break;
+ }
+
+ if (debug) {
+ int i;
+ printf("\n\n");
+ for (i = 0; i < target_length; i++)
+ printf("%03d ", target[i]);
+
+ printf("\n");
+ }
+
+ return target_length;
+}
+
+/* add pad bits */
+static void add_tail(unsigned char target[], int tp, const int tail_length) {
+ int i, prn, temp;
+
+ for (i = tail_length; i > 0; i--) {
+ if (i == tail_length) {
+ target[tp] = 129;
+ tp++; /* Pad */
+ } else {
+ prn = ((149 * (tp + 1)) % 253) + 1;
+ temp = 129 + prn;
+ if (temp <= 254) {
+ target[tp] = (unsigned char) (temp);
+ tp++;
+ } else {
+ target[tp] = (unsigned char) (temp - 254);
+ tp++;
+ }
+ }
+ }
+}
+
+int data_matrix_200(struct zint_symbol *symbol,const unsigned char source[], const size_t in_length) {
+ int i, skew = 0;
+ size_t inputlen=in_length;
+ unsigned char binary[2200];
+ int binlen;
+ int process_buffer[8]; /* holds remaining data to finalised */
+ int process_p; /* number of characters left to finalise */
+ int symbolsize, optionsize, calcsize;
+ int taillength, error_number = 0;
+ int H, W, FH, FW, datablock, bytes, rsblock;
+ int last_mode = DM_ASCII;
+ unsigned char *grid = 0;
+ int symbols_left;
+
+ /* inputlen may be decremented by 2 if macro character is used */
+ binlen = dm200encode(symbol, source, binary, &last_mode, &inputlen, process_buffer, &process_p);
+
+ if (binlen == 0) {
+ strcpy(symbol->errtxt, "520: Data too long to fit in symbol");
+ return ZINT_ERROR_TOO_LONG;
+ }
+
+ if ((symbol->option_2 >= 1) && (symbol->option_2 <= DMSIZESCOUNT)) {
+ optionsize = intsymbol[symbol->option_2 - 1];
+ } else {
+ optionsize = -1;
+ }
+
+ calcsize = DMSIZESCOUNT - 1;
+ for (i = DMSIZESCOUNT - 1; i > -1; i--) {
+ if (matrixbytes[i] >= (binlen + process_p)) {
+ // Allow for the remaining data characters
+ calcsize = i;
+ }
+ }
+
+ if (symbol->option_3 == DM_SQUARE) {
+ /* Skip rectangular symbols in square only mode */
+ while (matrixH[calcsize] != matrixW[calcsize]) {
+ calcsize++;
+ }
+ if (optionsize != -1) {
+ strcpy(symbol->errtxt, "521: Can not force square symbols when symbol size is selected");
+ error_number = ZINT_WARN_INVALID_OPTION;
+ }
+ } else if (symbol->option_3 != DM_DMRE) {
+ /* Skip DMRE symbols */
+ while (isDMRE[calcsize]) {
+ calcsize++;
+ }
+ }
+
+ symbolsize = optionsize;
+ if (calcsize > optionsize) {
+ symbolsize = calcsize;
+ if (optionsize != -1) {
+ strcpy(symbol->errtxt, "522: Input too long for selected symbol size");
+ return ZINT_ERROR_TOO_LONG;
+ }
+ }
+
+ // Now we know the symbol size we can handle the remaining data in the process buffer.
+ symbols_left = matrixbytes[symbolsize] - binlen;
+ binlen = dm200encode_remainder(binary, binlen, source, inputlen, last_mode, process_buffer, process_p, symbols_left);
+
+ if (binlen > matrixbytes[symbolsize]) {
+ strcpy(symbol->errtxt, "523: Data too long to fit in symbol");
+ return ZINT_ERROR_TOO_LONG;
+ }
+
+ H = matrixH[symbolsize];
+ W = matrixW[symbolsize];
+ FH = matrixFH[symbolsize];
+ FW = matrixFW[symbolsize];
+ bytes = matrixbytes[symbolsize];
+ datablock = matrixdatablock[symbolsize];
+ rsblock = matrixrsblock[symbolsize];
+
+ taillength = bytes - binlen;
+
+ if (taillength != 0) {
+ add_tail(binary, binlen, taillength);
+ }
+
+ // ecc code
+ if (symbolsize == INTSYMBOL144) {
+ skew = 1;
+ }
+ ecc200(binary, bytes, datablock, rsblock, skew);
+ // Print Codewords
+#ifdef DEBUG
+ {
+ int CWCount;
+ int posCur;
+ if (skew)
+ CWCount = 1558 + 620;
+ else
+ CWCount = bytes + rsblock * (bytes / datablock);
+ printf("Codewords (%i):", CWCount);
+ for (posCur = 0; posCur < CWCount; posCur++)
+ printf(" %3i", binary[posCur]);
+ puts("\n");
+ }
+#endif
+ { // placement
+ int x, y, NC, NR, *places;
+ NC = W - 2 * (W / FW);
+ NR = H - 2 * (H / FH);
+ places = (int*) malloc(NC * NR * sizeof (int));
+ ecc200placement(places, NR, NC);
+ grid = (unsigned char*) malloc(W * H);
+ memset(grid, 0, W * H);
+ for (y = 0; y < H; y += FH) {
+ for (x = 0; x < W; x++)
+ grid[y * W + x] = 1;
+ for (x = 0; x < W; x += 2)
+ grid[(y + FH - 1) * W + x] = 1;
+ }
+ for (x = 0; x < W; x += FW) {
+ for (y = 0; y < H; y++)
+ grid[y * W + x] = 1;
+ for (y = 0; y < H; y += 2)
+ grid[y * W + x + FW - 1] = 1;
+ }
+#ifdef DEBUG
+ // Print position matrix as in standard
+ for (y = NR - 1; y >= 0; y--) {
+ for (x = 0; x < NC; x++) {
+ int v;
+ if (x != 0)
+ fprintf(stderr, "|");
+ v = places[(NR - y - 1) * NC + x];
+ fprintf(stderr, "%3d.%2d", (v >> 3), 8 - (v & 7));
+ }
+ fprintf(stderr, "\n");
+ }
+#endif
+ for (y = 0; y < NR; y++) {
+ for (x = 0; x < NC; x++) {
+ int v = places[(NR - y - 1) * NC + x];
+ //fprintf (stderr, "%4d", v);
+ if (v == 1 || (v > 7 && (binary[(v >> 3) - 1] & (1 << (v & 7)))))
+ grid[(1 + y + 2 * (y / (FH - 2))) * W + 1 + x + 2 * (x / (FW - 2))] = 1;
+ }
+ //fprintf (stderr, "\n");
+ }
+ for (y = H - 1; y >= 0; y--) {
+ int x;
+ for (x = 0; x < W; x++) {
+ if (grid[W * y + x]) {
+ set_module(symbol, (H - y) - 1, x);
+ }
+ }
+ symbol->row_height[(H - y) - 1] = 1;
+ }
+ free(grid);
+ free(places);
+ }
+
+ symbol->rows = H;
+ symbol->width = W;
+
+ return error_number;
+}
+
+int dmatrix(struct zint_symbol *symbol, const unsigned char source[], const size_t in_length) {
+ int error_number;
+
+ if (symbol->option_1 <= 1) {
+ /* ECC 200 */
+ error_number = data_matrix_200(symbol, source, in_length);
+ } else {
+ /* ECC 000 - 140 */
+ strcpy(symbol->errtxt, "524: Older Data Matrix standards are no longer supported");
+ error_number = ZINT_ERROR_INVALID_OPTION;
+ }
+
+ return error_number;
+}
diff --git a/3rdparty/zint-2.6.1/backend/dmatrix.h b/3rdparty/zint-2.6.1/backend/dmatrix.h
new file mode 100644
index 0000000..7d1f641
--- /dev/null
+++ b/3rdparty/zint-2.6.1/backend/dmatrix.h
@@ -0,0 +1,237 @@
+/* dmatrix.h - Handles Data Matrix ECC 200 */
+
+/*
+ libzint - the open source barcode library
+ Copyright (C) 2009-2017 Robin Stuart
+
+ Redistribution and use in source and binary forms, with or without
+ modification, are permitted provided that the following conditions
+ are met:
+
+ 1. Redistributions of source code must retain the above copyright
+ notice, this list of conditions and the following disclaimer.
+ 2. Redistributions in binary form must reproduce the above copyright
+ notice, this list of conditions and the following disclaimer in the
+ documentation and/or other materials provided with the distribution.
+ 3. Neither the name of the project nor the names of its contributors
+ may be used to endorse or promote products derived from this software
+ without specific prior written permission.
+
+ THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND
+ ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+ ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE
+ FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+ DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
+ OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
+ HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
+ LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
+ OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+ SUCH DAMAGE.
+ */
+
+/*
+ Containes Extended Rectangular Data Matrix (DMRE)
+ See http://www.dmre.info for information
+ Contact: harald.oehlmann@eurodatacouncil.org
+ */
+
+#include "common.h"
+
+#ifndef __IEC16022ECC200_H
+#define __IEC16022ECC200_H
+#ifdef __cplusplus
+extern "C" {
+#endif /* __cplusplus */
+
+extern int data_matrix_200(struct zint_symbol *symbol, const unsigned char source[], const size_t length);
+
+#ifdef __cplusplus
+}
+#endif /* __cplusplus */
+
+#define MAXBARCODE 3116
+
+#define DM_NULL 0
+#define DM_ASCII 1
+#define DM_C40 2
+#define DM_TEXT 3
+#define DM_X12 4
+#define DM_EDIFACT 5
+#define DM_BASE256 6
+
+static const char c40_shift[] = {
+ 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, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 2, 2, 2, 2, 2, 2, 2, 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,
+ 2, 2, 2, 2, 2, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3
+};
+
+static const char c40_value[] = {
+ 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31,
+ 3, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13,
+ 15, 16, 17, 18, 19, 20, 21, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39,
+ 22, 23, 24, 25, 26, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31
+};
+
+static const char text_shift[] = {
+ 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, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 2, 2, 2, 2, 2, 2, 2, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3,
+ 2, 2, 2, 2, 2, 3, 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, 3, 3, 3, 3, 3
+};
+
+static const char text_value[] = {
+ 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31,
+ 3, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13,
+ 15, 16, 17, 18, 19, 20, 21, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26,
+ 22, 23, 24, 25, 26, 0, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 27, 28, 29, 30, 31
+};
+
+// Position in option array [symbol option value - 1]
+// The position in the option array is by increasing total data codewords with square first
+// The last comment value is the total data codewords value.
+// The index of this array is the --vers parameter value -1 and is given as forst comment value
+
+static const unsigned short int intsymbol[] = {
+ 0, /* 1: 10x10 , 3*/ 1, /* 2: 12x12 , 5*/ 3, /* 3: 14x14 , 8*/ 5, /* 4: 16x16 , 12*/
+ 7, /* 5: 18x18 , 18*/ 9, /* 6: 20x20 , 22*/ 12, /* 7: 22x22 , 30*/ 14, /* 8: 24x24 , 36*/
+ 16, /* 9: 26x26 , 44*/ 18, /* 10: 32x32 , 62*/ 21, /* 11: 36x36 , 86*/ 24, /* 12: 40x40 ,114*/
+ 26, /* 13: 44x44 ,144*/ 27, /* 14: 48x48 ,174*/ 28, /* 15: 52x52 ,204*/ 29, /* 16: 64x64 ,280*/
+ 30, /* 17: 72x72 ,368*/ 31, /* 18: 80x80 ,456*/ 32, /* 19: 88x88 ,576*/ 33, /* 20: 96x96 ,696*/
+ 34, /* 21:104x104,816*/ 35, /* 22:120x120,1050*/36, /* 23:132x132,1304*/37, /* 24:144x144,1558*/
+ 2, /* 25: 8x18 , 5*/ 4, /* 26: 8x32 , 10*/ 6, /* 27: 12x26 , 16*/ 10, /* 28: 12x36 , 22*/
+ 13, /* 29: 16x36 , 32*/ 17, /* 30: 16x48 , 49*/ 8, /* 31: 8x48 , 18*/ 11, /* 32: 8x64 , 24*/
+ 15, /* 33: 12x64 , 43*/ 19, /* 34: 16x64 , 62*/ 20, /* 37: 24x48 , 80*/ 23, /* 38: 24x64 ,108*/
+ 22, /* 41: 26x48 , 90*/ 25, /* 42: 26x64 ,118*/
+ 0
+};
+
+// Number of DM Sizes
+#define DMSIZESCOUNT 38
+// Number of 144x144 for special interlace
+#define INTSYMBOL144 37
+
+// Is the current code a DMRE code ?
+// This is the case, if intsymbol index >= 30
+
+static const char isDMRE[] = {
+ /* 0*/ 0, /* 10x10, 3 */ 0, /* 12x12 , 5 */ 0, /* 8x18 , 5 */ 0, /* 14x14 , 8 */
+ /* 4*/ 0, /* 8x32 ,10 */ 0, /* 16x16 ,12 */ 0, /* 12x26 ,16 */ 0, /* 18x18 ,18 */
+ /* 8*/ 1, /* 8x48 ,18 */ 0, /* 20x20 ,22 */ 0, /* 12x36 ,22 */ 1, /* 8x64 ,24 */
+ /*12*/ 0, /* 22x22 ,30 */ 0, /* 16x36 ,32 */ 0, /* 24x24 ,36 */ 1, /* 12x64 ,43 */
+ /*16*/ 0, /* 26x26 ,44 */ 0, /* 16x48 ,49 */ 0, /* 32x32 ,62 */ 1, /* 16x64 ,62 */
+ /*20*/ 1, /* 24x48 ,80 */ 0, /* 36x36 ,86 */ 1, /* 26x48 ,90 */ 1, /* 24x64 ,108*/
+ /*24*/ 0, /* 40x40 ,114*/ 1, /* 26x64 ,118*/ 0, /* 44x44 ,144*/ 0, /* 48x48,174 */
+ /*28*/ 0, /* 52x52,204 */ 0, /* 64x64,280 */ 0, /* 72x72,368 */ 0, /* 80x80,456 */
+ /*32*/ 0, /* 88x88,576 */ 0, /* 96x96,696 */ 0, /*104x104,816*/ 0, /*120x120,1050*/
+ /*36*/ 0, /*132x132,1304*/0 /*144x144,1558*/
+};
+
+// Horizontal matrix size
+
+static const unsigned short int matrixH[] = {
+ /* 0*/ 10, /* 10x10 , 3 */ 12, /* 12x12 , 5 */ 8, /* 8x18 , 5 */ 14, /* 14x14 , 8 */
+ /* 4*/ 8, /* 8x32 ,10 */ 16, /* 16x16 ,12 */ 12, /* 12x26 ,16 */ 18, /* 18x18 ,18 */
+ /* 8*/ 8, /* 8x48 ,18 */ 20, /* 20x20 ,22 */ 12, /* 12x36 ,22 */ 8, /* 8x64 ,24 */
+ /*12*/ 22, /* 22x22 ,30 */ 16, /* 16x36 ,32 */ 24, /* 24x24 ,36 */ 12, /* 12x64 ,43 */
+ /*16*/ 26, /* 26x26 ,44 */ 16, /* 16x48 ,49 */ 32, /* 32x32 ,62 */ 16, /* 16x64 ,62 */
+ /*20*/ 24, /* 24x48 ,80 */ 36, /* 36x36 ,86 */ 26, /* 26x48 ,90 */ 24, /* 24x64 ,108*/
+ /*24*/ 40, /* 40x40 ,114*/ 26, /* 26x64 ,118*/ 44, /* 44x44 ,144*/ 48, /* 48x48,174 */
+ /*28*/ 52, /* 52x52,204 */ 64, /* 64x64,280 */ 72, /* 72x72,368 */ 80, /* 80x80,456 */
+ /*32*/ 88, /* 88x88,576 */ 96, /* 96x96,696 */ 104, /*104x104,816*/ 120, /*120x120,1050*/
+ /*36*/ 132,/*132x132,1304*/144 /*144x144,1558*/
+};
+
+// Vertical matrix sizes
+
+static const unsigned short int matrixW[] = {
+ /* 0*/ 10, /* 10x10 */ 12, /* 12x12 */ 18, /* 8x18 */ 14, /* 14x14 */
+ /* 4*/ 32, /* 8x32 */ 16, /* 16x16 */ 26, /* 12x26 */ 18, /* 18x18 */
+ /* 8*/ 48, /* 8x48 */ 20, /* 20x20 */ 36, /* 12x36 */ 64, /* 8x64 */
+ /*12*/ 22, /* 22x22 */ 36, /* 16x36 */ 24, /* 24x24 */ 64, /* 12x64 */
+ /*16*/ 26, /* 26x26 */ 48, /* 16x48 */ 32, /* 32x32 */ 64, /* 16x64 */
+ /*20*/ 48, /* 24x48 */ 36, /* 36x36 */ 48, /* 26x48 */ 64, /* 24x64 */
+ /*24*/ 40, /* 40x40 */ 64, /* 26x64 */ 44, /* 44x44 */ 48, /* 48x48 */
+ /*28*/ 52, /* 52x52 */ 64, /* 64x64 */ 72, /* 72x72 */ 80, /* 80x80 */
+ /*32*/ 88, /* 88x88 */ 96, /* 96x96 */ 104,/*104x104*/ 120,/*120x120*/
+ /*36*/132, /*132x132*/144 /*144x144*/
+};
+
+// Horizontal submodule size (including subfinder)
+
+static const unsigned short int matrixFH[] = {
+ /* 0*/ 10, /* 10x10 */ 12, /* 12x12 */ 8, /* 8x18 */ 14, /* 14x14 */
+ /* 4*/ 8, /* 8x32 */ 16, /* 16x16 */ 12, /* 12x26 */ 18, /* 18x18 */
+ /* 8*/ 8, /* 8x48 */ 20, /* 20x20 */ 12, /* 12x36 */ 8, /* 8x64 */
+ /*12*/ 22, /* 22x22 */ 16, /* 16x36 */ 24, /* 24x24 */ 12, /* 12x64 */
+ /*16*/ 26, /* 26x26 */ 16, /* 16x48 */ 16, /* 32x32 */ 16, /* 16x64 */
+ /*20*/ 24, /* 24x48 */ 18, /* 36x36 */ 26, /* 26x48 */ 24, /* 24x64 */
+ /*24*/ 20, /* 40x40 */ 26, /* 26x64 */ 22, /* 44x44 */ 24, /* 48x48 */
+ /*28*/ 26, /* 52x52 */ 16, /* 64x64 */ 18, /* 72x72 */ 20, /* 80x80 */
+ /*32*/ 22, /* 88x88 */ 24, /* 96x96 */ 26, /*104x104*/ 20, /*120x120*/
+ /*36*/ 22, /*132x132*/ 24 /*144x144*/
+};
+
+// Vertical submodule size (including subfinder)
+
+static const unsigned short int matrixFW[] = {
+ /* 0*/ 10, /* 10x10 */ 12, /* 12x12 */ 18, /* 8x18 */ 14, /* 14x14 */
+ /* 4*/ 16, /* 8x32 */ 16, /* 16x16 */ 26, /* 12x26 */ 18, /* 18x18 */
+ /* 8*/ 24, /* 8x48 */ 20, /* 20x20 */ 18, /* 12x36 */ 16, /* 8x64 */
+ /*12*/ 22, /* 22x22 */ 18, /* 16x36 */ 24, /* 24x24 */ 16, /* 12x64 */
+ /*16*/ 26, /* 26x26 */ 24, /* 16x48 */ 16, /* 32x32 */ 16, /* 16x64 */
+ /*20*/ 24, /* 24x48 */ 18, /* 36x36 */ 24, /* 26x48 */ 16, /* 24x64 */
+ /*24*/ 20, /* 40x40 */ 16, /* 26x64 */ 22, /* 44x44 */ 24, /* 48x48 */
+ /*28*/ 26, /* 52x52 */ 16, /* 64x64 */ 18, /* 72x72 */ 20, /* 80x80 */
+ /*32*/ 22, /* 88x88 */ 24, /* 96x96 */ 26, /*104x104*/ 20, /*120x120*/
+ /*36*/ 22, /*132x132*/ 24 /*144x144*/
+};
+
+// Total Data Codewords
+
+static const unsigned short int matrixbytes[] = {
+ /* 0*/ 3, /* 10x10 */ 5, /* 12x12 */ 5, /* 8x18 */ 8, /* 14x14 */
+ /* 4*/ 10, /* 8x32 */ 12, /* 16x16 */ 16, /* 12x26 */ 18, /* 18x18 */
+ /* 8*/ 18, /* 8x48 */ 22, /* 20x20 */ 22, /* 12x36 */ 24, /* 8x64 */
+ /*12*/ 30, /* 22x22 */ 32, /* 16x36 */ 36, /* 24x24 */ 43, /* 12x64 */
+ /*16*/ 44, /* 26x26 */ 49, /* 16x48 */ 62, /* 32x32 */ 62, /* 16x64 */
+ /*20*/ 80, /* 24x48 */ 86, /* 36x36 */ 90, /* 26x48 */ 108, /* 24x64 */
+ /*24*/ 114, /* 40x40 */ 118, /* 26x64 */ 144, /* 44x44 */ 174, /* 48x48 */
+ /*28*/ 204, /* 52x52 */ 280, /* 64x64 */ 368, /* 72x72 */ 456, /* 80x80 */
+ /*32*/ 576, /* 88x88 */ 696, /* 96x96 */ 816, /*104x104*/1050, /*120x120*/
+ /*36*/1304, /*132x132*/1558 /*144x144*/
+};
+
+// Data Codewords per RS-Block
+
+static const unsigned short int matrixdatablock[] = {
+ /* 0*/ 3, /* 10x10 */ 5, /* 12x12 */ 5, /* 8x18 */ 8, /* 14x14 */
+ /* 4*/ 10, /* 8x32 */ 12, /* 16x16 */ 16, /* 12x26 */ 18, /* 18x18 */
+ /* 8*/ 18, /* 8x48 */ 22, /* 20x20 */ 22, /* 12x36 */ 24, /* 8x64 */
+ /*12*/ 30, /* 22x22 */ 32, /* 16x36 */ 36, /* 24x24 */ 43, /* 12x64 */
+ /*16*/ 44, /* 26x26 */ 49, /* 16x48 */ 62, /* 32x32 */ 62, /* 16x64 */
+ /*20*/ 80, /* 24x48 */ 86, /* 36x36 */ 90, /* 26x48 */ 108, /* 24x64 */
+ /*24*/ 114, /* 40x40 */ 118, /* 26x64 */ 144, /* 44x44 */ 174, /* 48x48 */
+ /*28*/ 102, /* 52x52 */ 140, /* 64x64 */ 92, /* 72x72 */ 114, /* 80x80 */
+ /*32*/ 144, /* 88x88 */ 174, /* 96x96 */ 136, /*104x104*/ 175, /*120x120*/
+ /*36*/ 163, /*132x132*/ 156 /* 144x144*/
+};
+
+// ECC Codewords per RS-Block
+
+static const unsigned short int matrixrsblock[] = {
+ /* 0*/ 5, /* 10x10 */ 7, /* 12x12 */ 7, /* 8x18 */ 10, /* 14x14 */
+ /* 4*/ 11, /* 8x32 */ 12, /* 16x16 */ 14, /* 12x26 */ 14, /* 18x18 */
+ /* 8*/ 15, /* 8x48 */ 18, /* 20x20 */ 18, /* 12x36 */ 18, /* 8x64 */
+ /*12*/ 20, /* 22x22 */ 24, /* 16x36 */ 24, /* 24x24 */ 27, /* 12x64 */
+ /*16*/ 28, /* 26x26 */ 28, /* 16x48 */ 36, /* 32x32 */ 36, /* 16x64 */
+ /*20*/ 41, /* 24x48 */ 42, /* 36x36 */ 42, /* 26x48 */ 46, /* 24x64 */
+ /*24*/ 48, /* 40x40 */ 50, /* 26x64 */ 56, /* 44x44 */ 68, /* 48x48 */
+ /*28*/ 42, /* 52x52 */ 56, /* 64x64 */ 36, /* 72x72 */ 48, /* 80x80 */
+ /*32*/ 56, /* 88x88 */ 68, /* 96x96 */ 56, /*104x104*/ 68, /*120x120*/
+ /*36*/ 62, /*132x132*/ 62 /*144x144*/
+};
+
+
+#endif
diff --git a/3rdparty/zint-2.6.1/backend/dotcode.c b/3rdparty/zint-2.6.1/backend/dotcode.c
new file mode 100644
index 0000000..ce2219a
--- /dev/null
+++ b/3rdparty/zint-2.6.1/backend/dotcode.c
@@ -0,0 +1,1463 @@
+/* dotcode.c - Handles DotCode */
+
+/*
+ libzint - the open source barcode library
+ Copyright (C) 2017 Robin Stuart
+
+ Redistribution and use in source and binary forms, with or without
+ modification, are permitted provided that the following conditions
+ are met:
+
+ 1. Redistributions of source code must retain the above copyright
+ notice, this list of conditions and the following disclaimer.
+ 2. Redistributions in binary form must reproduce the above copyright
+ notice, this list of conditions and the following disclaimer in the
+ documentation and/or other materials provided with the distribution.
+ 3. Neither the name of the project nor the names of its contributors
+ may be used to endorse or promote products derived from this software
+ without specific prior written permission.
+
+ THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND
+ ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+ ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE
+ FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+ DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
+ OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
+ HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
+ LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
+ OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+ SUCH DAMAGE.
+ */
+
+/*
+ * Attempts to encode DotCode according to AIMD013 Rev 1.34a, dated Feb 19, 2009
+ */
+
+#include
+#include
+#include
+#include
+#ifndef _MSC_VER
+#include
+#else
+#include "ms_stdint.h"
+#include
+#endif
+#include "common.h"
+#include "gs1.h"
+
+#define GF 113
+#define PM 3
+
+/* DotCode symbol character dot patterns, from Annex C */
+static const unsigned short int dot_patterns[113] = {
+ 0x155, 0x0ab, 0x0ad, 0x0b5, 0x0d5, 0x156, 0x15a, 0x16a, 0x1aa, 0x0ae,
+ 0x0b6, 0x0ba, 0x0d6, 0x0da, 0x0ea, 0x12b, 0x12d, 0x135, 0x14b, 0x14d,
+ 0x153, 0x159, 0x165, 0x169, 0x195, 0x1a5, 0x1a9, 0x057, 0x05b, 0x05d,
+ 0x06b, 0x06d, 0x075, 0x097, 0x09b, 0x09d, 0x0a7, 0x0b3, 0x0b9, 0x0cb,
+ 0x0cd, 0x0d3, 0x0d9, 0x0e5, 0x0e9, 0x12e, 0x136, 0x13a, 0x14e, 0x15c,
+ 0x166, 0x16c, 0x172, 0x174, 0x196, 0x19a, 0x1a6, 0x1ac, 0x1b2, 0x1b4,
+ 0x1ca, 0x1d2, 0x1d4, 0x05e, 0x06e, 0x076, 0x07a, 0x09e, 0x0bc, 0x0ce,
+ 0x0dc, 0x0e6, 0x0ec, 0x0f2, 0x0f4, 0x117, 0x11b, 0x11d, 0x127, 0x133,
+ 0x139, 0x147, 0x163, 0x171, 0x18b, 0x18d, 0x193, 0x199, 0x1a3, 0x1b1,
+ 0x1c5, 0x1c9, 0x1d1, 0x02f, 0x037, 0x03b, 0x03d, 0x04f, 0x067, 0x073,
+ 0x079, 0x08f, 0x0c7, 0x0e3, 0x0f1, 0x11e, 0x13c, 0x178, 0x18e, 0x19c,
+ 0x1b8, 0x1c6, 0x1cc
+};
+
+static int get_dot(char Dots[], const int Hgt, const int Wid, const int x, const int y) {
+ int retval = 0;
+
+ if ((x >= 0) && (x < Wid) && (y >= 0) && (y < Hgt)) {
+ if (Dots[(y * Wid) + x] == '1') {
+ retval = 1;
+ }
+ }
+
+ return retval;
+}
+
+static int clr_col(char *Dots, const int Hgt, const int Wid, const int x) {
+ int y;
+ for (y = x & 1; y < Hgt; y += 2) {
+ if (get_dot(Dots, Hgt, Wid, x, y)) {
+ return 0;
+ }
+ }
+
+ return 1;
+}
+
+static int clr_row(char *Dots, const int Hgt, const int Wid, const int y) {
+ int x;
+ for (x = y & 1; x < Wid; x += 2) {
+ if (get_dot(Dots, Hgt, Wid, x, y)) {
+ return 0;
+ }
+ }
+
+ return 1;
+}
+
+/* Dot pattern scoring routine from Annex A */
+const int score_array(char Dots[], int Hgt, int Wid) {
+ int x, y, worstedge, first, last, sum;
+ int penalty_local = 0;
+ int penalty = 0;
+
+ // first, guard against "pathelogical" gaps in the array
+ if (Hgt & 1) {
+ if (Hgt < 12) {
+ sum = 0;
+ for (x = 1; x < Wid - 1; x++) {
+ if (!(clr_col(Dots, Hgt, Wid, x))) {
+ sum = 0;
+ if (penalty_local) {
+ penalty += penalty_local;
+ penalty_local = 0;
+ }
+ } else {
+ sum++;
+ if (sum == 1) {
+ penalty_local = Hgt;
+ } else {
+ penalty_local *= Hgt;
+ }
+ }
+ }
+ }
+ } else {
+ if (Wid < 12) {
+ sum = 0;
+ for (y = 1; y < Hgt - 1; y++) {
+ if (!(clr_row(Dots, Hgt, Wid, y))) {
+ sum = 0;
+ if (penalty_local) {
+ penalty += penalty_local;
+ penalty_local = 0;
+ }
+ } else {
+ sum++;
+ if (sum == 1) {
+ penalty_local = Wid;
+ } else {
+ penalty_local *= Wid;
+ }
+ }
+ }
+ }
+ }
+
+ sum = 0;
+ first = -1;
+ last = -1;
+
+ // across the top edge, count printed dots and measure their extent
+ for (x = 0; x < Wid; x += 2)
+ if (get_dot(Dots, Hgt, Wid, x, 0)) {
+ if (first < 0) {
+ first = x;
+ }
+ last = x;
+ sum++;
+ }
+ worstedge = sum + last - first;
+ worstedge *= Hgt;
+
+ sum = 0;
+ first = -1;
+ last = -1;
+
+ //across the bottom edge, ditto
+ for (x = Wid & 1; x < Wid; x += 2)
+ if (get_dot(Dots, Hgt, Wid, x, Hgt - 1)) {
+ if (first < 0) {
+ first = x;
+ }
+ last = x;
+ sum++;
+ }
+ sum += last - first;
+ sum *= Hgt;
+ if (sum < worstedge) {
+ worstedge = sum;
+ }
+
+ sum = 0;
+ first = -1;
+ last = -1;
+
+ //down the left edge, ditto
+ for (y = 0; y < Hgt; y += 2)
+ if (get_dot(Dots, Hgt, Wid, 0, y)) {
+ if (first < 0) {
+ first = y;
+ }
+ last = y;
+ sum++;
+ }
+ sum += last - first;
+ sum *= Wid;
+ if (sum < worstedge) {
+ worstedge = sum;
+ }
+
+ sum = 0;
+ first = -1;
+ last = -1;
+
+ //down the right edge, ditto
+ for (y = Hgt & 1; y < Hgt; y += 2)
+ if (get_dot(Dots, Hgt, Wid, Wid - 1, y)) {
+ if (first < 0) {
+ first = y;
+ }
+ last = y;
+ sum++;
+ }
+ sum += last - first;
+ sum *= Wid;
+ if (sum < worstedge) {
+ worstedge = sum;
+ }
+
+ // throughout the array, count the # of unprinted 5-somes (cross patterns)
+ // plus the # of printed dots surrounded by 8 unprinted neighbors
+ sum = 0;
+ for (y = 0; y < Hgt; y++) {
+ for (x = y & 1; x < Wid; x += 2) {
+ if ((!get_dot(Dots, Hgt, Wid, x - 1, y - 1))
+ && (!get_dot(Dots, Hgt, Wid, x + 1, y - 1))
+ && (!get_dot(Dots, Hgt, Wid, x - 1, y + 1))
+ && (!get_dot(Dots, Hgt, Wid, x + 1, y + 1))
+ && ((!get_dot(Dots, Hgt, Wid, x, y))
+ || ((!get_dot(Dots, Hgt, Wid, x - 2, y))
+ && (!get_dot(Dots, Hgt, Wid, x, y - 2))
+ && (!get_dot(Dots, Hgt, Wid, x + 2, y))
+ && (!get_dot(Dots, Hgt, Wid, x, y + 2))))) {
+ sum++;
+ }
+ }
+ }
+
+ return (worstedge - sum * sum - penalty);
+}
+
+//-------------------------------------------------------------------------
+// "rsencode(nd,nc)" adds "nc" R-S check words to "nd" data words in wd[]
+// employing Galois Field GF, where GF is prime, with a prime modulus of PM
+//-------------------------------------------------------------------------
+
+void rsencode(int nd, int nc, unsigned char *wd) {
+ int i, j, k, nw, start, step, root[GF], c[GF];
+
+ // Start by generating "nc" roots (antilogs):
+ root[0] = 1;
+ for (i = 1; (i <= nc) && (i < GF); i++)
+ root[i] = (PM * root[i - 1]) % GF;
+
+ // Here we compute how many interleaved R-S blocks will be needed
+ nw = nd + nc;
+ step = (nw + GF - 2) / (GF - 1);
+
+ // ...& then for each such block:
+ for (start = 0; start < step; start++) {
+ int ND = (nd - start + step - 1) / step, NW = (nw - start + step - 1) / step, NC = NW - ND;
+
+ // first compute the generator polynomial "c" of order "NC":
+ for (i = 1; i <= NC; i++)
+ c[i] = 0;
+ c[0] = 1;
+
+ for (i = 1; i <= NC; i++) {
+ for (j = NC; j >= 1; j--) {
+ c[j] = (GF + c[j] - (root[i] * c[j - 1]) % GF) % GF;
+ }
+ }
+
+ // & then compute the corresponding checkword values into wd[]
+ // ... (a) starting at wd[start] & (b) stepping by step
+ for (i = ND; i < NW; i++)
+ wd[start + i * step] = 0;
+ for (i = 0; i < ND; i++) {
+ k = (wd[start + i * step] + wd[start + ND * step]) % GF;
+ for (j = 0; j < NC - 1; j++) {
+ wd[start + (ND + j) * step] = (GF - ((c[j + 1] * k) % GF) + wd[start + (ND + j + 1) * step]) % GF;
+ }
+ wd[start + (ND + NC - 1) * step] = (GF - ((c[NC] * k) % GF)) % GF;
+ }
+ for (i = ND; i < NW; i++)
+ wd[start + i * step] = (GF - wd[start + i * step]) % GF;
+ }
+}
+
+/* Check if the next character is directly encodable in code set A (Annex F.II.D) */
+int datum_a(const unsigned char source[], int position, int length) {
+ int retval = 0;
+
+ if (position < length) {
+ if (source[position] <= 95) {
+ retval = 1;
+ }
+ }
+
+ return retval;
+}
+
+/* Check if the next character is directly encodable in code set B (Annex F.II.D) */
+int datum_b(const unsigned char source[], int position, int length) {
+ int retval = 0;
+
+ if (position < length) {
+ if ((source[position] >= 32) && (source[position] <= 127)) {
+ retval = 1;
+ }
+
+ switch (source[position]) {
+ case 9: // HT
+ case 28: // FS
+ case 29: // GS
+ case 30: // RS
+ retval = 1;
+ }
+
+ if (position != length - 2) {
+ if ((source[position] == 13) && (source[position + 1] == 10)) { // CRLF
+ retval = 1;
+ }
+ }
+ }
+
+ return retval;
+}
+
+/* Check if the next characters are directly encodable in code set C (Annex F.II.D) */
+int datum_c(const unsigned char source[], int position, int length) {
+ int retval = 0;
+
+ if (position <= length - 2) {
+ if (((source[position] >= '0') && (source[position] <= '9'))
+ && ((source[position + 1] >= '0') && (source[position + 1] <= '9')))
+ retval = 1;
+ }
+
+ return retval;
+}
+
+/* Returns how many consecutive digits lie immediately ahead (Annex F.II.A) */
+int n_digits(const unsigned char source[], int position, int length) {
+ int i;
+
+ for (i = position; ((source[i] >= '0') && (source[i] <= '9')) && (i < length); i++);
+
+ return i - position;
+}
+
+/* checks ahead for 10 or more digits starting "17xxxxxx10..." (Annex F.II.B) */
+int seventeen_ten(const unsigned char source[], int position, int length) {
+ int found = 0;
+
+ if (n_digits(source, position, length) >= 10) {
+ if (((source[position] == '1') && (source[position + 1] == '7'))
+ && ((source[position + 8] == '1') && (source[position + 9] == '0'))) {
+ found = 1;
+ }
+ }
+
+ return found;
+}
+
+/* checks how many characters ahead can be reached while datum_c is true,
+ * returning the resulting number of codewords (Annex F.II.E)
+ */
+int ahead_c(const unsigned char source[], int position, int length) {
+ int count = 0;
+ int i;
+
+ for (i = position; (i < length) && datum_c(source, i, length); i += 2) {
+ count++;
+ }
+
+ return count;
+}
+
+/* Annex F.II.F */
+int try_c(const unsigned char source[], int position, int length) {
+ int retval = 0;
+
+ if (n_digits(source, position, length) > 0) {
+ if (ahead_c(source, position, length) > ahead_c(source, position + 1, length)) {
+ retval = ahead_c(source, position, length);
+ }
+ }
+
+ return retval;
+}
+
+/* Annex F.II.G */
+int ahead_a(const unsigned char source[], int position, int length) {
+ int count = 0;
+ int i;
+
+ for (i = position; ((i < length) && datum_a(source, i, length))
+ && (try_c(source, i, length) < 2); i++) {
+ count++;
+ }
+
+ return count;
+}
+
+/* Annex F.II.H */
+int ahead_b(const unsigned char source[], int position, int length) {
+ int count = 0;
+ int i;
+
+ for (i = position; ((i < length) && datum_b(source, i, length))
+ && (try_c(source, i, length) < 2); i++) {
+ count++;
+ }
+
+ return count;
+}
+
+/* checks if the next character is in the range 128 to 255 (Annex F.II.I) */
+int binary(const unsigned char source[], int position) {
+ int retval = 0;
+
+ if (source[position] >= 128) {
+ retval = 1;
+ }
+
+ return retval;
+}
+
+/* Analyse input data stream and encode using algorithm from Annex F */
+int dotcode_encode_message(struct zint_symbol *symbol, const unsigned char source[], int length, unsigned char *codeword_array, int *binary_finish) {
+ int input_position, array_length, i;
+ char encoding_mode;
+ int inside_macro, done;
+ int debug = symbol->debug;
+ int binary_buffer_size = 0;
+ int lawrencium[6]; // Reversed radix 103 values
+
+#if defined(_MSC_VER) && _MSC_VER == 1200
+ uint64_t binary_buffer = 0;
+#else
+ uint64_t binary_buffer = 0ULL;
+#endif
+
+ input_position = 0;
+ array_length = 0;
+ encoding_mode = 'C';
+ inside_macro = 0;
+
+ if (symbol->output_options & READER_INIT) {
+ codeword_array[array_length] = 109; // FNC3
+ array_length++;
+ }
+
+ if (symbol->input_mode != GS1_MODE) {
+ if (length > 2) {
+ if (((source[input_position] >= '0') && (source[input_position] <= '9')) &&
+ ((source[input_position + 1] >= '0') && (source[input_position + 1] <= '9'))) {
+ codeword_array[array_length] = 107; // FNC1
+ array_length++;
+ }
+ }
+ }
+
+ if (symbol->eci > 3) {
+ codeword_array[array_length] = 108; // FNC2
+ array_length++;
+ if (symbol->eci <= 39) {
+ codeword_array[array_length] = symbol->eci;
+ array_length++;
+ } else {
+ // the next three codewords valued A, B & C encode the ECI value of
+ // (A - 40) * 12769 + B * 113 + C + 40 (Section 5.2.1)
+ int a, b, c;
+ a = (symbol->eci - 40) % 12769;
+ b = ((symbol->eci - 40) - (12769 * a)) % 113;
+ c = (symbol->eci - 40) - (12769 * a) - (113 * b);
+
+ codeword_array[array_length] = a + 40;
+ array_length++;
+ codeword_array[array_length] = b;
+ array_length++;
+ codeword_array[array_length] = c;
+ array_length++;
+ }
+ }
+
+ // Prevent encodation as a macro if a special character is in first position
+ if (source[input_position] == 9) {
+ codeword_array[array_length] = 101; // Latch A
+ array_length++;
+ codeword_array[array_length] = 73; // HT
+ array_length++;
+ encoding_mode = 'A';
+ }
+
+ if (source[input_position] == 28) {
+ codeword_array[array_length] = 101; // Latch A
+ array_length++;
+ codeword_array[array_length] = 92; // FS
+ array_length++;
+ encoding_mode = 'A';
+ }
+
+ if (source[input_position] == 29) {
+ codeword_array[array_length] = 101; // Latch A
+ array_length++;
+ codeword_array[array_length] = 93; // GS
+ array_length++;
+ encoding_mode = 'A';
+ }
+
+ if (source[input_position] == 30) {
+ codeword_array[array_length] = 101; // Latch A
+ array_length++;
+ codeword_array[array_length] = 94; // RS
+ array_length++;
+ encoding_mode = 'A';
+ }
+
+ do {
+ done = 0;
+ /* Step A */
+ if ((input_position == length - 2) && (inside_macro != 0) && (inside_macro != 100)) {
+ // inside_macro only gets set to 97, 98 or 99 if the last two characters are RS/EOT
+ input_position += 2;
+ done = 1;
+ if (debug) {
+ printf("A ");
+ }
+ }
+
+ if ((input_position == length - 1) && (inside_macro == 100)) {
+ // inside_macro only gets set to 100 if the last character is EOT
+ input_position++;
+ done = 1;
+ if (debug) {
+ printf("A ");
+ }
+ }
+
+ /* Step B1 */
+ if ((!done) && (encoding_mode == 'C')) {
+ if ((array_length == 0) && (length > 9)) {
+ if ((source[input_position] == '[')
+ && (source[input_position + 1] == ')')
+ && (source[input_position + 2] == '>')
+ && (source[input_position + 3] == 30) // RS
+ && (source[length - 1] == 04)) { // EOT
+
+
+ if ((source[input_position + 6] == 29) && (source[length - 2] == 30)) { // GS/RS
+ if ((source[input_position + 4] == '0') && (source[input_position + 5] == '5')) {
+ codeword_array[array_length] = 102; // Shift B
+ array_length++;
+ codeword_array[array_length] = 97; // Macro
+ array_length++;
+ input_position += 7;
+ inside_macro = 97;
+ done = 1;
+ if (debug) {
+ printf("B1/1 ");
+ }
+ }
+
+ if ((source[input_position + 4] == '0') && (source[input_position + 5] == '6')) {
+ codeword_array[array_length] = 102; // Shift B
+ array_length++;
+ codeword_array[array_length] = 98; // Macro
+ array_length++;
+ input_position += 7;
+ inside_macro = 98;
+ done = 1;
+ if (debug) {
+ printf("B1/2 ");
+ }
+ }
+
+ if ((source[input_position + 4] == '1') && (source[input_position + 5] == '2')) {
+ codeword_array[array_length] = 102; // Shift B
+ array_length++;
+ codeword_array[array_length] = 99; // Macro
+ array_length++;
+ input_position += 7;
+ inside_macro = 99;
+ done = 1;
+ if (debug) {
+ printf("B1/3 ");
+ }
+ }
+ }
+
+ if ((!done) && (source[input_position] >= '0') && (source[input_position] <= '9') &&
+ (source[input_position + 1] >= '0') && (source[input_position + 1] <= '9')) {
+ codeword_array[array_length] = 102; // Shift B
+ array_length++;
+ codeword_array[array_length] = 100; // Macro
+ array_length++;
+ input_position += 4;
+ inside_macro = 100;
+ done = 1;
+ if (debug) {
+ printf("B1/4 ");
+ }
+ }
+ }
+ }
+ }
+
+ /* Step B2 */
+ if ((!done) && (encoding_mode == 'C')) {
+ if (seventeen_ten(source, input_position, length)) {
+ codeword_array[array_length] = 100; // (17)...(10)
+ array_length++;
+ codeword_array[array_length] = ((source[input_position + 2] - '0') * 10) + (source[input_position + 3] - '0');
+ array_length++;
+ codeword_array[array_length] = ((source[input_position + 4] - '0') * 10) + (source[input_position + 5] - '0');
+ array_length++;
+ codeword_array[array_length] = ((source[input_position + 6] - '0') * 10) + (source[input_position + 7] - '0');
+ array_length++;
+ input_position += 10;
+ done = 1;
+ if (debug) {
+ printf("B2/1 ");
+ }
+ }
+ }
+
+ if ((!done) && (encoding_mode == 'C')) {
+ if (datum_c(source, input_position, length) || ((source[input_position] == '[') && (symbol->input_mode == GS1_MODE))) {
+ if (source[input_position] == '[') {
+ codeword_array[array_length] = 107; // FNC1
+ input_position++;
+ } else {
+ codeword_array[array_length] = ((source[input_position] - '0') * 10) + (source[input_position + 1] - '0');
+ input_position += 2;
+ }
+ array_length++;
+ done = 1;
+ if (debug) {
+ printf("B2/2 ");
+ }
+ }
+ }
+
+ /* Setp B3 */
+ if ((!done) && (encoding_mode == 'C')) {
+ if (binary(source, input_position)) {
+ if (n_digits(source, input_position + 1, length) > 0) {
+ if ((source[input_position] - 128) < 32) {
+ codeword_array[array_length] = 110; // Bin Shift A
+ array_length++;
+ codeword_array[array_length] = source[input_position] - 128 + 64;
+ array_length++;
+ } else {
+ codeword_array[array_length] = 111; // Bin Shift B
+ array_length++;
+ codeword_array[array_length] = source[input_position] - 128 - 32;
+ array_length++;
+ }
+ input_position++;
+ } else {
+ codeword_array[array_length] = 112; // Bin Latch
+ array_length++;
+ encoding_mode = 'X';
+ }
+ done = 1;
+ if (debug) {
+ printf("B3 ");
+ }
+ }
+ }
+
+ /* Step B4 */
+ if ((!done) && (encoding_mode == 'C')) {
+ int m = ahead_a(source, input_position, length);
+ int n = ahead_b(source, input_position, length);
+ if (m > n) {
+ codeword_array[array_length] = 101; // Latch A
+ array_length++;
+ encoding_mode = 'A';
+ } else {
+ if (n <= 4) {
+ codeword_array[array_length] = 101 + n; // nx Shift B
+ array_length++;
+
+ for (i = 0; i < n; i++) {
+ codeword_array[array_length] = source[input_position] - 32;
+ array_length++;
+ input_position++;
+ }
+ } else {
+ codeword_array[array_length] = 106; // Latch B
+ array_length++;
+ encoding_mode = 'B';
+ }
+ }
+ done = 1;
+ if (debug) {
+ printf("B4 ");
+ }
+ }
+
+ /* Step C1 */
+ if ((!done) && (encoding_mode == 'B')) {
+ int n = try_c(source, input_position, length);
+
+ if (n >= 2) {
+ if (n <= 4) {
+ codeword_array[array_length] = 103 + (n - 2); // nx Shift C
+ array_length++;
+ for (i = 0; i < n; i++) {
+ codeword_array[array_length] = ((source[input_position] - '0') * 10) + (source[input_position + 1] - '0');
+ array_length++;
+ input_position += 2;
+ }
+ } else {
+ codeword_array[array_length] = 106; // Latch C
+ array_length++;
+ encoding_mode = 'C';
+ }
+ done = 1;
+ if (debug) {
+ printf("C1 ");
+ }
+ }
+ }
+
+ /* Step C2 */
+ if ((!done) && (encoding_mode == 'B')) {
+ if ((source[input_position] == '[') && (symbol->input_mode == GS1_MODE)) {
+ codeword_array[array_length] = 107; // FNC1
+ array_length++;
+ input_position++;
+ done = 1;
+ if (debug) {
+ printf("C2/1 ");
+ }
+ } else {
+ if (datum_b(source, input_position, length)) {
+
+ if ((source[input_position] >= 32) && (source[input_position] <= 127)) {
+ codeword_array[array_length] = source[input_position] - 32;
+ done = 1;
+
+ } else if (source[input_position] == 13) {
+ /* CR/LF */
+ codeword_array[array_length] = 96;
+ input_position++;
+ done = 1;
+
+ } else if (input_position != 0) {
+ /* HT, FS, GS and RS in the first data position would be interpreted as a macro (see table 2) */
+ switch(source[input_position]) {
+ case 9: // HT
+ codeword_array[array_length] = 97;
+ break;
+ case 28: // FS
+ codeword_array[array_length] = 98;
+ break;
+ case 29: // GS
+ codeword_array[array_length] = 99;
+ break;
+ case 30: // RS
+ codeword_array[array_length] = 100;
+ break;
+ }
+ done = 1;
+ }
+
+ if (done == 1) {
+ array_length++;
+ input_position++;
+ if (debug) {
+ printf("C2/2 ");
+ }
+ }
+ }
+ }
+ }
+
+ /* Step C3 */
+ if ((!done) && (encoding_mode == 'B')) {
+ if (binary(source, input_position)) {
+ if (datum_b(source, input_position + 1, length)) {
+ if ((source[input_position] - 128) < 32) {
+ codeword_array[array_length] = 110; // Bin Shift A
+ array_length++;
+ codeword_array[array_length] = source[input_position] - 128 + 64;
+ array_length++;
+ } else {
+ codeword_array[array_length] = 111; // Bin Shift B
+ array_length++;
+ codeword_array[array_length] = source[input_position] - 128 - 32;
+ array_length++;
+ }
+ input_position++;
+ } else {
+ codeword_array[array_length] = 112; // Bin Latch
+ array_length++;
+ encoding_mode = 'X';
+ }
+ done = 1;
+ if (debug) {
+ printf("C3 ");
+ }
+ }
+ }
+
+ /* Step C4 */
+ if ((!done) && (encoding_mode == 'B')) {
+ if (ahead_a(source, input_position, length) == 1) {
+ codeword_array[array_length] = 101; // Shift A
+ array_length++;
+ if (source[input_position] < 32) {
+ codeword_array[array_length] = source[input_position] + 64;
+ } else {
+ codeword_array[array_length] = source[input_position] - 32;
+ }
+ array_length++;
+ input_position++;
+ } else {
+ codeword_array[array_length] = 102; // Latch A
+ array_length++;
+ encoding_mode = 'A';
+ }
+ done = 1;
+ if (debug) {
+ printf("C4 ");
+ }
+ }
+
+ /* Step D1 */
+ if ((!done) && (encoding_mode == 'A')) {
+ int n = try_c(source, input_position, length);
+ if (n >= 2) {
+ if (n <= 4) {
+ codeword_array[array_length] = 103 + (n - 2); // nx Shift C
+ array_length++;
+ for (i = 0; i < n; i++) {
+ codeword_array[array_length] = ((source[input_position] - '0') * 10) + (source[input_position + 1] - '0');
+ array_length++;
+ input_position += 2;
+ }
+ } else {
+ codeword_array[array_length] = 106; // Latch C
+ array_length++;
+ encoding_mode = 'C';
+ }
+ done = 1;
+ if (debug) {
+ printf("D1 ");
+ }
+ }
+ }
+
+ /* Step D2 */
+ if ((!done) && (encoding_mode == 'A')) {
+ if ((source[input_position] == '[') && (symbol->input_mode == GS1_MODE)) {
+ codeword_array[array_length] = 107; // FNC1
+ array_length++;
+ input_position++;
+ done = 1;
+ if (debug) {
+ printf("D2/1 ");
+ }
+ } else {
+ if (datum_a(source, input_position, length)) {
+ if (source[input_position] < 32) {
+ codeword_array[array_length] = source[input_position] + 64;
+ } else {
+ codeword_array[array_length] = source[input_position] - 32;
+ }
+ array_length++;
+ input_position++;
+ done = 1;
+ if (debug) {
+ printf("D2/2 ");
+ }
+ }
+ }
+ }
+
+ /* Step D3 */
+ if ((!done) && (encoding_mode == 'A')) {
+ if (binary(source, input_position)) {
+ if (datum_a(source, input_position + 1, length)) {
+ if ((source[input_position] - 128) < 32) {
+ codeword_array[array_length] = 110; // Bin Shift A
+ array_length++;
+ codeword_array[array_length] = source[input_position] - 128 + 64;
+ array_length++;
+ } else {
+ codeword_array[array_length] = 111; // Bin Shift B
+ array_length++;
+ codeword_array[array_length] = source[input_position] - 128 - 32;
+ array_length++;
+ }
+ input_position++;
+ } else {
+ codeword_array[array_length] = 112; // Bin Latch
+ array_length++;
+ encoding_mode = 'X';
+ }
+ done = 1;
+ if (debug) {
+ printf("D3 ");
+ }
+ }
+ }
+
+ /* Step D4 */
+ if ((!done) && (encoding_mode == 'A')) {
+ int n = ahead_b(source, input_position, length);
+
+ if (n <= 6) {
+ codeword_array[array_length] = 95 + n; // nx Shift B
+ array_length++;
+ for (i = 0; i < n; i++) {
+ codeword_array[array_length] = source[input_position] - 32;
+ array_length++;
+ input_position++;
+ }
+ } else {
+ codeword_array[array_length] = 102; // Latch B
+ array_length++;
+ encoding_mode = 'B';
+ }
+ done = 1;
+ if (debug) {
+ printf("D4 ");
+ }
+ }
+
+ /* Step E1 */
+ if ((!done) && (encoding_mode == 'X')) {
+ int n = try_c(source, input_position, length);
+
+ if (n >= 2) {
+ /* Empty binary buffer */
+ for (i = 0; i < (binary_buffer_size + 1); i++) {
+ lawrencium[i] = binary_buffer % 103;
+ binary_buffer /= 103;
+ }
+
+ for (i = 0; i < (binary_buffer_size + 1); i++) {
+ codeword_array[array_length] = lawrencium[binary_buffer_size - i];
+ array_length++;
+ }
+ binary_buffer = 0;
+ binary_buffer_size = 0;
+
+ if (n <= 7) {
+ codeword_array[array_length] = 101 + n; // Interrupt for nx Shift C
+ array_length++;
+ for (i = 0; i < n; i++) {
+ codeword_array[array_length] = ((source[input_position] - '0') * 10) + (source[input_position + 1] - '0');
+ array_length++;
+ input_position += 2;
+ }
+ } else {
+ codeword_array[array_length] = 111; // Terminate with Latch to C
+ array_length++;
+ encoding_mode = 'C';
+ }
+ done = 1;
+ if (debug) {
+ printf("E1 ");
+ }
+ }
+ }
+
+ /* Step E2 */
+ /* Section 5.2.1.1 para D.2.i states:
+ * "Groups of six codewords, each valued between 0 and 102, are radix converted from
+ * base 103 into five base 259 values..."
+ */
+ if ((!done) && (encoding_mode == 'X')) {
+ if (binary(source, input_position)
+ || binary(source, input_position + 1)
+ || binary(source, input_position + 2)
+ || binary(source, input_position + 3)) {
+ binary_buffer *= 259;
+ binary_buffer += source[input_position];
+ binary_buffer_size++;
+
+ if (binary_buffer_size == 5) {
+ for (i = 0; i < 6; i++) {
+ lawrencium[i] = binary_buffer % 103;
+ binary_buffer /= 103;
+ }
+
+ for (i = 0; i < 6; i++) {
+ codeword_array[array_length] = lawrencium[5 - i];
+ array_length++;
+ }
+ binary_buffer = 0;
+ binary_buffer_size = 0;
+ }
+ input_position++;
+ done = 1;
+ if (debug) {
+ printf("E2 ");
+ }
+ }
+ }
+
+ /* Step E3 */
+ if ((!done) && (encoding_mode == 'X')) {
+ /* Empty binary buffer */
+ for (i = 0; i < (binary_buffer_size + 1); i++) {
+ lawrencium[i] = binary_buffer % 103;
+ binary_buffer /= 103;
+ }
+
+ for (i = 0; i < (binary_buffer_size + 1); i++) {
+ codeword_array[array_length] = lawrencium[binary_buffer_size - i];
+ array_length++;
+ }
+ binary_buffer = 0;
+ binary_buffer_size = 0;
+
+ if (ahead_a(source, input_position, length) > ahead_b(source, input_position, length)) {
+ codeword_array[array_length] = 109; // Terminate with Latch to A
+ encoding_mode = 'A';
+ } else {
+ codeword_array[array_length] = 110; // Terminate with Latch to B
+ encoding_mode = 'B';
+ }
+ array_length++;
+ done = 1;
+ if (debug) {
+ printf("E3 ");
+ }
+ }
+ } while (input_position < length);
+
+ if (encoding_mode == 'X') {
+ if (binary_buffer_size != 0) {
+ /* Empty binary buffer */
+ for (i = 0; i < (binary_buffer_size + 1); i++) {
+ lawrencium[i] = binary_buffer % 103;
+ binary_buffer /= 103;
+ }
+
+ for (i = 0; i < (binary_buffer_size + 1); i++) {
+ codeword_array[array_length] = lawrencium[binary_buffer_size - i];
+ array_length++;
+ }
+ }
+ *(binary_finish) = 1;
+ }
+
+ if (debug) {
+ printf("\n\n");
+ }
+
+ return array_length;
+}
+
+/* Convert codewords to binary data stream */
+static size_t make_dotstream(unsigned char masked_array[], int array_length, char dot_stream[]) {
+ int i;
+
+ dot_stream[0] = '\0';
+
+ /* Mask value is encoded as two dots */
+ bin_append(masked_array[0], 2, dot_stream);
+
+ /* The rest of the data uses 9-bit dot patterns from Annex C */
+ for (i = 1; i < array_length; i++) {
+ bin_append(dot_patterns[masked_array[i]], 9, dot_stream);
+ }
+
+ return strlen(dot_stream);
+}
+
+/* Determines if a given dot is a reserved corner dot
+ * to be used by one of the last six bits
+ */
+int is_corner(int column, int row, int width, int height) {
+ int corner = 0;
+
+ /* Top Left */
+ if ((column == 0) && (row == 0)) {
+ corner = 1;
+ }
+
+ /* Top Right */
+ if (height % 2) {
+ if (((column == width - 2) && (row == 0))
+ || ((column == width - 1) && (row == 1))) {
+ corner = 1;
+ }
+ } else {
+ if ((column == width - 1) && (row == 0)) {
+ corner = 1;
+ }
+ }
+
+ /* Bottom Left */
+ if (height % 2) {
+ if ((column == 0) && (row == height - 1)) {
+ corner = 1;
+ }
+ } else {
+ if (((column == 0) && (row == height - 2))
+ || ((column == 1) && (row == height - 1))) {
+ corner = 1;
+ }
+ }
+
+ /* Bottom Right */
+ if (((column == width - 2) && (row == height - 1))
+ || ((column == width - 1) && (row == height - 2))) {
+ corner = 1;
+ }
+
+ return corner;
+}
+
+/* Place the dots in the symbol*/
+void fold_dotstream(char dot_stream[], int width, int height, char dot_array[]) {
+ int column, row;
+ int input_position = 0;
+
+ if (height % 2) {
+ /* Horizontal folding */
+ for (row = 0; row < height; row++) {
+ for (column = 0; column < width; column++) {
+ if (!((column + row) % 2)) {
+ if (is_corner(column, row, width, height)) {
+ dot_array[(row * width) + column] = 'C';
+ } else {
+ dot_array[((height - row - 1) * width) + column] = dot_stream[input_position];
+ input_position++;
+ }
+ } else {
+ dot_array[((height - row - 1) * width) + column] = ' '; // Non-data position
+ }
+ }
+ }
+
+ /* Corners */
+ dot_array[width - 2] = dot_stream[input_position];
+ input_position++;
+ dot_array[(height * width) - 2] = dot_stream[input_position];
+ input_position++;
+ dot_array[(width * 2) - 1] = dot_stream[input_position];
+ input_position++;
+ dot_array[((height - 1) * width) - 1] = dot_stream[input_position];
+ input_position++;
+ dot_array[0] = dot_stream[input_position];
+ input_position++;
+ dot_array[(height - 1) * width] = dot_stream[input_position];
+ } else {
+ /* Vertical folding */
+ for (column = 0; column < width; column++) {
+ for (row = 0; row < height; row++) {
+ if (!((column + row) % 2)) {
+ if (is_corner(column, row, width, height)) {
+ dot_array[(row * width) + column] = 'C';
+ } else {
+ dot_array[(row * width) + column] = dot_stream[input_position];
+ input_position++;
+ }
+ } else {
+ dot_array[(row * width) + column] = ' '; // Non-data position
+ }
+ }
+ }
+
+ /* Corners */
+ dot_array[((height - 1) * width) - 1] = dot_stream[input_position];
+ input_position++;
+ dot_array[(height - 2) * width] = dot_stream[input_position];
+ input_position++;
+ dot_array[(height * width) - 2] = dot_stream[input_position];
+ input_position++;
+ dot_array[((height - 1) * width) + 1] = dot_stream[input_position];
+ input_position++;
+ dot_array[width - 1] = dot_stream[input_position];
+ input_position++;
+ dot_array[0] = dot_stream[input_position];
+ }
+}
+
+int dotcode(struct zint_symbol *symbol, const unsigned char source[], int length) {
+ int i, j, k;
+ size_t jc, n_dots;
+ int data_length, ecc_length;
+ int min_dots, min_area;
+ int height, width;
+ int mask_score[4];
+ int weight;
+ size_t dot_stream_length;
+ int high_score, best_mask;
+ int binary_finish = 0;
+ int debug = 0;
+ int padding_dots, is_first;
+#ifdef _MSC_VER
+ unsigned char* masked_codeword_array;
+#endif
+
+#ifndef _MSC_VER
+ unsigned char codeword_array[length * 3];
+#else
+ char* dot_stream;
+ char* dot_array;
+ unsigned char* codeword_array = (unsigned char *) _alloca(length * 3 * sizeof (unsigned char));
+#endif /* _MSC_VER */
+
+ if (symbol->eci > 811799) {
+ strcpy(symbol->errtxt, "525: Invalid ECI");
+ return ZINT_ERROR_INVALID_OPTION;
+ }
+
+ data_length = dotcode_encode_message(symbol, source, length, codeword_array, &binary_finish);
+
+ ecc_length = 3 + (data_length / 2);
+
+ if (debug) {
+ printf("Codeword length = %d, ECC length = %d\n", data_length, ecc_length);
+ }
+
+ min_dots = 9 * (data_length + 3 + (data_length / 2)) + 2;
+ min_area = min_dots * 2;
+
+ if (symbol->option_2 == 0) {
+ /* Automatic sizing */
+ /* Following Rule 3 (Section 5.2.2) and applying a recommended width to height ratio 3:2 */
+ /* Eliminates under sized symbols */
+
+ float h = (float) (sqrt(min_area * 0.666));
+ float w = (float) (sqrt(min_area * 1.5));
+
+ height = (int) h;
+ width = (int) w;
+
+ if ((width + height) % 2 == 1) {
+ if ((width * height) < min_area) {
+ width++;
+ height++;
+ }
+ } else {
+ if ((h * width) < (w * height)) {
+ width++;
+ if ((width * height) < min_area) {
+ width--;
+ height++;
+ if ((width * height) < min_area) {
+ width += 2;
+ }
+ }
+ } else {
+ height++;
+ if ((width * height) < min_area) {
+ width++;
+ height--;
+ if ((width * height) < min_area) {
+ height += 2;
+ }
+ }
+ }
+ }
+
+ } else {
+ /* User defined width */
+ /* Eliminates under sized symbols */
+
+ width = symbol->option_2;
+ height = (min_area + (width - 1)) / width;
+
+ if (!((width + height) % 2)) {
+ height++;
+ }
+ }
+
+ if ((height > 200) || (width > 200)) {
+ strcpy(symbol->errtxt, "526: Specified symbol size is too large (E20)");
+ return ZINT_ERROR_INVALID_OPTION;
+ }
+
+ n_dots = (height * width) / 2;
+
+#ifndef _MSC_VER
+ char dot_stream[height * width * 3];
+ char dot_array[width * height * sizeof (char) ];
+#else
+ dot_stream = (char *) _alloca(height * width * 3);
+ if (!dot_stream) return ZINT_ERROR_MEMORY;
+
+ dot_array = (char *) _alloca(width * height * sizeof (char));
+ if (!dot_array) return ZINT_ERROR_MEMORY;
+#endif
+
+ /* Add pad characters */
+ padding_dots = n_dots - min_dots; /* get the number of free dots available for padding */
+ is_first = 1; /* first padding character flag */
+
+ while (padding_dots >= 9) {
+ if (padding_dots < 18 && ((data_length % 2) == 0))
+ padding_dots -= 9;
+
+ else if (padding_dots >= 18) {
+ if ((data_length % 2) == 0)
+ padding_dots -= 9;
+ else
+ padding_dots -= 18;
+ } else
+ break; /* not enough padding dots left for padding */
+
+ if ((is_first == 1) && (binary_finish == 1))
+ codeword_array[data_length] = 109;
+ else
+ codeword_array[data_length] = 106;
+
+ data_length++;
+ is_first = 0;
+ }
+
+ ecc_length = 3 + (data_length / 2);
+
+#ifndef _MSC_VER
+ unsigned char masked_codeword_array[data_length + 1 + ecc_length];
+#else
+ masked_codeword_array = (unsigned char *) _alloca((data_length + 1 + ecc_length) * sizeof (unsigned char));
+#endif /* _MSC_VER */
+
+ /* Evaluate data mask options */
+ for (i = 0; i < 4; i++) {
+ switch (i) {
+ case 0:
+ masked_codeword_array[0] = 0;
+ for (j = 0; j < data_length; j++) {
+ masked_codeword_array[j + 1] = codeword_array[j];
+ }
+ break;
+ case 1:
+ weight = 0;
+ masked_codeword_array[0] = 1;
+ for (j = 0; j < data_length; j++) {
+ masked_codeword_array[j + 1] = (weight + codeword_array[j]) % 113;
+ weight += 3;
+ }
+ break;
+ case 2:
+ weight = 0;
+ masked_codeword_array[0] = 2;
+ for (j = 0; j < data_length; j++) {
+ masked_codeword_array[j + 1] = (weight + codeword_array[j]) % 113;
+ weight += 7;
+ }
+ break;
+ case 3:
+ weight = 0;
+ masked_codeword_array[0] = 3;
+ for (j = 0; j < data_length; j++) {
+ masked_codeword_array[j + 1] = (weight + codeword_array[j]) % 113;
+ weight += 17;
+ }
+ break;
+ }
+
+ rsencode(data_length + 1, ecc_length, masked_codeword_array);
+
+ dot_stream_length = make_dotstream(masked_codeword_array, (data_length + ecc_length + 1), dot_stream);
+
+ /* Add pad bits */
+ for (jc = dot_stream_length; jc < n_dots; jc++) {
+ strcat(dot_stream, "1");
+ }
+
+ fold_dotstream(dot_stream, width, height, dot_array);
+
+ mask_score[i] = score_array(dot_array, height, width);
+
+ if (debug) {
+ printf("Mask %d score is %d\n", i, mask_score[i]);
+ }
+ }
+
+ high_score = mask_score[0];
+ best_mask = 0;
+
+ for (i = 1; i < 4; i++) {
+ if (mask_score[i] > high_score) {
+ high_score = mask_score[i];
+ best_mask = i;
+ }
+ }
+
+ if (best_mask != 3) {
+ /* Reprocess to get symbol with best mask */
+ switch (best_mask) {
+ case 0:
+ masked_codeword_array[0] = 0;
+ for (j = 0; j < data_length; j++) {
+ masked_codeword_array[j + 1] = codeword_array[j];
+ }
+ break;
+ case 1:
+ weight = 0;
+ masked_codeword_array[0] = 1;
+ for (j = 0; j < data_length; j++) {
+ masked_codeword_array[j + 1] = (weight + codeword_array[j]) % 113;
+ weight += 3;
+ }
+ break;
+ case 2:
+ weight = 0;
+ masked_codeword_array[0] = 2;
+ for (j = 0; j < data_length; j++) {
+ masked_codeword_array[j + 1] = (weight + codeword_array[j]) % 113;
+ weight += 7;
+ }
+ break;
+ }
+
+ rsencode(data_length + 1, ecc_length, masked_codeword_array);
+ dot_stream_length = make_dotstream(masked_codeword_array, (data_length + ecc_length + 1), dot_stream);
+
+ /* Add pad bits */
+ for (jc = dot_stream_length; jc < n_dots; jc++) {
+ strcat(dot_stream, "1");
+ }
+
+ fold_dotstream(dot_stream, width, height, dot_array);
+ } /* else { the version with the best mask is already in memory } */
+
+ if (debug) {
+ for (k = 0; k < height; k++) {
+ for (j = 0; j < width; j++) {
+ printf("%c", dot_array[(k * width) + j]);
+ }
+ printf("\n");
+ }
+ }
+
+ /* Copy values to symbol */
+ symbol->width = width;
+ symbol->rows = height;
+
+ for (k = 0; k < height; k++) {
+ for (j = 0; j < width; j++) {
+ if (dot_array[(k * width) + j] == '1') {
+ set_module(symbol, k, j);
+ }
+ }
+ symbol->row_height[k] = 1;
+ }
+
+ if (!(symbol->output_options & BARCODE_DOTTY_MODE)) {
+ symbol->output_options += BARCODE_DOTTY_MODE;
+ }
+
+ return 0;
+}
\ No newline at end of file
diff --git a/3rdparty/zint-2.6.1/backend/eci.c b/3rdparty/zint-2.6.1/backend/eci.c
new file mode 100644
index 0000000..4545613
--- /dev/null
+++ b/3rdparty/zint-2.6.1/backend/eci.c
@@ -0,0 +1,309 @@
+/* eci.c - Extended Channel Interpretations
+
+ libzint - the open source barcode library
+ Copyright (C) 2009-2017 Robin Stuart
+
+ Redistribution and use in source and binary forms, with or without
+ modification, are permitted provided that the following conditions
+ are met:
+
+ 1. Redistributions of source code must retain the above copyright
+ notice, this list of conditions and the following disclaimer.
+ 2. Redistributions in binary form must reproduce the above copyright
+ notice, this list of conditions and the following disclaimer in the
+ documentation and/or other materials provided with the distribution.
+ 3. Neither the name of the project nor the names of its contributors
+ may be used to endorse or promote products derived from this software
+ without specific prior written permission.
+
+ THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND
+ ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+ ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE
+ FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+ DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
+ OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
+ HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
+ LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
+ OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+ SUCH DAMAGE.
+ */
+
+#include
+#include
+#include
+#include "eci.h"
+#include "zint.h"
+#ifdef _MSC_VER
+#include
+#endif
+
+/* Convert Unicode to other character encodings */
+int utf_to_eci(const int eci, const unsigned char source[], unsigned char dest[], size_t *length) {
+ int glyph;
+ int bytelen;
+ int in_posn;
+ int out_posn;
+ int ext;
+ int done;
+
+ if (eci == 26) {
+ /* Unicode mode, do not process - just copy data across */
+ for (in_posn = 0; in_posn < *length; in_posn++) {
+ dest[in_posn] = source[in_posn];
+ }
+ dest[*length] = '\0';
+ return 0;
+ }
+
+ in_posn = 0;
+ out_posn = 0;
+ do {
+ /* Single byte (ASCII) character */
+ bytelen = 1;
+ glyph = (int) source[in_posn];
+
+ if ((source[in_posn] >= 0x80) && (source[in_posn] < 0xc0)) {
+ /* Something has gone wrong, abort */
+ return ZINT_ERROR_INVALID_DATA;
+ }
+
+ if ((source[in_posn] >= 0xc0) && (source[in_posn] < 0xe0)) {
+ /* Two-byte character */
+ bytelen = 2;
+ glyph = (source[in_posn] & 0x1f) << 6;
+
+ if (*length < (in_posn + 2)) {
+ return ZINT_ERROR_INVALID_DATA;
+ }
+
+ if (source[in_posn + 1] > 0xc0) {
+ return ZINT_ERROR_INVALID_DATA;
+ }
+
+ glyph += (source[in_posn + 1] & 0x3f);
+ }
+
+ if ((source[in_posn] >= 0xe0) && (source[in_posn] < 0xf0)) {
+ /* Three-byte character */
+ bytelen = 3;
+ glyph = (source[in_posn] & 0x0f) << 12;
+
+ if (*length < (in_posn + 2)) {
+ return ZINT_ERROR_INVALID_DATA;
+ }
+
+ if (*length < (in_posn + 3)) {
+ return ZINT_ERROR_INVALID_DATA;
+ }
+
+ if (source[in_posn + 1] > 0xc0) {
+ return ZINT_ERROR_INVALID_DATA;
+ }
+
+ if (source[in_posn + 2] > 0xc0) {
+ return ZINT_ERROR_INVALID_DATA;
+ }
+
+ glyph += (source[in_posn + 1] & 0x3f) << 6;
+ glyph += (source[in_posn + 2] & 0x3f);
+ }
+
+ if ((source[in_posn] >= 0xf0) && (source[in_posn] < 0xf7)) {
+ /* Four-byte character */
+ bytelen = 4;
+ glyph = (source[in_posn] & 0x07) << 18;
+
+ if (*length < (in_posn + 2)) {
+ return ZINT_ERROR_INVALID_DATA;
+ }
+
+ if (*length < (in_posn + 3)) {
+ return ZINT_ERROR_INVALID_DATA;
+ }
+
+ if (*length < (in_posn + 4)) {
+ return ZINT_ERROR_INVALID_DATA;
+ }
+
+ if (source[in_posn + 1] > 0xc0) {
+ return ZINT_ERROR_INVALID_DATA;
+ }
+
+ if (source[in_posn + 2] > 0xc0) {
+ return ZINT_ERROR_INVALID_DATA;
+ }
+
+ if (source[in_posn + 3] > 0xc0) {
+ return ZINT_ERROR_INVALID_DATA;
+ }
+
+ glyph += (source[in_posn + 1] & 0x3f) << 12;
+ glyph += (source[in_posn + 2] & 0x3f) << 6;
+ glyph += (source[in_posn + 3] & 0x3f);
+ }
+
+ if (source[in_posn] >= 0xf7) {
+ /* More than 4 bytes not supported */
+ return ZINT_ERROR_INVALID_DATA;
+ }
+
+ if (glyph < 128) {
+ dest[out_posn] = glyph;
+ } else {
+ done = 0;
+ for (ext = 0; ext < 128; ext++) {
+ switch (eci) {
+ case 3: // Latin-1
+ if (glyph == iso_8859_1[ext]) {
+ dest[out_posn] = ext + 128;
+ done = 1;
+ }
+ break;
+ case 4: // Latin-2
+ if (glyph == iso_8859_2[ext]) {
+ dest[out_posn] = ext + 128;
+ done = 1;
+ }
+ break;
+ case 5: // Latin-3
+ if (glyph == iso_8859_3[ext]) {
+ dest[out_posn] = ext + 128;
+ done = 1;
+ }
+ break;
+ case 6: // Latin-4
+ if (glyph == iso_8859_4[ext]) {
+ dest[out_posn] = ext + 128;
+ done = 1;
+ }
+ break;
+ case 7: // Latin/Cyrillic
+ if (glyph == iso_8859_5[ext]) {
+ dest[out_posn] = ext + 128;
+ done = 1;
+ }
+ break;
+ case 8: // Latin/Arabic
+ if (glyph == iso_8859_6[ext]) {
+ dest[out_posn] = ext + 128;
+ done = 1;
+ }
+ break;
+ case 9: // Latin/Greek
+ if (glyph == iso_8859_7[ext]) {
+ dest[out_posn] = ext + 128;
+ done = 1;
+ }
+ break;
+ case 10: // Latin/Hebrew
+ if (glyph == iso_8859_8[ext]) {
+ dest[out_posn] = ext + 128;
+ done = 1;
+ }
+ break;
+ case 11: // Latin-5
+ if (glyph == iso_8859_9[ext]) {
+ dest[out_posn] = ext + 128;
+ done = 1;
+ }
+ break;
+ case 12: // Latin-6
+ if (glyph == iso_8859_10[ext]) {
+ dest[out_posn] = ext + 128;
+ done = 1;
+ }
+ break;
+ case 13: // Latin/Thai
+ if (glyph == iso_8859_11[ext]) {
+ dest[out_posn] = ext + 128;
+ done = 1;
+ }
+ break;
+ case 15: // Latin-7
+ if (glyph == iso_8859_13[ext]) {
+ dest[out_posn] = ext + 128;
+ done = 1;
+ }
+ break;
+ case 16: // Latin-8
+ if (glyph == iso_8859_14[ext]) {
+ dest[out_posn] = ext + 128;
+ done = 1;
+ }
+ break;
+ case 17: // Latin-9
+ if (glyph == iso_8859_15[ext]) {
+ dest[out_posn] = ext + 128;
+ done = 1;
+ }
+ break;
+ case 18: // Latin-10
+ if (glyph == iso_8859_16[ext]) {
+ dest[out_posn] = ext + 128;
+ done = 1;
+ }
+ break;
+ case 21: // Windows-1250
+ if (glyph == windows_1250[ext]) {
+ dest[out_posn] = ext + 128;
+ done = 1;
+ }
+ break;
+ case 22: // Windows-1251
+ if (glyph == windows_1251[ext]) {
+ dest[out_posn] = ext + 128;
+ done = 1;
+ }
+ break;
+ case 23: // Windows-1252
+ if (glyph == windows_1252[ext]) {
+ dest[out_posn] = ext + 128;
+ done = 1;
+ }
+ break;
+ case 24: // Windows-1256
+ if (glyph == windows_1256[ext]) {
+ dest[out_posn] = ext + 128;
+ done = 1;
+ }
+ break;
+ default:
+ break;
+ }
+ }
+
+ if (!(done)) {
+ return ZINT_ERROR_INVALID_DATA;
+ }
+ }
+
+ in_posn += bytelen;
+ out_posn++;
+ } while (in_posn < *length);
+ dest[out_posn] = '\0';
+ *length = out_posn;
+
+ return 0;
+}
+
+/* Find the lowest ECI mode which will encode a given set of Unicode text */
+int get_best_eci(unsigned char source[], size_t length) {
+ int eci = 3;
+
+#ifndef _MSC_VER
+ unsigned char local_source[length + 1];
+#else
+ unsigned char *local_source = (unsigned char*) _alloca(length + 1);
+#endif
+
+ do {
+ if (utf_to_eci(eci, source, local_source, &length) == 0) {
+ return eci;
+ }
+ eci++;
+ } while (eci < 25);
+
+ return 26; // If all of these fail, use Unicode!
+}
+
diff --git a/3rdparty/zint-2.6.1/backend/eci.h b/3rdparty/zint-2.6.1/backend/eci.h
new file mode 100644
index 0000000..380dd6a
--- /dev/null
+++ b/3rdparty/zint-2.6.1/backend/eci.h
@@ -0,0 +1,252 @@
+/* eci.c - Extended Channel Interpretations to Unicode tables
+
+ libzint - the open source barcode library
+ Copyright (C) 2009-2017 Robin Stuart
+
+ Redistribution and use in source and binary forms, with or without
+ modification, are permitted provided that the following conditions
+ are met:
+
+ 1. Redistributions of source code must retain the above copyright
+ notice, this list of conditions and the following disclaimer.
+ 2. Redistributions in binary form must reproduce the above copyright
+ notice, this list of conditions and the following disclaimer in the
+ documentation and/or other materials provided with the distribution.
+ 3. Neither the name of the project nor the names of its contributors
+ may be used to endorse or promote products derived from this software
+ without specific prior written permission.
+
+ THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND
+ ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+ ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE
+ FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+ DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
+ OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
+ HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
+ LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
+ OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+ SUCH DAMAGE.
+ */
+
+#ifndef ECI_H
+#define ECI_H
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+static const unsigned short int iso_8859_1[] = {// Latin alphabet No. 1
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x00a0, 0x00a1, 0x00a2, 0x00a3, 0x00a4, 0x00a5, 0x00a6, 0x00a7, 0x00a8, 0x00a9, 0x00aa, 0x00ab, 0x00ac, 0x00ad, 0x00ae, 0x00af,
+ 0x00b0, 0x00b1, 0x00b2, 0x00b3, 0x00b4, 0x00b5, 0x00b6, 0x00b7, 0x00b8, 0x00b9, 0x00ba, 0x00bb, 0x00bc, 0x00bd, 0x00be, 0x00bf,
+ 0x00c0, 0x00c1, 0x00c2, 0x00c3, 0x00c4, 0x00c5, 0x00c6, 0x00c7, 0x00c8, 0x00c9, 0x00ca, 0x00cb, 0x00cc, 0x00cd, 0x00ce, 0x00cf,
+ 0x00d0, 0x00d1, 0x00d2, 0x00d3, 0x00d4, 0x00d5, 0x00d6, 0x00d7, 0x00d8, 0x00d9, 0x00da, 0x00db, 0x00dc, 0x00dd, 0x00de, 0x00df,
+ 0x00e0, 0x00e1, 0x00e2, 0x00e3, 0x00e4, 0x00e5, 0x00e6, 0x00e7, 0x00e8, 0x00e9, 0x00ea, 0x00eb, 0x00ec, 0x00ed, 0x00ee, 0x00ef,
+ 0x00f0, 0x00f1, 0x00f2, 0x00f3, 0x00f4, 0x00f5, 0x00f6, 0x00f7, 0x00f8, 0x00f9, 0x00fa, 0x00fb, 0x00fc, 0x00fd, 0x00fe, 0x00ff
+};
+
+static const unsigned short int iso_8859_2[] = {// Latin alphabet No. 2
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x00a0, 0x0104, 0x02d8, 0x0141, 0x00a4, 0x013d, 0x015a, 0x00a7, 0x00a8, 0x0160, 0x015e, 0x0164, 0x0179, 0x00ad, 0x017d, 0x017b,
+ 0x00b0, 0x0105, 0x02db, 0x0142, 0x00b4, 0x013e, 0x015b, 0x02c7, 0x00b8, 0x0161, 0x015f, 0x0165, 0x017a, 0x02dd, 0x017e, 0x017c,
+ 0x0154, 0x00c1, 0x00c2, 0x0102, 0x00c4, 0x0139, 0x0106, 0x00c7, 0x010c, 0x00c9, 0x0118, 0x00cb, 0x011a, 0x00cd, 0x00ce, 0x010e,
+ 0x0110, 0x0143, 0x0147, 0x00d3, 0x00d4, 0x0150, 0x00d6, 0x00d7, 0x0158, 0x016e, 0x00da, 0x0170, 0x00dc, 0x00dd, 0x0162, 0x00df,
+ 0x0155, 0x00e1, 0x00e2, 0x0103, 0x00e4, 0x013a, 0x0107, 0x00e7, 0x010d, 0x00e9, 0x0119, 0x00eb, 0x011b, 0x00ed, 0x00ee, 0x010f,
+ 0x0111, 0x0144, 0x0148, 0x00f3, 0x00f4, 0x0151, 0x00f6, 0x00f7, 0x0159, 0x016f, 0x00fa, 0x0171, 0x00fc, 0x00fd, 0x0163, 0x02d9
+};
+
+static const unsigned short int iso_8859_3[] = {// Latin alphabet No. 3
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x00a0, 0x0126, 0x02d8, 0x00a3, 0x00a4, 0x0000, 0x0124, 0x00a7, 0x00a8, 0x0130, 0x015e, 0x011e, 0x0134, 0x00ad, 0x0000, 0x017b,
+ 0x00b0, 0x0127, 0x00b2, 0x00b3, 0x00b4, 0x00b5, 0x0125, 0x00b7, 0x00b8, 0x0131, 0x015f, 0x011f, 0x0135, 0x00bd, 0x0000, 0x017c,
+ 0x00c0, 0x00c1, 0x00c2, 0x0000, 0x00c4, 0x010a, 0x0108, 0x00c7, 0x00c8, 0x00c9, 0x00ca, 0x00cb, 0x00cc, 0x00cd, 0x00ce, 0x00cf,
+ 0x0000, 0x00d1, 0x00d2, 0x00d3, 0x00d4, 0x0120, 0x00d6, 0x00d7, 0x011c, 0x00d9, 0x00da, 0x00db, 0x00dc, 0x016c, 0x015c, 0x00df,
+ 0x00e0, 0x00e1, 0x00e2, 0x0000, 0x00e4, 0x010b, 0x0109, 0x00e7, 0x00e8, 0x00e9, 0x00ea, 0x00eb, 0x00ec, 0x00ed, 0x00ee, 0x00ef,
+ 0x0000, 0x00f1, 0x00f2, 0x00f3, 0x00f4, 0x0121, 0x00f6, 0x00f7, 0x011d, 0x00f9, 0x00fa, 0x00fb, 0x00fc, 0x016d, 0x015d, 0x02d9
+};
+
+static const unsigned short int iso_8859_4[] = {// Latin alphabet No. 4
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x00a0, 0x0104, 0x0138, 0x0156, 0x00a4, 0x012b, 0x013b, 0x00a7, 0x00a8, 0x0160, 0x0112, 0x0122, 0x0166, 0x00ad, 0x017d, 0x00af,
+ 0x00b0, 0x0105, 0x02db, 0x0157, 0x00b4, 0x0129, 0x013c, 0x02c7, 0x00b8, 0x0161, 0x0113, 0x0123, 0x0167, 0x014a, 0x017e, 0x014b,
+ 0x0100, 0x00c1, 0x00c2, 0x00c3, 0x00c4, 0x00c5, 0x00c6, 0x012e, 0x010c, 0x00c9, 0x0118, 0x00cb, 0x0116, 0x00cd, 0x00ce, 0x012a,
+ 0x0110, 0x0145, 0x014c, 0x0136, 0x00d4, 0x00d5, 0x00d6, 0x00d7, 0x00d8, 0x0172, 0x00da, 0x00db, 0x00dc, 0x0168, 0x016a, 0x00df,
+ 0x0101, 0x00e1, 0x00e2, 0x00e3, 0x00e4, 0x00e5, 0x00e6, 0x012f, 0x010d, 0x00e9, 0x0119, 0x00eb, 0x0117, 0x00ed, 0x00ee, 0x012b,
+ 0x0111, 0x0146, 0x014d, 0x0137, 0x00f4, 0x00f5, 0x00f6, 0x00f7, 0x00f8, 0x0173, 0x00fa, 0x00fb, 0x00fc, 0x0169, 0x016b, 0x02d9
+};
+
+static const unsigned short int iso_8859_5[] = {// Latin/Cyrillic alphabet
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x00a0, 0x0401, 0x0402, 0x0403, 0x0404, 0x0405, 0x0406, 0x0407, 0x0408, 0x0409, 0x040a, 0x040b, 0x040c, 0x00ad, 0x040e, 0x040f,
+ 0x0410, 0x0411, 0x0412, 0x0413, 0x0414, 0x0415, 0x0416, 0x0417, 0x0418, 0x0419, 0x041a, 0x041b, 0x041c, 0x041d, 0x041e, 0x041f,
+ 0x0420, 0x0421, 0x0422, 0x0423, 0x0424, 0x0425, 0x0426, 0x0427, 0x0428, 0x0429, 0x042a, 0x042b, 0x042c, 0x042d, 0x042e, 0x042f,
+ 0x0430, 0x0431, 0x0432, 0x0433, 0x0434, 0x0435, 0x0436, 0x0437, 0x0438, 0x0439, 0x043a, 0x043b, 0x043c, 0x043d, 0x043e, 0x043f,
+ 0x0440, 0x0441, 0x0442, 0x0443, 0x0444, 0x0445, 0x0446, 0x0447, 0x0448, 0x0449, 0x044a, 0x044b, 0x044c, 0x044d, 0x044e, 0x044f,
+ 0x2116, 0x0451, 0x0452, 0x0453, 0x0454, 0x0455, 0x0456, 0x0457, 0x0458, 0x0459, 0x045a, 0x045b, 0x045c, 0x00a7, 0x045e, 0x045f
+};
+
+static const unsigned short int iso_8859_6[] = {// Latin/Arabic alphabet
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x00a0, 0x0000, 0x0000, 0x0000, 0x00a4, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x060c, 0x00ad, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x061b, 0x0000, 0x0000, 0x0000, 0x061f,
+ 0x0000, 0x0621, 0x0622, 0x0623, 0x0624, 0x0625, 0x0626, 0x0627, 0x0628, 0x0629, 0x062a, 0x062b, 0x062c, 0x062d, 0x062e, 0x062f,
+ 0x0630, 0x0631, 0x0632, 0x0633, 0x0634, 0x0635, 0x0636, 0x0637, 0x0638, 0x0639, 0x063a, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0640, 0x0641, 0x0642, 0x0643, 0x0644, 0x0645, 0x0646, 0x0647, 0x0648, 0x0649, 0x064a, 0x064b, 0x064c, 0x064d, 0x064e, 0x064f,
+ 0x0650, 0x0651, 0x0652, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000
+};
+
+static const unsigned short int iso_8859_7[] = {// Latin/Greek alphabet
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x00a0, 0x2018, 0x2019, 0x00a3, 0x20ac, 0x20af, 0x00a6, 0x00a7, 0x00a8, 0x00a9, 0x037a, 0x00ab, 0x00ac, 0x00ad, 0x0000, 0x2015,
+ 0x00b0, 0x00b1, 0x00b2, 0x00b3, 0x0384, 0x0385, 0x0386, 0x00b7, 0x0388, 0x0389, 0x038a, 0x00bb, 0x038c, 0x00bd, 0x038e, 0x038f,
+ 0x0390, 0x0391, 0x0392, 0x0393, 0x0394, 0x0395, 0x0396, 0x0397, 0x0398, 0x0399, 0x039a, 0x039b, 0x039c, 0x039d, 0x039e, 0x039f,
+ 0x03a0, 0x03a1, 0x0000, 0x03a3, 0x03a4, 0x03a5, 0x03a6, 0x03a7, 0x03a8, 0x03a9, 0x03aa, 0x03ab, 0x03ac, 0x03ad, 0x03ae, 0x03af,
+ 0x03b0, 0x03b1, 0x03b2, 0x03b3, 0x03b4, 0x03b5, 0x03b6, 0x03b7, 0x03b8, 0x03b9, 0x03ba, 0x03bb, 0x03bc, 0x03bd, 0x03be, 0x03bf,
+ 0x03c0, 0x03c1, 0x03c2, 0x03c3, 0x03c4, 0x03c5, 0x03c6, 0x03c7, 0x03c8, 0x03c9, 0x03ca, 0x03cb, 0x03cc, 0x03cd, 0x03ce, 0x0000
+};
+
+static const unsigned short int iso_8859_8[] = {// Latin/Hebrew alphabet
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x00a0, 0x0000, 0x00a2, 0x00a3, 0x00a4, 0x00a5, 0x00a6, 0x00a7, 0x00a8, 0x00a9, 0x00d7, 0x00ab, 0x00ac, 0x00ad, 0x00ae, 0x00af,
+ 0x00b0, 0x00b1, 0x00b2, 0x00b3, 0x00b4, 0x00b5, 0x00b6, 0x00b7, 0x00b8, 0x00b9, 0x00f7, 0x00bb, 0x00bc, 0x00bd, 0x00be, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x2017,
+ 0x05d0, 0x05d1, 0x05d2, 0x05d3, 0x05d4, 0x05d5, 0x05d6, 0x05d7, 0x05d8, 0x05d9, 0x05da, 0x05db, 0x05dc, 0x05dd, 0x05de, 0x05df,
+ 0x05e0, 0x05e1, 0x05e2, 0x05e3, 0x05e4, 0x05e5, 0x05e6, 0x05e7, 0x05e8, 0x05e9, 0x05ea, 0x0000, 0x0000, 0x200e, 0x200f, 0x0000
+};
+
+static const unsigned short int iso_8859_9[] = {// Latin alphabet No. 5
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x00a0, 0x00a1, 0x00a2, 0x00a3, 0x00a4, 0x00a5, 0x00a6, 0x00a7, 0x00a8, 0x00a9, 0x00aa, 0x00ab, 0x00ac, 0x00ad, 0x00ae, 0x00af,
+ 0x00b0, 0x00b1, 0x00b2, 0x00b3, 0x00b4, 0x00b5, 0x00b6, 0x00b7, 0x00b8, 0x00b9, 0x00ba, 0x00bb, 0x00bc, 0x00bd, 0x00be, 0x00bf,
+ 0x00c0, 0x00c1, 0x00c2, 0x00c3, 0x00c4, 0x00c5, 0x00c6, 0x00c7, 0x00c8, 0x00c9, 0x00ca, 0x00cb, 0x00cc, 0x00cd, 0x00ce, 0x00cf,
+ 0x011e, 0x00d1, 0x00d2, 0x00d3, 0x00d4, 0x00d5, 0x00d6, 0x00d7, 0x00d8, 0x00d9, 0x00da, 0x00db, 0x00dc, 0x0130, 0x015e, 0x00df,
+ 0x00e0, 0x00e1, 0x00e2, 0x00e3, 0x00e4, 0x00e5, 0x00e6, 0x00e7, 0x00e8, 0x00e9, 0x00ea, 0x00eb, 0x00ec, 0x00ed, 0x00ee, 0x00ef,
+ 0x011f, 0x00f1, 0x00f2, 0x00f3, 0x00f4, 0x00f5, 0x00f6, 0x00f7, 0x00f8, 0x00f9, 0x00fa, 0x00fb, 0x00fc, 0x0131, 0x015f, 0x00ff
+};
+
+static const unsigned short int iso_8859_10[] = {// Latin alphabet No. 6
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x00a0, 0x0104, 0x0112, 0x0122, 0x012a, 0x012b, 0x0136, 0x00a7, 0x013b, 0x0110, 0x0160, 0x0166, 0x017d, 0x00ad, 0x016a, 0x014a,
+ 0x00b0, 0x0105, 0x0113, 0x0123, 0x012b, 0x0129, 0x0137, 0x00b7, 0x013c, 0x0111, 0x0161, 0x0167, 0x017e, 0x2015, 0x016b, 0x014b,
+ 0x0100, 0x00c1, 0x00c2, 0x00c3, 0x00c4, 0x00c5, 0x00c6, 0x012e, 0x010c, 0x00c9, 0x0118, 0x00cb, 0x0116, 0x00cd, 0x00ce, 0x00cf,
+ 0x00d0, 0x0145, 0x014c, 0x00d3, 0x00d4, 0x00d5, 0x00d6, 0x0168, 0x00d8, 0x0172, 0x00da, 0x00db, 0x00dc, 0x00dd, 0x00de, 0x00df,
+ 0x0101, 0x00e1, 0x00e2, 0x00e3, 0x00e4, 0x00e5, 0x00e6, 0x012f, 0x010d, 0x00e9, 0x0119, 0x00eb, 0x0117, 0x00ed, 0x00ee, 0x00ef,
+ 0x00f0, 0x0146, 0x014d, 0x00f3, 0x00f4, 0x00f5, 0x00f6, 0x0169, 0x00f8, 0x0173, 0x00fa, 0x00fb, 0x00fc, 0x00fd, 0x00fe, 0x0138
+};
+
+static const unsigned short int iso_8859_11[] = {// Latin/Thai alphabet
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x00a0, 0x0e01, 0x0e02, 0x0e03, 0x0e04, 0x0e05, 0x0e06, 0x0e07, 0x0e08, 0x0e09, 0x0e0a, 0x0e0b, 0x0e0c, 0x0e0d, 0x0e0e, 0x0e0f,
+ 0x0e10, 0x0e11, 0x0e12, 0x0e13, 0x0e14, 0x0e15, 0x0e16, 0x0e17, 0x0e18, 0x0e19, 0x0e1a, 0x0e1b, 0x0e1c, 0x0e1d, 0x0e1e, 0x0e1f,
+ 0x0e20, 0x0e21, 0x0e22, 0x0e23, 0x0e24, 0x0e25, 0x0e26, 0x0e27, 0x0e28, 0x0e29, 0x0e2a, 0x0e2b, 0x0e2c, 0x0e2d, 0x0e2e, 0x0e2f,
+ 0x0e30, 0x0e31, 0x0e32, 0x0e33, 0x0e34, 0x0e36, 0x0e36, 0x0e37, 0x0e38, 0x0e39, 0x0e3a, 0x0000, 0x0000, 0x0000, 0x0000, 0x0e3f,
+ 0x0e40, 0x0e41, 0x0e42, 0x0e43, 0x0e44, 0x0e45, 0x0e46, 0x0e47, 0x0e48, 0x0e49, 0x0e4a, 0x0e4b, 0x0e4c, 0x0e4d, 0x0e4e, 0x0e4f,
+ 0x0e50, 0x0e51, 0x0e52, 0x0e53, 0x0e54, 0x0e55, 0x0e56, 0x0e57, 0x0e58, 0x0e59, 0x0e5a, 0x0e5b, 0x0000, 0x0000, 0x0000, 0x0000
+};
+
+static const unsigned short int iso_8859_13[] = {// Latin alphabet No. 7
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x00a0, 0x201d, 0x00a2, 0x00a3, 0x00a4, 0x201e, 0x00a6, 0x00a7, 0x00d8, 0x00a9, 0x0156, 0x00ab, 0x00ac, 0x00ad, 0x00ae, 0x00c6,
+ 0x00b0, 0x00b1, 0x00b2, 0x00b3, 0x201c, 0x00b5, 0x00b6, 0x00b7, 0x00f8, 0x00b9, 0x0157, 0x00bb, 0x00bc, 0x00bd, 0x00be, 0x00e6,
+ 0x0104, 0x012e, 0x0100, 0x0106, 0x00c4, 0x00c5, 0x0118, 0x0112, 0x010c, 0x00c9, 0x0179, 0x0116, 0x0122, 0x0136, 0x012a, 0x013b,
+ 0x0160, 0x0143, 0x0145, 0x00d3, 0x014c, 0x00d5, 0x00d6, 0x00d7, 0x0172, 0x0141, 0x015a, 0x016a, 0x00dc, 0x017b, 0x017d, 0x00df,
+ 0x0105, 0x012f, 0x0101, 0x0107, 0x00e4, 0x00e5, 0x0119, 0x0113, 0x010d, 0x00e9, 0x017a, 0x0117, 0x0123, 0x0137, 0x012b, 0x013c,
+ 0x0161, 0x0144, 0x0146, 0x00f3, 0x014d, 0x00f5, 0x00f6, 0x00f7, 0x0173, 0x0142, 0x015b, 0x016b, 0x00fc, 0x017c, 0x017e, 0x2019
+};
+
+static const unsigned short int iso_8859_14[] = {// Latin alphabet No. 8 (Celtic)
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x00a0, 0x1e02, 0x1e03, 0x00a3, 0x010a, 0x010b, 0x1e0a, 0x00a7, 0x1e80, 0x00a9, 0x1e82, 0x1e0b, 0x1ef2, 0x00ad, 0x00ae, 0x0178,
+ 0x1e1e, 0x1e1f, 0x0120, 0x0121, 0x1e40, 0x1e41, 0x00b6, 0x1e56, 0x1e81, 0x1e57, 0x1e83, 0x1e60, 0x1ef3, 0x1e84, 0x1e85, 0x1e61,
+ 0x00c0, 0x00c1, 0x00c2, 0x00c3, 0x00c4, 0x00c5, 0x00c6, 0x00c7, 0x00c8, 0x00c9, 0x00ca, 0x00cb, 0x00cc, 0x00cd, 0x00ce, 0x00cf,
+ 0x0174, 0x00d1, 0x00d2, 0x00d3, 0x00d4, 0x00d5, 0x00d6, 0x1e6a, 0x00d8, 0x00d9, 0x00da, 0x00db, 0x00dc, 0x00dd, 0x0176, 0x00df,
+ 0x00e0, 0x00e1, 0x00e2, 0x00e3, 0x00e4, 0x00e5, 0x00e6, 0x00e7, 0x00e8, 0x00e9, 0x00ea, 0x00eb, 0x00ec, 0x00ed, 0x00ee, 0x00ef,
+ 0x0175, 0x00f1, 0x00f2, 0x00f3, 0x00f4, 0x00f5, 0x00f6, 0x1e6b, 0x00f8, 0x00f9, 0x00fa, 0x00fb, 0x00fc, 0x00fd, 0x0177, 0x00ff
+};
+
+static const unsigned short int iso_8859_15[] = {// Latin alphabet No. 9
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x00a0, 0x00a1, 0x00a2, 0x00a3, 0x20ac, 0x00a5, 0x0160, 0x00a7, 0x0161, 0x00a9, 0x00aa, 0x00ab, 0x00ac, 0x00ad, 0x00ae, 0x00af,
+ 0x00b0, 0x00b1, 0x00b2, 0x00b3, 0x017d, 0x00b5, 0x00b6, 0x00b7, 0x017e, 0x00b9, 0x00ba, 0x00bb, 0x0152, 0x0153, 0x0178, 0x00bf,
+ 0x00c0, 0x00c1, 0x00c2, 0x00c3, 0x00c4, 0x00c5, 0x00c6, 0x00c7, 0x00c8, 0x00c9, 0x00ca, 0x00cb, 0x00cc, 0x00cd, 0x00ce, 0x00cf,
+ 0x00d0, 0x00d1, 0x00d2, 0x00d3, 0x00d4, 0x00d5, 0x00d6, 0x00d7, 0x00d8, 0x00d9, 0x00da, 0x00db, 0x00dc, 0x00dd, 0x00de, 0x00df,
+ 0x00e0, 0x00e1, 0x00e2, 0x00e3, 0x00e4, 0x00e5, 0x00e6, 0x00e7, 0x00e8, 0x00e9, 0x00ea, 0x00eb, 0x00ec, 0x00ed, 0x00ee, 0x00ef,
+ 0x00f0, 0x00f1, 0x00f2, 0x00f3, 0x00f4, 0x00f5, 0x00f6, 0x00f7, 0x00f8, 0x00f9, 0x00fa, 0x00fb, 0x00fc, 0x00fd, 0x00fe, 0x00ff
+};
+
+static const unsigned short int iso_8859_16[] = {// Latin alphabet No. 10
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x00a0, 0x0104, 0x0105, 0x0141, 0x20ac, 0x201e, 0x0160, 0x00a7, 0x0161, 0x00a9, 0x0218, 0x00ab, 0x0179, 0x00ad, 0x017a, 0x017b,
+ 0x00b0, 0x00b1, 0x010c, 0x0142, 0x017d, 0x201d, 0x00b6, 0x00b7, 0x017e, 0x010d, 0x0219, 0x00bb, 0x0152, 0x0153, 0x0178, 0x017c,
+ 0x00c0, 0x00c1, 0x00c2, 0x0102, 0x00c4, 0x0106, 0x00c6, 0x00c7, 0x00c8, 0x00c9, 0x00ca, 0x00cb, 0x00cc, 0x00cd, 0x00ce, 0x00cf,
+ 0x00e0, 0x00e1, 0x00e2, 0x0103, 0x00e4, 0x0107, 0x00e6, 0x00e7, 0x00e8, 0x00e9, 0x00ea, 0x00eb, 0x00ec, 0x00ed, 0x00ee, 0x00ef,
+ 0x0111, 0x0144, 0x00f2, 0x00f3, 0x00f4, 0x0151, 0x00f6, 0x015b, 0x0171, 0x00f9, 0x00fa, 0x00fb, 0x00fc, 0x0119, 0x021b, 0x00ff
+};
+
+static const unsigned short int windows_1250[] = {
+ 0x20ac, 0x0000, 0x201a, 0x0000, 0x201e, 0x2026, 0x2020, 0x2021, 0x0000, 0x2030, 0x0160, 0x2039, 0x015a, 0x0164, 0x017d, 0x0179,
+ 0x0000, 0x2018, 0x2019, 0x201c, 0x201d, 0x2022, 0x2013, 0x2014, 0x0000, 0x2122, 0x0161, 0x203a, 0x015b, 0x0165, 0x017e, 0x017a,
+ 0x00a0, 0x02c7, 0x02db, 0x0141, 0x00a4, 0x0104, 0x00a6, 0x00a7, 0x00a8, 0x00a9, 0x015e, 0x00ab, 0x00ac, 0x00ad, 0x00ae, 0x017b,
+ 0x00b0, 0x00b1, 0x02db, 0x0142, 0x00b4, 0x00b5, 0x00b6, 0x00b7, 0x00b8, 0x0105, 0x015f, 0x00bb, 0x013d, 0x02dd, 0x013e, 0x017c,
+ 0x0154, 0x00c1, 0x00c2, 0x0102, 0x00c4, 0x0139, 0x0106, 0x00c7, 0x010c, 0x00c9, 0x0118, 0x00cb, 0x011a, 0x00cd, 0x00ce, 0x010e,
+ 0x0110, 0x0143, 0x0147, 0x00d3, 0x00d4, 0x0150, 0x00d6, 0x00d7, 0x0158, 0x016e, 0x00da, 0x0170, 0x00dc, 0x00dd, 0x0162, 0x00df,
+ 0x0155, 0x00e1, 0x00e2, 0x0103, 0x00e4, 0x013a, 0x0107, 0x00e7, 0x010d, 0x00e9, 0x0119, 0x00eb, 0x011b, 0x00ed, 0x00ee, 0x010f,
+ 0x0111, 0x0144, 0x0148, 0x00f3, 0x00f4, 0x0151, 0x00f6, 0x00f7, 0x0159, 0x016f, 0x00fa, 0x0171, 0x00fc, 0x00fd, 0x0163, 0x02d9
+};
+
+static const unsigned short int windows_1251[] = {
+ 0x0402, 0x0403, 0x201a, 0x0453, 0x201e, 0x2026, 0x2020, 0x2021, 0x20ac, 0x2030, 0x0409, 0x2039, 0x040a, 0x040c, 0x040b, 0x040f,
+ 0x0452, 0x2018, 0x2019, 0x201c, 0x201d, 0x2022, 0x2013, 0x2014, 0x0000, 0x2122, 0x0459, 0x203a, 0x045a, 0x045c, 0x045b, 0x045f,
+ 0x00a0, 0x040e, 0x045e, 0x0408, 0x00a4, 0x0490, 0x00a6, 0x00a7, 0x0401, 0x00a9, 0x0404, 0x00ab, 0x00ac, 0x00ad, 0x00ae, 0x0407,
+ 0x00b0, 0x00b1, 0x0406, 0x0456, 0x0491, 0x00b5, 0x00b6, 0x00b7, 0x0451, 0x2116, 0x0454, 0x00bb, 0x0458, 0x0405, 0x0455, 0x0457,
+ 0x0410, 0x0411, 0x0412, 0x0413, 0x0414, 0x0415, 0x0416, 0x0417, 0x0418, 0x0419, 0x041a, 0x041b, 0x041c, 0x041d, 0x041e, 0x041f,
+ 0x0420, 0x0421, 0x0422, 0x0423, 0x0424, 0x0425, 0x0426, 0x0427, 0x0428, 0x0429, 0x042a, 0x042b, 0x042c, 0x042d, 0x042e, 0x042f,
+ 0x0430, 0x0431, 0x0432, 0x0433, 0x0434, 0x0435, 0x0436, 0x0437, 0x0438, 0x0439, 0x043a, 0x043b, 0x043c, 0x043d, 0x043e, 0x043f,
+ 0x0440, 0x0441, 0x0442, 0x0443, 0x0444, 0x0445, 0x0446, 0x0447, 0x0448, 0x0449, 0x044a, 0x044b, 0x044c, 0x044d, 0x044e, 0x044f
+};
+
+static const unsigned short int windows_1252[] = {
+ 0x20ac, 0x0000, 0x201a, 0x0192, 0x201e, 0x2026, 0x2020, 0x2021, 0x02c6, 0x2030, 0x0160, 0x2039, 0x0152, 0x0000, 0x017d, 0x0000,
+ 0x0000, 0x2018, 0x2019, 0x201c, 0x201d, 0x2022, 0x2013, 0x2014, 0x02dc, 0x2122, 0x0161, 0x203a, 0x0153, 0x0000, 0x017e, 0x0178,
+ 0x00a0, 0x00a1, 0x00a2, 0x00a3, 0x00a4, 0x00a5, 0x00a6, 0x00a7, 0x00a8, 0x00a9, 0x00aa, 0x00ab, 0x00ac, 0x00ad, 0x00ae, 0x00af,
+ 0x00b0, 0x00b1, 0x00b2, 0x00b3, 0x00b4, 0x00b5, 0x00b6, 0x00b7, 0x00b8, 0x00b9, 0x00ba, 0x00bb, 0x00bc, 0x00bd, 0x00be, 0x00bf,
+ 0x00c0, 0x00c1, 0x00c2, 0x00c3, 0x00c4, 0x00c5, 0x00c6, 0x00c7, 0x00c8, 0x00c9, 0x00ca, 0x00cb, 0x00cc, 0x00cd, 0x00ce, 0x00cf,
+ 0x00d0, 0x00d1, 0x00d2, 0x00d3, 0x00d4, 0x00d5, 0x00d6, 0x00d7, 0x00d8, 0x00d9, 0x00da, 0x00db, 0x00dc, 0x00dd, 0x00de, 0x00df,
+ 0x00e0, 0x00e1, 0x00e2, 0x00e3, 0x00e4, 0x00e5, 0x00e6, 0x00e7, 0x00e8, 0x00e9, 0x00ea, 0x00eb, 0x00ec, 0x00ed, 0x00ee, 0x00ef,
+ 0x00f0, 0x00f1, 0x00f2, 0x00f3, 0x00f4, 0x00f5, 0x00f6, 0x00f7, 0x00f8, 0x00f9, 0x00fa, 0x00fb, 0x00fc, 0x00fd, 0x00fe, 0x00ff
+};
+
+static const unsigned short int windows_1256[] = {
+ 0x20ac, 0x067e, 0x201a, 0x0192, 0x201e, 0x2026, 0x2020, 0x2021, 0x02c6, 0x2030, 0x0679, 0x2039, 0x0152, 0x0686, 0x0698, 0x0688,
+ 0x06af, 0x2018, 0x2019, 0x201c, 0x201d, 0x2022, 0x2013, 0x2014, 0x06a9, 0x2122, 0x0691, 0x203a, 0x0153, 0x200c, 0x200d, 0x06ba,
+ 0x00a0, 0x060c, 0x00a2, 0x00a3, 0x00a4, 0x00a5, 0x00a6, 0x00a7, 0x00a8, 0x00a9, 0x06be, 0x00ab, 0x00ac, 0x00ad, 0x00ae, 0x00af,
+ 0x00b0, 0x00b1, 0x00b2, 0x00b3, 0x00b4, 0x00b5, 0x00b6, 0x00b7, 0x00b8, 0x00b9, 0x061b, 0x00bb, 0x00bc, 0x00bd, 0x00be, 0x061f,
+ 0x06c1, 0x0621, 0x0622, 0x0623, 0x0624, 0x0625, 0x0626, 0x0627, 0x0628, 0x0629, 0x062a, 0x062b, 0x062c, 0x062d, 0x062e, 0x062f,
+ 0x0630, 0x0631, 0x0632, 0x0633, 0x0634, 0x0635, 0x0636, 0x00d7, 0x0637, 0x0638, 0x0639, 0x063a, 0x0640, 0x0641, 0x0642, 0x0643,
+ 0x00e0, 0x0644, 0x00e2, 0x0645, 0x0646, 0x0647, 0x0648, 0x00e7, 0x00e8, 0x00e9, 0x00ea, 0x00eb, 0x0649, 0x064a, 0x00ee, 0x00ef,
+ 0x064b, 0x064c, 0x064d, 0x064e, 0x00f4, 0x064f, 0x0650, 0x00f7, 0x0651, 0x00f9, 0x0652, 0x00fb, 0x00fc, 0x200e, 0x200f, 0x06d2
+};
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif /* ECI_H */
+
diff --git a/3rdparty/zint-2.6.1/backend/emf.c b/3rdparty/zint-2.6.1/backend/emf.c
new file mode 100644
index 0000000..94c1425
--- /dev/null
+++ b/3rdparty/zint-2.6.1/backend/emf.c
@@ -0,0 +1,1222 @@
+/* emf.c - Support for Microsoft Enhanced Metafile Format
+
+ libzint - the open source barcode library
+ Copyright (C) 2016-2017 Robin Stuart
+
+ Redistribution and use in source and binary forms, with or without
+ modification, are permitted provided that the following conditions
+ are met:
+
+ 1. Redistributions of source code must retain the above copyright
+ notice, this list of conditions and the following disclaimer.
+ 2. Redistributions in binary form must reproduce the above copyright
+ notice, this list of conditions and the following disclaimer in the
+ documentation and/or other materials provided with the distribution.
+ 3. Neither the name of the project nor the names of its contributors
+ may be used to endorse or promote products derived from this software
+ without specific prior written permission.
+
+ THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND
+ ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+ ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE
+ FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+ DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
+ OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
+ HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
+ LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
+ OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+ SUCH DAMAGE.
+ */
+
+/* Developed according to [MS-EMF] - v20160714, Released July 14, 2016
+ * and [MS-WMF] - v20160714, Released July 14, 2016 */
+
+#include
+#include
+#include
+#include
+#include "common.h"
+#include "emf.h"
+
+#define SSET "0123456789ABCDEF"
+
+int count_rectangles(struct zint_symbol *symbol) {
+ int rectangles = 0;
+ int this_row;
+ int latch, i;
+
+ if ((symbol->symbology != BARCODE_MAXICODE) &&
+ ((symbol->output_options & BARCODE_DOTTY_MODE) == 0)) {
+ for(this_row = 0; this_row < symbol->rows; this_row++) {
+ latch = 0;
+ for(i = 0; i < symbol->width; i++) {
+ if ((module_is_set(symbol, this_row, i)) && (latch == 0)) {
+ latch = 1;
+ rectangles++;
+ }
+
+ if ((!(module_is_set(symbol, this_row, i))) && (latch == 1)) {
+ latch = 0;
+ }
+ }
+ }
+ }
+
+ return rectangles;
+}
+
+int count_circles(struct zint_symbol *symbol) {
+ int circles = 0;
+ int this_row;
+ int i;
+
+ if ((symbol->symbology != BARCODE_MAXICODE) &&
+ ((symbol->output_options & BARCODE_DOTTY_MODE) != 0)) {
+ for(this_row = 0; this_row < symbol->rows; this_row++) {
+ for(i = 0; i < symbol->width; i++) {
+ if (module_is_set(symbol, this_row, i)) {
+ circles++;
+ }
+ }
+ }
+ }
+
+ return circles;
+}
+
+int count_hexagons(struct zint_symbol *symbol) {
+ int hexagons = 0;
+ int this_row;
+ int i;
+
+ if (symbol->symbology == BARCODE_MAXICODE) {
+ for(this_row = 0; this_row < symbol->rows; this_row++) {
+ for(i = 0; i < symbol->width; i++) {
+ if (module_is_set(symbol, this_row, i)) {
+ hexagons++;
+ }
+ }
+ }
+ }
+
+ return hexagons;
+}
+
+void utfle_copy(unsigned char *output, unsigned char *input, int length) {
+ int i;
+ int o;
+
+ /* Convert UTF-8 to UTF-16LE - only needs to handle characters <= U+00FF */
+ i = 0;
+ o = 0;
+ do {
+ if(input[i] <= 0x7f) {
+ /* 1 byte mode (7-bit ASCII) */
+ output[o] = input[i];
+ output[o + 1] = 0x00;
+ o += 2;
+ i++;
+ } else {
+ /* 2 byte mode */
+ output[o] = ((input[i] & 0x1f) << 6) + (input[i + 1] & 0x3f);
+ output[o + 1] = 0x00;
+ o += 2;
+ i += 2;
+ }
+ } while (i < length);
+}
+
+int bump_up(int input) {
+ /* Strings length must be a multiple of 4 bytes */
+ if ((input % 2) == 1) {
+ input++;
+ }
+ return input;
+}
+
+int emf_plot(struct zint_symbol *symbol) {
+ int i, block_width, latch, this_row;
+ float large_bar_height, preset_height, row_height, row_posn;
+ FILE *emf_file;
+ int fgred, fggrn, fgblu, bgred, bggrn, bgblu;
+ int error_number = 0;
+ int textoffset, xoffset, yoffset, textdone;
+ int large_bar_count, comp_offset;
+ float scaler = symbol->scale * 10;
+ int rectangle_count, this_rectangle;
+ int circle_count, this_circle;
+ int hexagon_count, this_hexagon;
+ int bytecount, recordcount;
+ int upcean = 0;
+ unsigned char regw[7];
+ unsigned char regx[7];
+ unsigned char regy[7];
+ unsigned char regz[7];
+ unsigned char output_buffer[12];
+ uint32_t dx;
+
+ emr_header_t emr_header;
+ emr_eof_t emr_eof;
+ emr_createbrushindirect_t emr_createbrushindirect_fg;
+ emr_createbrushindirect_t emr_createbrushindirect_bg;
+ emr_selectobject_t emr_selectobject_fgbrush;
+ emr_selectobject_t emr_selectobject_bgbrush;
+ emr_createpen_t emr_createpen;
+ emr_selectobject_t emr_selectobject_pen;
+ emr_rectangle_t background;
+ emr_ellipse_t bullseye[6];
+ emr_extcreatefontindirectw_t emr_extcreatefontindirectw;
+ emr_selectobject_t emr_selectobject_font;
+ emr_exttextoutw_t emr_exttextoutw[6];
+ emr_extcreatefontindirectw_t emr_extcreatefontindirectw_big;
+ emr_selectobject_t emr_selectobject_font_big;
+
+ box_t box;
+
+#ifndef _MSC_VER
+ unsigned char local_text[bump_up(ustrlen(symbol->text) + 1)];
+ unsigned char string_buffer[2 * bump_up(ustrlen(symbol->text) + 1)];
+#else
+ unsigned char* local_text;
+ unsigned char* string_buffer;
+ emr_rectangle_t *rectangle, *row_binding;
+ emr_ellipse_t* circle;
+ emr_polygon_t* hexagon;
+ local_text = (unsigned char*) _alloca(bump_up(ustrlen(symbol->text) + 1) * sizeof (unsigned char));
+ string_buffer = (unsigned char*) _alloca(2 * bump_up(ustrlen(symbol->text) + 1) * sizeof (unsigned char));
+#endif
+
+ row_height = 0;
+ textdone = 0;
+ comp_offset = 0;
+ this_rectangle = 0;
+ this_circle = 0;
+ this_hexagon = 0;
+ dx = 0;
+ latch = 0;
+
+ for(i = 0; i < 6; i++) {
+ regw[i] = '\0';
+ regx[i] = '\0';
+ regy[i] = '\0';
+ regz[i] = '\0';
+ }
+
+ if (symbol->show_hrt != 0) {
+ /* Copy text from symbol */
+ ustrcpy(local_text, symbol->text);
+ } else {
+ /* No text needed */
+ switch (symbol->symbology) {
+ case BARCODE_EANX:
+ case BARCODE_EANX_CC:
+ case BARCODE_ISBNX:
+ case BARCODE_UPCA:
+ case BARCODE_UPCE:
+ case BARCODE_UPCA_CC:
+ case BARCODE_UPCE_CC:
+ /* For these symbols use dummy text to ensure formatting is done
+ * properly even if no text is required */
+ for (i = 0; i < ustrlen(symbol->text); i++) {
+ if (symbol->text[i] == '+') {
+ local_text[i] = '+';
+ } else {
+ local_text[i] = ' ';
+ }
+ local_text[ustrlen(symbol->text)] = '\0';
+ }
+ break;
+ default:
+ /* For everything else, just remove the text */
+ local_text[0] = '\0';
+ break;
+ }
+ }
+
+ /* sort out colour options */
+ to_upper((unsigned char*) symbol->fgcolour);
+ to_upper((unsigned char*) symbol->bgcolour);
+
+ if (strlen(symbol->fgcolour) != 6) {
+ strcpy(symbol->errtxt, "641: Malformed foreground colour target");
+ return ZINT_ERROR_INVALID_OPTION;
+ }
+
+ if (strlen(symbol->bgcolour) != 6) {
+ strcpy(symbol->errtxt, "642: Malformed background colour target");
+ return ZINT_ERROR_INVALID_OPTION;
+ }
+
+ fgred = (16 * ctoi(symbol->fgcolour[0])) + ctoi(symbol->fgcolour[1]);
+ fggrn = (16 * ctoi(symbol->fgcolour[2])) + ctoi(symbol->fgcolour[3]);
+ fgblu = (16 * ctoi(symbol->fgcolour[4])) + ctoi(symbol->fgcolour[5]);
+ bgred = (16 * ctoi(symbol->bgcolour[0])) + ctoi(symbol->bgcolour[1]);
+ bggrn = (16 * ctoi(symbol->bgcolour[2])) + ctoi(symbol->bgcolour[3]);
+ bgblu = (16 * ctoi(symbol->bgcolour[4])) + ctoi(symbol->bgcolour[5]);
+
+ if (symbol->height == 0) {
+ symbol->height = 50;
+ }
+
+ large_bar_count = 0;
+ preset_height = 0.0;
+ for (i = 0; i < symbol->rows; i++) {
+ preset_height += symbol->row_height[i];
+ if (symbol->row_height[i] == 0) {
+ large_bar_count++;
+ }
+ }
+ large_bar_height = (symbol->height - preset_height) / large_bar_count;
+
+ if (large_bar_count == 0) {
+ symbol->height = preset_height;
+ }
+
+ while (!(module_is_set(symbol, symbol->rows - 1, comp_offset))) {
+ comp_offset++;
+ }
+
+ /* Certain symbols need whitespace otherwise characters get chopped off the sides */
+ if ((((symbol->symbology == BARCODE_EANX) && (symbol->rows == 1)) || (symbol->symbology == BARCODE_EANX_CC))
+ || (symbol->symbology == BARCODE_ISBNX)) {
+ switch (ustrlen(local_text)) {
+ case 13: /* EAN 13 */
+ case 16:
+ case 19:
+ if (symbol->whitespace_width == 0) {
+ symbol->whitespace_width = 10;
+ }
+ break;
+ }
+ upcean = 1;
+ }
+
+ if (((symbol->symbology == BARCODE_UPCA) && (symbol->rows == 1)) || (symbol->symbology == BARCODE_UPCA_CC)) {
+ if (symbol->whitespace_width == 0) {
+ symbol->whitespace_width = 10;
+ }
+ upcean = 1;
+ }
+
+ if (((symbol->symbology == BARCODE_UPCE) && (symbol->rows == 1)) || (symbol->symbology == BARCODE_UPCE_CC)) {
+ if (symbol->whitespace_width == 0) {
+ symbol->whitespace_width = 10;
+ }
+ upcean = 1;
+ }
+
+ if (ustrlen(local_text) != 0) {
+ textoffset = 9;
+ } else {
+ textoffset = 0;
+ }
+ xoffset = symbol->border_width + symbol->whitespace_width;
+ yoffset = symbol->border_width;
+
+ rectangle_count = count_rectangles(symbol);
+ circle_count = count_circles(symbol);
+ hexagon_count = count_hexagons(symbol);
+
+#ifndef _MSC_VER
+ emr_rectangle_t rectangle[rectangle_count];
+ emr_rectangle_t row_binding[symbol->rows - 1];
+ emr_ellipse_t circle[circle_count];
+ emr_polygon_t hexagon[hexagon_count];
+#else
+ rectangle = (emr_rectangle_t*) _alloca(rectangle_count*sizeof(emr_rectangle_t));
+ row_binding = (emr_rectangle_t*) _alloca((symbol->rows - 1)*sizeof(emr_rectangle_t));
+ circle = (emr_ellipse_t*) _alloca(circle_count*sizeof(emr_ellipse_t));
+ hexagon = (emr_polygon_t*) _alloca(hexagon_count*sizeof(emr_polygon_t));
+#endif
+
+ /* Header */
+ emr_header.type = 0x00000001; // EMR_HEADER
+ emr_header.size = 88; // Assuming no additional data in header
+ emr_header.emf_header.bounds.left = 0;
+ if (symbol->symbology != BARCODE_MAXICODE) {
+ emr_header.emf_header.bounds.right = ceil((symbol->width + xoffset + xoffset) * scaler);
+ emr_header.emf_header.bounds.bottom = ceil((symbol->height + textoffset + yoffset + yoffset) * scaler);
+ } else {
+ emr_header.emf_header.bounds.right = ceil((74.0F + xoffset + xoffset) * scaler);
+ emr_header.emf_header.bounds.bottom = ceil((72.0F + yoffset + yoffset) * scaler);
+ }
+ emr_header.emf_header.bounds.top = 0;
+ emr_header.emf_header.frame.left = 0;
+ emr_header.emf_header.frame.right = emr_header.emf_header.bounds.right * 30;
+ emr_header.emf_header.frame.top = 0;
+ emr_header.emf_header.frame.bottom = emr_header.emf_header.bounds.bottom * 30;
+ emr_header.emf_header.record_signature = 0x464d4520; // ENHMETA_SIGNATURE
+ emr_header.emf_header.version = 0x00010000;;
+ emr_header.emf_header.handles = 6; // Number of graphics objects
+ emr_header.emf_header.reserved = 0x0000;
+ emr_header.emf_header.n_description = 0;
+ emr_header.emf_header.off_description = 0;
+ emr_header.emf_header.n_pal_entries = 0;
+ emr_header.emf_header.device.cx = 1000;
+ emr_header.emf_header.device.cy = 1000;
+ emr_header.emf_header.millimeters.cx = 300;
+ emr_header.emf_header.millimeters.cy = 300;
+ bytecount = 88;
+ recordcount = 1;
+
+ /* Create Brushes */
+ emr_createbrushindirect_fg.type = 0x00000027; // EMR_CREATEBRUSHINDIRECT
+ emr_createbrushindirect_fg.size = 24;
+ emr_createbrushindirect_fg.ih_brush = 1;
+ emr_createbrushindirect_fg.log_brush.brush_style = 0x0000; // BS_SOLID
+ emr_createbrushindirect_fg.log_brush.color.red = fgred;
+ emr_createbrushindirect_fg.log_brush.color.green = fggrn;
+ emr_createbrushindirect_fg.log_brush.color.blue = fgblu;
+ emr_createbrushindirect_fg.log_brush.color.reserved = 0;
+ emr_createbrushindirect_fg.log_brush.brush_hatch = 0; // ignored
+ bytecount += 24;
+ recordcount++;
+
+ emr_createbrushindirect_bg.type = 0x00000027; // EMR_CREATEBRUSHINDIRECT
+ emr_createbrushindirect_bg.size = 24;
+ emr_createbrushindirect_bg.ih_brush = 2;
+ emr_createbrushindirect_bg.log_brush.brush_style = 0x0000; // BS_SOLID
+ emr_createbrushindirect_bg.log_brush.color.red = bgred;
+ emr_createbrushindirect_bg.log_brush.color.green = bggrn;
+ emr_createbrushindirect_bg.log_brush.color.blue = bgblu;
+ emr_createbrushindirect_bg.log_brush.color.reserved = 0;
+ emr_createbrushindirect_bg.log_brush.brush_hatch = 0; // ignored
+ bytecount += 24;
+ recordcount++;
+
+ emr_selectobject_fgbrush.type = 0x00000025; // EMR_SELECTOBJECT
+ emr_selectobject_fgbrush.size = 12;
+ emr_selectobject_fgbrush.ih_object = 1;
+ bytecount += 12;
+ recordcount++;
+
+ emr_selectobject_bgbrush.type = 0x00000025; // EMR_SELECTOBJECT
+ emr_selectobject_bgbrush.size = 12;
+ emr_selectobject_bgbrush.ih_object = 2;
+ bytecount += 12;
+ recordcount++;
+
+ /* Create Pens */
+ emr_createpen.type = 0x00000026; // EMR_CREATEPEN
+ emr_createpen.size = 28;
+ emr_createpen.ih_pen = 3;
+ emr_createpen.log_pen.pen_style = 0x00000005; // PS_NULL
+ emr_createpen.log_pen.width.x = 1;
+ emr_createpen.log_pen.width.y = 0; // ignored
+ emr_createpen.log_pen.color_ref.red = 0;
+ emr_createpen.log_pen.color_ref.green = 0;
+ emr_createpen.log_pen.color_ref.blue = 0;
+ emr_createpen.log_pen.color_ref.reserved = 0;
+ bytecount += 28;
+ recordcount++;
+
+ emr_selectobject_pen.type = 0x00000025; // EMR_SELECTOBJECT
+ emr_selectobject_pen.size = 12;
+ emr_selectobject_pen.ih_object = 3;
+ bytecount += 12;
+ recordcount++;
+
+ /* Create font records */
+ if ((symbol->show_hrt != 0) && (ustrlen(local_text) != 0)) {
+ emr_extcreatefontindirectw.type = 0x00000052; // EMR_EXTCREATEFONTINDIRECTW
+ emr_extcreatefontindirectw.size = 104;
+ emr_extcreatefontindirectw.ih_fonts = 4;
+ emr_extcreatefontindirectw.elw.height = (8 * scaler);
+ emr_extcreatefontindirectw.elw.width = 0; // automatic
+ emr_extcreatefontindirectw.elw.escapement = 0;
+ emr_extcreatefontindirectw.elw.orientation = 0;
+ emr_extcreatefontindirectw.elw.weight = 400;
+ emr_extcreatefontindirectw.elw.italic = 0x00;
+ emr_extcreatefontindirectw.elw.underline = 0x00;
+ emr_extcreatefontindirectw.elw.strike_out = 0x00;
+ emr_extcreatefontindirectw.elw.char_set = 0x01;
+ emr_extcreatefontindirectw.elw.out_precision = 0x00; // OUT_DEFAULT_PRECIS
+ emr_extcreatefontindirectw.elw.clip_precision = 0x00; // CLIP_DEFAULT_PRECIS
+ emr_extcreatefontindirectw.elw.quality = 0x00;
+ emr_extcreatefontindirectw.elw.pitch_and_family = 0x00;
+ for(i = 0; i < 64; i++) {
+ emr_extcreatefontindirectw.elw.facename[i] = '\0';
+ }
+ utfle_copy(emr_extcreatefontindirectw.elw.facename, (unsigned char*) "sans-serif", 10);
+
+ emr_selectobject_font.type = 0x00000025; // EMR_SELECTOBJECT
+ emr_selectobject_font.size = 12;
+ emr_selectobject_font.ih_object = 4;
+
+ if (!((symbol->symbology == BARCODE_EANX) || (symbol->symbology == BARCODE_EANX_CC) || (symbol->symbology == BARCODE_ISBNX))) {
+ bytecount += 104;
+ recordcount++;
+ bytecount += 12;
+ recordcount++;
+ }
+
+ if (upcean) {
+ emr_extcreatefontindirectw_big.type = 0x00000052; // EMR_EXTCREATEFONTINDIRECTW
+ emr_extcreatefontindirectw_big.size = 104;
+ if (!((symbol->symbology == BARCODE_EANX) || (symbol->symbology == BARCODE_EANX_CC) || (symbol->symbology == BARCODE_ISBNX))) {
+ emr_extcreatefontindirectw_big.ih_fonts = 4;
+ } else {
+ emr_extcreatefontindirectw_big.ih_fonts = 5;
+ }
+ emr_extcreatefontindirectw_big.elw.height = (11 * scaler);
+ emr_extcreatefontindirectw_big.elw.width = 0; // automatic
+ emr_extcreatefontindirectw_big.elw.escapement = 0;
+ emr_extcreatefontindirectw_big.elw.orientation = 0;
+ emr_extcreatefontindirectw_big.elw.weight = 400;
+ emr_extcreatefontindirectw_big.elw.italic = 0x00;
+ emr_extcreatefontindirectw_big.elw.underline = 0x00;
+ emr_extcreatefontindirectw_big.elw.strike_out = 0x00;
+ emr_extcreatefontindirectw_big.elw.char_set = 0x01;
+ emr_extcreatefontindirectw_big.elw.out_precision = 0x00; // OUT_DEFAULT_PRECIS
+ emr_extcreatefontindirectw_big.elw.clip_precision = 0x00; // CLIP_DEFAULT_PRECIS
+ emr_extcreatefontindirectw_big.elw.quality = 0x00;
+ emr_extcreatefontindirectw_big.elw.pitch_and_family = 0x00;
+ for(i = 0; i < 64; i++) {
+ emr_extcreatefontindirectw_big.elw.facename[i] = '\0';
+ }
+ utfle_copy(emr_extcreatefontindirectw_big.elw.facename, (unsigned char*) "sans-serif", 10);
+ bytecount += 104;
+ recordcount++;
+
+ emr_selectobject_font_big.type = 0x00000025; // EMR_SELECTOBJECT
+ emr_selectobject_font_big.size = 12;
+ emr_selectobject_font_big.ih_object = 5;
+ bytecount += 12;
+ recordcount++;
+ }
+ }
+
+ /* Text */
+ if ((symbol->show_hrt != 0) && (ustrlen(local_text) != 0)) {
+
+ if ((symbol->symbology == BARCODE_EANX) || (symbol->symbology == BARCODE_EANX_CC) || (symbol->symbology == BARCODE_ISBNX)) {
+ latch = ustrlen(local_text);
+ for(i = 0; i < ustrlen(local_text); i++) {
+ if (local_text[i] == '+') {
+ latch = i;
+ }
+ }
+ if (latch > 8) {
+ // EAN-13
+ for(i = 1; i <= 6; i++) {
+ regw[i - 1] = local_text[i];
+ regx[i - 1] = local_text[i + 6];
+ }
+ if (ustrlen(local_text) > latch) {
+ // With add-on
+ for (i = (latch + 1); i <= ustrlen(local_text); i++) {
+ regz[i - (latch + 1)] = local_text[i];
+ }
+ }
+ local_text[1] = '\0';
+ } else if (latch > 5) {
+ // EAN-8
+ for(i = 0; i <= 3; i++) {
+ regw[i] = local_text[i + 4];
+ }
+ if (ustrlen(local_text) > latch) {
+ // With add-on
+ for (i = (latch + 1); i <= ustrlen(local_text); i++) {
+ regz[i - (latch + 1)] = local_text[i];
+ }
+ }
+ local_text[4] = '\0';
+ }
+
+ }
+
+ if ((symbol->symbology == BARCODE_UPCA) || (symbol->symbology == BARCODE_UPCA_CC)) {
+ latch = ustrlen(local_text);
+ for(i = 0; i < ustrlen(local_text); i++) {
+ if (local_text[i] == '+') {
+ latch = i;
+ }
+ }
+ if (ustrlen(local_text) > latch) {
+ // With add-on
+ for (i = (latch + 1); i <= ustrlen(local_text); i++) {
+ regz[i - (latch + 1)] = local_text[i];
+ }
+ }
+ for(i = 1; i <= 5; i++) {
+ regw[i - 1] = local_text[i];
+ regx[i - 1] = local_text[i + 6];
+ }
+ regy[0] = local_text[11];
+ local_text[1] = '\0';
+ }
+
+ if ((symbol->symbology == BARCODE_UPCE) || (symbol->symbology == BARCODE_UPCE_CC)) {
+ latch = ustrlen(local_text);
+ for(i = 0; i < ustrlen(local_text); i++) {
+ if (local_text[i] == '+') {
+ latch = i;
+ }
+ }
+ if (ustrlen(local_text) > latch) {
+ // With add-on
+ for (i = (latch + 1); i <= ustrlen(local_text); i++) {
+ regz[i - (latch + 1)] = local_text[i];
+ }
+ }
+ for(i = 1; i <= 6; i++) {
+ regw[i - 1] = local_text[i];
+ }
+ regx[0] = local_text[7];
+ local_text[1] = '\0';
+ }
+
+ for(i = 0; i <= 5; i++) {
+ emr_exttextoutw[i].type = 0x00000054; // EMR_EXTTEXTOUTW
+ emr_exttextoutw[i].bounds.top = 0; // ignored
+ emr_exttextoutw[i].bounds.left = 0; // ignoredemr_header.emf_header.bytes +=
+ emr_exttextoutw[i].bounds.right = 0xffffffff; // ignored
+ emr_exttextoutw[i].bounds.bottom = 0xffffffff; // ignored
+ emr_exttextoutw[i].i_graphics_mode = 0x00000001; // GM_COMPATIBLE
+ emr_exttextoutw[i].ex_scale = 1.0;
+ emr_exttextoutw[i].ey_scale = 1.0;
+ emr_exttextoutw[i].w_emr_text.off_string = 76;
+ emr_exttextoutw[i].w_emr_text.options = 0;
+ emr_exttextoutw[i].w_emr_text.rectangle.top = 0;
+ emr_exttextoutw[i].w_emr_text.rectangle.left = 0;
+ emr_exttextoutw[i].w_emr_text.rectangle.right = 0xffffffff;
+ emr_exttextoutw[i].w_emr_text.rectangle.bottom = 0xffffffff;
+ if (i > 0) {
+ emr_exttextoutw[i].size = 76 + (6 * 6);
+ emr_exttextoutw[i].w_emr_text.off_dx = 76 + (2 * 6);
+ }
+ }
+
+ emr_exttextoutw[0].w_emr_text.chars = ustrlen(local_text);
+ emr_exttextoutw[0].size = 76 + (6 * bump_up(ustrlen(local_text) + 1));
+ emr_exttextoutw[0].w_emr_text.reference.x = (emr_header.emf_header.bounds.right - (ustrlen(local_text) * 5.3 * scaler)) / 2; // text left
+ emr_exttextoutw[0].w_emr_text.reference.y = emr_header.emf_header.bounds.bottom - (9 * scaler); // text top
+ emr_exttextoutw[0].w_emr_text.off_dx = 76 + (2 * bump_up(ustrlen(local_text) + 1));
+ for (i = 0; i < bump_up(ustrlen(local_text) + 1) * 2; i++) {
+ string_buffer[i] = '\0';
+ }
+ utfle_copy(string_buffer, local_text, ustrlen(local_text));
+ bytecount += 76 + (6 * bump_up(ustrlen(local_text) + 1));
+ recordcount++;
+
+ emr_exttextoutw[1].w_emr_text.chars = ustrlen(regw);
+ emr_exttextoutw[2].w_emr_text.chars = ustrlen(regx);
+ emr_exttextoutw[3].w_emr_text.chars = ustrlen(regy);
+ emr_exttextoutw[4].w_emr_text.chars = ustrlen(regz);
+
+ if ((symbol->symbology == BARCODE_EANX) || (symbol->symbology == BARCODE_EANX_CC) || (symbol->symbology == BARCODE_ISBNX)) {
+ if (latch > 8) {
+ /* EAN-13 */
+ emr_exttextoutw[0].w_emr_text.reference.x = (xoffset - 9) * scaler;
+ emr_exttextoutw[0].w_emr_text.reference.y = emr_header.emf_header.bounds.bottom - (9 * scaler);;
+ emr_exttextoutw[1].w_emr_text.reference.x = (8 + xoffset) * scaler;
+ emr_exttextoutw[1].w_emr_text.reference.y = emr_header.emf_header.bounds.bottom - (9 * scaler);;
+ emr_exttextoutw[2].w_emr_text.reference.x = (55 + xoffset) * scaler;
+ emr_exttextoutw[2].w_emr_text.reference.y = emr_header.emf_header.bounds.bottom - (9 * scaler);;
+ if (ustrlen(regz) > 2) {
+ emr_exttextoutw[4].w_emr_text.reference.x = (115 + xoffset) * scaler;
+ bytecount += 112;
+ recordcount++;
+ } else if (ustrlen(regz) != 0) {
+ emr_exttextoutw[4].w_emr_text.reference.x = (109 + xoffset) * scaler;
+ bytecount += 112;
+ recordcount++;
+ }
+ emr_exttextoutw[4].w_emr_text.reference.y = emr_header.emf_header.bounds.bottom - ((large_bar_height + 9) * scaler);
+ bytecount += 2 * 112;
+ recordcount += 2;
+ } else if (latch > 5) {
+ /* EAN-8 */
+ emr_exttextoutw[0].w_emr_text.reference.x = (7 + xoffset) * scaler;
+ emr_exttextoutw[0].w_emr_text.reference.y = emr_header.emf_header.bounds.bottom - (9 * scaler);;
+ emr_exttextoutw[1].w_emr_text.reference.x = (40 + xoffset) * scaler;
+ emr_exttextoutw[1].w_emr_text.reference.y = emr_header.emf_header.bounds.bottom - (9 * scaler);;
+ if (ustrlen(regz) > 2) {
+ emr_exttextoutw[4].w_emr_text.reference.x = (87 + xoffset) * scaler;
+ bytecount += 112;
+ recordcount++;
+ } else if (ustrlen(regz) != 0) {
+ emr_exttextoutw[4].w_emr_text.reference.x = (81 + xoffset) * scaler;
+ bytecount += 112;
+ recordcount++;
+ }
+ emr_exttextoutw[4].w_emr_text.reference.y = emr_header.emf_header.bounds.bottom - ((large_bar_height + 9) * scaler);
+ bytecount += 112;
+ recordcount++;
+ }
+ }
+
+ if ((symbol->symbology == BARCODE_UPCA) || (symbol->symbology == BARCODE_UPCA_CC)) {
+ emr_exttextoutw[0].w_emr_text.reference.x = (xoffset - 7) * scaler;
+ emr_exttextoutw[0].w_emr_text.reference.y = emr_header.emf_header.bounds.bottom - (9 * scaler);;
+ emr_exttextoutw[1].w_emr_text.reference.x = (14 + xoffset) * scaler;
+ emr_exttextoutw[1].w_emr_text.reference.y = emr_header.emf_header.bounds.bottom - (9 * scaler);;
+ emr_exttextoutw[2].w_emr_text.reference.x = (55 + xoffset) * scaler;
+ emr_exttextoutw[2].w_emr_text.reference.y = emr_header.emf_header.bounds.bottom - (9 * scaler);;
+ emr_exttextoutw[3].w_emr_text.reference.x = (98 + xoffset) * scaler;
+ emr_exttextoutw[3].w_emr_text.reference.y = emr_header.emf_header.bounds.bottom - (9 * scaler);;
+ if (ustrlen(regz) > 2) {
+ emr_exttextoutw[4].w_emr_text.reference.x = (117 + xoffset) * scaler;
+ bytecount += 112;
+ recordcount++;
+ } else if (ustrlen(regz) != 0) {
+ emr_exttextoutw[4].w_emr_text.reference.x = (111 + xoffset) * scaler;
+ bytecount += 112;
+ recordcount++;
+ }
+ emr_exttextoutw[4].w_emr_text.reference.y = emr_header.emf_header.bounds.bottom - ((large_bar_height + 9) * scaler);
+ bytecount += (3 * 112) + 12;
+ recordcount += 4;
+ }
+
+ if ((symbol->symbology == BARCODE_UPCE) || (symbol->symbology == BARCODE_UPCE_CC)) {
+ emr_exttextoutw[0].w_emr_text.reference.x = (xoffset - 7) * scaler;
+ emr_exttextoutw[0].w_emr_text.reference.y = emr_header.emf_header.bounds.bottom - (9 * scaler);;
+ emr_exttextoutw[1].w_emr_text.reference.x = (8 + xoffset) * scaler;
+ emr_exttextoutw[1].w_emr_text.reference.y = emr_header.emf_header.bounds.bottom - (9 * scaler);;
+ emr_exttextoutw[2].w_emr_text.reference.x = (53 + xoffset) * scaler;
+ emr_exttextoutw[2].w_emr_text.reference.y = emr_header.emf_header.bounds.bottom - (9 * scaler);;
+ if (ustrlen(regz) > 2) {
+ emr_exttextoutw[4].w_emr_text.reference.x = (71 + xoffset) * scaler;
+ bytecount += 112;
+ recordcount++;
+ } else if (ustrlen(regz) != 0) {
+ emr_exttextoutw[4].w_emr_text.reference.x = (65 + xoffset) * scaler;
+ bytecount += 112;
+ recordcount++;
+ }
+ emr_exttextoutw[4].w_emr_text.reference.y = emr_header.emf_header.bounds.bottom - ((large_bar_height + 9) * scaler);
+ bytecount += (2 * 112) + 12;
+ recordcount += 3;
+ }
+ }
+
+ /* Make background from a rectangle */
+ background.type = 0x0000002b; // EMR_RECTANGLE;
+ background.size = 24;
+ background.box.top = 0;
+ background.box.left = 0;
+ background.box.right = emr_header.emf_header.bounds.right;
+ background.box.bottom = emr_header.emf_header.bounds.bottom;
+ bytecount += 24;
+ recordcount++;
+
+ /* Make bind and box rectangles if needed */
+ if ((symbol->output_options & BARCODE_BIND) || (symbol->output_options & BARCODE_BOX)) {
+ box.top.type = 0x0000002b; // EMR_RECTANGLE;
+ box.top.size = 24;
+ box.top.box.top = 0;
+ box.top.box.bottom = symbol->border_width * scaler;
+ box.top.box.left = symbol->border_width * scaler;
+ box.top.box.right = emr_header.emf_header.bounds.right - (symbol->border_width * scaler);
+ bytecount += 24;
+ recordcount++;
+
+ box.bottom.type = 0x0000002b; // EMR_RECTANGLE;
+ box.bottom.size = 24;
+ box.bottom.box.top = emr_header.emf_header.bounds.bottom - ((symbol->border_width + textoffset) * scaler);
+ box.bottom.box.bottom = emr_header.emf_header.bounds.bottom - (textoffset * scaler);
+ box.bottom.box.left = symbol->border_width * scaler;
+ box.bottom.box.right = emr_header.emf_header.bounds.right - (symbol->border_width * scaler);
+ bytecount += 24;
+ recordcount++;
+
+ if (symbol->output_options & BARCODE_BOX) {
+ box.left.type = 0x0000002b; // EMR_RECTANGLE;
+ box.left.size = 24;
+ box.left.box.top = 0;
+ box.left.box.bottom = emr_header.emf_header.bounds.bottom - (textoffset * scaler);
+ box.left.box.left = 0;
+ box.left.box.right = symbol->border_width * scaler;
+ bytecount += 24;
+ recordcount++;
+
+ box.right.type = 0x0000002b; // EMR_RECTANGLE;
+ box.right.size = 24;
+ box.right.box.top = 0;
+ box.right.box.bottom = emr_header.emf_header.bounds.bottom - (textoffset * scaler);
+ box.right.box.left = emr_header.emf_header.bounds.right - (symbol->border_width * scaler);
+ box.right.box.right = emr_header.emf_header.bounds.right;
+ bytecount += 24;
+ recordcount++;
+ }
+ }
+
+ /* Make image rectangles, circles, hexagons */
+ for (this_row = 0; this_row < symbol->rows; this_row++) {
+
+ if (symbol->row_height[this_row] == 0) {
+ row_height = large_bar_height;
+ } else {
+ row_height = symbol->row_height[this_row];
+ }
+ row_posn = 0;
+ for (i = 0; i < this_row; i++) {
+ if (symbol->row_height[i] == 0) {
+ row_posn += large_bar_height;
+ } else {
+ row_posn += symbol->row_height[i];
+ }
+ }
+ row_posn += yoffset;
+
+ if (symbol->symbology != BARCODE_MAXICODE) {
+ if ((symbol->output_options & BARCODE_DOTTY_MODE) != 0) {
+ // Use dots (circles)
+ for(i = 0; i < symbol->width; i++) {
+ if(module_is_set(symbol, this_row, i)) {
+ circle[this_circle].type = 0x0000002a; // EMR_ELLIPSE
+ circle[this_circle].size = 24;
+ circle[this_circle].box.top = this_row * scaler;
+ circle[this_circle].box.bottom = (this_row + 1) * scaler;
+ circle[this_circle].box.left = (i + xoffset) * scaler;
+ circle[this_circle].box.right = (i + xoffset + 1) * scaler;
+ this_circle++;
+ bytecount += 24;
+ recordcount++;
+ }
+ }
+ } else {
+ // Normal mode, with rectangles
+ i = 0;
+ if (module_is_set(symbol, this_row, 0)) {
+ latch = 1;
+ } else {
+ latch = 0;
+ }
+
+ do {
+ block_width = 0;
+ do {
+ block_width++;
+ } while (module_is_set(symbol, this_row, i + block_width) == module_is_set(symbol, this_row, i));
+
+ if (latch == 1) {
+ /* a bar */
+ rectangle[this_rectangle].type = 0x0000002b; // EMR_RECTANGLE;
+ rectangle[this_rectangle].size = 24;
+ rectangle[this_rectangle].box.top = row_posn * scaler;
+ rectangle[this_rectangle].box.bottom = (row_posn + row_height) * scaler;
+ rectangle[this_rectangle].box.left = (i + xoffset) * scaler;
+ rectangle[this_rectangle].box.right = (i + xoffset + block_width) * scaler;
+ bytecount += 24;
+ recordcount++;
+
+ if (this_row == symbol->rows - 1) {
+ /* Last row, extend bars if needed */
+ if ((((symbol->symbology == BARCODE_EANX) && (symbol->rows == 1)) || (symbol->symbology == BARCODE_EANX_CC)) ||
+ (symbol->symbology == BARCODE_ISBNX)) {
+ /* guard bar extensions for EAN8 and EAN13 */
+ if (ustrlen(regx) != 0) {
+ /* EAN-13 */
+ switch (i) {
+ case 0:
+ case 2:
+ case 46:
+ case 48:
+ case 92:
+ case 94:
+ rectangle[this_rectangle].box.bottom += (5 * scaler);
+ break;
+ }
+ if (i > 94) {
+ /* Add-on */
+ rectangle[this_rectangle].box.top += (10 * scaler);
+ rectangle[this_rectangle].box.bottom += (5 * scaler);
+ }
+ } else if (ustrlen(regw) != 0) {
+ /* EAN-8 */
+ switch (i) {
+ case 0:
+ case 2:
+ case 32:
+ case 34:
+ case 64:
+ case 66:
+ rectangle[this_rectangle].box.bottom += (5 * scaler);
+ break;
+ }
+ if (i > 66) {
+ /* Add-on */
+ rectangle[this_rectangle].box.top += (10 * scaler);
+ rectangle[this_rectangle].box.bottom += (5 * scaler);
+ }
+ }
+ }
+ if (((symbol->symbology == BARCODE_UPCA) && (symbol->rows == 1)) || (symbol->symbology == BARCODE_UPCA_CC)) {
+ /* guard bar extensions for UPCA */
+ if (((i >= 0) && (i <= 11)) || ((i >= 85) && (i <= 96))) {
+ rectangle[this_rectangle].box.bottom += (5 * scaler);
+ }
+ if ((i == 46) || (i == 48)) {
+ rectangle[this_rectangle].box.bottom += (5 * scaler);
+ }
+ if (i > 96) {
+ /* Add-on */
+ rectangle[this_rectangle].box.top += (10 * scaler);
+ rectangle[this_rectangle].box.bottom += (5 * scaler);
+ }
+ }
+
+ if (((symbol->symbology == BARCODE_UPCE) && (symbol->rows == 1)) || (symbol->symbology == BARCODE_UPCE_CC)) {
+ /* guard bar extensions for UPCE */
+ switch (i) {
+ case 0:
+ case 2:
+ case 46:
+ case 48:
+ case 50:
+ rectangle[this_rectangle].box.bottom += (5 * scaler);
+ break;
+ }
+ if (i > 50) {
+ /* Add-on */
+ rectangle[this_rectangle].box.top += (10 * scaler);
+ rectangle[this_rectangle].box.bottom += (5 * scaler);
+ }
+ }
+ }
+
+ this_rectangle++;
+ latch = 0;
+ } else {
+ /* a space */
+ latch = 1;
+ }
+
+
+ i += block_width;
+ } while (i < symbol->width);
+ }
+ } else {
+ float ax, ay, bx, by, cx, cy, dx, dy, ex, ey, fx, fy, mx, my;
+ /* Maxicode, use hexagons */
+
+ /* Calculate bullseye */
+ for(i = 0; i < 6; i++) {
+ bullseye[i].type = 0x0000002a; // EMR_ELLIPSE
+ bullseye[i].size = 24;
+ }
+ bullseye[0].box.top = (35.60 - 10.85) * scaler;
+ bullseye[0].box.bottom = (35.60 + 10.85) * scaler;
+ bullseye[0].box.left = (35.76 - 10.85) * scaler;
+ bullseye[0].box.right = (35.76 + 10.85) * scaler;
+ bullseye[1].box.top = (35.60 - 8.97) * scaler;
+ bullseye[1].box.bottom = (35.60 + 8.97) * scaler;
+ bullseye[1].box.left = (35.76 - 8.97) * scaler;
+ bullseye[1].box.right = (35.76 + 8.97) * scaler;
+ bullseye[2].box.top = (35.60 - 7.10) * scaler;
+ bullseye[2].box.bottom = (35.60 + 7.10) * scaler;
+ bullseye[2].box.left = (35.76 - 7.10) * scaler;
+ bullseye[2].box.right = (35.76 + 7.10) * scaler;
+ bullseye[3].box.top = (35.60 - 5.22) * scaler;
+ bullseye[3].box.bottom = (35.60 + 5.22) * scaler;
+ bullseye[3].box.left = (35.76 - 5.22) * scaler;
+ bullseye[3].box.right = (35.76 + 5.22) * scaler;
+ bullseye[4].box.top = (35.60 - 3.31) * scaler;
+ bullseye[4].box.bottom = (35.60 + 3.31) * scaler;
+ bullseye[4].box.left = (35.76 - 3.31) * scaler;
+ bullseye[4].box.right = (35.76 + 3.31) * scaler;
+ bullseye[5].box.top = (35.60 - 1.43) * scaler;
+ bullseye[5].box.bottom = (35.60 + 1.43) * scaler;
+ bullseye[5].box.left = (35.76 - 1.43) * scaler;
+ bullseye[5].box.right = (35.76 + 1.43) * scaler;
+
+ /* Plot hexagons */
+ for(i = 0; i < symbol->width; i++) {
+ if(module_is_set(symbol, this_row, i)) {
+ hexagon[this_hexagon].type = 0x00000003; // EMR_POLYGON
+ hexagon[this_hexagon].size = 76;
+ hexagon[this_hexagon].count = 6;
+
+ my = this_row * 2.135 + 1.43;
+ ay = my + 1.0 + yoffset;
+ by = my + 0.5 + yoffset;
+ cy = my - 0.5 + yoffset;
+ dy = my - 1.0 + yoffset;
+ ey = my - 0.5 + yoffset;
+ fy = my + 0.5 + yoffset;
+ if (this_row & 1) {
+ mx = (2.46 * i) + 1.23 + 1.23;
+ } else {
+ mx = (2.46 * i) + 1.23;
+ }
+ ax = mx + xoffset;
+ bx = mx + 0.86 + xoffset;
+ cx = mx + 0.86 + xoffset;
+ dx = mx + xoffset;
+ ex = mx - 0.86 + xoffset;
+ fx = mx - 0.86 + xoffset;
+
+ hexagon[this_hexagon].a_points_a.x = ax * scaler;
+ hexagon[this_hexagon].a_points_a.y = ay * scaler;
+ hexagon[this_hexagon].a_points_b.x = bx * scaler;
+ hexagon[this_hexagon].a_points_b.y = by * scaler;
+ hexagon[this_hexagon].a_points_c.x = cx * scaler;
+ hexagon[this_hexagon].a_points_c.y = cy * scaler;
+ hexagon[this_hexagon].a_points_d.x = dx * scaler;
+ hexagon[this_hexagon].a_points_d.y = dy * scaler;
+ hexagon[this_hexagon].a_points_e.x = ex * scaler;
+ hexagon[this_hexagon].a_points_e.y = ey * scaler;
+ hexagon[this_hexagon].a_points_f.x = fx * scaler;
+ hexagon[this_hexagon].a_points_f.y = fy * scaler;
+
+ hexagon[this_hexagon].bounds.top = hexagon[this_hexagon].a_points_d.y;
+ hexagon[this_hexagon].bounds.bottom = hexagon[this_hexagon].a_points_a.y;
+ hexagon[this_hexagon].bounds.left = hexagon[this_hexagon].a_points_e.x;
+ hexagon[this_hexagon].bounds.right = hexagon[this_hexagon].a_points_c.x;
+ this_hexagon++;
+ bytecount += 76;
+ recordcount++;
+ }
+ }
+ }
+ }
+
+ if (symbol->output_options & BARCODE_BIND) {
+ if ((symbol->rows > 1) && (is_stackable(symbol->symbology) == 1)) {
+ /* row binding */
+ for (i = 1; i < symbol->rows; i++) {
+ row_binding[i - 1].type = 0x0000002b; // EMR_RECTANGLE;
+ row_binding[i - 1].size = 24;
+ row_binding[i - 1].box.top = ((i * row_height) + yoffset - 1) * scaler;
+ row_binding[i - 1].box.bottom = row_binding[i - 1].box.top + (2 * scaler);
+
+ if (symbol->symbology != BARCODE_CODABLOCKF) {
+ row_binding[i - 1].box.left = xoffset * scaler;
+ row_binding[i - 1].box.right = emr_header.emf_header.bounds.right - (xoffset * scaler);
+ } else {
+ row_binding[i - 1].box.left = (xoffset + 11) * scaler;
+ row_binding[i - 1].box.right = emr_header.emf_header.bounds.right - ((xoffset + 14) * scaler);
+ }
+ bytecount += 24;
+ recordcount++;
+ }
+ }
+ }
+
+ /* Create EOF record */
+ emr_eof.type = 0x0000000e; // EMR_EOF
+ emr_eof.size = 18; // Assuming no palette entries
+ emr_eof.n_pal_entries = 0;
+ emr_eof.off_pal_entries = 0;
+ emr_eof.size_last = emr_eof.size;
+ bytecount += 18;
+ recordcount++;
+
+ /* Put final counts in header */
+ emr_header.emf_header.bytes = bytecount;
+ emr_header.emf_header.records = recordcount;
+
+ /* Send EMF data to file */
+ if (symbol->output_options & BARCODE_STDOUT) {
+ emf_file = stdout;
+ } else {
+ emf_file = fopen(symbol->outfile, "w");
+ }
+ if (emf_file == NULL) {
+ strcpy(symbol->errtxt, "640: Could not open output file");
+ return ZINT_ERROR_FILE_ACCESS;
+ }
+
+ fwrite(&emr_header, sizeof(emr_header_t), 1, emf_file);
+
+ fwrite(&emr_createbrushindirect_fg, sizeof(emr_createbrushindirect_t), 1, emf_file);
+ fwrite(&emr_createbrushindirect_bg, sizeof(emr_createbrushindirect_t), 1, emf_file);
+ fwrite(&emr_createpen, sizeof(emr_createpen_t), 1, emf_file);
+
+ if ((symbol->show_hrt != 0) && (ustrlen(local_text) != 0)) {
+ fwrite(&emr_extcreatefontindirectw, sizeof(emr_extcreatefontindirectw_t), 1, emf_file);
+ }
+
+ fwrite(&emr_selectobject_bgbrush, sizeof(emr_selectobject_t), 1, emf_file);
+ fwrite(&emr_selectobject_pen, sizeof(emr_selectobject_t), 1, emf_file);
+ fwrite(&background, sizeof(emr_rectangle_t), 1, emf_file);
+
+ fwrite(&emr_selectobject_fgbrush, sizeof(emr_selectobject_t), 1, emf_file);
+
+ for (i = 0; i < rectangle_count; i++) {
+ fwrite(&rectangle[i], sizeof(emr_rectangle_t), 1, emf_file);
+ }
+ for (i = 0; i < circle_count; i++) {
+ fwrite(&circle[i], sizeof(emr_ellipse_t), 1, emf_file);
+ }
+ for (i = 0; i < hexagon_count; i++) {
+ fwrite(&hexagon[i], sizeof(emr_polygon_t), 1, emf_file);
+ }
+
+ if ((symbol->output_options & BARCODE_BIND) || (symbol->output_options & BARCODE_BOX)) {
+ fwrite(&box.top, sizeof(emr_rectangle_t), 1, emf_file);
+ fwrite(&box.bottom, sizeof(emr_rectangle_t), 1, emf_file);
+ if (symbol->output_options & BARCODE_BOX) {
+ fwrite(&box.left, sizeof(emr_rectangle_t), 1, emf_file);
+ fwrite(&box.right, sizeof(emr_rectangle_t), 1, emf_file);
+ }
+ }
+
+ if (symbol->output_options & BARCODE_BIND) {
+ if ((symbol->rows > 1) && (is_stackable(symbol->symbology) == 1)) {
+ for(i = 0; i < symbol->rows - 1; i++) {
+ fwrite(&row_binding[i], sizeof(emr_rectangle_t), 1, emf_file);
+ }
+ }
+ }
+
+ if(symbol->symbology == BARCODE_MAXICODE) {
+ fwrite(&bullseye[0], sizeof(emr_ellipse_t), 1, emf_file);
+ fwrite(&emr_selectobject_bgbrush, sizeof(emr_selectobject_t), 1, emf_file);
+ fwrite(&bullseye[1], sizeof(emr_ellipse_t), 1, emf_file);
+ fwrite(&emr_selectobject_fgbrush, sizeof(emr_selectobject_t), 1, emf_file);
+ fwrite(&bullseye[2], sizeof(emr_ellipse_t), 1, emf_file);
+ fwrite(&emr_selectobject_bgbrush, sizeof(emr_selectobject_t), 1, emf_file);
+ fwrite(&bullseye[3], sizeof(emr_ellipse_t), 1, emf_file);
+ fwrite(&emr_selectobject_fgbrush, sizeof(emr_selectobject_t), 1, emf_file);
+ fwrite(&bullseye[4], sizeof(emr_ellipse_t), 1, emf_file);
+ fwrite(&emr_selectobject_bgbrush, sizeof(emr_selectobject_t), 1, emf_file);
+ fwrite(&bullseye[5], sizeof(emr_ellipse_t), 1, emf_file);
+ }
+
+ if ((symbol->show_hrt != 0) && (ustrlen(local_text) != 0)) {
+ if ((symbol->symbology == BARCODE_EANX) || (symbol->symbology == BARCODE_EANX_CC) || (symbol->symbology == BARCODE_ISBNX)) {
+ if (ustrlen(regx) != 0) {
+ /* EAN-13 */
+ fwrite(&emr_selectobject_font, sizeof(emr_selectobject_t), 1, emf_file);
+ fwrite(&emr_exttextoutw[0], sizeof(emr_exttextoutw_t), 1, emf_file);
+ fwrite(&string_buffer, 2 * bump_up(ustrlen(local_text) + 1), 1, emf_file);
+ for (i = 0; i < bump_up(ustrlen(local_text) + 1); i++) {
+ fwrite(&dx, 4, 1, emf_file);
+ }
+ fwrite(&emr_exttextoutw[1], sizeof(emr_exttextoutw_t), 1, emf_file);
+ utfle_copy(output_buffer, regw, 6);
+ fwrite(&output_buffer, 12, 1, emf_file);
+ for (i = 0; i < 6; i++) {
+ fwrite(&dx, 4, 1, emf_file);
+ }
+ fwrite(&emr_exttextoutw[2], sizeof(emr_exttextoutw_t), 1, emf_file);
+ utfle_copy(output_buffer, regx, 6);
+ fwrite(&output_buffer, 12, 1, emf_file);
+ for (i = 0; i < 6; i++) {
+ fwrite(&dx, 4, 1, emf_file);
+ }
+ if (ustrlen(regz) != 0) {
+ fwrite(&emr_exttextoutw[4], sizeof(emr_exttextoutw_t), 1, emf_file);
+ utfle_copy(output_buffer, regz, 6);
+ fwrite(&output_buffer, 12, 1, emf_file);
+ for (i = 0; i < 6; i++) {
+ fwrite(&dx, 4, 1, emf_file);
+ }
+ }
+ textdone = 1;
+ } else if (ustrlen(regw) != 0) {
+ /* EAN-8 */
+ fwrite(&emr_selectobject_font, sizeof(emr_selectobject_t), 1, emf_file);
+ fwrite(&emr_exttextoutw[0], sizeof(emr_exttextoutw_t), 1, emf_file);
+ fwrite(&string_buffer, 2 * bump_up(ustrlen(local_text) + 1), 1, emf_file);
+ for (i = 0; i < bump_up(ustrlen(local_text) + 1); i++) {
+ fwrite(&dx, 4, 1, emf_file);
+ }
+ fwrite(&emr_exttextoutw[1], sizeof(emr_exttextoutw_t), 1, emf_file);
+ utfle_copy(output_buffer, regw, 6);
+ fwrite(&output_buffer, 12, 1, emf_file);
+ for (i = 0; i < 6; i++) {
+ fwrite(&dx, 4, 1, emf_file);
+ }
+ if (ustrlen(regz) != 0) {
+ fwrite(&emr_exttextoutw[4], sizeof(emr_exttextoutw_t), 1, emf_file);
+ utfle_copy(output_buffer, regz, 6);
+ fwrite(&output_buffer, 12, 1, emf_file);
+ for (i = 0; i < 6; i++) {
+ fwrite(&dx, 4, 1, emf_file);
+ }
+ }
+ textdone = 1;
+ }
+ }
+ if ((symbol->symbology == BARCODE_UPCA) || (symbol->symbology == BARCODE_UPCA_CC)) {
+ fwrite(&emr_selectobject_font, sizeof(emr_selectobject_t), 1, emf_file);
+ fwrite(&emr_exttextoutw[0], sizeof(emr_exttextoutw_t), 1, emf_file);
+ fwrite(&string_buffer, 2 * bump_up(ustrlen(local_text) + 1), 1, emf_file);
+ for (i = 0; i < bump_up(ustrlen(local_text) + 1); i++) {
+ fwrite(&dx, 4, 1, emf_file);
+ }
+ fwrite(&emr_exttextoutw[3], sizeof(emr_exttextoutw_t), 1, emf_file);
+ utfle_copy(output_buffer, regy, 6);
+ fwrite(&output_buffer, 12, 1, emf_file);
+ for (i = 0; i < 6; i++) {
+ fwrite(&dx, 4, 1, emf_file);
+ }
+ fwrite(&emr_selectobject_font_big, sizeof(emr_selectobject_t), 1, emf_file);
+ fwrite(&emr_exttextoutw[1], sizeof(emr_exttextoutw_t), 1, emf_file);
+ utfle_copy(output_buffer, regw, 6);
+ fwrite(&output_buffer, 12, 1, emf_file);
+ for (i = 0; i < 6; i++) {
+ fwrite(&dx, 4, 1, emf_file);
+ }
+ fwrite(&emr_exttextoutw[2], sizeof(emr_exttextoutw_t), 1, emf_file);
+ utfle_copy(output_buffer, regx, 6);
+ fwrite(&output_buffer, 12, 1, emf_file);
+ for (i = 0; i < 6; i++) {
+ fwrite(&dx, 4, 1, emf_file);
+ }
+ if (ustrlen(regz) != 0) {
+ fwrite(&emr_exttextoutw[4], sizeof(emr_exttextoutw_t), 1, emf_file);
+ utfle_copy(output_buffer, regz, 6);
+ fwrite(&output_buffer, 12, 1, emf_file);
+ for (i = 0; i < 6; i++) {
+ fwrite(&dx, 4, 1, emf_file);
+ }
+ }
+ textdone = 1;
+ }
+
+ if (((symbol->symbology == BARCODE_UPCE) && (symbol->rows == 1)) || (symbol->symbology == BARCODE_UPCE_CC)) {
+ fwrite(&emr_selectobject_font, sizeof(emr_selectobject_t), 1, emf_file);
+ fwrite(&emr_exttextoutw[0], sizeof(emr_exttextoutw_t), 1, emf_file);
+ fwrite(&string_buffer, 2 * bump_up(ustrlen(local_text) + 1), 1, emf_file);
+ for (i = 0; i < bump_up(ustrlen(local_text) + 1); i++) {
+ fwrite(&dx, 4, 1, emf_file);
+ }
+ fwrite(&emr_exttextoutw[2], sizeof(emr_exttextoutw_t), 1, emf_file);
+ utfle_copy(output_buffer, regx, 6);
+ fwrite(&output_buffer, 12, 1, emf_file);
+ for (i = 0; i < 6; i++) {
+ fwrite(&dx, 4, 1, emf_file);
+ }
+ fwrite(&emr_selectobject_font_big, sizeof(emr_selectobject_t), 1, emf_file);
+ fwrite(&emr_exttextoutw[1], sizeof(emr_exttextoutw_t), 1, emf_file);
+ utfle_copy(output_buffer, regw, 6);
+ fwrite(&output_buffer, 12, 1, emf_file);
+ for (i = 0; i < 6; i++) {
+ fwrite(&dx, 4, 1, emf_file);
+ }
+ if (ustrlen(regz) != 0) {
+ fwrite(&emr_exttextoutw[4], sizeof(emr_exttextoutw_t), 1, emf_file);
+ utfle_copy(output_buffer, regz, 6);
+ fwrite(&output_buffer, 12, 1, emf_file);
+ for (i = 0; i < 6; i++) {
+ fwrite(&dx, 4, 1, emf_file);
+ }
+ }
+ textdone = 1;
+ }
+
+ if (textdone == 0) {
+ fwrite(&emr_selectobject_font, sizeof(emr_selectobject_t), 1, emf_file);
+ fwrite(&emr_exttextoutw[0], sizeof(emr_exttextoutw_t), 1, emf_file);
+ fwrite(&string_buffer, 2 * bump_up(ustrlen(local_text) + 1), 1, emf_file);
+ for (i = 0; i < bump_up(ustrlen(local_text) + 1); i++) {
+ fwrite(&dx, 4, 1, emf_file);
+ }
+ }
+ }
+
+ fwrite(&emr_eof, sizeof(emr_eof_t), 1, emf_file);
+
+ if (symbol->output_options & BARCODE_STDOUT) {
+ fflush(emf_file);
+ } else {
+ fclose(emf_file);
+ }
+ return error_number;
+}
diff --git a/3rdparty/zint-2.6.1/backend/emf.h b/3rdparty/zint-2.6.1/backend/emf.h
new file mode 100644
index 0000000..da68522
--- /dev/null
+++ b/3rdparty/zint-2.6.1/backend/emf.h
@@ -0,0 +1,216 @@
+/* emf.h - header structure for Microsoft EMF
+
+ libzint - the open source barcode library
+ Copyright (C) 2016-2017 Robin Stuart
+
+ Redistribution and use in source and binary forms, with or without
+ modification, are permitted provided that the following conditions
+ are met:
+
+ 1. Redistributions of source code must retain the above copyright
+ notice, this list of conditions and the following disclaimer.
+ 2. Redistributions in binary form must reproduce the above copyright
+ notice, this list of conditions and the following disclaimer in the
+ documentation and/or other materials provided with the distribution.
+ 3. Neither the name of the project nor the names of its contributors
+ may be used to endorse or promote products derived from this software
+ without specific prior written permission.
+
+ THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND
+ ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+ ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE
+ FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+ DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
+ OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
+ HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
+ LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
+ OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+ SUCH DAMAGE.
+ */
+
+#ifndef EMF_H
+#define EMF_H
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+#ifdef _MSC_VER
+#include
+#include "stdint_msvc.h"
+#else
+#include
+#endif
+
+#pragma pack(1)
+
+ typedef struct rect_l {
+ int32_t left;
+ int32_t top;
+ int32_t right;
+ int32_t bottom;
+ } rect_l_t;
+
+ typedef struct size_l {
+ uint32_t cx;
+ uint32_t cy;
+ } size_l_t;
+
+ typedef struct point_l {
+ int32_t x;
+ int32_t y;
+ } point_l_t;
+
+ typedef struct color_ref {
+ uint8_t red;
+ uint8_t green;
+ uint8_t blue;
+ uint8_t reserved;
+ } color_ref_t;
+
+ typedef struct log_brush_ex {
+ uint32_t brush_style;
+ color_ref_t color;
+ uint32_t brush_hatch;
+ } log_brush_ex_t;
+
+ typedef struct log_pen {
+ uint32_t pen_style;
+ point_l_t width;
+ color_ref_t color_ref;
+ } log_pen_t;
+
+ typedef struct log_font {
+ int32_t height;
+ int32_t width;
+ int32_t escapement;
+ int32_t orientation;
+ int32_t weight;
+ uint8_t italic;
+ uint8_t underline;
+ uint8_t strike_out;
+ uint8_t char_set;
+ uint8_t out_precision;
+ uint8_t clip_precision;
+ uint8_t quality;
+ uint8_t pitch_and_family;
+ unsigned char facename[64];
+ } log_font_t;
+
+ typedef struct emr_text {
+ point_l_t reference;
+ uint32_t chars;
+ uint32_t off_string;
+ uint32_t options;
+ rect_l_t rectangle;
+ uint32_t off_dx;
+ } emr_text_t;
+
+ typedef struct emf_header {
+ rect_l_t bounds;
+ rect_l_t frame;
+ uint32_t record_signature;
+ uint32_t version;
+ uint32_t bytes;
+ uint32_t records;
+ uint16_t handles;
+ uint16_t reserved;
+ uint32_t n_description;
+ uint32_t off_description;
+ uint32_t n_pal_entries;
+ size_l_t device;
+ size_l_t millimeters;
+ } emf_header_t;
+
+ typedef struct emr_header {
+ uint32_t type;
+ uint32_t size;
+ emf_header_t emf_header;
+ } emr_header_t;
+
+ typedef struct emr_createbrushindirect {
+ uint32_t type;
+ uint32_t size;
+ uint32_t ih_brush;
+ log_brush_ex_t log_brush;
+ } emr_createbrushindirect_t;
+
+ typedef struct emr_createpen {
+ uint32_t type;
+ uint32_t size;
+ uint32_t ih_pen;
+ log_pen_t log_pen;
+ } emr_createpen_t;
+
+ typedef struct emr_selectobject {
+ uint32_t type;
+ uint32_t size;
+ uint32_t ih_object;
+ } emr_selectobject_t;
+
+ typedef struct emr_rectangle {
+ uint32_t type;
+ uint32_t size;
+ rect_l_t box;
+ } emr_rectangle_t;
+
+ typedef struct emr_ellipse {
+ uint32_t type;
+ uint32_t size;
+ rect_l_t box;
+ } emr_ellipse_t;
+
+ typedef struct emr_polygon {
+ uint32_t type;
+ uint32_t size;
+ rect_l_t bounds;
+ uint32_t count;
+ point_l_t a_points_a;
+ point_l_t a_points_b;
+ point_l_t a_points_c;
+ point_l_t a_points_d;
+ point_l_t a_points_e;
+ point_l_t a_points_f;
+ } emr_polygon_t;
+
+ typedef struct emr_extcreatefontindirectw {
+ uint32_t type;
+ uint32_t size;
+ uint32_t ih_fonts;
+ log_font_t elw;
+ } emr_extcreatefontindirectw_t;
+
+ typedef struct emr_exttextoutw {
+ uint32_t type;
+ uint32_t size;
+ rect_l_t bounds;
+ uint32_t i_graphics_mode;
+ float ex_scale;
+ float ey_scale;
+ emr_text_t w_emr_text;
+ } emr_exttextoutw_t;
+
+ typedef struct emr_eof {
+ uint32_t type;
+ uint32_t size;
+ uint32_t n_pal_entries;
+ uint32_t off_pal_entries;
+ uint32_t size_last;
+ } emr_eof_t;
+
+ typedef struct box {
+ emr_rectangle_t top;
+ emr_rectangle_t bottom;
+ emr_rectangle_t left;
+ emr_rectangle_t right;
+ } box_t;
+
+#pragma pack()
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif /* EMF_H */
+
diff --git a/3rdparty/zint-2.6.1/backend/font.h b/3rdparty/zint-2.6.1/backend/font.h
new file mode 100644
index 0000000..021efac
--- /dev/null
+++ b/3rdparty/zint-2.6.1/backend/font.h
@@ -0,0 +1,419 @@
+/* font.h - Font for PNG images */
+
+/*
+ libzint - the open source barcode library
+ Copyright (C) 2008-2017 Robin Stuart
+
+ Redistribution and use in source and binary forms, with or without
+ modification, are permitted provided that the following conditions
+ are met:
+
+ 1. Redistributions of source code must retain the above copyright
+ notice, this list of conditions and the following disclaimer.
+ 2. Redistributions in binary form must reproduce the above copyright
+ notice, this list of conditions and the following disclaimer in the
+ documentation and/or other materials provided with the distribution.
+ 3. Neither the name of the project nor the names of its contributors
+ may be used to endorse or promote products derived from this software
+ without specific prior written permission.
+
+ THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND
+ ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+ ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE
+ FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+ DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
+ OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
+ HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
+ LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
+ OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+ SUCH DAMAGE.
+ */
+
+static const char ascii_font[] = {
+ /* Each character is 7 x 14 pixels */
+ 0, 0, 8, 8, 8, 8, 8, 8, 8, 0, 8, 8, 0, 0, /* ! */
+ 0, 20, 20, 20, 20, 0, 0, 0, 0, 0, 0, 0, 0, 0, /* " */
+ 0, 0, 20, 20, 20, 62, 20, 20, 62, 20, 20, 20, 0, 0, /* # */
+ 0, 0, 8, 60, 74, 74, 40, 28, 10, 74, 74, 60, 8, 0, /* $ */
+ 0, 0, 50, 74, 76, 56, 8, 16, 28, 50, 82, 76, 0, 0, /* % */
+ 0, 0, 24, 36, 36, 36, 24, 50, 74, 68, 76, 50, 0, 0, /* & */
+ 0, 8, 8, 8, 8, 0, 0, 0, 0, 0, 0, 0, 0, 0, /* ' */
+ 0, 2, 4, 8, 8, 16, 16, 16, 16, 16, 8, 8, 4, 2, /* ( */
+ 0, 32, 16, 8, 8, 4, 4, 4, 4, 4, 8, 8, 16, 32, /* ) */
+ 0, 0, 0, 0, 8, 42, 28, 8, 28, 42, 8, 0, 0, 0, /* * */
+ 0, 0, 0, 0, 8, 8, 8, 62, 8, 8, 8, 0, 0, 0, /* + */
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 24, 8, 8, 16, /* , */
+ 0, 0, 0, 0, 0, 0, 0, 62, 0, 0, 0, 0, 0, 0, /* - */
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 8, 28, 8, 0, /* . */
+ 0, 2, 2, 4, 4, 8, 8, 8, 16, 16, 32, 32, 64, 64, /* / */
+ 0, 0, 24, 36, 66, 66, 66, 66, 66, 66, 36, 24, 0, 0, /* 0 */
+ 0, 0, 8, 24, 40, 8, 8, 8, 8, 8, 8, 62, 0, 0, /* 1 */
+ 0, 0, 60, 66, 66, 2, 4, 4, 8, 16, 32, 126, 0, 0, /* 2 */
+ 0, 0, 126, 2, 4, 8, 28, 2, 2, 66, 66, 60, 0, 0, /* 3 */
+ 0, 0, 4, 12, 20, 20, 36, 36, 68, 126, 4, 4, 0, 0, /* 4 */
+ 0, 0, 126, 64, 64, 124, 66, 2, 2, 66, 66, 60, 0, 0, /* 5 */
+ 0, 0, 28, 32, 64, 64, 92, 98, 66, 66, 66, 60, 0, 0, /* 6 */
+ 0, 0, 126, 2, 4, 4, 8, 8, 16, 16, 32, 32, 0, 0, /* 7 */
+ 0, 0, 60, 66, 66, 36, 24, 36, 66, 66, 66, 60, 0, 0, /* 8 */
+ 0, 0, 60, 66, 66, 66, 70, 58, 2, 66, 68, 56, 0, 0, /* 9 */
+ 0, 0, 0, 0, 8, 28, 8, 0, 0, 8, 28, 8, 0, 0, /* : */
+ 0, 0, 0, 0, 0, 24, 24, 0, 0, 24, 8, 8, 16, 0, /* ; */
+ 0, 0, 0, 2, 4, 8, 16, 32, 16, 8, 4, 2, 0, 0, /* < */
+ 0, 0, 0, 0, 0, 126, 0, 0, 126, 0, 0, 0, 0, 0, /* = */
+ 0, 0, 0, 32, 16, 8, 4, 2, 4, 8, 16, 32, 0, 0, /* > */
+ 0, 0, 60, 66, 66, 4, 8, 8, 8, 0, 8, 8, 0, 0, /* ? */
+ 0, 0, 28, 34, 78, 82, 82, 82, 82, 78, 32, 30, 0, 0, /* @ */
+ 0, 0, 24, 36, 66, 66, 66, 126, 66, 66, 66, 66, 0, 0, /* A */
+ 0, 0, 120, 68, 66, 68, 120, 68, 66, 66, 68, 120, 0, 0, /* B */
+ 0, 0, 60, 66, 66, 64, 64, 64, 64, 66, 66, 60, 0, 0, /* C */
+ 0, 0, 120, 68, 66, 66, 66, 66, 66, 66, 68, 120, 0, 0, /* D */
+ 0, 0, 126, 64, 64, 64, 120, 64, 64, 64, 64, 126, 0, 0, /* E */
+ 0, 0, 126, 64, 64, 64, 120, 64, 64, 64, 64, 64, 0, 0, /* F */
+ 0, 0, 60, 66, 66, 64, 64, 78, 66, 66, 70, 58, 0, 0, /* G */
+ 0, 0, 66, 66, 66, 66, 126, 66, 66, 66, 66, 66, 0, 0, /* H */
+ 0, 0, 62, 8, 8, 8, 8, 8, 8, 8, 8, 62, 0, 0, /* I */
+ 0, 0, 14, 4, 4, 4, 4, 4, 4, 68, 68, 56, 0, 0, /* J */
+ 0, 0, 66, 68, 72, 80, 96, 80, 72, 68, 66, 66, 0, 0, /* K */
+ 0, 0, 64, 64, 64, 64, 64, 64, 64, 64, 64, 126, 0, 0, /* L */
+ 0, 0, 66, 102, 102, 90, 90, 66, 66, 66, 66, 66, 0, 0, /* M */
+ 0, 0, 66, 66, 98, 98, 82, 74, 70, 70, 66, 66, 0, 0, /* N */
+ 0, 0, 60, 66, 66, 66, 66, 66, 66, 66, 66, 60, 0, 0, /* O */
+ 0, 0, 124, 66, 66, 66, 66, 124, 64, 64, 64, 64, 0, 0, /* P */
+ 0, 0, 60, 66, 66, 66, 66, 66, 114, 74, 70, 60, 4, 2, /* Q */
+ 0, 0, 124, 66, 66, 66, 66, 124, 72, 68, 66, 66, 0, 0, /* R */
+ 0, 0, 60, 66, 66, 64, 48, 12, 2, 66, 66, 60, 0, 0, /* S */
+ 0, 0, 127, 8, 8, 8, 8, 8, 8, 8, 8, 8, 0, 0, /* T */
+ 0, 0, 66, 66, 66, 66, 66, 66, 66, 66, 66, 60, 0, 0, /* U */
+ 0, 0, 66, 66, 66, 66, 36, 36, 36, 24, 24, 24, 0, 0, /* V */
+ 0, 0, 34, 34, 34, 34, 34, 34, 42, 42, 42, 20, 0, 0, /* W */
+ 0, 0, 66, 66, 36, 36, 24, 24, 36, 36, 66, 66, 0, 0, /* X */
+ 0, 0, 34, 34, 34, 20, 20, 8, 8, 8, 8, 8, 0, 0, /* Y */
+ 0, 0, 126, 2, 4, 8, 8, 16, 32, 32, 64, 126, 0, 0, /* Z */
+ 0, 30, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 30, /* [ */
+ 0, 64, 64, 32, 32, 16, 16, 16, 8, 8, 4, 4, 2, 2, /* \ */
+ 0, 60, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 60, /* ] */
+ 0, 24, 36, 66, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, /* ^ */
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 126, /* _ */
+ 0, 16, 8, 4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, /* ` */
+ 0, 0, 0, 0, 0, 60, 66, 2, 62, 66, 66, 62, 0, 0, /* a */
+ 0, 0, 64, 64, 64, 92, 98, 66, 66, 66, 98, 92, 0, 0, /* b */
+ 0, 0, 0, 0, 0, 60, 66, 64, 64, 64, 66, 60, 0, 0, /* c */
+ 0, 0, 2, 2, 2, 58, 70, 66, 66, 66, 70, 58, 0, 0, /* d */
+ 0, 0, 0, 0, 0, 60, 66, 66, 126, 64, 66, 60, 0, 0, /* e */
+ 0, 0, 12, 18, 16, 16, 124, 16, 16, 16, 16, 16, 0, 0, /* f */
+ 0, 0, 0, 0, 0, 58, 68, 68, 68, 56, 32, 92, 66, 60, /* g */
+ 0, 0, 64, 64, 64, 92, 98, 66, 66, 66, 66, 66, 0, 0, /* h */
+ 0, 0, 8, 8, 0, 24, 8, 8, 8, 8, 8, 62, 0, 0, /* i */
+ 0, 0, 2, 2, 0, 6, 2, 2, 2, 2, 2, 34, 34, 28, /* j */
+ 0, 0, 64, 64, 64, 68, 72, 80, 112, 72, 68, 66, 0, 0, /* k */
+ 0, 0, 24, 8, 8, 8, 8, 8, 8, 8, 8, 62, 0, 0, /* l */
+ 0, 0, 0, 0, 0, 52, 42, 42, 42, 42, 42, 34, 0, 0, /* m */
+ 0, 0, 0, 0, 0, 92, 98, 66, 66, 66, 66, 66, 0, 0, /* n */
+ 0, 0, 0, 0, 0, 60, 66, 66, 66, 66, 66, 60, 0, 0, /* o */
+ 0, 0, 0, 0, 0, 92, 98, 66, 66, 66, 98, 92, 64, 64, /* p */
+ 0, 0, 0, 0, 0, 58, 70, 66, 66, 66, 70, 58, 2, 2, /* q */
+ 0, 0, 0, 0, 0, 92, 98, 66, 64, 64, 64, 64, 0, 0, /* r */
+ 0, 0, 0, 0, 0, 60, 66, 32, 24, 4, 66, 60, 0, 0, /* s */
+ 0, 0, 16, 16, 16, 124, 16, 16, 16, 16, 18, 12, 0, 0, /* t */
+ 0, 0, 0, 0, 0, 66, 66, 66, 66, 66, 70, 58, 0, 0, /* u */
+ 0, 0, 0, 0, 0, 34, 34, 34, 20, 20, 8, 8, 0, 0, /* v */
+ 0, 0, 0, 0, 0, 34, 34, 42, 42, 42, 42, 20, 0, 0, /* w */
+ 0, 0, 0, 0, 0, 66, 66, 36, 24, 36, 66, 66, 0, 0, /* x */
+ 0, 0, 0, 0, 0, 66, 66, 66, 66, 70, 58, 2, 66, 60, /* y */
+ 0, 0, 0, 0, 0, 126, 4, 8, 16, 16, 32, 126, 0, 0, /* z */
+ 0, 6, 8, 8, 8, 8, 8, 16, 8, 8, 8, 8, 8, 6, /* { */
+ 0, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, /* | */
+ 0, 48, 8, 8, 8, 8, 8, 4, 8, 8, 8, 8, 8, 48, /* } */
+ 0, 32, 82, 74, 4, 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, 8, 8, 0, 8, 8, 8, 8, 8, 8, 8, 0, 0, /* ¡ */
+ 0, 0, 0, 0, 16, 60, 82, 80, 80, 80, 82, 60, 16, 0, /* ¢ */
+ 0, 0, 0, 12, 18, 16, 16, 60, 16, 16, 60, 18, 0, 0, /* £ */
+ 0, 0, 0, 0, 66, 60, 36, 36, 60, 66, 0, 0, 0, 0, /* ¤ */
+ 0, 0, 34, 20, 20, 8, 62, 8, 62, 8, 8, 8, 0, 0, /* ¥ */
+ 0, 0, 8, 8, 8, 8, 0, 0, 8, 8, 8, 8, 0, 0, /* ¦ */
+ 0, 60, 66, 32, 24, 36, 66, 36, 24, 4, 66, 60, 0, 0, /* § */
+ 0, 36, 36, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, /* ¨ */
+ 0, 60, 66, 90, 102, 98, 98, 98, 102, 90, 66, 60, 0, 0, /* © */
+ 0, 28, 34, 30, 34, 38, 26, 0, 62, 0, 0, 0, 0, 0, /* ª */
+ 0, 0, 0, 0, 0, 10, 20, 40, 80, 40, 20, 10, 0, 0, /* « */
+ 0, 0, 0, 0, 0, 0, 0, 0, 62, 2, 2, 2, 0, 0, /* ¬ */
+ 0, 0, 0, 0, 0, 0, 0, 60, 0, 0, 0, 0, 0, 0, /* Â */
+ 0, 60, 66, 122, 102, 102, 122, 102, 102, 102, 66, 60, 0, 0, /* ® */
+ 0, 0, 62, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, /* ¯ */
+ 0, 24, 36, 36, 24, 0, 0, 0, 0, 0, 0, 0, 0, 0, /* ° */
+ 0, 0, 0, 0, 0, 0, 8, 8, 62, 8, 8, 62, 0, 0, /* ± */
+ 0, 24, 36, 4, 8, 16, 32, 60, 0, 0, 0, 0, 0, 0, /* ² */
+ 0, 24, 36, 4, 24, 4, 36, 24, 0, 0, 0, 0, 0, 0, /* ³ */
+ 0, 4, 8, 16, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, /* ´ */
+ 0, 0, 0, 0, 0, 0, 34, 34, 34, 34, 54, 42, 32, 32, /* µ */
+ 0, 0, 30, 42, 42, 42, 42, 26, 10, 10, 10, 10, 10, 14, /* ¶ */
+ 0, 0, 0, 0, 0, 0, 8, 0, 0, 0, 0, 0, 0, 0, /* · */
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 8, 8, 16, /* ¸ */
+ 0, 8, 24, 8, 8, 8, 8, 28, 0, 0, 0, 0, 0, 0, /* ¹ */
+ 0, 0, 24, 36, 36, 24, 0, 60, 0, 0, 0, 0, 0, 0, /* º */
+ 0, 0, 0, 0, 0, 80, 40, 20, 10, 20, 40, 80, 0, 0, /* » */
+ 0, 0, 32, 98, 36, 36, 40, 18, 22, 42, 78, 66, 0, 0, /* ¼ */
+ 0, 0, 32, 98, 36, 36, 40, 20, 26, 34, 68, 78, 0, 0, /* ½ */
+ 0, 0, 98, 18, 36, 24, 104, 18, 38, 42, 78, 2, 0, 0, /* ¾ */
+ 0, 0, 0, 16, 16, 0, 16, 16, 16, 16, 32, 66, 66, 60, /* ¿ */
+ 16, 8, 0, 24, 36, 66, 66, 126, 66, 66, 66, 66, 0, 0, /* À */
+ 8, 16, 0, 24, 36, 66, 66, 126, 66, 66, 66, 66, 0, 0, /* Ã */
+ 24, 36, 0, 24, 36, 66, 66, 126, 66, 66, 66, 66, 0, 0, /* Â */
+ 50, 76, 0, 24, 36, 66, 66, 126, 66, 66, 66, 66, 0, 0, /* Ã */
+ 0, 36, 0, 24, 36, 66, 66, 126, 66, 66, 66, 66, 0, 0, /* Ä */
+ 0, 24, 36, 24, 36, 66, 66, 126, 66, 66, 66, 66, 0, 0, /* Ã… */
+ 0, 0, 30, 40, 72, 72, 126, 72, 72, 72, 72, 78, 0, 0, /* Æ */
+ 0, 0, 60, 66, 66, 64, 64, 64, 64, 66, 66, 60, 8, 16, /* Ç */
+ 16, 8, 0, 126, 64, 64, 64, 124, 64, 64, 64, 126, 0, 0, /* È */
+ 8, 16, 0, 126, 64, 64, 64, 124, 64, 64, 64, 126, 0, 0, /* É */
+ 24, 36, 0, 126, 64, 64, 64, 124, 64, 64, 64, 126, 0, 0, /* Ê */
+ 0, 36, 0, 126, 64, 64, 64, 124, 64, 64, 64, 126, 0, 0, /* Ë */
+ 16, 8, 0, 62, 8, 8, 8, 8, 8, 8, 8, 62, 0, 0, /* Ì */
+ 4, 8, 0, 62, 8, 8, 8, 8, 8, 8, 8, 62, 0, 0, /* Ã */
+ 8, 20, 0, 62, 8, 8, 8, 8, 8, 8, 8, 62, 0, 0, /* ÃŽ */
+ 0, 20, 0, 62, 8, 8, 8, 8, 8, 8, 8, 62, 0, 0, /* Ã */
+ 0, 0, 60, 34, 33, 33, 121, 33, 33, 33, 34, 60, 0, 0, /* Ã */
+ 50, 76, 0, 98, 98, 82, 82, 74, 74, 74, 70, 70, 0, 0, /* Ñ */
+ 16, 8, 0, 60, 66, 66, 66, 66, 66, 66, 66, 60, 0, 0, /* Ã’ */
+ 8, 16, 0, 60, 66, 66, 66, 66, 66, 66, 66, 60, 0, 0, /* Ó */
+ 24, 36, 0, 60, 66, 66, 66, 66, 66, 66, 66, 60, 0, 0, /* Ô */
+ 50, 76, 0, 60, 66, 66, 66, 66, 66, 66, 66, 60, 0, 0, /* Õ */
+ 0, 36, 0, 60, 66, 66, 66, 66, 66, 66, 66, 60, 0, 0, /* Ö */
+ 0, 0, 0, 0, 0, 65, 34, 20, 8, 20, 34, 65, 0, 0, /* × */
+ 2, 2, 60, 70, 74, 74, 74, 82, 82, 82, 98, 60, 64, 64, /* Ø */
+ 16, 8, 0, 66, 66, 66, 66, 66, 66, 66, 66, 60, 0, 0, /* Ù */
+ 8, 16, 0, 66, 66, 66, 66, 66, 66, 66, 66, 60, 0, 0, /* Ú */
+ 24, 36, 0, 66, 66, 66, 66, 66, 66, 66, 66, 60, 0, 0, /* Û */
+ 0, 36, 0, 66, 66, 66, 66, 66, 66, 66, 66, 60, 0, 0, /* Ü */
+ 4, 8, 0, 34, 34, 20, 20, 8, 8, 8, 8, 8, 0, 0, /* Ã */
+ 0, 0, 64, 64, 124, 66, 66, 66, 66, 124, 64, 64, 0, 0, /* Þ */
+ 0, 0, 24, 36, 36, 36, 56, 36, 34, 34, 34, 124, 0, 0, /* ß */
+ 0, 0, 16, 8, 0, 60, 66, 14, 50, 66, 70, 58, 0, 0, /* Ã */
+ 0, 0, 4, 8, 0, 60, 66, 14, 50, 66, 70, 58, 0, 0, /* á */
+ 0, 0, 24, 36, 0, 60, 66, 14, 50, 66, 70, 58, 0, 0, /* â */
+ 0, 0, 50, 76, 0, 60, 66, 14, 50, 66, 70, 58, 0, 0, /* ã */
+ 0, 0, 0, 36, 0, 60, 66, 14, 50, 66, 70, 58, 0, 0, /* ä */
+ 0, 24, 36, 24, 0, 60, 66, 14, 50, 66, 70, 58, 0, 0, /* å */
+ 0, 0, 0, 0, 0, 62, 73, 25, 47, 72, 73, 62, 0, 0, /* æ */
+ 0, 0, 0, 0, 0, 60, 66, 64, 64, 64, 66, 60, 8, 16, /* ç */
+ 0, 0, 16, 8, 0, 60, 66, 66, 126, 64, 66, 60, 0, 0, /* è */
+ 0, 0, 8, 16, 0, 60, 66, 66, 126, 64, 66, 60, 0, 0, /* é */
+ 0, 0, 24, 36, 0, 60, 66, 66, 126, 64, 66, 60, 0, 0, /* ê */
+ 0, 0, 0, 36, 0, 60, 66, 66, 126, 64, 66, 60, 0, 0, /* ë */
+ 0, 0, 16, 8, 0, 24, 8, 8, 8, 8, 8, 62, 0, 0, /* ì */
+ 0, 0, 4, 8, 0, 24, 8, 8, 8, 8, 8, 62, 0, 0, /* Ã */
+ 0, 0, 24, 36, 0, 24, 8, 8, 8, 8, 8, 62, 0, 0, /* î */
+ 0, 0, 0, 20, 0, 24, 8, 8, 8, 8, 8, 62, 0, 0, /* ï */
+ 0, 20, 8, 20, 2, 30, 34, 34, 34, 34, 34, 28, 0, 0, /* ð */
+ 0, 0, 50, 76, 0, 92, 98, 66, 66, 66, 66, 66, 0, 0, /* ñ */
+ 0, 0, 16, 8, 0, 60, 66, 66, 66, 66, 66, 60, 0, 0, /* ò */
+ 0, 0, 8, 16, 0, 60, 66, 66, 66, 66, 66, 60, 0, 0, /* ó */
+ 0, 0, 24, 36, 0, 60, 66, 66, 66, 66, 66, 60, 0, 0, /* ô */
+ 0, 0, 50, 76, 0, 60, 66, 66, 66, 66, 66, 60, 0, 0, /* õ */
+ 0, 0, 0, 36, 0, 60, 66, 66, 66, 66, 66, 60, 0, 0, /* ö */
+ 0, 0, 0, 0, 0, 0, 0, 24, 0, 126, 0, 24, 0, 0, /* ÷ */
+ 0, 0, 0, 2, 4, 60, 74, 74, 82, 82, 98, 60, 64, 64, /* ø */
+ 0, 0, 16, 8, 0, 66, 66, 66, 66, 66, 70, 58, 0, 0, /* ù */
+ 0, 0, 8, 16, 0, 66, 66, 66, 66, 66, 70, 58, 0, 0, /* ú */
+ 0, 0, 24, 36, 0, 66, 66, 66, 66, 66, 70, 58, 0, 0, /* û */
+ 0, 0, 0, 36, 0, 66, 66, 66, 66, 66, 70, 58, 0, 0, /* ü */
+ 0, 0, 8, 16, 0, 66, 66, 34, 36, 20, 28, 8, 72, 48, /* ý */
+ 0, 0, 64, 64, 64, 92, 98, 66, 66, 66, 98, 92, 64, 64, /* þ */
+ 0, 0, 0, 36, 0, 66, 66, 34, 36, 20, 28, 8, 72, 48, /* ÿ */
+};
+
+static const char small_font[] = {
+ /* Each character is 5 x 9 pixels */
+ 0, 2, 2, 2, 2, 0, 2, 0, 0, /* ! */
+ 0, 5, 5, 5, 0, 0, 0, 0, 0, /* " */
+ 0, 0, 5, 15, 5, 15, 5, 0, 0, /* # */
+ 0, 0, 7, 26, 7, 18, 7, 0, 0, /* $ */
+ 0, 8, 9, 2, 4, 25, 1, 0, 0, /* % */
+ 0, 0, 4, 10, 4, 10, 5, 0, 0, /* & */
+ 0, 2, 2, 2, 0, 0, 0, 0, 0, /* ' */
+ 0, 2, 4, 4, 4, 4, 2, 0, 0, /* ( */
+ 0, 4, 2, 2, 2, 2, 4, 0, 0, /* ) */
+ 0, 0, 5, 2, 7, 2, 5, 0, 0, /* * */
+ 0, 0, 2, 2, 15, 2, 2, 0, 0, /* + */
+ 0, 0, 0, 0, 16, 3, 2, 4, 0, /* , */
+ 0, 0, 0, 0, 15, 0, 0, 0, 0, /* - */
+ 0, 0, 0, 0, 0, 6, 6, 0, 0, /* . */
+ 0, 0, 1, 2, 4, 8, 0, 0, 0, /* / */
+ 0, 2, 5, 5, 5, 5, 2, 0, 0, /* 0 */
+ 0, 2, 6, 2, 2, 2, 7, 0, 0, /* 1 */
+ 0, 6, 9, 1, 2, 4, 15, 0, 0, /* 2 */
+ 0, 15, 1, 6, 1, 9, 6, 0, 0, /* 3 */
+ 0, 2, 6, 10, 15, 2, 2, 0, 0, /* 4 */
+ 0, 15, 8, 14, 1, 9, 6, 0, 0, /* 5 */
+ 0, 6, 8, 14, 9, 9, 6, 0, 0, /* 6 */
+ 0, 15, 1, 2, 2, 4, 4, 0, 0, /* 7 */
+ 0, 6, 9, 6, 9, 9, 6, 0, 0, /* 8 */
+ 0, 6, 9, 9, 7, 1, 6, 0, 0, /* 9 */
+ 0, 0, 6, 6, 0, 6, 6, 0, 0, /* : */
+ 0, 0, 6, 6, 0, 6, 4, 8, 0, /* ; */
+ 0, 0, 1, 2, 4, 2, 1, 0, 0, /* < */
+ 0, 0, 0, 15, 0, 15, 0, 0, 0, /* = */
+ 0, 0, 4, 2, 1, 2, 4, 0, 0, /* > */
+ 0, 2, 5, 1, 2, 0, 2, 0, 0, /* ? */
+ 0, 6, 9, 11, 11, 8, 6, 0, 0, /* @ */
+ 0, 6, 9, 9, 15, 9, 9, 0, 0, /* A */
+ 0, 14, 9, 14, 9, 9, 14, 0, 0, /* B */
+ 0, 6, 9, 8, 8, 9, 6, 0, 0, /* C */
+ 0, 14, 9, 9, 9, 9, 14, 0, 0, /* D */
+ 0, 15, 8, 14, 8, 8, 15, 0, 0, /* E */
+ 0, 15, 8, 14, 8, 8, 8, 0, 0, /* F */
+ 0, 6, 9, 8, 11, 9, 7, 0, 0, /* G */
+ 0, 9, 9, 15, 9, 9, 9, 0, 0, /* H */
+ 0, 7, 2, 2, 2, 2, 7, 0, 0, /* I */
+ 0, 1, 1, 1, 1, 9, 6, 0, 0, /* J */
+ 0, 9, 10, 12, 12, 10, 9, 0, 0, /* K */
+ 0, 8, 8, 8, 8, 8, 15, 0, 0, /* L */
+ 0, 9, 15, 15, 9, 9, 9, 0, 0, /* M */
+ 0, 9, 13, 13, 11, 11, 9, 0, 0, /* N */
+ 0, 6, 9, 9, 9, 9, 6, 0, 0, /* O */
+ 0, 14, 9, 9, 14, 8, 8, 0, 0, /* P */
+ 0, 6, 9, 9, 9, 13, 6, 1, 0, /* Q */
+ 0, 14, 9, 9, 14, 10, 9, 0, 0, /* R */
+ 0, 6, 9, 4, 2, 9, 6, 0, 0, /* S */
+ 0, 7, 2, 2, 2, 2, 2, 0, 0, /* T */
+ 0, 9, 9, 9, 9, 9, 6, 0, 0, /* U */
+ 0, 9, 9, 9, 9, 6, 6, 0, 0, /* V */
+ 0, 9, 9, 9, 15, 15, 9, 0, 0, /* W */
+ 0, 9, 9, 6, 6, 9, 9, 0, 0, /* X */
+ 0, 5, 5, 5, 2, 2, 2, 0, 0, /* Y */
+ 0, 15, 1, 2, 4, 8, 15, 0, 0, /* Z */
+ 0, 7, 4, 4, 4, 4, 7, 0, 0, /* [ */
+ 0, 0, 8, 4, 2, 1, 0, 0, 0, /* \ */
+ 0, 7, 1, 1, 1, 1, 7, 0, 0, /* ] */
+ 0, 2, 5, 0, 0, 0, 0, 0, 0, /* ^ */
+ 0, 0, 0, 0, 0, 0, 15, 0, 0, /* _ */
+ 0, 4, 2, 0, 0, 0, 0, 0, 0, /* ` */
+ 0, 0, 0, 7, 9, 11, 5, 0, 0, /* a */
+ 0, 8, 8, 14, 9, 9, 14, 0, 0, /* b */
+ 0, 0, 0, 6, 8, 8, 6, 0, 0, /* c */
+ 0, 1, 1, 7, 9, 9, 7, 0, 0, /* d */
+ 0, 0, 0, 6, 11, 12, 6, 0, 0, /* e */
+ 0, 2, 5, 4, 14, 4, 4, 0, 0, /* f */
+ 0, 0, 0, 7, 9, 6, 8, 7, 0, /* g */
+ 0, 8, 8, 14, 9, 9, 9, 0, 0, /* h */
+ 0, 2, 0, 6, 2, 2, 7, 0, 0, /* i */
+ 0, 1, 0, 1, 1, 1, 5, 2, 0, /* j */
+ 0, 8, 8, 10, 12, 10, 9, 0, 0, /* k */
+ 0, 6, 2, 2, 2, 2, 7, 0, 0, /* l */
+ 0, 0, 0, 10, 15, 9, 9, 0, 0, /* m */
+ 0, 0, 0, 14, 9, 9, 9, 0, 0, /* n */
+ 0, 0, 0, 6, 9, 9, 6, 0, 0, /* o */
+ 0, 0, 0, 14, 9, 9, 14, 8, 0, /* p */
+ 0, 0, 0, 7, 9, 9, 7, 1, 0, /* q */
+ 0, 0, 0, 14, 9, 8, 8, 0, 0, /* r */
+ 0, 0, 0, 7, 12, 3, 14, 0, 0, /* s */
+ 0, 4, 4, 14, 4, 4, 3, 0, 0, /* t */
+ 0, 0, 0, 9, 9, 9, 7, 0, 0, /* u */
+ 0, 0, 0, 5, 5, 5, 2, 0, 0, /* v */
+ 0, 0, 0, 9, 9, 15, 15, 0, 0, /* w */
+ 0, 0, 0, 9, 6, 6, 9, 0, 0, /* x */
+ 0, 0, 0, 9, 9, 5, 2, 4, 0, /* y */
+ 0, 0, 0, 15, 2, 4, 15, 0, 0, /* z */
+ 0, 1, 2, 6, 2, 2, 1, 0, 0, /* { */
+ 0, 2, 2, 2, 2, 2, 2, 0, 0, /* | */
+ 0, 4, 2, 3, 2, 2, 4, 0, 0, /* } */
+ 0, 5, 10, 0, 0, 0, 0, 0, 0, /* ~ */
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, /* */
+ 0, 2, 0, 2, 2, 2, 2, 0, 0, /* ¡ */
+ 0, 0, 2, 7, 10, 10, 7, 2, 0, /* ¢ */
+ 0, 0, 3, 4, 14, 4, 11, 0, 0, /* £ */
+ 0, 0, 8, 7, 5, 7, 8, 0, 0, /* ¤ */
+ 0, 5, 21, 2, 7, 2, 18, 0, 0, /* ¥ */
+ 0, 0, 2, 2, 0, 2, 2, 0, 0, /* ¦ */
+ 0, 3, 4, 6, 5, 3, 1, 6, 0, /* § */
+ 0, 5, 0, 0, 0, 0, 0, 0, 0, /* ¨ */
+ 0, 7, 8, 10, 12, 10, 8, 7, 0, /* © */
+ 0, 6, 26, 22, 16, 16, 16, 0, 0, /* ª */
+ 0, 0, 0, 4, 9, 4, 0, 0, 0, /* « */
+ 0, 0, 0, 16, 15, 17, 0, 0, 0, /* ¬ */
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, /* Â */
+ 0, 7, 8, 14, 12, 12, 8, 7, 0, /* ® */
+ 0, 15, 16, 16, 16, 16, 16, 0, 0, /* ¯ */
+ 0, 2, 5, 2, 0, 0, 0, 0, 0, /* ° */
+ 0, 2, 2, 15, 2, 2, 15, 0, 0, /* ± */
+ 0, 6, 2, 20, 6, 0, 16, 0, 0, /* ² */
+ 0, 6, 6, 2, 6, 0, 0, 0, 0, /* ³ */
+ 0, 2, 4, 0, 0, 0, 0, 0, 0, /* ´ */
+ 0, 0, 0, 9, 9, 9, 14, 8, 0, /* µ */
+ 0, 7, 13, 13, 5, 5, 5, 0, 0, /* ¶ */
+ 0, 0, 0, 6, 6, 0, 0, 0, 0, /* · */
+ 0, 0, 0, 0, 0, 0, 2, 4, 0, /* ¸ */
+ 0, 2, 6, 2, 7, 0, 0, 0, 0, /* ¹ */
+ 0, 4, 10, 4, 0, 0, 0, 0, 0, /* º */
+ 0, 0, 0, 9, 4, 9, 0, 0, 0, /* » */
+ 0, 8, 8, 8, 25, 3, 7, 1, 0, /* ¼ */
+ 0, 8, 8, 8, 11, 1, 2, 3, 0, /* ½ */
+ 0, 12, 12, 4, 13, 3, 7, 1, 0, /* ¾ */
+ 0, 2, 0, 2, 4, 5, 2, 0, 0, /* ¿ */
+ 0, 6, 9, 9, 15, 9, 9, 0, 0, /* À */
+ 0, 6, 9, 9, 15, 9, 9, 0, 0, /* Ã */
+ 0, 6, 9, 9, 15, 9, 9, 0, 0, /* Â */
+ 0, 6, 9, 9, 15, 9, 9, 0, 0, /* Ã */
+ 0, 9, 6, 9, 15, 9, 9, 0, 0, /* Ä */
+ 0, 6, 6, 9, 15, 9, 9, 0, 0, /* Ã… */
+ 0, 7, 10, 11, 14, 10, 11, 0, 0, /* Æ */
+ 0, 6, 9, 8, 8, 9, 6, 4, 0, /* Ç */
+ 0, 15, 8, 14, 8, 8, 15, 0, 0, /* È */
+ 0, 15, 8, 14, 8, 8, 15, 0, 0, /* É */
+ 0, 15, 8, 14, 8, 8, 15, 0, 0, /* Ê */
+ 0, 15, 8, 14, 8, 8, 15, 0, 0, /* Ë */
+ 0, 7, 2, 2, 2, 2, 7, 0, 0, /* Ì */
+ 0, 7, 2, 2, 2, 2, 7, 0, 0, /* Ã */
+ 0, 7, 2, 2, 2, 2, 7, 0, 0, /* ÃŽ */
+ 0, 7, 2, 2, 2, 2, 7, 0, 0, /* Ã */
+ 0, 14, 5, 13, 5, 5, 14, 0, 0, /* Ã */
+ 0, 11, 9, 13, 11, 11, 9, 0, 0, /* Ñ */
+ 0, 6, 9, 9, 9, 9, 6, 0, 0, /* Ã’ */
+ 0, 6, 9, 9, 9, 9, 6, 0, 0, /* Ó */
+ 0, 6, 9, 9, 9, 9, 6, 0, 0, /* Ô */
+ 0, 6, 9, 9, 9, 9, 6, 0, 0, /* Õ */
+ 0, 9, 6, 9, 9, 9, 6, 0, 0, /* Ö */
+ 0, 0, 0, 9, 6, 6, 9, 0, 0, /* × */
+ 0, 7, 11, 11, 13, 13, 14, 0, 0, /* Ø */
+ 0, 9, 9, 9, 9, 9, 6, 0, 0, /* Ù */
+ 0, 9, 9, 9, 9, 9, 6, 0, 0, /* Ú */
+ 0, 9, 9, 9, 9, 9, 6, 0, 0, /* Û */
+ 0, 9, 0, 9, 9, 9, 6, 0, 0, /* Ü */
+ 0, 5, 5, 5, 2, 2, 2, 0, 0, /* Ã */
+ 0, 8, 14, 9, 14, 8, 8, 0, 0, /* Þ */
+ 0, 6, 9, 10, 9, 9, 10, 0, 0, /* ß */
+ 0, 4, 2, 7, 9, 11, 5, 0, 0, /* Ã */
+ 0, 2, 4, 7, 9, 11, 5, 0, 0, /* á */
+ 0, 2, 5, 7, 9, 11, 5, 0, 0, /* â */
+ 0, 5, 10, 7, 9, 11, 5, 0, 0, /* ã */
+ 0, 5, 0, 7, 9, 11, 5, 0, 0, /* ä */
+ 0, 6, 6, 7, 9, 11, 5, 0, 0, /* å */
+ 0, 0, 0, 7, 11, 10, 7, 0, 0, /* æ */
+ 0, 0, 0, 3, 4, 4, 3, 2, 0, /* ç */
+ 0, 4, 2, 6, 11, 12, 6, 0, 0, /* è */
+ 0, 2, 4, 6, 11, 12, 6, 0, 0, /* é */
+ 0, 4, 10, 6, 11, 12, 6, 0, 0, /* ê */
+ 0, 10, 0, 6, 11, 12, 6, 0, 0, /* ë */
+ 0, 4, 2, 6, 2, 2, 7, 0, 0, /* ì */
+ 0, 2, 4, 6, 2, 2, 7, 0, 0, /* Ã */
+ 0, 2, 5, 6, 2, 2, 7, 0, 0, /* î */
+ 0, 5, 0, 6, 2, 2, 7, 0, 0, /* ï */
+ 0, 4, 3, 6, 9, 9, 6, 0, 0, /* ð */
+ 0, 5, 10, 14, 9, 9, 9, 0, 0, /* ñ */
+ 0, 4, 2, 6, 9, 9, 6, 0, 0, /* ò */
+ 0, 2, 4, 6, 9, 9, 6, 0, 0, /* ó */
+ 0, 6, 0, 6, 9, 9, 6, 0, 0, /* ô */
+ 0, 5, 10, 6, 9, 9, 6, 0, 0, /* õ */
+ 0, 5, 0, 6, 9, 9, 6, 0, 0, /* ö */
+ 0, 0, 6, 0, 15, 0, 6, 0, 0, /* ÷ */
+ 0, 0, 0, 7, 11, 13, 14, 0, 0, /* ø */
+ 0, 4, 2, 9, 9, 9, 7, 0, 0, /* ù */
+ 0, 2, 4, 9, 9, 9, 7, 0, 0, /* ú */
+ 0, 6, 0, 9, 9, 9, 7, 0, 0, /* û */
+ 0, 5, 0, 9, 9, 9, 7, 0, 0, /* ü */
+ 0, 2, 4, 9, 9, 5, 2, 4, 0, /* ý */
+ 0, 0, 8, 14, 9, 9, 14, 8, 0, /* þ */
+ 0, 5, 0, 9, 9, 5, 2, 4, 0, /* ÿ */
+};
diff --git a/3rdparty/zint-2.6.1/backend/gb18030.h b/3rdparty/zint-2.6.1/backend/gb18030.h
new file mode 100644
index 0000000..131aab9
--- /dev/null
+++ b/3rdparty/zint-2.6.1/backend/gb18030.h
@@ -0,0 +1,23324 @@
+/* gb18030.h - Unicode to GB 18030 lookup table
+
+ libzint - the open source barcode library
+ Copyright (C) 2009-2017 Robin Stuart
+
+ Redistribution and use in source and binary forms, with or without
+ modification, are permitted provided that the following conditions
+ are met:
+
+ 1. Redistributions of source code must retain the above copyright
+ notice, this list of conditions and the following disclaimer.
+ 2. Redistributions in binary form must reproduce the above copyright
+ notice, this list of conditions and the following disclaimer in the
+ documentation and/or other materials provided with the distribution.
+ 3. Neither the name of the project nor the names of its contributors
+ may be used to endorse or promote products derived from this software
+ without specific prior written permission.
+
+ THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND
+ ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+ ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE
+ FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+ DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
+ OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
+ HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
+ LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
+ OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+ SUCH DAMAGE.
+ */
+
+static const unsigned short int gb18030_twobyte_lookup[] = {
+ 0x0144, 0xA8BD,
+ 0x0148, 0xA8BE,
+ 0x01F9, 0xA8BF,
+ 0x0251, 0xA8BB,
+ 0x0261, 0xA8C0,
+ 0x02CA, 0xA840,
+ 0x02CB, 0xA841,
+ 0x02D9, 0xA842,
+ 0x2010, 0xA95C,
+ 0x2013, 0xA843,
+ 0x2015, 0xA844,
+ 0x2025, 0xA845,
+ 0x2035, 0xA846,
+ 0x20AC, 0xA2E3,
+ 0x2105, 0xA847,
+ 0x2109, 0xA848,
+ 0x2121, 0xA959,
+ 0x2170, 0xA2A1,
+ 0x2171, 0xA2A2,
+ 0x2172, 0xA2A3,
+ 0x2173, 0xA2A4,
+ 0x2174, 0xA2A5,
+ 0x2175, 0xA2A6,
+ 0x2176, 0xA2A7,
+ 0x2177, 0xA2A8,
+ 0x2178, 0xA2A9,
+ 0x2179, 0xA2AA,
+ 0x2196, 0xA849,
+ 0x2197, 0xA84A,
+ 0x2198, 0xA84B,
+ 0x2199, 0xA84C,
+ 0x2215, 0xA84D,
+ 0x221F, 0xA84E,
+ 0x2223, 0xA84F,
+ 0x2252, 0xA850,
+ 0x2266, 0xA851,
+ 0x2267, 0xA852,
+ 0x2295, 0xA892,
+ 0x22BF, 0xA853,
+ 0x2550, 0xA854,
+ 0x2551, 0xA855,
+ 0x2552, 0xA856,
+ 0x2553, 0xA857,
+ 0x2554, 0xA858,
+ 0x2555, 0xA859,
+ 0x2556, 0xA85A,
+ 0x2557, 0xA85B,
+ 0x2558, 0xA85C,
+ 0x2559, 0xA85D,
+ 0x255A, 0xA85E,
+ 0x255B, 0xA85F,
+ 0x255C, 0xA860,
+ 0x255D, 0xA861,
+ 0x255E, 0xA862,
+ 0x255F, 0xA863,
+ 0x2560, 0xA864,
+ 0x2561, 0xA865,
+ 0x2562, 0xA866,
+ 0x2563, 0xA867,
+ 0x2564, 0xA868,
+ 0x2565, 0xA869,
+ 0x2566, 0xA86A,
+ 0x2567, 0xA86B,
+ 0x2568, 0xA86C,
+ 0x2569, 0xA86D,
+ 0x256A, 0xA86E,
+ 0x256B, 0xA86F,
+ 0x256C, 0xA870,
+ 0x256D, 0xA871,
+ 0x256E, 0xA872,
+ 0x256F, 0xA873,
+ 0x2570, 0xA874,
+ 0x2571, 0xA875,
+ 0x2572, 0xA876,
+ 0x2573, 0xA877,
+ 0x2581, 0xA878,
+ 0x2582, 0xA879,
+ 0x2583, 0xA87A,
+ 0x2584, 0xA87B,
+ 0x2585, 0xA87C,
+ 0x2586, 0xA87D,
+ 0x2587, 0xA87E,
+ 0x2588, 0xA880,
+ 0x2589, 0xA881,
+ 0x258A, 0xA882,
+ 0x258B, 0xA883,
+ 0x258C, 0xA884,
+ 0x258D, 0xA885,
+ 0x258E, 0xA886,
+ 0x258F, 0xA887,
+ 0x2593, 0xA888,
+ 0x2594, 0xA889,
+ 0x2595, 0xA88A,
+ 0x25BC, 0xA88B,
+ 0x25BD, 0xA88C,
+ 0x25E2, 0xA88D,
+ 0x25E3, 0xA88E,
+ 0x25E4, 0xA88F,
+ 0x25E5, 0xA890,
+ 0x2609, 0xA891,
+ 0x2E81, 0xFE50,
+ 0x2E84, 0xFE54,
+ 0x2E88, 0xFE57,
+ 0x2E8B, 0xFE58,
+ 0x2E8C, 0xFE5D,
+ 0x2E97, 0xFE5E,
+ 0x2EA7, 0xFE6B,
+ 0x2EAA, 0xFE6E,
+ 0x2EAE, 0xFE71,
+ 0x2EB3, 0xFE73,
+ 0x2EB6, 0xFE74,
+ 0x2EB7, 0xFE75,
+ 0x2EBB, 0xFE79,
+ 0x2ECA, 0xFE84,
+ 0x2FF0, 0xA98A,
+ 0x2FF1, 0xA98B,
+ 0x2FF2, 0xA98C,
+ 0x2FF3, 0xA98D,
+ 0x2FF4, 0xA98E,
+ 0x2FF5, 0xA98F,
+ 0x2FF6, 0xA990,
+ 0x2FF7, 0xA991,
+ 0x2FF8, 0xA992,
+ 0x2FF9, 0xA993,
+ 0x2FFA, 0xA994,
+ 0x2FFB, 0xA995,
+ 0x3006, 0xA965,
+ 0x3007, 0xA996,
+ 0x3012, 0xA893,
+ 0x301D, 0xA894,
+ 0x301E, 0xA895,
+ 0x3021, 0xA940,
+ 0x3022, 0xA941,
+ 0x3023, 0xA942,
+ 0x3024, 0xA943,
+ 0x3025, 0xA944,
+ 0x3026, 0xA945,
+ 0x3027, 0xA946,
+ 0x3028, 0xA947,
+ 0x3029, 0xA948,
+ 0x303E, 0xA989,
+ 0x309B, 0xA961,
+ 0x309C, 0xA962,
+ 0x309D, 0xA966,
+ 0x309E, 0xA967,
+ 0x30FC, 0xA960,
+ 0x30FD, 0xA963,
+ 0x30FE, 0xA964,
+ 0x3231, 0xA95A,
+ 0x32A3, 0xA949,
+ 0x338E, 0xA94A,
+ 0x338F, 0xA94B,
+ 0x339C, 0xA94C,
+ 0x339D, 0xA94D,
+ 0x339E, 0xA94E,
+ 0x33A1, 0xA94F,
+ 0x33C4, 0xA950,
+ 0x33CE, 0xA951,
+ 0x33D1, 0xA952,
+ 0x33D2, 0xA953,
+ 0x33D5, 0xA954,
+ 0x3447, 0xFE56,
+ 0x3473, 0xFE55,
+ 0x359E, 0xFE5A,
+ 0x360E, 0xFE5C,
+ 0x361A, 0xFE5B,
+ 0x3918, 0xFE60,
+ 0x396E, 0xFE5F,
+ 0x39CF, 0xFE62,
+ 0x39D0, 0xFE65,
+ 0x39DF, 0xFE63,
+ 0x3A73, 0xFE64,
+ 0x3B4E, 0xFE68,
+ 0x3C6E, 0xFE69,
+ 0x3CE0, 0xFE6A,
+ 0x4056, 0xFE6F,
+ 0x415F, 0xFE70,
+ 0x4337, 0xFE72,
+ 0x43AC, 0xFE78,
+ 0x43B1, 0xFE77,
+ 0x43DD, 0xFE7A,
+ 0x44D6, 0xFE7B,
+ 0x464C, 0xFE7D,
+ 0x4661, 0xFE7C,
+ 0x4723, 0xFE80,
+ 0x4729, 0xFE81,
+ 0x477C, 0xFE82,
+ 0x478D, 0xFE83,
+ 0x4947, 0xFE85,
+ 0x497A, 0xFE86,
+ 0x497D, 0xFE87,
+ 0x4982, 0xFE88,
+ 0x4983, 0xFE89,
+ 0x4985, 0xFE8A,
+ 0x4986, 0xFE8B,
+ 0x499B, 0xFE8D,
+ 0x499F, 0xFE8C,
+ 0x49B6, 0xFE8F,
+ 0x49B7, 0xFE8E,
+ 0x4C77, 0xFE96,
+ 0x4C9F, 0xFE93,
+ 0x4CA0, 0xFE94,
+ 0x4CA1, 0xFE95,
+ 0x4CA2, 0xFE97,
+ 0x4CA3, 0xFE92,
+ 0x4D13, 0xFE98,
+ 0x4D14, 0xFE99,
+ 0x4D15, 0xFE9A,
+ 0x4D16, 0xFE9B,
+ 0x4D17, 0xFE9C,
+ 0x4D18, 0xFE9D,
+ 0x4D19, 0xFE9E,
+ 0x4DAE, 0xFE9F,
+ 0x4E02, 0x8140,
+ 0x4E04, 0x8141,
+ 0x4E05, 0x8142,
+ 0x4E06, 0x8143,
+ 0x4E0F, 0x8144,
+ 0x4E12, 0x8145,
+ 0x4E17, 0x8146,
+ 0x4E1F, 0x8147,
+ 0x4E20, 0x8148,
+ 0x4E21, 0x8149,
+ 0x4E23, 0x814A,
+ 0x4E26, 0x814B,
+ 0x4E29, 0x814C,
+ 0x4E2E, 0x814D,
+ 0x4E2F, 0x814E,
+ 0x4E31, 0x814F,
+ 0x4E33, 0x8150,
+ 0x4E35, 0x8151,
+ 0x4E37, 0x8152,
+ 0x4E3C, 0x8153,
+ 0x4E40, 0x8154,
+ 0x4E41, 0x8155,
+ 0x4E42, 0x8156,
+ 0x4E44, 0x8157,
+ 0x4E46, 0x8158,
+ 0x4E4A, 0x8159,
+ 0x4E51, 0x815A,
+ 0x4E55, 0x815B,
+ 0x4E57, 0x815C,
+ 0x4E5A, 0x815D,
+ 0x4E5B, 0x815E,
+ 0x4E62, 0x815F,
+ 0x4E63, 0x8160,
+ 0x4E64, 0x8161,
+ 0x4E65, 0x8162,
+ 0x4E67, 0x8163,
+ 0x4E68, 0x8164,
+ 0x4E6A, 0x8165,
+ 0x4E6B, 0x8166,
+ 0x4E6C, 0x8167,
+ 0x4E6D, 0x8168,
+ 0x4E6E, 0x8169,
+ 0x4E6F, 0x816A,
+ 0x4E72, 0x816B,
+ 0x4E74, 0x816C,
+ 0x4E75, 0x816D,
+ 0x4E76, 0x816E,
+ 0x4E77, 0x816F,
+ 0x4E78, 0x8170,
+ 0x4E79, 0x8171,
+ 0x4E7A, 0x8172,
+ 0x4E7B, 0x8173,
+ 0x4E7C, 0x8174,
+ 0x4E7D, 0x8175,
+ 0x4E7F, 0x8176,
+ 0x4E80, 0x8177,
+ 0x4E81, 0x8178,
+ 0x4E82, 0x8179,
+ 0x4E83, 0x817A,
+ 0x4E84, 0x817B,
+ 0x4E85, 0x817C,
+ 0x4E87, 0x817D,
+ 0x4E8A, 0x817E,
+ 0x4E90, 0x8180,
+ 0x4E96, 0x8181,
+ 0x4E97, 0x8182,
+ 0x4E99, 0x8183,
+ 0x4E9C, 0x8184,
+ 0x4E9D, 0x8185,
+ 0x4E9E, 0x8186,
+ 0x4EA3, 0x8187,
+ 0x4EAA, 0x8188,
+ 0x4EAF, 0x8189,
+ 0x4EB0, 0x818A,
+ 0x4EB1, 0x818B,
+ 0x4EB4, 0x818C,
+ 0x4EB6, 0x818D,
+ 0x4EB7, 0x818E,
+ 0x4EB8, 0x818F,
+ 0x4EB9, 0x8190,
+ 0x4EBC, 0x8191,
+ 0x4EBD, 0x8192,
+ 0x4EBE, 0x8193,
+ 0x4EC8, 0x8194,
+ 0x4ECC, 0x8195,
+ 0x4ECF, 0x8196,
+ 0x4ED0, 0x8197,
+ 0x4ED2, 0x8198,
+ 0x4EDA, 0x8199,
+ 0x4EDB, 0x819A,
+ 0x4EDC, 0x819B,
+ 0x4EE0, 0x819C,
+ 0x4EE2, 0x819D,
+ 0x4EE6, 0x819E,
+ 0x4EE7, 0x819F,
+ 0x4EE9, 0x81A0,
+ 0x4EED, 0x81A1,
+ 0x4EEE, 0x81A2,
+ 0x4EEF, 0x81A3,
+ 0x4EF1, 0x81A4,
+ 0x4EF4, 0x81A5,
+ 0x4EF8, 0x81A6,
+ 0x4EF9, 0x81A7,
+ 0x4EFA, 0x81A8,
+ 0x4EFC, 0x81A9,
+ 0x4EFE, 0x81AA,
+ 0x4F00, 0x81AB,
+ 0x4F02, 0x81AC,
+ 0x4F03, 0x81AD,
+ 0x4F04, 0x81AE,
+ 0x4F05, 0x81AF,
+ 0x4F06, 0x81B0,
+ 0x4F07, 0x81B1,
+ 0x4F08, 0x81B2,
+ 0x4F0B, 0x81B3,
+ 0x4F0C, 0x81B4,
+ 0x4F12, 0x81B5,
+ 0x4F13, 0x81B6,
+ 0x4F14, 0x81B7,
+ 0x4F15, 0x81B8,
+ 0x4F16, 0x81B9,
+ 0x4F1C, 0x81BA,
+ 0x4F1D, 0x81BB,
+ 0x4F21, 0x81BC,
+ 0x4F23, 0x81BD,
+ 0x4F28, 0x81BE,
+ 0x4F29, 0x81BF,
+ 0x4F2C, 0x81C0,
+ 0x4F2D, 0x81C1,
+ 0x4F2E, 0x81C2,
+ 0x4F31, 0x81C3,
+ 0x4F33, 0x81C4,
+ 0x4F35, 0x81C5,
+ 0x4F37, 0x81C6,
+ 0x4F39, 0x81C7,
+ 0x4F3B, 0x81C8,
+ 0x4F3E, 0x81C9,
+ 0x4F3F, 0x81CA,
+ 0x4F40, 0x81CB,
+ 0x4F41, 0x81CC,
+ 0x4F42, 0x81CD,
+ 0x4F44, 0x81CE,
+ 0x4F45, 0x81CF,
+ 0x4F47, 0x81D0,
+ 0x4F48, 0x81D1,
+ 0x4F49, 0x81D2,
+ 0x4F4A, 0x81D3,
+ 0x4F4B, 0x81D4,
+ 0x4F4C, 0x81D5,
+ 0x4F52, 0x81D6,
+ 0x4F54, 0x81D7,
+ 0x4F56, 0x81D8,
+ 0x4F61, 0x81D9,
+ 0x4F62, 0x81DA,
+ 0x4F66, 0x81DB,
+ 0x4F68, 0x81DC,
+ 0x4F6A, 0x81DD,
+ 0x4F6B, 0x81DE,
+ 0x4F6D, 0x81DF,
+ 0x4F6E, 0x81E0,
+ 0x4F71, 0x81E1,
+ 0x4F72, 0x81E2,
+ 0x4F75, 0x81E3,
+ 0x4F77, 0x81E4,
+ 0x4F78, 0x81E5,
+ 0x4F79, 0x81E6,
+ 0x4F7A, 0x81E7,
+ 0x4F7D, 0x81E8,
+ 0x4F80, 0x81E9,
+ 0x4F81, 0x81EA,
+ 0x4F82, 0x81EB,
+ 0x4F85, 0x81EC,
+ 0x4F86, 0x81ED,
+ 0x4F87, 0x81EE,
+ 0x4F8A, 0x81EF,
+ 0x4F8C, 0x81F0,
+ 0x4F8E, 0x81F1,
+ 0x4F90, 0x81F2,
+ 0x4F92, 0x81F3,
+ 0x4F93, 0x81F4,
+ 0x4F95, 0x81F5,
+ 0x4F96, 0x81F6,
+ 0x4F98, 0x81F7,
+ 0x4F99, 0x81F8,
+ 0x4F9A, 0x81F9,
+ 0x4F9C, 0x81FA,
+ 0x4F9E, 0x81FB,
+ 0x4F9F, 0x81FC,
+ 0x4FA1, 0x81FD,
+ 0x4FA2, 0x81FE,
+ 0x4FA4, 0x8240,
+ 0x4FAB, 0x8241,
+ 0x4FAD, 0x8242,
+ 0x4FB0, 0x8243,
+ 0x4FB1, 0x8244,
+ 0x4FB2, 0x8245,
+ 0x4FB3, 0x8246,
+ 0x4FB4, 0x8247,
+ 0x4FB6, 0x8248,
+ 0x4FB7, 0x8249,
+ 0x4FB8, 0x824A,
+ 0x4FB9, 0x824B,
+ 0x4FBA, 0x824C,
+ 0x4FBB, 0x824D,
+ 0x4FBC, 0x824E,
+ 0x4FBD, 0x824F,
+ 0x4FBE, 0x8250,
+ 0x4FC0, 0x8251,
+ 0x4FC1, 0x8252,
+ 0x4FC2, 0x8253,
+ 0x4FC6, 0x8254,
+ 0x4FC7, 0x8255,
+ 0x4FC8, 0x8256,
+ 0x4FC9, 0x8257,
+ 0x4FCB, 0x8258,
+ 0x4FCC, 0x8259,
+ 0x4FCD, 0x825A,
+ 0x4FD2, 0x825B,
+ 0x4FD3, 0x825C,
+ 0x4FD4, 0x825D,
+ 0x4FD5, 0x825E,
+ 0x4FD6, 0x825F,
+ 0x4FD9, 0x8260,
+ 0x4FDB, 0x8261,
+ 0x4FE0, 0x8262,
+ 0x4FE2, 0x8263,
+ 0x4FE4, 0x8264,
+ 0x4FE5, 0x8265,
+ 0x4FE7, 0x8266,
+ 0x4FEB, 0x8267,
+ 0x4FEC, 0x8268,
+ 0x4FF0, 0x8269,
+ 0x4FF2, 0x826A,
+ 0x4FF4, 0x826B,
+ 0x4FF5, 0x826C,
+ 0x4FF6, 0x826D,
+ 0x4FF7, 0x826E,
+ 0x4FF9, 0x826F,
+ 0x4FFB, 0x8270,
+ 0x4FFC, 0x8271,
+ 0x4FFD, 0x8272,
+ 0x4FFF, 0x8273,
+ 0x5000, 0x8274,
+ 0x5001, 0x8275,
+ 0x5002, 0x8276,
+ 0x5003, 0x8277,
+ 0x5004, 0x8278,
+ 0x5005, 0x8279,
+ 0x5006, 0x827A,
+ 0x5007, 0x827B,
+ 0x5008, 0x827C,
+ 0x5009, 0x827D,
+ 0x500A, 0x827E,
+ 0x500B, 0x8280,
+ 0x500E, 0x8281,
+ 0x5010, 0x8282,
+ 0x5011, 0x8283,
+ 0x5013, 0x8284,
+ 0x5015, 0x8285,
+ 0x5016, 0x8286,
+ 0x5017, 0x8287,
+ 0x501B, 0x8288,
+ 0x501D, 0x8289,
+ 0x501E, 0x828A,
+ 0x5020, 0x828B,
+ 0x5022, 0x828C,
+ 0x5023, 0x828D,
+ 0x5024, 0x828E,
+ 0x5027, 0x828F,
+ 0x502B, 0x8290,
+ 0x502F, 0x8291,
+ 0x5030, 0x8292,
+ 0x5031, 0x8293,
+ 0x5032, 0x8294,
+ 0x5033, 0x8295,
+ 0x5034, 0x8296,
+ 0x5035, 0x8297,
+ 0x5036, 0x8298,
+ 0x5037, 0x8299,
+ 0x5038, 0x829A,
+ 0x5039, 0x829B,
+ 0x503B, 0x829C,
+ 0x503D, 0x829D,
+ 0x503F, 0x829E,
+ 0x5040, 0x829F,
+ 0x5041, 0x82A0,
+ 0x5042, 0x82A1,
+ 0x5044, 0x82A2,
+ 0x5045, 0x82A3,
+ 0x5046, 0x82A4,
+ 0x5049, 0x82A5,
+ 0x504A, 0x82A6,
+ 0x504B, 0x82A7,
+ 0x504D, 0x82A8,
+ 0x5050, 0x82A9,
+ 0x5051, 0x82AA,
+ 0x5052, 0x82AB,
+ 0x5053, 0x82AC,
+ 0x5054, 0x82AD,
+ 0x5056, 0x82AE,
+ 0x5057, 0x82AF,
+ 0x5058, 0x82B0,
+ 0x5059, 0x82B1,
+ 0x505B, 0x82B2,
+ 0x505D, 0x82B3,
+ 0x505E, 0x82B4,
+ 0x505F, 0x82B5,
+ 0x5060, 0x82B6,
+ 0x5061, 0x82B7,
+ 0x5062, 0x82B8,
+ 0x5063, 0x82B9,
+ 0x5064, 0x82BA,
+ 0x5066, 0x82BB,
+ 0x5067, 0x82BC,
+ 0x5068, 0x82BD,
+ 0x5069, 0x82BE,
+ 0x506A, 0x82BF,
+ 0x506B, 0x82C0,
+ 0x506D, 0x82C1,
+ 0x506E, 0x82C2,
+ 0x506F, 0x82C3,
+ 0x5070, 0x82C4,
+ 0x5071, 0x82C5,
+ 0x5072, 0x82C6,
+ 0x5073, 0x82C7,
+ 0x5074, 0x82C8,
+ 0x5075, 0x82C9,
+ 0x5078, 0x82CA,
+ 0x5079, 0x82CB,
+ 0x507A, 0x82CC,
+ 0x507C, 0x82CD,
+ 0x507D, 0x82CE,
+ 0x5081, 0x82CF,
+ 0x5082, 0x82D0,
+ 0x5083, 0x82D1,
+ 0x5084, 0x82D2,
+ 0x5086, 0x82D3,
+ 0x5087, 0x82D4,
+ 0x5089, 0x82D5,
+ 0x508A, 0x82D6,
+ 0x508B, 0x82D7,
+ 0x508C, 0x82D8,
+ 0x508E, 0x82D9,
+ 0x508F, 0x82DA,
+ 0x5090, 0x82DB,
+ 0x5091, 0x82DC,
+ 0x5092, 0x82DD,
+ 0x5093, 0x82DE,
+ 0x5094, 0x82DF,
+ 0x5095, 0x82E0,
+ 0x5096, 0x82E1,
+ 0x5097, 0x82E2,
+ 0x5098, 0x82E3,
+ 0x5099, 0x82E4,
+ 0x509A, 0x82E5,
+ 0x509B, 0x82E6,
+ 0x509C, 0x82E7,
+ 0x509D, 0x82E8,
+ 0x509E, 0x82E9,
+ 0x509F, 0x82EA,
+ 0x50A0, 0x82EB,
+ 0x50A1, 0x82EC,
+ 0x50A2, 0x82ED,
+ 0x50A4, 0x82EE,
+ 0x50A6, 0x82EF,
+ 0x50AA, 0x82F0,
+ 0x50AB, 0x82F1,
+ 0x50AD, 0x82F2,
+ 0x50AE, 0x82F3,
+ 0x50AF, 0x82F4,
+ 0x50B0, 0x82F5,
+ 0x50B1, 0x82F6,
+ 0x50B3, 0x82F7,
+ 0x50B4, 0x82F8,
+ 0x50B5, 0x82F9,
+ 0x50B6, 0x82FA,
+ 0x50B7, 0x82FB,
+ 0x50B8, 0x82FC,
+ 0x50B9, 0x82FD,
+ 0x50BC, 0x82FE,
+ 0x50BD, 0x8340,
+ 0x50BE, 0x8341,
+ 0x50BF, 0x8342,
+ 0x50C0, 0x8343,
+ 0x50C1, 0x8344,
+ 0x50C2, 0x8345,
+ 0x50C3, 0x8346,
+ 0x50C4, 0x8347,
+ 0x50C5, 0x8348,
+ 0x50C6, 0x8349,
+ 0x50C7, 0x834A,
+ 0x50C8, 0x834B,
+ 0x50C9, 0x834C,
+ 0x50CA, 0x834D,
+ 0x50CB, 0x834E,
+ 0x50CC, 0x834F,
+ 0x50CD, 0x8350,
+ 0x50CE, 0x8351,
+ 0x50D0, 0x8352,
+ 0x50D1, 0x8353,
+ 0x50D2, 0x8354,
+ 0x50D3, 0x8355,
+ 0x50D4, 0x8356,
+ 0x50D5, 0x8357,
+ 0x50D7, 0x8358,
+ 0x50D8, 0x8359,
+ 0x50D9, 0x835A,
+ 0x50DB, 0x835B,
+ 0x50DC, 0x835C,
+ 0x50DD, 0x835D,
+ 0x50DE, 0x835E,
+ 0x50DF, 0x835F,
+ 0x50E0, 0x8360,
+ 0x50E1, 0x8361,
+ 0x50E2, 0x8362,
+ 0x50E3, 0x8363,
+ 0x50E4, 0x8364,
+ 0x50E5, 0x8365,
+ 0x50E8, 0x8366,
+ 0x50E9, 0x8367,
+ 0x50EA, 0x8368,
+ 0x50EB, 0x8369,
+ 0x50EF, 0x836A,
+ 0x50F0, 0x836B,
+ 0x50F1, 0x836C,
+ 0x50F2, 0x836D,
+ 0x50F4, 0x836E,
+ 0x50F6, 0x836F,
+ 0x50F7, 0x8370,
+ 0x50F8, 0x8371,
+ 0x50F9, 0x8372,
+ 0x50FA, 0x8373,
+ 0x50FC, 0x8374,
+ 0x50FD, 0x8375,
+ 0x50FE, 0x8376,
+ 0x50FF, 0x8377,
+ 0x5100, 0x8378,
+ 0x5101, 0x8379,
+ 0x5102, 0x837A,
+ 0x5103, 0x837B,
+ 0x5104, 0x837C,
+ 0x5105, 0x837D,
+ 0x5108, 0x837E,
+ 0x5109, 0x8380,
+ 0x510A, 0x8381,
+ 0x510C, 0x8382,
+ 0x510D, 0x8383,
+ 0x510E, 0x8384,
+ 0x510F, 0x8385,
+ 0x5110, 0x8386,
+ 0x5111, 0x8387,
+ 0x5113, 0x8388,
+ 0x5114, 0x8389,
+ 0x5115, 0x838A,
+ 0x5116, 0x838B,
+ 0x5117, 0x838C,
+ 0x5118, 0x838D,
+ 0x5119, 0x838E,
+ 0x511A, 0x838F,
+ 0x511B, 0x8390,
+ 0x511C, 0x8391,
+ 0x511D, 0x8392,
+ 0x511E, 0x8393,
+ 0x511F, 0x8394,
+ 0x5120, 0x8395,
+ 0x5122, 0x8396,
+ 0x5123, 0x8397,
+ 0x5124, 0x8398,
+ 0x5125, 0x8399,
+ 0x5126, 0x839A,
+ 0x5127, 0x839B,
+ 0x5128, 0x839C,
+ 0x5129, 0x839D,
+ 0x512A, 0x839E,
+ 0x512B, 0x839F,
+ 0x512C, 0x83A0,
+ 0x512D, 0x83A1,
+ 0x512E, 0x83A2,
+ 0x512F, 0x83A3,
+ 0x5130, 0x83A4,
+ 0x5131, 0x83A5,
+ 0x5132, 0x83A6,
+ 0x5133, 0x83A7,
+ 0x5134, 0x83A8,
+ 0x5135, 0x83A9,
+ 0x5136, 0x83AA,
+ 0x5137, 0x83AB,
+ 0x5138, 0x83AC,
+ 0x5139, 0x83AD,
+ 0x513A, 0x83AE,
+ 0x513B, 0x83AF,
+ 0x513C, 0x83B0,
+ 0x513D, 0x83B1,
+ 0x513E, 0x83B2,
+ 0x5142, 0x83B3,
+ 0x5147, 0x83B4,
+ 0x514A, 0x83B5,
+ 0x514C, 0x83B6,
+ 0x514E, 0x83B7,
+ 0x514F, 0x83B8,
+ 0x5150, 0x83B9,
+ 0x5152, 0x83BA,
+ 0x5153, 0x83BB,
+ 0x5157, 0x83BC,
+ 0x5158, 0x83BD,
+ 0x5159, 0x83BE,
+ 0x515B, 0x83BF,
+ 0x515D, 0x83C0,
+ 0x515E, 0x83C1,
+ 0x515F, 0x83C2,
+ 0x5160, 0x83C3,
+ 0x5161, 0x83C4,
+ 0x5163, 0x83C5,
+ 0x5164, 0x83C6,
+ 0x5166, 0x83C7,
+ 0x5167, 0x83C8,
+ 0x5169, 0x83C9,
+ 0x516A, 0x83CA,
+ 0x516F, 0x83CB,
+ 0x5172, 0x83CC,
+ 0x517A, 0x83CD,
+ 0x517E, 0x83CE,
+ 0x517F, 0x83CF,
+ 0x5183, 0x83D0,
+ 0x5184, 0x83D1,
+ 0x5186, 0x83D2,
+ 0x5187, 0x83D3,
+ 0x518A, 0x83D4,
+ 0x518B, 0x83D5,
+ 0x518E, 0x83D6,
+ 0x518F, 0x83D7,
+ 0x5190, 0x83D8,
+ 0x5191, 0x83D9,
+ 0x5193, 0x83DA,
+ 0x5194, 0x83DB,
+ 0x5198, 0x83DC,
+ 0x519A, 0x83DD,
+ 0x519D, 0x83DE,
+ 0x519E, 0x83DF,
+ 0x519F, 0x83E0,
+ 0x51A1, 0x83E1,
+ 0x51A3, 0x83E2,
+ 0x51A6, 0x83E3,
+ 0x51A7, 0x83E4,
+ 0x51A8, 0x83E5,
+ 0x51A9, 0x83E6,
+ 0x51AA, 0x83E7,
+ 0x51AD, 0x83E8,
+ 0x51AE, 0x83E9,
+ 0x51B4, 0x83EA,
+ 0x51B8, 0x83EB,
+ 0x51B9, 0x83EC,
+ 0x51BA, 0x83ED,
+ 0x51BE, 0x83EE,
+ 0x51BF, 0x83EF,
+ 0x51C1, 0x83F0,
+ 0x51C2, 0x83F1,
+ 0x51C3, 0x83F2,
+ 0x51C5, 0x83F3,
+ 0x51C8, 0x83F4,
+ 0x51CA, 0x83F5,
+ 0x51CD, 0x83F6,
+ 0x51CE, 0x83F7,
+ 0x51D0, 0x83F8,
+ 0x51D2, 0x83F9,
+ 0x51D3, 0x83FA,
+ 0x51D4, 0x83FB,
+ 0x51D5, 0x83FC,
+ 0x51D6, 0x83FD,
+ 0x51D7, 0x83FE,
+ 0x51D8, 0x8440,
+ 0x51D9, 0x8441,
+ 0x51DA, 0x8442,
+ 0x51DC, 0x8443,
+ 0x51DE, 0x8444,
+ 0x51DF, 0x8445,
+ 0x51E2, 0x8446,
+ 0x51E3, 0x8447,
+ 0x51E5, 0x8448,
+ 0x51E6, 0x8449,
+ 0x51E7, 0x844A,
+ 0x51E8, 0x844B,
+ 0x51E9, 0x844C,
+ 0x51EA, 0x844D,
+ 0x51EC, 0x844E,
+ 0x51EE, 0x844F,
+ 0x51F1, 0x8450,
+ 0x51F2, 0x8451,
+ 0x51F4, 0x8452,
+ 0x51F7, 0x8453,
+ 0x51FE, 0x8454,
+ 0x5204, 0x8455,
+ 0x5205, 0x8456,
+ 0x5209, 0x8457,
+ 0x520B, 0x8458,
+ 0x520C, 0x8459,
+ 0x520F, 0x845A,
+ 0x5210, 0x845B,
+ 0x5213, 0x845C,
+ 0x5214, 0x845D,
+ 0x5215, 0x845E,
+ 0x521C, 0x845F,
+ 0x521E, 0x8460,
+ 0x521F, 0x8461,
+ 0x5221, 0x8462,
+ 0x5222, 0x8463,
+ 0x5223, 0x8464,
+ 0x5225, 0x8465,
+ 0x5226, 0x8466,
+ 0x5227, 0x8467,
+ 0x522A, 0x8468,
+ 0x522C, 0x8469,
+ 0x522F, 0x846A,
+ 0x5231, 0x846B,
+ 0x5232, 0x846C,
+ 0x5234, 0x846D,
+ 0x5235, 0x846E,
+ 0x523C, 0x846F,
+ 0x523E, 0x8470,
+ 0x5244, 0x8471,
+ 0x5245, 0x8472,
+ 0x5246, 0x8473,
+ 0x5247, 0x8474,
+ 0x5248, 0x8475,
+ 0x5249, 0x8476,
+ 0x524B, 0x8477,
+ 0x524E, 0x8478,
+ 0x524F, 0x8479,
+ 0x5252, 0x847A,
+ 0x5253, 0x847B,
+ 0x5255, 0x847C,
+ 0x5257, 0x847D,
+ 0x5258, 0x847E,
+ 0x5259, 0x8480,
+ 0x525A, 0x8481,
+ 0x525B, 0x8482,
+ 0x525D, 0x8483,
+ 0x525F, 0x8484,
+ 0x5260, 0x8485,
+ 0x5262, 0x8486,
+ 0x5263, 0x8487,
+ 0x5264, 0x8488,
+ 0x5266, 0x8489,
+ 0x5268, 0x848A,
+ 0x526B, 0x848B,
+ 0x526C, 0x848C,
+ 0x526D, 0x848D,
+ 0x526E, 0x848E,
+ 0x5270, 0x848F,
+ 0x5271, 0x8490,
+ 0x5273, 0x8491,
+ 0x5274, 0x8492,
+ 0x5275, 0x8493,
+ 0x5276, 0x8494,
+ 0x5277, 0x8495,
+ 0x5278, 0x8496,
+ 0x5279, 0x8497,
+ 0x527A, 0x8498,
+ 0x527B, 0x8499,
+ 0x527C, 0x849A,
+ 0x527E, 0x849B,
+ 0x5280, 0x849C,
+ 0x5283, 0x849D,
+ 0x5284, 0x849E,
+ 0x5285, 0x849F,
+ 0x5286, 0x84A0,
+ 0x5287, 0x84A1,
+ 0x5289, 0x84A2,
+ 0x528A, 0x84A3,
+ 0x528B, 0x84A4,
+ 0x528C, 0x84A5,
+ 0x528D, 0x84A6,
+ 0x528E, 0x84A7,
+ 0x528F, 0x84A8,
+ 0x5291, 0x84A9,
+ 0x5292, 0x84AA,
+ 0x5294, 0x84AB,
+ 0x5295, 0x84AC,
+ 0x5296, 0x84AD,
+ 0x5297, 0x84AE,
+ 0x5298, 0x84AF,
+ 0x5299, 0x84B0,
+ 0x529A, 0x84B1,
+ 0x529C, 0x84B2,
+ 0x52A4, 0x84B3,
+ 0x52A5, 0x84B4,
+ 0x52A6, 0x84B5,
+ 0x52A7, 0x84B6,
+ 0x52AE, 0x84B7,
+ 0x52AF, 0x84B8,
+ 0x52B0, 0x84B9,
+ 0x52B4, 0x84BA,
+ 0x52B5, 0x84BB,
+ 0x52B6, 0x84BC,
+ 0x52B7, 0x84BD,
+ 0x52B8, 0x84BE,
+ 0x52B9, 0x84BF,
+ 0x52BA, 0x84C0,
+ 0x52BB, 0x84C1,
+ 0x52BC, 0x84C2,
+ 0x52BD, 0x84C3,
+ 0x52C0, 0x84C4,
+ 0x52C1, 0x84C5,
+ 0x52C2, 0x84C6,
+ 0x52C4, 0x84C7,
+ 0x52C5, 0x84C8,
+ 0x52C6, 0x84C9,
+ 0x52C8, 0x84CA,
+ 0x52CA, 0x84CB,
+ 0x52CC, 0x84CC,
+ 0x52CD, 0x84CD,
+ 0x52CE, 0x84CE,
+ 0x52CF, 0x84CF,
+ 0x52D1, 0x84D0,
+ 0x52D3, 0x84D1,
+ 0x52D4, 0x84D2,
+ 0x52D5, 0x84D3,
+ 0x52D7, 0x84D4,
+ 0x52D9, 0x84D5,
+ 0x52DA, 0x84D6,
+ 0x52DB, 0x84D7,
+ 0x52DC, 0x84D8,
+ 0x52DD, 0x84D9,
+ 0x52DE, 0x84DA,
+ 0x52E0, 0x84DB,
+ 0x52E1, 0x84DC,
+ 0x52E2, 0x84DD,
+ 0x52E3, 0x84DE,
+ 0x52E5, 0x84DF,
+ 0x52E6, 0x84E0,
+ 0x52E7, 0x84E1,
+ 0x52E8, 0x84E2,
+ 0x52E9, 0x84E3,
+ 0x52EA, 0x84E4,
+ 0x52EB, 0x84E5,
+ 0x52EC, 0x84E6,
+ 0x52ED, 0x84E7,
+ 0x52EE, 0x84E8,
+ 0x52EF, 0x84E9,
+ 0x52F1, 0x84EA,
+ 0x52F2, 0x84EB,
+ 0x52F3, 0x84EC,
+ 0x52F4, 0x84ED,
+ 0x52F5, 0x84EE,
+ 0x52F6, 0x84EF,
+ 0x52F7, 0x84F0,
+ 0x52F8, 0x84F1,
+ 0x52FB, 0x84F2,
+ 0x52FC, 0x84F3,
+ 0x52FD, 0x84F4,
+ 0x5301, 0x84F5,
+ 0x5302, 0x84F6,
+ 0x5303, 0x84F7,
+ 0x5304, 0x84F8,
+ 0x5307, 0x84F9,
+ 0x5309, 0x84FA,
+ 0x530A, 0x84FB,
+ 0x530B, 0x84FC,
+ 0x530C, 0x84FD,
+ 0x530E, 0x84FE,
+ 0x5311, 0x8540,
+ 0x5312, 0x8541,
+ 0x5313, 0x8542,
+ 0x5314, 0x8543,
+ 0x5318, 0x8544,
+ 0x531B, 0x8545,
+ 0x531C, 0x8546,
+ 0x531E, 0x8547,
+ 0x531F, 0x8548,
+ 0x5322, 0x8549,
+ 0x5324, 0x854A,
+ 0x5325, 0x854B,
+ 0x5327, 0x854C,
+ 0x5328, 0x854D,
+ 0x5329, 0x854E,
+ 0x532B, 0x854F,
+ 0x532C, 0x8550,
+ 0x532D, 0x8551,
+ 0x532F, 0x8552,
+ 0x5330, 0x8553,
+ 0x5331, 0x8554,
+ 0x5332, 0x8555,
+ 0x5333, 0x8556,
+ 0x5334, 0x8557,
+ 0x5335, 0x8558,
+ 0x5336, 0x8559,
+ 0x5337, 0x855A,
+ 0x5338, 0x855B,
+ 0x533C, 0x855C,
+ 0x533D, 0x855D,
+ 0x5340, 0x855E,
+ 0x5342, 0x855F,
+ 0x5344, 0x8560,
+ 0x5346, 0x8561,
+ 0x534B, 0x8562,
+ 0x534C, 0x8563,
+ 0x534D, 0x8564,
+ 0x5350, 0x8565,
+ 0x5354, 0x8566,
+ 0x5358, 0x8567,
+ 0x5359, 0x8568,
+ 0x535B, 0x8569,
+ 0x535D, 0x856A,
+ 0x5365, 0x856B,
+ 0x5368, 0x856C,
+ 0x536A, 0x856D,
+ 0x536C, 0x856E,
+ 0x536D, 0x856F,
+ 0x5372, 0x8570,
+ 0x5376, 0x8571,
+ 0x5379, 0x8572,
+ 0x537B, 0x8573,
+ 0x537C, 0x8574,
+ 0x537D, 0x8575,
+ 0x537E, 0x8576,
+ 0x5380, 0x8577,
+ 0x5381, 0x8578,
+ 0x5383, 0x8579,
+ 0x5387, 0x857A,
+ 0x5388, 0x857B,
+ 0x538A, 0x857C,
+ 0x538E, 0x857D,
+ 0x538F, 0x857E,
+ 0x5390, 0x8580,
+ 0x5391, 0x8581,
+ 0x5392, 0x8582,
+ 0x5393, 0x8583,
+ 0x5394, 0x8584,
+ 0x5396, 0x8585,
+ 0x5397, 0x8586,
+ 0x5399, 0x8587,
+ 0x539B, 0x8588,
+ 0x539C, 0x8589,
+ 0x539E, 0x858A,
+ 0x53A0, 0x858B,
+ 0x53A1, 0x858C,
+ 0x53A4, 0x858D,
+ 0x53A7, 0x858E,
+ 0x53AA, 0x858F,
+ 0x53AB, 0x8590,
+ 0x53AC, 0x8591,
+ 0x53AD, 0x8592,
+ 0x53AF, 0x8593,
+ 0x53B0, 0x8594,
+ 0x53B1, 0x8595,
+ 0x53B2, 0x8596,
+ 0x53B3, 0x8597,
+ 0x53B4, 0x8598,
+ 0x53B5, 0x8599,
+ 0x53B7, 0x859A,
+ 0x53B8, 0x859B,
+ 0x53B9, 0x859C,
+ 0x53BA, 0x859D,
+ 0x53BC, 0x859E,
+ 0x53BD, 0x859F,
+ 0x53BE, 0x85A0,
+ 0x53C0, 0x85A1,
+ 0x53C3, 0x85A2,
+ 0x53C4, 0x85A3,
+ 0x53C5, 0x85A4,
+ 0x53C6, 0x85A5,
+ 0x53C7, 0x85A6,
+ 0x53CE, 0x85A7,
+ 0x53CF, 0x85A8,
+ 0x53D0, 0x85A9,
+ 0x53D2, 0x85AA,
+ 0x53D3, 0x85AB,
+ 0x53D5, 0x85AC,
+ 0x53DA, 0x85AD,
+ 0x53DC, 0x85AE,
+ 0x53DD, 0x85AF,
+ 0x53DE, 0x85B0,
+ 0x53E1, 0x85B1,
+ 0x53E2, 0x85B2,
+ 0x53E7, 0x85B3,
+ 0x53F4, 0x85B4,
+ 0x53FA, 0x85B5,
+ 0x53FE, 0x85B6,
+ 0x53FF, 0x85B7,
+ 0x5400, 0x85B8,
+ 0x5402, 0x85B9,
+ 0x5405, 0x85BA,
+ 0x5407, 0x85BB,
+ 0x540B, 0x85BC,
+ 0x5414, 0x85BD,
+ 0x5418, 0x85BE,
+ 0x5419, 0x85BF,
+ 0x541A, 0x85C0,
+ 0x541C, 0x85C1,
+ 0x5422, 0x85C2,
+ 0x5424, 0x85C3,
+ 0x5425, 0x85C4,
+ 0x542A, 0x85C5,
+ 0x5430, 0x85C6,
+ 0x5433, 0x85C7,
+ 0x5436, 0x85C8,
+ 0x5437, 0x85C9,
+ 0x543A, 0x85CA,
+ 0x543D, 0x85CB,
+ 0x543F, 0x85CC,
+ 0x5441, 0x85CD,
+ 0x5442, 0x85CE,
+ 0x5444, 0x85CF,
+ 0x5445, 0x85D0,
+ 0x5447, 0x85D1,
+ 0x5449, 0x85D2,
+ 0x544C, 0x85D3,
+ 0x544D, 0x85D4,
+ 0x544E, 0x85D5,
+ 0x544F, 0x85D6,
+ 0x5451, 0x85D7,
+ 0x545A, 0x85D8,
+ 0x545D, 0x85D9,
+ 0x545E, 0x85DA,
+ 0x545F, 0x85DB,
+ 0x5460, 0x85DC,
+ 0x5461, 0x85DD,
+ 0x5463, 0x85DE,
+ 0x5465, 0x85DF,
+ 0x5467, 0x85E0,
+ 0x5469, 0x85E1,
+ 0x546A, 0x85E2,
+ 0x546B, 0x85E3,
+ 0x546C, 0x85E4,
+ 0x546D, 0x85E5,
+ 0x546E, 0x85E6,
+ 0x546F, 0x85E7,
+ 0x5470, 0x85E8,
+ 0x5474, 0x85E9,
+ 0x5479, 0x85EA,
+ 0x547A, 0x85EB,
+ 0x547E, 0x85EC,
+ 0x547F, 0x85ED,
+ 0x5481, 0x85EE,
+ 0x5483, 0x85EF,
+ 0x5485, 0x85F0,
+ 0x5487, 0x85F1,
+ 0x5488, 0x85F2,
+ 0x5489, 0x85F3,
+ 0x548A, 0x85F4,
+ 0x548D, 0x85F5,
+ 0x5491, 0x85F6,
+ 0x5493, 0x85F7,
+ 0x5497, 0x85F8,
+ 0x5498, 0x85F9,
+ 0x549C, 0x85FA,
+ 0x549E, 0x85FB,
+ 0x549F, 0x85FC,
+ 0x54A0, 0x85FD,
+ 0x54A1, 0x85FE,
+ 0x54A2, 0x8640,
+ 0x54A5, 0x8641,
+ 0x54AE, 0x8642,
+ 0x54B0, 0x8643,
+ 0x54B2, 0x8644,
+ 0x54B5, 0x8645,
+ 0x54B6, 0x8646,
+ 0x54B7, 0x8647,
+ 0x54B9, 0x8648,
+ 0x54BA, 0x8649,
+ 0x54BC, 0x864A,
+ 0x54BE, 0x864B,
+ 0x54C3, 0x864C,
+ 0x54C5, 0x864D,
+ 0x54CA, 0x864E,
+ 0x54CB, 0x864F,
+ 0x54D6, 0x8650,
+ 0x54D8, 0x8651,
+ 0x54DB, 0x8652,
+ 0x54E0, 0x8653,
+ 0x54E1, 0x8654,
+ 0x54E2, 0x8655,
+ 0x54E3, 0x8656,
+ 0x54E4, 0x8657,
+ 0x54EB, 0x8658,
+ 0x54EC, 0x8659,
+ 0x54EF, 0x865A,
+ 0x54F0, 0x865B,
+ 0x54F1, 0x865C,
+ 0x54F4, 0x865D,
+ 0x54F5, 0x865E,
+ 0x54F6, 0x865F,
+ 0x54F7, 0x8660,
+ 0x54F8, 0x8661,
+ 0x54F9, 0x8662,
+ 0x54FB, 0x8663,
+ 0x54FE, 0x8664,
+ 0x5500, 0x8665,
+ 0x5502, 0x8666,
+ 0x5503, 0x8667,
+ 0x5504, 0x8668,
+ 0x5505, 0x8669,
+ 0x5508, 0x866A,
+ 0x550A, 0x866B,
+ 0x550B, 0x866C,
+ 0x550C, 0x866D,
+ 0x550D, 0x866E,
+ 0x550E, 0x866F,
+ 0x5512, 0x8670,
+ 0x5513, 0x8671,
+ 0x5515, 0x8672,
+ 0x5516, 0x8673,
+ 0x5517, 0x8674,
+ 0x5518, 0x8675,
+ 0x5519, 0x8676,
+ 0x551A, 0x8677,
+ 0x551C, 0x8678,
+ 0x551D, 0x8679,
+ 0x551E, 0x867A,
+ 0x551F, 0x867B,
+ 0x5521, 0x867C,
+ 0x5525, 0x867D,
+ 0x5526, 0x867E,
+ 0x5528, 0x8680,
+ 0x5529, 0x8681,
+ 0x552B, 0x8682,
+ 0x552D, 0x8683,
+ 0x5532, 0x8684,
+ 0x5534, 0x8685,
+ 0x5535, 0x8686,
+ 0x5536, 0x8687,
+ 0x5538, 0x8688,
+ 0x5539, 0x8689,
+ 0x553A, 0x868A,
+ 0x553B, 0x868B,
+ 0x553D, 0x868C,
+ 0x5540, 0x868D,
+ 0x5542, 0x868E,
+ 0x5545, 0x868F,
+ 0x5547, 0x8690,
+ 0x5548, 0x8691,
+ 0x554B, 0x8692,
+ 0x554C, 0x8693,
+ 0x554D, 0x8694,
+ 0x554E, 0x8695,
+ 0x554F, 0x8696,
+ 0x5551, 0x8697,
+ 0x5552, 0x8698,
+ 0x5553, 0x8699,
+ 0x5554, 0x869A,
+ 0x5557, 0x869B,
+ 0x5558, 0x869C,
+ 0x5559, 0x869D,
+ 0x555A, 0x869E,
+ 0x555B, 0x869F,
+ 0x555D, 0x86A0,
+ 0x555E, 0x86A1,
+ 0x555F, 0x86A2,
+ 0x5560, 0x86A3,
+ 0x5562, 0x86A4,
+ 0x5563, 0x86A5,
+ 0x5568, 0x86A6,
+ 0x5569, 0x86A7,
+ 0x556B, 0x86A8,
+ 0x556F, 0x86A9,
+ 0x5570, 0x86AA,
+ 0x5571, 0x86AB,
+ 0x5572, 0x86AC,
+ 0x5573, 0x86AD,
+ 0x5574, 0x86AE,
+ 0x5579, 0x86AF,
+ 0x557A, 0x86B0,
+ 0x557D, 0x86B1,
+ 0x557F, 0x86B2,
+ 0x5585, 0x86B3,
+ 0x5586, 0x86B4,
+ 0x558C, 0x86B5,
+ 0x558D, 0x86B6,
+ 0x558E, 0x86B7,
+ 0x5590, 0x86B8,
+ 0x5592, 0x86B9,
+ 0x5593, 0x86BA,
+ 0x5595, 0x86BB,
+ 0x5596, 0x86BC,
+ 0x5597, 0x86BD,
+ 0x559A, 0x86BE,
+ 0x559B, 0x86BF,
+ 0x559E, 0x86C0,
+ 0x55A0, 0x86C1,
+ 0x55A1, 0x86C2,
+ 0x55A2, 0x86C3,
+ 0x55A3, 0x86C4,
+ 0x55A4, 0x86C5,
+ 0x55A5, 0x86C6,
+ 0x55A6, 0x86C7,
+ 0x55A8, 0x86C8,
+ 0x55A9, 0x86C9,
+ 0x55AA, 0x86CA,
+ 0x55AB, 0x86CB,
+ 0x55AC, 0x86CC,
+ 0x55AD, 0x86CD,
+ 0x55AE, 0x86CE,
+ 0x55AF, 0x86CF,
+ 0x55B0, 0x86D0,
+ 0x55B2, 0x86D1,
+ 0x55B4, 0x86D2,
+ 0x55B6, 0x86D3,
+ 0x55B8, 0x86D4,
+ 0x55BA, 0x86D5,
+ 0x55BC, 0x86D6,
+ 0x55BF, 0x86D7,
+ 0x55C0, 0x86D8,
+ 0x55C1, 0x86D9,
+ 0x55C2, 0x86DA,
+ 0x55C3, 0x86DB,
+ 0x55C6, 0x86DC,
+ 0x55C7, 0x86DD,
+ 0x55C8, 0x86DE,
+ 0x55CA, 0x86DF,
+ 0x55CB, 0x86E0,
+ 0x55CE, 0x86E1,
+ 0x55CF, 0x86E2,
+ 0x55D0, 0x86E3,
+ 0x55D5, 0x86E4,
+ 0x55D7, 0x86E5,
+ 0x55D8, 0x86E6,
+ 0x55D9, 0x86E7,
+ 0x55DA, 0x86E8,
+ 0x55DB, 0x86E9,
+ 0x55DE, 0x86EA,
+ 0x55E0, 0x86EB,
+ 0x55E2, 0x86EC,
+ 0x55E7, 0x86ED,
+ 0x55E9, 0x86EE,
+ 0x55ED, 0x86EF,
+ 0x55EE, 0x86F0,
+ 0x55F0, 0x86F1,
+ 0x55F1, 0x86F2,
+ 0x55F4, 0x86F3,
+ 0x55F6, 0x86F4,
+ 0x55F8, 0x86F5,
+ 0x55F9, 0x86F6,
+ 0x55FA, 0x86F7,
+ 0x55FB, 0x86F8,
+ 0x55FC, 0x86F9,
+ 0x55FF, 0x86FA,
+ 0x5602, 0x86FB,
+ 0x5603, 0x86FC,
+ 0x5604, 0x86FD,
+ 0x5605, 0x86FE,
+ 0x5606, 0x8740,
+ 0x5607, 0x8741,
+ 0x560A, 0x8742,
+ 0x560B, 0x8743,
+ 0x560D, 0x8744,
+ 0x5610, 0x8745,
+ 0x5611, 0x8746,
+ 0x5612, 0x8747,
+ 0x5613, 0x8748,
+ 0x5614, 0x8749,
+ 0x5615, 0x874A,
+ 0x5616, 0x874B,
+ 0x5617, 0x874C,
+ 0x5619, 0x874D,
+ 0x561A, 0x874E,
+ 0x561C, 0x874F,
+ 0x561D, 0x8750,
+ 0x5620, 0x8751,
+ 0x5621, 0x8752,
+ 0x5622, 0x8753,
+ 0x5625, 0x8754,
+ 0x5626, 0x8755,
+ 0x5628, 0x8756,
+ 0x5629, 0x8757,
+ 0x562A, 0x8758,
+ 0x562B, 0x8759,
+ 0x562E, 0x875A,
+ 0x562F, 0x875B,
+ 0x5630, 0x875C,
+ 0x5633, 0x875D,
+ 0x5635, 0x875E,
+ 0x5637, 0x875F,
+ 0x5638, 0x8760,
+ 0x563A, 0x8761,
+ 0x563C, 0x8762,
+ 0x563D, 0x8763,
+ 0x563E, 0x8764,
+ 0x5640, 0x8765,
+ 0x5641, 0x8766,
+ 0x5642, 0x8767,
+ 0x5643, 0x8768,
+ 0x5644, 0x8769,
+ 0x5645, 0x876A,
+ 0x5646, 0x876B,
+ 0x5647, 0x876C,
+ 0x5648, 0x876D,
+ 0x5649, 0x876E,
+ 0x564A, 0x876F,
+ 0x564B, 0x8770,
+ 0x564F, 0x8771,
+ 0x5650, 0x8772,
+ 0x5651, 0x8773,
+ 0x5652, 0x8774,
+ 0x5653, 0x8775,
+ 0x5655, 0x8776,
+ 0x5656, 0x8777,
+ 0x565A, 0x8778,
+ 0x565B, 0x8779,
+ 0x565D, 0x877A,
+ 0x565E, 0x877B,
+ 0x565F, 0x877C,
+ 0x5660, 0x877D,
+ 0x5661, 0x877E,
+ 0x5663, 0x8780,
+ 0x5665, 0x8781,
+ 0x5666, 0x8782,
+ 0x5667, 0x8783,
+ 0x566D, 0x8784,
+ 0x566E, 0x8785,
+ 0x566F, 0x8786,
+ 0x5670, 0x8787,
+ 0x5672, 0x8788,
+ 0x5673, 0x8789,
+ 0x5674, 0x878A,
+ 0x5675, 0x878B,
+ 0x5677, 0x878C,
+ 0x5678, 0x878D,
+ 0x5679, 0x878E,
+ 0x567A, 0x878F,
+ 0x567D, 0x8790,
+ 0x567E, 0x8791,
+ 0x567F, 0x8792,
+ 0x5680, 0x8793,
+ 0x5681, 0x8794,
+ 0x5682, 0x8795,
+ 0x5683, 0x8796,
+ 0x5684, 0x8797,
+ 0x5687, 0x8798,
+ 0x5688, 0x8799,
+ 0x5689, 0x879A,
+ 0x568A, 0x879B,
+ 0x568B, 0x879C,
+ 0x568C, 0x879D,
+ 0x568D, 0x879E,
+ 0x5690, 0x879F,
+ 0x5691, 0x87A0,
+ 0x5692, 0x87A1,
+ 0x5694, 0x87A2,
+ 0x5695, 0x87A3,
+ 0x5696, 0x87A4,
+ 0x5697, 0x87A5,
+ 0x5698, 0x87A6,
+ 0x5699, 0x87A7,
+ 0x569A, 0x87A8,
+ 0x569B, 0x87A9,
+ 0x569C, 0x87AA,
+ 0x569D, 0x87AB,
+ 0x569E, 0x87AC,
+ 0x569F, 0x87AD,
+ 0x56A0, 0x87AE,
+ 0x56A1, 0x87AF,
+ 0x56A2, 0x87B0,
+ 0x56A4, 0x87B1,
+ 0x56A5, 0x87B2,
+ 0x56A6, 0x87B3,
+ 0x56A7, 0x87B4,
+ 0x56A8, 0x87B5,
+ 0x56A9, 0x87B6,
+ 0x56AA, 0x87B7,
+ 0x56AB, 0x87B8,
+ 0x56AC, 0x87B9,
+ 0x56AD, 0x87BA,
+ 0x56AE, 0x87BB,
+ 0x56B0, 0x87BC,
+ 0x56B1, 0x87BD,
+ 0x56B2, 0x87BE,
+ 0x56B3, 0x87BF,
+ 0x56B4, 0x87C0,
+ 0x56B5, 0x87C1,
+ 0x56B6, 0x87C2,
+ 0x56B8, 0x87C3,
+ 0x56B9, 0x87C4,
+ 0x56BA, 0x87C5,
+ 0x56BB, 0x87C6,
+ 0x56BD, 0x87C7,
+ 0x56BE, 0x87C8,
+ 0x56BF, 0x87C9,
+ 0x56C0, 0x87CA,
+ 0x56C1, 0x87CB,
+ 0x56C2, 0x87CC,
+ 0x56C3, 0x87CD,
+ 0x56C4, 0x87CE,
+ 0x56C5, 0x87CF,
+ 0x56C6, 0x87D0,
+ 0x56C7, 0x87D1,
+ 0x56C8, 0x87D2,
+ 0x56C9, 0x87D3,
+ 0x56CB, 0x87D4,
+ 0x56CC, 0x87D5,
+ 0x56CD, 0x87D6,
+ 0x56CE, 0x87D7,
+ 0x56CF, 0x87D8,
+ 0x56D0, 0x87D9,
+ 0x56D1, 0x87DA,
+ 0x56D2, 0x87DB,
+ 0x56D3, 0x87DC,
+ 0x56D5, 0x87DD,
+ 0x56D6, 0x87DE,
+ 0x56D8, 0x87DF,
+ 0x56D9, 0x87E0,
+ 0x56DC, 0x87E1,
+ 0x56E3, 0x87E2,
+ 0x56E5, 0x87E3,
+ 0x56E6, 0x87E4,
+ 0x56E7, 0x87E5,
+ 0x56E8, 0x87E6,
+ 0x56E9, 0x87E7,
+ 0x56EA, 0x87E8,
+ 0x56EC, 0x87E9,
+ 0x56EE, 0x87EA,
+ 0x56EF, 0x87EB,
+ 0x56F2, 0x87EC,
+ 0x56F3, 0x87ED,
+ 0x56F6, 0x87EE,
+ 0x56F7, 0x87EF,
+ 0x56F8, 0x87F0,
+ 0x56FB, 0x87F1,
+ 0x56FC, 0x87F2,
+ 0x5700, 0x87F3,
+ 0x5701, 0x87F4,
+ 0x5702, 0x87F5,
+ 0x5705, 0x87F6,
+ 0x5707, 0x87F7,
+ 0x570B, 0x87F8,
+ 0x570C, 0x87F9,
+ 0x570D, 0x87FA,
+ 0x570E, 0x87FB,
+ 0x570F, 0x87FC,
+ 0x5710, 0x87FD,
+ 0x5711, 0x87FE,
+ 0x5712, 0x8840,
+ 0x5713, 0x8841,
+ 0x5714, 0x8842,
+ 0x5715, 0x8843,
+ 0x5716, 0x8844,
+ 0x5717, 0x8845,
+ 0x5718, 0x8846,
+ 0x5719, 0x8847,
+ 0x571A, 0x8848,
+ 0x571B, 0x8849,
+ 0x571D, 0x884A,
+ 0x571E, 0x884B,
+ 0x5720, 0x884C,
+ 0x5721, 0x884D,
+ 0x5722, 0x884E,
+ 0x5724, 0x884F,
+ 0x5725, 0x8850,
+ 0x5726, 0x8851,
+ 0x5727, 0x8852,
+ 0x572B, 0x8853,
+ 0x5731, 0x8854,
+ 0x5732, 0x8855,
+ 0x5734, 0x8856,
+ 0x5735, 0x8857,
+ 0x5736, 0x8858,
+ 0x5737, 0x8859,
+ 0x5738, 0x885A,
+ 0x573C, 0x885B,
+ 0x573D, 0x885C,
+ 0x573F, 0x885D,
+ 0x5741, 0x885E,
+ 0x5743, 0x885F,
+ 0x5744, 0x8860,
+ 0x5745, 0x8861,
+ 0x5746, 0x8862,
+ 0x5748, 0x8863,
+ 0x5749, 0x8864,
+ 0x574B, 0x8865,
+ 0x5752, 0x8866,
+ 0x5753, 0x8867,
+ 0x5754, 0x8868,
+ 0x5755, 0x8869,
+ 0x5756, 0x886A,
+ 0x5758, 0x886B,
+ 0x5759, 0x886C,
+ 0x5762, 0x886D,
+ 0x5763, 0x886E,
+ 0x5765, 0x886F,
+ 0x5767, 0x8870,
+ 0x576C, 0x8871,
+ 0x576E, 0x8872,
+ 0x5770, 0x8873,
+ 0x5771, 0x8874,
+ 0x5772, 0x8875,
+ 0x5774, 0x8876,
+ 0x5775, 0x8877,
+ 0x5778, 0x8878,
+ 0x5779, 0x8879,
+ 0x577A, 0x887A,
+ 0x577D, 0x887B,
+ 0x577E, 0x887C,
+ 0x577F, 0x887D,
+ 0x5780, 0x887E,
+ 0x5781, 0x8880,
+ 0x5787, 0x8881,
+ 0x5788, 0x8882,
+ 0x5789, 0x8883,
+ 0x578A, 0x8884,
+ 0x578D, 0x8885,
+ 0x578E, 0x8886,
+ 0x578F, 0x8887,
+ 0x5790, 0x8888,
+ 0x5791, 0x8889,
+ 0x5794, 0x888A,
+ 0x5795, 0x888B,
+ 0x5796, 0x888C,
+ 0x5797, 0x888D,
+ 0x5798, 0x888E,
+ 0x5799, 0x888F,
+ 0x579A, 0x8890,
+ 0x579C, 0x8891,
+ 0x579D, 0x8892,
+ 0x579E, 0x8893,
+ 0x579F, 0x8894,
+ 0x57A5, 0x8895,
+ 0x57A8, 0x8896,
+ 0x57AA, 0x8897,
+ 0x57AC, 0x8898,
+ 0x57AF, 0x8899,
+ 0x57B0, 0x889A,
+ 0x57B1, 0x889B,
+ 0x57B3, 0x889C,
+ 0x57B5, 0x889D,
+ 0x57B6, 0x889E,
+ 0x57B7, 0x889F,
+ 0x57B9, 0x88A0,
+ 0x57BA, 0x88A1,
+ 0x57BB, 0x88A2,
+ 0x57BC, 0x88A3,
+ 0x57BD, 0x88A4,
+ 0x57BE, 0x88A5,
+ 0x57BF, 0x88A6,
+ 0x57C0, 0x88A7,
+ 0x57C1, 0x88A8,
+ 0x57C4, 0x88A9,
+ 0x57C5, 0x88AA,
+ 0x57C6, 0x88AB,
+ 0x57C7, 0x88AC,
+ 0x57C8, 0x88AD,
+ 0x57C9, 0x88AE,
+ 0x57CA, 0x88AF,
+ 0x57CC, 0x88B0,
+ 0x57CD, 0x88B1,
+ 0x57D0, 0x88B2,
+ 0x57D1, 0x88B3,
+ 0x57D3, 0x88B4,
+ 0x57D6, 0x88B5,
+ 0x57D7, 0x88B6,
+ 0x57DB, 0x88B7,
+ 0x57DC, 0x88B8,
+ 0x57DE, 0x88B9,
+ 0x57E1, 0x88BA,
+ 0x57E2, 0x88BB,
+ 0x57E3, 0x88BC,
+ 0x57E5, 0x88BD,
+ 0x57E6, 0x88BE,
+ 0x57E7, 0x88BF,
+ 0x57E8, 0x88C0,
+ 0x57E9, 0x88C1,
+ 0x57EA, 0x88C2,
+ 0x57EB, 0x88C3,
+ 0x57EC, 0x88C4,
+ 0x57EE, 0x88C5,
+ 0x57F0, 0x88C6,
+ 0x57F1, 0x88C7,
+ 0x57F2, 0x88C8,
+ 0x57F3, 0x88C9,
+ 0x57F5, 0x88CA,
+ 0x57F6, 0x88CB,
+ 0x57F7, 0x88CC,
+ 0x57FB, 0x88CD,
+ 0x57FC, 0x88CE,
+ 0x57FE, 0x88CF,
+ 0x57FF, 0x88D0,
+ 0x5801, 0x88D1,
+ 0x5803, 0x88D2,
+ 0x5804, 0x88D3,
+ 0x5805, 0x88D4,
+ 0x5808, 0x88D5,
+ 0x5809, 0x88D6,
+ 0x580A, 0x88D7,
+ 0x580C, 0x88D8,
+ 0x580E, 0x88D9,
+ 0x580F, 0x88DA,
+ 0x5810, 0x88DB,
+ 0x5812, 0x88DC,
+ 0x5813, 0x88DD,
+ 0x5814, 0x88DE,
+ 0x5816, 0x88DF,
+ 0x5817, 0x88E0,
+ 0x5818, 0x88E1,
+ 0x581A, 0x88E2,
+ 0x581B, 0x88E3,
+ 0x581C, 0x88E4,
+ 0x581D, 0x88E5,
+ 0x581F, 0x88E6,
+ 0x5822, 0x88E7,
+ 0x5823, 0x88E8,
+ 0x5825, 0x88E9,
+ 0x5826, 0x88EA,
+ 0x5827, 0x88EB,
+ 0x5828, 0x88EC,
+ 0x5829, 0x88ED,
+ 0x582B, 0x88EE,
+ 0x582C, 0x88EF,
+ 0x582D, 0x88F0,
+ 0x582E, 0x88F1,
+ 0x582F, 0x88F2,
+ 0x5831, 0x88F3,
+ 0x5832, 0x88F4,
+ 0x5833, 0x88F5,
+ 0x5834, 0x88F6,
+ 0x5836, 0x88F7,
+ 0x5837, 0x88F8,
+ 0x5838, 0x88F9,
+ 0x5839, 0x88FA,
+ 0x583A, 0x88FB,
+ 0x583B, 0x88FC,
+ 0x583C, 0x88FD,
+ 0x583D, 0x88FE,
+ 0x583E, 0x8940,
+ 0x583F, 0x8941,
+ 0x5840, 0x8942,
+ 0x5841, 0x8943,
+ 0x5842, 0x8944,
+ 0x5843, 0x8945,
+ 0x5845, 0x8946,
+ 0x5846, 0x8947,
+ 0x5847, 0x8948,
+ 0x5848, 0x8949,
+ 0x5849, 0x894A,
+ 0x584A, 0x894B,
+ 0x584B, 0x894C,
+ 0x584E, 0x894D,
+ 0x584F, 0x894E,
+ 0x5850, 0x894F,
+ 0x5852, 0x8950,
+ 0x5853, 0x8951,
+ 0x5855, 0x8952,
+ 0x5856, 0x8953,
+ 0x5857, 0x8954,
+ 0x5859, 0x8955,
+ 0x585A, 0x8956,
+ 0x585B, 0x8957,
+ 0x585C, 0x8958,
+ 0x585D, 0x8959,
+ 0x585F, 0x895A,
+ 0x5860, 0x895B,
+ 0x5861, 0x895C,
+ 0x5862, 0x895D,
+ 0x5863, 0x895E,
+ 0x5864, 0x895F,
+ 0x5866, 0x8960,
+ 0x5867, 0x8961,
+ 0x5868, 0x8962,
+ 0x5869, 0x8963,
+ 0x586A, 0x8964,
+ 0x586D, 0x8965,
+ 0x586E, 0x8966,
+ 0x586F, 0x8967,
+ 0x5870, 0x8968,
+ 0x5871, 0x8969,
+ 0x5872, 0x896A,
+ 0x5873, 0x896B,
+ 0x5874, 0x896C,
+ 0x5875, 0x896D,
+ 0x5876, 0x896E,
+ 0x5877, 0x896F,
+ 0x5878, 0x8970,
+ 0x5879, 0x8971,
+ 0x587A, 0x8972,
+ 0x587B, 0x8973,
+ 0x587C, 0x8974,
+ 0x587D, 0x8975,
+ 0x587F, 0x8976,
+ 0x5882, 0x8977,
+ 0x5884, 0x8978,
+ 0x5886, 0x8979,
+ 0x5887, 0x897A,
+ 0x5888, 0x897B,
+ 0x588A, 0x897C,
+ 0x588B, 0x897D,
+ 0x588C, 0x897E,
+ 0x588D, 0x8980,
+ 0x588E, 0x8981,
+ 0x588F, 0x8982,
+ 0x5890, 0x8983,
+ 0x5891, 0x8984,
+ 0x5894, 0x8985,
+ 0x5895, 0x8986,
+ 0x5896, 0x8987,
+ 0x5897, 0x8988,
+ 0x5898, 0x8989,
+ 0x589B, 0x898A,
+ 0x589C, 0x898B,
+ 0x589D, 0x898C,
+ 0x58A0, 0x898D,
+ 0x58A1, 0x898E,
+ 0x58A2, 0x898F,
+ 0x58A3, 0x8990,
+ 0x58A4, 0x8991,
+ 0x58A5, 0x8992,
+ 0x58A6, 0x8993,
+ 0x58A7, 0x8994,
+ 0x58AA, 0x8995,
+ 0x58AB, 0x8996,
+ 0x58AC, 0x8997,
+ 0x58AD, 0x8998,
+ 0x58AE, 0x8999,
+ 0x58AF, 0x899A,
+ 0x58B0, 0x899B,
+ 0x58B1, 0x899C,
+ 0x58B2, 0x899D,
+ 0x58B3, 0x899E,
+ 0x58B4, 0x899F,
+ 0x58B5, 0x89A0,
+ 0x58B6, 0x89A1,
+ 0x58B7, 0x89A2,
+ 0x58B8, 0x89A3,
+ 0x58B9, 0x89A4,
+ 0x58BA, 0x89A5,
+ 0x58BB, 0x89A6,
+ 0x58BD, 0x89A7,
+ 0x58BE, 0x89A8,
+ 0x58BF, 0x89A9,
+ 0x58C0, 0x89AA,
+ 0x58C2, 0x89AB,
+ 0x58C3, 0x89AC,
+ 0x58C4, 0x89AD,
+ 0x58C6, 0x89AE,
+ 0x58C7, 0x89AF,
+ 0x58C8, 0x89B0,
+ 0x58C9, 0x89B1,
+ 0x58CA, 0x89B2,
+ 0x58CB, 0x89B3,
+ 0x58CC, 0x89B4,
+ 0x58CD, 0x89B5,
+ 0x58CE, 0x89B6,
+ 0x58CF, 0x89B7,
+ 0x58D0, 0x89B8,
+ 0x58D2, 0x89B9,
+ 0x58D3, 0x89BA,
+ 0x58D4, 0x89BB,
+ 0x58D6, 0x89BC,
+ 0x58D7, 0x89BD,
+ 0x58D8, 0x89BE,
+ 0x58D9, 0x89BF,
+ 0x58DA, 0x89C0,
+ 0x58DB, 0x89C1,
+ 0x58DC, 0x89C2,
+ 0x58DD, 0x89C3,
+ 0x58DE, 0x89C4,
+ 0x58DF, 0x89C5,
+ 0x58E0, 0x89C6,
+ 0x58E1, 0x89C7,
+ 0x58E2, 0x89C8,
+ 0x58E3, 0x89C9,
+ 0x58E5, 0x89CA,
+ 0x58E6, 0x89CB,
+ 0x58E7, 0x89CC,
+ 0x58E8, 0x89CD,
+ 0x58E9, 0x89CE,
+ 0x58EA, 0x89CF,
+ 0x58ED, 0x89D0,
+ 0x58EF, 0x89D1,
+ 0x58F1, 0x89D2,
+ 0x58F2, 0x89D3,
+ 0x58F4, 0x89D4,
+ 0x58F5, 0x89D5,
+ 0x58F7, 0x89D6,
+ 0x58F8, 0x89D7,
+ 0x58FA, 0x89D8,
+ 0x58FB, 0x89D9,
+ 0x58FC, 0x89DA,
+ 0x58FD, 0x89DB,
+ 0x58FE, 0x89DC,
+ 0x58FF, 0x89DD,
+ 0x5900, 0x89DE,
+ 0x5901, 0x89DF,
+ 0x5903, 0x89E0,
+ 0x5905, 0x89E1,
+ 0x5906, 0x89E2,
+ 0x5908, 0x89E3,
+ 0x5909, 0x89E4,
+ 0x590A, 0x89E5,
+ 0x590B, 0x89E6,
+ 0x590C, 0x89E7,
+ 0x590E, 0x89E8,
+ 0x5910, 0x89E9,
+ 0x5911, 0x89EA,
+ 0x5912, 0x89EB,
+ 0x5913, 0x89EC,
+ 0x5917, 0x89ED,
+ 0x5918, 0x89EE,
+ 0x591B, 0x89EF,
+ 0x591D, 0x89F0,
+ 0x591E, 0x89F1,
+ 0x5920, 0x89F2,
+ 0x5921, 0x89F3,
+ 0x5922, 0x89F4,
+ 0x5923, 0x89F5,
+ 0x5926, 0x89F6,
+ 0x5928, 0x89F7,
+ 0x592C, 0x89F8,
+ 0x5930, 0x89F9,
+ 0x5932, 0x89FA,
+ 0x5933, 0x89FB,
+ 0x5935, 0x89FC,
+ 0x5936, 0x89FD,
+ 0x593B, 0x89FE,
+ 0x593D, 0x8A40,
+ 0x593E, 0x8A41,
+ 0x593F, 0x8A42,
+ 0x5940, 0x8A43,
+ 0x5943, 0x8A44,
+ 0x5945, 0x8A45,
+ 0x5946, 0x8A46,
+ 0x594A, 0x8A47,
+ 0x594C, 0x8A48,
+ 0x594D, 0x8A49,
+ 0x5950, 0x8A4A,
+ 0x5952, 0x8A4B,
+ 0x5953, 0x8A4C,
+ 0x5959, 0x8A4D,
+ 0x595B, 0x8A4E,
+ 0x595C, 0x8A4F,
+ 0x595D, 0x8A50,
+ 0x595E, 0x8A51,
+ 0x595F, 0x8A52,
+ 0x5961, 0x8A53,
+ 0x5963, 0x8A54,
+ 0x5964, 0x8A55,
+ 0x5966, 0x8A56,
+ 0x5967, 0x8A57,
+ 0x5968, 0x8A58,
+ 0x5969, 0x8A59,
+ 0x596A, 0x8A5A,
+ 0x596B, 0x8A5B,
+ 0x596C, 0x8A5C,
+ 0x596D, 0x8A5D,
+ 0x596E, 0x8A5E,
+ 0x596F, 0x8A5F,
+ 0x5970, 0x8A60,
+ 0x5971, 0x8A61,
+ 0x5972, 0x8A62,
+ 0x5975, 0x8A63,
+ 0x5977, 0x8A64,
+ 0x597A, 0x8A65,
+ 0x597B, 0x8A66,
+ 0x597C, 0x8A67,
+ 0x597E, 0x8A68,
+ 0x597F, 0x8A69,
+ 0x5980, 0x8A6A,
+ 0x5985, 0x8A6B,
+ 0x5989, 0x8A6C,
+ 0x598B, 0x8A6D,
+ 0x598C, 0x8A6E,
+ 0x598E, 0x8A6F,
+ 0x598F, 0x8A70,
+ 0x5990, 0x8A71,
+ 0x5991, 0x8A72,
+ 0x5994, 0x8A73,
+ 0x5995, 0x8A74,
+ 0x5998, 0x8A75,
+ 0x599A, 0x8A76,
+ 0x599B, 0x8A77,
+ 0x599C, 0x8A78,
+ 0x599D, 0x8A79,
+ 0x599F, 0x8A7A,
+ 0x59A0, 0x8A7B,
+ 0x59A1, 0x8A7C,
+ 0x59A2, 0x8A7D,
+ 0x59A6, 0x8A7E,
+ 0x59A7, 0x8A80,
+ 0x59AC, 0x8A81,
+ 0x59AD, 0x8A82,
+ 0x59B0, 0x8A83,
+ 0x59B1, 0x8A84,
+ 0x59B3, 0x8A85,
+ 0x59B4, 0x8A86,
+ 0x59B5, 0x8A87,
+ 0x59B6, 0x8A88,
+ 0x59B7, 0x8A89,
+ 0x59B8, 0x8A8A,
+ 0x59BA, 0x8A8B,
+ 0x59BC, 0x8A8C,
+ 0x59BD, 0x8A8D,
+ 0x59BF, 0x8A8E,
+ 0x59C0, 0x8A8F,
+ 0x59C1, 0x8A90,
+ 0x59C2, 0x8A91,
+ 0x59C3, 0x8A92,
+ 0x59C4, 0x8A93,
+ 0x59C5, 0x8A94,
+ 0x59C7, 0x8A95,
+ 0x59C8, 0x8A96,
+ 0x59C9, 0x8A97,
+ 0x59CC, 0x8A98,
+ 0x59CD, 0x8A99,
+ 0x59CE, 0x8A9A,
+ 0x59CF, 0x8A9B,
+ 0x59D5, 0x8A9C,
+ 0x59D6, 0x8A9D,
+ 0x59D9, 0x8A9E,
+ 0x59DB, 0x8A9F,
+ 0x59DE, 0x8AA0,
+ 0x59DF, 0x8AA1,
+ 0x59E0, 0x8AA2,
+ 0x59E1, 0x8AA3,
+ 0x59E2, 0x8AA4,
+ 0x59E4, 0x8AA5,
+ 0x59E6, 0x8AA6,
+ 0x59E7, 0x8AA7,
+ 0x59E9, 0x8AA8,
+ 0x59EA, 0x8AA9,
+ 0x59EB, 0x8AAA,
+ 0x59ED, 0x8AAB,
+ 0x59EE, 0x8AAC,
+ 0x59EF, 0x8AAD,
+ 0x59F0, 0x8AAE,
+ 0x59F1, 0x8AAF,
+ 0x59F2, 0x8AB0,
+ 0x59F3, 0x8AB1,
+ 0x59F4, 0x8AB2,
+ 0x59F5, 0x8AB3,
+ 0x59F6, 0x8AB4,
+ 0x59F7, 0x8AB5,
+ 0x59F8, 0x8AB6,
+ 0x59FA, 0x8AB7,
+ 0x59FC, 0x8AB8,
+ 0x59FD, 0x8AB9,
+ 0x59FE, 0x8ABA,
+ 0x5A00, 0x8ABB,
+ 0x5A02, 0x8ABC,
+ 0x5A0A, 0x8ABD,
+ 0x5A0B, 0x8ABE,
+ 0x5A0D, 0x8ABF,
+ 0x5A0E, 0x8AC0,
+ 0x5A0F, 0x8AC1,
+ 0x5A10, 0x8AC2,
+ 0x5A12, 0x8AC3,
+ 0x5A14, 0x8AC4,
+ 0x5A15, 0x8AC5,
+ 0x5A16, 0x8AC6,
+ 0x5A17, 0x8AC7,
+ 0x5A19, 0x8AC8,
+ 0x5A1A, 0x8AC9,
+ 0x5A1B, 0x8ACA,
+ 0x5A1D, 0x8ACB,
+ 0x5A1E, 0x8ACC,
+ 0x5A21, 0x8ACD,
+ 0x5A22, 0x8ACE,
+ 0x5A24, 0x8ACF,
+ 0x5A26, 0x8AD0,
+ 0x5A27, 0x8AD1,
+ 0x5A28, 0x8AD2,
+ 0x5A2A, 0x8AD3,
+ 0x5A2B, 0x8AD4,
+ 0x5A2C, 0x8AD5,
+ 0x5A2D, 0x8AD6,
+ 0x5A2E, 0x8AD7,
+ 0x5A2F, 0x8AD8,
+ 0x5A30, 0x8AD9,
+ 0x5A33, 0x8ADA,
+ 0x5A35, 0x8ADB,
+ 0x5A37, 0x8ADC,
+ 0x5A38, 0x8ADD,
+ 0x5A39, 0x8ADE,
+ 0x5A3A, 0x8ADF,
+ 0x5A3B, 0x8AE0,
+ 0x5A3D, 0x8AE1,
+ 0x5A3E, 0x8AE2,
+ 0x5A3F, 0x8AE3,
+ 0x5A41, 0x8AE4,
+ 0x5A42, 0x8AE5,
+ 0x5A43, 0x8AE6,
+ 0x5A44, 0x8AE7,
+ 0x5A45, 0x8AE8,
+ 0x5A47, 0x8AE9,
+ 0x5A48, 0x8AEA,
+ 0x5A4B, 0x8AEB,
+ 0x5A4C, 0x8AEC,
+ 0x5A4D, 0x8AED,
+ 0x5A4E, 0x8AEE,
+ 0x5A4F, 0x8AEF,
+ 0x5A50, 0x8AF0,
+ 0x5A51, 0x8AF1,
+ 0x5A52, 0x8AF2,
+ 0x5A53, 0x8AF3,
+ 0x5A54, 0x8AF4,
+ 0x5A56, 0x8AF5,
+ 0x5A57, 0x8AF6,
+ 0x5A58, 0x8AF7,
+ 0x5A59, 0x8AF8,
+ 0x5A5B, 0x8AF9,
+ 0x5A5C, 0x8AFA,
+ 0x5A5D, 0x8AFB,
+ 0x5A5E, 0x8AFC,
+ 0x5A5F, 0x8AFD,
+ 0x5A60, 0x8AFE,
+ 0x5A61, 0x8B40,
+ 0x5A63, 0x8B41,
+ 0x5A64, 0x8B42,
+ 0x5A65, 0x8B43,
+ 0x5A66, 0x8B44,
+ 0x5A68, 0x8B45,
+ 0x5A69, 0x8B46,
+ 0x5A6B, 0x8B47,
+ 0x5A6C, 0x8B48,
+ 0x5A6D, 0x8B49,
+ 0x5A6E, 0x8B4A,
+ 0x5A6F, 0x8B4B,
+ 0x5A70, 0x8B4C,
+ 0x5A71, 0x8B4D,
+ 0x5A72, 0x8B4E,
+ 0x5A73, 0x8B4F,
+ 0x5A78, 0x8B50,
+ 0x5A79, 0x8B51,
+ 0x5A7B, 0x8B52,
+ 0x5A7C, 0x8B53,
+ 0x5A7D, 0x8B54,
+ 0x5A7E, 0x8B55,
+ 0x5A80, 0x8B56,
+ 0x5A81, 0x8B57,
+ 0x5A82, 0x8B58,
+ 0x5A83, 0x8B59,
+ 0x5A84, 0x8B5A,
+ 0x5A85, 0x8B5B,
+ 0x5A86, 0x8B5C,
+ 0x5A87, 0x8B5D,
+ 0x5A88, 0x8B5E,
+ 0x5A89, 0x8B5F,
+ 0x5A8A, 0x8B60,
+ 0x5A8B, 0x8B61,
+ 0x5A8C, 0x8B62,
+ 0x5A8D, 0x8B63,
+ 0x5A8E, 0x8B64,
+ 0x5A8F, 0x8B65,
+ 0x5A90, 0x8B66,
+ 0x5A91, 0x8B67,
+ 0x5A93, 0x8B68,
+ 0x5A94, 0x8B69,
+ 0x5A95, 0x8B6A,
+ 0x5A96, 0x8B6B,
+ 0x5A97, 0x8B6C,
+ 0x5A98, 0x8B6D,
+ 0x5A99, 0x8B6E,
+ 0x5A9C, 0x8B6F,
+ 0x5A9D, 0x8B70,
+ 0x5A9E, 0x8B71,
+ 0x5A9F, 0x8B72,
+ 0x5AA0, 0x8B73,
+ 0x5AA1, 0x8B74,
+ 0x5AA2, 0x8B75,
+ 0x5AA3, 0x8B76,
+ 0x5AA4, 0x8B77,
+ 0x5AA5, 0x8B78,
+ 0x5AA6, 0x8B79,
+ 0x5AA7, 0x8B7A,
+ 0x5AA8, 0x8B7B,
+ 0x5AA9, 0x8B7C,
+ 0x5AAB, 0x8B7D,
+ 0x5AAC, 0x8B7E,
+ 0x5AAD, 0x8B80,
+ 0x5AAE, 0x8B81,
+ 0x5AAF, 0x8B82,
+ 0x5AB0, 0x8B83,
+ 0x5AB1, 0x8B84,
+ 0x5AB4, 0x8B85,
+ 0x5AB6, 0x8B86,
+ 0x5AB7, 0x8B87,
+ 0x5AB9, 0x8B88,
+ 0x5ABA, 0x8B89,
+ 0x5ABB, 0x8B8A,
+ 0x5ABC, 0x8B8B,
+ 0x5ABD, 0x8B8C,
+ 0x5ABF, 0x8B8D,
+ 0x5AC0, 0x8B8E,
+ 0x5AC3, 0x8B8F,
+ 0x5AC4, 0x8B90,
+ 0x5AC5, 0x8B91,
+ 0x5AC6, 0x8B92,
+ 0x5AC7, 0x8B93,
+ 0x5AC8, 0x8B94,
+ 0x5ACA, 0x8B95,
+ 0x5ACB, 0x8B96,
+ 0x5ACD, 0x8B97,
+ 0x5ACE, 0x8B98,
+ 0x5ACF, 0x8B99,
+ 0x5AD0, 0x8B9A,
+ 0x5AD1, 0x8B9B,
+ 0x5AD3, 0x8B9C,
+ 0x5AD5, 0x8B9D,
+ 0x5AD7, 0x8B9E,
+ 0x5AD9, 0x8B9F,
+ 0x5ADA, 0x8BA0,
+ 0x5ADB, 0x8BA1,
+ 0x5ADD, 0x8BA2,
+ 0x5ADE, 0x8BA3,
+ 0x5ADF, 0x8BA4,
+ 0x5AE2, 0x8BA5,
+ 0x5AE4, 0x8BA6,
+ 0x5AE5, 0x8BA7,
+ 0x5AE7, 0x8BA8,
+ 0x5AE8, 0x8BA9,
+ 0x5AEA, 0x8BAA,
+ 0x5AEC, 0x8BAB,
+ 0x5AED, 0x8BAC,
+ 0x5AEE, 0x8BAD,
+ 0x5AEF, 0x8BAE,
+ 0x5AF0, 0x8BAF,
+ 0x5AF2, 0x8BB0,
+ 0x5AF3, 0x8BB1,
+ 0x5AF4, 0x8BB2,
+ 0x5AF5, 0x8BB3,
+ 0x5AF6, 0x8BB4,
+ 0x5AF7, 0x8BB5,
+ 0x5AF8, 0x8BB6,
+ 0x5AF9, 0x8BB7,
+ 0x5AFA, 0x8BB8,
+ 0x5AFB, 0x8BB9,
+ 0x5AFC, 0x8BBA,
+ 0x5AFD, 0x8BBB,
+ 0x5AFE, 0x8BBC,
+ 0x5AFF, 0x8BBD,
+ 0x5B00, 0x8BBE,
+ 0x5B01, 0x8BBF,
+ 0x5B02, 0x8BC0,
+ 0x5B03, 0x8BC1,
+ 0x5B04, 0x8BC2,
+ 0x5B05, 0x8BC3,
+ 0x5B06, 0x8BC4,
+ 0x5B07, 0x8BC5,
+ 0x5B08, 0x8BC6,
+ 0x5B0A, 0x8BC7,
+ 0x5B0B, 0x8BC8,
+ 0x5B0C, 0x8BC9,
+ 0x5B0D, 0x8BCA,
+ 0x5B0E, 0x8BCB,
+ 0x5B0F, 0x8BCC,
+ 0x5B10, 0x8BCD,
+ 0x5B11, 0x8BCE,
+ 0x5B12, 0x8BCF,
+ 0x5B13, 0x8BD0,
+ 0x5B14, 0x8BD1,
+ 0x5B15, 0x8BD2,
+ 0x5B18, 0x8BD3,
+ 0x5B19, 0x8BD4,
+ 0x5B1A, 0x8BD5,
+ 0x5B1B, 0x8BD6,
+ 0x5B1C, 0x8BD7,
+ 0x5B1D, 0x8BD8,
+ 0x5B1E, 0x8BD9,
+ 0x5B1F, 0x8BDA,
+ 0x5B20, 0x8BDB,
+ 0x5B21, 0x8BDC,
+ 0x5B22, 0x8BDD,
+ 0x5B23, 0x8BDE,
+ 0x5B24, 0x8BDF,
+ 0x5B25, 0x8BE0,
+ 0x5B26, 0x8BE1,
+ 0x5B27, 0x8BE2,
+ 0x5B28, 0x8BE3,
+ 0x5B29, 0x8BE4,
+ 0x5B2A, 0x8BE5,
+ 0x5B2B, 0x8BE6,
+ 0x5B2C, 0x8BE7,
+ 0x5B2D, 0x8BE8,
+ 0x5B2E, 0x8BE9,
+ 0x5B2F, 0x8BEA,
+ 0x5B30, 0x8BEB,
+ 0x5B31, 0x8BEC,
+ 0x5B33, 0x8BED,
+ 0x5B35, 0x8BEE,
+ 0x5B36, 0x8BEF,
+ 0x5B38, 0x8BF0,
+ 0x5B39, 0x8BF1,
+ 0x5B3A, 0x8BF2,
+ 0x5B3B, 0x8BF3,
+ 0x5B3C, 0x8BF4,
+ 0x5B3D, 0x8BF5,
+ 0x5B3E, 0x8BF6,
+ 0x5B3F, 0x8BF7,
+ 0x5B41, 0x8BF8,
+ 0x5B42, 0x8BF9,
+ 0x5B43, 0x8BFA,
+ 0x5B44, 0x8BFB,
+ 0x5B45, 0x8BFC,
+ 0x5B46, 0x8BFD,
+ 0x5B47, 0x8BFE,
+ 0x5B48, 0x8C40,
+ 0x5B49, 0x8C41,
+ 0x5B4A, 0x8C42,
+ 0x5B4B, 0x8C43,
+ 0x5B4C, 0x8C44,
+ 0x5B4D, 0x8C45,
+ 0x5B4E, 0x8C46,
+ 0x5B4F, 0x8C47,
+ 0x5B52, 0x8C48,
+ 0x5B56, 0x8C49,
+ 0x5B5E, 0x8C4A,
+ 0x5B60, 0x8C4B,
+ 0x5B61, 0x8C4C,
+ 0x5B67, 0x8C4D,
+ 0x5B68, 0x8C4E,
+ 0x5B6B, 0x8C4F,
+ 0x5B6D, 0x8C50,
+ 0x5B6E, 0x8C51,
+ 0x5B6F, 0x8C52,
+ 0x5B72, 0x8C53,
+ 0x5B74, 0x8C54,
+ 0x5B76, 0x8C55,
+ 0x5B77, 0x8C56,
+ 0x5B78, 0x8C57,
+ 0x5B79, 0x8C58,
+ 0x5B7B, 0x8C59,
+ 0x5B7C, 0x8C5A,
+ 0x5B7E, 0x8C5B,
+ 0x5B7F, 0x8C5C,
+ 0x5B82, 0x8C5D,
+ 0x5B86, 0x8C5E,
+ 0x5B8A, 0x8C5F,
+ 0x5B8D, 0x8C60,
+ 0x5B8E, 0x8C61,
+ 0x5B90, 0x8C62,
+ 0x5B91, 0x8C63,
+ 0x5B92, 0x8C64,
+ 0x5B94, 0x8C65,
+ 0x5B96, 0x8C66,
+ 0x5B9F, 0x8C67,
+ 0x5BA7, 0x8C68,
+ 0x5BA8, 0x8C69,
+ 0x5BA9, 0x8C6A,
+ 0x5BAC, 0x8C6B,
+ 0x5BAD, 0x8C6C,
+ 0x5BAE, 0x8C6D,
+ 0x5BAF, 0x8C6E,
+ 0x5BB1, 0x8C6F,
+ 0x5BB2, 0x8C70,
+ 0x5BB7, 0x8C71,
+ 0x5BBA, 0x8C72,
+ 0x5BBB, 0x8C73,
+ 0x5BBC, 0x8C74,
+ 0x5BC0, 0x8C75,
+ 0x5BC1, 0x8C76,
+ 0x5BC3, 0x8C77,
+ 0x5BC8, 0x8C78,
+ 0x5BC9, 0x8C79,
+ 0x5BCA, 0x8C7A,
+ 0x5BCB, 0x8C7B,
+ 0x5BCD, 0x8C7C,
+ 0x5BCE, 0x8C7D,
+ 0x5BCF, 0x8C7E,
+ 0x5BD1, 0x8C80,
+ 0x5BD4, 0x8C81,
+ 0x5BD5, 0x8C82,
+ 0x5BD6, 0x8C83,
+ 0x5BD7, 0x8C84,
+ 0x5BD8, 0x8C85,
+ 0x5BD9, 0x8C86,
+ 0x5BDA, 0x8C87,
+ 0x5BDB, 0x8C88,
+ 0x5BDC, 0x8C89,
+ 0x5BE0, 0x8C8A,
+ 0x5BE2, 0x8C8B,
+ 0x5BE3, 0x8C8C,
+ 0x5BE6, 0x8C8D,
+ 0x5BE7, 0x8C8E,
+ 0x5BE9, 0x8C8F,
+ 0x5BEA, 0x8C90,
+ 0x5BEB, 0x8C91,
+ 0x5BEC, 0x8C92,
+ 0x5BED, 0x8C93,
+ 0x5BEF, 0x8C94,
+ 0x5BF1, 0x8C95,
+ 0x5BF2, 0x8C96,
+ 0x5BF3, 0x8C97,
+ 0x5BF4, 0x8C98,
+ 0x5BF5, 0x8C99,
+ 0x5BF6, 0x8C9A,
+ 0x5BF7, 0x8C9B,
+ 0x5BFD, 0x8C9C,
+ 0x5BFE, 0x8C9D,
+ 0x5C00, 0x8C9E,
+ 0x5C02, 0x8C9F,
+ 0x5C03, 0x8CA0,
+ 0x5C05, 0x8CA1,
+ 0x5C07, 0x8CA2,
+ 0x5C08, 0x8CA3,
+ 0x5C0B, 0x8CA4,
+ 0x5C0C, 0x8CA5,
+ 0x5C0D, 0x8CA6,
+ 0x5C0E, 0x8CA7,
+ 0x5C10, 0x8CA8,
+ 0x5C12, 0x8CA9,
+ 0x5C13, 0x8CAA,
+ 0x5C17, 0x8CAB,
+ 0x5C19, 0x8CAC,
+ 0x5C1B, 0x8CAD,
+ 0x5C1E, 0x8CAE,
+ 0x5C1F, 0x8CAF,
+ 0x5C20, 0x8CB0,
+ 0x5C21, 0x8CB1,
+ 0x5C23, 0x8CB2,
+ 0x5C26, 0x8CB3,
+ 0x5C28, 0x8CB4,
+ 0x5C29, 0x8CB5,
+ 0x5C2A, 0x8CB6,
+ 0x5C2B, 0x8CB7,
+ 0x5C2D, 0x8CB8,
+ 0x5C2E, 0x8CB9,
+ 0x5C2F, 0x8CBA,
+ 0x5C30, 0x8CBB,
+ 0x5C32, 0x8CBC,
+ 0x5C33, 0x8CBD,
+ 0x5C35, 0x8CBE,
+ 0x5C36, 0x8CBF,
+ 0x5C37, 0x8CC0,
+ 0x5C43, 0x8CC1,
+ 0x5C44, 0x8CC2,
+ 0x5C46, 0x8CC3,
+ 0x5C47, 0x8CC4,
+ 0x5C4C, 0x8CC5,
+ 0x5C4D, 0x8CC6,
+ 0x5C52, 0x8CC7,
+ 0x5C53, 0x8CC8,
+ 0x5C54, 0x8CC9,
+ 0x5C56, 0x8CCA,
+ 0x5C57, 0x8CCB,
+ 0x5C58, 0x8CCC,
+ 0x5C5A, 0x8CCD,
+ 0x5C5B, 0x8CCE,
+ 0x5C5C, 0x8CCF,
+ 0x5C5D, 0x8CD0,
+ 0x5C5F, 0x8CD1,
+ 0x5C62, 0x8CD2,
+ 0x5C64, 0x8CD3,
+ 0x5C67, 0x8CD4,
+ 0x5C68, 0x8CD5,
+ 0x5C69, 0x8CD6,
+ 0x5C6A, 0x8CD7,
+ 0x5C6B, 0x8CD8,
+ 0x5C6C, 0x8CD9,
+ 0x5C6D, 0x8CDA,
+ 0x5C70, 0x8CDB,
+ 0x5C72, 0x8CDC,
+ 0x5C73, 0x8CDD,
+ 0x5C74, 0x8CDE,
+ 0x5C75, 0x8CDF,
+ 0x5C76, 0x8CE0,
+ 0x5C77, 0x8CE1,
+ 0x5C78, 0x8CE2,
+ 0x5C7B, 0x8CE3,
+ 0x5C7C, 0x8CE4,
+ 0x5C7D, 0x8CE5,
+ 0x5C7E, 0x8CE6,
+ 0x5C80, 0x8CE7,
+ 0x5C83, 0x8CE8,
+ 0x5C84, 0x8CE9,
+ 0x5C85, 0x8CEA,
+ 0x5C86, 0x8CEB,
+ 0x5C87, 0x8CEC,
+ 0x5C89, 0x8CED,
+ 0x5C8A, 0x8CEE,
+ 0x5C8B, 0x8CEF,
+ 0x5C8E, 0x8CF0,
+ 0x5C8F, 0x8CF1,
+ 0x5C92, 0x8CF2,
+ 0x5C93, 0x8CF3,
+ 0x5C95, 0x8CF4,
+ 0x5C9D, 0x8CF5,
+ 0x5C9E, 0x8CF6,
+ 0x5C9F, 0x8CF7,
+ 0x5CA0, 0x8CF8,
+ 0x5CA1, 0x8CF9,
+ 0x5CA4, 0x8CFA,
+ 0x5CA5, 0x8CFB,
+ 0x5CA6, 0x8CFC,
+ 0x5CA7, 0x8CFD,
+ 0x5CA8, 0x8CFE,
+ 0x5CAA, 0x8D40,
+ 0x5CAE, 0x8D41,
+ 0x5CAF, 0x8D42,
+ 0x5CB0, 0x8D43,
+ 0x5CB2, 0x8D44,
+ 0x5CB4, 0x8D45,
+ 0x5CB6, 0x8D46,
+ 0x5CB9, 0x8D47,
+ 0x5CBA, 0x8D48,
+ 0x5CBB, 0x8D49,
+ 0x5CBC, 0x8D4A,
+ 0x5CBE, 0x8D4B,
+ 0x5CC0, 0x8D4C,
+ 0x5CC2, 0x8D4D,
+ 0x5CC3, 0x8D4E,
+ 0x5CC5, 0x8D4F,
+ 0x5CC6, 0x8D50,
+ 0x5CC7, 0x8D51,
+ 0x5CC8, 0x8D52,
+ 0x5CC9, 0x8D53,
+ 0x5CCA, 0x8D54,
+ 0x5CCC, 0x8D55,
+ 0x5CCD, 0x8D56,
+ 0x5CCE, 0x8D57,
+ 0x5CCF, 0x8D58,
+ 0x5CD0, 0x8D59,
+ 0x5CD1, 0x8D5A,
+ 0x5CD3, 0x8D5B,
+ 0x5CD4, 0x8D5C,
+ 0x5CD5, 0x8D5D,
+ 0x5CD6, 0x8D5E,
+ 0x5CD7, 0x8D5F,
+ 0x5CD8, 0x8D60,
+ 0x5CDA, 0x8D61,
+ 0x5CDB, 0x8D62,
+ 0x5CDC, 0x8D63,
+ 0x5CDD, 0x8D64,
+ 0x5CDE, 0x8D65,
+ 0x5CDF, 0x8D66,
+ 0x5CE0, 0x8D67,
+ 0x5CE2, 0x8D68,
+ 0x5CE3, 0x8D69,
+ 0x5CE7, 0x8D6A,
+ 0x5CE9, 0x8D6B,
+ 0x5CEB, 0x8D6C,
+ 0x5CEC, 0x8D6D,
+ 0x5CEE, 0x8D6E,
+ 0x5CEF, 0x8D6F,
+ 0x5CF1, 0x8D70,
+ 0x5CF2, 0x8D71,
+ 0x5CF3, 0x8D72,
+ 0x5CF4, 0x8D73,
+ 0x5CF5, 0x8D74,
+ 0x5CF6, 0x8D75,
+ 0x5CF7, 0x8D76,
+ 0x5CF8, 0x8D77,
+ 0x5CF9, 0x8D78,
+ 0x5CFA, 0x8D79,
+ 0x5CFC, 0x8D7A,
+ 0x5CFD, 0x8D7B,
+ 0x5CFE, 0x8D7C,
+ 0x5CFF, 0x8D7D,
+ 0x5D00, 0x8D7E,
+ 0x5D01, 0x8D80,
+ 0x5D04, 0x8D81,
+ 0x5D05, 0x8D82,
+ 0x5D08, 0x8D83,
+ 0x5D09, 0x8D84,
+ 0x5D0A, 0x8D85,
+ 0x5D0B, 0x8D86,
+ 0x5D0C, 0x8D87,
+ 0x5D0D, 0x8D88,
+ 0x5D0F, 0x8D89,
+ 0x5D10, 0x8D8A,
+ 0x5D11, 0x8D8B,
+ 0x5D12, 0x8D8C,
+ 0x5D13, 0x8D8D,
+ 0x5D15, 0x8D8E,
+ 0x5D17, 0x8D8F,
+ 0x5D18, 0x8D90,
+ 0x5D19, 0x8D91,
+ 0x5D1A, 0x8D92,
+ 0x5D1C, 0x8D93,
+ 0x5D1D, 0x8D94,
+ 0x5D1F, 0x8D95,
+ 0x5D20, 0x8D96,
+ 0x5D21, 0x8D97,
+ 0x5D22, 0x8D98,
+ 0x5D23, 0x8D99,
+ 0x5D25, 0x8D9A,
+ 0x5D28, 0x8D9B,
+ 0x5D2A, 0x8D9C,
+ 0x5D2B, 0x8D9D,
+ 0x5D2C, 0x8D9E,
+ 0x5D2F, 0x8D9F,
+ 0x5D30, 0x8DA0,
+ 0x5D31, 0x8DA1,
+ 0x5D32, 0x8DA2,
+ 0x5D33, 0x8DA3,
+ 0x5D35, 0x8DA4,
+ 0x5D36, 0x8DA5,
+ 0x5D37, 0x8DA6,
+ 0x5D38, 0x8DA7,
+ 0x5D39, 0x8DA8,
+ 0x5D3A, 0x8DA9,
+ 0x5D3B, 0x8DAA,
+ 0x5D3C, 0x8DAB,
+ 0x5D3F, 0x8DAC,
+ 0x5D40, 0x8DAD,
+ 0x5D41, 0x8DAE,
+ 0x5D42, 0x8DAF,
+ 0x5D43, 0x8DB0,
+ 0x5D44, 0x8DB1,
+ 0x5D45, 0x8DB2,
+ 0x5D46, 0x8DB3,
+ 0x5D48, 0x8DB4,
+ 0x5D49, 0x8DB5,
+ 0x5D4D, 0x8DB6,
+ 0x5D4E, 0x8DB7,
+ 0x5D4F, 0x8DB8,
+ 0x5D50, 0x8DB9,
+ 0x5D51, 0x8DBA,
+ 0x5D52, 0x8DBB,
+ 0x5D53, 0x8DBC,
+ 0x5D54, 0x8DBD,
+ 0x5D55, 0x8DBE,
+ 0x5D56, 0x8DBF,
+ 0x5D57, 0x8DC0,
+ 0x5D59, 0x8DC1,
+ 0x5D5A, 0x8DC2,
+ 0x5D5C, 0x8DC3,
+ 0x5D5E, 0x8DC4,
+ 0x5D5F, 0x8DC5,
+ 0x5D60, 0x8DC6,
+ 0x5D61, 0x8DC7,
+ 0x5D62, 0x8DC8,
+ 0x5D63, 0x8DC9,
+ 0x5D64, 0x8DCA,
+ 0x5D65, 0x8DCB,
+ 0x5D66, 0x8DCC,
+ 0x5D67, 0x8DCD,
+ 0x5D68, 0x8DCE,
+ 0x5D6A, 0x8DCF,
+ 0x5D6D, 0x8DD0,
+ 0x5D6E, 0x8DD1,
+ 0x5D70, 0x8DD2,
+ 0x5D71, 0x8DD3,
+ 0x5D72, 0x8DD4,
+ 0x5D73, 0x8DD5,
+ 0x5D75, 0x8DD6,
+ 0x5D76, 0x8DD7,
+ 0x5D77, 0x8DD8,
+ 0x5D78, 0x8DD9,
+ 0x5D79, 0x8DDA,
+ 0x5D7A, 0x8DDB,
+ 0x5D7B, 0x8DDC,
+ 0x5D7C, 0x8DDD,
+ 0x5D7D, 0x8DDE,
+ 0x5D7E, 0x8DDF,
+ 0x5D7F, 0x8DE0,
+ 0x5D80, 0x8DE1,
+ 0x5D81, 0x8DE2,
+ 0x5D83, 0x8DE3,
+ 0x5D84, 0x8DE4,
+ 0x5D85, 0x8DE5,
+ 0x5D86, 0x8DE6,
+ 0x5D87, 0x8DE7,
+ 0x5D88, 0x8DE8,
+ 0x5D89, 0x8DE9,
+ 0x5D8A, 0x8DEA,
+ 0x5D8B, 0x8DEB,
+ 0x5D8C, 0x8DEC,
+ 0x5D8D, 0x8DED,
+ 0x5D8E, 0x8DEE,
+ 0x5D8F, 0x8DEF,
+ 0x5D90, 0x8DF0,
+ 0x5D91, 0x8DF1,
+ 0x5D92, 0x8DF2,
+ 0x5D93, 0x8DF3,
+ 0x5D94, 0x8DF4,
+ 0x5D95, 0x8DF5,
+ 0x5D96, 0x8DF6,
+ 0x5D97, 0x8DF7,
+ 0x5D98, 0x8DF8,
+ 0x5D9A, 0x8DF9,
+ 0x5D9B, 0x8DFA,
+ 0x5D9C, 0x8DFB,
+ 0x5D9E, 0x8DFC,
+ 0x5D9F, 0x8DFD,
+ 0x5DA0, 0x8DFE,
+ 0x5DA1, 0x8E40,
+ 0x5DA2, 0x8E41,
+ 0x5DA3, 0x8E42,
+ 0x5DA4, 0x8E43,
+ 0x5DA5, 0x8E44,
+ 0x5DA6, 0x8E45,
+ 0x5DA7, 0x8E46,
+ 0x5DA8, 0x8E47,
+ 0x5DA9, 0x8E48,
+ 0x5DAA, 0x8E49,
+ 0x5DAB, 0x8E4A,
+ 0x5DAC, 0x8E4B,
+ 0x5DAD, 0x8E4C,
+ 0x5DAE, 0x8E4D,
+ 0x5DAF, 0x8E4E,
+ 0x5DB0, 0x8E4F,
+ 0x5DB1, 0x8E50,
+ 0x5DB2, 0x8E51,
+ 0x5DB3, 0x8E52,
+ 0x5DB4, 0x8E53,
+ 0x5DB5, 0x8E54,
+ 0x5DB6, 0x8E55,
+ 0x5DB8, 0x8E56,
+ 0x5DB9, 0x8E57,
+ 0x5DBA, 0x8E58,
+ 0x5DBB, 0x8E59,
+ 0x5DBC, 0x8E5A,
+ 0x5DBD, 0x8E5B,
+ 0x5DBE, 0x8E5C,
+ 0x5DBF, 0x8E5D,
+ 0x5DC0, 0x8E5E,
+ 0x5DC1, 0x8E5F,
+ 0x5DC2, 0x8E60,
+ 0x5DC3, 0x8E61,
+ 0x5DC4, 0x8E62,
+ 0x5DC6, 0x8E63,
+ 0x5DC7, 0x8E64,
+ 0x5DC8, 0x8E65,
+ 0x5DC9, 0x8E66,
+ 0x5DCA, 0x8E67,
+ 0x5DCB, 0x8E68,
+ 0x5DCC, 0x8E69,
+ 0x5DCE, 0x8E6A,
+ 0x5DCF, 0x8E6B,
+ 0x5DD0, 0x8E6C,
+ 0x5DD1, 0x8E6D,
+ 0x5DD2, 0x8E6E,
+ 0x5DD3, 0x8E6F,
+ 0x5DD4, 0x8E70,
+ 0x5DD5, 0x8E71,
+ 0x5DD6, 0x8E72,
+ 0x5DD7, 0x8E73,
+ 0x5DD8, 0x8E74,
+ 0x5DD9, 0x8E75,
+ 0x5DDA, 0x8E76,
+ 0x5DDC, 0x8E77,
+ 0x5DDF, 0x8E78,
+ 0x5DE0, 0x8E79,
+ 0x5DE3, 0x8E7A,
+ 0x5DE4, 0x8E7B,
+ 0x5DEA, 0x8E7C,
+ 0x5DEC, 0x8E7D,
+ 0x5DED, 0x8E7E,
+ 0x5DF0, 0x8E80,
+ 0x5DF5, 0x8E81,
+ 0x5DF6, 0x8E82,
+ 0x5DF8, 0x8E83,
+ 0x5DF9, 0x8E84,
+ 0x5DFA, 0x8E85,
+ 0x5DFB, 0x8E86,
+ 0x5DFC, 0x8E87,
+ 0x5DFF, 0x8E88,
+ 0x5E00, 0x8E89,
+ 0x5E04, 0x8E8A,
+ 0x5E07, 0x8E8B,
+ 0x5E09, 0x8E8C,
+ 0x5E0A, 0x8E8D,
+ 0x5E0B, 0x8E8E,
+ 0x5E0D, 0x8E8F,
+ 0x5E0E, 0x8E90,
+ 0x5E12, 0x8E91,
+ 0x5E13, 0x8E92,
+ 0x5E17, 0x8E93,
+ 0x5E1E, 0x8E94,
+ 0x5E1F, 0x8E95,
+ 0x5E20, 0x8E96,
+ 0x5E21, 0x8E97,
+ 0x5E22, 0x8E98,
+ 0x5E23, 0x8E99,
+ 0x5E24, 0x8E9A,
+ 0x5E25, 0x8E9B,
+ 0x5E28, 0x8E9C,
+ 0x5E29, 0x8E9D,
+ 0x5E2A, 0x8E9E,
+ 0x5E2B, 0x8E9F,
+ 0x5E2C, 0x8EA0,
+ 0x5E2F, 0x8EA1,
+ 0x5E30, 0x8EA2,
+ 0x5E32, 0x8EA3,
+ 0x5E33, 0x8EA4,
+ 0x5E34, 0x8EA5,
+ 0x5E35, 0x8EA6,
+ 0x5E36, 0x8EA7,
+ 0x5E39, 0x8EA8,
+ 0x5E3A, 0x8EA9,
+ 0x5E3E, 0x8EAA,
+ 0x5E3F, 0x8EAB,
+ 0x5E40, 0x8EAC,
+ 0x5E41, 0x8EAD,
+ 0x5E43, 0x8EAE,
+ 0x5E46, 0x8EAF,
+ 0x5E47, 0x8EB0,
+ 0x5E48, 0x8EB1,
+ 0x5E49, 0x8EB2,
+ 0x5E4A, 0x8EB3,
+ 0x5E4B, 0x8EB4,
+ 0x5E4D, 0x8EB5,
+ 0x5E4E, 0x8EB6,
+ 0x5E4F, 0x8EB7,
+ 0x5E50, 0x8EB8,
+ 0x5E51, 0x8EB9,
+ 0x5E52, 0x8EBA,
+ 0x5E53, 0x8EBB,
+ 0x5E56, 0x8EBC,
+ 0x5E57, 0x8EBD,
+ 0x5E58, 0x8EBE,
+ 0x5E59, 0x8EBF,
+ 0x5E5A, 0x8EC0,
+ 0x5E5C, 0x8EC1,
+ 0x5E5D, 0x8EC2,
+ 0x5E5F, 0x8EC3,
+ 0x5E60, 0x8EC4,
+ 0x5E63, 0x8EC5,
+ 0x5E64, 0x8EC6,
+ 0x5E65, 0x8EC7,
+ 0x5E66, 0x8EC8,
+ 0x5E67, 0x8EC9,
+ 0x5E68, 0x8ECA,
+ 0x5E69, 0x8ECB,
+ 0x5E6A, 0x8ECC,
+ 0x5E6B, 0x8ECD,
+ 0x5E6C, 0x8ECE,
+ 0x5E6D, 0x8ECF,
+ 0x5E6E, 0x8ED0,
+ 0x5E6F, 0x8ED1,
+ 0x5E70, 0x8ED2,
+ 0x5E71, 0x8ED3,
+ 0x5E75, 0x8ED4,
+ 0x5E77, 0x8ED5,
+ 0x5E79, 0x8ED6,
+ 0x5E7E, 0x8ED7,
+ 0x5E81, 0x8ED8,
+ 0x5E82, 0x8ED9,
+ 0x5E83, 0x8EDA,
+ 0x5E85, 0x8EDB,
+ 0x5E88, 0x8EDC,
+ 0x5E89, 0x8EDD,
+ 0x5E8C, 0x8EDE,
+ 0x5E8D, 0x8EDF,
+ 0x5E8E, 0x8EE0,
+ 0x5E92, 0x8EE1,
+ 0x5E98, 0x8EE2,
+ 0x5E9B, 0x8EE3,
+ 0x5E9D, 0x8EE4,
+ 0x5EA1, 0x8EE5,
+ 0x5EA2, 0x8EE6,
+ 0x5EA3, 0x8EE7,
+ 0x5EA4, 0x8EE8,
+ 0x5EA8, 0x8EE9,
+ 0x5EA9, 0x8EEA,
+ 0x5EAA, 0x8EEB,
+ 0x5EAB, 0x8EEC,
+ 0x5EAC, 0x8EED,
+ 0x5EAE, 0x8EEE,
+ 0x5EAF, 0x8EEF,
+ 0x5EB0, 0x8EF0,
+ 0x5EB1, 0x8EF1,
+ 0x5EB2, 0x8EF2,
+ 0x5EB4, 0x8EF3,
+ 0x5EBA, 0x8EF4,
+ 0x5EBB, 0x8EF5,
+ 0x5EBC, 0x8EF6,
+ 0x5EBD, 0x8EF7,
+ 0x5EBF, 0x8EF8,
+ 0x5EC0, 0x8EF9,
+ 0x5EC1, 0x8EFA,
+ 0x5EC2, 0x8EFB,
+ 0x5EC3, 0x8EFC,
+ 0x5EC4, 0x8EFD,
+ 0x5EC5, 0x8EFE,
+ 0x5EC6, 0x8F40,
+ 0x5EC7, 0x8F41,
+ 0x5EC8, 0x8F42,
+ 0x5ECB, 0x8F43,
+ 0x5ECC, 0x8F44,
+ 0x5ECD, 0x8F45,
+ 0x5ECE, 0x8F46,
+ 0x5ECF, 0x8F47,
+ 0x5ED0, 0x8F48,
+ 0x5ED4, 0x8F49,
+ 0x5ED5, 0x8F4A,
+ 0x5ED7, 0x8F4B,
+ 0x5ED8, 0x8F4C,
+ 0x5ED9, 0x8F4D,
+ 0x5EDA, 0x8F4E,
+ 0x5EDC, 0x8F4F,
+ 0x5EDD, 0x8F50,
+ 0x5EDE, 0x8F51,
+ 0x5EDF, 0x8F52,
+ 0x5EE0, 0x8F53,
+ 0x5EE1, 0x8F54,
+ 0x5EE2, 0x8F55,
+ 0x5EE3, 0x8F56,
+ 0x5EE4, 0x8F57,
+ 0x5EE5, 0x8F58,
+ 0x5EE6, 0x8F59,
+ 0x5EE7, 0x8F5A,
+ 0x5EE9, 0x8F5B,
+ 0x5EEB, 0x8F5C,
+ 0x5EEC, 0x8F5D,
+ 0x5EED, 0x8F5E,
+ 0x5EEE, 0x8F5F,
+ 0x5EEF, 0x8F60,
+ 0x5EF0, 0x8F61,
+ 0x5EF1, 0x8F62,
+ 0x5EF2, 0x8F63,
+ 0x5EF3, 0x8F64,
+ 0x5EF5, 0x8F65,
+ 0x5EF8, 0x8F66,
+ 0x5EF9, 0x8F67,
+ 0x5EFB, 0x8F68,
+ 0x5EFC, 0x8F69,
+ 0x5EFD, 0x8F6A,
+ 0x5F05, 0x8F6B,
+ 0x5F06, 0x8F6C,
+ 0x5F07, 0x8F6D,
+ 0x5F09, 0x8F6E,
+ 0x5F0C, 0x8F6F,
+ 0x5F0D, 0x8F70,
+ 0x5F0E, 0x8F71,
+ 0x5F10, 0x8F72,
+ 0x5F12, 0x8F73,
+ 0x5F14, 0x8F74,
+ 0x5F16, 0x8F75,
+ 0x5F19, 0x8F76,
+ 0x5F1A, 0x8F77,
+ 0x5F1C, 0x8F78,
+ 0x5F1D, 0x8F79,
+ 0x5F1E, 0x8F7A,
+ 0x5F21, 0x8F7B,
+ 0x5F22, 0x8F7C,
+ 0x5F23, 0x8F7D,
+ 0x5F24, 0x8F7E,
+ 0x5F28, 0x8F80,
+ 0x5F2B, 0x8F81,
+ 0x5F2C, 0x8F82,
+ 0x5F2E, 0x8F83,
+ 0x5F30, 0x8F84,
+ 0x5F32, 0x8F85,
+ 0x5F33, 0x8F86,
+ 0x5F34, 0x8F87,
+ 0x5F35, 0x8F88,
+ 0x5F36, 0x8F89,
+ 0x5F37, 0x8F8A,
+ 0x5F38, 0x8F8B,
+ 0x5F3B, 0x8F8C,
+ 0x5F3D, 0x8F8D,
+ 0x5F3E, 0x8F8E,
+ 0x5F3F, 0x8F8F,
+ 0x5F41, 0x8F90,
+ 0x5F42, 0x8F91,
+ 0x5F43, 0x8F92,
+ 0x5F44, 0x8F93,
+ 0x5F45, 0x8F94,
+ 0x5F46, 0x8F95,
+ 0x5F47, 0x8F96,
+ 0x5F48, 0x8F97,
+ 0x5F49, 0x8F98,
+ 0x5F4A, 0x8F99,
+ 0x5F4B, 0x8F9A,
+ 0x5F4C, 0x8F9B,
+ 0x5F4D, 0x8F9C,
+ 0x5F4E, 0x8F9D,
+ 0x5F4F, 0x8F9E,
+ 0x5F51, 0x8F9F,
+ 0x5F54, 0x8FA0,
+ 0x5F59, 0x8FA1,
+ 0x5F5A, 0x8FA2,
+ 0x5F5B, 0x8FA3,
+ 0x5F5C, 0x8FA4,
+ 0x5F5E, 0x8FA5,
+ 0x5F5F, 0x8FA6,
+ 0x5F60, 0x8FA7,
+ 0x5F63, 0x8FA8,
+ 0x5F65, 0x8FA9,
+ 0x5F67, 0x8FAA,
+ 0x5F68, 0x8FAB,
+ 0x5F6B, 0x8FAC,
+ 0x5F6E, 0x8FAD,
+ 0x5F6F, 0x8FAE,
+ 0x5F72, 0x8FAF,
+ 0x5F74, 0x8FB0,
+ 0x5F75, 0x8FB1,
+ 0x5F76, 0x8FB2,
+ 0x5F78, 0x8FB3,
+ 0x5F7A, 0x8FB4,
+ 0x5F7D, 0x8FB5,
+ 0x5F7E, 0x8FB6,
+ 0x5F7F, 0x8FB7,
+ 0x5F83, 0x8FB8,
+ 0x5F86, 0x8FB9,
+ 0x5F8D, 0x8FBA,
+ 0x5F8E, 0x8FBB,
+ 0x5F8F, 0x8FBC,
+ 0x5F91, 0x8FBD,
+ 0x5F93, 0x8FBE,
+ 0x5F94, 0x8FBF,
+ 0x5F96, 0x8FC0,
+ 0x5F9A, 0x8FC1,
+ 0x5F9B, 0x8FC2,
+ 0x5F9D, 0x8FC3,
+ 0x5F9E, 0x8FC4,
+ 0x5F9F, 0x8FC5,
+ 0x5FA0, 0x8FC6,
+ 0x5FA2, 0x8FC7,
+ 0x5FA3, 0x8FC8,
+ 0x5FA4, 0x8FC9,
+ 0x5FA5, 0x8FCA,
+ 0x5FA6, 0x8FCB,
+ 0x5FA7, 0x8FCC,
+ 0x5FA9, 0x8FCD,
+ 0x5FAB, 0x8FCE,
+ 0x5FAC, 0x8FCF,
+ 0x5FAF, 0x8FD0,
+ 0x5FB0, 0x8FD1,
+ 0x5FB1, 0x8FD2,
+ 0x5FB2, 0x8FD3,
+ 0x5FB3, 0x8FD4,
+ 0x5FB4, 0x8FD5,
+ 0x5FB6, 0x8FD6,
+ 0x5FB8, 0x8FD7,
+ 0x5FB9, 0x8FD8,
+ 0x5FBA, 0x8FD9,
+ 0x5FBB, 0x8FDA,
+ 0x5FBE, 0x8FDB,
+ 0x5FBF, 0x8FDC,
+ 0x5FC0, 0x8FDD,
+ 0x5FC1, 0x8FDE,
+ 0x5FC2, 0x8FDF,
+ 0x5FC7, 0x8FE0,
+ 0x5FC8, 0x8FE1,
+ 0x5FCA, 0x8FE2,
+ 0x5FCB, 0x8FE3,
+ 0x5FCE, 0x8FE4,
+ 0x5FD3, 0x8FE5,
+ 0x5FD4, 0x8FE6,
+ 0x5FD5, 0x8FE7,
+ 0x5FDA, 0x8FE8,
+ 0x5FDB, 0x8FE9,
+ 0x5FDC, 0x8FEA,
+ 0x5FDE, 0x8FEB,
+ 0x5FDF, 0x8FEC,
+ 0x5FE2, 0x8FED,
+ 0x5FE3, 0x8FEE,
+ 0x5FE5, 0x8FEF,
+ 0x5FE6, 0x8FF0,
+ 0x5FE8, 0x8FF1,
+ 0x5FE9, 0x8FF2,
+ 0x5FEC, 0x8FF3,
+ 0x5FEF, 0x8FF4,
+ 0x5FF0, 0x8FF5,
+ 0x5FF2, 0x8FF6,
+ 0x5FF3, 0x8FF7,
+ 0x5FF4, 0x8FF8,
+ 0x5FF6, 0x8FF9,
+ 0x5FF7, 0x8FFA,
+ 0x5FF9, 0x8FFB,
+ 0x5FFA, 0x8FFC,
+ 0x5FFC, 0x8FFD,
+ 0x6007, 0x8FFE,
+ 0x6008, 0x9040,
+ 0x6009, 0x9041,
+ 0x600B, 0x9042,
+ 0x600C, 0x9043,
+ 0x6010, 0x9044,
+ 0x6011, 0x9045,
+ 0x6013, 0x9046,
+ 0x6017, 0x9047,
+ 0x6018, 0x9048,
+ 0x601A, 0x9049,
+ 0x601E, 0x904A,
+ 0x601F, 0x904B,
+ 0x6022, 0x904C,
+ 0x6023, 0x904D,
+ 0x6024, 0x904E,
+ 0x602C, 0x904F,
+ 0x602D, 0x9050,
+ 0x602E, 0x9051,
+ 0x6030, 0x9052,
+ 0x6031, 0x9053,
+ 0x6032, 0x9054,
+ 0x6033, 0x9055,
+ 0x6034, 0x9056,
+ 0x6036, 0x9057,
+ 0x6037, 0x9058,
+ 0x6038, 0x9059,
+ 0x6039, 0x905A,
+ 0x603A, 0x905B,
+ 0x603D, 0x905C,
+ 0x603E, 0x905D,
+ 0x6040, 0x905E,
+ 0x6044, 0x905F,
+ 0x6045, 0x9060,
+ 0x6046, 0x9061,
+ 0x6047, 0x9062,
+ 0x6048, 0x9063,
+ 0x6049, 0x9064,
+ 0x604A, 0x9065,
+ 0x604C, 0x9066,
+ 0x604E, 0x9067,
+ 0x604F, 0x9068,
+ 0x6051, 0x9069,
+ 0x6053, 0x906A,
+ 0x6054, 0x906B,
+ 0x6056, 0x906C,
+ 0x6057, 0x906D,
+ 0x6058, 0x906E,
+ 0x605B, 0x906F,
+ 0x605C, 0x9070,
+ 0x605E, 0x9071,
+ 0x605F, 0x9072,
+ 0x6060, 0x9073,
+ 0x6061, 0x9074,
+ 0x6065, 0x9075,
+ 0x6066, 0x9076,
+ 0x606E, 0x9077,
+ 0x6071, 0x9078,
+ 0x6072, 0x9079,
+ 0x6074, 0x907A,
+ 0x6075, 0x907B,
+ 0x6077, 0x907C,
+ 0x607E, 0x907D,
+ 0x6080, 0x907E,
+ 0x6081, 0x9080,
+ 0x6082, 0x9081,
+ 0x6085, 0x9082,
+ 0x6086, 0x9083,
+ 0x6087, 0x9084,
+ 0x6088, 0x9085,
+ 0x608A, 0x9086,
+ 0x608B, 0x9087,
+ 0x608E, 0x9088,
+ 0x608F, 0x9089,
+ 0x6090, 0x908A,
+ 0x6091, 0x908B,
+ 0x6093, 0x908C,
+ 0x6095, 0x908D,
+ 0x6097, 0x908E,
+ 0x6098, 0x908F,
+ 0x6099, 0x9090,
+ 0x609C, 0x9091,
+ 0x609E, 0x9092,
+ 0x60A1, 0x9093,
+ 0x60A2, 0x9094,
+ 0x60A4, 0x9095,
+ 0x60A5, 0x9096,
+ 0x60A7, 0x9097,
+ 0x60A9, 0x9098,
+ 0x60AA, 0x9099,
+ 0x60AE, 0x909A,
+ 0x60B0, 0x909B,
+ 0x60B3, 0x909C,
+ 0x60B5, 0x909D,
+ 0x60B6, 0x909E,
+ 0x60B7, 0x909F,
+ 0x60B9, 0x90A0,
+ 0x60BA, 0x90A1,
+ 0x60BD, 0x90A2,
+ 0x60BE, 0x90A3,
+ 0x60BF, 0x90A4,
+ 0x60C0, 0x90A5,
+ 0x60C1, 0x90A6,
+ 0x60C2, 0x90A7,
+ 0x60C3, 0x90A8,
+ 0x60C4, 0x90A9,
+ 0x60C7, 0x90AA,
+ 0x60C8, 0x90AB,
+ 0x60C9, 0x90AC,
+ 0x60CC, 0x90AD,
+ 0x60CD, 0x90AE,
+ 0x60CE, 0x90AF,
+ 0x60CF, 0x90B0,
+ 0x60D0, 0x90B1,
+ 0x60D2, 0x90B2,
+ 0x60D3, 0x90B3,
+ 0x60D4, 0x90B4,
+ 0x60D6, 0x90B5,
+ 0x60D7, 0x90B6,
+ 0x60D9, 0x90B7,
+ 0x60DB, 0x90B8,
+ 0x60DE, 0x90B9,
+ 0x60E1, 0x90BA,
+ 0x60E2, 0x90BB,
+ 0x60E3, 0x90BC,
+ 0x60E4, 0x90BD,
+ 0x60E5, 0x90BE,
+ 0x60EA, 0x90BF,
+ 0x60F1, 0x90C0,
+ 0x60F2, 0x90C1,
+ 0x60F5, 0x90C2,
+ 0x60F7, 0x90C3,
+ 0x60F8, 0x90C4,
+ 0x60FB, 0x90C5,
+ 0x60FC, 0x90C6,
+ 0x60FD, 0x90C7,
+ 0x60FE, 0x90C8,
+ 0x60FF, 0x90C9,
+ 0x6102, 0x90CA,
+ 0x6103, 0x90CB,
+ 0x6104, 0x90CC,
+ 0x6105, 0x90CD,
+ 0x6107, 0x90CE,
+ 0x610A, 0x90CF,
+ 0x610B, 0x90D0,
+ 0x610C, 0x90D1,
+ 0x6110, 0x90D2,
+ 0x6111, 0x90D3,
+ 0x6112, 0x90D4,
+ 0x6113, 0x90D5,
+ 0x6114, 0x90D6,
+ 0x6116, 0x90D7,
+ 0x6117, 0x90D8,
+ 0x6118, 0x90D9,
+ 0x6119, 0x90DA,
+ 0x611B, 0x90DB,
+ 0x611C, 0x90DC,
+ 0x611D, 0x90DD,
+ 0x611E, 0x90DE,
+ 0x6121, 0x90DF,
+ 0x6122, 0x90E0,
+ 0x6125, 0x90E1,
+ 0x6128, 0x90E2,
+ 0x6129, 0x90E3,
+ 0x612A, 0x90E4,
+ 0x612C, 0x90E5,
+ 0x612D, 0x90E6,
+ 0x612E, 0x90E7,
+ 0x612F, 0x90E8,
+ 0x6130, 0x90E9,
+ 0x6131, 0x90EA,
+ 0x6132, 0x90EB,
+ 0x6133, 0x90EC,
+ 0x6134, 0x90ED,
+ 0x6135, 0x90EE,
+ 0x6136, 0x90EF,
+ 0x6137, 0x90F0,
+ 0x6138, 0x90F1,
+ 0x6139, 0x90F2,
+ 0x613A, 0x90F3,
+ 0x613B, 0x90F4,
+ 0x613C, 0x90F5,
+ 0x613D, 0x90F6,
+ 0x613E, 0x90F7,
+ 0x6140, 0x90F8,
+ 0x6141, 0x90F9,
+ 0x6142, 0x90FA,
+ 0x6143, 0x90FB,
+ 0x6144, 0x90FC,
+ 0x6145, 0x90FD,
+ 0x6146, 0x90FE,
+ 0x6147, 0x9140,
+ 0x6149, 0x9141,
+ 0x614B, 0x9142,
+ 0x614D, 0x9143,
+ 0x614F, 0x9144,
+ 0x6150, 0x9145,
+ 0x6152, 0x9146,
+ 0x6153, 0x9147,
+ 0x6154, 0x9148,
+ 0x6156, 0x9149,
+ 0x6157, 0x914A,
+ 0x6158, 0x914B,
+ 0x6159, 0x914C,
+ 0x615A, 0x914D,
+ 0x615B, 0x914E,
+ 0x615C, 0x914F,
+ 0x615E, 0x9150,
+ 0x615F, 0x9151,
+ 0x6160, 0x9152,
+ 0x6161, 0x9153,
+ 0x6163, 0x9154,
+ 0x6164, 0x9155,
+ 0x6165, 0x9156,
+ 0x6166, 0x9157,
+ 0x6169, 0x9158,
+ 0x616A, 0x9159,
+ 0x616B, 0x915A,
+ 0x616C, 0x915B,
+ 0x616D, 0x915C,
+ 0x616E, 0x915D,
+ 0x616F, 0x915E,
+ 0x6171, 0x915F,
+ 0x6172, 0x9160,
+ 0x6173, 0x9161,
+ 0x6174, 0x9162,
+ 0x6176, 0x9163,
+ 0x6178, 0x9164,
+ 0x6179, 0x9165,
+ 0x617A, 0x9166,
+ 0x617B, 0x9167,
+ 0x617C, 0x9168,
+ 0x617D, 0x9169,
+ 0x617E, 0x916A,
+ 0x617F, 0x916B,
+ 0x6180, 0x916C,
+ 0x6181, 0x916D,
+ 0x6182, 0x916E,
+ 0x6183, 0x916F,
+ 0x6184, 0x9170,
+ 0x6185, 0x9171,
+ 0x6186, 0x9172,
+ 0x6187, 0x9173,
+ 0x6188, 0x9174,
+ 0x6189, 0x9175,
+ 0x618A, 0x9176,
+ 0x618C, 0x9177,
+ 0x618D, 0x9178,
+ 0x618F, 0x9179,
+ 0x6190, 0x917A,
+ 0x6191, 0x917B,
+ 0x6192, 0x917C,
+ 0x6193, 0x917D,
+ 0x6195, 0x917E,
+ 0x6196, 0x9180,
+ 0x6197, 0x9181,
+ 0x6198, 0x9182,
+ 0x6199, 0x9183,
+ 0x619A, 0x9184,
+ 0x619B, 0x9185,
+ 0x619C, 0x9186,
+ 0x619E, 0x9187,
+ 0x619F, 0x9188,
+ 0x61A0, 0x9189,
+ 0x61A1, 0x918A,
+ 0x61A2, 0x918B,
+ 0x61A3, 0x918C,
+ 0x61A4, 0x918D,
+ 0x61A5, 0x918E,
+ 0x61A6, 0x918F,
+ 0x61AA, 0x9190,
+ 0x61AB, 0x9191,
+ 0x61AD, 0x9192,
+ 0x61AE, 0x9193,
+ 0x61AF, 0x9194,
+ 0x61B0, 0x9195,
+ 0x61B1, 0x9196,
+ 0x61B2, 0x9197,
+ 0x61B3, 0x9198,
+ 0x61B4, 0x9199,
+ 0x61B5, 0x919A,
+ 0x61B6, 0x919B,
+ 0x61B8, 0x919C,
+ 0x61B9, 0x919D,
+ 0x61BA, 0x919E,
+ 0x61BB, 0x919F,
+ 0x61BC, 0x91A0,
+ 0x61BD, 0x91A1,
+ 0x61BF, 0x91A2,
+ 0x61C0, 0x91A3,
+ 0x61C1, 0x91A4,
+ 0x61C3, 0x91A5,
+ 0x61C4, 0x91A6,
+ 0x61C5, 0x91A7,
+ 0x61C6, 0x91A8,
+ 0x61C7, 0x91A9,
+ 0x61C9, 0x91AA,
+ 0x61CC, 0x91AB,
+ 0x61CD, 0x91AC,
+ 0x61CE, 0x91AD,
+ 0x61CF, 0x91AE,
+ 0x61D0, 0x91AF,
+ 0x61D3, 0x91B0,
+ 0x61D5, 0x91B1,
+ 0x61D6, 0x91B2,
+ 0x61D7, 0x91B3,
+ 0x61D8, 0x91B4,
+ 0x61D9, 0x91B5,
+ 0x61DA, 0x91B6,
+ 0x61DB, 0x91B7,
+ 0x61DC, 0x91B8,
+ 0x61DD, 0x91B9,
+ 0x61DE, 0x91BA,
+ 0x61DF, 0x91BB,
+ 0x61E0, 0x91BC,
+ 0x61E1, 0x91BD,
+ 0x61E2, 0x91BE,
+ 0x61E3, 0x91BF,
+ 0x61E4, 0x91C0,
+ 0x61E5, 0x91C1,
+ 0x61E7, 0x91C2,
+ 0x61E8, 0x91C3,
+ 0x61E9, 0x91C4,
+ 0x61EA, 0x91C5,
+ 0x61EB, 0x91C6,
+ 0x61EC, 0x91C7,
+ 0x61ED, 0x91C8,
+ 0x61EE, 0x91C9,
+ 0x61EF, 0x91CA,
+ 0x61F0, 0x91CB,
+ 0x61F1, 0x91CC,
+ 0x61F2, 0x91CD,
+ 0x61F3, 0x91CE,
+ 0x61F4, 0x91CF,
+ 0x61F6, 0x91D0,
+ 0x61F7, 0x91D1,
+ 0x61F8, 0x91D2,
+ 0x61F9, 0x91D3,
+ 0x61FA, 0x91D4,
+ 0x61FB, 0x91D5,
+ 0x61FC, 0x91D6,
+ 0x61FD, 0x91D7,
+ 0x61FE, 0x91D8,
+ 0x6200, 0x91D9,
+ 0x6201, 0x91DA,
+ 0x6202, 0x91DB,
+ 0x6203, 0x91DC,
+ 0x6204, 0x91DD,
+ 0x6205, 0x91DE,
+ 0x6207, 0x91DF,
+ 0x6209, 0x91E0,
+ 0x6213, 0x91E1,
+ 0x6214, 0x91E2,
+ 0x6219, 0x91E3,
+ 0x621C, 0x91E4,
+ 0x621D, 0x91E5,
+ 0x621E, 0x91E6,
+ 0x6220, 0x91E7,
+ 0x6223, 0x91E8,
+ 0x6226, 0x91E9,
+ 0x6227, 0x91EA,
+ 0x6228, 0x91EB,
+ 0x6229, 0x91EC,
+ 0x622B, 0x91ED,
+ 0x622D, 0x91EE,
+ 0x622F, 0x91EF,
+ 0x6230, 0x91F0,
+ 0x6231, 0x91F1,
+ 0x6232, 0x91F2,
+ 0x6235, 0x91F3,
+ 0x6236, 0x91F4,
+ 0x6238, 0x91F5,
+ 0x6239, 0x91F6,
+ 0x623A, 0x91F7,
+ 0x623B, 0x91F8,
+ 0x623C, 0x91F9,
+ 0x6242, 0x91FA,
+ 0x6244, 0x91FB,
+ 0x6245, 0x91FC,
+ 0x6246, 0x91FD,
+ 0x624A, 0x91FE,
+ 0x624F, 0x9240,
+ 0x6250, 0x9241,
+ 0x6255, 0x9242,
+ 0x6256, 0x9243,
+ 0x6257, 0x9244,
+ 0x6259, 0x9245,
+ 0x625A, 0x9246,
+ 0x625C, 0x9247,
+ 0x625D, 0x9248,
+ 0x625E, 0x9249,
+ 0x625F, 0x924A,
+ 0x6260, 0x924B,
+ 0x6261, 0x924C,
+ 0x6262, 0x924D,
+ 0x6264, 0x924E,
+ 0x6265, 0x924F,
+ 0x6268, 0x9250,
+ 0x6271, 0x9251,
+ 0x6272, 0x9252,
+ 0x6274, 0x9253,
+ 0x6275, 0x9254,
+ 0x6277, 0x9255,
+ 0x6278, 0x9256,
+ 0x627A, 0x9257,
+ 0x627B, 0x9258,
+ 0x627D, 0x9259,
+ 0x6281, 0x925A,
+ 0x6282, 0x925B,
+ 0x6283, 0x925C,
+ 0x6285, 0x925D,
+ 0x6286, 0x925E,
+ 0x6287, 0x925F,
+ 0x6288, 0x9260,
+ 0x628B, 0x9261,
+ 0x628C, 0x9262,
+ 0x628D, 0x9263,
+ 0x628E, 0x9264,
+ 0x628F, 0x9265,
+ 0x6290, 0x9266,
+ 0x6294, 0x9267,
+ 0x6299, 0x9268,
+ 0x629C, 0x9269,
+ 0x629D, 0x926A,
+ 0x629E, 0x926B,
+ 0x62A3, 0x926C,
+ 0x62A6, 0x926D,
+ 0x62A7, 0x926E,
+ 0x62A9, 0x926F,
+ 0x62AA, 0x9270,
+ 0x62AD, 0x9271,
+ 0x62AE, 0x9272,
+ 0x62AF, 0x9273,
+ 0x62B0, 0x9274,
+ 0x62B2, 0x9275,
+ 0x62B3, 0x9276,
+ 0x62B4, 0x9277,
+ 0x62B6, 0x9278,
+ 0x62B7, 0x9279,
+ 0x62B8, 0x927A,
+ 0x62BA, 0x927B,
+ 0x62BE, 0x927C,
+ 0x62C0, 0x927D,
+ 0x62C1, 0x927E,
+ 0x62C3, 0x9280,
+ 0x62CB, 0x9281,
+ 0x62CF, 0x9282,
+ 0x62D1, 0x9283,
+ 0x62D5, 0x9284,
+ 0x62DD, 0x9285,
+ 0x62DE, 0x9286,
+ 0x62E0, 0x9287,
+ 0x62E1, 0x9288,
+ 0x62E4, 0x9289,
+ 0x62EA, 0x928A,
+ 0x62EB, 0x928B,
+ 0x62F0, 0x928C,
+ 0x62F2, 0x928D,
+ 0x62F5, 0x928E,
+ 0x62F8, 0x928F,
+ 0x62F9, 0x9290,
+ 0x62FA, 0x9291,
+ 0x62FB, 0x9292,
+ 0x6300, 0x9293,
+ 0x6303, 0x9294,
+ 0x6304, 0x9295,
+ 0x6305, 0x9296,
+ 0x6306, 0x9297,
+ 0x630A, 0x9298,
+ 0x630B, 0x9299,
+ 0x630C, 0x929A,
+ 0x630D, 0x929B,
+ 0x630F, 0x929C,
+ 0x6310, 0x929D,
+ 0x6312, 0x929E,
+ 0x6313, 0x929F,
+ 0x6314, 0x92A0,
+ 0x6315, 0x92A1,
+ 0x6317, 0x92A2,
+ 0x6318, 0x92A3,
+ 0x6319, 0x92A4,
+ 0x631C, 0x92A5,
+ 0x6326, 0x92A6,
+ 0x6327, 0x92A7,
+ 0x6329, 0x92A8,
+ 0x632C, 0x92A9,
+ 0x632D, 0x92AA,
+ 0x632E, 0x92AB,
+ 0x6330, 0x92AC,
+ 0x6331, 0x92AD,
+ 0x6333, 0x92AE,
+ 0x6334, 0x92AF,
+ 0x6335, 0x92B0,
+ 0x6336, 0x92B1,
+ 0x6337, 0x92B2,
+ 0x6338, 0x92B3,
+ 0x633B, 0x92B4,
+ 0x633C, 0x92B5,
+ 0x633E, 0x92B6,
+ 0x633F, 0x92B7,
+ 0x6340, 0x92B8,
+ 0x6341, 0x92B9,
+ 0x6344, 0x92BA,
+ 0x6347, 0x92BB,
+ 0x6348, 0x92BC,
+ 0x634A, 0x92BD,
+ 0x6351, 0x92BE,
+ 0x6352, 0x92BF,
+ 0x6353, 0x92C0,
+ 0x6354, 0x92C1,
+ 0x6356, 0x92C2,
+ 0x6357, 0x92C3,
+ 0x6358, 0x92C4,
+ 0x6359, 0x92C5,
+ 0x635A, 0x92C6,
+ 0x635B, 0x92C7,
+ 0x635C, 0x92C8,
+ 0x635D, 0x92C9,
+ 0x6360, 0x92CA,
+ 0x6364, 0x92CB,
+ 0x6365, 0x92CC,
+ 0x6366, 0x92CD,
+ 0x6368, 0x92CE,
+ 0x636A, 0x92CF,
+ 0x636B, 0x92D0,
+ 0x636C, 0x92D1,
+ 0x636F, 0x92D2,
+ 0x6370, 0x92D3,
+ 0x6372, 0x92D4,
+ 0x6373, 0x92D5,
+ 0x6374, 0x92D6,
+ 0x6375, 0x92D7,
+ 0x6378, 0x92D8,
+ 0x6379, 0x92D9,
+ 0x637C, 0x92DA,
+ 0x637D, 0x92DB,
+ 0x637E, 0x92DC,
+ 0x637F, 0x92DD,
+ 0x6381, 0x92DE,
+ 0x6383, 0x92DF,
+ 0x6384, 0x92E0,
+ 0x6385, 0x92E1,
+ 0x6386, 0x92E2,
+ 0x638B, 0x92E3,
+ 0x638D, 0x92E4,
+ 0x6391, 0x92E5,
+ 0x6393, 0x92E6,
+ 0x6394, 0x92E7,
+ 0x6395, 0x92E8,
+ 0x6397, 0x92E9,
+ 0x6399, 0x92EA,
+ 0x639A, 0x92EB,
+ 0x639B, 0x92EC,
+ 0x639C, 0x92ED,
+ 0x639D, 0x92EE,
+ 0x639E, 0x92EF,
+ 0x639F, 0x92F0,
+ 0x63A1, 0x92F1,
+ 0x63A4, 0x92F2,
+ 0x63A6, 0x92F3,
+ 0x63AB, 0x92F4,
+ 0x63AF, 0x92F5,
+ 0x63B1, 0x92F6,
+ 0x63B2, 0x92F7,
+ 0x63B5, 0x92F8,
+ 0x63B6, 0x92F9,
+ 0x63B9, 0x92FA,
+ 0x63BB, 0x92FB,
+ 0x63BD, 0x92FC,
+ 0x63BF, 0x92FD,
+ 0x63C0, 0x92FE,
+ 0x63C1, 0x9340,
+ 0x63C2, 0x9341,
+ 0x63C3, 0x9342,
+ 0x63C5, 0x9343,
+ 0x63C7, 0x9344,
+ 0x63C8, 0x9345,
+ 0x63CA, 0x9346,
+ 0x63CB, 0x9347,
+ 0x63CC, 0x9348,
+ 0x63D1, 0x9349,
+ 0x63D3, 0x934A,
+ 0x63D4, 0x934B,
+ 0x63D5, 0x934C,
+ 0x63D7, 0x934D,
+ 0x63D8, 0x934E,
+ 0x63D9, 0x934F,
+ 0x63DA, 0x9350,
+ 0x63DB, 0x9351,
+ 0x63DC, 0x9352,
+ 0x63DD, 0x9353,
+ 0x63DF, 0x9354,
+ 0x63E2, 0x9355,
+ 0x63E4, 0x9356,
+ 0x63E5, 0x9357,
+ 0x63E6, 0x9358,
+ 0x63E7, 0x9359,
+ 0x63E8, 0x935A,
+ 0x63EB, 0x935B,
+ 0x63EC, 0x935C,
+ 0x63EE, 0x935D,
+ 0x63EF, 0x935E,
+ 0x63F0, 0x935F,
+ 0x63F1, 0x9360,
+ 0x63F3, 0x9361,
+ 0x63F5, 0x9362,
+ 0x63F7, 0x9363,
+ 0x63F9, 0x9364,
+ 0x63FA, 0x9365,
+ 0x63FB, 0x9366,
+ 0x63FC, 0x9367,
+ 0x63FE, 0x9368,
+ 0x6403, 0x9369,
+ 0x6404, 0x936A,
+ 0x6406, 0x936B,
+ 0x6407, 0x936C,
+ 0x6408, 0x936D,
+ 0x6409, 0x936E,
+ 0x640A, 0x936F,
+ 0x640D, 0x9370,
+ 0x640E, 0x9371,
+ 0x6411, 0x9372,
+ 0x6412, 0x9373,
+ 0x6415, 0x9374,
+ 0x6416, 0x9375,
+ 0x6417, 0x9376,
+ 0x6418, 0x9377,
+ 0x6419, 0x9378,
+ 0x641A, 0x9379,
+ 0x641D, 0x937A,
+ 0x641F, 0x937B,
+ 0x6422, 0x937C,
+ 0x6423, 0x937D,
+ 0x6424, 0x937E,
+ 0x6425, 0x9380,
+ 0x6427, 0x9381,
+ 0x6428, 0x9382,
+ 0x6429, 0x9383,
+ 0x642B, 0x9384,
+ 0x642E, 0x9385,
+ 0x642F, 0x9386,
+ 0x6430, 0x9387,
+ 0x6431, 0x9388,
+ 0x6432, 0x9389,
+ 0x6433, 0x938A,
+ 0x6435, 0x938B,
+ 0x6436, 0x938C,
+ 0x6437, 0x938D,
+ 0x6438, 0x938E,
+ 0x6439, 0x938F,
+ 0x643B, 0x9390,
+ 0x643C, 0x9391,
+ 0x643E, 0x9392,
+ 0x6440, 0x9393,
+ 0x6442, 0x9394,
+ 0x6443, 0x9395,
+ 0x6449, 0x9396,
+ 0x644B, 0x9397,
+ 0x644C, 0x9398,
+ 0x644D, 0x9399,
+ 0x644E, 0x939A,
+ 0x644F, 0x939B,
+ 0x6450, 0x939C,
+ 0x6451, 0x939D,
+ 0x6453, 0x939E,
+ 0x6455, 0x939F,
+ 0x6456, 0x93A0,
+ 0x6457, 0x93A1,
+ 0x6459, 0x93A2,
+ 0x645A, 0x93A3,
+ 0x645B, 0x93A4,
+ 0x645C, 0x93A5,
+ 0x645D, 0x93A6,
+ 0x645F, 0x93A7,
+ 0x6460, 0x93A8,
+ 0x6461, 0x93A9,
+ 0x6462, 0x93AA,
+ 0x6463, 0x93AB,
+ 0x6464, 0x93AC,
+ 0x6465, 0x93AD,
+ 0x6466, 0x93AE,
+ 0x6468, 0x93AF,
+ 0x646A, 0x93B0,
+ 0x646B, 0x93B1,
+ 0x646C, 0x93B2,
+ 0x646E, 0x93B3,
+ 0x646F, 0x93B4,
+ 0x6470, 0x93B5,
+ 0x6471, 0x93B6,
+ 0x6472, 0x93B7,
+ 0x6473, 0x93B8,
+ 0x6474, 0x93B9,
+ 0x6475, 0x93BA,
+ 0x6476, 0x93BB,
+ 0x6477, 0x93BC,
+ 0x647B, 0x93BD,
+ 0x647C, 0x93BE,
+ 0x647D, 0x93BF,
+ 0x647E, 0x93C0,
+ 0x647F, 0x93C1,
+ 0x6480, 0x93C2,
+ 0x6481, 0x93C3,
+ 0x6483, 0x93C4,
+ 0x6486, 0x93C5,
+ 0x6488, 0x93C6,
+ 0x6489, 0x93C7,
+ 0x648A, 0x93C8,
+ 0x648B, 0x93C9,
+ 0x648C, 0x93CA,
+ 0x648D, 0x93CB,
+ 0x648E, 0x93CC,
+ 0x648F, 0x93CD,
+ 0x6490, 0x93CE,
+ 0x6493, 0x93CF,
+ 0x6494, 0x93D0,
+ 0x6497, 0x93D1,
+ 0x6498, 0x93D2,
+ 0x649A, 0x93D3,
+ 0x649B, 0x93D4,
+ 0x649C, 0x93D5,
+ 0x649D, 0x93D6,
+ 0x649F, 0x93D7,
+ 0x64A0, 0x93D8,
+ 0x64A1, 0x93D9,
+ 0x64A2, 0x93DA,
+ 0x64A3, 0x93DB,
+ 0x64A5, 0x93DC,
+ 0x64A6, 0x93DD,
+ 0x64A7, 0x93DE,
+ 0x64A8, 0x93DF,
+ 0x64AA, 0x93E0,
+ 0x64AB, 0x93E1,
+ 0x64AF, 0x93E2,
+ 0x64B1, 0x93E3,
+ 0x64B2, 0x93E4,
+ 0x64B3, 0x93E5,
+ 0x64B4, 0x93E6,
+ 0x64B6, 0x93E7,
+ 0x64B9, 0x93E8,
+ 0x64BB, 0x93E9,
+ 0x64BD, 0x93EA,
+ 0x64BE, 0x93EB,
+ 0x64BF, 0x93EC,
+ 0x64C1, 0x93ED,
+ 0x64C3, 0x93EE,
+ 0x64C4, 0x93EF,
+ 0x64C6, 0x93F0,
+ 0x64C7, 0x93F1,
+ 0x64C8, 0x93F2,
+ 0x64C9, 0x93F3,
+ 0x64CA, 0x93F4,
+ 0x64CB, 0x93F5,
+ 0x64CC, 0x93F6,
+ 0x64CF, 0x93F7,
+ 0x64D1, 0x93F8,
+ 0x64D3, 0x93F9,
+ 0x64D4, 0x93FA,
+ 0x64D5, 0x93FB,
+ 0x64D6, 0x93FC,
+ 0x64D9, 0x93FD,
+ 0x64DA, 0x93FE,
+ 0x64DB, 0x9440,
+ 0x64DC, 0x9441,
+ 0x64DD, 0x9442,
+ 0x64DF, 0x9443,
+ 0x64E0, 0x9444,
+ 0x64E1, 0x9445,
+ 0x64E3, 0x9446,
+ 0x64E5, 0x9447,
+ 0x64E7, 0x9448,
+ 0x64E8, 0x9449,
+ 0x64E9, 0x944A,
+ 0x64EA, 0x944B,
+ 0x64EB, 0x944C,
+ 0x64EC, 0x944D,
+ 0x64ED, 0x944E,
+ 0x64EE, 0x944F,
+ 0x64EF, 0x9450,
+ 0x64F0, 0x9451,
+ 0x64F1, 0x9452,
+ 0x64F2, 0x9453,
+ 0x64F3, 0x9454,
+ 0x64F4, 0x9455,
+ 0x64F5, 0x9456,
+ 0x64F6, 0x9457,
+ 0x64F7, 0x9458,
+ 0x64F8, 0x9459,
+ 0x64F9, 0x945A,
+ 0x64FA, 0x945B,
+ 0x64FB, 0x945C,
+ 0x64FC, 0x945D,
+ 0x64FD, 0x945E,
+ 0x64FE, 0x945F,
+ 0x64FF, 0x9460,
+ 0x6501, 0x9461,
+ 0x6502, 0x9462,
+ 0x6503, 0x9463,
+ 0x6504, 0x9464,
+ 0x6505, 0x9465,
+ 0x6506, 0x9466,
+ 0x6507, 0x9467,
+ 0x6508, 0x9468,
+ 0x650A, 0x9469,
+ 0x650B, 0x946A,
+ 0x650C, 0x946B,
+ 0x650D, 0x946C,
+ 0x650E, 0x946D,
+ 0x650F, 0x946E,
+ 0x6510, 0x946F,
+ 0x6511, 0x9470,
+ 0x6513, 0x9471,
+ 0x6514, 0x9472,
+ 0x6515, 0x9473,
+ 0x6516, 0x9474,
+ 0x6517, 0x9475,
+ 0x6519, 0x9476,
+ 0x651A, 0x9477,
+ 0x651B, 0x9478,
+ 0x651C, 0x9479,
+ 0x651D, 0x947A,
+ 0x651E, 0x947B,
+ 0x651F, 0x947C,
+ 0x6520, 0x947D,
+ 0x6521, 0x947E,
+ 0x6522, 0x9480,
+ 0x6523, 0x9481,
+ 0x6524, 0x9482,
+ 0x6526, 0x9483,
+ 0x6527, 0x9484,
+ 0x6528, 0x9485,
+ 0x6529, 0x9486,
+ 0x652A, 0x9487,
+ 0x652C, 0x9488,
+ 0x652D, 0x9489,
+ 0x6530, 0x948A,
+ 0x6531, 0x948B,
+ 0x6532, 0x948C,
+ 0x6533, 0x948D,
+ 0x6537, 0x948E,
+ 0x653A, 0x948F,
+ 0x653C, 0x9490,
+ 0x653D, 0x9491,
+ 0x6540, 0x9492,
+ 0x6541, 0x9493,
+ 0x6542, 0x9494,
+ 0x6543, 0x9495,
+ 0x6544, 0x9496,
+ 0x6546, 0x9497,
+ 0x6547, 0x9498,
+ 0x654A, 0x9499,
+ 0x654B, 0x949A,
+ 0x654D, 0x949B,
+ 0x654E, 0x949C,
+ 0x6550, 0x949D,
+ 0x6552, 0x949E,
+ 0x6553, 0x949F,
+ 0x6554, 0x94A0,
+ 0x6557, 0x94A1,
+ 0x6558, 0x94A2,
+ 0x655A, 0x94A3,
+ 0x655C, 0x94A4,
+ 0x655F, 0x94A5,
+ 0x6560, 0x94A6,
+ 0x6561, 0x94A7,
+ 0x6564, 0x94A8,
+ 0x6565, 0x94A9,
+ 0x6567, 0x94AA,
+ 0x6568, 0x94AB,
+ 0x6569, 0x94AC,
+ 0x656A, 0x94AD,
+ 0x656D, 0x94AE,
+ 0x656E, 0x94AF,
+ 0x656F, 0x94B0,
+ 0x6571, 0x94B1,
+ 0x6573, 0x94B2,
+ 0x6575, 0x94B3,
+ 0x6576, 0x94B4,
+ 0x6578, 0x94B5,
+ 0x6579, 0x94B6,
+ 0x657A, 0x94B7,
+ 0x657B, 0x94B8,
+ 0x657C, 0x94B9,
+ 0x657D, 0x94BA,
+ 0x657E, 0x94BB,
+ 0x657F, 0x94BC,
+ 0x6580, 0x94BD,
+ 0x6581, 0x94BE,
+ 0x6582, 0x94BF,
+ 0x6583, 0x94C0,
+ 0x6584, 0x94C1,
+ 0x6585, 0x94C2,
+ 0x6586, 0x94C3,
+ 0x6588, 0x94C4,
+ 0x6589, 0x94C5,
+ 0x658A, 0x94C6,
+ 0x658D, 0x94C7,
+ 0x658E, 0x94C8,
+ 0x658F, 0x94C9,
+ 0x6592, 0x94CA,
+ 0x6594, 0x94CB,
+ 0x6595, 0x94CC,
+ 0x6596, 0x94CD,
+ 0x6598, 0x94CE,
+ 0x659A, 0x94CF,
+ 0x659D, 0x94D0,
+ 0x659E, 0x94D1,
+ 0x65A0, 0x94D2,
+ 0x65A2, 0x94D3,
+ 0x65A3, 0x94D4,
+ 0x65A6, 0x94D5,
+ 0x65A8, 0x94D6,
+ 0x65AA, 0x94D7,
+ 0x65AC, 0x94D8,
+ 0x65AE, 0x94D9,
+ 0x65B1, 0x94DA,
+ 0x65B2, 0x94DB,
+ 0x65B3, 0x94DC,
+ 0x65B4, 0x94DD,
+ 0x65B5, 0x94DE,
+ 0x65B6, 0x94DF,
+ 0x65B7, 0x94E0,
+ 0x65B8, 0x94E1,
+ 0x65BA, 0x94E2,
+ 0x65BB, 0x94E3,
+ 0x65BE, 0x94E4,
+ 0x65BF, 0x94E5,
+ 0x65C0, 0x94E6,
+ 0x65C2, 0x94E7,
+ 0x65C7, 0x94E8,
+ 0x65C8, 0x94E9,
+ 0x65C9, 0x94EA,
+ 0x65CA, 0x94EB,
+ 0x65CD, 0x94EC,
+ 0x65D0, 0x94ED,
+ 0x65D1, 0x94EE,
+ 0x65D3, 0x94EF,
+ 0x65D4, 0x94F0,
+ 0x65D5, 0x94F1,
+ 0x65D8, 0x94F2,
+ 0x65D9, 0x94F3,
+ 0x65DA, 0x94F4,
+ 0x65DB, 0x94F5,
+ 0x65DC, 0x94F6,
+ 0x65DD, 0x94F7,
+ 0x65DE, 0x94F8,
+ 0x65DF, 0x94F9,
+ 0x65E1, 0x94FA,
+ 0x65E3, 0x94FB,
+ 0x65E4, 0x94FC,
+ 0x65EA, 0x94FD,
+ 0x65EB, 0x94FE,
+ 0x65F2, 0x9540,
+ 0x65F3, 0x9541,
+ 0x65F4, 0x9542,
+ 0x65F5, 0x9543,
+ 0x65F8, 0x9544,
+ 0x65F9, 0x9545,
+ 0x65FB, 0x9546,
+ 0x65FC, 0x9547,
+ 0x65FD, 0x9548,
+ 0x65FE, 0x9549,
+ 0x65FF, 0x954A,
+ 0x6601, 0x954B,
+ 0x6604, 0x954C,
+ 0x6605, 0x954D,
+ 0x6607, 0x954E,
+ 0x6608, 0x954F,
+ 0x6609, 0x9550,
+ 0x660B, 0x9551,
+ 0x660D, 0x9552,
+ 0x6610, 0x9553,
+ 0x6611, 0x9554,
+ 0x6612, 0x9555,
+ 0x6616, 0x9556,
+ 0x6617, 0x9557,
+ 0x6618, 0x9558,
+ 0x661A, 0x9559,
+ 0x661B, 0x955A,
+ 0x661C, 0x955B,
+ 0x661E, 0x955C,
+ 0x6621, 0x955D,
+ 0x6622, 0x955E,
+ 0x6623, 0x955F,
+ 0x6624, 0x9560,
+ 0x6626, 0x9561,
+ 0x6629, 0x9562,
+ 0x662A, 0x9563,
+ 0x662B, 0x9564,
+ 0x662C, 0x9565,
+ 0x662E, 0x9566,
+ 0x6630, 0x9567,
+ 0x6632, 0x9568,
+ 0x6633, 0x9569,
+ 0x6637, 0x956A,
+ 0x6638, 0x956B,
+ 0x6639, 0x956C,
+ 0x663A, 0x956D,
+ 0x663B, 0x956E,
+ 0x663D, 0x956F,
+ 0x663F, 0x9570,
+ 0x6640, 0x9571,
+ 0x6642, 0x9572,
+ 0x6644, 0x9573,
+ 0x6645, 0x9574,
+ 0x6646, 0x9575,
+ 0x6647, 0x9576,
+ 0x6648, 0x9577,
+ 0x6649, 0x9578,
+ 0x664A, 0x9579,
+ 0x664D, 0x957A,
+ 0x664E, 0x957B,
+ 0x6650, 0x957C,
+ 0x6651, 0x957D,
+ 0x6658, 0x957E,
+ 0x6659, 0x9580,
+ 0x665B, 0x9581,
+ 0x665C, 0x9582,
+ 0x665D, 0x9583,
+ 0x665E, 0x9584,
+ 0x6660, 0x9585,
+ 0x6662, 0x9586,
+ 0x6663, 0x9587,
+ 0x6665, 0x9588,
+ 0x6667, 0x9589,
+ 0x6669, 0x958A,
+ 0x666A, 0x958B,
+ 0x666B, 0x958C,
+ 0x666C, 0x958D,
+ 0x666D, 0x958E,
+ 0x6671, 0x958F,
+ 0x6672, 0x9590,
+ 0x6673, 0x9591,
+ 0x6675, 0x9592,
+ 0x6678, 0x9593,
+ 0x6679, 0x9594,
+ 0x667B, 0x9595,
+ 0x667C, 0x9596,
+ 0x667D, 0x9597,
+ 0x667F, 0x9598,
+ 0x6680, 0x9599,
+ 0x6681, 0x959A,
+ 0x6683, 0x959B,
+ 0x6685, 0x959C,
+ 0x6686, 0x959D,
+ 0x6688, 0x959E,
+ 0x6689, 0x959F,
+ 0x668A, 0x95A0,
+ 0x668B, 0x95A1,
+ 0x668D, 0x95A2,
+ 0x668E, 0x95A3,
+ 0x668F, 0x95A4,
+ 0x6690, 0x95A5,
+ 0x6692, 0x95A6,
+ 0x6693, 0x95A7,
+ 0x6694, 0x95A8,
+ 0x6695, 0x95A9,
+ 0x6698, 0x95AA,
+ 0x6699, 0x95AB,
+ 0x669A, 0x95AC,
+ 0x669B, 0x95AD,
+ 0x669C, 0x95AE,
+ 0x669E, 0x95AF,
+ 0x669F, 0x95B0,
+ 0x66A0, 0x95B1,
+ 0x66A1, 0x95B2,
+ 0x66A2, 0x95B3,
+ 0x66A3, 0x95B4,
+ 0x66A4, 0x95B5,
+ 0x66A5, 0x95B6,
+ 0x66A6, 0x95B7,
+ 0x66A9, 0x95B8,
+ 0x66AA, 0x95B9,
+ 0x66AB, 0x95BA,
+ 0x66AC, 0x95BB,
+ 0x66AD, 0x95BC,
+ 0x66AF, 0x95BD,
+ 0x66B0, 0x95BE,
+ 0x66B1, 0x95BF,
+ 0x66B2, 0x95C0,
+ 0x66B3, 0x95C1,
+ 0x66B5, 0x95C2,
+ 0x66B6, 0x95C3,
+ 0x66B7, 0x95C4,
+ 0x66B8, 0x95C5,
+ 0x66BA, 0x95C6,
+ 0x66BB, 0x95C7,
+ 0x66BC, 0x95C8,
+ 0x66BD, 0x95C9,
+ 0x66BF, 0x95CA,
+ 0x66C0, 0x95CB,
+ 0x66C1, 0x95CC,
+ 0x66C2, 0x95CD,
+ 0x66C3, 0x95CE,
+ 0x66C4, 0x95CF,
+ 0x66C5, 0x95D0,
+ 0x66C6, 0x95D1,
+ 0x66C7, 0x95D2,
+ 0x66C8, 0x95D3,
+ 0x66C9, 0x95D4,
+ 0x66CA, 0x95D5,
+ 0x66CB, 0x95D6,
+ 0x66CC, 0x95D7,
+ 0x66CD, 0x95D8,
+ 0x66CE, 0x95D9,
+ 0x66CF, 0x95DA,
+ 0x66D0, 0x95DB,
+ 0x66D1, 0x95DC,
+ 0x66D2, 0x95DD,
+ 0x66D3, 0x95DE,
+ 0x66D4, 0x95DF,
+ 0x66D5, 0x95E0,
+ 0x66D6, 0x95E1,
+ 0x66D7, 0x95E2,
+ 0x66D8, 0x95E3,
+ 0x66DA, 0x95E4,
+ 0x66DE, 0x95E5,
+ 0x66DF, 0x95E6,
+ 0x66E0, 0x95E7,
+ 0x66E1, 0x95E8,
+ 0x66E2, 0x95E9,
+ 0x66E3, 0x95EA,
+ 0x66E4, 0x95EB,
+ 0x66E5, 0x95EC,
+ 0x66E7, 0x95ED,
+ 0x66E8, 0x95EE,
+ 0x66EA, 0x95EF,
+ 0x66EB, 0x95F0,
+ 0x66EC, 0x95F1,
+ 0x66ED, 0x95F2,
+ 0x66EE, 0x95F3,
+ 0x66EF, 0x95F4,
+ 0x66F1, 0x95F5,
+ 0x66F5, 0x95F6,
+ 0x66F6, 0x95F7,
+ 0x66F8, 0x95F8,
+ 0x66FA, 0x95F9,
+ 0x66FB, 0x95FA,
+ 0x66FD, 0x95FB,
+ 0x6701, 0x95FC,
+ 0x6702, 0x95FD,
+ 0x6703, 0x95FE,
+ 0x6704, 0x9640,
+ 0x6705, 0x9641,
+ 0x6706, 0x9642,
+ 0x6707, 0x9643,
+ 0x670C, 0x9644,
+ 0x670E, 0x9645,
+ 0x670F, 0x9646,
+ 0x6711, 0x9647,
+ 0x6712, 0x9648,
+ 0x6713, 0x9649,
+ 0x6716, 0x964A,
+ 0x6718, 0x964B,
+ 0x6719, 0x964C,
+ 0x671A, 0x964D,
+ 0x671C, 0x964E,
+ 0x671E, 0x964F,
+ 0x6720, 0x9650,
+ 0x6721, 0x9651,
+ 0x6722, 0x9652,
+ 0x6723, 0x9653,
+ 0x6724, 0x9654,
+ 0x6725, 0x9655,
+ 0x6727, 0x9656,
+ 0x6729, 0x9657,
+ 0x672E, 0x9658,
+ 0x6730, 0x9659,
+ 0x6732, 0x965A,
+ 0x6733, 0x965B,
+ 0x6736, 0x965C,
+ 0x6737, 0x965D,
+ 0x6738, 0x965E,
+ 0x6739, 0x965F,
+ 0x673B, 0x9660,
+ 0x673C, 0x9661,
+ 0x673E, 0x9662,
+ 0x673F, 0x9663,
+ 0x6741, 0x9664,
+ 0x6744, 0x9665,
+ 0x6745, 0x9666,
+ 0x6747, 0x9667,
+ 0x674A, 0x9668,
+ 0x674B, 0x9669,
+ 0x674D, 0x966A,
+ 0x6752, 0x966B,
+ 0x6754, 0x966C,
+ 0x6755, 0x966D,
+ 0x6757, 0x966E,
+ 0x6758, 0x966F,
+ 0x6759, 0x9670,
+ 0x675A, 0x9671,
+ 0x675B, 0x9672,
+ 0x675D, 0x9673,
+ 0x6762, 0x9674,
+ 0x6763, 0x9675,
+ 0x6764, 0x9676,
+ 0x6766, 0x9677,
+ 0x6767, 0x9678,
+ 0x676B, 0x9679,
+ 0x676C, 0x967A,
+ 0x676E, 0x967B,
+ 0x6771, 0x967C,
+ 0x6774, 0x967D,
+ 0x6776, 0x967E,
+ 0x6778, 0x9680,
+ 0x6779, 0x9681,
+ 0x677A, 0x9682,
+ 0x677B, 0x9683,
+ 0x677D, 0x9684,
+ 0x6780, 0x9685,
+ 0x6782, 0x9686,
+ 0x6783, 0x9687,
+ 0x6785, 0x9688,
+ 0x6786, 0x9689,
+ 0x6788, 0x968A,
+ 0x678A, 0x968B,
+ 0x678C, 0x968C,
+ 0x678D, 0x968D,
+ 0x678E, 0x968E,
+ 0x678F, 0x968F,
+ 0x6791, 0x9690,
+ 0x6792, 0x9691,
+ 0x6793, 0x9692,
+ 0x6794, 0x9693,
+ 0x6796, 0x9694,
+ 0x6799, 0x9695,
+ 0x679B, 0x9696,
+ 0x679F, 0x9697,
+ 0x67A0, 0x9698,
+ 0x67A1, 0x9699,
+ 0x67A4, 0x969A,
+ 0x67A6, 0x969B,
+ 0x67A9, 0x969C,
+ 0x67AC, 0x969D,
+ 0x67AE, 0x969E,
+ 0x67B1, 0x969F,
+ 0x67B2, 0x96A0,
+ 0x67B4, 0x96A1,
+ 0x67B9, 0x96A2,
+ 0x67BA, 0x96A3,
+ 0x67BB, 0x96A4,
+ 0x67BC, 0x96A5,
+ 0x67BD, 0x96A6,
+ 0x67BE, 0x96A7,
+ 0x67BF, 0x96A8,
+ 0x67C0, 0x96A9,
+ 0x67C2, 0x96AA,
+ 0x67C5, 0x96AB,
+ 0x67C6, 0x96AC,
+ 0x67C7, 0x96AD,
+ 0x67C8, 0x96AE,
+ 0x67C9, 0x96AF,
+ 0x67CA, 0x96B0,
+ 0x67CB, 0x96B1,
+ 0x67CC, 0x96B2,
+ 0x67CD, 0x96B3,
+ 0x67CE, 0x96B4,
+ 0x67D5, 0x96B5,
+ 0x67D6, 0x96B6,
+ 0x67D7, 0x96B7,
+ 0x67DB, 0x96B8,
+ 0x67DF, 0x96B9,
+ 0x67E1, 0x96BA,
+ 0x67E3, 0x96BB,
+ 0x67E4, 0x96BC,
+ 0x67E6, 0x96BD,
+ 0x67E7, 0x96BE,
+ 0x67E8, 0x96BF,
+ 0x67EA, 0x96C0,
+ 0x67EB, 0x96C1,
+ 0x67ED, 0x96C2,
+ 0x67EE, 0x96C3,
+ 0x67F2, 0x96C4,
+ 0x67F5, 0x96C5,
+ 0x67F6, 0x96C6,
+ 0x67F7, 0x96C7,
+ 0x67F8, 0x96C8,
+ 0x67F9, 0x96C9,
+ 0x67FA, 0x96CA,
+ 0x67FB, 0x96CB,
+ 0x67FC, 0x96CC,
+ 0x67FE, 0x96CD,
+ 0x6801, 0x96CE,
+ 0x6802, 0x96CF,
+ 0x6803, 0x96D0,
+ 0x6804, 0x96D1,
+ 0x6806, 0x96D2,
+ 0x680D, 0x96D3,
+ 0x6810, 0x96D4,
+ 0x6812, 0x96D5,
+ 0x6814, 0x96D6,
+ 0x6815, 0x96D7,
+ 0x6818, 0x96D8,
+ 0x6819, 0x96D9,
+ 0x681A, 0x96DA,
+ 0x681B, 0x96DB,
+ 0x681C, 0x96DC,
+ 0x681E, 0x96DD,
+ 0x681F, 0x96DE,
+ 0x6820, 0x96DF,
+ 0x6822, 0x96E0,
+ 0x6823, 0x96E1,
+ 0x6824, 0x96E2,
+ 0x6825, 0x96E3,
+ 0x6826, 0x96E4,
+ 0x6827, 0x96E5,
+ 0x6828, 0x96E6,
+ 0x682B, 0x96E7,
+ 0x682C, 0x96E8,
+ 0x682D, 0x96E9,
+ 0x682E, 0x96EA,
+ 0x682F, 0x96EB,
+ 0x6830, 0x96EC,
+ 0x6831, 0x96ED,
+ 0x6834, 0x96EE,
+ 0x6835, 0x96EF,
+ 0x6836, 0x96F0,
+ 0x683A, 0x96F1,
+ 0x683B, 0x96F2,
+ 0x683F, 0x96F3,
+ 0x6847, 0x96F4,
+ 0x684B, 0x96F5,
+ 0x684D, 0x96F6,
+ 0x684F, 0x96F7,
+ 0x6852, 0x96F8,
+ 0x6856, 0x96F9,
+ 0x6857, 0x96FA,
+ 0x6858, 0x96FB,
+ 0x6859, 0x96FC,
+ 0x685A, 0x96FD,
+ 0x685B, 0x96FE,
+ 0x685C, 0x9740,
+ 0x685D, 0x9741,
+ 0x685E, 0x9742,
+ 0x685F, 0x9743,
+ 0x686A, 0x9744,
+ 0x686C, 0x9745,
+ 0x686D, 0x9746,
+ 0x686E, 0x9747,
+ 0x686F, 0x9748,
+ 0x6870, 0x9749,
+ 0x6871, 0x974A,
+ 0x6872, 0x974B,
+ 0x6873, 0x974C,
+ 0x6875, 0x974D,
+ 0x6878, 0x974E,
+ 0x6879, 0x974F,
+ 0x687A, 0x9750,
+ 0x687B, 0x9751,
+ 0x687C, 0x9752,
+ 0x687D, 0x9753,
+ 0x687E, 0x9754,
+ 0x687F, 0x9755,
+ 0x6880, 0x9756,
+ 0x6882, 0x9757,
+ 0x6884, 0x9758,
+ 0x6887, 0x9759,
+ 0x6888, 0x975A,
+ 0x6889, 0x975B,
+ 0x688A, 0x975C,
+ 0x688B, 0x975D,
+ 0x688C, 0x975E,
+ 0x688D, 0x975F,
+ 0x688E, 0x9760,
+ 0x6890, 0x9761,
+ 0x6891, 0x9762,
+ 0x6892, 0x9763,
+ 0x6894, 0x9764,
+ 0x6895, 0x9765,
+ 0x6896, 0x9766,
+ 0x6898, 0x9767,
+ 0x6899, 0x9768,
+ 0x689A, 0x9769,
+ 0x689B, 0x976A,
+ 0x689C, 0x976B,
+ 0x689D, 0x976C,
+ 0x689E, 0x976D,
+ 0x689F, 0x976E,
+ 0x68A0, 0x976F,
+ 0x68A1, 0x9770,
+ 0x68A3, 0x9771,
+ 0x68A4, 0x9772,
+ 0x68A5, 0x9773,
+ 0x68A9, 0x9774,
+ 0x68AA, 0x9775,
+ 0x68AB, 0x9776,
+ 0x68AC, 0x9777,
+ 0x68AE, 0x9778,
+ 0x68B1, 0x9779,
+ 0x68B2, 0x977A,
+ 0x68B4, 0x977B,
+ 0x68B6, 0x977C,
+ 0x68B7, 0x977D,
+ 0x68B8, 0x977E,
+ 0x68B9, 0x9780,
+ 0x68BA, 0x9781,
+ 0x68BB, 0x9782,
+ 0x68BC, 0x9783,
+ 0x68BD, 0x9784,
+ 0x68BE, 0x9785,
+ 0x68BF, 0x9786,
+ 0x68C1, 0x9787,
+ 0x68C3, 0x9788,
+ 0x68C4, 0x9789,
+ 0x68C5, 0x978A,
+ 0x68C6, 0x978B,
+ 0x68C7, 0x978C,
+ 0x68C8, 0x978D,
+ 0x68CA, 0x978E,
+ 0x68CC, 0x978F,
+ 0x68CE, 0x9790,
+ 0x68CF, 0x9791,
+ 0x68D0, 0x9792,
+ 0x68D1, 0x9793,
+ 0x68D3, 0x9794,
+ 0x68D4, 0x9795,
+ 0x68D6, 0x9796,
+ 0x68D7, 0x9797,
+ 0x68D9, 0x9798,
+ 0x68DB, 0x9799,
+ 0x68DC, 0x979A,
+ 0x68DD, 0x979B,
+ 0x68DE, 0x979C,
+ 0x68DF, 0x979D,
+ 0x68E1, 0x979E,
+ 0x68E2, 0x979F,
+ 0x68E4, 0x97A0,
+ 0x68E5, 0x97A1,
+ 0x68E6, 0x97A2,
+ 0x68E7, 0x97A3,
+ 0x68E8, 0x97A4,
+ 0x68E9, 0x97A5,
+ 0x68EA, 0x97A6,
+ 0x68EB, 0x97A7,
+ 0x68EC, 0x97A8,
+ 0x68ED, 0x97A9,
+ 0x68EF, 0x97AA,
+ 0x68F2, 0x97AB,
+ 0x68F3, 0x97AC,
+ 0x68F4, 0x97AD,
+ 0x68F6, 0x97AE,
+ 0x68F7, 0x97AF,
+ 0x68F8, 0x97B0,
+ 0x68FB, 0x97B1,
+ 0x68FD, 0x97B2,
+ 0x68FE, 0x97B3,
+ 0x68FF, 0x97B4,
+ 0x6900, 0x97B5,
+ 0x6902, 0x97B6,
+ 0x6903, 0x97B7,
+ 0x6904, 0x97B8,
+ 0x6906, 0x97B9,
+ 0x6907, 0x97BA,
+ 0x6908, 0x97BB,
+ 0x6909, 0x97BC,
+ 0x690A, 0x97BD,
+ 0x690C, 0x97BE,
+ 0x690F, 0x97BF,
+ 0x6911, 0x97C0,
+ 0x6913, 0x97C1,
+ 0x6914, 0x97C2,
+ 0x6915, 0x97C3,
+ 0x6916, 0x97C4,
+ 0x6917, 0x97C5,
+ 0x6918, 0x97C6,
+ 0x6919, 0x97C7,
+ 0x691A, 0x97C8,
+ 0x691B, 0x97C9,
+ 0x691C, 0x97CA,
+ 0x691D, 0x97CB,
+ 0x691E, 0x97CC,
+ 0x6921, 0x97CD,
+ 0x6922, 0x97CE,
+ 0x6923, 0x97CF,
+ 0x6925, 0x97D0,
+ 0x6926, 0x97D1,
+ 0x6927, 0x97D2,
+ 0x6928, 0x97D3,
+ 0x6929, 0x97D4,
+ 0x692A, 0x97D5,
+ 0x692B, 0x97D6,
+ 0x692C, 0x97D7,
+ 0x692E, 0x97D8,
+ 0x692F, 0x97D9,
+ 0x6931, 0x97DA,
+ 0x6932, 0x97DB,
+ 0x6933, 0x97DC,
+ 0x6935, 0x97DD,
+ 0x6936, 0x97DE,
+ 0x6937, 0x97DF,
+ 0x6938, 0x97E0,
+ 0x693A, 0x97E1,
+ 0x693B, 0x97E2,
+ 0x693C, 0x97E3,
+ 0x693E, 0x97E4,
+ 0x6940, 0x97E5,
+ 0x6941, 0x97E6,
+ 0x6943, 0x97E7,
+ 0x6944, 0x97E8,
+ 0x6945, 0x97E9,
+ 0x6946, 0x97EA,
+ 0x6947, 0x97EB,
+ 0x6948, 0x97EC,
+ 0x6949, 0x97ED,
+ 0x694A, 0x97EE,
+ 0x694B, 0x97EF,
+ 0x694C, 0x97F0,
+ 0x694D, 0x97F1,
+ 0x694E, 0x97F2,
+ 0x694F, 0x97F3,
+ 0x6950, 0x97F4,
+ 0x6951, 0x97F5,
+ 0x6952, 0x97F6,
+ 0x6953, 0x97F7,
+ 0x6955, 0x97F8,
+ 0x6956, 0x97F9,
+ 0x6958, 0x97FA,
+ 0x6959, 0x97FB,
+ 0x695B, 0x97FC,
+ 0x695C, 0x97FD,
+ 0x695F, 0x97FE,
+ 0x6961, 0x9840,
+ 0x6962, 0x9841,
+ 0x6964, 0x9842,
+ 0x6965, 0x9843,
+ 0x6967, 0x9844,
+ 0x6968, 0x9845,
+ 0x6969, 0x9846,
+ 0x696A, 0x9847,
+ 0x696C, 0x9848,
+ 0x696D, 0x9849,
+ 0x696F, 0x984A,
+ 0x6970, 0x984B,
+ 0x6972, 0x984C,
+ 0x6973, 0x984D,
+ 0x6974, 0x984E,
+ 0x6975, 0x984F,
+ 0x6976, 0x9850,
+ 0x697A, 0x9851,
+ 0x697B, 0x9852,
+ 0x697D, 0x9853,
+ 0x697E, 0x9854,
+ 0x697F, 0x9855,
+ 0x6981, 0x9856,
+ 0x6983, 0x9857,
+ 0x6985, 0x9858,
+ 0x698A, 0x9859,
+ 0x698B, 0x985A,
+ 0x698C, 0x985B,
+ 0x698E, 0x985C,
+ 0x698F, 0x985D,
+ 0x6990, 0x985E,
+ 0x6991, 0x985F,
+ 0x6992, 0x9860,
+ 0x6993, 0x9861,
+ 0x6996, 0x9862,
+ 0x6997, 0x9863,
+ 0x6999, 0x9864,
+ 0x699A, 0x9865,
+ 0x699D, 0x9866,
+ 0x699E, 0x9867,
+ 0x699F, 0x9868,
+ 0x69A0, 0x9869,
+ 0x69A1, 0x986A,
+ 0x69A2, 0x986B,
+ 0x69A3, 0x986C,
+ 0x69A4, 0x986D,
+ 0x69A5, 0x986E,
+ 0x69A6, 0x986F,
+ 0x69A9, 0x9870,
+ 0x69AA, 0x9871,
+ 0x69AC, 0x9872,
+ 0x69AE, 0x9873,
+ 0x69AF, 0x9874,
+ 0x69B0, 0x9875,
+ 0x69B2, 0x9876,
+ 0x69B3, 0x9877,
+ 0x69B5, 0x9878,
+ 0x69B6, 0x9879,
+ 0x69B8, 0x987A,
+ 0x69B9, 0x987B,
+ 0x69BA, 0x987C,
+ 0x69BC, 0x987D,
+ 0x69BD, 0x987E,
+ 0x69BE, 0x9880,
+ 0x69BF, 0x9881,
+ 0x69C0, 0x9882,
+ 0x69C2, 0x9883,
+ 0x69C3, 0x9884,
+ 0x69C4, 0x9885,
+ 0x69C5, 0x9886,
+ 0x69C6, 0x9887,
+ 0x69C7, 0x9888,
+ 0x69C8, 0x9889,
+ 0x69C9, 0x988A,
+ 0x69CB, 0x988B,
+ 0x69CD, 0x988C,
+ 0x69CF, 0x988D,
+ 0x69D1, 0x988E,
+ 0x69D2, 0x988F,
+ 0x69D3, 0x9890,
+ 0x69D5, 0x9891,
+ 0x69D6, 0x9892,
+ 0x69D7, 0x9893,
+ 0x69D8, 0x9894,
+ 0x69D9, 0x9895,
+ 0x69DA, 0x9896,
+ 0x69DC, 0x9897,
+ 0x69DD, 0x9898,
+ 0x69DE, 0x9899,
+ 0x69E1, 0x989A,
+ 0x69E2, 0x989B,
+ 0x69E3, 0x989C,
+ 0x69E4, 0x989D,
+ 0x69E5, 0x989E,
+ 0x69E6, 0x989F,
+ 0x69E7, 0x98A0,
+ 0x69E8, 0x98A1,
+ 0x69E9, 0x98A2,
+ 0x69EA, 0x98A3,
+ 0x69EB, 0x98A4,
+ 0x69EC, 0x98A5,
+ 0x69EE, 0x98A6,
+ 0x69EF, 0x98A7,
+ 0x69F0, 0x98A8,
+ 0x69F1, 0x98A9,
+ 0x69F3, 0x98AA,
+ 0x69F4, 0x98AB,
+ 0x69F5, 0x98AC,
+ 0x69F6, 0x98AD,
+ 0x69F7, 0x98AE,
+ 0x69F8, 0x98AF,
+ 0x69F9, 0x98B0,
+ 0x69FA, 0x98B1,
+ 0x69FB, 0x98B2,
+ 0x69FC, 0x98B3,
+ 0x69FE, 0x98B4,
+ 0x6A00, 0x98B5,
+ 0x6A01, 0x98B6,
+ 0x6A02, 0x98B7,
+ 0x6A03, 0x98B8,
+ 0x6A04, 0x98B9,
+ 0x6A05, 0x98BA,
+ 0x6A06, 0x98BB,
+ 0x6A07, 0x98BC,
+ 0x6A08, 0x98BD,
+ 0x6A09, 0x98BE,
+ 0x6A0B, 0x98BF,
+ 0x6A0C, 0x98C0,
+ 0x6A0D, 0x98C1,
+ 0x6A0E, 0x98C2,
+ 0x6A0F, 0x98C3,
+ 0x6A10, 0x98C4,
+ 0x6A11, 0x98C5,
+ 0x6A12, 0x98C6,
+ 0x6A13, 0x98C7,
+ 0x6A14, 0x98C8,
+ 0x6A15, 0x98C9,
+ 0x6A16, 0x98CA,
+ 0x6A19, 0x98CB,
+ 0x6A1A, 0x98CC,
+ 0x6A1B, 0x98CD,
+ 0x6A1C, 0x98CE,
+ 0x6A1D, 0x98CF,
+ 0x6A1E, 0x98D0,
+ 0x6A20, 0x98D1,
+ 0x6A22, 0x98D2,
+ 0x6A23, 0x98D3,
+ 0x6A24, 0x98D4,
+ 0x6A25, 0x98D5,
+ 0x6A26, 0x98D6,
+ 0x6A27, 0x98D7,
+ 0x6A29, 0x98D8,
+ 0x6A2B, 0x98D9,
+ 0x6A2C, 0x98DA,
+ 0x6A2D, 0x98DB,
+ 0x6A2E, 0x98DC,
+ 0x6A30, 0x98DD,
+ 0x6A32, 0x98DE,
+ 0x6A33, 0x98DF,
+ 0x6A34, 0x98E0,
+ 0x6A36, 0x98E1,
+ 0x6A37, 0x98E2,
+ 0x6A38, 0x98E3,
+ 0x6A39, 0x98E4,
+ 0x6A3A, 0x98E5,
+ 0x6A3B, 0x98E6,
+ 0x6A3C, 0x98E7,
+ 0x6A3F, 0x98E8,
+ 0x6A40, 0x98E9,
+ 0x6A41, 0x98EA,
+ 0x6A42, 0x98EB,
+ 0x6A43, 0x98EC,
+ 0x6A45, 0x98ED,
+ 0x6A46, 0x98EE,
+ 0x6A48, 0x98EF,
+ 0x6A49, 0x98F0,
+ 0x6A4A, 0x98F1,
+ 0x6A4B, 0x98F2,
+ 0x6A4C, 0x98F3,
+ 0x6A4D, 0x98F4,
+ 0x6A4E, 0x98F5,
+ 0x6A4F, 0x98F6,
+ 0x6A51, 0x98F7,
+ 0x6A52, 0x98F8,
+ 0x6A53, 0x98F9,
+ 0x6A54, 0x98FA,
+ 0x6A55, 0x98FB,
+ 0x6A56, 0x98FC,
+ 0x6A57, 0x98FD,
+ 0x6A5A, 0x98FE,
+ 0x6A5C, 0x9940,
+ 0x6A5D, 0x9941,
+ 0x6A5E, 0x9942,
+ 0x6A5F, 0x9943,
+ 0x6A60, 0x9944,
+ 0x6A62, 0x9945,
+ 0x6A63, 0x9946,
+ 0x6A64, 0x9947,
+ 0x6A66, 0x9948,
+ 0x6A67, 0x9949,
+ 0x6A68, 0x994A,
+ 0x6A69, 0x994B,
+ 0x6A6A, 0x994C,
+ 0x6A6B, 0x994D,
+ 0x6A6C, 0x994E,
+ 0x6A6D, 0x994F,
+ 0x6A6E, 0x9950,
+ 0x6A6F, 0x9951,
+ 0x6A70, 0x9952,
+ 0x6A72, 0x9953,
+ 0x6A73, 0x9954,
+ 0x6A74, 0x9955,
+ 0x6A75, 0x9956,
+ 0x6A76, 0x9957,
+ 0x6A77, 0x9958,
+ 0x6A78, 0x9959,
+ 0x6A7A, 0x995A,
+ 0x6A7B, 0x995B,
+ 0x6A7D, 0x995C,
+ 0x6A7E, 0x995D,
+ 0x6A7F, 0x995E,
+ 0x6A81, 0x995F,
+ 0x6A82, 0x9960,
+ 0x6A83, 0x9961,
+ 0x6A85, 0x9962,
+ 0x6A86, 0x9963,
+ 0x6A87, 0x9964,
+ 0x6A88, 0x9965,
+ 0x6A89, 0x9966,
+ 0x6A8A, 0x9967,
+ 0x6A8B, 0x9968,
+ 0x6A8C, 0x9969,
+ 0x6A8D, 0x996A,
+ 0x6A8F, 0x996B,
+ 0x6A92, 0x996C,
+ 0x6A93, 0x996D,
+ 0x6A94, 0x996E,
+ 0x6A95, 0x996F,
+ 0x6A96, 0x9970,
+ 0x6A98, 0x9971,
+ 0x6A99, 0x9972,
+ 0x6A9A, 0x9973,
+ 0x6A9B, 0x9974,
+ 0x6A9C, 0x9975,
+ 0x6A9D, 0x9976,
+ 0x6A9E, 0x9977,
+ 0x6A9F, 0x9978,
+ 0x6AA1, 0x9979,
+ 0x6AA2, 0x997A,
+ 0x6AA3, 0x997B,
+ 0x6AA4, 0x997C,
+ 0x6AA5, 0x997D,
+ 0x6AA6, 0x997E,
+ 0x6AA7, 0x9980,
+ 0x6AA8, 0x9981,
+ 0x6AAA, 0x9982,
+ 0x6AAD, 0x9983,
+ 0x6AAE, 0x9984,
+ 0x6AAF, 0x9985,
+ 0x6AB0, 0x9986,
+ 0x6AB1, 0x9987,
+ 0x6AB2, 0x9988,
+ 0x6AB3, 0x9989,
+ 0x6AB4, 0x998A,
+ 0x6AB5, 0x998B,
+ 0x6AB6, 0x998C,
+ 0x6AB7, 0x998D,
+ 0x6AB8, 0x998E,
+ 0x6AB9, 0x998F,
+ 0x6ABA, 0x9990,
+ 0x6ABB, 0x9991,
+ 0x6ABC, 0x9992,
+ 0x6ABD, 0x9993,
+ 0x6ABE, 0x9994,
+ 0x6ABF, 0x9995,
+ 0x6AC0, 0x9996,
+ 0x6AC1, 0x9997,
+ 0x6AC2, 0x9998,
+ 0x6AC3, 0x9999,
+ 0x6AC4, 0x999A,
+ 0x6AC5, 0x999B,
+ 0x6AC6, 0x999C,
+ 0x6AC7, 0x999D,
+ 0x6AC8, 0x999E,
+ 0x6AC9, 0x999F,
+ 0x6ACA, 0x99A0,
+ 0x6ACB, 0x99A1,
+ 0x6ACC, 0x99A2,
+ 0x6ACD, 0x99A3,
+ 0x6ACE, 0x99A4,
+ 0x6ACF, 0x99A5,
+ 0x6AD0, 0x99A6,
+ 0x6AD1, 0x99A7,
+ 0x6AD2, 0x99A8,
+ 0x6AD3, 0x99A9,
+ 0x6AD4, 0x99AA,
+ 0x6AD5, 0x99AB,
+ 0x6AD6, 0x99AC,
+ 0x6AD7, 0x99AD,
+ 0x6AD8, 0x99AE,
+ 0x6AD9, 0x99AF,
+ 0x6ADA, 0x99B0,
+ 0x6ADB, 0x99B1,
+ 0x6ADC, 0x99B2,
+ 0x6ADD, 0x99B3,
+ 0x6ADE, 0x99B4,
+ 0x6ADF, 0x99B5,
+ 0x6AE0, 0x99B6,
+ 0x6AE1, 0x99B7,
+ 0x6AE2, 0x99B8,
+ 0x6AE3, 0x99B9,
+ 0x6AE4, 0x99BA,
+ 0x6AE5, 0x99BB,
+ 0x6AE6, 0x99BC,
+ 0x6AE7, 0x99BD,
+ 0x6AE8, 0x99BE,
+ 0x6AE9, 0x99BF,
+ 0x6AEA, 0x99C0,
+ 0x6AEB, 0x99C1,
+ 0x6AEC, 0x99C2,
+ 0x6AED, 0x99C3,
+ 0x6AEE, 0x99C4,
+ 0x6AEF, 0x99C5,
+ 0x6AF0, 0x99C6,
+ 0x6AF1, 0x99C7,
+ 0x6AF2, 0x99C8,
+ 0x6AF3, 0x99C9,
+ 0x6AF4, 0x99CA,
+ 0x6AF5, 0x99CB,
+ 0x6AF6, 0x99CC,
+ 0x6AF7, 0x99CD,
+ 0x6AF8, 0x99CE,
+ 0x6AF9, 0x99CF,
+ 0x6AFA, 0x99D0,
+ 0x6AFB, 0x99D1,
+ 0x6AFC, 0x99D2,
+ 0x6AFD, 0x99D3,
+ 0x6AFE, 0x99D4,
+ 0x6AFF, 0x99D5,
+ 0x6B00, 0x99D6,
+ 0x6B01, 0x99D7,
+ 0x6B02, 0x99D8,
+ 0x6B03, 0x99D9,
+ 0x6B04, 0x99DA,
+ 0x6B05, 0x99DB,
+ 0x6B06, 0x99DC,
+ 0x6B07, 0x99DD,
+ 0x6B08, 0x99DE,
+ 0x6B09, 0x99DF,
+ 0x6B0A, 0x99E0,
+ 0x6B0B, 0x99E1,
+ 0x6B0C, 0x99E2,
+ 0x6B0D, 0x99E3,
+ 0x6B0E, 0x99E4,
+ 0x6B0F, 0x99E5,
+ 0x6B10, 0x99E6,
+ 0x6B11, 0x99E7,
+ 0x6B12, 0x99E8,
+ 0x6B13, 0x99E9,
+ 0x6B14, 0x99EA,
+ 0x6B15, 0x99EB,
+ 0x6B16, 0x99EC,
+ 0x6B17, 0x99ED,
+ 0x6B18, 0x99EE,
+ 0x6B19, 0x99EF,
+ 0x6B1A, 0x99F0,
+ 0x6B1B, 0x99F1,
+ 0x6B1C, 0x99F2,
+ 0x6B1D, 0x99F3,
+ 0x6B1E, 0x99F4,
+ 0x6B1F, 0x99F5,
+ 0x6B25, 0x99F6,
+ 0x6B26, 0x99F7,
+ 0x6B28, 0x99F8,
+ 0x6B29, 0x99F9,
+ 0x6B2A, 0x99FA,
+ 0x6B2B, 0x99FB,
+ 0x6B2C, 0x99FC,
+ 0x6B2D, 0x99FD,
+ 0x6B2E, 0x99FE,
+ 0x6B2F, 0x9A40,
+ 0x6B30, 0x9A41,
+ 0x6B31, 0x9A42,
+ 0x6B33, 0x9A43,
+ 0x6B34, 0x9A44,
+ 0x6B35, 0x9A45,
+ 0x6B36, 0x9A46,
+ 0x6B38, 0x9A47,
+ 0x6B3B, 0x9A48,
+ 0x6B3C, 0x9A49,
+ 0x6B3D, 0x9A4A,
+ 0x6B3F, 0x9A4B,
+ 0x6B40, 0x9A4C,
+ 0x6B41, 0x9A4D,
+ 0x6B42, 0x9A4E,
+ 0x6B44, 0x9A4F,
+ 0x6B45, 0x9A50,
+ 0x6B48, 0x9A51,
+ 0x6B4A, 0x9A52,
+ 0x6B4B, 0x9A53,
+ 0x6B4D, 0x9A54,
+ 0x6B4E, 0x9A55,
+ 0x6B4F, 0x9A56,
+ 0x6B50, 0x9A57,
+ 0x6B51, 0x9A58,
+ 0x6B52, 0x9A59,
+ 0x6B53, 0x9A5A,
+ 0x6B54, 0x9A5B,
+ 0x6B55, 0x9A5C,
+ 0x6B56, 0x9A5D,
+ 0x6B57, 0x9A5E,
+ 0x6B58, 0x9A5F,
+ 0x6B5A, 0x9A60,
+ 0x6B5B, 0x9A61,
+ 0x6B5C, 0x9A62,
+ 0x6B5D, 0x9A63,
+ 0x6B5E, 0x9A64,
+ 0x6B5F, 0x9A65,
+ 0x6B60, 0x9A66,
+ 0x6B61, 0x9A67,
+ 0x6B68, 0x9A68,
+ 0x6B69, 0x9A69,
+ 0x6B6B, 0x9A6A,
+ 0x6B6C, 0x9A6B,
+ 0x6B6D, 0x9A6C,
+ 0x6B6E, 0x9A6D,
+ 0x6B6F, 0x9A6E,
+ 0x6B70, 0x9A6F,
+ 0x6B71, 0x9A70,
+ 0x6B72, 0x9A71,
+ 0x6B73, 0x9A72,
+ 0x6B74, 0x9A73,
+ 0x6B75, 0x9A74,
+ 0x6B76, 0x9A75,
+ 0x6B77, 0x9A76,
+ 0x6B78, 0x9A77,
+ 0x6B7A, 0x9A78,
+ 0x6B7D, 0x9A79,
+ 0x6B7E, 0x9A7A,
+ 0x6B7F, 0x9A7B,
+ 0x6B80, 0x9A7C,
+ 0x6B85, 0x9A7D,
+ 0x6B88, 0x9A7E,
+ 0x6B8C, 0x9A80,
+ 0x6B8E, 0x9A81,
+ 0x6B8F, 0x9A82,
+ 0x6B90, 0x9A83,
+ 0x6B91, 0x9A84,
+ 0x6B94, 0x9A85,
+ 0x6B95, 0x9A86,
+ 0x6B97, 0x9A87,
+ 0x6B98, 0x9A88,
+ 0x6B99, 0x9A89,
+ 0x6B9C, 0x9A8A,
+ 0x6B9D, 0x9A8B,
+ 0x6B9E, 0x9A8C,
+ 0x6B9F, 0x9A8D,
+ 0x6BA0, 0x9A8E,
+ 0x6BA2, 0x9A8F,
+ 0x6BA3, 0x9A90,
+ 0x6BA4, 0x9A91,
+ 0x6BA5, 0x9A92,
+ 0x6BA6, 0x9A93,
+ 0x6BA7, 0x9A94,
+ 0x6BA8, 0x9A95,
+ 0x6BA9, 0x9A96,
+ 0x6BAB, 0x9A97,
+ 0x6BAC, 0x9A98,
+ 0x6BAD, 0x9A99,
+ 0x6BAE, 0x9A9A,
+ 0x6BAF, 0x9A9B,
+ 0x6BB0, 0x9A9C,
+ 0x6BB1, 0x9A9D,
+ 0x6BB2, 0x9A9E,
+ 0x6BB6, 0x9A9F,
+ 0x6BB8, 0x9AA0,
+ 0x6BB9, 0x9AA1,
+ 0x6BBA, 0x9AA2,
+ 0x6BBB, 0x9AA3,
+ 0x6BBC, 0x9AA4,
+ 0x6BBD, 0x9AA5,
+ 0x6BBE, 0x9AA6,
+ 0x6BC0, 0x9AA7,
+ 0x6BC3, 0x9AA8,
+ 0x6BC4, 0x9AA9,
+ 0x6BC6, 0x9AAA,
+ 0x6BC7, 0x9AAB,
+ 0x6BC8, 0x9AAC,
+ 0x6BC9, 0x9AAD,
+ 0x6BCA, 0x9AAE,
+ 0x6BCC, 0x9AAF,
+ 0x6BCE, 0x9AB0,
+ 0x6BD0, 0x9AB1,
+ 0x6BD1, 0x9AB2,
+ 0x6BD8, 0x9AB3,
+ 0x6BDA, 0x9AB4,
+ 0x6BDC, 0x9AB5,
+ 0x6BDD, 0x9AB6,
+ 0x6BDE, 0x9AB7,
+ 0x6BDF, 0x9AB8,
+ 0x6BE0, 0x9AB9,
+ 0x6BE2, 0x9ABA,
+ 0x6BE3, 0x9ABB,
+ 0x6BE4, 0x9ABC,
+ 0x6BE5, 0x9ABD,
+ 0x6BE6, 0x9ABE,
+ 0x6BE7, 0x9ABF,
+ 0x6BE8, 0x9AC0,
+ 0x6BE9, 0x9AC1,
+ 0x6BEC, 0x9AC2,
+ 0x6BED, 0x9AC3,
+ 0x6BEE, 0x9AC4,
+ 0x6BF0, 0x9AC5,
+ 0x6BF1, 0x9AC6,
+ 0x6BF2, 0x9AC7,
+ 0x6BF4, 0x9AC8,
+ 0x6BF6, 0x9AC9,
+ 0x6BF7, 0x9ACA,
+ 0x6BF8, 0x9ACB,
+ 0x6BFA, 0x9ACC,
+ 0x6BFB, 0x9ACD,
+ 0x6BFC, 0x9ACE,
+ 0x6BFE, 0x9ACF,
+ 0x6BFF, 0x9AD0,
+ 0x6C00, 0x9AD1,
+ 0x6C01, 0x9AD2,
+ 0x6C02, 0x9AD3,
+ 0x6C03, 0x9AD4,
+ 0x6C04, 0x9AD5,
+ 0x6C08, 0x9AD6,
+ 0x6C09, 0x9AD7,
+ 0x6C0A, 0x9AD8,
+ 0x6C0B, 0x9AD9,
+ 0x6C0C, 0x9ADA,
+ 0x6C0E, 0x9ADB,
+ 0x6C12, 0x9ADC,
+ 0x6C17, 0x9ADD,
+ 0x6C1C, 0x9ADE,
+ 0x6C1D, 0x9ADF,
+ 0x6C1E, 0x9AE0,
+ 0x6C20, 0x9AE1,
+ 0x6C23, 0x9AE2,
+ 0x6C25, 0x9AE3,
+ 0x6C2B, 0x9AE4,
+ 0x6C2C, 0x9AE5,
+ 0x6C2D, 0x9AE6,
+ 0x6C31, 0x9AE7,
+ 0x6C33, 0x9AE8,
+ 0x6C36, 0x9AE9,
+ 0x6C37, 0x9AEA,
+ 0x6C39, 0x9AEB,
+ 0x6C3A, 0x9AEC,
+ 0x6C3B, 0x9AED,
+ 0x6C3C, 0x9AEE,
+ 0x6C3E, 0x9AEF,
+ 0x6C3F, 0x9AF0,
+ 0x6C43, 0x9AF1,
+ 0x6C44, 0x9AF2,
+ 0x6C45, 0x9AF3,
+ 0x6C48, 0x9AF4,
+ 0x6C4B, 0x9AF5,
+ 0x6C4C, 0x9AF6,
+ 0x6C4D, 0x9AF7,
+ 0x6C4E, 0x9AF8,
+ 0x6C4F, 0x9AF9,
+ 0x6C51, 0x9AFA,
+ 0x6C52, 0x9AFB,
+ 0x6C53, 0x9AFC,
+ 0x6C56, 0x9AFD,
+ 0x6C58, 0x9AFE,
+ 0x6C59, 0x9B40,
+ 0x6C5A, 0x9B41,
+ 0x6C62, 0x9B42,
+ 0x6C63, 0x9B43,
+ 0x6C65, 0x9B44,
+ 0x6C66, 0x9B45,
+ 0x6C67, 0x9B46,
+ 0x6C6B, 0x9B47,
+ 0x6C6C, 0x9B48,
+ 0x6C6D, 0x9B49,
+ 0x6C6E, 0x9B4A,
+ 0x6C6F, 0x9B4B,
+ 0x6C71, 0x9B4C,
+ 0x6C73, 0x9B4D,
+ 0x6C75, 0x9B4E,
+ 0x6C77, 0x9B4F,
+ 0x6C78, 0x9B50,
+ 0x6C7A, 0x9B51,
+ 0x6C7B, 0x9B52,
+ 0x6C7C, 0x9B53,
+ 0x6C7F, 0x9B54,
+ 0x6C80, 0x9B55,
+ 0x6C84, 0x9B56,
+ 0x6C87, 0x9B57,
+ 0x6C8A, 0x9B58,
+ 0x6C8B, 0x9B59,
+ 0x6C8D, 0x9B5A,
+ 0x6C8E, 0x9B5B,
+ 0x6C91, 0x9B5C,
+ 0x6C92, 0x9B5D,
+ 0x6C95, 0x9B5E,
+ 0x6C96, 0x9B5F,
+ 0x6C97, 0x9B60,
+ 0x6C98, 0x9B61,
+ 0x6C9A, 0x9B62,
+ 0x6C9C, 0x9B63,
+ 0x6C9D, 0x9B64,
+ 0x6C9E, 0x9B65,
+ 0x6CA0, 0x9B66,
+ 0x6CA2, 0x9B67,
+ 0x6CA8, 0x9B68,
+ 0x6CAC, 0x9B69,
+ 0x6CAF, 0x9B6A,
+ 0x6CB0, 0x9B6B,
+ 0x6CB4, 0x9B6C,
+ 0x6CB5, 0x9B6D,
+ 0x6CB6, 0x9B6E,
+ 0x6CB7, 0x9B6F,
+ 0x6CBA, 0x9B70,
+ 0x6CC0, 0x9B71,
+ 0x6CC1, 0x9B72,
+ 0x6CC2, 0x9B73,
+ 0x6CC3, 0x9B74,
+ 0x6CC6, 0x9B75,
+ 0x6CC7, 0x9B76,
+ 0x6CC8, 0x9B77,
+ 0x6CCB, 0x9B78,
+ 0x6CCD, 0x9B79,
+ 0x6CCE, 0x9B7A,
+ 0x6CCF, 0x9B7B,
+ 0x6CD1, 0x9B7C,
+ 0x6CD2, 0x9B7D,
+ 0x6CD8, 0x9B7E,
+ 0x6CD9, 0x9B80,
+ 0x6CDA, 0x9B81,
+ 0x6CDC, 0x9B82,
+ 0x6CDD, 0x9B83,
+ 0x6CDF, 0x9B84,
+ 0x6CE4, 0x9B85,
+ 0x6CE6, 0x9B86,
+ 0x6CE7, 0x9B87,
+ 0x6CE9, 0x9B88,
+ 0x6CEC, 0x9B89,
+ 0x6CED, 0x9B8A,
+ 0x6CF2, 0x9B8B,
+ 0x6CF4, 0x9B8C,
+ 0x6CF9, 0x9B8D,
+ 0x6CFF, 0x9B8E,
+ 0x6D00, 0x9B8F,
+ 0x6D02, 0x9B90,
+ 0x6D03, 0x9B91,
+ 0x6D05, 0x9B92,
+ 0x6D06, 0x9B93,
+ 0x6D08, 0x9B94,
+ 0x6D09, 0x9B95,
+ 0x6D0A, 0x9B96,
+ 0x6D0D, 0x9B97,
+ 0x6D0F, 0x9B98,
+ 0x6D10, 0x9B99,
+ 0x6D11, 0x9B9A,
+ 0x6D13, 0x9B9B,
+ 0x6D14, 0x9B9C,
+ 0x6D15, 0x9B9D,
+ 0x6D16, 0x9B9E,
+ 0x6D18, 0x9B9F,
+ 0x6D1C, 0x9BA0,
+ 0x6D1D, 0x9BA1,
+ 0x6D1F, 0x9BA2,
+ 0x6D20, 0x9BA3,
+ 0x6D21, 0x9BA4,
+ 0x6D22, 0x9BA5,
+ 0x6D23, 0x9BA6,
+ 0x6D24, 0x9BA7,
+ 0x6D26, 0x9BA8,
+ 0x6D28, 0x9BA9,
+ 0x6D29, 0x9BAA,
+ 0x6D2C, 0x9BAB,
+ 0x6D2D, 0x9BAC,
+ 0x6D2F, 0x9BAD,
+ 0x6D30, 0x9BAE,
+ 0x6D34, 0x9BAF,
+ 0x6D36, 0x9BB0,
+ 0x6D37, 0x9BB1,
+ 0x6D38, 0x9BB2,
+ 0x6D3A, 0x9BB3,
+ 0x6D3F, 0x9BB4,
+ 0x6D40, 0x9BB5,
+ 0x6D42, 0x9BB6,
+ 0x6D44, 0x9BB7,
+ 0x6D49, 0x9BB8,
+ 0x6D4C, 0x9BB9,
+ 0x6D50, 0x9BBA,
+ 0x6D55, 0x9BBB,
+ 0x6D56, 0x9BBC,
+ 0x6D57, 0x9BBD,
+ 0x6D58, 0x9BBE,
+ 0x6D5B, 0x9BBF,
+ 0x6D5D, 0x9BC0,
+ 0x6D5F, 0x9BC1,
+ 0x6D61, 0x9BC2,
+ 0x6D62, 0x9BC3,
+ 0x6D64, 0x9BC4,
+ 0x6D65, 0x9BC5,
+ 0x6D67, 0x9BC6,
+ 0x6D68, 0x9BC7,
+ 0x6D6B, 0x9BC8,
+ 0x6D6C, 0x9BC9,
+ 0x6D6D, 0x9BCA,
+ 0x6D70, 0x9BCB,
+ 0x6D71, 0x9BCC,
+ 0x6D72, 0x9BCD,
+ 0x6D73, 0x9BCE,
+ 0x6D75, 0x9BCF,
+ 0x6D76, 0x9BD0,
+ 0x6D79, 0x9BD1,
+ 0x6D7A, 0x9BD2,
+ 0x6D7B, 0x9BD3,
+ 0x6D7D, 0x9BD4,
+ 0x6D7E, 0x9BD5,
+ 0x6D7F, 0x9BD6,
+ 0x6D80, 0x9BD7,
+ 0x6D81, 0x9BD8,
+ 0x6D83, 0x9BD9,
+ 0x6D84, 0x9BDA,
+ 0x6D86, 0x9BDB,
+ 0x6D87, 0x9BDC,
+ 0x6D8A, 0x9BDD,
+ 0x6D8B, 0x9BDE,
+ 0x6D8D, 0x9BDF,
+ 0x6D8F, 0x9BE0,
+ 0x6D90, 0x9BE1,
+ 0x6D92, 0x9BE2,
+ 0x6D96, 0x9BE3,
+ 0x6D97, 0x9BE4,
+ 0x6D98, 0x9BE5,
+ 0x6D99, 0x9BE6,
+ 0x6D9A, 0x9BE7,
+ 0x6D9C, 0x9BE8,
+ 0x6DA2, 0x9BE9,
+ 0x6DA5, 0x9BEA,
+ 0x6DAC, 0x9BEB,
+ 0x6DAD, 0x9BEC,
+ 0x6DB0, 0x9BED,
+ 0x6DB1, 0x9BEE,
+ 0x6DB3, 0x9BEF,
+ 0x6DB4, 0x9BF0,
+ 0x6DB6, 0x9BF1,
+ 0x6DB7, 0x9BF2,
+ 0x6DB9, 0x9BF3,
+ 0x6DBA, 0x9BF4,
+ 0x6DBB, 0x9BF5,
+ 0x6DBC, 0x9BF6,
+ 0x6DBD, 0x9BF7,
+ 0x6DBE, 0x9BF8,
+ 0x6DC1, 0x9BF9,
+ 0x6DC2, 0x9BFA,
+ 0x6DC3, 0x9BFB,
+ 0x6DC8, 0x9BFC,
+ 0x6DC9, 0x9BFD,
+ 0x6DCA, 0x9BFE,
+ 0x6DCD, 0x9C40,
+ 0x6DCE, 0x9C41,
+ 0x6DCF, 0x9C42,
+ 0x6DD0, 0x9C43,
+ 0x6DD2, 0x9C44,
+ 0x6DD3, 0x9C45,
+ 0x6DD4, 0x9C46,
+ 0x6DD5, 0x9C47,
+ 0x6DD7, 0x9C48,
+ 0x6DDA, 0x9C49,
+ 0x6DDB, 0x9C4A,
+ 0x6DDC, 0x9C4B,
+ 0x6DDF, 0x9C4C,
+ 0x6DE2, 0x9C4D,
+ 0x6DE3, 0x9C4E,
+ 0x6DE5, 0x9C4F,
+ 0x6DE7, 0x9C50,
+ 0x6DE8, 0x9C51,
+ 0x6DE9, 0x9C52,
+ 0x6DEA, 0x9C53,
+ 0x6DED, 0x9C54,
+ 0x6DEF, 0x9C55,
+ 0x6DF0, 0x9C56,
+ 0x6DF2, 0x9C57,
+ 0x6DF4, 0x9C58,
+ 0x6DF5, 0x9C59,
+ 0x6DF6, 0x9C5A,
+ 0x6DF8, 0x9C5B,
+ 0x6DFA, 0x9C5C,
+ 0x6DFD, 0x9C5D,
+ 0x6DFE, 0x9C5E,
+ 0x6DFF, 0x9C5F,
+ 0x6E00, 0x9C60,
+ 0x6E01, 0x9C61,
+ 0x6E02, 0x9C62,
+ 0x6E03, 0x9C63,
+ 0x6E04, 0x9C64,
+ 0x6E06, 0x9C65,
+ 0x6E07, 0x9C66,
+ 0x6E08, 0x9C67,
+ 0x6E09, 0x9C68,
+ 0x6E0B, 0x9C69,
+ 0x6E0F, 0x9C6A,
+ 0x6E12, 0x9C6B,
+ 0x6E13, 0x9C6C,
+ 0x6E15, 0x9C6D,
+ 0x6E18, 0x9C6E,
+ 0x6E19, 0x9C6F,
+ 0x6E1B, 0x9C70,
+ 0x6E1C, 0x9C71,
+ 0x6E1E, 0x9C72,
+ 0x6E1F, 0x9C73,
+ 0x6E22, 0x9C74,
+ 0x6E26, 0x9C75,
+ 0x6E27, 0x9C76,
+ 0x6E28, 0x9C77,
+ 0x6E2A, 0x9C78,
+ 0x6E2C, 0x9C79,
+ 0x6E2E, 0x9C7A,
+ 0x6E30, 0x9C7B,
+ 0x6E31, 0x9C7C,
+ 0x6E33, 0x9C7D,
+ 0x6E35, 0x9C7E,
+ 0x6E36, 0x9C80,
+ 0x6E37, 0x9C81,
+ 0x6E39, 0x9C82,
+ 0x6E3B, 0x9C83,
+ 0x6E3C, 0x9C84,
+ 0x6E3D, 0x9C85,
+ 0x6E3E, 0x9C86,
+ 0x6E3F, 0x9C87,
+ 0x6E40, 0x9C88,
+ 0x6E41, 0x9C89,
+ 0x6E42, 0x9C8A,
+ 0x6E45, 0x9C8B,
+ 0x6E46, 0x9C8C,
+ 0x6E47, 0x9C8D,
+ 0x6E48, 0x9C8E,
+ 0x6E49, 0x9C8F,
+ 0x6E4A, 0x9C90,
+ 0x6E4B, 0x9C91,
+ 0x6E4C, 0x9C92,
+ 0x6E4F, 0x9C93,
+ 0x6E50, 0x9C94,
+ 0x6E51, 0x9C95,
+ 0x6E52, 0x9C96,
+ 0x6E55, 0x9C97,
+ 0x6E57, 0x9C98,
+ 0x6E59, 0x9C99,
+ 0x6E5A, 0x9C9A,
+ 0x6E5C, 0x9C9B,
+ 0x6E5D, 0x9C9C,
+ 0x6E5E, 0x9C9D,
+ 0x6E60, 0x9C9E,
+ 0x6E61, 0x9C9F,
+ 0x6E62, 0x9CA0,
+ 0x6E63, 0x9CA1,
+ 0x6E64, 0x9CA2,
+ 0x6E65, 0x9CA3,
+ 0x6E66, 0x9CA4,
+ 0x6E67, 0x9CA5,
+ 0x6E68, 0x9CA6,
+ 0x6E69, 0x9CA7,
+ 0x6E6A, 0x9CA8,
+ 0x6E6C, 0x9CA9,
+ 0x6E6D, 0x9CAA,
+ 0x6E6F, 0x9CAB,
+ 0x6E70, 0x9CAC,
+ 0x6E71, 0x9CAD,
+ 0x6E72, 0x9CAE,
+ 0x6E73, 0x9CAF,
+ 0x6E74, 0x9CB0,
+ 0x6E75, 0x9CB1,
+ 0x6E76, 0x9CB2,
+ 0x6E77, 0x9CB3,
+ 0x6E78, 0x9CB4,
+ 0x6E79, 0x9CB5,
+ 0x6E7A, 0x9CB6,
+ 0x6E7B, 0x9CB7,
+ 0x6E7C, 0x9CB8,
+ 0x6E7D, 0x9CB9,
+ 0x6E80, 0x9CBA,
+ 0x6E81, 0x9CBB,
+ 0x6E82, 0x9CBC,
+ 0x6E84, 0x9CBD,
+ 0x6E87, 0x9CBE,
+ 0x6E88, 0x9CBF,
+ 0x6E8A, 0x9CC0,
+ 0x6E8B, 0x9CC1,
+ 0x6E8C, 0x9CC2,
+ 0x6E8D, 0x9CC3,
+ 0x6E8E, 0x9CC4,
+ 0x6E91, 0x9CC5,
+ 0x6E92, 0x9CC6,
+ 0x6E93, 0x9CC7,
+ 0x6E94, 0x9CC8,
+ 0x6E95, 0x9CC9,
+ 0x6E96, 0x9CCA,
+ 0x6E97, 0x9CCB,
+ 0x6E99, 0x9CCC,
+ 0x6E9A, 0x9CCD,
+ 0x6E9B, 0x9CCE,
+ 0x6E9D, 0x9CCF,
+ 0x6E9E, 0x9CD0,
+ 0x6EA0, 0x9CD1,
+ 0x6EA1, 0x9CD2,
+ 0x6EA3, 0x9CD3,
+ 0x6EA4, 0x9CD4,
+ 0x6EA6, 0x9CD5,
+ 0x6EA8, 0x9CD6,
+ 0x6EA9, 0x9CD7,
+ 0x6EAB, 0x9CD8,
+ 0x6EAC, 0x9CD9,
+ 0x6EAD, 0x9CDA,
+ 0x6EAE, 0x9CDB,
+ 0x6EB0, 0x9CDC,
+ 0x6EB3, 0x9CDD,
+ 0x6EB5, 0x9CDE,
+ 0x6EB8, 0x9CDF,
+ 0x6EB9, 0x9CE0,
+ 0x6EBC, 0x9CE1,
+ 0x6EBE, 0x9CE2,
+ 0x6EBF, 0x9CE3,
+ 0x6EC0, 0x9CE4,
+ 0x6EC3, 0x9CE5,
+ 0x6EC4, 0x9CE6,
+ 0x6EC5, 0x9CE7,
+ 0x6EC6, 0x9CE8,
+ 0x6EC8, 0x9CE9,
+ 0x6EC9, 0x9CEA,
+ 0x6ECA, 0x9CEB,
+ 0x6ECC, 0x9CEC,
+ 0x6ECD, 0x9CED,
+ 0x6ECE, 0x9CEE,
+ 0x6ED0, 0x9CEF,
+ 0x6ED2, 0x9CF0,
+ 0x6ED6, 0x9CF1,
+ 0x6ED8, 0x9CF2,
+ 0x6ED9, 0x9CF3,
+ 0x6EDB, 0x9CF4,
+ 0x6EDC, 0x9CF5,
+ 0x6EDD, 0x9CF6,
+ 0x6EE3, 0x9CF7,
+ 0x6EE7, 0x9CF8,
+ 0x6EEA, 0x9CF9,
+ 0x6EEB, 0x9CFA,
+ 0x6EEC, 0x9CFB,
+ 0x6EED, 0x9CFC,
+ 0x6EEE, 0x9CFD,
+ 0x6EEF, 0x9CFE,
+ 0x6EF0, 0x9D40,
+ 0x6EF1, 0x9D41,
+ 0x6EF2, 0x9D42,
+ 0x6EF3, 0x9D43,
+ 0x6EF5, 0x9D44,
+ 0x6EF6, 0x9D45,
+ 0x6EF7, 0x9D46,
+ 0x6EF8, 0x9D47,
+ 0x6EFA, 0x9D48,
+ 0x6EFB, 0x9D49,
+ 0x6EFC, 0x9D4A,
+ 0x6EFD, 0x9D4B,
+ 0x6EFE, 0x9D4C,
+ 0x6EFF, 0x9D4D,
+ 0x6F00, 0x9D4E,
+ 0x6F01, 0x9D4F,
+ 0x6F03, 0x9D50,
+ 0x6F04, 0x9D51,
+ 0x6F05, 0x9D52,
+ 0x6F07, 0x9D53,
+ 0x6F08, 0x9D54,
+ 0x6F0A, 0x9D55,
+ 0x6F0B, 0x9D56,
+ 0x6F0C, 0x9D57,
+ 0x6F0D, 0x9D58,
+ 0x6F0E, 0x9D59,
+ 0x6F10, 0x9D5A,
+ 0x6F11, 0x9D5B,
+ 0x6F12, 0x9D5C,
+ 0x6F16, 0x9D5D,
+ 0x6F17, 0x9D5E,
+ 0x6F18, 0x9D5F,
+ 0x6F19, 0x9D60,
+ 0x6F1A, 0x9D61,
+ 0x6F1B, 0x9D62,
+ 0x6F1C, 0x9D63,
+ 0x6F1D, 0x9D64,
+ 0x6F1E, 0x9D65,
+ 0x6F1F, 0x9D66,
+ 0x6F21, 0x9D67,
+ 0x6F22, 0x9D68,
+ 0x6F23, 0x9D69,
+ 0x6F25, 0x9D6A,
+ 0x6F26, 0x9D6B,
+ 0x6F27, 0x9D6C,
+ 0x6F28, 0x9D6D,
+ 0x6F2C, 0x9D6E,
+ 0x6F2E, 0x9D6F,
+ 0x6F30, 0x9D70,
+ 0x6F32, 0x9D71,
+ 0x6F34, 0x9D72,
+ 0x6F35, 0x9D73,
+ 0x6F37, 0x9D74,
+ 0x6F38, 0x9D75,
+ 0x6F39, 0x9D76,
+ 0x6F3A, 0x9D77,
+ 0x6F3B, 0x9D78,
+ 0x6F3C, 0x9D79,
+ 0x6F3D, 0x9D7A,
+ 0x6F3F, 0x9D7B,
+ 0x6F40, 0x9D7C,
+ 0x6F41, 0x9D7D,
+ 0x6F42, 0x9D7E,
+ 0x6F43, 0x9D80,
+ 0x6F44, 0x9D81,
+ 0x6F45, 0x9D82,
+ 0x6F48, 0x9D83,
+ 0x6F49, 0x9D84,
+ 0x6F4A, 0x9D85,
+ 0x6F4C, 0x9D86,
+ 0x6F4E, 0x9D87,
+ 0x6F4F, 0x9D88,
+ 0x6F50, 0x9D89,
+ 0x6F51, 0x9D8A,
+ 0x6F52, 0x9D8B,
+ 0x6F53, 0x9D8C,
+ 0x6F54, 0x9D8D,
+ 0x6F55, 0x9D8E,
+ 0x6F56, 0x9D8F,
+ 0x6F57, 0x9D90,
+ 0x6F59, 0x9D91,
+ 0x6F5A, 0x9D92,
+ 0x6F5B, 0x9D93,
+ 0x6F5D, 0x9D94,
+ 0x6F5F, 0x9D95,
+ 0x6F60, 0x9D96,
+ 0x6F61, 0x9D97,
+ 0x6F63, 0x9D98,
+ 0x6F64, 0x9D99,
+ 0x6F65, 0x9D9A,
+ 0x6F67, 0x9D9B,
+ 0x6F68, 0x9D9C,
+ 0x6F69, 0x9D9D,
+ 0x6F6A, 0x9D9E,
+ 0x6F6B, 0x9D9F,
+ 0x6F6C, 0x9DA0,
+ 0x6F6F, 0x9DA1,
+ 0x6F70, 0x9DA2,
+ 0x6F71, 0x9DA3,
+ 0x6F73, 0x9DA4,
+ 0x6F75, 0x9DA5,
+ 0x6F76, 0x9DA6,
+ 0x6F77, 0x9DA7,
+ 0x6F79, 0x9DA8,
+ 0x6F7B, 0x9DA9,
+ 0x6F7D, 0x9DAA,
+ 0x6F7E, 0x9DAB,
+ 0x6F7F, 0x9DAC,
+ 0x6F80, 0x9DAD,
+ 0x6F81, 0x9DAE,
+ 0x6F82, 0x9DAF,
+ 0x6F83, 0x9DB0,
+ 0x6F85, 0x9DB1,
+ 0x6F86, 0x9DB2,
+ 0x6F87, 0x9DB3,
+ 0x6F8A, 0x9DB4,
+ 0x6F8B, 0x9DB5,
+ 0x6F8F, 0x9DB6,
+ 0x6F90, 0x9DB7,
+ 0x6F91, 0x9DB8,
+ 0x6F92, 0x9DB9,
+ 0x6F93, 0x9DBA,
+ 0x6F94, 0x9DBB,
+ 0x6F95, 0x9DBC,
+ 0x6F96, 0x9DBD,
+ 0x6F97, 0x9DBE,
+ 0x6F98, 0x9DBF,
+ 0x6F99, 0x9DC0,
+ 0x6F9A, 0x9DC1,
+ 0x6F9B, 0x9DC2,
+ 0x6F9D, 0x9DC3,
+ 0x6F9E, 0x9DC4,
+ 0x6F9F, 0x9DC5,
+ 0x6FA0, 0x9DC6,
+ 0x6FA2, 0x9DC7,
+ 0x6FA3, 0x9DC8,
+ 0x6FA4, 0x9DC9,
+ 0x6FA5, 0x9DCA,
+ 0x6FA6, 0x9DCB,
+ 0x6FA8, 0x9DCC,
+ 0x6FA9, 0x9DCD,
+ 0x6FAA, 0x9DCE,
+ 0x6FAB, 0x9DCF,
+ 0x6FAC, 0x9DD0,
+ 0x6FAD, 0x9DD1,
+ 0x6FAE, 0x9DD2,
+ 0x6FAF, 0x9DD3,
+ 0x6FB0, 0x9DD4,
+ 0x6FB1, 0x9DD5,
+ 0x6FB2, 0x9DD6,
+ 0x6FB4, 0x9DD7,
+ 0x6FB5, 0x9DD8,
+ 0x6FB7, 0x9DD9,
+ 0x6FB8, 0x9DDA,
+ 0x6FBA, 0x9DDB,
+ 0x6FBB, 0x9DDC,
+ 0x6FBC, 0x9DDD,
+ 0x6FBD, 0x9DDE,
+ 0x6FBE, 0x9DDF,
+ 0x6FBF, 0x9DE0,
+ 0x6FC1, 0x9DE1,
+ 0x6FC3, 0x9DE2,
+ 0x6FC4, 0x9DE3,
+ 0x6FC5, 0x9DE4,
+ 0x6FC6, 0x9DE5,
+ 0x6FC7, 0x9DE6,
+ 0x6FC8, 0x9DE7,
+ 0x6FCA, 0x9DE8,
+ 0x6FCB, 0x9DE9,
+ 0x6FCC, 0x9DEA,
+ 0x6FCD, 0x9DEB,
+ 0x6FCE, 0x9DEC,
+ 0x6FCF, 0x9DED,
+ 0x6FD0, 0x9DEE,
+ 0x6FD3, 0x9DEF,
+ 0x6FD4, 0x9DF0,
+ 0x6FD5, 0x9DF1,
+ 0x6FD6, 0x9DF2,
+ 0x6FD7, 0x9DF3,
+ 0x6FD8, 0x9DF4,
+ 0x6FD9, 0x9DF5,
+ 0x6FDA, 0x9DF6,
+ 0x6FDB, 0x9DF7,
+ 0x6FDC, 0x9DF8,
+ 0x6FDD, 0x9DF9,
+ 0x6FDF, 0x9DFA,
+ 0x6FE2, 0x9DFB,
+ 0x6FE3, 0x9DFC,
+ 0x6FE4, 0x9DFD,
+ 0x6FE5, 0x9DFE,
+ 0x6FE6, 0x9E40,
+ 0x6FE7, 0x9E41,
+ 0x6FE8, 0x9E42,
+ 0x6FE9, 0x9E43,
+ 0x6FEA, 0x9E44,
+ 0x6FEB, 0x9E45,
+ 0x6FEC, 0x9E46,
+ 0x6FED, 0x9E47,
+ 0x6FF0, 0x9E48,
+ 0x6FF1, 0x9E49,
+ 0x6FF2, 0x9E4A,
+ 0x6FF3, 0x9E4B,
+ 0x6FF4, 0x9E4C,
+ 0x6FF5, 0x9E4D,
+ 0x6FF6, 0x9E4E,
+ 0x6FF7, 0x9E4F,
+ 0x6FF8, 0x9E50,
+ 0x6FF9, 0x9E51,
+ 0x6FFA, 0x9E52,
+ 0x6FFB, 0x9E53,
+ 0x6FFC, 0x9E54,
+ 0x6FFD, 0x9E55,
+ 0x6FFE, 0x9E56,
+ 0x6FFF, 0x9E57,
+ 0x7000, 0x9E58,
+ 0x7001, 0x9E59,
+ 0x7002, 0x9E5A,
+ 0x7003, 0x9E5B,
+ 0x7004, 0x9E5C,
+ 0x7005, 0x9E5D,
+ 0x7006, 0x9E5E,
+ 0x7007, 0x9E5F,
+ 0x7008, 0x9E60,
+ 0x7009, 0x9E61,
+ 0x700A, 0x9E62,
+ 0x700B, 0x9E63,
+ 0x700C, 0x9E64,
+ 0x700D, 0x9E65,
+ 0x700E, 0x9E66,
+ 0x700F, 0x9E67,
+ 0x7010, 0x9E68,
+ 0x7012, 0x9E69,
+ 0x7013, 0x9E6A,
+ 0x7014, 0x9E6B,
+ 0x7015, 0x9E6C,
+ 0x7016, 0x9E6D,
+ 0x7017, 0x9E6E,
+ 0x7018, 0x9E6F,
+ 0x7019, 0x9E70,
+ 0x701C, 0x9E71,
+ 0x701D, 0x9E72,
+ 0x701E, 0x9E73,
+ 0x701F, 0x9E74,
+ 0x7020, 0x9E75,
+ 0x7021, 0x9E76,
+ 0x7022, 0x9E77,
+ 0x7024, 0x9E78,
+ 0x7025, 0x9E79,
+ 0x7026, 0x9E7A,
+ 0x7027, 0x9E7B,
+ 0x7028, 0x9E7C,
+ 0x7029, 0x9E7D,
+ 0x702A, 0x9E7E,
+ 0x702B, 0x9E80,
+ 0x702C, 0x9E81,
+ 0x702D, 0x9E82,
+ 0x702E, 0x9E83,
+ 0x702F, 0x9E84,
+ 0x7030, 0x9E85,
+ 0x7031, 0x9E86,
+ 0x7032, 0x9E87,
+ 0x7033, 0x9E88,
+ 0x7034, 0x9E89,
+ 0x7036, 0x9E8A,
+ 0x7037, 0x9E8B,
+ 0x7038, 0x9E8C,
+ 0x703A, 0x9E8D,
+ 0x703B, 0x9E8E,
+ 0x703C, 0x9E8F,
+ 0x703D, 0x9E90,
+ 0x703E, 0x9E91,
+ 0x703F, 0x9E92,
+ 0x7040, 0x9E93,
+ 0x7041, 0x9E94,
+ 0x7042, 0x9E95,
+ 0x7043, 0x9E96,
+ 0x7044, 0x9E97,
+ 0x7045, 0x9E98,
+ 0x7046, 0x9E99,
+ 0x7047, 0x9E9A,
+ 0x7048, 0x9E9B,
+ 0x7049, 0x9E9C,
+ 0x704A, 0x9E9D,
+ 0x704B, 0x9E9E,
+ 0x704D, 0x9E9F,
+ 0x704E, 0x9EA0,
+ 0x7050, 0x9EA1,
+ 0x7051, 0x9EA2,
+ 0x7052, 0x9EA3,
+ 0x7053, 0x9EA4,
+ 0x7054, 0x9EA5,
+ 0x7055, 0x9EA6,
+ 0x7056, 0x9EA7,
+ 0x7057, 0x9EA8,
+ 0x7058, 0x9EA9,
+ 0x7059, 0x9EAA,
+ 0x705A, 0x9EAB,
+ 0x705B, 0x9EAC,
+ 0x705C, 0x9EAD,
+ 0x705D, 0x9EAE,
+ 0x705F, 0x9EAF,
+ 0x7060, 0x9EB0,
+ 0x7061, 0x9EB1,
+ 0x7062, 0x9EB2,
+ 0x7063, 0x9EB3,
+ 0x7064, 0x9EB4,
+ 0x7065, 0x9EB5,
+ 0x7066, 0x9EB6,
+ 0x7067, 0x9EB7,
+ 0x7068, 0x9EB8,
+ 0x7069, 0x9EB9,
+ 0x706A, 0x9EBA,
+ 0x706E, 0x9EBB,
+ 0x7071, 0x9EBC,
+ 0x7072, 0x9EBD,
+ 0x7073, 0x9EBE,
+ 0x7074, 0x9EBF,
+ 0x7077, 0x9EC0,
+ 0x7079, 0x9EC1,
+ 0x707A, 0x9EC2,
+ 0x707B, 0x9EC3,
+ 0x707D, 0x9EC4,
+ 0x7081, 0x9EC5,
+ 0x7082, 0x9EC6,
+ 0x7083, 0x9EC7,
+ 0x7084, 0x9EC8,
+ 0x7086, 0x9EC9,
+ 0x7087, 0x9ECA,
+ 0x7088, 0x9ECB,
+ 0x708B, 0x9ECC,
+ 0x708C, 0x9ECD,
+ 0x708D, 0x9ECE,
+ 0x708F, 0x9ECF,
+ 0x7090, 0x9ED0,
+ 0x7091, 0x9ED1,
+ 0x7093, 0x9ED2,
+ 0x7097, 0x9ED3,
+ 0x7098, 0x9ED4,
+ 0x709A, 0x9ED5,
+ 0x709B, 0x9ED6,
+ 0x709E, 0x9ED7,
+ 0x709F, 0x9ED8,
+ 0x70A0, 0x9ED9,
+ 0x70A1, 0x9EDA,
+ 0x70A2, 0x9EDB,
+ 0x70A3, 0x9EDC,
+ 0x70A4, 0x9EDD,
+ 0x70A5, 0x9EDE,
+ 0x70A6, 0x9EDF,
+ 0x70A7, 0x9EE0,
+ 0x70A8, 0x9EE1,
+ 0x70A9, 0x9EE2,
+ 0x70AA, 0x9EE3,
+ 0x70B0, 0x9EE4,
+ 0x70B2, 0x9EE5,
+ 0x70B4, 0x9EE6,
+ 0x70B5, 0x9EE7,
+ 0x70B6, 0x9EE8,
+ 0x70BA, 0x9EE9,
+ 0x70BE, 0x9EEA,
+ 0x70BF, 0x9EEB,
+ 0x70C4, 0x9EEC,
+ 0x70C5, 0x9EED,
+ 0x70C6, 0x9EEE,
+ 0x70C7, 0x9EEF,
+ 0x70C9, 0x9EF0,
+ 0x70CB, 0x9EF1,
+ 0x70CC, 0x9EF2,
+ 0x70CD, 0x9EF3,
+ 0x70CE, 0x9EF4,
+ 0x70CF, 0x9EF5,
+ 0x70D0, 0x9EF6,
+ 0x70D1, 0x9EF7,
+ 0x70D2, 0x9EF8,
+ 0x70D3, 0x9EF9,
+ 0x70D4, 0x9EFA,
+ 0x70D5, 0x9EFB,
+ 0x70D6, 0x9EFC,
+ 0x70D7, 0x9EFD,
+ 0x70DA, 0x9EFE,
+ 0x70DC, 0x9F40,
+ 0x70DD, 0x9F41,
+ 0x70DE, 0x9F42,
+ 0x70E0, 0x9F43,
+ 0x70E1, 0x9F44,
+ 0x70E2, 0x9F45,
+ 0x70E3, 0x9F46,
+ 0x70E5, 0x9F47,
+ 0x70EA, 0x9F48,
+ 0x70EE, 0x9F49,
+ 0x70F0, 0x9F4A,
+ 0x70F1, 0x9F4B,
+ 0x70F2, 0x9F4C,
+ 0x70F3, 0x9F4D,
+ 0x70F4, 0x9F4E,
+ 0x70F5, 0x9F4F,
+ 0x70F6, 0x9F50,
+ 0x70F8, 0x9F51,
+ 0x70FA, 0x9F52,
+ 0x70FB, 0x9F53,
+ 0x70FC, 0x9F54,
+ 0x70FE, 0x9F55,
+ 0x70FF, 0x9F56,
+ 0x7100, 0x9F57,
+ 0x7101, 0x9F58,
+ 0x7102, 0x9F59,
+ 0x7103, 0x9F5A,
+ 0x7104, 0x9F5B,
+ 0x7105, 0x9F5C,
+ 0x7106, 0x9F5D,
+ 0x7107, 0x9F5E,
+ 0x7108, 0x9F5F,
+ 0x710B, 0x9F60,
+ 0x710C, 0x9F61,
+ 0x710D, 0x9F62,
+ 0x710E, 0x9F63,
+ 0x710F, 0x9F64,
+ 0x7111, 0x9F65,
+ 0x7112, 0x9F66,
+ 0x7114, 0x9F67,
+ 0x7117, 0x9F68,
+ 0x711B, 0x9F69,
+ 0x711C, 0x9F6A,
+ 0x711D, 0x9F6B,
+ 0x711E, 0x9F6C,
+ 0x711F, 0x9F6D,
+ 0x7120, 0x9F6E,
+ 0x7121, 0x9F6F,
+ 0x7122, 0x9F70,
+ 0x7123, 0x9F71,
+ 0x7124, 0x9F72,
+ 0x7125, 0x9F73,
+ 0x7127, 0x9F74,
+ 0x7128, 0x9F75,
+ 0x7129, 0x9F76,
+ 0x712A, 0x9F77,
+ 0x712B, 0x9F78,
+ 0x712C, 0x9F79,
+ 0x712D, 0x9F7A,
+ 0x712E, 0x9F7B,
+ 0x7132, 0x9F7C,
+ 0x7133, 0x9F7D,
+ 0x7134, 0x9F7E,
+ 0x7135, 0x9F80,
+ 0x7137, 0x9F81,
+ 0x7138, 0x9F82,
+ 0x7139, 0x9F83,
+ 0x713A, 0x9F84,
+ 0x713B, 0x9F85,
+ 0x713C, 0x9F86,
+ 0x713D, 0x9F87,
+ 0x713E, 0x9F88,
+ 0x713F, 0x9F89,
+ 0x7140, 0x9F8A,
+ 0x7141, 0x9F8B,
+ 0x7142, 0x9F8C,
+ 0x7143, 0x9F8D,
+ 0x7144, 0x9F8E,
+ 0x7146, 0x9F8F,
+ 0x7147, 0x9F90,
+ 0x7148, 0x9F91,
+ 0x7149, 0x9F92,
+ 0x714B, 0x9F93,
+ 0x714D, 0x9F94,
+ 0x714F, 0x9F95,
+ 0x7150, 0x9F96,
+ 0x7151, 0x9F97,
+ 0x7152, 0x9F98,
+ 0x7153, 0x9F99,
+ 0x7154, 0x9F9A,
+ 0x7155, 0x9F9B,
+ 0x7156, 0x9F9C,
+ 0x7157, 0x9F9D,
+ 0x7158, 0x9F9E,
+ 0x7159, 0x9F9F,
+ 0x715A, 0x9FA0,
+ 0x715B, 0x9FA1,
+ 0x715D, 0x9FA2,
+ 0x715F, 0x9FA3,
+ 0x7160, 0x9FA4,
+ 0x7161, 0x9FA5,
+ 0x7162, 0x9FA6,
+ 0x7163, 0x9FA7,
+ 0x7165, 0x9FA8,
+ 0x7169, 0x9FA9,
+ 0x716A, 0x9FAA,
+ 0x716B, 0x9FAB,
+ 0x716C, 0x9FAC,
+ 0x716D, 0x9FAD,
+ 0x716F, 0x9FAE,
+ 0x7170, 0x9FAF,
+ 0x7171, 0x9FB0,
+ 0x7174, 0x9FB1,
+ 0x7175, 0x9FB2,
+ 0x7176, 0x9FB3,
+ 0x7177, 0x9FB4,
+ 0x7179, 0x9FB5,
+ 0x717B, 0x9FB6,
+ 0x717C, 0x9FB7,
+ 0x717E, 0x9FB8,
+ 0x717F, 0x9FB9,
+ 0x7180, 0x9FBA,
+ 0x7181, 0x9FBB,
+ 0x7182, 0x9FBC,
+ 0x7183, 0x9FBD,
+ 0x7185, 0x9FBE,
+ 0x7186, 0x9FBF,
+ 0x7187, 0x9FC0,
+ 0x7188, 0x9FC1,
+ 0x7189, 0x9FC2,
+ 0x718B, 0x9FC3,
+ 0x718C, 0x9FC4,
+ 0x718D, 0x9FC5,
+ 0x718E, 0x9FC6,
+ 0x7190, 0x9FC7,
+ 0x7191, 0x9FC8,
+ 0x7192, 0x9FC9,
+ 0x7193, 0x9FCA,
+ 0x7195, 0x9FCB,
+ 0x7196, 0x9FCC,
+ 0x7197, 0x9FCD,
+ 0x719A, 0x9FCE,
+ 0x719B, 0x9FCF,
+ 0x719C, 0x9FD0,
+ 0x719D, 0x9FD1,
+ 0x719E, 0x9FD2,
+ 0x71A1, 0x9FD3,
+ 0x71A2, 0x9FD4,
+ 0x71A3, 0x9FD5,
+ 0x71A4, 0x9FD6,
+ 0x71A5, 0x9FD7,
+ 0x71A6, 0x9FD8,
+ 0x71A7, 0x9FD9,
+ 0x71A9, 0x9FDA,
+ 0x71AA, 0x9FDB,
+ 0x71AB, 0x9FDC,
+ 0x71AD, 0x9FDD,
+ 0x71AE, 0x9FDE,
+ 0x71AF, 0x9FDF,
+ 0x71B0, 0x9FE0,
+ 0x71B1, 0x9FE1,
+ 0x71B2, 0x9FE2,
+ 0x71B4, 0x9FE3,
+ 0x71B6, 0x9FE4,
+ 0x71B7, 0x9FE5,
+ 0x71B8, 0x9FE6,
+ 0x71BA, 0x9FE7,
+ 0x71BB, 0x9FE8,
+ 0x71BC, 0x9FE9,
+ 0x71BD, 0x9FEA,
+ 0x71BE, 0x9FEB,
+ 0x71BF, 0x9FEC,
+ 0x71C0, 0x9FED,
+ 0x71C1, 0x9FEE,
+ 0x71C2, 0x9FEF,
+ 0x71C4, 0x9FF0,
+ 0x71C5, 0x9FF1,
+ 0x71C6, 0x9FF2,
+ 0x71C7, 0x9FF3,
+ 0x71C8, 0x9FF4,
+ 0x71C9, 0x9FF5,
+ 0x71CA, 0x9FF6,
+ 0x71CB, 0x9FF7,
+ 0x71CC, 0x9FF8,
+ 0x71CD, 0x9FF9,
+ 0x71CF, 0x9FFA,
+ 0x71D0, 0x9FFB,
+ 0x71D1, 0x9FFC,
+ 0x71D2, 0x9FFD,
+ 0x71D3, 0x9FFE,
+ 0x71D6, 0xA040,
+ 0x71D7, 0xA041,
+ 0x71D8, 0xA042,
+ 0x71D9, 0xA043,
+ 0x71DA, 0xA044,
+ 0x71DB, 0xA045,
+ 0x71DC, 0xA046,
+ 0x71DD, 0xA047,
+ 0x71DE, 0xA048,
+ 0x71DF, 0xA049,
+ 0x71E1, 0xA04A,
+ 0x71E2, 0xA04B,
+ 0x71E3, 0xA04C,
+ 0x71E4, 0xA04D,
+ 0x71E6, 0xA04E,
+ 0x71E8, 0xA04F,
+ 0x71E9, 0xA050,
+ 0x71EA, 0xA051,
+ 0x71EB, 0xA052,
+ 0x71EC, 0xA053,
+ 0x71ED, 0xA054,
+ 0x71EF, 0xA055,
+ 0x71F0, 0xA056,
+ 0x71F1, 0xA057,
+ 0x71F2, 0xA058,
+ 0x71F3, 0xA059,
+ 0x71F4, 0xA05A,
+ 0x71F5, 0xA05B,
+ 0x71F6, 0xA05C,
+ 0x71F7, 0xA05D,
+ 0x71F8, 0xA05E,
+ 0x71FA, 0xA05F,
+ 0x71FB, 0xA060,
+ 0x71FC, 0xA061,
+ 0x71FD, 0xA062,
+ 0x71FE, 0xA063,
+ 0x71FF, 0xA064,
+ 0x7200, 0xA065,
+ 0x7201, 0xA066,
+ 0x7202, 0xA067,
+ 0x7203, 0xA068,
+ 0x7204, 0xA069,
+ 0x7205, 0xA06A,
+ 0x7207, 0xA06B,
+ 0x7208, 0xA06C,
+ 0x7209, 0xA06D,
+ 0x720A, 0xA06E,
+ 0x720B, 0xA06F,
+ 0x720C, 0xA070,
+ 0x720D, 0xA071,
+ 0x720E, 0xA072,
+ 0x720F, 0xA073,
+ 0x7210, 0xA074,
+ 0x7211, 0xA075,
+ 0x7212, 0xA076,
+ 0x7213, 0xA077,
+ 0x7214, 0xA078,
+ 0x7215, 0xA079,
+ 0x7216, 0xA07A,
+ 0x7217, 0xA07B,
+ 0x7218, 0xA07C,
+ 0x7219, 0xA07D,
+ 0x721A, 0xA07E,
+ 0x721B, 0xA080,
+ 0x721C, 0xA081,
+ 0x721E, 0xA082,
+ 0x721F, 0xA083,
+ 0x7220, 0xA084,
+ 0x7221, 0xA085,
+ 0x7222, 0xA086,
+ 0x7223, 0xA087,
+ 0x7224, 0xA088,
+ 0x7225, 0xA089,
+ 0x7226, 0xA08A,
+ 0x7227, 0xA08B,
+ 0x7229, 0xA08C,
+ 0x722B, 0xA08D,
+ 0x722D, 0xA08E,
+ 0x722E, 0xA08F,
+ 0x722F, 0xA090,
+ 0x7232, 0xA091,
+ 0x7233, 0xA092,
+ 0x7234, 0xA093,
+ 0x723A, 0xA094,
+ 0x723C, 0xA095,
+ 0x723E, 0xA096,
+ 0x7240, 0xA097,
+ 0x7241, 0xA098,
+ 0x7242, 0xA099,
+ 0x7243, 0xA09A,
+ 0x7244, 0xA09B,
+ 0x7245, 0xA09C,
+ 0x7246, 0xA09D,
+ 0x7249, 0xA09E,
+ 0x724A, 0xA09F,
+ 0x724B, 0xA0A0,
+ 0x724E, 0xA0A1,
+ 0x724F, 0xA0A2,
+ 0x7250, 0xA0A3,
+ 0x7251, 0xA0A4,
+ 0x7253, 0xA0A5,
+ 0x7254, 0xA0A6,
+ 0x7255, 0xA0A7,
+ 0x7257, 0xA0A8,
+ 0x7258, 0xA0A9,
+ 0x725A, 0xA0AA,
+ 0x725C, 0xA0AB,
+ 0x725E, 0xA0AC,
+ 0x7260, 0xA0AD,
+ 0x7263, 0xA0AE,
+ 0x7264, 0xA0AF,
+ 0x7265, 0xA0B0,
+ 0x7268, 0xA0B1,
+ 0x726A, 0xA0B2,
+ 0x726B, 0xA0B3,
+ 0x726C, 0xA0B4,
+ 0x726D, 0xA0B5,
+ 0x7270, 0xA0B6,
+ 0x7271, 0xA0B7,
+ 0x7273, 0xA0B8,
+ 0x7274, 0xA0B9,
+ 0x7276, 0xA0BA,
+ 0x7277, 0xA0BB,
+ 0x7278, 0xA0BC,
+ 0x727B, 0xA0BD,
+ 0x727C, 0xA0BE,
+ 0x727D, 0xA0BF,
+ 0x7282, 0xA0C0,
+ 0x7283, 0xA0C1,
+ 0x7285, 0xA0C2,
+ 0x7286, 0xA0C3,
+ 0x7287, 0xA0C4,
+ 0x7288, 0xA0C5,
+ 0x7289, 0xA0C6,
+ 0x728C, 0xA0C7,
+ 0x728E, 0xA0C8,
+ 0x7290, 0xA0C9,
+ 0x7291, 0xA0CA,
+ 0x7293, 0xA0CB,
+ 0x7294, 0xA0CC,
+ 0x7295, 0xA0CD,
+ 0x7296, 0xA0CE,
+ 0x7297, 0xA0CF,
+ 0x7298, 0xA0D0,
+ 0x7299, 0xA0D1,
+ 0x729A, 0xA0D2,
+ 0x729B, 0xA0D3,
+ 0x729C, 0xA0D4,
+ 0x729D, 0xA0D5,
+ 0x729E, 0xA0D6,
+ 0x72A0, 0xA0D7,
+ 0x72A1, 0xA0D8,
+ 0x72A2, 0xA0D9,
+ 0x72A3, 0xA0DA,
+ 0x72A4, 0xA0DB,
+ 0x72A5, 0xA0DC,
+ 0x72A6, 0xA0DD,
+ 0x72A7, 0xA0DE,
+ 0x72A8, 0xA0DF,
+ 0x72A9, 0xA0E0,
+ 0x72AA, 0xA0E1,
+ 0x72AB, 0xA0E2,
+ 0x72AE, 0xA0E3,
+ 0x72B1, 0xA0E4,
+ 0x72B2, 0xA0E5,
+ 0x72B3, 0xA0E6,
+ 0x72B5, 0xA0E7,
+ 0x72BA, 0xA0E8,
+ 0x72BB, 0xA0E9,
+ 0x72BC, 0xA0EA,
+ 0x72BD, 0xA0EB,
+ 0x72BE, 0xA0EC,
+ 0x72BF, 0xA0ED,
+ 0x72C0, 0xA0EE,
+ 0x72C5, 0xA0EF,
+ 0x72C6, 0xA0F0,
+ 0x72C7, 0xA0F1,
+ 0x72C9, 0xA0F2,
+ 0x72CA, 0xA0F3,
+ 0x72CB, 0xA0F4,
+ 0x72CC, 0xA0F5,
+ 0x72CF, 0xA0F6,
+ 0x72D1, 0xA0F7,
+ 0x72D3, 0xA0F8,
+ 0x72D4, 0xA0F9,
+ 0x72D5, 0xA0FA,
+ 0x72D6, 0xA0FB,
+ 0x72D8, 0xA0FC,
+ 0x72DA, 0xA0FD,
+ 0x72DB, 0xA0FE,
+ 0x72DC, 0xAA40,
+ 0x72DD, 0xAA41,
+ 0x72DF, 0xAA42,
+ 0x72E2, 0xAA43,
+ 0x72E3, 0xAA44,
+ 0x72E4, 0xAA45,
+ 0x72E5, 0xAA46,
+ 0x72E6, 0xAA47,
+ 0x72E7, 0xAA48,
+ 0x72EA, 0xAA49,
+ 0x72EB, 0xAA4A,
+ 0x72F5, 0xAA4B,
+ 0x72F6, 0xAA4C,
+ 0x72F9, 0xAA4D,
+ 0x72FD, 0xAA4E,
+ 0x72FE, 0xAA4F,
+ 0x72FF, 0xAA50,
+ 0x7300, 0xAA51,
+ 0x7302, 0xAA52,
+ 0x7304, 0xAA53,
+ 0x7305, 0xAA54,
+ 0x7306, 0xAA55,
+ 0x7307, 0xAA56,
+ 0x7308, 0xAA57,
+ 0x7309, 0xAA58,
+ 0x730B, 0xAA59,
+ 0x730C, 0xAA5A,
+ 0x730D, 0xAA5B,
+ 0x730F, 0xAA5C,
+ 0x7310, 0xAA5D,
+ 0x7311, 0xAA5E,
+ 0x7312, 0xAA5F,
+ 0x7314, 0xAA60,
+ 0x7318, 0xAA61,
+ 0x7319, 0xAA62,
+ 0x731A, 0xAA63,
+ 0x731F, 0xAA64,
+ 0x7320, 0xAA65,
+ 0x7323, 0xAA66,
+ 0x7324, 0xAA67,
+ 0x7326, 0xAA68,
+ 0x7327, 0xAA69,
+ 0x7328, 0xAA6A,
+ 0x732D, 0xAA6B,
+ 0x732F, 0xAA6C,
+ 0x7330, 0xAA6D,
+ 0x7332, 0xAA6E,
+ 0x7333, 0xAA6F,
+ 0x7335, 0xAA70,
+ 0x7336, 0xAA71,
+ 0x733A, 0xAA72,
+ 0x733B, 0xAA73,
+ 0x733C, 0xAA74,
+ 0x733D, 0xAA75,
+ 0x7340, 0xAA76,
+ 0x7341, 0xAA77,
+ 0x7342, 0xAA78,
+ 0x7343, 0xAA79,
+ 0x7344, 0xAA7A,
+ 0x7345, 0xAA7B,
+ 0x7346, 0xAA7C,
+ 0x7347, 0xAA7D,
+ 0x7348, 0xAA7E,
+ 0x7349, 0xAA80,
+ 0x734A, 0xAA81,
+ 0x734B, 0xAA82,
+ 0x734C, 0xAA83,
+ 0x734E, 0xAA84,
+ 0x734F, 0xAA85,
+ 0x7351, 0xAA86,
+ 0x7353, 0xAA87,
+ 0x7354, 0xAA88,
+ 0x7355, 0xAA89,
+ 0x7356, 0xAA8A,
+ 0x7358, 0xAA8B,
+ 0x7359, 0xAA8C,
+ 0x735A, 0xAA8D,
+ 0x735B, 0xAA8E,
+ 0x735C, 0xAA8F,
+ 0x735D, 0xAA90,
+ 0x735E, 0xAA91,
+ 0x735F, 0xAA92,
+ 0x7361, 0xAA93,
+ 0x7362, 0xAA94,
+ 0x7363, 0xAA95,
+ 0x7364, 0xAA96,
+ 0x7365, 0xAA97,
+ 0x7366, 0xAA98,
+ 0x7367, 0xAA99,
+ 0x7368, 0xAA9A,
+ 0x7369, 0xAA9B,
+ 0x736A, 0xAA9C,
+ 0x736B, 0xAA9D,
+ 0x736E, 0xAA9E,
+ 0x7370, 0xAA9F,
+ 0x7371, 0xAAA0,
+ 0x7372, 0xAB40,
+ 0x7373, 0xAB41,
+ 0x7374, 0xAB42,
+ 0x7375, 0xAB43,
+ 0x7376, 0xAB44,
+ 0x7377, 0xAB45,
+ 0x7378, 0xAB46,
+ 0x7379, 0xAB47,
+ 0x737A, 0xAB48,
+ 0x737B, 0xAB49,
+ 0x737C, 0xAB4A,
+ 0x737D, 0xAB4B,
+ 0x737F, 0xAB4C,
+ 0x7380, 0xAB4D,
+ 0x7381, 0xAB4E,
+ 0x7382, 0xAB4F,
+ 0x7383, 0xAB50,
+ 0x7385, 0xAB51,
+ 0x7386, 0xAB52,
+ 0x7388, 0xAB53,
+ 0x738A, 0xAB54,
+ 0x738C, 0xAB55,
+ 0x738D, 0xAB56,
+ 0x738F, 0xAB57,
+ 0x7390, 0xAB58,
+ 0x7392, 0xAB59,
+ 0x7393, 0xAB5A,
+ 0x7394, 0xAB5B,
+ 0x7395, 0xAB5C,
+ 0x7397, 0xAB5D,
+ 0x7398, 0xAB5E,
+ 0x7399, 0xAB5F,
+ 0x739A, 0xAB60,
+ 0x739C, 0xAB61,
+ 0x739D, 0xAB62,
+ 0x739E, 0xAB63,
+ 0x73A0, 0xAB64,
+ 0x73A1, 0xAB65,
+ 0x73A3, 0xAB66,
+ 0x73A4, 0xAB67,
+ 0x73A5, 0xAB68,
+ 0x73A6, 0xAB69,
+ 0x73A7, 0xAB6A,
+ 0x73A8, 0xAB6B,
+ 0x73AA, 0xAB6C,
+ 0x73AC, 0xAB6D,
+ 0x73AD, 0xAB6E,
+ 0x73B1, 0xAB6F,
+ 0x73B4, 0xAB70,
+ 0x73B5, 0xAB71,
+ 0x73B6, 0xAB72,
+ 0x73B8, 0xAB73,
+ 0x73B9, 0xAB74,
+ 0x73BC, 0xAB75,
+ 0x73BD, 0xAB76,
+ 0x73BE, 0xAB77,
+ 0x73BF, 0xAB78,
+ 0x73C1, 0xAB79,
+ 0x73C3, 0xAB7A,
+ 0x73C4, 0xAB7B,
+ 0x73C5, 0xAB7C,
+ 0x73C6, 0xAB7D,
+ 0x73C7, 0xAB7E,
+ 0x73CB, 0xAB80,
+ 0x73CC, 0xAB81,
+ 0x73CE, 0xAB82,
+ 0x73D2, 0xAB83,
+ 0x73D3, 0xAB84,
+ 0x73D4, 0xAB85,
+ 0x73D5, 0xAB86,
+ 0x73D6, 0xAB87,
+ 0x73D7, 0xAB88,
+ 0x73D8, 0xAB89,
+ 0x73DA, 0xAB8A,
+ 0x73DB, 0xAB8B,
+ 0x73DC, 0xAB8C,
+ 0x73DD, 0xAB8D,
+ 0x73DF, 0xAB8E,
+ 0x73E1, 0xAB8F,
+ 0x73E2, 0xAB90,
+ 0x73E3, 0xAB91,
+ 0x73E4, 0xAB92,
+ 0x73E6, 0xAB93,
+ 0x73E8, 0xAB94,
+ 0x73EA, 0xAB95,
+ 0x73EB, 0xAB96,
+ 0x73EC, 0xAB97,
+ 0x73EE, 0xAB98,
+ 0x73EF, 0xAB99,
+ 0x73F0, 0xAB9A,
+ 0x73F1, 0xAB9B,
+ 0x73F3, 0xAB9C,
+ 0x73F4, 0xAB9D,
+ 0x73F5, 0xAB9E,
+ 0x73F6, 0xAB9F,
+ 0x73F7, 0xABA0,
+ 0x73F8, 0xAC40,
+ 0x73F9, 0xAC41,
+ 0x73FA, 0xAC42,
+ 0x73FB, 0xAC43,
+ 0x73FC, 0xAC44,
+ 0x73FD, 0xAC45,
+ 0x73FE, 0xAC46,
+ 0x73FF, 0xAC47,
+ 0x7400, 0xAC48,
+ 0x7401, 0xAC49,
+ 0x7402, 0xAC4A,
+ 0x7404, 0xAC4B,
+ 0x7407, 0xAC4C,
+ 0x7408, 0xAC4D,
+ 0x740B, 0xAC4E,
+ 0x740C, 0xAC4F,
+ 0x740D, 0xAC50,
+ 0x740E, 0xAC51,
+ 0x7411, 0xAC52,
+ 0x7412, 0xAC53,
+ 0x7413, 0xAC54,
+ 0x7414, 0xAC55,
+ 0x7415, 0xAC56,
+ 0x7416, 0xAC57,
+ 0x7417, 0xAC58,
+ 0x7418, 0xAC59,
+ 0x7419, 0xAC5A,
+ 0x741C, 0xAC5B,
+ 0x741D, 0xAC5C,
+ 0x741E, 0xAC5D,
+ 0x741F, 0xAC5E,
+ 0x7420, 0xAC5F,
+ 0x7421, 0xAC60,
+ 0x7423, 0xAC61,
+ 0x7424, 0xAC62,
+ 0x7427, 0xAC63,
+ 0x7429, 0xAC64,
+ 0x742B, 0xAC65,
+ 0x742D, 0xAC66,
+ 0x742F, 0xAC67,
+ 0x7431, 0xAC68,
+ 0x7432, 0xAC69,
+ 0x7437, 0xAC6A,
+ 0x7438, 0xAC6B,
+ 0x7439, 0xAC6C,
+ 0x743A, 0xAC6D,
+ 0x743B, 0xAC6E,
+ 0x743D, 0xAC6F,
+ 0x743E, 0xAC70,
+ 0x743F, 0xAC71,
+ 0x7440, 0xAC72,
+ 0x7442, 0xAC73,
+ 0x7443, 0xAC74,
+ 0x7444, 0xAC75,
+ 0x7445, 0xAC76,
+ 0x7446, 0xAC77,
+ 0x7447, 0xAC78,
+ 0x7448, 0xAC79,
+ 0x7449, 0xAC7A,
+ 0x744A, 0xAC7B,
+ 0x744B, 0xAC7C,
+ 0x744C, 0xAC7D,
+ 0x744D, 0xAC7E,
+ 0x744E, 0xAC80,
+ 0x744F, 0xAC81,
+ 0x7450, 0xAC82,
+ 0x7451, 0xAC83,
+ 0x7452, 0xAC84,
+ 0x7453, 0xAC85,
+ 0x7454, 0xAC86,
+ 0x7456, 0xAC87,
+ 0x7458, 0xAC88,
+ 0x745D, 0xAC89,
+ 0x7460, 0xAC8A,
+ 0x7461, 0xAC8B,
+ 0x7462, 0xAC8C,
+ 0x7463, 0xAC8D,
+ 0x7464, 0xAC8E,
+ 0x7465, 0xAC8F,
+ 0x7466, 0xAC90,
+ 0x7467, 0xAC91,
+ 0x7468, 0xAC92,
+ 0x7469, 0xAC93,
+ 0x746A, 0xAC94,
+ 0x746B, 0xAC95,
+ 0x746C, 0xAC96,
+ 0x746E, 0xAC97,
+ 0x746F, 0xAC98,
+ 0x7471, 0xAC99,
+ 0x7472, 0xAC9A,
+ 0x7473, 0xAC9B,
+ 0x7474, 0xAC9C,
+ 0x7475, 0xAC9D,
+ 0x7478, 0xAC9E,
+ 0x7479, 0xAC9F,
+ 0x747A, 0xACA0,
+ 0x747B, 0xAD40,
+ 0x747C, 0xAD41,
+ 0x747D, 0xAD42,
+ 0x747F, 0xAD43,
+ 0x7482, 0xAD44,
+ 0x7484, 0xAD45,
+ 0x7485, 0xAD46,
+ 0x7486, 0xAD47,
+ 0x7488, 0xAD48,
+ 0x7489, 0xAD49,
+ 0x748A, 0xAD4A,
+ 0x748C, 0xAD4B,
+ 0x748D, 0xAD4C,
+ 0x748F, 0xAD4D,
+ 0x7491, 0xAD4E,
+ 0x7492, 0xAD4F,
+ 0x7493, 0xAD50,
+ 0x7494, 0xAD51,
+ 0x7495, 0xAD52,
+ 0x7496, 0xAD53,
+ 0x7497, 0xAD54,
+ 0x7498, 0xAD55,
+ 0x7499, 0xAD56,
+ 0x749A, 0xAD57,
+ 0x749B, 0xAD58,
+ 0x749D, 0xAD59,
+ 0x749F, 0xAD5A,
+ 0x74A0, 0xAD5B,
+ 0x74A1, 0xAD5C,
+ 0x74A2, 0xAD5D,
+ 0x74A3, 0xAD5E,
+ 0x74A4, 0xAD5F,
+ 0x74A5, 0xAD60,
+ 0x74A6, 0xAD61,
+ 0x74AA, 0xAD62,
+ 0x74AB, 0xAD63,
+ 0x74AC, 0xAD64,
+ 0x74AD, 0xAD65,
+ 0x74AE, 0xAD66,
+ 0x74AF, 0xAD67,
+ 0x74B0, 0xAD68,
+ 0x74B1, 0xAD69,
+ 0x74B2, 0xAD6A,
+ 0x74B3, 0xAD6B,
+ 0x74B4, 0xAD6C,
+ 0x74B5, 0xAD6D,
+ 0x74B6, 0xAD6E,
+ 0x74B7, 0xAD6F,
+ 0x74B8, 0xAD70,
+ 0x74B9, 0xAD71,
+ 0x74BB, 0xAD72,
+ 0x74BC, 0xAD73,
+ 0x74BD, 0xAD74,
+ 0x74BE, 0xAD75,
+ 0x74BF, 0xAD76,
+ 0x74C0, 0xAD77,
+ 0x74C1, 0xAD78,
+ 0x74C2, 0xAD79,
+ 0x74C3, 0xAD7A,
+ 0x74C4, 0xAD7B,
+ 0x74C5, 0xAD7C,
+ 0x74C6, 0xAD7D,
+ 0x74C7, 0xAD7E,
+ 0x74C8, 0xAD80,
+ 0x74C9, 0xAD81,
+ 0x74CA, 0xAD82,
+ 0x74CB, 0xAD83,
+ 0x74CC, 0xAD84,
+ 0x74CD, 0xAD85,
+ 0x74CE, 0xAD86,
+ 0x74CF, 0xAD87,
+ 0x74D0, 0xAD88,
+ 0x74D1, 0xAD89,
+ 0x74D3, 0xAD8A,
+ 0x74D4, 0xAD8B,
+ 0x74D5, 0xAD8C,
+ 0x74D6, 0xAD8D,
+ 0x74D7, 0xAD8E,
+ 0x74D8, 0xAD8F,
+ 0x74D9, 0xAD90,
+ 0x74DA, 0xAD91,
+ 0x74DB, 0xAD92,
+ 0x74DD, 0xAD93,
+ 0x74DF, 0xAD94,
+ 0x74E1, 0xAD95,
+ 0x74E5, 0xAD96,
+ 0x74E7, 0xAD97,
+ 0x74E8, 0xAD98,
+ 0x74E9, 0xAD99,
+ 0x74EA, 0xAD9A,
+ 0x74EB, 0xAD9B,
+ 0x74EC, 0xAD9C,
+ 0x74ED, 0xAD9D,
+ 0x74F0, 0xAD9E,
+ 0x74F1, 0xAD9F,
+ 0x74F2, 0xADA0,
+ 0x74F3, 0xAE40,
+ 0x74F5, 0xAE41,
+ 0x74F8, 0xAE42,
+ 0x74F9, 0xAE43,
+ 0x74FA, 0xAE44,
+ 0x74FB, 0xAE45,
+ 0x74FC, 0xAE46,
+ 0x74FD, 0xAE47,
+ 0x74FE, 0xAE48,
+ 0x7500, 0xAE49,
+ 0x7501, 0xAE4A,
+ 0x7502, 0xAE4B,
+ 0x7503, 0xAE4C,
+ 0x7505, 0xAE4D,
+ 0x7506, 0xAE4E,
+ 0x7507, 0xAE4F,
+ 0x7508, 0xAE50,
+ 0x7509, 0xAE51,
+ 0x750A, 0xAE52,
+ 0x750B, 0xAE53,
+ 0x750C, 0xAE54,
+ 0x750E, 0xAE55,
+ 0x7510, 0xAE56,
+ 0x7512, 0xAE57,
+ 0x7514, 0xAE58,
+ 0x7515, 0xAE59,
+ 0x7516, 0xAE5A,
+ 0x7517, 0xAE5B,
+ 0x751B, 0xAE5C,
+ 0x751D, 0xAE5D,
+ 0x751E, 0xAE5E,
+ 0x7520, 0xAE5F,
+ 0x7521, 0xAE60,
+ 0x7522, 0xAE61,
+ 0x7523, 0xAE62,
+ 0x7524, 0xAE63,
+ 0x7526, 0xAE64,
+ 0x7527, 0xAE65,
+ 0x752A, 0xAE66,
+ 0x752E, 0xAE67,
+ 0x7534, 0xAE68,
+ 0x7536, 0xAE69,
+ 0x7539, 0xAE6A,
+ 0x753C, 0xAE6B,
+ 0x753D, 0xAE6C,
+ 0x753F, 0xAE6D,
+ 0x7541, 0xAE6E,
+ 0x7542, 0xAE6F,
+ 0x7543, 0xAE70,
+ 0x7544, 0xAE71,
+ 0x7546, 0xAE72,
+ 0x7547, 0xAE73,
+ 0x7549, 0xAE74,
+ 0x754A, 0xAE75,
+ 0x754D, 0xAE76,
+ 0x7550, 0xAE77,
+ 0x7551, 0xAE78,
+ 0x7552, 0xAE79,
+ 0x7553, 0xAE7A,
+ 0x7555, 0xAE7B,
+ 0x7556, 0xAE7C,
+ 0x7557, 0xAE7D,
+ 0x7558, 0xAE7E,
+ 0x755D, 0xAE80,
+ 0x755E, 0xAE81,
+ 0x755F, 0xAE82,
+ 0x7560, 0xAE83,
+ 0x7561, 0xAE84,
+ 0x7562, 0xAE85,
+ 0x7563, 0xAE86,
+ 0x7564, 0xAE87,
+ 0x7567, 0xAE88,
+ 0x7568, 0xAE89,
+ 0x7569, 0xAE8A,
+ 0x756B, 0xAE8B,
+ 0x756C, 0xAE8C,
+ 0x756D, 0xAE8D,
+ 0x756E, 0xAE8E,
+ 0x756F, 0xAE8F,
+ 0x7570, 0xAE90,
+ 0x7571, 0xAE91,
+ 0x7573, 0xAE92,
+ 0x7575, 0xAE93,
+ 0x7576, 0xAE94,
+ 0x7577, 0xAE95,
+ 0x757A, 0xAE96,
+ 0x757B, 0xAE97,
+ 0x757C, 0xAE98,
+ 0x757D, 0xAE99,
+ 0x757E, 0xAE9A,
+ 0x7580, 0xAE9B,
+ 0x7581, 0xAE9C,
+ 0x7582, 0xAE9D,
+ 0x7584, 0xAE9E,
+ 0x7585, 0xAE9F,
+ 0x7587, 0xAEA0,
+ 0x7588, 0xAF40,
+ 0x7589, 0xAF41,
+ 0x758A, 0xAF42,
+ 0x758C, 0xAF43,
+ 0x758D, 0xAF44,
+ 0x758E, 0xAF45,
+ 0x7590, 0xAF46,
+ 0x7593, 0xAF47,
+ 0x7595, 0xAF48,
+ 0x7598, 0xAF49,
+ 0x759B, 0xAF4A,
+ 0x759C, 0xAF4B,
+ 0x759E, 0xAF4C,
+ 0x75A2, 0xAF4D,
+ 0x75A6, 0xAF4E,
+ 0x75A7, 0xAF4F,
+ 0x75A8, 0xAF50,
+ 0x75A9, 0xAF51,
+ 0x75AA, 0xAF52,
+ 0x75AD, 0xAF53,
+ 0x75B6, 0xAF54,
+ 0x75B7, 0xAF55,
+ 0x75BA, 0xAF56,
+ 0x75BB, 0xAF57,
+ 0x75BF, 0xAF58,
+ 0x75C0, 0xAF59,
+ 0x75C1, 0xAF5A,
+ 0x75C6, 0xAF5B,
+ 0x75CB, 0xAF5C,
+ 0x75CC, 0xAF5D,
+ 0x75CE, 0xAF5E,
+ 0x75CF, 0xAF5F,
+ 0x75D0, 0xAF60,
+ 0x75D1, 0xAF61,
+ 0x75D3, 0xAF62,
+ 0x75D7, 0xAF63,
+ 0x75D9, 0xAF64,
+ 0x75DA, 0xAF65,
+ 0x75DC, 0xAF66,
+ 0x75DD, 0xAF67,
+ 0x75DF, 0xAF68,
+ 0x75E0, 0xAF69,
+ 0x75E1, 0xAF6A,
+ 0x75E5, 0xAF6B,
+ 0x75E9, 0xAF6C,
+ 0x75EC, 0xAF6D,
+ 0x75ED, 0xAF6E,
+ 0x75EE, 0xAF6F,
+ 0x75EF, 0xAF70,
+ 0x75F2, 0xAF71,
+ 0x75F3, 0xAF72,
+ 0x75F5, 0xAF73,
+ 0x75F6, 0xAF74,
+ 0x75F7, 0xAF75,
+ 0x75F8, 0xAF76,
+ 0x75FA, 0xAF77,
+ 0x75FB, 0xAF78,
+ 0x75FD, 0xAF79,
+ 0x75FE, 0xAF7A,
+ 0x7602, 0xAF7B,
+ 0x7604, 0xAF7C,
+ 0x7606, 0xAF7D,
+ 0x7607, 0xAF7E,
+ 0x7608, 0xAF80,
+ 0x7609, 0xAF81,
+ 0x760B, 0xAF82,
+ 0x760D, 0xAF83,
+ 0x760E, 0xAF84,
+ 0x760F, 0xAF85,
+ 0x7611, 0xAF86,
+ 0x7612, 0xAF87,
+ 0x7613, 0xAF88,
+ 0x7614, 0xAF89,
+ 0x7616, 0xAF8A,
+ 0x761A, 0xAF8B,
+ 0x761C, 0xAF8C,
+ 0x761D, 0xAF8D,
+ 0x761E, 0xAF8E,
+ 0x7621, 0xAF8F,
+ 0x7623, 0xAF90,
+ 0x7627, 0xAF91,
+ 0x7628, 0xAF92,
+ 0x762C, 0xAF93,
+ 0x762E, 0xAF94,
+ 0x762F, 0xAF95,
+ 0x7631, 0xAF96,
+ 0x7632, 0xAF97,
+ 0x7636, 0xAF98,
+ 0x7637, 0xAF99,
+ 0x7639, 0xAF9A,
+ 0x763A, 0xAF9B,
+ 0x763B, 0xAF9C,
+ 0x763D, 0xAF9D,
+ 0x7641, 0xAF9E,
+ 0x7642, 0xAF9F,
+ 0x7644, 0xAFA0,
+ 0x7645, 0xB040,
+ 0x7646, 0xB041,
+ 0x7647, 0xB042,
+ 0x7648, 0xB043,
+ 0x7649, 0xB044,
+ 0x764A, 0xB045,
+ 0x764B, 0xB046,
+ 0x764E, 0xB047,
+ 0x764F, 0xB048,
+ 0x7650, 0xB049,
+ 0x7651, 0xB04A,
+ 0x7652, 0xB04B,
+ 0x7653, 0xB04C,
+ 0x7655, 0xB04D,
+ 0x7657, 0xB04E,
+ 0x7658, 0xB04F,
+ 0x7659, 0xB050,
+ 0x765A, 0xB051,
+ 0x765B, 0xB052,
+ 0x765D, 0xB053,
+ 0x765F, 0xB054,
+ 0x7660, 0xB055,
+ 0x7661, 0xB056,
+ 0x7662, 0xB057,
+ 0x7664, 0xB058,
+ 0x7665, 0xB059,
+ 0x7666, 0xB05A,
+ 0x7667, 0xB05B,
+ 0x7668, 0xB05C,
+ 0x7669, 0xB05D,
+ 0x766A, 0xB05E,
+ 0x766C, 0xB05F,
+ 0x766D, 0xB060,
+ 0x766E, 0xB061,
+ 0x7670, 0xB062,
+ 0x7671, 0xB063,
+ 0x7672, 0xB064,
+ 0x7673, 0xB065,
+ 0x7674, 0xB066,
+ 0x7675, 0xB067,
+ 0x7676, 0xB068,
+ 0x7677, 0xB069,
+ 0x7679, 0xB06A,
+ 0x767A, 0xB06B,
+ 0x767C, 0xB06C,
+ 0x767F, 0xB06D,
+ 0x7680, 0xB06E,
+ 0x7681, 0xB06F,
+ 0x7683, 0xB070,
+ 0x7685, 0xB071,
+ 0x7689, 0xB072,
+ 0x768A, 0xB073,
+ 0x768C, 0xB074,
+ 0x768D, 0xB075,
+ 0x768F, 0xB076,
+ 0x7690, 0xB077,
+ 0x7692, 0xB078,
+ 0x7694, 0xB079,
+ 0x7695, 0xB07A,
+ 0x7697, 0xB07B,
+ 0x7698, 0xB07C,
+ 0x769A, 0xB07D,
+ 0x769B, 0xB07E,
+ 0x769C, 0xB080,
+ 0x769D, 0xB081,
+ 0x769E, 0xB082,
+ 0x769F, 0xB083,
+ 0x76A0, 0xB084,
+ 0x76A1, 0xB085,
+ 0x76A2, 0xB086,
+ 0x76A3, 0xB087,
+ 0x76A5, 0xB088,
+ 0x76A6, 0xB089,
+ 0x76A7, 0xB08A,
+ 0x76A8, 0xB08B,
+ 0x76A9, 0xB08C,
+ 0x76AA, 0xB08D,
+ 0x76AB, 0xB08E,
+ 0x76AC, 0xB08F,
+ 0x76AD, 0xB090,
+ 0x76AF, 0xB091,
+ 0x76B0, 0xB092,
+ 0x76B3, 0xB093,
+ 0x76B5, 0xB094,
+ 0x76B6, 0xB095,
+ 0x76B7, 0xB096,
+ 0x76B8, 0xB097,
+ 0x76B9, 0xB098,
+ 0x76BA, 0xB099,
+ 0x76BB, 0xB09A,
+ 0x76BC, 0xB09B,
+ 0x76BD, 0xB09C,
+ 0x76BE, 0xB09D,
+ 0x76C0, 0xB09E,
+ 0x76C1, 0xB09F,
+ 0x76C3, 0xB0A0,
+ 0x76C4, 0xB140,
+ 0x76C7, 0xB141,
+ 0x76C9, 0xB142,
+ 0x76CB, 0xB143,
+ 0x76CC, 0xB144,
+ 0x76D3, 0xB145,
+ 0x76D5, 0xB146,
+ 0x76D9, 0xB147,
+ 0x76DA, 0xB148,
+ 0x76DC, 0xB149,
+ 0x76DD, 0xB14A,
+ 0x76DE, 0xB14B,
+ 0x76E0, 0xB14C,
+ 0x76E1, 0xB14D,
+ 0x76E2, 0xB14E,
+ 0x76E3, 0xB14F,
+ 0x76E4, 0xB150,
+ 0x76E6, 0xB151,
+ 0x76E7, 0xB152,
+ 0x76E8, 0xB153,
+ 0x76E9, 0xB154,
+ 0x76EA, 0xB155,
+ 0x76EB, 0xB156,
+ 0x76EC, 0xB157,
+ 0x76ED, 0xB158,
+ 0x76F0, 0xB159,
+ 0x76F3, 0xB15A,
+ 0x76F5, 0xB15B,
+ 0x76F6, 0xB15C,
+ 0x76F7, 0xB15D,
+ 0x76FA, 0xB15E,
+ 0x76FB, 0xB15F,
+ 0x76FD, 0xB160,
+ 0x76FF, 0xB161,
+ 0x7700, 0xB162,
+ 0x7702, 0xB163,
+ 0x7703, 0xB164,
+ 0x7705, 0xB165,
+ 0x7706, 0xB166,
+ 0x770A, 0xB167,
+ 0x770C, 0xB168,
+ 0x770E, 0xB169,
+ 0x770F, 0xB16A,
+ 0x7710, 0xB16B,
+ 0x7711, 0xB16C,
+ 0x7712, 0xB16D,
+ 0x7713, 0xB16E,
+ 0x7714, 0xB16F,
+ 0x7715, 0xB170,
+ 0x7716, 0xB171,
+ 0x7717, 0xB172,
+ 0x7718, 0xB173,
+ 0x771B, 0xB174,
+ 0x771C, 0xB175,
+ 0x771D, 0xB176,
+ 0x771E, 0xB177,
+ 0x7721, 0xB178,
+ 0x7723, 0xB179,
+ 0x7724, 0xB17A,
+ 0x7725, 0xB17B,
+ 0x7727, 0xB17C,
+ 0x772A, 0xB17D,
+ 0x772B, 0xB17E,
+ 0x772C, 0xB180,
+ 0x772E, 0xB181,
+ 0x7730, 0xB182,
+ 0x7731, 0xB183,
+ 0x7732, 0xB184,
+ 0x7733, 0xB185,
+ 0x7734, 0xB186,
+ 0x7739, 0xB187,
+ 0x773B, 0xB188,
+ 0x773D, 0xB189,
+ 0x773E, 0xB18A,
+ 0x773F, 0xB18B,
+ 0x7742, 0xB18C,
+ 0x7744, 0xB18D,
+ 0x7745, 0xB18E,
+ 0x7746, 0xB18F,
+ 0x7748, 0xB190,
+ 0x7749, 0xB191,
+ 0x774A, 0xB192,
+ 0x774B, 0xB193,
+ 0x774C, 0xB194,
+ 0x774D, 0xB195,
+ 0x774E, 0xB196,
+ 0x774F, 0xB197,
+ 0x7752, 0xB198,
+ 0x7753, 0xB199,
+ 0x7754, 0xB19A,
+ 0x7755, 0xB19B,
+ 0x7756, 0xB19C,
+ 0x7757, 0xB19D,
+ 0x7758, 0xB19E,
+ 0x7759, 0xB19F,
+ 0x775C, 0xB1A0,
+ 0x775D, 0xB240,
+ 0x775E, 0xB241,
+ 0x775F, 0xB242,
+ 0x7760, 0xB243,
+ 0x7764, 0xB244,
+ 0x7767, 0xB245,
+ 0x7769, 0xB246,
+ 0x776A, 0xB247,
+ 0x776D, 0xB248,
+ 0x776E, 0xB249,
+ 0x776F, 0xB24A,
+ 0x7770, 0xB24B,
+ 0x7771, 0xB24C,
+ 0x7772, 0xB24D,
+ 0x7773, 0xB24E,
+ 0x7774, 0xB24F,
+ 0x7775, 0xB250,
+ 0x7776, 0xB251,
+ 0x7777, 0xB252,
+ 0x7778, 0xB253,
+ 0x777A, 0xB254,
+ 0x777B, 0xB255,
+ 0x777C, 0xB256,
+ 0x7781, 0xB257,
+ 0x7782, 0xB258,
+ 0x7783, 0xB259,
+ 0x7786, 0xB25A,
+ 0x7787, 0xB25B,
+ 0x7788, 0xB25C,
+ 0x7789, 0xB25D,
+ 0x778A, 0xB25E,
+ 0x778B, 0xB25F,
+ 0x778F, 0xB260,
+ 0x7790, 0xB261,
+ 0x7793, 0xB262,
+ 0x7794, 0xB263,
+ 0x7795, 0xB264,
+ 0x7796, 0xB265,
+ 0x7797, 0xB266,
+ 0x7798, 0xB267,
+ 0x7799, 0xB268,
+ 0x779A, 0xB269,
+ 0x779B, 0xB26A,
+ 0x779C, 0xB26B,
+ 0x779D, 0xB26C,
+ 0x779E, 0xB26D,
+ 0x77A1, 0xB26E,
+ 0x77A3, 0xB26F,
+ 0x77A4, 0xB270,
+ 0x77A6, 0xB271,
+ 0x77A8, 0xB272,
+ 0x77AB, 0xB273,
+ 0x77AD, 0xB274,
+ 0x77AE, 0xB275,
+ 0x77AF, 0xB276,
+ 0x77B1, 0xB277,
+ 0x77B2, 0xB278,
+ 0x77B4, 0xB279,
+ 0x77B6, 0xB27A,
+ 0x77B7, 0xB27B,
+ 0x77B8, 0xB27C,
+ 0x77B9, 0xB27D,
+ 0x77BA, 0xB27E,
+ 0x77BC, 0xB280,
+ 0x77BE, 0xB281,
+ 0x77C0, 0xB282,
+ 0x77C1, 0xB283,
+ 0x77C2, 0xB284,
+ 0x77C3, 0xB285,
+ 0x77C4, 0xB286,
+ 0x77C5, 0xB287,
+ 0x77C6, 0xB288,
+ 0x77C7, 0xB289,
+ 0x77C8, 0xB28A,
+ 0x77C9, 0xB28B,
+ 0x77CA, 0xB28C,
+ 0x77CB, 0xB28D,
+ 0x77CC, 0xB28E,
+ 0x77CE, 0xB28F,
+ 0x77CF, 0xB290,
+ 0x77D0, 0xB291,
+ 0x77D1, 0xB292,
+ 0x77D2, 0xB293,
+ 0x77D3, 0xB294,
+ 0x77D4, 0xB295,
+ 0x77D5, 0xB296,
+ 0x77D6, 0xB297,
+ 0x77D8, 0xB298,
+ 0x77D9, 0xB299,
+ 0x77DA, 0xB29A,
+ 0x77DD, 0xB29B,
+ 0x77DE, 0xB29C,
+ 0x77DF, 0xB29D,
+ 0x77E0, 0xB29E,
+ 0x77E1, 0xB29F,
+ 0x77E4, 0xB2A0,
+ 0x77E6, 0xB340,
+ 0x77E8, 0xB341,
+ 0x77EA, 0xB342,
+ 0x77EF, 0xB343,
+ 0x77F0, 0xB344,
+ 0x77F1, 0xB345,
+ 0x77F2, 0xB346,
+ 0x77F4, 0xB347,
+ 0x77F5, 0xB348,
+ 0x77F7, 0xB349,
+ 0x77F9, 0xB34A,
+ 0x77FA, 0xB34B,
+ 0x77FB, 0xB34C,
+ 0x77FC, 0xB34D,
+ 0x7803, 0xB34E,
+ 0x7804, 0xB34F,
+ 0x7805, 0xB350,
+ 0x7806, 0xB351,
+ 0x7807, 0xB352,
+ 0x7808, 0xB353,
+ 0x780A, 0xB354,
+ 0x780B, 0xB355,
+ 0x780E, 0xB356,
+ 0x780F, 0xB357,
+ 0x7810, 0xB358,
+ 0x7813, 0xB359,
+ 0x7815, 0xB35A,
+ 0x7819, 0xB35B,
+ 0x781B, 0xB35C,
+ 0x781E, 0xB35D,
+ 0x7820, 0xB35E,
+ 0x7821, 0xB35F,
+ 0x7822, 0xB360,
+ 0x7824, 0xB361,
+ 0x7828, 0xB362,
+ 0x782A, 0xB363,
+ 0x782B, 0xB364,
+ 0x782E, 0xB365,
+ 0x782F, 0xB366,
+ 0x7831, 0xB367,
+ 0x7832, 0xB368,
+ 0x7833, 0xB369,
+ 0x7835, 0xB36A,
+ 0x7836, 0xB36B,
+ 0x783D, 0xB36C,
+ 0x783F, 0xB36D,
+ 0x7841, 0xB36E,
+ 0x7842, 0xB36F,
+ 0x7843, 0xB370,
+ 0x7844, 0xB371,
+ 0x7846, 0xB372,
+ 0x7848, 0xB373,
+ 0x7849, 0xB374,
+ 0x784A, 0xB375,
+ 0x784B, 0xB376,
+ 0x784D, 0xB377,
+ 0x784F, 0xB378,
+ 0x7851, 0xB379,
+ 0x7853, 0xB37A,
+ 0x7854, 0xB37B,
+ 0x7858, 0xB37C,
+ 0x7859, 0xB37D,
+ 0x785A, 0xB37E,
+ 0x785B, 0xB380,
+ 0x785C, 0xB381,
+ 0x785E, 0xB382,
+ 0x785F, 0xB383,
+ 0x7860, 0xB384,
+ 0x7861, 0xB385,
+ 0x7862, 0xB386,
+ 0x7863, 0xB387,
+ 0x7864, 0xB388,
+ 0x7865, 0xB389,
+ 0x7866, 0xB38A,
+ 0x7867, 0xB38B,
+ 0x7868, 0xB38C,
+ 0x7869, 0xB38D,
+ 0x786F, 0xB38E,
+ 0x7870, 0xB38F,
+ 0x7871, 0xB390,
+ 0x7872, 0xB391,
+ 0x7873, 0xB392,
+ 0x7874, 0xB393,
+ 0x7875, 0xB394,
+ 0x7876, 0xB395,
+ 0x7878, 0xB396,
+ 0x7879, 0xB397,
+ 0x787A, 0xB398,
+ 0x787B, 0xB399,
+ 0x787D, 0xB39A,
+ 0x787E, 0xB39B,
+ 0x787F, 0xB39C,
+ 0x7880, 0xB39D,
+ 0x7881, 0xB39E,
+ 0x7882, 0xB39F,
+ 0x7883, 0xB3A0,
+ 0x7884, 0xB440,
+ 0x7885, 0xB441,
+ 0x7886, 0xB442,
+ 0x7888, 0xB443,
+ 0x788A, 0xB444,
+ 0x788B, 0xB445,
+ 0x788F, 0xB446,
+ 0x7890, 0xB447,
+ 0x7892, 0xB448,
+ 0x7894, 0xB449,
+ 0x7895, 0xB44A,
+ 0x7896, 0xB44B,
+ 0x7899, 0xB44C,
+ 0x789D, 0xB44D,
+ 0x789E, 0xB44E,
+ 0x78A0, 0xB44F,
+ 0x78A2, 0xB450,
+ 0x78A4, 0xB451,
+ 0x78A6, 0xB452,
+ 0x78A8, 0xB453,
+ 0x78A9, 0xB454,
+ 0x78AA, 0xB455,
+ 0x78AB, 0xB456,
+ 0x78AC, 0xB457,
+ 0x78AD, 0xB458,
+ 0x78AE, 0xB459,
+ 0x78AF, 0xB45A,
+ 0x78B5, 0xB45B,
+ 0x78B6, 0xB45C,
+ 0x78B7, 0xB45D,
+ 0x78B8, 0xB45E,
+ 0x78BA, 0xB45F,
+ 0x78BB, 0xB460,
+ 0x78BC, 0xB461,
+ 0x78BD, 0xB462,
+ 0x78BF, 0xB463,
+ 0x78C0, 0xB464,
+ 0x78C2, 0xB465,
+ 0x78C3, 0xB466,
+ 0x78C4, 0xB467,
+ 0x78C6, 0xB468,
+ 0x78C7, 0xB469,
+ 0x78C8, 0xB46A,
+ 0x78CC, 0xB46B,
+ 0x78CD, 0xB46C,
+ 0x78CE, 0xB46D,
+ 0x78CF, 0xB46E,
+ 0x78D1, 0xB46F,
+ 0x78D2, 0xB470,
+ 0x78D3, 0xB471,
+ 0x78D6, 0xB472,
+ 0x78D7, 0xB473,
+ 0x78D8, 0xB474,
+ 0x78DA, 0xB475,
+ 0x78DB, 0xB476,
+ 0x78DC, 0xB477,
+ 0x78DD, 0xB478,
+ 0x78DE, 0xB479,
+ 0x78DF, 0xB47A,
+ 0x78E0, 0xB47B,
+ 0x78E1, 0xB47C,
+ 0x78E2, 0xB47D,
+ 0x78E3, 0xB47E,
+ 0x78E4, 0xB480,
+ 0x78E5, 0xB481,
+ 0x78E6, 0xB482,
+ 0x78E7, 0xB483,
+ 0x78E9, 0xB484,
+ 0x78EA, 0xB485,
+ 0x78EB, 0xB486,
+ 0x78ED, 0xB487,
+ 0x78EE, 0xB488,
+ 0x78EF, 0xB489,
+ 0x78F0, 0xB48A,
+ 0x78F1, 0xB48B,
+ 0x78F3, 0xB48C,
+ 0x78F5, 0xB48D,
+ 0x78F6, 0xB48E,
+ 0x78F8, 0xB48F,
+ 0x78F9, 0xB490,
+ 0x78FB, 0xB491,
+ 0x78FC, 0xB492,
+ 0x78FD, 0xB493,
+ 0x78FE, 0xB494,
+ 0x78FF, 0xB495,
+ 0x7900, 0xB496,
+ 0x7902, 0xB497,
+ 0x7903, 0xB498,
+ 0x7904, 0xB499,
+ 0x7906, 0xB49A,
+ 0x7907, 0xB49B,
+ 0x7908, 0xB49C,
+ 0x7909, 0xB49D,
+ 0x790A, 0xB49E,
+ 0x790B, 0xB49F,
+ 0x790C, 0xB4A0,
+ 0x790D, 0xB540,
+ 0x790E, 0xB541,
+ 0x790F, 0xB542,
+ 0x7910, 0xB543,
+ 0x7911, 0xB544,
+ 0x7912, 0xB545,
+ 0x7914, 0xB546,
+ 0x7915, 0xB547,
+ 0x7916, 0xB548,
+ 0x7917, 0xB549,
+ 0x7918, 0xB54A,
+ 0x7919, 0xB54B,
+ 0x791A, 0xB54C,
+ 0x791B, 0xB54D,
+ 0x791C, 0xB54E,
+ 0x791D, 0xB54F,
+ 0x791F, 0xB550,
+ 0x7920, 0xB551,
+ 0x7921, 0xB552,
+ 0x7922, 0xB553,
+ 0x7923, 0xB554,
+ 0x7925, 0xB555,
+ 0x7926, 0xB556,
+ 0x7927, 0xB557,
+ 0x7928, 0xB558,
+ 0x7929, 0xB559,
+ 0x792A, 0xB55A,
+ 0x792B, 0xB55B,
+ 0x792C, 0xB55C,
+ 0x792D, 0xB55D,
+ 0x792E, 0xB55E,
+ 0x792F, 0xB55F,
+ 0x7930, 0xB560,
+ 0x7931, 0xB561,
+ 0x7932, 0xB562,
+ 0x7933, 0xB563,
+ 0x7935, 0xB564,
+ 0x7936, 0xB565,
+ 0x7937, 0xB566,
+ 0x7938, 0xB567,
+ 0x7939, 0xB568,
+ 0x793D, 0xB569,
+ 0x793F, 0xB56A,
+ 0x7942, 0xB56B,
+ 0x7943, 0xB56C,
+ 0x7944, 0xB56D,
+ 0x7945, 0xB56E,
+ 0x7947, 0xB56F,
+ 0x794A, 0xB570,
+ 0x794B, 0xB571,
+ 0x794C, 0xB572,
+ 0x794D, 0xB573,
+ 0x794E, 0xB574,
+ 0x794F, 0xB575,
+ 0x7950, 0xB576,
+ 0x7951, 0xB577,
+ 0x7952, 0xB578,
+ 0x7954, 0xB579,
+ 0x7955, 0xB57A,
+ 0x7958, 0xB57B,
+ 0x7959, 0xB57C,
+ 0x7961, 0xB57D,
+ 0x7963, 0xB57E,
+ 0x7964, 0xB580,
+ 0x7966, 0xB581,
+ 0x7969, 0xB582,
+ 0x796A, 0xB583,
+ 0x796B, 0xB584,
+ 0x796C, 0xB585,
+ 0x796E, 0xB586,
+ 0x7970, 0xB587,
+ 0x7971, 0xB588,
+ 0x7972, 0xB589,
+ 0x7973, 0xB58A,
+ 0x7974, 0xB58B,
+ 0x7975, 0xB58C,
+ 0x7976, 0xB58D,
+ 0x7979, 0xB58E,
+ 0x797B, 0xB58F,
+ 0x797C, 0xB590,
+ 0x797D, 0xB591,
+ 0x797E, 0xB592,
+ 0x797F, 0xB593,
+ 0x7982, 0xB594,
+ 0x7983, 0xB595,
+ 0x7986, 0xB596,
+ 0x7987, 0xB597,
+ 0x7988, 0xB598,
+ 0x7989, 0xB599,
+ 0x798B, 0xB59A,
+ 0x798C, 0xB59B,
+ 0x798D, 0xB59C,
+ 0x798E, 0xB59D,
+ 0x7990, 0xB59E,
+ 0x7991, 0xB59F,
+ 0x7992, 0xB5A0,
+ 0x7993, 0xB640,
+ 0x7994, 0xB641,
+ 0x7995, 0xB642,
+ 0x7996, 0xB643,
+ 0x7997, 0xB644,
+ 0x7998, 0xB645,
+ 0x7999, 0xB646,
+ 0x799B, 0xB647,
+ 0x799C, 0xB648,
+ 0x799D, 0xB649,
+ 0x799E, 0xB64A,
+ 0x799F, 0xB64B,
+ 0x79A0, 0xB64C,
+ 0x79A1, 0xB64D,
+ 0x79A2, 0xB64E,
+ 0x79A3, 0xB64F,
+ 0x79A4, 0xB650,
+ 0x79A5, 0xB651,
+ 0x79A6, 0xB652,
+ 0x79A8, 0xB653,
+ 0x79A9, 0xB654,
+ 0x79AA, 0xB655,
+ 0x79AB, 0xB656,
+ 0x79AC, 0xB657,
+ 0x79AD, 0xB658,
+ 0x79AE, 0xB659,
+ 0x79AF, 0xB65A,
+ 0x79B0, 0xB65B,
+ 0x79B1, 0xB65C,
+ 0x79B2, 0xB65D,
+ 0x79B4, 0xB65E,
+ 0x79B5, 0xB65F,
+ 0x79B6, 0xB660,
+ 0x79B7, 0xB661,
+ 0x79B8, 0xB662,
+ 0x79BC, 0xB663,
+ 0x79BF, 0xB664,
+ 0x79C2, 0xB665,
+ 0x79C4, 0xB666,
+ 0x79C5, 0xB667,
+ 0x79C7, 0xB668,
+ 0x79C8, 0xB669,
+ 0x79CA, 0xB66A,
+ 0x79CC, 0xB66B,
+ 0x79CE, 0xB66C,
+ 0x79CF, 0xB66D,
+ 0x79D0, 0xB66E,
+ 0x79D3, 0xB66F,
+ 0x79D4, 0xB670,
+ 0x79D6, 0xB671,
+ 0x79D7, 0xB672,
+ 0x79D9, 0xB673,
+ 0x79DA, 0xB674,
+ 0x79DB, 0xB675,
+ 0x79DC, 0xB676,
+ 0x79DD, 0xB677,
+ 0x79DE, 0xB678,
+ 0x79E0, 0xB679,
+ 0x79E1, 0xB67A,
+ 0x79E2, 0xB67B,
+ 0x79E5, 0xB67C,
+ 0x79E8, 0xB67D,
+ 0x79EA, 0xB67E,
+ 0x79EC, 0xB680,
+ 0x79EE, 0xB681,
+ 0x79F1, 0xB682,
+ 0x79F2, 0xB683,
+ 0x79F3, 0xB684,
+ 0x79F4, 0xB685,
+ 0x79F5, 0xB686,
+ 0x79F6, 0xB687,
+ 0x79F7, 0xB688,
+ 0x79F9, 0xB689,
+ 0x79FA, 0xB68A,
+ 0x79FC, 0xB68B,
+ 0x79FE, 0xB68C,
+ 0x79FF, 0xB68D,
+ 0x7A01, 0xB68E,
+ 0x7A04, 0xB68F,
+ 0x7A05, 0xB690,
+ 0x7A07, 0xB691,
+ 0x7A08, 0xB692,
+ 0x7A09, 0xB693,
+ 0x7A0A, 0xB694,
+ 0x7A0C, 0xB695,
+ 0x7A0F, 0xB696,
+ 0x7A10, 0xB697,
+ 0x7A11, 0xB698,
+ 0x7A12, 0xB699,
+ 0x7A13, 0xB69A,
+ 0x7A15, 0xB69B,
+ 0x7A16, 0xB69C,
+ 0x7A18, 0xB69D,
+ 0x7A19, 0xB69E,
+ 0x7A1B, 0xB69F,
+ 0x7A1C, 0xB6A0,
+ 0x7A1D, 0xB740,
+ 0x7A1F, 0xB741,
+ 0x7A21, 0xB742,
+ 0x7A22, 0xB743,
+ 0x7A24, 0xB744,
+ 0x7A25, 0xB745,
+ 0x7A26, 0xB746,
+ 0x7A27, 0xB747,
+ 0x7A28, 0xB748,
+ 0x7A29, 0xB749,
+ 0x7A2A, 0xB74A,
+ 0x7A2B, 0xB74B,
+ 0x7A2C, 0xB74C,
+ 0x7A2D, 0xB74D,
+ 0x7A2E, 0xB74E,
+ 0x7A2F, 0xB74F,
+ 0x7A30, 0xB750,
+ 0x7A31, 0xB751,
+ 0x7A32, 0xB752,
+ 0x7A34, 0xB753,
+ 0x7A35, 0xB754,
+ 0x7A36, 0xB755,
+ 0x7A38, 0xB756,
+ 0x7A3A, 0xB757,
+ 0x7A3E, 0xB758,
+ 0x7A40, 0xB759,
+ 0x7A41, 0xB75A,
+ 0x7A42, 0xB75B,
+ 0x7A43, 0xB75C,
+ 0x7A44, 0xB75D,
+ 0x7A45, 0xB75E,
+ 0x7A47, 0xB75F,
+ 0x7A48, 0xB760,
+ 0x7A49, 0xB761,
+ 0x7A4A, 0xB762,
+ 0x7A4B, 0xB763,
+ 0x7A4C, 0xB764,
+ 0x7A4D, 0xB765,
+ 0x7A4E, 0xB766,
+ 0x7A4F, 0xB767,
+ 0x7A50, 0xB768,
+ 0x7A52, 0xB769,
+ 0x7A53, 0xB76A,
+ 0x7A54, 0xB76B,
+ 0x7A55, 0xB76C,
+ 0x7A56, 0xB76D,
+ 0x7A58, 0xB76E,
+ 0x7A59, 0xB76F,
+ 0x7A5A, 0xB770,
+ 0x7A5B, 0xB771,
+ 0x7A5C, 0xB772,
+ 0x7A5D, 0xB773,
+ 0x7A5E, 0xB774,
+ 0x7A5F, 0xB775,
+ 0x7A60, 0xB776,
+ 0x7A61, 0xB777,
+ 0x7A62, 0xB778,
+ 0x7A63, 0xB779,
+ 0x7A64, 0xB77A,
+ 0x7A65, 0xB77B,
+ 0x7A66, 0xB77C,
+ 0x7A67, 0xB77D,
+ 0x7A68, 0xB77E,
+ 0x7A69, 0xB780,
+ 0x7A6A, 0xB781,
+ 0x7A6B, 0xB782,
+ 0x7A6C, 0xB783,
+ 0x7A6D, 0xB784,
+ 0x7A6E, 0xB785,
+ 0x7A6F, 0xB786,
+ 0x7A71, 0xB787,
+ 0x7A72, 0xB788,
+ 0x7A73, 0xB789,
+ 0x7A75, 0xB78A,
+ 0x7A7B, 0xB78B,
+ 0x7A7C, 0xB78C,
+ 0x7A7D, 0xB78D,
+ 0x7A7E, 0xB78E,
+ 0x7A82, 0xB78F,
+ 0x7A85, 0xB790,
+ 0x7A87, 0xB791,
+ 0x7A89, 0xB792,
+ 0x7A8A, 0xB793,
+ 0x7A8B, 0xB794,
+ 0x7A8C, 0xB795,
+ 0x7A8E, 0xB796,
+ 0x7A8F, 0xB797,
+ 0x7A90, 0xB798,
+ 0x7A93, 0xB799,
+ 0x7A94, 0xB79A,
+ 0x7A99, 0xB79B,
+ 0x7A9A, 0xB79C,
+ 0x7A9B, 0xB79D,
+ 0x7A9E, 0xB79E,
+ 0x7AA1, 0xB79F,
+ 0x7AA2, 0xB7A0,
+ 0x7AA3, 0xB840,
+ 0x7AA4, 0xB841,
+ 0x7AA7, 0xB842,
+ 0x7AA9, 0xB843,
+ 0x7AAA, 0xB844,
+ 0x7AAB, 0xB845,
+ 0x7AAE, 0xB846,
+ 0x7AAF, 0xB847,
+ 0x7AB0, 0xB848,
+ 0x7AB1, 0xB849,
+ 0x7AB2, 0xB84A,
+ 0x7AB4, 0xB84B,
+ 0x7AB5, 0xB84C,
+ 0x7AB6, 0xB84D,
+ 0x7AB7, 0xB84E,
+ 0x7AB8, 0xB84F,
+ 0x7AB9, 0xB850,
+ 0x7ABA, 0xB851,
+ 0x7ABB, 0xB852,
+ 0x7ABC, 0xB853,
+ 0x7ABD, 0xB854,
+ 0x7ABE, 0xB855,
+ 0x7AC0, 0xB856,
+ 0x7AC1, 0xB857,
+ 0x7AC2, 0xB858,
+ 0x7AC3, 0xB859,
+ 0x7AC4, 0xB85A,
+ 0x7AC5, 0xB85B,
+ 0x7AC6, 0xB85C,
+ 0x7AC7, 0xB85D,
+ 0x7AC8, 0xB85E,
+ 0x7AC9, 0xB85F,
+ 0x7ACA, 0xB860,
+ 0x7ACC, 0xB861,
+ 0x7ACD, 0xB862,
+ 0x7ACE, 0xB863,
+ 0x7ACF, 0xB864,
+ 0x7AD0, 0xB865,
+ 0x7AD1, 0xB866,
+ 0x7AD2, 0xB867,
+ 0x7AD3, 0xB868,
+ 0x7AD4, 0xB869,
+ 0x7AD5, 0xB86A,
+ 0x7AD7, 0xB86B,
+ 0x7AD8, 0xB86C,
+ 0x7ADA, 0xB86D,
+ 0x7ADB, 0xB86E,
+ 0x7ADC, 0xB86F,
+ 0x7ADD, 0xB870,
+ 0x7AE1, 0xB871,
+ 0x7AE2, 0xB872,
+ 0x7AE4, 0xB873,
+ 0x7AE7, 0xB874,
+ 0x7AE8, 0xB875,
+ 0x7AE9, 0xB876,
+ 0x7AEA, 0xB877,
+ 0x7AEB, 0xB878,
+ 0x7AEC, 0xB879,
+ 0x7AEE, 0xB87A,
+ 0x7AF0, 0xB87B,
+ 0x7AF1, 0xB87C,
+ 0x7AF2, 0xB87D,
+ 0x7AF3, 0xB87E,
+ 0x7AF4, 0xB880,
+ 0x7AF5, 0xB881,
+ 0x7AF6, 0xB882,
+ 0x7AF7, 0xB883,
+ 0x7AF8, 0xB884,
+ 0x7AFB, 0xB885,
+ 0x7AFC, 0xB886,
+ 0x7AFE, 0xB887,
+ 0x7B00, 0xB888,
+ 0x7B01, 0xB889,
+ 0x7B02, 0xB88A,
+ 0x7B05, 0xB88B,
+ 0x7B07, 0xB88C,
+ 0x7B09, 0xB88D,
+ 0x7B0C, 0xB88E,
+ 0x7B0D, 0xB88F,
+ 0x7B0E, 0xB890,
+ 0x7B10, 0xB891,
+ 0x7B12, 0xB892,
+ 0x7B13, 0xB893,
+ 0x7B16, 0xB894,
+ 0x7B17, 0xB895,
+ 0x7B18, 0xB896,
+ 0x7B1A, 0xB897,
+ 0x7B1C, 0xB898,
+ 0x7B1D, 0xB899,
+ 0x7B1F, 0xB89A,
+ 0x7B21, 0xB89B,
+ 0x7B22, 0xB89C,
+ 0x7B23, 0xB89D,
+ 0x7B27, 0xB89E,
+ 0x7B29, 0xB89F,
+ 0x7B2D, 0xB8A0,
+ 0x7B2F, 0xB940,
+ 0x7B30, 0xB941,
+ 0x7B32, 0xB942,
+ 0x7B34, 0xB943,
+ 0x7B35, 0xB944,
+ 0x7B36, 0xB945,
+ 0x7B37, 0xB946,
+ 0x7B39, 0xB947,
+ 0x7B3B, 0xB948,
+ 0x7B3D, 0xB949,
+ 0x7B3F, 0xB94A,
+ 0x7B40, 0xB94B,
+ 0x7B41, 0xB94C,
+ 0x7B42, 0xB94D,
+ 0x7B43, 0xB94E,
+ 0x7B44, 0xB94F,
+ 0x7B46, 0xB950,
+ 0x7B48, 0xB951,
+ 0x7B4A, 0xB952,
+ 0x7B4D, 0xB953,
+ 0x7B4E, 0xB954,
+ 0x7B53, 0xB955,
+ 0x7B55, 0xB956,
+ 0x7B57, 0xB957,
+ 0x7B59, 0xB958,
+ 0x7B5C, 0xB959,
+ 0x7B5E, 0xB95A,
+ 0x7B5F, 0xB95B,
+ 0x7B61, 0xB95C,
+ 0x7B63, 0xB95D,
+ 0x7B64, 0xB95E,
+ 0x7B65, 0xB95F,
+ 0x7B66, 0xB960,
+ 0x7B67, 0xB961,
+ 0x7B68, 0xB962,
+ 0x7B69, 0xB963,
+ 0x7B6A, 0xB964,
+ 0x7B6B, 0xB965,
+ 0x7B6C, 0xB966,
+ 0x7B6D, 0xB967,
+ 0x7B6F, 0xB968,
+ 0x7B70, 0xB969,
+ 0x7B73, 0xB96A,
+ 0x7B74, 0xB96B,
+ 0x7B76, 0xB96C,
+ 0x7B78, 0xB96D,
+ 0x7B7A, 0xB96E,
+ 0x7B7C, 0xB96F,
+ 0x7B7D, 0xB970,
+ 0x7B7F, 0xB971,
+ 0x7B81, 0xB972,
+ 0x7B82, 0xB973,
+ 0x7B83, 0xB974,
+ 0x7B84, 0xB975,
+ 0x7B86, 0xB976,
+ 0x7B87, 0xB977,
+ 0x7B88, 0xB978,
+ 0x7B89, 0xB979,
+ 0x7B8A, 0xB97A,
+ 0x7B8B, 0xB97B,
+ 0x7B8C, 0xB97C,
+ 0x7B8E, 0xB97D,
+ 0x7B8F, 0xB97E,
+ 0x7B91, 0xB980,
+ 0x7B92, 0xB981,
+ 0x7B93, 0xB982,
+ 0x7B96, 0xB983,
+ 0x7B98, 0xB984,
+ 0x7B99, 0xB985,
+ 0x7B9A, 0xB986,
+ 0x7B9B, 0xB987,
+ 0x7B9E, 0xB988,
+ 0x7B9F, 0xB989,
+ 0x7BA0, 0xB98A,
+ 0x7BA3, 0xB98B,
+ 0x7BA4, 0xB98C,
+ 0x7BA5, 0xB98D,
+ 0x7BAE, 0xB98E,
+ 0x7BAF, 0xB98F,
+ 0x7BB0, 0xB990,
+ 0x7BB2, 0xB991,
+ 0x7BB3, 0xB992,
+ 0x7BB5, 0xB993,
+ 0x7BB6, 0xB994,
+ 0x7BB7, 0xB995,
+ 0x7BB9, 0xB996,
+ 0x7BBA, 0xB997,
+ 0x7BBB, 0xB998,
+ 0x7BBC, 0xB999,
+ 0x7BBD, 0xB99A,
+ 0x7BBE, 0xB99B,
+ 0x7BBF, 0xB99C,
+ 0x7BC0, 0xB99D,
+ 0x7BC2, 0xB99E,
+ 0x7BC3, 0xB99F,
+ 0x7BC4, 0xB9A0,
+ 0x7BC5, 0xBA40,
+ 0x7BC8, 0xBA41,
+ 0x7BC9, 0xBA42,
+ 0x7BCA, 0xBA43,
+ 0x7BCB, 0xBA44,
+ 0x7BCD, 0xBA45,
+ 0x7BCE, 0xBA46,
+ 0x7BCF, 0xBA47,
+ 0x7BD0, 0xBA48,
+ 0x7BD2, 0xBA49,
+ 0x7BD4, 0xBA4A,
+ 0x7BD5, 0xBA4B,
+ 0x7BD6, 0xBA4C,
+ 0x7BD7, 0xBA4D,
+ 0x7BD8, 0xBA4E,
+ 0x7BDB, 0xBA4F,
+ 0x7BDC, 0xBA50,
+ 0x7BDE, 0xBA51,
+ 0x7BDF, 0xBA52,
+ 0x7BE0, 0xBA53,
+ 0x7BE2, 0xBA54,
+ 0x7BE3, 0xBA55,
+ 0x7BE4, 0xBA56,
+ 0x7BE7, 0xBA57,
+ 0x7BE8, 0xBA58,
+ 0x7BE9, 0xBA59,
+ 0x7BEB, 0xBA5A,
+ 0x7BEC, 0xBA5B,
+ 0x7BED, 0xBA5C,
+ 0x7BEF, 0xBA5D,
+ 0x7BF0, 0xBA5E,
+ 0x7BF2, 0xBA5F,
+ 0x7BF3, 0xBA60,
+ 0x7BF4, 0xBA61,
+ 0x7BF5, 0xBA62,
+ 0x7BF6, 0xBA63,
+ 0x7BF8, 0xBA64,
+ 0x7BF9, 0xBA65,
+ 0x7BFA, 0xBA66,
+ 0x7BFB, 0xBA67,
+ 0x7BFD, 0xBA68,
+ 0x7BFF, 0xBA69,
+ 0x7C00, 0xBA6A,
+ 0x7C01, 0xBA6B,
+ 0x7C02, 0xBA6C,
+ 0x7C03, 0xBA6D,
+ 0x7C04, 0xBA6E,
+ 0x7C05, 0xBA6F,
+ 0x7C06, 0xBA70,
+ 0x7C08, 0xBA71,
+ 0x7C09, 0xBA72,
+ 0x7C0A, 0xBA73,
+ 0x7C0D, 0xBA74,
+ 0x7C0E, 0xBA75,
+ 0x7C10, 0xBA76,
+ 0x7C11, 0xBA77,
+ 0x7C12, 0xBA78,
+ 0x7C13, 0xBA79,
+ 0x7C14, 0xBA7A,
+ 0x7C15, 0xBA7B,
+ 0x7C17, 0xBA7C,
+ 0x7C18, 0xBA7D,
+ 0x7C19, 0xBA7E,
+ 0x7C1A, 0xBA80,
+ 0x7C1B, 0xBA81,
+ 0x7C1C, 0xBA82,
+ 0x7C1D, 0xBA83,
+ 0x7C1E, 0xBA84,
+ 0x7C20, 0xBA85,
+ 0x7C21, 0xBA86,
+ 0x7C22, 0xBA87,
+ 0x7C23, 0xBA88,
+ 0x7C24, 0xBA89,
+ 0x7C25, 0xBA8A,
+ 0x7C28, 0xBA8B,
+ 0x7C29, 0xBA8C,
+ 0x7C2B, 0xBA8D,
+ 0x7C2C, 0xBA8E,
+ 0x7C2D, 0xBA8F,
+ 0x7C2E, 0xBA90,
+ 0x7C2F, 0xBA91,
+ 0x7C30, 0xBA92,
+ 0x7C31, 0xBA93,
+ 0x7C32, 0xBA94,
+ 0x7C33, 0xBA95,
+ 0x7C34, 0xBA96,
+ 0x7C35, 0xBA97,
+ 0x7C36, 0xBA98,
+ 0x7C37, 0xBA99,
+ 0x7C39, 0xBA9A,
+ 0x7C3A, 0xBA9B,
+ 0x7C3B, 0xBA9C,
+ 0x7C3C, 0xBA9D,
+ 0x7C3D, 0xBA9E,
+ 0x7C3E, 0xBA9F,
+ 0x7C42, 0xBAA0,
+ 0x7C43, 0xBB40,
+ 0x7C44, 0xBB41,
+ 0x7C45, 0xBB42,
+ 0x7C46, 0xBB43,
+ 0x7C47, 0xBB44,
+ 0x7C48, 0xBB45,
+ 0x7C49, 0xBB46,
+ 0x7C4A, 0xBB47,
+ 0x7C4B, 0xBB48,
+ 0x7C4C, 0xBB49,
+ 0x7C4E, 0xBB4A,
+ 0x7C4F, 0xBB4B,
+ 0x7C50, 0xBB4C,
+ 0x7C51, 0xBB4D,
+ 0x7C52, 0xBB4E,
+ 0x7C53, 0xBB4F,
+ 0x7C54, 0xBB50,
+ 0x7C55, 0xBB51,
+ 0x7C56, 0xBB52,
+ 0x7C57, 0xBB53,
+ 0x7C58, 0xBB54,
+ 0x7C59, 0xBB55,
+ 0x7C5A, 0xBB56,
+ 0x7C5B, 0xBB57,
+ 0x7C5C, 0xBB58,
+ 0x7C5D, 0xBB59,
+ 0x7C5E, 0xBB5A,
+ 0x7C5F, 0xBB5B,
+ 0x7C60, 0xBB5C,
+ 0x7C61, 0xBB5D,
+ 0x7C62, 0xBB5E,
+ 0x7C63, 0xBB5F,
+ 0x7C64, 0xBB60,
+ 0x7C65, 0xBB61,
+ 0x7C66, 0xBB62,
+ 0x7C67, 0xBB63,
+ 0x7C68, 0xBB64,
+ 0x7C69, 0xBB65,
+ 0x7C6A, 0xBB66,
+ 0x7C6B, 0xBB67,
+ 0x7C6C, 0xBB68,
+ 0x7C6D, 0xBB69,
+ 0x7C6E, 0xBB6A,
+ 0x7C6F, 0xBB6B,
+ 0x7C70, 0xBB6C,
+ 0x7C71, 0xBB6D,
+ 0x7C72, 0xBB6E,
+ 0x7C75, 0xBB6F,
+ 0x7C76, 0xBB70,
+ 0x7C77, 0xBB71,
+ 0x7C78, 0xBB72,
+ 0x7C79, 0xBB73,
+ 0x7C7A, 0xBB74,
+ 0x7C7E, 0xBB75,
+ 0x7C7F, 0xBB76,
+ 0x7C80, 0xBB77,
+ 0x7C81, 0xBB78,
+ 0x7C82, 0xBB79,
+ 0x7C83, 0xBB7A,
+ 0x7C84, 0xBB7B,
+ 0x7C85, 0xBB7C,
+ 0x7C86, 0xBB7D,
+ 0x7C87, 0xBB7E,
+ 0x7C88, 0xBB80,
+ 0x7C8A, 0xBB81,
+ 0x7C8B, 0xBB82,
+ 0x7C8C, 0xBB83,
+ 0x7C8D, 0xBB84,
+ 0x7C8E, 0xBB85,
+ 0x7C8F, 0xBB86,
+ 0x7C90, 0xBB87,
+ 0x7C93, 0xBB88,
+ 0x7C94, 0xBB89,
+ 0x7C96, 0xBB8A,
+ 0x7C99, 0xBB8B,
+ 0x7C9A, 0xBB8C,
+ 0x7C9B, 0xBB8D,
+ 0x7CA0, 0xBB8E,
+ 0x7CA1, 0xBB8F,
+ 0x7CA3, 0xBB90,
+ 0x7CA6, 0xBB91,
+ 0x7CA7, 0xBB92,
+ 0x7CA8, 0xBB93,
+ 0x7CA9, 0xBB94,
+ 0x7CAB, 0xBB95,
+ 0x7CAC, 0xBB96,
+ 0x7CAD, 0xBB97,
+ 0x7CAF, 0xBB98,
+ 0x7CB0, 0xBB99,
+ 0x7CB4, 0xBB9A,
+ 0x7CB5, 0xBB9B,
+ 0x7CB6, 0xBB9C,
+ 0x7CB7, 0xBB9D,
+ 0x7CB8, 0xBB9E,
+ 0x7CBA, 0xBB9F,
+ 0x7CBB, 0xBBA0,
+ 0x7CBF, 0xBC40,
+ 0x7CC0, 0xBC41,
+ 0x7CC2, 0xBC42,
+ 0x7CC3, 0xBC43,
+ 0x7CC4, 0xBC44,
+ 0x7CC6, 0xBC45,
+ 0x7CC9, 0xBC46,
+ 0x7CCB, 0xBC47,
+ 0x7CCE, 0xBC48,
+ 0x7CCF, 0xBC49,
+ 0x7CD0, 0xBC4A,
+ 0x7CD1, 0xBC4B,
+ 0x7CD2, 0xBC4C,
+ 0x7CD3, 0xBC4D,
+ 0x7CD4, 0xBC4E,
+ 0x7CD8, 0xBC4F,
+ 0x7CDA, 0xBC50,
+ 0x7CDB, 0xBC51,
+ 0x7CDD, 0xBC52,
+ 0x7CDE, 0xBC53,
+ 0x7CE1, 0xBC54,
+ 0x7CE2, 0xBC55,
+ 0x7CE3, 0xBC56,
+ 0x7CE4, 0xBC57,
+ 0x7CE5, 0xBC58,
+ 0x7CE6, 0xBC59,
+ 0x7CE7, 0xBC5A,
+ 0x7CE9, 0xBC5B,
+ 0x7CEA, 0xBC5C,
+ 0x7CEB, 0xBC5D,
+ 0x7CEC, 0xBC5E,
+ 0x7CED, 0xBC5F,
+ 0x7CEE, 0xBC60,
+ 0x7CF0, 0xBC61,
+ 0x7CF1, 0xBC62,
+ 0x7CF2, 0xBC63,
+ 0x7CF3, 0xBC64,
+ 0x7CF4, 0xBC65,
+ 0x7CF5, 0xBC66,
+ 0x7CF6, 0xBC67,
+ 0x7CF7, 0xBC68,
+ 0x7CF9, 0xBC69,
+ 0x7CFA, 0xBC6A,
+ 0x7CFC, 0xBC6B,
+ 0x7CFD, 0xBC6C,
+ 0x7CFE, 0xBC6D,
+ 0x7CFF, 0xBC6E,
+ 0x7D00, 0xBC6F,
+ 0x7D01, 0xBC70,
+ 0x7D02, 0xBC71,
+ 0x7D03, 0xBC72,
+ 0x7D04, 0xBC73,
+ 0x7D05, 0xBC74,
+ 0x7D06, 0xBC75,
+ 0x7D07, 0xBC76,
+ 0x7D08, 0xBC77,
+ 0x7D09, 0xBC78,
+ 0x7D0B, 0xBC79,
+ 0x7D0C, 0xBC7A,
+ 0x7D0D, 0xBC7B,
+ 0x7D0E, 0xBC7C,
+ 0x7D0F, 0xBC7D,
+ 0x7D10, 0xBC7E,
+ 0x7D11, 0xBC80,
+ 0x7D12, 0xBC81,
+ 0x7D13, 0xBC82,
+ 0x7D14, 0xBC83,
+ 0x7D15, 0xBC84,
+ 0x7D16, 0xBC85,
+ 0x7D17, 0xBC86,
+ 0x7D18, 0xBC87,
+ 0x7D19, 0xBC88,
+ 0x7D1A, 0xBC89,
+ 0x7D1B, 0xBC8A,
+ 0x7D1C, 0xBC8B,
+ 0x7D1D, 0xBC8C,
+ 0x7D1E, 0xBC8D,
+ 0x7D1F, 0xBC8E,
+ 0x7D21, 0xBC8F,
+ 0x7D23, 0xBC90,
+ 0x7D24, 0xBC91,
+ 0x7D25, 0xBC92,
+ 0x7D26, 0xBC93,
+ 0x7D28, 0xBC94,
+ 0x7D29, 0xBC95,
+ 0x7D2A, 0xBC96,
+ 0x7D2C, 0xBC97,
+ 0x7D2D, 0xBC98,
+ 0x7D2E, 0xBC99,
+ 0x7D30, 0xBC9A,
+ 0x7D31, 0xBC9B,
+ 0x7D32, 0xBC9C,
+ 0x7D33, 0xBC9D,
+ 0x7D34, 0xBC9E,
+ 0x7D35, 0xBC9F,
+ 0x7D36, 0xBCA0,
+ 0x7D37, 0xBD40,
+ 0x7D38, 0xBD41,
+ 0x7D39, 0xBD42,
+ 0x7D3A, 0xBD43,
+ 0x7D3B, 0xBD44,
+ 0x7D3C, 0xBD45,
+ 0x7D3D, 0xBD46,
+ 0x7D3E, 0xBD47,
+ 0x7D3F, 0xBD48,
+ 0x7D40, 0xBD49,
+ 0x7D41, 0xBD4A,
+ 0x7D42, 0xBD4B,
+ 0x7D43, 0xBD4C,
+ 0x7D44, 0xBD4D,
+ 0x7D45, 0xBD4E,
+ 0x7D46, 0xBD4F,
+ 0x7D47, 0xBD50,
+ 0x7D48, 0xBD51,
+ 0x7D49, 0xBD52,
+ 0x7D4A, 0xBD53,
+ 0x7D4B, 0xBD54,
+ 0x7D4C, 0xBD55,
+ 0x7D4D, 0xBD56,
+ 0x7D4E, 0xBD57,
+ 0x7D4F, 0xBD58,
+ 0x7D50, 0xBD59,
+ 0x7D51, 0xBD5A,
+ 0x7D52, 0xBD5B,
+ 0x7D53, 0xBD5C,
+ 0x7D54, 0xBD5D,
+ 0x7D55, 0xBD5E,
+ 0x7D56, 0xBD5F,
+ 0x7D57, 0xBD60,
+ 0x7D58, 0xBD61,
+ 0x7D59, 0xBD62,
+ 0x7D5A, 0xBD63,
+ 0x7D5B, 0xBD64,
+ 0x7D5C, 0xBD65,
+ 0x7D5D, 0xBD66,
+ 0x7D5E, 0xBD67,
+ 0x7D5F, 0xBD68,
+ 0x7D60, 0xBD69,
+ 0x7D61, 0xBD6A,
+ 0x7D62, 0xBD6B,
+ 0x7D63, 0xBD6C,
+ 0x7D64, 0xBD6D,
+ 0x7D65, 0xBD6E,
+ 0x7D66, 0xBD6F,
+ 0x7D67, 0xBD70,
+ 0x7D68, 0xBD71,
+ 0x7D69, 0xBD72,
+ 0x7D6A, 0xBD73,
+ 0x7D6B, 0xBD74,
+ 0x7D6C, 0xBD75,
+ 0x7D6D, 0xBD76,
+ 0x7D6F, 0xBD77,
+ 0x7D70, 0xBD78,
+ 0x7D71, 0xBD79,
+ 0x7D72, 0xBD7A,
+ 0x7D73, 0xBD7B,
+ 0x7D74, 0xBD7C,
+ 0x7D75, 0xBD7D,
+ 0x7D76, 0xBD7E,
+ 0x7D78, 0xBD80,
+ 0x7D79, 0xBD81,
+ 0x7D7A, 0xBD82,
+ 0x7D7B, 0xBD83,
+ 0x7D7C, 0xBD84,
+ 0x7D7D, 0xBD85,
+ 0x7D7E, 0xBD86,
+ 0x7D7F, 0xBD87,
+ 0x7D80, 0xBD88,
+ 0x7D81, 0xBD89,
+ 0x7D82, 0xBD8A,
+ 0x7D83, 0xBD8B,
+ 0x7D84, 0xBD8C,
+ 0x7D85, 0xBD8D,
+ 0x7D86, 0xBD8E,
+ 0x7D87, 0xBD8F,
+ 0x7D88, 0xBD90,
+ 0x7D89, 0xBD91,
+ 0x7D8A, 0xBD92,
+ 0x7D8B, 0xBD93,
+ 0x7D8C, 0xBD94,
+ 0x7D8D, 0xBD95,
+ 0x7D8E, 0xBD96,
+ 0x7D8F, 0xBD97,
+ 0x7D90, 0xBD98,
+ 0x7D91, 0xBD99,
+ 0x7D92, 0xBD9A,
+ 0x7D93, 0xBD9B,
+ 0x7D94, 0xBD9C,
+ 0x7D95, 0xBD9D,
+ 0x7D96, 0xBD9E,
+ 0x7D97, 0xBD9F,
+ 0x7D98, 0xBDA0,
+ 0x7D99, 0xBE40,
+ 0x7D9A, 0xBE41,
+ 0x7D9B, 0xBE42,
+ 0x7D9C, 0xBE43,
+ 0x7D9D, 0xBE44,
+ 0x7D9E, 0xBE45,
+ 0x7D9F, 0xBE46,
+ 0x7DA0, 0xBE47,
+ 0x7DA1, 0xBE48,
+ 0x7DA2, 0xBE49,
+ 0x7DA3, 0xBE4A,
+ 0x7DA4, 0xBE4B,
+ 0x7DA5, 0xBE4C,
+ 0x7DA7, 0xBE4D,
+ 0x7DA8, 0xBE4E,
+ 0x7DA9, 0xBE4F,
+ 0x7DAA, 0xBE50,
+ 0x7DAB, 0xBE51,
+ 0x7DAC, 0xBE52,
+ 0x7DAD, 0xBE53,
+ 0x7DAF, 0xBE54,
+ 0x7DB0, 0xBE55,
+ 0x7DB1, 0xBE56,
+ 0x7DB2, 0xBE57,
+ 0x7DB3, 0xBE58,
+ 0x7DB4, 0xBE59,
+ 0x7DB5, 0xBE5A,
+ 0x7DB6, 0xBE5B,
+ 0x7DB7, 0xBE5C,
+ 0x7DB8, 0xBE5D,
+ 0x7DB9, 0xBE5E,
+ 0x7DBA, 0xBE5F,
+ 0x7DBB, 0xBE60,
+ 0x7DBC, 0xBE61,
+ 0x7DBD, 0xBE62,
+ 0x7DBE, 0xBE63,
+ 0x7DBF, 0xBE64,
+ 0x7DC0, 0xBE65,
+ 0x7DC1, 0xBE66,
+ 0x7DC2, 0xBE67,
+ 0x7DC3, 0xBE68,
+ 0x7DC4, 0xBE69,
+ 0x7DC5, 0xBE6A,
+ 0x7DC6, 0xBE6B,
+ 0x7DC7, 0xBE6C,
+ 0x7DC8, 0xBE6D,
+ 0x7DC9, 0xBE6E,
+ 0x7DCA, 0xBE6F,
+ 0x7DCB, 0xBE70,
+ 0x7DCC, 0xBE71,
+ 0x7DCD, 0xBE72,
+ 0x7DCE, 0xBE73,
+ 0x7DCF, 0xBE74,
+ 0x7DD0, 0xBE75,
+ 0x7DD1, 0xBE76,
+ 0x7DD2, 0xBE77,
+ 0x7DD3, 0xBE78,
+ 0x7DD4, 0xBE79,
+ 0x7DD5, 0xBE7A,
+ 0x7DD6, 0xBE7B,
+ 0x7DD7, 0xBE7C,
+ 0x7DD8, 0xBE7D,
+ 0x7DD9, 0xBE7E,
+ 0x7DDA, 0xBE80,
+ 0x7DDB, 0xBE81,
+ 0x7DDC, 0xBE82,
+ 0x7DDD, 0xBE83,
+ 0x7DDE, 0xBE84,
+ 0x7DDF, 0xBE85,
+ 0x7DE0, 0xBE86,
+ 0x7DE1, 0xBE87,
+ 0x7DE2, 0xBE88,
+ 0x7DE3, 0xBE89,
+ 0x7DE4, 0xBE8A,
+ 0x7DE5, 0xBE8B,
+ 0x7DE6, 0xBE8C,
+ 0x7DE7, 0xBE8D,
+ 0x7DE8, 0xBE8E,
+ 0x7DE9, 0xBE8F,
+ 0x7DEA, 0xBE90,
+ 0x7DEB, 0xBE91,
+ 0x7DEC, 0xBE92,
+ 0x7DED, 0xBE93,
+ 0x7DEE, 0xBE94,
+ 0x7DEF, 0xBE95,
+ 0x7DF0, 0xBE96,
+ 0x7DF1, 0xBE97,
+ 0x7DF2, 0xBE98,
+ 0x7DF3, 0xBE99,
+ 0x7DF4, 0xBE9A,
+ 0x7DF5, 0xBE9B,
+ 0x7DF6, 0xBE9C,
+ 0x7DF7, 0xBE9D,
+ 0x7DF8, 0xBE9E,
+ 0x7DF9, 0xBE9F,
+ 0x7DFA, 0xBEA0,
+ 0x7DFB, 0xBF40,
+ 0x7DFC, 0xBF41,
+ 0x7DFD, 0xBF42,
+ 0x7DFE, 0xBF43,
+ 0x7DFF, 0xBF44,
+ 0x7E00, 0xBF45,
+ 0x7E01, 0xBF46,
+ 0x7E02, 0xBF47,
+ 0x7E03, 0xBF48,
+ 0x7E04, 0xBF49,
+ 0x7E05, 0xBF4A,
+ 0x7E06, 0xBF4B,
+ 0x7E07, 0xBF4C,
+ 0x7E08, 0xBF4D,
+ 0x7E09, 0xBF4E,
+ 0x7E0A, 0xBF4F,
+ 0x7E0B, 0xBF50,
+ 0x7E0C, 0xBF51,
+ 0x7E0D, 0xBF52,
+ 0x7E0E, 0xBF53,
+ 0x7E0F, 0xBF54,
+ 0x7E10, 0xBF55,
+ 0x7E11, 0xBF56,
+ 0x7E12, 0xBF57,
+ 0x7E13, 0xBF58,
+ 0x7E14, 0xBF59,
+ 0x7E15, 0xBF5A,
+ 0x7E16, 0xBF5B,
+ 0x7E17, 0xBF5C,
+ 0x7E18, 0xBF5D,
+ 0x7E19, 0xBF5E,
+ 0x7E1A, 0xBF5F,
+ 0x7E1B, 0xBF60,
+ 0x7E1C, 0xBF61,
+ 0x7E1D, 0xBF62,
+ 0x7E1E, 0xBF63,
+ 0x7E1F, 0xBF64,
+ 0x7E20, 0xBF65,
+ 0x7E21, 0xBF66,
+ 0x7E22, 0xBF67,
+ 0x7E23, 0xBF68,
+ 0x7E24, 0xBF69,
+ 0x7E25, 0xBF6A,
+ 0x7E26, 0xBF6B,
+ 0x7E27, 0xBF6C,
+ 0x7E28, 0xBF6D,
+ 0x7E29, 0xBF6E,
+ 0x7E2A, 0xBF6F,
+ 0x7E2B, 0xBF70,
+ 0x7E2C, 0xBF71,
+ 0x7E2D, 0xBF72,
+ 0x7E2E, 0xBF73,
+ 0x7E2F, 0xBF74,
+ 0x7E30, 0xBF75,
+ 0x7E31, 0xBF76,
+ 0x7E32, 0xBF77,
+ 0x7E33, 0xBF78,
+ 0x7E34, 0xBF79,
+ 0x7E35, 0xBF7A,
+ 0x7E36, 0xBF7B,
+ 0x7E37, 0xBF7C,
+ 0x7E38, 0xBF7D,
+ 0x7E39, 0xBF7E,
+ 0x7E3A, 0xBF80,
+ 0x7E3C, 0xBF81,
+ 0x7E3D, 0xBF82,
+ 0x7E3E, 0xBF83,
+ 0x7E3F, 0xBF84,
+ 0x7E40, 0xBF85,
+ 0x7E42, 0xBF86,
+ 0x7E43, 0xBF87,
+ 0x7E44, 0xBF88,
+ 0x7E45, 0xBF89,
+ 0x7E46, 0xBF8A,
+ 0x7E48, 0xBF8B,
+ 0x7E49, 0xBF8C,
+ 0x7E4A, 0xBF8D,
+ 0x7E4B, 0xBF8E,
+ 0x7E4C, 0xBF8F,
+ 0x7E4D, 0xBF90,
+ 0x7E4E, 0xBF91,
+ 0x7E4F, 0xBF92,
+ 0x7E50, 0xBF93,
+ 0x7E51, 0xBF94,
+ 0x7E52, 0xBF95,
+ 0x7E53, 0xBF96,
+ 0x7E54, 0xBF97,
+ 0x7E55, 0xBF98,
+ 0x7E56, 0xBF99,
+ 0x7E57, 0xBF9A,
+ 0x7E58, 0xBF9B,
+ 0x7E59, 0xBF9C,
+ 0x7E5A, 0xBF9D,
+ 0x7E5B, 0xBF9E,
+ 0x7E5C, 0xBF9F,
+ 0x7E5D, 0xBFA0,
+ 0x7E5E, 0xC040,
+ 0x7E5F, 0xC041,
+ 0x7E60, 0xC042,
+ 0x7E61, 0xC043,
+ 0x7E62, 0xC044,
+ 0x7E63, 0xC045,
+ 0x7E64, 0xC046,
+ 0x7E65, 0xC047,
+ 0x7E66, 0xC048,
+ 0x7E67, 0xC049,
+ 0x7E68, 0xC04A,
+ 0x7E69, 0xC04B,
+ 0x7E6A, 0xC04C,
+ 0x7E6B, 0xC04D,
+ 0x7E6C, 0xC04E,
+ 0x7E6D, 0xC04F,
+ 0x7E6E, 0xC050,
+ 0x7E6F, 0xC051,
+ 0x7E70, 0xC052,
+ 0x7E71, 0xC053,
+ 0x7E72, 0xC054,
+ 0x7E73, 0xC055,
+ 0x7E74, 0xC056,
+ 0x7E75, 0xC057,
+ 0x7E76, 0xC058,
+ 0x7E77, 0xC059,
+ 0x7E78, 0xC05A,
+ 0x7E79, 0xC05B,
+ 0x7E7A, 0xC05C,
+ 0x7E7B, 0xC05D,
+ 0x7E7C, 0xC05E,
+ 0x7E7D, 0xC05F,
+ 0x7E7E, 0xC060,
+ 0x7E7F, 0xC061,
+ 0x7E80, 0xC062,
+ 0x7E81, 0xC063,
+ 0x7E83, 0xC064,
+ 0x7E84, 0xC065,
+ 0x7E85, 0xC066,
+ 0x7E86, 0xC067,
+ 0x7E87, 0xC068,
+ 0x7E88, 0xC069,
+ 0x7E89, 0xC06A,
+ 0x7E8A, 0xC06B,
+ 0x7E8B, 0xC06C,
+ 0x7E8C, 0xC06D,
+ 0x7E8D, 0xC06E,
+ 0x7E8E, 0xC06F,
+ 0x7E8F, 0xC070,
+ 0x7E90, 0xC071,
+ 0x7E91, 0xC072,
+ 0x7E92, 0xC073,
+ 0x7E93, 0xC074,
+ 0x7E94, 0xC075,
+ 0x7E95, 0xC076,
+ 0x7E96, 0xC077,
+ 0x7E97, 0xC078,
+ 0x7E98, 0xC079,
+ 0x7E99, 0xC07A,
+ 0x7E9A, 0xC07B,
+ 0x7E9C, 0xC07C,
+ 0x7E9D, 0xC07D,
+ 0x7E9E, 0xC07E,
+ 0x7EAE, 0xC080,
+ 0x7EB4, 0xC081,
+ 0x7EBB, 0xC082,
+ 0x7EBC, 0xC083,
+ 0x7ED6, 0xC084,
+ 0x7EE4, 0xC085,
+ 0x7EEC, 0xC086,
+ 0x7EF9, 0xC087,
+ 0x7F0A, 0xC088,
+ 0x7F10, 0xC089,
+ 0x7F1E, 0xC08A,
+ 0x7F37, 0xC08B,
+ 0x7F39, 0xC08C,
+ 0x7F3B, 0xC08D,
+ 0x7F3C, 0xC08E,
+ 0x7F3D, 0xC08F,
+ 0x7F3E, 0xC090,
+ 0x7F3F, 0xC091,
+ 0x7F40, 0xC092,
+ 0x7F41, 0xC093,
+ 0x7F43, 0xC094,
+ 0x7F46, 0xC095,
+ 0x7F47, 0xC096,
+ 0x7F48, 0xC097,
+ 0x7F49, 0xC098,
+ 0x7F4A, 0xC099,
+ 0x7F4B, 0xC09A,
+ 0x7F4C, 0xC09B,
+ 0x7F4D, 0xC09C,
+ 0x7F4E, 0xC09D,
+ 0x7F4F, 0xC09E,
+ 0x7F52, 0xC09F,
+ 0x7F53, 0xC0A0,
+ 0x7F56, 0xC140,
+ 0x7F59, 0xC141,
+ 0x7F5B, 0xC142,
+ 0x7F5C, 0xC143,
+ 0x7F5D, 0xC144,
+ 0x7F5E, 0xC145,
+ 0x7F60, 0xC146,
+ 0x7F63, 0xC147,
+ 0x7F64, 0xC148,
+ 0x7F65, 0xC149,
+ 0x7F66, 0xC14A,
+ 0x7F67, 0xC14B,
+ 0x7F6B, 0xC14C,
+ 0x7F6C, 0xC14D,
+ 0x7F6D, 0xC14E,
+ 0x7F6F, 0xC14F,
+ 0x7F70, 0xC150,
+ 0x7F73, 0xC151,
+ 0x7F75, 0xC152,
+ 0x7F76, 0xC153,
+ 0x7F77, 0xC154,
+ 0x7F78, 0xC155,
+ 0x7F7A, 0xC156,
+ 0x7F7B, 0xC157,
+ 0x7F7C, 0xC158,
+ 0x7F7D, 0xC159,
+ 0x7F7F, 0xC15A,
+ 0x7F80, 0xC15B,
+ 0x7F82, 0xC15C,
+ 0x7F83, 0xC15D,
+ 0x7F84, 0xC15E,
+ 0x7F85, 0xC15F,
+ 0x7F86, 0xC160,
+ 0x7F87, 0xC161,
+ 0x7F88, 0xC162,
+ 0x7F89, 0xC163,
+ 0x7F8B, 0xC164,
+ 0x7F8D, 0xC165,
+ 0x7F8F, 0xC166,
+ 0x7F90, 0xC167,
+ 0x7F91, 0xC168,
+ 0x7F92, 0xC169,
+ 0x7F93, 0xC16A,
+ 0x7F95, 0xC16B,
+ 0x7F96, 0xC16C,
+ 0x7F97, 0xC16D,
+ 0x7F98, 0xC16E,
+ 0x7F99, 0xC16F,
+ 0x7F9B, 0xC170,
+ 0x7F9C, 0xC171,
+ 0x7FA0, 0xC172,
+ 0x7FA2, 0xC173,
+ 0x7FA3, 0xC174,
+ 0x7FA5, 0xC175,
+ 0x7FA6, 0xC176,
+ 0x7FA8, 0xC177,
+ 0x7FA9, 0xC178,
+ 0x7FAA, 0xC179,
+ 0x7FAB, 0xC17A,
+ 0x7FAC, 0xC17B,
+ 0x7FAD, 0xC17C,
+ 0x7FAE, 0xC17D,
+ 0x7FB1, 0xC17E,
+ 0x7FB3, 0xC180,
+ 0x7FB4, 0xC181,
+ 0x7FB5, 0xC182,
+ 0x7FB6, 0xC183,
+ 0x7FB7, 0xC184,
+ 0x7FBA, 0xC185,
+ 0x7FBB, 0xC186,
+ 0x7FBE, 0xC187,
+ 0x7FC0, 0xC188,
+ 0x7FC2, 0xC189,
+ 0x7FC3, 0xC18A,
+ 0x7FC4, 0xC18B,
+ 0x7FC6, 0xC18C,
+ 0x7FC7, 0xC18D,
+ 0x7FC8, 0xC18E,
+ 0x7FC9, 0xC18F,
+ 0x7FCB, 0xC190,
+ 0x7FCD, 0xC191,
+ 0x7FCF, 0xC192,
+ 0x7FD0, 0xC193,
+ 0x7FD1, 0xC194,
+ 0x7FD2, 0xC195,
+ 0x7FD3, 0xC196,
+ 0x7FD6, 0xC197,
+ 0x7FD7, 0xC198,
+ 0x7FD9, 0xC199,
+ 0x7FDA, 0xC19A,
+ 0x7FDB, 0xC19B,
+ 0x7FDC, 0xC19C,
+ 0x7FDD, 0xC19D,
+ 0x7FDE, 0xC19E,
+ 0x7FE2, 0xC19F,
+ 0x7FE3, 0xC1A0,
+ 0x7FE4, 0xC240,
+ 0x7FE7, 0xC241,
+ 0x7FE8, 0xC242,
+ 0x7FEA, 0xC243,
+ 0x7FEB, 0xC244,
+ 0x7FEC, 0xC245,
+ 0x7FED, 0xC246,
+ 0x7FEF, 0xC247,
+ 0x7FF2, 0xC248,
+ 0x7FF4, 0xC249,
+ 0x7FF5, 0xC24A,
+ 0x7FF6, 0xC24B,
+ 0x7FF7, 0xC24C,
+ 0x7FF8, 0xC24D,
+ 0x7FF9, 0xC24E,
+ 0x7FFA, 0xC24F,
+ 0x7FFD, 0xC250,
+ 0x7FFE, 0xC251,
+ 0x7FFF, 0xC252,
+ 0x8002, 0xC253,
+ 0x8007, 0xC254,
+ 0x8008, 0xC255,
+ 0x8009, 0xC256,
+ 0x800A, 0xC257,
+ 0x800E, 0xC258,
+ 0x800F, 0xC259,
+ 0x8011, 0xC25A,
+ 0x8013, 0xC25B,
+ 0x801A, 0xC25C,
+ 0x801B, 0xC25D,
+ 0x801D, 0xC25E,
+ 0x801E, 0xC25F,
+ 0x801F, 0xC260,
+ 0x8021, 0xC261,
+ 0x8023, 0xC262,
+ 0x8024, 0xC263,
+ 0x802B, 0xC264,
+ 0x802C, 0xC265,
+ 0x802D, 0xC266,
+ 0x802E, 0xC267,
+ 0x802F, 0xC268,
+ 0x8030, 0xC269,
+ 0x8032, 0xC26A,
+ 0x8034, 0xC26B,
+ 0x8039, 0xC26C,
+ 0x803A, 0xC26D,
+ 0x803C, 0xC26E,
+ 0x803E, 0xC26F,
+ 0x8040, 0xC270,
+ 0x8041, 0xC271,
+ 0x8044, 0xC272,
+ 0x8045, 0xC273,
+ 0x8047, 0xC274,
+ 0x8048, 0xC275,
+ 0x8049, 0xC276,
+ 0x804E, 0xC277,
+ 0x804F, 0xC278,
+ 0x8050, 0xC279,
+ 0x8051, 0xC27A,
+ 0x8053, 0xC27B,
+ 0x8055, 0xC27C,
+ 0x8056, 0xC27D,
+ 0x8057, 0xC27E,
+ 0x8059, 0xC280,
+ 0x805B, 0xC281,
+ 0x805C, 0xC282,
+ 0x805D, 0xC283,
+ 0x805E, 0xC284,
+ 0x805F, 0xC285,
+ 0x8060, 0xC286,
+ 0x8061, 0xC287,
+ 0x8062, 0xC288,
+ 0x8063, 0xC289,
+ 0x8064, 0xC28A,
+ 0x8065, 0xC28B,
+ 0x8066, 0xC28C,
+ 0x8067, 0xC28D,
+ 0x8068, 0xC28E,
+ 0x806B, 0xC28F,
+ 0x806C, 0xC290,
+ 0x806D, 0xC291,
+ 0x806E, 0xC292,
+ 0x806F, 0xC293,
+ 0x8070, 0xC294,
+ 0x8072, 0xC295,
+ 0x8073, 0xC296,
+ 0x8074, 0xC297,
+ 0x8075, 0xC298,
+ 0x8076, 0xC299,
+ 0x8077, 0xC29A,
+ 0x8078, 0xC29B,
+ 0x8079, 0xC29C,
+ 0x807A, 0xC29D,
+ 0x807B, 0xC29E,
+ 0x807C, 0xC29F,
+ 0x807D, 0xC2A0,
+ 0x807E, 0xC340,
+ 0x8081, 0xC341,
+ 0x8082, 0xC342,
+ 0x8085, 0xC343,
+ 0x8088, 0xC344,
+ 0x808A, 0xC345,
+ 0x808D, 0xC346,
+ 0x808E, 0xC347,
+ 0x808F, 0xC348,
+ 0x8090, 0xC349,
+ 0x8091, 0xC34A,
+ 0x8092, 0xC34B,
+ 0x8094, 0xC34C,
+ 0x8095, 0xC34D,
+ 0x8097, 0xC34E,
+ 0x8099, 0xC34F,
+ 0x809E, 0xC350,
+ 0x80A3, 0xC351,
+ 0x80A6, 0xC352,
+ 0x80A7, 0xC353,
+ 0x80A8, 0xC354,
+ 0x80AC, 0xC355,
+ 0x80B0, 0xC356,
+ 0x80B3, 0xC357,
+ 0x80B5, 0xC358,
+ 0x80B6, 0xC359,
+ 0x80B8, 0xC35A,
+ 0x80B9, 0xC35B,
+ 0x80BB, 0xC35C,
+ 0x80C5, 0xC35D,
+ 0x80C7, 0xC35E,
+ 0x80C8, 0xC35F,
+ 0x80C9, 0xC360,
+ 0x80CA, 0xC361,
+ 0x80CB, 0xC362,
+ 0x80CF, 0xC363,
+ 0x80D0, 0xC364,
+ 0x80D1, 0xC365,
+ 0x80D2, 0xC366,
+ 0x80D3, 0xC367,
+ 0x80D4, 0xC368,
+ 0x80D5, 0xC369,
+ 0x80D8, 0xC36A,
+ 0x80DF, 0xC36B,
+ 0x80E0, 0xC36C,
+ 0x80E2, 0xC36D,
+ 0x80E3, 0xC36E,
+ 0x80E6, 0xC36F,
+ 0x80EE, 0xC370,
+ 0x80F5, 0xC371,
+ 0x80F7, 0xC372,
+ 0x80F9, 0xC373,
+ 0x80FB, 0xC374,
+ 0x80FE, 0xC375,
+ 0x80FF, 0xC376,
+ 0x8100, 0xC377,
+ 0x8101, 0xC378,
+ 0x8103, 0xC379,
+ 0x8104, 0xC37A,
+ 0x8105, 0xC37B,
+ 0x8107, 0xC37C,
+ 0x8108, 0xC37D,
+ 0x810B, 0xC37E,
+ 0x810C, 0xC380,
+ 0x8115, 0xC381,
+ 0x8117, 0xC382,
+ 0x8119, 0xC383,
+ 0x811B, 0xC384,
+ 0x811C, 0xC385,
+ 0x811D, 0xC386,
+ 0x811F, 0xC387,
+ 0x8120, 0xC388,
+ 0x8121, 0xC389,
+ 0x8122, 0xC38A,
+ 0x8123, 0xC38B,
+ 0x8124, 0xC38C,
+ 0x8125, 0xC38D,
+ 0x8126, 0xC38E,
+ 0x8127, 0xC38F,
+ 0x8128, 0xC390,
+ 0x8129, 0xC391,
+ 0x812A, 0xC392,
+ 0x812B, 0xC393,
+ 0x812D, 0xC394,
+ 0x812E, 0xC395,
+ 0x8130, 0xC396,
+ 0x8133, 0xC397,
+ 0x8134, 0xC398,
+ 0x8135, 0xC399,
+ 0x8137, 0xC39A,
+ 0x8139, 0xC39B,
+ 0x813A, 0xC39C,
+ 0x813B, 0xC39D,
+ 0x813C, 0xC39E,
+ 0x813D, 0xC39F,
+ 0x813F, 0xC3A0,
+ 0x8140, 0xC440,
+ 0x8141, 0xC441,
+ 0x8142, 0xC442,
+ 0x8143, 0xC443,
+ 0x8144, 0xC444,
+ 0x8145, 0xC445,
+ 0x8147, 0xC446,
+ 0x8149, 0xC447,
+ 0x814D, 0xC448,
+ 0x814E, 0xC449,
+ 0x814F, 0xC44A,
+ 0x8152, 0xC44B,
+ 0x8156, 0xC44C,
+ 0x8157, 0xC44D,
+ 0x8158, 0xC44E,
+ 0x815B, 0xC44F,
+ 0x815C, 0xC450,
+ 0x815D, 0xC451,
+ 0x815E, 0xC452,
+ 0x815F, 0xC453,
+ 0x8161, 0xC454,
+ 0x8162, 0xC455,
+ 0x8163, 0xC456,
+ 0x8164, 0xC457,
+ 0x8166, 0xC458,
+ 0x8168, 0xC459,
+ 0x816A, 0xC45A,
+ 0x816B, 0xC45B,
+ 0x816C, 0xC45C,
+ 0x816F, 0xC45D,
+ 0x8172, 0xC45E,
+ 0x8173, 0xC45F,
+ 0x8175, 0xC460,
+ 0x8176, 0xC461,
+ 0x8177, 0xC462,
+ 0x8178, 0xC463,
+ 0x8181, 0xC464,
+ 0x8183, 0xC465,
+ 0x8184, 0xC466,
+ 0x8185, 0xC467,
+ 0x8186, 0xC468,
+ 0x8187, 0xC469,
+ 0x8189, 0xC46A,
+ 0x818B, 0xC46B,
+ 0x818C, 0xC46C,
+ 0x818D, 0xC46D,
+ 0x818E, 0xC46E,
+ 0x8190, 0xC46F,
+ 0x8192, 0xC470,
+ 0x8193, 0xC471,
+ 0x8194, 0xC472,
+ 0x8195, 0xC473,
+ 0x8196, 0xC474,
+ 0x8197, 0xC475,
+ 0x8199, 0xC476,
+ 0x819A, 0xC477,
+ 0x819E, 0xC478,
+ 0x819F, 0xC479,
+ 0x81A0, 0xC47A,
+ 0x81A1, 0xC47B,
+ 0x81A2, 0xC47C,
+ 0x81A4, 0xC47D,
+ 0x81A5, 0xC47E,
+ 0x81A7, 0xC480,
+ 0x81A9, 0xC481,
+ 0x81AB, 0xC482,
+ 0x81AC, 0xC483,
+ 0x81AD, 0xC484,
+ 0x81AE, 0xC485,
+ 0x81AF, 0xC486,
+ 0x81B0, 0xC487,
+ 0x81B1, 0xC488,
+ 0x81B2, 0xC489,
+ 0x81B4, 0xC48A,
+ 0x81B5, 0xC48B,
+ 0x81B6, 0xC48C,
+ 0x81B7, 0xC48D,
+ 0x81B8, 0xC48E,
+ 0x81B9, 0xC48F,
+ 0x81BC, 0xC490,
+ 0x81BD, 0xC491,
+ 0x81BE, 0xC492,
+ 0x81BF, 0xC493,
+ 0x81C4, 0xC494,
+ 0x81C5, 0xC495,
+ 0x81C7, 0xC496,
+ 0x81C8, 0xC497,
+ 0x81C9, 0xC498,
+ 0x81CB, 0xC499,
+ 0x81CD, 0xC49A,
+ 0x81CE, 0xC49B,
+ 0x81CF, 0xC49C,
+ 0x81D0, 0xC49D,
+ 0x81D1, 0xC49E,
+ 0x81D2, 0xC49F,
+ 0x81D3, 0xC4A0,
+ 0x81D4, 0xC540,
+ 0x81D5, 0xC541,
+ 0x81D6, 0xC542,
+ 0x81D7, 0xC543,
+ 0x81D8, 0xC544,
+ 0x81D9, 0xC545,
+ 0x81DA, 0xC546,
+ 0x81DB, 0xC547,
+ 0x81DC, 0xC548,
+ 0x81DD, 0xC549,
+ 0x81DE, 0xC54A,
+ 0x81DF, 0xC54B,
+ 0x81E0, 0xC54C,
+ 0x81E1, 0xC54D,
+ 0x81E2, 0xC54E,
+ 0x81E4, 0xC54F,
+ 0x81E5, 0xC550,
+ 0x81E6, 0xC551,
+ 0x81E8, 0xC552,
+ 0x81E9, 0xC553,
+ 0x81EB, 0xC554,
+ 0x81EE, 0xC555,
+ 0x81EF, 0xC556,
+ 0x81F0, 0xC557,
+ 0x81F1, 0xC558,
+ 0x81F2, 0xC559,
+ 0x81F5, 0xC55A,
+ 0x81F6, 0xC55B,
+ 0x81F7, 0xC55C,
+ 0x81F8, 0xC55D,
+ 0x81F9, 0xC55E,
+ 0x81FA, 0xC55F,
+ 0x81FD, 0xC560,
+ 0x81FF, 0xC561,
+ 0x8203, 0xC562,
+ 0x8207, 0xC563,
+ 0x8208, 0xC564,
+ 0x8209, 0xC565,
+ 0x820A, 0xC566,
+ 0x820B, 0xC567,
+ 0x820E, 0xC568,
+ 0x820F, 0xC569,
+ 0x8211, 0xC56A,
+ 0x8213, 0xC56B,
+ 0x8215, 0xC56C,
+ 0x8216, 0xC56D,
+ 0x8217, 0xC56E,
+ 0x8218, 0xC56F,
+ 0x8219, 0xC570,
+ 0x821A, 0xC571,
+ 0x821D, 0xC572,
+ 0x8220, 0xC573,
+ 0x8224, 0xC574,
+ 0x8225, 0xC575,
+ 0x8226, 0xC576,
+ 0x8227, 0xC577,
+ 0x8229, 0xC578,
+ 0x822E, 0xC579,
+ 0x8232, 0xC57A,
+ 0x823A, 0xC57B,
+ 0x823C, 0xC57C,
+ 0x823D, 0xC57D,
+ 0x823F, 0xC57E,
+ 0x8240, 0xC580,
+ 0x8241, 0xC581,
+ 0x8242, 0xC582,
+ 0x8243, 0xC583,
+ 0x8245, 0xC584,
+ 0x8246, 0xC585,
+ 0x8248, 0xC586,
+ 0x824A, 0xC587,
+ 0x824C, 0xC588,
+ 0x824D, 0xC589,
+ 0x824E, 0xC58A,
+ 0x8250, 0xC58B,
+ 0x8251, 0xC58C,
+ 0x8252, 0xC58D,
+ 0x8253, 0xC58E,
+ 0x8254, 0xC58F,
+ 0x8255, 0xC590,
+ 0x8256, 0xC591,
+ 0x8257, 0xC592,
+ 0x8259, 0xC593,
+ 0x825B, 0xC594,
+ 0x825C, 0xC595,
+ 0x825D, 0xC596,
+ 0x825E, 0xC597,
+ 0x8260, 0xC598,
+ 0x8261, 0xC599,
+ 0x8262, 0xC59A,
+ 0x8263, 0xC59B,
+ 0x8264, 0xC59C,
+ 0x8265, 0xC59D,
+ 0x8266, 0xC59E,
+ 0x8267, 0xC59F,
+ 0x8269, 0xC5A0,
+ 0x826A, 0xC640,
+ 0x826B, 0xC641,
+ 0x826C, 0xC642,
+ 0x826D, 0xC643,
+ 0x8271, 0xC644,
+ 0x8275, 0xC645,
+ 0x8276, 0xC646,
+ 0x8277, 0xC647,
+ 0x8278, 0xC648,
+ 0x827B, 0xC649,
+ 0x827C, 0xC64A,
+ 0x8280, 0xC64B,
+ 0x8281, 0xC64C,
+ 0x8283, 0xC64D,
+ 0x8285, 0xC64E,
+ 0x8286, 0xC64F,
+ 0x8287, 0xC650,
+ 0x8289, 0xC651,
+ 0x828C, 0xC652,
+ 0x8290, 0xC653,
+ 0x8293, 0xC654,
+ 0x8294, 0xC655,
+ 0x8295, 0xC656,
+ 0x8296, 0xC657,
+ 0x829A, 0xC658,
+ 0x829B, 0xC659,
+ 0x829E, 0xC65A,
+ 0x82A0, 0xC65B,
+ 0x82A2, 0xC65C,
+ 0x82A3, 0xC65D,
+ 0x82A7, 0xC65E,
+ 0x82B2, 0xC65F,
+ 0x82B5, 0xC660,
+ 0x82B6, 0xC661,
+ 0x82BA, 0xC662,
+ 0x82BB, 0xC663,
+ 0x82BC, 0xC664,
+ 0x82BF, 0xC665,
+ 0x82C0, 0xC666,
+ 0x82C2, 0xC667,
+ 0x82C3, 0xC668,
+ 0x82C5, 0xC669,
+ 0x82C6, 0xC66A,
+ 0x82C9, 0xC66B,
+ 0x82D0, 0xC66C,
+ 0x82D6, 0xC66D,
+ 0x82D9, 0xC66E,
+ 0x82DA, 0xC66F,
+ 0x82DD, 0xC670,
+ 0x82E2, 0xC671,
+ 0x82E7, 0xC672,
+ 0x82E8, 0xC673,
+ 0x82E9, 0xC674,
+ 0x82EA, 0xC675,
+ 0x82EC, 0xC676,
+ 0x82ED, 0xC677,
+ 0x82EE, 0xC678,
+ 0x82F0, 0xC679,
+ 0x82F2, 0xC67A,
+ 0x82F3, 0xC67B,
+ 0x82F5, 0xC67C,
+ 0x82F6, 0xC67D,
+ 0x82F8, 0xC67E,
+ 0x82FA, 0xC680,
+ 0x82FC, 0xC681,
+ 0x82FD, 0xC682,
+ 0x82FE, 0xC683,
+ 0x82FF, 0xC684,
+ 0x8300, 0xC685,
+ 0x830A, 0xC686,
+ 0x830B, 0xC687,
+ 0x830D, 0xC688,
+ 0x8310, 0xC689,
+ 0x8312, 0xC68A,
+ 0x8313, 0xC68B,
+ 0x8316, 0xC68C,
+ 0x8318, 0xC68D,
+ 0x8319, 0xC68E,
+ 0x831D, 0xC68F,
+ 0x831E, 0xC690,
+ 0x831F, 0xC691,
+ 0x8320, 0xC692,
+ 0x8321, 0xC693,
+ 0x8322, 0xC694,
+ 0x8323, 0xC695,
+ 0x8324, 0xC696,
+ 0x8325, 0xC697,
+ 0x8326, 0xC698,
+ 0x8329, 0xC699,
+ 0x832A, 0xC69A,
+ 0x832E, 0xC69B,
+ 0x8330, 0xC69C,
+ 0x8332, 0xC69D,
+ 0x8337, 0xC69E,
+ 0x833B, 0xC69F,
+ 0x833D, 0xC6A0,
+ 0x833E, 0xC740,
+ 0x833F, 0xC741,
+ 0x8341, 0xC742,
+ 0x8342, 0xC743,
+ 0x8344, 0xC744,
+ 0x8345, 0xC745,
+ 0x8348, 0xC746,
+ 0x834A, 0xC747,
+ 0x834B, 0xC748,
+ 0x834C, 0xC749,
+ 0x834D, 0xC74A,
+ 0x834E, 0xC74B,
+ 0x8353, 0xC74C,
+ 0x8355, 0xC74D,
+ 0x8356, 0xC74E,
+ 0x8357, 0xC74F,
+ 0x8358, 0xC750,
+ 0x8359, 0xC751,
+ 0x835D, 0xC752,
+ 0x8362, 0xC753,
+ 0x8370, 0xC754,
+ 0x8371, 0xC755,
+ 0x8372, 0xC756,
+ 0x8373, 0xC757,
+ 0x8374, 0xC758,
+ 0x8375, 0xC759,
+ 0x8376, 0xC75A,
+ 0x8379, 0xC75B,
+ 0x837A, 0xC75C,
+ 0x837E, 0xC75D,
+ 0x837F, 0xC75E,
+ 0x8380, 0xC75F,
+ 0x8381, 0xC760,
+ 0x8382, 0xC761,
+ 0x8383, 0xC762,
+ 0x8384, 0xC763,
+ 0x8387, 0xC764,
+ 0x8388, 0xC765,
+ 0x838A, 0xC766,
+ 0x838B, 0xC767,
+ 0x838C, 0xC768,
+ 0x838D, 0xC769,
+ 0x838F, 0xC76A,
+ 0x8390, 0xC76B,
+ 0x8391, 0xC76C,
+ 0x8394, 0xC76D,
+ 0x8395, 0xC76E,
+ 0x8396, 0xC76F,
+ 0x8397, 0xC770,
+ 0x8399, 0xC771,
+ 0x839A, 0xC772,
+ 0x839D, 0xC773,
+ 0x839F, 0xC774,
+ 0x83A1, 0xC775,
+ 0x83A2, 0xC776,
+ 0x83A3, 0xC777,
+ 0x83A4, 0xC778,
+ 0x83A5, 0xC779,
+ 0x83A6, 0xC77A,
+ 0x83A7, 0xC77B,
+ 0x83AC, 0xC77C,
+ 0x83AD, 0xC77D,
+ 0x83AE, 0xC77E,
+ 0x83AF, 0xC780,
+ 0x83B5, 0xC781,
+ 0x83BB, 0xC782,
+ 0x83BE, 0xC783,
+ 0x83BF, 0xC784,
+ 0x83C2, 0xC785,
+ 0x83C3, 0xC786,
+ 0x83C4, 0xC787,
+ 0x83C6, 0xC788,
+ 0x83C8, 0xC789,
+ 0x83C9, 0xC78A,
+ 0x83CB, 0xC78B,
+ 0x83CD, 0xC78C,
+ 0x83CE, 0xC78D,
+ 0x83D0, 0xC78E,
+ 0x83D1, 0xC78F,
+ 0x83D2, 0xC790,
+ 0x83D3, 0xC791,
+ 0x83D5, 0xC792,
+ 0x83D7, 0xC793,
+ 0x83D9, 0xC794,
+ 0x83DA, 0xC795,
+ 0x83DB, 0xC796,
+ 0x83DE, 0xC797,
+ 0x83E2, 0xC798,
+ 0x83E3, 0xC799,
+ 0x83E4, 0xC79A,
+ 0x83E6, 0xC79B,
+ 0x83E7, 0xC79C,
+ 0x83E8, 0xC79D,
+ 0x83EB, 0xC79E,
+ 0x83EC, 0xC79F,
+ 0x83ED, 0xC7A0,
+ 0x83EE, 0xC840,
+ 0x83EF, 0xC841,
+ 0x83F3, 0xC842,
+ 0x83F4, 0xC843,
+ 0x83F5, 0xC844,
+ 0x83F6, 0xC845,
+ 0x83F7, 0xC846,
+ 0x83FA, 0xC847,
+ 0x83FB, 0xC848,
+ 0x83FC, 0xC849,
+ 0x83FE, 0xC84A,
+ 0x83FF, 0xC84B,
+ 0x8400, 0xC84C,
+ 0x8402, 0xC84D,
+ 0x8405, 0xC84E,
+ 0x8407, 0xC84F,
+ 0x8408, 0xC850,
+ 0x8409, 0xC851,
+ 0x840A, 0xC852,
+ 0x8410, 0xC853,
+ 0x8412, 0xC854,
+ 0x8413, 0xC855,
+ 0x8414, 0xC856,
+ 0x8415, 0xC857,
+ 0x8416, 0xC858,
+ 0x8417, 0xC859,
+ 0x8419, 0xC85A,
+ 0x841A, 0xC85B,
+ 0x841B, 0xC85C,
+ 0x841E, 0xC85D,
+ 0x841F, 0xC85E,
+ 0x8420, 0xC85F,
+ 0x8421, 0xC860,
+ 0x8422, 0xC861,
+ 0x8423, 0xC862,
+ 0x8429, 0xC863,
+ 0x842A, 0xC864,
+ 0x842B, 0xC865,
+ 0x842C, 0xC866,
+ 0x842D, 0xC867,
+ 0x842E, 0xC868,
+ 0x842F, 0xC869,
+ 0x8430, 0xC86A,
+ 0x8432, 0xC86B,
+ 0x8433, 0xC86C,
+ 0x8434, 0xC86D,
+ 0x8435, 0xC86E,
+ 0x8436, 0xC86F,
+ 0x8437, 0xC870,
+ 0x8439, 0xC871,
+ 0x843A, 0xC872,
+ 0x843B, 0xC873,
+ 0x843E, 0xC874,
+ 0x843F, 0xC875,
+ 0x8440, 0xC876,
+ 0x8441, 0xC877,
+ 0x8442, 0xC878,
+ 0x8443, 0xC879,
+ 0x8444, 0xC87A,
+ 0x8445, 0xC87B,
+ 0x8447, 0xC87C,
+ 0x8448, 0xC87D,
+ 0x8449, 0xC87E,
+ 0x844A, 0xC880,
+ 0x844B, 0xC881,
+ 0x844C, 0xC882,
+ 0x844D, 0xC883,
+ 0x844E, 0xC884,
+ 0x844F, 0xC885,
+ 0x8450, 0xC886,
+ 0x8452, 0xC887,
+ 0x8453, 0xC888,
+ 0x8454, 0xC889,
+ 0x8455, 0xC88A,
+ 0x8456, 0xC88B,
+ 0x8458, 0xC88C,
+ 0x845D, 0xC88D,
+ 0x845E, 0xC88E,
+ 0x845F, 0xC88F,
+ 0x8460, 0xC890,
+ 0x8462, 0xC891,
+ 0x8464, 0xC892,
+ 0x8465, 0xC893,
+ 0x8466, 0xC894,
+ 0x8467, 0xC895,
+ 0x8468, 0xC896,
+ 0x846A, 0xC897,
+ 0x846E, 0xC898,
+ 0x846F, 0xC899,
+ 0x8470, 0xC89A,
+ 0x8472, 0xC89B,
+ 0x8474, 0xC89C,
+ 0x8477, 0xC89D,
+ 0x8479, 0xC89E,
+ 0x847B, 0xC89F,
+ 0x847C, 0xC8A0,
+ 0x847D, 0xC940,
+ 0x847E, 0xC941,
+ 0x847F, 0xC942,
+ 0x8480, 0xC943,
+ 0x8481, 0xC944,
+ 0x8483, 0xC945,
+ 0x8484, 0xC946,
+ 0x8485, 0xC947,
+ 0x8486, 0xC948,
+ 0x848A, 0xC949,
+ 0x848D, 0xC94A,
+ 0x848F, 0xC94B,
+ 0x8490, 0xC94C,
+ 0x8491, 0xC94D,
+ 0x8492, 0xC94E,
+ 0x8493, 0xC94F,
+ 0x8494, 0xC950,
+ 0x8495, 0xC951,
+ 0x8496, 0xC952,
+ 0x8498, 0xC953,
+ 0x849A, 0xC954,
+ 0x849B, 0xC955,
+ 0x849D, 0xC956,
+ 0x849E, 0xC957,
+ 0x849F, 0xC958,
+ 0x84A0, 0xC959,
+ 0x84A2, 0xC95A,
+ 0x84A3, 0xC95B,
+ 0x84A4, 0xC95C,
+ 0x84A5, 0xC95D,
+ 0x84A6, 0xC95E,
+ 0x84A7, 0xC95F,
+ 0x84A8, 0xC960,
+ 0x84A9, 0xC961,
+ 0x84AA, 0xC962,
+ 0x84AB, 0xC963,
+ 0x84AC, 0xC964,
+ 0x84AD, 0xC965,
+ 0x84AE, 0xC966,
+ 0x84B0, 0xC967,
+ 0x84B1, 0xC968,
+ 0x84B3, 0xC969,
+ 0x84B5, 0xC96A,
+ 0x84B6, 0xC96B,
+ 0x84B7, 0xC96C,
+ 0x84BB, 0xC96D,
+ 0x84BC, 0xC96E,
+ 0x84BE, 0xC96F,
+ 0x84C0, 0xC970,
+ 0x84C2, 0xC971,
+ 0x84C3, 0xC972,
+ 0x84C5, 0xC973,
+ 0x84C6, 0xC974,
+ 0x84C7, 0xC975,
+ 0x84C8, 0xC976,
+ 0x84CB, 0xC977,
+ 0x84CC, 0xC978,
+ 0x84CE, 0xC979,
+ 0x84CF, 0xC97A,
+ 0x84D2, 0xC97B,
+ 0x84D4, 0xC97C,
+ 0x84D5, 0xC97D,
+ 0x84D7, 0xC97E,
+ 0x84D8, 0xC980,
+ 0x84D9, 0xC981,
+ 0x84DA, 0xC982,
+ 0x84DB, 0xC983,
+ 0x84DC, 0xC984,
+ 0x84DE, 0xC985,
+ 0x84E1, 0xC986,
+ 0x84E2, 0xC987,
+ 0x84E4, 0xC988,
+ 0x84E7, 0xC989,
+ 0x84E8, 0xC98A,
+ 0x84E9, 0xC98B,
+ 0x84EA, 0xC98C,
+ 0x84EB, 0xC98D,
+ 0x84ED, 0xC98E,
+ 0x84EE, 0xC98F,
+ 0x84EF, 0xC990,
+ 0x84F1, 0xC991,
+ 0x84F2, 0xC992,
+ 0x84F3, 0xC993,
+ 0x84F4, 0xC994,
+ 0x84F5, 0xC995,
+ 0x84F6, 0xC996,
+ 0x84F7, 0xC997,
+ 0x84F8, 0xC998,
+ 0x84F9, 0xC999,
+ 0x84FA, 0xC99A,
+ 0x84FB, 0xC99B,
+ 0x84FD, 0xC99C,
+ 0x84FE, 0xC99D,
+ 0x8500, 0xC99E,
+ 0x8501, 0xC99F,
+ 0x8502, 0xC9A0,
+ 0x8503, 0xCA40,
+ 0x8504, 0xCA41,
+ 0x8505, 0xCA42,
+ 0x8506, 0xCA43,
+ 0x8507, 0xCA44,
+ 0x8508, 0xCA45,
+ 0x8509, 0xCA46,
+ 0x850A, 0xCA47,
+ 0x850B, 0xCA48,
+ 0x850D, 0xCA49,
+ 0x850E, 0xCA4A,
+ 0x850F, 0xCA4B,
+ 0x8510, 0xCA4C,
+ 0x8512, 0xCA4D,
+ 0x8514, 0xCA4E,
+ 0x8515, 0xCA4F,
+ 0x8516, 0xCA50,
+ 0x8518, 0xCA51,
+ 0x8519, 0xCA52,
+ 0x851B, 0xCA53,
+ 0x851C, 0xCA54,
+ 0x851D, 0xCA55,
+ 0x851E, 0xCA56,
+ 0x8520, 0xCA57,
+ 0x8522, 0xCA58,
+ 0x8523, 0xCA59,
+ 0x8524, 0xCA5A,
+ 0x8525, 0xCA5B,
+ 0x8526, 0xCA5C,
+ 0x8527, 0xCA5D,
+ 0x8528, 0xCA5E,
+ 0x8529, 0xCA5F,
+ 0x852A, 0xCA60,
+ 0x852D, 0xCA61,
+ 0x852E, 0xCA62,
+ 0x852F, 0xCA63,
+ 0x8530, 0xCA64,
+ 0x8531, 0xCA65,
+ 0x8532, 0xCA66,
+ 0x8533, 0xCA67,
+ 0x8534, 0xCA68,
+ 0x8535, 0xCA69,
+ 0x8536, 0xCA6A,
+ 0x853E, 0xCA6B,
+ 0x853F, 0xCA6C,
+ 0x8540, 0xCA6D,
+ 0x8541, 0xCA6E,
+ 0x8542, 0xCA6F,
+ 0x8544, 0xCA70,
+ 0x8545, 0xCA71,
+ 0x8546, 0xCA72,
+ 0x8547, 0xCA73,
+ 0x854B, 0xCA74,
+ 0x854C, 0xCA75,
+ 0x854D, 0xCA76,
+ 0x854E, 0xCA77,
+ 0x854F, 0xCA78,
+ 0x8550, 0xCA79,
+ 0x8551, 0xCA7A,
+ 0x8552, 0xCA7B,
+ 0x8553, 0xCA7C,
+ 0x8554, 0xCA7D,
+ 0x8555, 0xCA7E,
+ 0x8557, 0xCA80,
+ 0x8558, 0xCA81,
+ 0x855A, 0xCA82,
+ 0x855B, 0xCA83,
+ 0x855C, 0xCA84,
+ 0x855D, 0xCA85,
+ 0x855F, 0xCA86,
+ 0x8560, 0xCA87,
+ 0x8561, 0xCA88,
+ 0x8562, 0xCA89,
+ 0x8563, 0xCA8A,
+ 0x8565, 0xCA8B,
+ 0x8566, 0xCA8C,
+ 0x8567, 0xCA8D,
+ 0x8569, 0xCA8E,
+ 0x856A, 0xCA8F,
+ 0x856B, 0xCA90,
+ 0x856C, 0xCA91,
+ 0x856D, 0xCA92,
+ 0x856E, 0xCA93,
+ 0x856F, 0xCA94,
+ 0x8570, 0xCA95,
+ 0x8571, 0xCA96,
+ 0x8573, 0xCA97,
+ 0x8575, 0xCA98,
+ 0x8576, 0xCA99,
+ 0x8577, 0xCA9A,
+ 0x8578, 0xCA9B,
+ 0x857C, 0xCA9C,
+ 0x857D, 0xCA9D,
+ 0x857F, 0xCA9E,
+ 0x8580, 0xCA9F,
+ 0x8581, 0xCAA0,
+ 0x8582, 0xCB40,
+ 0x8583, 0xCB41,
+ 0x8586, 0xCB42,
+ 0x8588, 0xCB43,
+ 0x8589, 0xCB44,
+ 0x858A, 0xCB45,
+ 0x858B, 0xCB46,
+ 0x858C, 0xCB47,
+ 0x858D, 0xCB48,
+ 0x858E, 0xCB49,
+ 0x8590, 0xCB4A,
+ 0x8591, 0xCB4B,
+ 0x8592, 0xCB4C,
+ 0x8593, 0xCB4D,
+ 0x8594, 0xCB4E,
+ 0x8595, 0xCB4F,
+ 0x8596, 0xCB50,
+ 0x8597, 0xCB51,
+ 0x8598, 0xCB52,
+ 0x8599, 0xCB53,
+ 0x859A, 0xCB54,
+ 0x859D, 0xCB55,
+ 0x859E, 0xCB56,
+ 0x859F, 0xCB57,
+ 0x85A0, 0xCB58,
+ 0x85A1, 0xCB59,
+ 0x85A2, 0xCB5A,
+ 0x85A3, 0xCB5B,
+ 0x85A5, 0xCB5C,
+ 0x85A6, 0xCB5D,
+ 0x85A7, 0xCB5E,
+ 0x85A9, 0xCB5F,
+ 0x85AB, 0xCB60,
+ 0x85AC, 0xCB61,
+ 0x85AD, 0xCB62,
+ 0x85B1, 0xCB63,
+ 0x85B2, 0xCB64,
+ 0x85B3, 0xCB65,
+ 0x85B4, 0xCB66,
+ 0x85B5, 0xCB67,
+ 0x85B6, 0xCB68,
+ 0x85B8, 0xCB69,
+ 0x85BA, 0xCB6A,
+ 0x85BB, 0xCB6B,
+ 0x85BC, 0xCB6C,
+ 0x85BD, 0xCB6D,
+ 0x85BE, 0xCB6E,
+ 0x85BF, 0xCB6F,
+ 0x85C0, 0xCB70,
+ 0x85C2, 0xCB71,
+ 0x85C3, 0xCB72,
+ 0x85C4, 0xCB73,
+ 0x85C5, 0xCB74,
+ 0x85C6, 0xCB75,
+ 0x85C7, 0xCB76,
+ 0x85C8, 0xCB77,
+ 0x85CA, 0xCB78,
+ 0x85CB, 0xCB79,
+ 0x85CC, 0xCB7A,
+ 0x85CD, 0xCB7B,
+ 0x85CE, 0xCB7C,
+ 0x85D1, 0xCB7D,
+ 0x85D2, 0xCB7E,
+ 0x85D4, 0xCB80,
+ 0x85D6, 0xCB81,
+ 0x85D7, 0xCB82,
+ 0x85D8, 0xCB83,
+ 0x85D9, 0xCB84,
+ 0x85DA, 0xCB85,
+ 0x85DB, 0xCB86,
+ 0x85DD, 0xCB87,
+ 0x85DE, 0xCB88,
+ 0x85DF, 0xCB89,
+ 0x85E0, 0xCB8A,
+ 0x85E1, 0xCB8B,
+ 0x85E2, 0xCB8C,
+ 0x85E3, 0xCB8D,
+ 0x85E5, 0xCB8E,
+ 0x85E6, 0xCB8F,
+ 0x85E7, 0xCB90,
+ 0x85E8, 0xCB91,
+ 0x85EA, 0xCB92,
+ 0x85EB, 0xCB93,
+ 0x85EC, 0xCB94,
+ 0x85ED, 0xCB95,
+ 0x85EE, 0xCB96,
+ 0x85EF, 0xCB97,
+ 0x85F0, 0xCB98,
+ 0x85F1, 0xCB99,
+ 0x85F2, 0xCB9A,
+ 0x85F3, 0xCB9B,
+ 0x85F4, 0xCB9C,
+ 0x85F5, 0xCB9D,
+ 0x85F6, 0xCB9E,
+ 0x85F7, 0xCB9F,
+ 0x85F8, 0xCBA0,
+ 0x85F9, 0xCC40,
+ 0x85FA, 0xCC41,
+ 0x85FC, 0xCC42,
+ 0x85FD, 0xCC43,
+ 0x85FE, 0xCC44,
+ 0x8600, 0xCC45,
+ 0x8601, 0xCC46,
+ 0x8602, 0xCC47,
+ 0x8603, 0xCC48,
+ 0x8604, 0xCC49,
+ 0x8606, 0xCC4A,
+ 0x8607, 0xCC4B,
+ 0x8608, 0xCC4C,
+ 0x8609, 0xCC4D,
+ 0x860A, 0xCC4E,
+ 0x860B, 0xCC4F,
+ 0x860C, 0xCC50,
+ 0x860D, 0xCC51,
+ 0x860E, 0xCC52,
+ 0x860F, 0xCC53,
+ 0x8610, 0xCC54,
+ 0x8612, 0xCC55,
+ 0x8613, 0xCC56,
+ 0x8614, 0xCC57,
+ 0x8615, 0xCC58,
+ 0x8617, 0xCC59,
+ 0x8618, 0xCC5A,
+ 0x8619, 0xCC5B,
+ 0x861A, 0xCC5C,
+ 0x861B, 0xCC5D,
+ 0x861C, 0xCC5E,
+ 0x861D, 0xCC5F,
+ 0x861E, 0xCC60,
+ 0x861F, 0xCC61,
+ 0x8620, 0xCC62,
+ 0x8621, 0xCC63,
+ 0x8622, 0xCC64,
+ 0x8623, 0xCC65,
+ 0x8624, 0xCC66,
+ 0x8625, 0xCC67,
+ 0x8626, 0xCC68,
+ 0x8628, 0xCC69,
+ 0x862A, 0xCC6A,
+ 0x862B, 0xCC6B,
+ 0x862C, 0xCC6C,
+ 0x862D, 0xCC6D,
+ 0x862E, 0xCC6E,
+ 0x862F, 0xCC6F,
+ 0x8630, 0xCC70,
+ 0x8631, 0xCC71,
+ 0x8632, 0xCC72,
+ 0x8633, 0xCC73,
+ 0x8634, 0xCC74,
+ 0x8635, 0xCC75,
+ 0x8636, 0xCC76,
+ 0x8637, 0xCC77,
+ 0x8639, 0xCC78,
+ 0x863A, 0xCC79,
+ 0x863B, 0xCC7A,
+ 0x863D, 0xCC7B,
+ 0x863E, 0xCC7C,
+ 0x863F, 0xCC7D,
+ 0x8640, 0xCC7E,
+ 0x8641, 0xCC80,
+ 0x8642, 0xCC81,
+ 0x8643, 0xCC82,
+ 0x8644, 0xCC83,
+ 0x8645, 0xCC84,
+ 0x8646, 0xCC85,
+ 0x8647, 0xCC86,
+ 0x8648, 0xCC87,
+ 0x8649, 0xCC88,
+ 0x864A, 0xCC89,
+ 0x864B, 0xCC8A,
+ 0x864C, 0xCC8B,
+ 0x8652, 0xCC8C,
+ 0x8653, 0xCC8D,
+ 0x8655, 0xCC8E,
+ 0x8656, 0xCC8F,
+ 0x8657, 0xCC90,
+ 0x8658, 0xCC91,
+ 0x8659, 0xCC92,
+ 0x865B, 0xCC93,
+ 0x865C, 0xCC94,
+ 0x865D, 0xCC95,
+ 0x865F, 0xCC96,
+ 0x8660, 0xCC97,
+ 0x8661, 0xCC98,
+ 0x8663, 0xCC99,
+ 0x8664, 0xCC9A,
+ 0x8665, 0xCC9B,
+ 0x8666, 0xCC9C,
+ 0x8667, 0xCC9D,
+ 0x8668, 0xCC9E,
+ 0x8669, 0xCC9F,
+ 0x866A, 0xCCA0,
+ 0x866D, 0xCD40,
+ 0x866F, 0xCD41,
+ 0x8670, 0xCD42,
+ 0x8672, 0xCD43,
+ 0x8673, 0xCD44,
+ 0x8674, 0xCD45,
+ 0x8675, 0xCD46,
+ 0x8676, 0xCD47,
+ 0x8677, 0xCD48,
+ 0x8678, 0xCD49,
+ 0x8683, 0xCD4A,
+ 0x8684, 0xCD4B,
+ 0x8685, 0xCD4C,
+ 0x8686, 0xCD4D,
+ 0x8687, 0xCD4E,
+ 0x8688, 0xCD4F,
+ 0x8689, 0xCD50,
+ 0x868E, 0xCD51,
+ 0x868F, 0xCD52,
+ 0x8690, 0xCD53,
+ 0x8691, 0xCD54,
+ 0x8692, 0xCD55,
+ 0x8694, 0xCD56,
+ 0x8696, 0xCD57,
+ 0x8697, 0xCD58,
+ 0x8698, 0xCD59,
+ 0x8699, 0xCD5A,
+ 0x869A, 0xCD5B,
+ 0x869B, 0xCD5C,
+ 0x869E, 0xCD5D,
+ 0x869F, 0xCD5E,
+ 0x86A0, 0xCD5F,
+ 0x86A1, 0xCD60,
+ 0x86A2, 0xCD61,
+ 0x86A5, 0xCD62,
+ 0x86A6, 0xCD63,
+ 0x86AB, 0xCD64,
+ 0x86AD, 0xCD65,
+ 0x86AE, 0xCD66,
+ 0x86B2, 0xCD67,
+ 0x86B3, 0xCD68,
+ 0x86B7, 0xCD69,
+ 0x86B8, 0xCD6A,
+ 0x86B9, 0xCD6B,
+ 0x86BB, 0xCD6C,
+ 0x86BC, 0xCD6D,
+ 0x86BD, 0xCD6E,
+ 0x86BE, 0xCD6F,
+ 0x86BF, 0xCD70,
+ 0x86C1, 0xCD71,
+ 0x86C2, 0xCD72,
+ 0x86C3, 0xCD73,
+ 0x86C5, 0xCD74,
+ 0x86C8, 0xCD75,
+ 0x86CC, 0xCD76,
+ 0x86CD, 0xCD77,
+ 0x86D2, 0xCD78,
+ 0x86D3, 0xCD79,
+ 0x86D5, 0xCD7A,
+ 0x86D6, 0xCD7B,
+ 0x86D7, 0xCD7C,
+ 0x86DA, 0xCD7D,
+ 0x86DC, 0xCD7E,
+ 0x86DD, 0xCD80,
+ 0x86E0, 0xCD81,
+ 0x86E1, 0xCD82,
+ 0x86E2, 0xCD83,
+ 0x86E3, 0xCD84,
+ 0x86E5, 0xCD85,
+ 0x86E6, 0xCD86,
+ 0x86E7, 0xCD87,
+ 0x86E8, 0xCD88,
+ 0x86EA, 0xCD89,
+ 0x86EB, 0xCD8A,
+ 0x86EC, 0xCD8B,
+ 0x86EF, 0xCD8C,
+ 0x86F5, 0xCD8D,
+ 0x86F6, 0xCD8E,
+ 0x86F7, 0xCD8F,
+ 0x86FA, 0xCD90,
+ 0x86FB, 0xCD91,
+ 0x86FC, 0xCD92,
+ 0x86FD, 0xCD93,
+ 0x86FF, 0xCD94,
+ 0x8701, 0xCD95,
+ 0x8704, 0xCD96,
+ 0x8705, 0xCD97,
+ 0x8706, 0xCD98,
+ 0x870B, 0xCD99,
+ 0x870C, 0xCD9A,
+ 0x870E, 0xCD9B,
+ 0x870F, 0xCD9C,
+ 0x8710, 0xCD9D,
+ 0x8711, 0xCD9E,
+ 0x8714, 0xCD9F,
+ 0x8716, 0xCDA0,
+ 0x8719, 0xCE40,
+ 0x871B, 0xCE41,
+ 0x871D, 0xCE42,
+ 0x871F, 0xCE43,
+ 0x8720, 0xCE44,
+ 0x8724, 0xCE45,
+ 0x8726, 0xCE46,
+ 0x8727, 0xCE47,
+ 0x8728, 0xCE48,
+ 0x872A, 0xCE49,
+ 0x872B, 0xCE4A,
+ 0x872C, 0xCE4B,
+ 0x872D, 0xCE4C,
+ 0x872F, 0xCE4D,
+ 0x8730, 0xCE4E,
+ 0x8732, 0xCE4F,
+ 0x8733, 0xCE50,
+ 0x8735, 0xCE51,
+ 0x8736, 0xCE52,
+ 0x8738, 0xCE53,
+ 0x8739, 0xCE54,
+ 0x873A, 0xCE55,
+ 0x873C, 0xCE56,
+ 0x873D, 0xCE57,
+ 0x8740, 0xCE58,
+ 0x8741, 0xCE59,
+ 0x8742, 0xCE5A,
+ 0x8743, 0xCE5B,
+ 0x8744, 0xCE5C,
+ 0x8745, 0xCE5D,
+ 0x8746, 0xCE5E,
+ 0x874A, 0xCE5F,
+ 0x874B, 0xCE60,
+ 0x874D, 0xCE61,
+ 0x874F, 0xCE62,
+ 0x8750, 0xCE63,
+ 0x8751, 0xCE64,
+ 0x8752, 0xCE65,
+ 0x8754, 0xCE66,
+ 0x8755, 0xCE67,
+ 0x8756, 0xCE68,
+ 0x8758, 0xCE69,
+ 0x875A, 0xCE6A,
+ 0x875B, 0xCE6B,
+ 0x875C, 0xCE6C,
+ 0x875D, 0xCE6D,
+ 0x875E, 0xCE6E,
+ 0x875F, 0xCE6F,
+ 0x8761, 0xCE70,
+ 0x8762, 0xCE71,
+ 0x8766, 0xCE72,
+ 0x8767, 0xCE73,
+ 0x8768, 0xCE74,
+ 0x8769, 0xCE75,
+ 0x876A, 0xCE76,
+ 0x876B, 0xCE77,
+ 0x876C, 0xCE78,
+ 0x876D, 0xCE79,
+ 0x876F, 0xCE7A,
+ 0x8771, 0xCE7B,
+ 0x8772, 0xCE7C,
+ 0x8773, 0xCE7D,
+ 0x8775, 0xCE7E,
+ 0x8777, 0xCE80,
+ 0x8778, 0xCE81,
+ 0x8779, 0xCE82,
+ 0x877A, 0xCE83,
+ 0x877F, 0xCE84,
+ 0x8780, 0xCE85,
+ 0x8781, 0xCE86,
+ 0x8784, 0xCE87,
+ 0x8786, 0xCE88,
+ 0x8787, 0xCE89,
+ 0x8789, 0xCE8A,
+ 0x878A, 0xCE8B,
+ 0x878C, 0xCE8C,
+ 0x878E, 0xCE8D,
+ 0x878F, 0xCE8E,
+ 0x8790, 0xCE8F,
+ 0x8791, 0xCE90,
+ 0x8792, 0xCE91,
+ 0x8794, 0xCE92,
+ 0x8795, 0xCE93,
+ 0x8796, 0xCE94,
+ 0x8798, 0xCE95,
+ 0x8799, 0xCE96,
+ 0x879A, 0xCE97,
+ 0x879B, 0xCE98,
+ 0x879C, 0xCE99,
+ 0x879D, 0xCE9A,
+ 0x879E, 0xCE9B,
+ 0x87A0, 0xCE9C,
+ 0x87A1, 0xCE9D,
+ 0x87A2, 0xCE9E,
+ 0x87A3, 0xCE9F,
+ 0x87A4, 0xCEA0,
+ 0x87A5, 0xCF40,
+ 0x87A6, 0xCF41,
+ 0x87A7, 0xCF42,
+ 0x87A9, 0xCF43,
+ 0x87AA, 0xCF44,
+ 0x87AE, 0xCF45,
+ 0x87B0, 0xCF46,
+ 0x87B1, 0xCF47,
+ 0x87B2, 0xCF48,
+ 0x87B4, 0xCF49,
+ 0x87B6, 0xCF4A,
+ 0x87B7, 0xCF4B,
+ 0x87B8, 0xCF4C,
+ 0x87B9, 0xCF4D,
+ 0x87BB, 0xCF4E,
+ 0x87BC, 0xCF4F,
+ 0x87BE, 0xCF50,
+ 0x87BF, 0xCF51,
+ 0x87C1, 0xCF52,
+ 0x87C2, 0xCF53,
+ 0x87C3, 0xCF54,
+ 0x87C4, 0xCF55,
+ 0x87C5, 0xCF56,
+ 0x87C7, 0xCF57,
+ 0x87C8, 0xCF58,
+ 0x87C9, 0xCF59,
+ 0x87CC, 0xCF5A,
+ 0x87CD, 0xCF5B,
+ 0x87CE, 0xCF5C,
+ 0x87CF, 0xCF5D,
+ 0x87D0, 0xCF5E,
+ 0x87D4, 0xCF5F,
+ 0x87D5, 0xCF60,
+ 0x87D6, 0xCF61,
+ 0x87D7, 0xCF62,
+ 0x87D8, 0xCF63,
+ 0x87D9, 0xCF64,
+ 0x87DA, 0xCF65,
+ 0x87DC, 0xCF66,
+ 0x87DD, 0xCF67,
+ 0x87DE, 0xCF68,
+ 0x87DF, 0xCF69,
+ 0x87E1, 0xCF6A,
+ 0x87E2, 0xCF6B,
+ 0x87E3, 0xCF6C,
+ 0x87E4, 0xCF6D,
+ 0x87E6, 0xCF6E,
+ 0x87E7, 0xCF6F,
+ 0x87E8, 0xCF70,
+ 0x87E9, 0xCF71,
+ 0x87EB, 0xCF72,
+ 0x87EC, 0xCF73,
+ 0x87ED, 0xCF74,
+ 0x87EF, 0xCF75,
+ 0x87F0, 0xCF76,
+ 0x87F1, 0xCF77,
+ 0x87F2, 0xCF78,
+ 0x87F3, 0xCF79,
+ 0x87F4, 0xCF7A,
+ 0x87F5, 0xCF7B,
+ 0x87F6, 0xCF7C,
+ 0x87F7, 0xCF7D,
+ 0x87F8, 0xCF7E,
+ 0x87FA, 0xCF80,
+ 0x87FB, 0xCF81,
+ 0x87FC, 0xCF82,
+ 0x87FD, 0xCF83,
+ 0x87FF, 0xCF84,
+ 0x8800, 0xCF85,
+ 0x8801, 0xCF86,
+ 0x8802, 0xCF87,
+ 0x8804, 0xCF88,
+ 0x8805, 0xCF89,
+ 0x8806, 0xCF8A,
+ 0x8807, 0xCF8B,
+ 0x8808, 0xCF8C,
+ 0x8809, 0xCF8D,
+ 0x880B, 0xCF8E,
+ 0x880C, 0xCF8F,
+ 0x880D, 0xCF90,
+ 0x880E, 0xCF91,
+ 0x880F, 0xCF92,
+ 0x8810, 0xCF93,
+ 0x8811, 0xCF94,
+ 0x8812, 0xCF95,
+ 0x8814, 0xCF96,
+ 0x8817, 0xCF97,
+ 0x8818, 0xCF98,
+ 0x8819, 0xCF99,
+ 0x881A, 0xCF9A,
+ 0x881C, 0xCF9B,
+ 0x881D, 0xCF9C,
+ 0x881E, 0xCF9D,
+ 0x881F, 0xCF9E,
+ 0x8820, 0xCF9F,
+ 0x8823, 0xCFA0,
+ 0x8824, 0xD040,
+ 0x8825, 0xD041,
+ 0x8826, 0xD042,
+ 0x8827, 0xD043,
+ 0x8828, 0xD044,
+ 0x8829, 0xD045,
+ 0x882A, 0xD046,
+ 0x882B, 0xD047,
+ 0x882C, 0xD048,
+ 0x882D, 0xD049,
+ 0x882E, 0xD04A,
+ 0x882F, 0xD04B,
+ 0x8830, 0xD04C,
+ 0x8831, 0xD04D,
+ 0x8833, 0xD04E,
+ 0x8834, 0xD04F,
+ 0x8835, 0xD050,
+ 0x8836, 0xD051,
+ 0x8837, 0xD052,
+ 0x8838, 0xD053,
+ 0x883A, 0xD054,
+ 0x883B, 0xD055,
+ 0x883D, 0xD056,
+ 0x883E, 0xD057,
+ 0x883F, 0xD058,
+ 0x8841, 0xD059,
+ 0x8842, 0xD05A,
+ 0x8843, 0xD05B,
+ 0x8846, 0xD05C,
+ 0x8847, 0xD05D,
+ 0x8848, 0xD05E,
+ 0x8849, 0xD05F,
+ 0x884A, 0xD060,
+ 0x884B, 0xD061,
+ 0x884E, 0xD062,
+ 0x884F, 0xD063,
+ 0x8850, 0xD064,
+ 0x8851, 0xD065,
+ 0x8852, 0xD066,
+ 0x8853, 0xD067,
+ 0x8855, 0xD068,
+ 0x8856, 0xD069,
+ 0x8858, 0xD06A,
+ 0x885A, 0xD06B,
+ 0x885B, 0xD06C,
+ 0x885C, 0xD06D,
+ 0x885D, 0xD06E,
+ 0x885E, 0xD06F,
+ 0x885F, 0xD070,
+ 0x8860, 0xD071,
+ 0x8866, 0xD072,
+ 0x8867, 0xD073,
+ 0x886A, 0xD074,
+ 0x886D, 0xD075,
+ 0x886F, 0xD076,
+ 0x8871, 0xD077,
+ 0x8873, 0xD078,
+ 0x8874, 0xD079,
+ 0x8875, 0xD07A,
+ 0x8876, 0xD07B,
+ 0x8878, 0xD07C,
+ 0x8879, 0xD07D,
+ 0x887A, 0xD07E,
+ 0x887B, 0xD080,
+ 0x887C, 0xD081,
+ 0x8880, 0xD082,
+ 0x8883, 0xD083,
+ 0x8886, 0xD084,
+ 0x8887, 0xD085,
+ 0x8889, 0xD086,
+ 0x888A, 0xD087,
+ 0x888C, 0xD088,
+ 0x888E, 0xD089,
+ 0x888F, 0xD08A,
+ 0x8890, 0xD08B,
+ 0x8891, 0xD08C,
+ 0x8893, 0xD08D,
+ 0x8894, 0xD08E,
+ 0x8895, 0xD08F,
+ 0x8897, 0xD090,
+ 0x8898, 0xD091,
+ 0x8899, 0xD092,
+ 0x889A, 0xD093,
+ 0x889B, 0xD094,
+ 0x889D, 0xD095,
+ 0x889E, 0xD096,
+ 0x889F, 0xD097,
+ 0x88A0, 0xD098,
+ 0x88A1, 0xD099,
+ 0x88A3, 0xD09A,
+ 0x88A5, 0xD09B,
+ 0x88A6, 0xD09C,
+ 0x88A7, 0xD09D,
+ 0x88A8, 0xD09E,
+ 0x88A9, 0xD09F,
+ 0x88AA, 0xD0A0,
+ 0x88AC, 0xD140,
+ 0x88AE, 0xD141,
+ 0x88AF, 0xD142,
+ 0x88B0, 0xD143,
+ 0x88B2, 0xD144,
+ 0x88B3, 0xD145,
+ 0x88B4, 0xD146,
+ 0x88B5, 0xD147,
+ 0x88B6, 0xD148,
+ 0x88B8, 0xD149,
+ 0x88B9, 0xD14A,
+ 0x88BA, 0xD14B,
+ 0x88BB, 0xD14C,
+ 0x88BD, 0xD14D,
+ 0x88BE, 0xD14E,
+ 0x88BF, 0xD14F,
+ 0x88C0, 0xD150,
+ 0x88C3, 0xD151,
+ 0x88C4, 0xD152,
+ 0x88C7, 0xD153,
+ 0x88C8, 0xD154,
+ 0x88CA, 0xD155,
+ 0x88CB, 0xD156,
+ 0x88CC, 0xD157,
+ 0x88CD, 0xD158,
+ 0x88CF, 0xD159,
+ 0x88D0, 0xD15A,
+ 0x88D1, 0xD15B,
+ 0x88D3, 0xD15C,
+ 0x88D6, 0xD15D,
+ 0x88D7, 0xD15E,
+ 0x88DA, 0xD15F,
+ 0x88DB, 0xD160,
+ 0x88DC, 0xD161,
+ 0x88DD, 0xD162,
+ 0x88DE, 0xD163,
+ 0x88E0, 0xD164,
+ 0x88E1, 0xD165,
+ 0x88E6, 0xD166,
+ 0x88E7, 0xD167,
+ 0x88E9, 0xD168,
+ 0x88EA, 0xD169,
+ 0x88EB, 0xD16A,
+ 0x88EC, 0xD16B,
+ 0x88ED, 0xD16C,
+ 0x88EE, 0xD16D,
+ 0x88EF, 0xD16E,
+ 0x88F2, 0xD16F,
+ 0x88F5, 0xD170,
+ 0x88F6, 0xD171,
+ 0x88F7, 0xD172,
+ 0x88FA, 0xD173,
+ 0x88FB, 0xD174,
+ 0x88FD, 0xD175,
+ 0x88FF, 0xD176,
+ 0x8900, 0xD177,
+ 0x8901, 0xD178,
+ 0x8903, 0xD179,
+ 0x8904, 0xD17A,
+ 0x8905, 0xD17B,
+ 0x8906, 0xD17C,
+ 0x8907, 0xD17D,
+ 0x8908, 0xD17E,
+ 0x8909, 0xD180,
+ 0x890B, 0xD181,
+ 0x890C, 0xD182,
+ 0x890D, 0xD183,
+ 0x890E, 0xD184,
+ 0x890F, 0xD185,
+ 0x8911, 0xD186,
+ 0x8914, 0xD187,
+ 0x8915, 0xD188,
+ 0x8916, 0xD189,
+ 0x8917, 0xD18A,
+ 0x8918, 0xD18B,
+ 0x891C, 0xD18C,
+ 0x891D, 0xD18D,
+ 0x891E, 0xD18E,
+ 0x891F, 0xD18F,
+ 0x8920, 0xD190,
+ 0x8922, 0xD191,
+ 0x8923, 0xD192,
+ 0x8924, 0xD193,
+ 0x8926, 0xD194,
+ 0x8927, 0xD195,
+ 0x8928, 0xD196,
+ 0x8929, 0xD197,
+ 0x892C, 0xD198,
+ 0x892D, 0xD199,
+ 0x892E, 0xD19A,
+ 0x892F, 0xD19B,
+ 0x8931, 0xD19C,
+ 0x8932, 0xD19D,
+ 0x8933, 0xD19E,
+ 0x8935, 0xD19F,
+ 0x8937, 0xD1A0,
+ 0x8938, 0xD240,
+ 0x8939, 0xD241,
+ 0x893A, 0xD242,
+ 0x893B, 0xD243,
+ 0x893C, 0xD244,
+ 0x893D, 0xD245,
+ 0x893E, 0xD246,
+ 0x893F, 0xD247,
+ 0x8940, 0xD248,
+ 0x8942, 0xD249,
+ 0x8943, 0xD24A,
+ 0x8945, 0xD24B,
+ 0x8946, 0xD24C,
+ 0x8947, 0xD24D,
+ 0x8948, 0xD24E,
+ 0x8949, 0xD24F,
+ 0x894A, 0xD250,
+ 0x894B, 0xD251,
+ 0x894C, 0xD252,
+ 0x894D, 0xD253,
+ 0x894E, 0xD254,
+ 0x894F, 0xD255,
+ 0x8950, 0xD256,
+ 0x8951, 0xD257,
+ 0x8952, 0xD258,
+ 0x8953, 0xD259,
+ 0x8954, 0xD25A,
+ 0x8955, 0xD25B,
+ 0x8956, 0xD25C,
+ 0x8957, 0xD25D,
+ 0x8958, 0xD25E,
+ 0x8959, 0xD25F,
+ 0x895A, 0xD260,
+ 0x895B, 0xD261,
+ 0x895C, 0xD262,
+ 0x895D, 0xD263,
+ 0x8960, 0xD264,
+ 0x8961, 0xD265,
+ 0x8962, 0xD266,
+ 0x8963, 0xD267,
+ 0x8964, 0xD268,
+ 0x8965, 0xD269,
+ 0x8967, 0xD26A,
+ 0x8968, 0xD26B,
+ 0x8969, 0xD26C,
+ 0x896A, 0xD26D,
+ 0x896B, 0xD26E,
+ 0x896C, 0xD26F,
+ 0x896D, 0xD270,
+ 0x896E, 0xD271,
+ 0x896F, 0xD272,
+ 0x8970, 0xD273,
+ 0x8971, 0xD274,
+ 0x8972, 0xD275,
+ 0x8973, 0xD276,
+ 0x8974, 0xD277,
+ 0x8975, 0xD278,
+ 0x8976, 0xD279,
+ 0x8977, 0xD27A,
+ 0x8978, 0xD27B,
+ 0x8979, 0xD27C,
+ 0x897A, 0xD27D,
+ 0x897C, 0xD27E,
+ 0x897D, 0xD280,
+ 0x897E, 0xD281,
+ 0x8980, 0xD282,
+ 0x8982, 0xD283,
+ 0x8984, 0xD284,
+ 0x8985, 0xD285,
+ 0x8987, 0xD286,
+ 0x8988, 0xD287,
+ 0x8989, 0xD288,
+ 0x898A, 0xD289,
+ 0x898B, 0xD28A,
+ 0x898C, 0xD28B,
+ 0x898D, 0xD28C,
+ 0x898E, 0xD28D,
+ 0x898F, 0xD28E,
+ 0x8990, 0xD28F,
+ 0x8991, 0xD290,
+ 0x8992, 0xD291,
+ 0x8993, 0xD292,
+ 0x8994, 0xD293,
+ 0x8995, 0xD294,
+ 0x8996, 0xD295,
+ 0x8997, 0xD296,
+ 0x8998, 0xD297,
+ 0x8999, 0xD298,
+ 0x899A, 0xD299,
+ 0x899B, 0xD29A,
+ 0x899C, 0xD29B,
+ 0x899D, 0xD29C,
+ 0x899E, 0xD29D,
+ 0x899F, 0xD29E,
+ 0x89A0, 0xD29F,
+ 0x89A1, 0xD2A0,
+ 0x89A2, 0xD340,
+ 0x89A3, 0xD341,
+ 0x89A4, 0xD342,
+ 0x89A5, 0xD343,
+ 0x89A6, 0xD344,
+ 0x89A7, 0xD345,
+ 0x89A8, 0xD346,
+ 0x89A9, 0xD347,
+ 0x89AA, 0xD348,
+ 0x89AB, 0xD349,
+ 0x89AC, 0xD34A,
+ 0x89AD, 0xD34B,
+ 0x89AE, 0xD34C,
+ 0x89AF, 0xD34D,
+ 0x89B0, 0xD34E,
+ 0x89B1, 0xD34F,
+ 0x89B2, 0xD350,
+ 0x89B3, 0xD351,
+ 0x89B4, 0xD352,
+ 0x89B5, 0xD353,
+ 0x89B6, 0xD354,
+ 0x89B7, 0xD355,
+ 0x89B8, 0xD356,
+ 0x89B9, 0xD357,
+ 0x89BA, 0xD358,
+ 0x89BB, 0xD359,
+ 0x89BC, 0xD35A,
+ 0x89BD, 0xD35B,
+ 0x89BE, 0xD35C,
+ 0x89BF, 0xD35D,
+ 0x89C0, 0xD35E,
+ 0x89C3, 0xD35F,
+ 0x89CD, 0xD360,
+ 0x89D3, 0xD361,
+ 0x89D4, 0xD362,
+ 0x89D5, 0xD363,
+ 0x89D7, 0xD364,
+ 0x89D8, 0xD365,
+ 0x89D9, 0xD366,
+ 0x89DB, 0xD367,
+ 0x89DD, 0xD368,
+ 0x89DF, 0xD369,
+ 0x89E0, 0xD36A,
+ 0x89E1, 0xD36B,
+ 0x89E2, 0xD36C,
+ 0x89E4, 0xD36D,
+ 0x89E7, 0xD36E,
+ 0x89E8, 0xD36F,
+ 0x89E9, 0xD370,
+ 0x89EA, 0xD371,
+ 0x89EC, 0xD372,
+ 0x89ED, 0xD373,
+ 0x89EE, 0xD374,
+ 0x89F0, 0xD375,
+ 0x89F1, 0xD376,
+ 0x89F2, 0xD377,
+ 0x89F4, 0xD378,
+ 0x89F5, 0xD379,
+ 0x89F6, 0xD37A,
+ 0x89F7, 0xD37B,
+ 0x89F8, 0xD37C,
+ 0x89F9, 0xD37D,
+ 0x89FA, 0xD37E,
+ 0x89FB, 0xD380,
+ 0x89FC, 0xD381,
+ 0x89FD, 0xD382,
+ 0x89FE, 0xD383,
+ 0x89FF, 0xD384,
+ 0x8A01, 0xD385,
+ 0x8A02, 0xD386,
+ 0x8A03, 0xD387,
+ 0x8A04, 0xD388,
+ 0x8A05, 0xD389,
+ 0x8A06, 0xD38A,
+ 0x8A08, 0xD38B,
+ 0x8A09, 0xD38C,
+ 0x8A0A, 0xD38D,
+ 0x8A0B, 0xD38E,
+ 0x8A0C, 0xD38F,
+ 0x8A0D, 0xD390,
+ 0x8A0E, 0xD391,
+ 0x8A0F, 0xD392,
+ 0x8A10, 0xD393,
+ 0x8A11, 0xD394,
+ 0x8A12, 0xD395,
+ 0x8A13, 0xD396,
+ 0x8A14, 0xD397,
+ 0x8A15, 0xD398,
+ 0x8A16, 0xD399,
+ 0x8A17, 0xD39A,
+ 0x8A18, 0xD39B,
+ 0x8A19, 0xD39C,
+ 0x8A1A, 0xD39D,
+ 0x8A1B, 0xD39E,
+ 0x8A1C, 0xD39F,
+ 0x8A1D, 0xD3A0,
+ 0x8A1E, 0xD440,
+ 0x8A1F, 0xD441,
+ 0x8A20, 0xD442,
+ 0x8A21, 0xD443,
+ 0x8A22, 0xD444,
+ 0x8A23, 0xD445,
+ 0x8A24, 0xD446,
+ 0x8A25, 0xD447,
+ 0x8A26, 0xD448,
+ 0x8A27, 0xD449,
+ 0x8A28, 0xD44A,
+ 0x8A29, 0xD44B,
+ 0x8A2A, 0xD44C,
+ 0x8A2B, 0xD44D,
+ 0x8A2C, 0xD44E,
+ 0x8A2D, 0xD44F,
+ 0x8A2E, 0xD450,
+ 0x8A2F, 0xD451,
+ 0x8A30, 0xD452,
+ 0x8A31, 0xD453,
+ 0x8A32, 0xD454,
+ 0x8A33, 0xD455,
+ 0x8A34, 0xD456,
+ 0x8A35, 0xD457,
+ 0x8A36, 0xD458,
+ 0x8A37, 0xD459,
+ 0x8A38, 0xD45A,
+ 0x8A39, 0xD45B,
+ 0x8A3A, 0xD45C,
+ 0x8A3B, 0xD45D,
+ 0x8A3C, 0xD45E,
+ 0x8A3D, 0xD45F,
+ 0x8A3F, 0xD460,
+ 0x8A40, 0xD461,
+ 0x8A41, 0xD462,
+ 0x8A42, 0xD463,
+ 0x8A43, 0xD464,
+ 0x8A44, 0xD465,
+ 0x8A45, 0xD466,
+ 0x8A46, 0xD467,
+ 0x8A47, 0xD468,
+ 0x8A49, 0xD469,
+ 0x8A4A, 0xD46A,
+ 0x8A4B, 0xD46B,
+ 0x8A4C, 0xD46C,
+ 0x8A4D, 0xD46D,
+ 0x8A4E, 0xD46E,
+ 0x8A4F, 0xD46F,
+ 0x8A50, 0xD470,
+ 0x8A51, 0xD471,
+ 0x8A52, 0xD472,
+ 0x8A53, 0xD473,
+ 0x8A54, 0xD474,
+ 0x8A55, 0xD475,
+ 0x8A56, 0xD476,
+ 0x8A57, 0xD477,
+ 0x8A58, 0xD478,
+ 0x8A59, 0xD479,
+ 0x8A5A, 0xD47A,
+ 0x8A5B, 0xD47B,
+ 0x8A5C, 0xD47C,
+ 0x8A5D, 0xD47D,
+ 0x8A5E, 0xD47E,
+ 0x8A5F, 0xD480,
+ 0x8A60, 0xD481,
+ 0x8A61, 0xD482,
+ 0x8A62, 0xD483,
+ 0x8A63, 0xD484,
+ 0x8A64, 0xD485,
+ 0x8A65, 0xD486,
+ 0x8A66, 0xD487,
+ 0x8A67, 0xD488,
+ 0x8A68, 0xD489,
+ 0x8A69, 0xD48A,
+ 0x8A6A, 0xD48B,
+ 0x8A6B, 0xD48C,
+ 0x8A6C, 0xD48D,
+ 0x8A6D, 0xD48E,
+ 0x8A6E, 0xD48F,
+ 0x8A6F, 0xD490,
+ 0x8A70, 0xD491,
+ 0x8A71, 0xD492,
+ 0x8A72, 0xD493,
+ 0x8A73, 0xD494,
+ 0x8A74, 0xD495,
+ 0x8A75, 0xD496,
+ 0x8A76, 0xD497,
+ 0x8A77, 0xD498,
+ 0x8A78, 0xD499,
+ 0x8A7A, 0xD49A,
+ 0x8A7B, 0xD49B,
+ 0x8A7C, 0xD49C,
+ 0x8A7D, 0xD49D,
+ 0x8A7E, 0xD49E,
+ 0x8A7F, 0xD49F,
+ 0x8A80, 0xD4A0,
+ 0x8A81, 0xD540,
+ 0x8A82, 0xD541,
+ 0x8A83, 0xD542,
+ 0x8A84, 0xD543,
+ 0x8A85, 0xD544,
+ 0x8A86, 0xD545,
+ 0x8A87, 0xD546,
+ 0x8A88, 0xD547,
+ 0x8A8B, 0xD548,
+ 0x8A8C, 0xD549,
+ 0x8A8D, 0xD54A,
+ 0x8A8E, 0xD54B,
+ 0x8A8F, 0xD54C,
+ 0x8A90, 0xD54D,
+ 0x8A91, 0xD54E,
+ 0x8A92, 0xD54F,
+ 0x8A94, 0xD550,
+ 0x8A95, 0xD551,
+ 0x8A96, 0xD552,
+ 0x8A97, 0xD553,
+ 0x8A98, 0xD554,
+ 0x8A99, 0xD555,
+ 0x8A9A, 0xD556,
+ 0x8A9B, 0xD557,
+ 0x8A9C, 0xD558,
+ 0x8A9D, 0xD559,
+ 0x8A9E, 0xD55A,
+ 0x8A9F, 0xD55B,
+ 0x8AA0, 0xD55C,
+ 0x8AA1, 0xD55D,
+ 0x8AA2, 0xD55E,
+ 0x8AA3, 0xD55F,
+ 0x8AA4, 0xD560,
+ 0x8AA5, 0xD561,
+ 0x8AA6, 0xD562,
+ 0x8AA7, 0xD563,
+ 0x8AA8, 0xD564,
+ 0x8AA9, 0xD565,
+ 0x8AAA, 0xD566,
+ 0x8AAB, 0xD567,
+ 0x8AAC, 0xD568,
+ 0x8AAD, 0xD569,
+ 0x8AAE, 0xD56A,
+ 0x8AAF, 0xD56B,
+ 0x8AB0, 0xD56C,
+ 0x8AB1, 0xD56D,
+ 0x8AB2, 0xD56E,
+ 0x8AB3, 0xD56F,
+ 0x8AB4, 0xD570,
+ 0x8AB5, 0xD571,
+ 0x8AB6, 0xD572,
+ 0x8AB7, 0xD573,
+ 0x8AB8, 0xD574,
+ 0x8AB9, 0xD575,
+ 0x8ABA, 0xD576,
+ 0x8ABB, 0xD577,
+ 0x8ABC, 0xD578,
+ 0x8ABD, 0xD579,
+ 0x8ABE, 0xD57A,
+ 0x8ABF, 0xD57B,
+ 0x8AC0, 0xD57C,
+ 0x8AC1, 0xD57D,
+ 0x8AC2, 0xD57E,
+ 0x8AC3, 0xD580,
+ 0x8AC4, 0xD581,
+ 0x8AC5, 0xD582,
+ 0x8AC6, 0xD583,
+ 0x8AC7, 0xD584,
+ 0x8AC8, 0xD585,
+ 0x8AC9, 0xD586,
+ 0x8ACA, 0xD587,
+ 0x8ACB, 0xD588,
+ 0x8ACC, 0xD589,
+ 0x8ACD, 0xD58A,
+ 0x8ACE, 0xD58B,
+ 0x8ACF, 0xD58C,
+ 0x8AD0, 0xD58D,
+ 0x8AD1, 0xD58E,
+ 0x8AD2, 0xD58F,
+ 0x8AD3, 0xD590,
+ 0x8AD4, 0xD591,
+ 0x8AD5, 0xD592,
+ 0x8AD6, 0xD593,
+ 0x8AD7, 0xD594,
+ 0x8AD8, 0xD595,
+ 0x8AD9, 0xD596,
+ 0x8ADA, 0xD597,
+ 0x8ADB, 0xD598,
+ 0x8ADC, 0xD599,
+ 0x8ADD, 0xD59A,
+ 0x8ADE, 0xD59B,
+ 0x8ADF, 0xD59C,
+ 0x8AE0, 0xD59D,
+ 0x8AE1, 0xD59E,
+ 0x8AE2, 0xD59F,
+ 0x8AE3, 0xD5A0,
+ 0x8AE4, 0xD640,
+ 0x8AE5, 0xD641,
+ 0x8AE6, 0xD642,
+ 0x8AE7, 0xD643,
+ 0x8AE8, 0xD644,
+ 0x8AE9, 0xD645,
+ 0x8AEA, 0xD646,
+ 0x8AEB, 0xD647,
+ 0x8AEC, 0xD648,
+ 0x8AED, 0xD649,
+ 0x8AEE, 0xD64A,
+ 0x8AEF, 0xD64B,
+ 0x8AF0, 0xD64C,
+ 0x8AF1, 0xD64D,
+ 0x8AF2, 0xD64E,
+ 0x8AF3, 0xD64F,
+ 0x8AF4, 0xD650,
+ 0x8AF5, 0xD651,
+ 0x8AF6, 0xD652,
+ 0x8AF7, 0xD653,
+ 0x8AF8, 0xD654,
+ 0x8AF9, 0xD655,
+ 0x8AFA, 0xD656,
+ 0x8AFB, 0xD657,
+ 0x8AFC, 0xD658,
+ 0x8AFD, 0xD659,
+ 0x8AFE, 0xD65A,
+ 0x8AFF, 0xD65B,
+ 0x8B00, 0xD65C,
+ 0x8B01, 0xD65D,
+ 0x8B02, 0xD65E,
+ 0x8B03, 0xD65F,
+ 0x8B04, 0xD660,
+ 0x8B05, 0xD661,
+ 0x8B06, 0xD662,
+ 0x8B08, 0xD663,
+ 0x8B09, 0xD664,
+ 0x8B0A, 0xD665,
+ 0x8B0B, 0xD666,
+ 0x8B0C, 0xD667,
+ 0x8B0D, 0xD668,
+ 0x8B0E, 0xD669,
+ 0x8B0F, 0xD66A,
+ 0x8B10, 0xD66B,
+ 0x8B11, 0xD66C,
+ 0x8B12, 0xD66D,
+ 0x8B13, 0xD66E,
+ 0x8B14, 0xD66F,
+ 0x8B15, 0xD670,
+ 0x8B16, 0xD671,
+ 0x8B17, 0xD672,
+ 0x8B18, 0xD673,
+ 0x8B19, 0xD674,
+ 0x8B1A, 0xD675,
+ 0x8B1B, 0xD676,
+ 0x8B1C, 0xD677,
+ 0x8B1D, 0xD678,
+ 0x8B1E, 0xD679,
+ 0x8B1F, 0xD67A,
+ 0x8B20, 0xD67B,
+ 0x8B21, 0xD67C,
+ 0x8B22, 0xD67D,
+ 0x8B23, 0xD67E,
+ 0x8B24, 0xD680,
+ 0x8B25, 0xD681,
+ 0x8B27, 0xD682,
+ 0x8B28, 0xD683,
+ 0x8B29, 0xD684,
+ 0x8B2A, 0xD685,
+ 0x8B2B, 0xD686,
+ 0x8B2C, 0xD687,
+ 0x8B2D, 0xD688,
+ 0x8B2E, 0xD689,
+ 0x8B2F, 0xD68A,
+ 0x8B30, 0xD68B,
+ 0x8B31, 0xD68C,
+ 0x8B32, 0xD68D,
+ 0x8B33, 0xD68E,
+ 0x8B34, 0xD68F,
+ 0x8B35, 0xD690,
+ 0x8B36, 0xD691,
+ 0x8B37, 0xD692,
+ 0x8B38, 0xD693,
+ 0x8B39, 0xD694,
+ 0x8B3A, 0xD695,
+ 0x8B3B, 0xD696,
+ 0x8B3C, 0xD697,
+ 0x8B3D, 0xD698,
+ 0x8B3E, 0xD699,
+ 0x8B3F, 0xD69A,
+ 0x8B40, 0xD69B,
+ 0x8B41, 0xD69C,
+ 0x8B42, 0xD69D,
+ 0x8B43, 0xD69E,
+ 0x8B44, 0xD69F,
+ 0x8B45, 0xD6A0,
+ 0x8B46, 0xD740,
+ 0x8B47, 0xD741,
+ 0x8B48, 0xD742,
+ 0x8B49, 0xD743,
+ 0x8B4A, 0xD744,
+ 0x8B4B, 0xD745,
+ 0x8B4C, 0xD746,
+ 0x8B4D, 0xD747,
+ 0x8B4E, 0xD748,
+ 0x8B4F, 0xD749,
+ 0x8B50, 0xD74A,
+ 0x8B51, 0xD74B,
+ 0x8B52, 0xD74C,
+ 0x8B53, 0xD74D,
+ 0x8B54, 0xD74E,
+ 0x8B55, 0xD74F,
+ 0x8B56, 0xD750,
+ 0x8B57, 0xD751,
+ 0x8B58, 0xD752,
+ 0x8B59, 0xD753,
+ 0x8B5A, 0xD754,
+ 0x8B5B, 0xD755,
+ 0x8B5C, 0xD756,
+ 0x8B5D, 0xD757,
+ 0x8B5E, 0xD758,
+ 0x8B5F, 0xD759,
+ 0x8B60, 0xD75A,
+ 0x8B61, 0xD75B,
+ 0x8B62, 0xD75C,
+ 0x8B63, 0xD75D,
+ 0x8B64, 0xD75E,
+ 0x8B65, 0xD75F,
+ 0x8B67, 0xD760,
+ 0x8B68, 0xD761,
+ 0x8B69, 0xD762,
+ 0x8B6A, 0xD763,
+ 0x8B6B, 0xD764,
+ 0x8B6D, 0xD765,
+ 0x8B6E, 0xD766,
+ 0x8B6F, 0xD767,
+ 0x8B70, 0xD768,
+ 0x8B71, 0xD769,
+ 0x8B72, 0xD76A,
+ 0x8B73, 0xD76B,
+ 0x8B74, 0xD76C,
+ 0x8B75, 0xD76D,
+ 0x8B76, 0xD76E,
+ 0x8B77, 0xD76F,
+ 0x8B78, 0xD770,
+ 0x8B79, 0xD771,
+ 0x8B7A, 0xD772,
+ 0x8B7B, 0xD773,
+ 0x8B7C, 0xD774,
+ 0x8B7D, 0xD775,
+ 0x8B7E, 0xD776,
+ 0x8B7F, 0xD777,
+ 0x8B80, 0xD778,
+ 0x8B81, 0xD779,
+ 0x8B82, 0xD77A,
+ 0x8B83, 0xD77B,
+ 0x8B84, 0xD77C,
+ 0x8B85, 0xD77D,
+ 0x8B86, 0xD77E,
+ 0x8B87, 0xD780,
+ 0x8B88, 0xD781,
+ 0x8B89, 0xD782,
+ 0x8B8A, 0xD783,
+ 0x8B8B, 0xD784,
+ 0x8B8C, 0xD785,
+ 0x8B8D, 0xD786,
+ 0x8B8E, 0xD787,
+ 0x8B8F, 0xD788,
+ 0x8B90, 0xD789,
+ 0x8B91, 0xD78A,
+ 0x8B92, 0xD78B,
+ 0x8B93, 0xD78C,
+ 0x8B94, 0xD78D,
+ 0x8B95, 0xD78E,
+ 0x8B96, 0xD78F,
+ 0x8B97, 0xD790,
+ 0x8B98, 0xD791,
+ 0x8B99, 0xD792,
+ 0x8B9A, 0xD793,
+ 0x8B9B, 0xD794,
+ 0x8B9C, 0xD795,
+ 0x8B9D, 0xD796,
+ 0x8B9E, 0xD797,
+ 0x8B9F, 0xD798,
+ 0x8BAC, 0xD799,
+ 0x8BB1, 0xD79A,
+ 0x8BBB, 0xD79B,
+ 0x8BC7, 0xD79C,
+ 0x8BD0, 0xD79D,
+ 0x8BEA, 0xD79E,
+ 0x8C09, 0xD79F,
+ 0x8C1E, 0xD7A0,
+ 0x8C38, 0xD840,
+ 0x8C39, 0xD841,
+ 0x8C3A, 0xD842,
+ 0x8C3B, 0xD843,
+ 0x8C3C, 0xD844,
+ 0x8C3D, 0xD845,
+ 0x8C3E, 0xD846,
+ 0x8C3F, 0xD847,
+ 0x8C40, 0xD848,
+ 0x8C42, 0xD849,
+ 0x8C43, 0xD84A,
+ 0x8C44, 0xD84B,
+ 0x8C45, 0xD84C,
+ 0x8C48, 0xD84D,
+ 0x8C4A, 0xD84E,
+ 0x8C4B, 0xD84F,
+ 0x8C4D, 0xD850,
+ 0x8C4E, 0xD851,
+ 0x8C4F, 0xD852,
+ 0x8C50, 0xD853,
+ 0x8C51, 0xD854,
+ 0x8C52, 0xD855,
+ 0x8C53, 0xD856,
+ 0x8C54, 0xD857,
+ 0x8C56, 0xD858,
+ 0x8C57, 0xD859,
+ 0x8C58, 0xD85A,
+ 0x8C59, 0xD85B,
+ 0x8C5B, 0xD85C,
+ 0x8C5C, 0xD85D,
+ 0x8C5D, 0xD85E,
+ 0x8C5E, 0xD85F,
+ 0x8C5F, 0xD860,
+ 0x8C60, 0xD861,
+ 0x8C63, 0xD862,
+ 0x8C64, 0xD863,
+ 0x8C65, 0xD864,
+ 0x8C66, 0xD865,
+ 0x8C67, 0xD866,
+ 0x8C68, 0xD867,
+ 0x8C69, 0xD868,
+ 0x8C6C, 0xD869,
+ 0x8C6D, 0xD86A,
+ 0x8C6E, 0xD86B,
+ 0x8C6F, 0xD86C,
+ 0x8C70, 0xD86D,
+ 0x8C71, 0xD86E,
+ 0x8C72, 0xD86F,
+ 0x8C74, 0xD870,
+ 0x8C75, 0xD871,
+ 0x8C76, 0xD872,
+ 0x8C77, 0xD873,
+ 0x8C7B, 0xD874,
+ 0x8C7C, 0xD875,
+ 0x8C7D, 0xD876,
+ 0x8C7E, 0xD877,
+ 0x8C7F, 0xD878,
+ 0x8C80, 0xD879,
+ 0x8C81, 0xD87A,
+ 0x8C83, 0xD87B,
+ 0x8C84, 0xD87C,
+ 0x8C86, 0xD87D,
+ 0x8C87, 0xD87E,
+ 0x8C88, 0xD880,
+ 0x8C8B, 0xD881,
+ 0x8C8D, 0xD882,
+ 0x8C8E, 0xD883,
+ 0x8C8F, 0xD884,
+ 0x8C90, 0xD885,
+ 0x8C91, 0xD886,
+ 0x8C92, 0xD887,
+ 0x8C93, 0xD888,
+ 0x8C95, 0xD889,
+ 0x8C96, 0xD88A,
+ 0x8C97, 0xD88B,
+ 0x8C99, 0xD88C,
+ 0x8C9A, 0xD88D,
+ 0x8C9B, 0xD88E,
+ 0x8C9C, 0xD88F,
+ 0x8C9D, 0xD890,
+ 0x8C9E, 0xD891,
+ 0x8C9F, 0xD892,
+ 0x8CA0, 0xD893,
+ 0x8CA1, 0xD894,
+ 0x8CA2, 0xD895,
+ 0x8CA3, 0xD896,
+ 0x8CA4, 0xD897,
+ 0x8CA5, 0xD898,
+ 0x8CA6, 0xD899,
+ 0x8CA7, 0xD89A,
+ 0x8CA8, 0xD89B,
+ 0x8CA9, 0xD89C,
+ 0x8CAA, 0xD89D,
+ 0x8CAB, 0xD89E,
+ 0x8CAC, 0xD89F,
+ 0x8CAD, 0xD8A0,
+ 0x8CAE, 0xD940,
+ 0x8CAF, 0xD941,
+ 0x8CB0, 0xD942,
+ 0x8CB1, 0xD943,
+ 0x8CB2, 0xD944,
+ 0x8CB3, 0xD945,
+ 0x8CB4, 0xD946,
+ 0x8CB5, 0xD947,
+ 0x8CB6, 0xD948,
+ 0x8CB7, 0xD949,
+ 0x8CB8, 0xD94A,
+ 0x8CB9, 0xD94B,
+ 0x8CBA, 0xD94C,
+ 0x8CBB, 0xD94D,
+ 0x8CBC, 0xD94E,
+ 0x8CBD, 0xD94F,
+ 0x8CBE, 0xD950,
+ 0x8CBF, 0xD951,
+ 0x8CC0, 0xD952,
+ 0x8CC1, 0xD953,
+ 0x8CC2, 0xD954,
+ 0x8CC3, 0xD955,
+ 0x8CC4, 0xD956,
+ 0x8CC5, 0xD957,
+ 0x8CC6, 0xD958,
+ 0x8CC7, 0xD959,
+ 0x8CC8, 0xD95A,
+ 0x8CC9, 0xD95B,
+ 0x8CCA, 0xD95C,
+ 0x8CCB, 0xD95D,
+ 0x8CCC, 0xD95E,
+ 0x8CCD, 0xD95F,
+ 0x8CCE, 0xD960,
+ 0x8CCF, 0xD961,
+ 0x8CD0, 0xD962,
+ 0x8CD1, 0xD963,
+ 0x8CD2, 0xD964,
+ 0x8CD3, 0xD965,
+ 0x8CD4, 0xD966,
+ 0x8CD5, 0xD967,
+ 0x8CD6, 0xD968,
+ 0x8CD7, 0xD969,
+ 0x8CD8, 0xD96A,
+ 0x8CD9, 0xD96B,
+ 0x8CDA, 0xD96C,
+ 0x8CDB, 0xD96D,
+ 0x8CDC, 0xD96E,
+ 0x8CDD, 0xD96F,
+ 0x8CDE, 0xD970,
+ 0x8CDF, 0xD971,
+ 0x8CE0, 0xD972,
+ 0x8CE1, 0xD973,
+ 0x8CE2, 0xD974,
+ 0x8CE3, 0xD975,
+ 0x8CE4, 0xD976,
+ 0x8CE5, 0xD977,
+ 0x8CE6, 0xD978,
+ 0x8CE7, 0xD979,
+ 0x8CE8, 0xD97A,
+ 0x8CE9, 0xD97B,
+ 0x8CEA, 0xD97C,
+ 0x8CEB, 0xD97D,
+ 0x8CEC, 0xD97E,
+ 0x8CED, 0xD980,
+ 0x8CEE, 0xD981,
+ 0x8CEF, 0xD982,
+ 0x8CF0, 0xD983,
+ 0x8CF1, 0xD984,
+ 0x8CF2, 0xD985,
+ 0x8CF3, 0xD986,
+ 0x8CF4, 0xD987,
+ 0x8CF5, 0xD988,
+ 0x8CF6, 0xD989,
+ 0x8CF7, 0xD98A,
+ 0x8CF8, 0xD98B,
+ 0x8CF9, 0xD98C,
+ 0x8CFA, 0xD98D,
+ 0x8CFB, 0xD98E,
+ 0x8CFC, 0xD98F,
+ 0x8CFD, 0xD990,
+ 0x8CFE, 0xD991,
+ 0x8CFF, 0xD992,
+ 0x8D00, 0xD993,
+ 0x8D01, 0xD994,
+ 0x8D02, 0xD995,
+ 0x8D03, 0xD996,
+ 0x8D04, 0xD997,
+ 0x8D05, 0xD998,
+ 0x8D06, 0xD999,
+ 0x8D07, 0xD99A,
+ 0x8D08, 0xD99B,
+ 0x8D09, 0xD99C,
+ 0x8D0A, 0xD99D,
+ 0x8D0B, 0xD99E,
+ 0x8D0C, 0xD99F,
+ 0x8D0D, 0xD9A0,
+ 0x8D0E, 0xDA40,
+ 0x8D0F, 0xDA41,
+ 0x8D10, 0xDA42,
+ 0x8D11, 0xDA43,
+ 0x8D12, 0xDA44,
+ 0x8D13, 0xDA45,
+ 0x8D14, 0xDA46,
+ 0x8D15, 0xDA47,
+ 0x8D16, 0xDA48,
+ 0x8D17, 0xDA49,
+ 0x8D18, 0xDA4A,
+ 0x8D19, 0xDA4B,
+ 0x8D1A, 0xDA4C,
+ 0x8D1B, 0xDA4D,
+ 0x8D1C, 0xDA4E,
+ 0x8D20, 0xDA4F,
+ 0x8D51, 0xDA50,
+ 0x8D52, 0xDA51,
+ 0x8D57, 0xDA52,
+ 0x8D5F, 0xDA53,
+ 0x8D65, 0xDA54,
+ 0x8D68, 0xDA55,
+ 0x8D69, 0xDA56,
+ 0x8D6A, 0xDA57,
+ 0x8D6C, 0xDA58,
+ 0x8D6E, 0xDA59,
+ 0x8D6F, 0xDA5A,
+ 0x8D71, 0xDA5B,
+ 0x8D72, 0xDA5C,
+ 0x8D78, 0xDA5D,
+ 0x8D79, 0xDA5E,
+ 0x8D7A, 0xDA5F,
+ 0x8D7B, 0xDA60,
+ 0x8D7C, 0xDA61,
+ 0x8D7D, 0xDA62,
+ 0x8D7E, 0xDA63,
+ 0x8D7F, 0xDA64,
+ 0x8D80, 0xDA65,
+ 0x8D82, 0xDA66,
+ 0x8D83, 0xDA67,
+ 0x8D86, 0xDA68,
+ 0x8D87, 0xDA69,
+ 0x8D88, 0xDA6A,
+ 0x8D89, 0xDA6B,
+ 0x8D8C, 0xDA6C,
+ 0x8D8D, 0xDA6D,
+ 0x8D8E, 0xDA6E,
+ 0x8D8F, 0xDA6F,
+ 0x8D90, 0xDA70,
+ 0x8D92, 0xDA71,
+ 0x8D93, 0xDA72,
+ 0x8D95, 0xDA73,
+ 0x8D96, 0xDA74,
+ 0x8D97, 0xDA75,
+ 0x8D98, 0xDA76,
+ 0x8D99, 0xDA77,
+ 0x8D9A, 0xDA78,
+ 0x8D9B, 0xDA79,
+ 0x8D9C, 0xDA7A,
+ 0x8D9D, 0xDA7B,
+ 0x8D9E, 0xDA7C,
+ 0x8DA0, 0xDA7D,
+ 0x8DA1, 0xDA7E,
+ 0x8DA2, 0xDA80,
+ 0x8DA4, 0xDA81,
+ 0x8DA5, 0xDA82,
+ 0x8DA6, 0xDA83,
+ 0x8DA7, 0xDA84,
+ 0x8DA8, 0xDA85,
+ 0x8DA9, 0xDA86,
+ 0x8DAA, 0xDA87,
+ 0x8DAB, 0xDA88,
+ 0x8DAC, 0xDA89,
+ 0x8DAD, 0xDA8A,
+ 0x8DAE, 0xDA8B,
+ 0x8DAF, 0xDA8C,
+ 0x8DB0, 0xDA8D,
+ 0x8DB2, 0xDA8E,
+ 0x8DB6, 0xDA8F,
+ 0x8DB7, 0xDA90,
+ 0x8DB9, 0xDA91,
+ 0x8DBB, 0xDA92,
+ 0x8DBD, 0xDA93,
+ 0x8DC0, 0xDA94,
+ 0x8DC1, 0xDA95,
+ 0x8DC2, 0xDA96,
+ 0x8DC5, 0xDA97,
+ 0x8DC7, 0xDA98,
+ 0x8DC8, 0xDA99,
+ 0x8DC9, 0xDA9A,
+ 0x8DCA, 0xDA9B,
+ 0x8DCD, 0xDA9C,
+ 0x8DD0, 0xDA9D,
+ 0x8DD2, 0xDA9E,
+ 0x8DD3, 0xDA9F,
+ 0x8DD4, 0xDAA0,
+ 0x8DD5, 0xDB40,
+ 0x8DD8, 0xDB41,
+ 0x8DD9, 0xDB42,
+ 0x8DDC, 0xDB43,
+ 0x8DE0, 0xDB44,
+ 0x8DE1, 0xDB45,
+ 0x8DE2, 0xDB46,
+ 0x8DE5, 0xDB47,
+ 0x8DE6, 0xDB48,
+ 0x8DE7, 0xDB49,
+ 0x8DE9, 0xDB4A,
+ 0x8DED, 0xDB4B,
+ 0x8DEE, 0xDB4C,
+ 0x8DF0, 0xDB4D,
+ 0x8DF1, 0xDB4E,
+ 0x8DF2, 0xDB4F,
+ 0x8DF4, 0xDB50,
+ 0x8DF6, 0xDB51,
+ 0x8DFC, 0xDB52,
+ 0x8DFE, 0xDB53,
+ 0x8DFF, 0xDB54,
+ 0x8E00, 0xDB55,
+ 0x8E01, 0xDB56,
+ 0x8E02, 0xDB57,
+ 0x8E03, 0xDB58,
+ 0x8E04, 0xDB59,
+ 0x8E06, 0xDB5A,
+ 0x8E07, 0xDB5B,
+ 0x8E08, 0xDB5C,
+ 0x8E0B, 0xDB5D,
+ 0x8E0D, 0xDB5E,
+ 0x8E0E, 0xDB5F,
+ 0x8E10, 0xDB60,
+ 0x8E11, 0xDB61,
+ 0x8E12, 0xDB62,
+ 0x8E13, 0xDB63,
+ 0x8E15, 0xDB64,
+ 0x8E16, 0xDB65,
+ 0x8E17, 0xDB66,
+ 0x8E18, 0xDB67,
+ 0x8E19, 0xDB68,
+ 0x8E1A, 0xDB69,
+ 0x8E1B, 0xDB6A,
+ 0x8E1C, 0xDB6B,
+ 0x8E20, 0xDB6C,
+ 0x8E21, 0xDB6D,
+ 0x8E24, 0xDB6E,
+ 0x8E25, 0xDB6F,
+ 0x8E26, 0xDB70,
+ 0x8E27, 0xDB71,
+ 0x8E28, 0xDB72,
+ 0x8E2B, 0xDB73,
+ 0x8E2D, 0xDB74,
+ 0x8E30, 0xDB75,
+ 0x8E32, 0xDB76,
+ 0x8E33, 0xDB77,
+ 0x8E34, 0xDB78,
+ 0x8E36, 0xDB79,
+ 0x8E37, 0xDB7A,
+ 0x8E38, 0xDB7B,
+ 0x8E3B, 0xDB7C,
+ 0x8E3C, 0xDB7D,
+ 0x8E3E, 0xDB7E,
+ 0x8E3F, 0xDB80,
+ 0x8E43, 0xDB81,
+ 0x8E45, 0xDB82,
+ 0x8E46, 0xDB83,
+ 0x8E4C, 0xDB84,
+ 0x8E4D, 0xDB85,
+ 0x8E4E, 0xDB86,
+ 0x8E4F, 0xDB87,
+ 0x8E50, 0xDB88,
+ 0x8E53, 0xDB89,
+ 0x8E54, 0xDB8A,
+ 0x8E55, 0xDB8B,
+ 0x8E56, 0xDB8C,
+ 0x8E57, 0xDB8D,
+ 0x8E58, 0xDB8E,
+ 0x8E5A, 0xDB8F,
+ 0x8E5B, 0xDB90,
+ 0x8E5C, 0xDB91,
+ 0x8E5D, 0xDB92,
+ 0x8E5E, 0xDB93,
+ 0x8E5F, 0xDB94,
+ 0x8E60, 0xDB95,
+ 0x8E61, 0xDB96,
+ 0x8E62, 0xDB97,
+ 0x8E63, 0xDB98,
+ 0x8E64, 0xDB99,
+ 0x8E65, 0xDB9A,
+ 0x8E67, 0xDB9B,
+ 0x8E68, 0xDB9C,
+ 0x8E6A, 0xDB9D,
+ 0x8E6B, 0xDB9E,
+ 0x8E6E, 0xDB9F,
+ 0x8E71, 0xDBA0,
+ 0x8E73, 0xDC40,
+ 0x8E75, 0xDC41,
+ 0x8E77, 0xDC42,
+ 0x8E78, 0xDC43,
+ 0x8E79, 0xDC44,
+ 0x8E7A, 0xDC45,
+ 0x8E7B, 0xDC46,
+ 0x8E7D, 0xDC47,
+ 0x8E7E, 0xDC48,
+ 0x8E80, 0xDC49,
+ 0x8E82, 0xDC4A,
+ 0x8E83, 0xDC4B,
+ 0x8E84, 0xDC4C,
+ 0x8E86, 0xDC4D,
+ 0x8E88, 0xDC4E,
+ 0x8E89, 0xDC4F,
+ 0x8E8A, 0xDC50,
+ 0x8E8B, 0xDC51,
+ 0x8E8C, 0xDC52,
+ 0x8E8D, 0xDC53,
+ 0x8E8E, 0xDC54,
+ 0x8E91, 0xDC55,
+ 0x8E92, 0xDC56,
+ 0x8E93, 0xDC57,
+ 0x8E95, 0xDC58,
+ 0x8E96, 0xDC59,
+ 0x8E97, 0xDC5A,
+ 0x8E98, 0xDC5B,
+ 0x8E99, 0xDC5C,
+ 0x8E9A, 0xDC5D,
+ 0x8E9B, 0xDC5E,
+ 0x8E9D, 0xDC5F,
+ 0x8E9F, 0xDC60,
+ 0x8EA0, 0xDC61,
+ 0x8EA1, 0xDC62,
+ 0x8EA2, 0xDC63,
+ 0x8EA3, 0xDC64,
+ 0x8EA4, 0xDC65,
+ 0x8EA5, 0xDC66,
+ 0x8EA6, 0xDC67,
+ 0x8EA7, 0xDC68,
+ 0x8EA8, 0xDC69,
+ 0x8EA9, 0xDC6A,
+ 0x8EAA, 0xDC6B,
+ 0x8EAD, 0xDC6C,
+ 0x8EAE, 0xDC6D,
+ 0x8EB0, 0xDC6E,
+ 0x8EB1, 0xDC6F,
+ 0x8EB3, 0xDC70,
+ 0x8EB4, 0xDC71,
+ 0x8EB5, 0xDC72,
+ 0x8EB6, 0xDC73,
+ 0x8EB7, 0xDC74,
+ 0x8EB8, 0xDC75,
+ 0x8EB9, 0xDC76,
+ 0x8EBB, 0xDC77,
+ 0x8EBC, 0xDC78,
+ 0x8EBD, 0xDC79,
+ 0x8EBE, 0xDC7A,
+ 0x8EBF, 0xDC7B,
+ 0x8EC0, 0xDC7C,
+ 0x8EC1, 0xDC7D,
+ 0x8EC2, 0xDC7E,
+ 0x8EC3, 0xDC80,
+ 0x8EC4, 0xDC81,
+ 0x8EC5, 0xDC82,
+ 0x8EC6, 0xDC83,
+ 0x8EC7, 0xDC84,
+ 0x8EC8, 0xDC85,
+ 0x8EC9, 0xDC86,
+ 0x8ECA, 0xDC87,
+ 0x8ECB, 0xDC88,
+ 0x8ECC, 0xDC89,
+ 0x8ECD, 0xDC8A,
+ 0x8ECF, 0xDC8B,
+ 0x8ED0, 0xDC8C,
+ 0x8ED1, 0xDC8D,
+ 0x8ED2, 0xDC8E,
+ 0x8ED3, 0xDC8F,
+ 0x8ED4, 0xDC90,
+ 0x8ED5, 0xDC91,
+ 0x8ED6, 0xDC92,
+ 0x8ED7, 0xDC93,
+ 0x8ED8, 0xDC94,
+ 0x8ED9, 0xDC95,
+ 0x8EDA, 0xDC96,
+ 0x8EDB, 0xDC97,
+ 0x8EDC, 0xDC98,
+ 0x8EDD, 0xDC99,
+ 0x8EDE, 0xDC9A,
+ 0x8EDF, 0xDC9B,
+ 0x8EE0, 0xDC9C,
+ 0x8EE1, 0xDC9D,
+ 0x8EE2, 0xDC9E,
+ 0x8EE3, 0xDC9F,
+ 0x8EE4, 0xDCA0,
+ 0x8EE5, 0xDD40,
+ 0x8EE6, 0xDD41,
+ 0x8EE7, 0xDD42,
+ 0x8EE8, 0xDD43,
+ 0x8EE9, 0xDD44,
+ 0x8EEA, 0xDD45,
+ 0x8EEB, 0xDD46,
+ 0x8EEC, 0xDD47,
+ 0x8EED, 0xDD48,
+ 0x8EEE, 0xDD49,
+ 0x8EEF, 0xDD4A,
+ 0x8EF0, 0xDD4B,
+ 0x8EF1, 0xDD4C,
+ 0x8EF2, 0xDD4D,
+ 0x8EF3, 0xDD4E,
+ 0x8EF4, 0xDD4F,
+ 0x8EF5, 0xDD50,
+ 0x8EF6, 0xDD51,
+ 0x8EF7, 0xDD52,
+ 0x8EF8, 0xDD53,
+ 0x8EF9, 0xDD54,
+ 0x8EFA, 0xDD55,
+ 0x8EFB, 0xDD56,
+ 0x8EFC, 0xDD57,
+ 0x8EFD, 0xDD58,
+ 0x8EFE, 0xDD59,
+ 0x8EFF, 0xDD5A,
+ 0x8F00, 0xDD5B,
+ 0x8F01, 0xDD5C,
+ 0x8F02, 0xDD5D,
+ 0x8F03, 0xDD5E,
+ 0x8F04, 0xDD5F,
+ 0x8F05, 0xDD60,
+ 0x8F06, 0xDD61,
+ 0x8F07, 0xDD62,
+ 0x8F08, 0xDD63,
+ 0x8F09, 0xDD64,
+ 0x8F0A, 0xDD65,
+ 0x8F0B, 0xDD66,
+ 0x8F0C, 0xDD67,
+ 0x8F0D, 0xDD68,
+ 0x8F0E, 0xDD69,
+ 0x8F0F, 0xDD6A,
+ 0x8F10, 0xDD6B,
+ 0x8F11, 0xDD6C,
+ 0x8F12, 0xDD6D,
+ 0x8F13, 0xDD6E,
+ 0x8F14, 0xDD6F,
+ 0x8F15, 0xDD70,
+ 0x8F16, 0xDD71,
+ 0x8F17, 0xDD72,
+ 0x8F18, 0xDD73,
+ 0x8F19, 0xDD74,
+ 0x8F1A, 0xDD75,
+ 0x8F1B, 0xDD76,
+ 0x8F1C, 0xDD77,
+ 0x8F1D, 0xDD78,
+ 0x8F1E, 0xDD79,
+ 0x8F1F, 0xDD7A,
+ 0x8F20, 0xDD7B,
+ 0x8F21, 0xDD7C,
+ 0x8F22, 0xDD7D,
+ 0x8F23, 0xDD7E,
+ 0x8F24, 0xDD80,
+ 0x8F25, 0xDD81,
+ 0x8F26, 0xDD82,
+ 0x8F27, 0xDD83,
+ 0x8F28, 0xDD84,
+ 0x8F29, 0xDD85,
+ 0x8F2A, 0xDD86,
+ 0x8F2B, 0xDD87,
+ 0x8F2C, 0xDD88,
+ 0x8F2D, 0xDD89,
+ 0x8F2E, 0xDD8A,
+ 0x8F2F, 0xDD8B,
+ 0x8F30, 0xDD8C,
+ 0x8F31, 0xDD8D,
+ 0x8F32, 0xDD8E,
+ 0x8F33, 0xDD8F,
+ 0x8F34, 0xDD90,
+ 0x8F35, 0xDD91,
+ 0x8F36, 0xDD92,
+ 0x8F37, 0xDD93,
+ 0x8F38, 0xDD94,
+ 0x8F39, 0xDD95,
+ 0x8F3A, 0xDD96,
+ 0x8F3B, 0xDD97,
+ 0x8F3C, 0xDD98,
+ 0x8F3D, 0xDD99,
+ 0x8F3E, 0xDD9A,
+ 0x8F3F, 0xDD9B,
+ 0x8F40, 0xDD9C,
+ 0x8F41, 0xDD9D,
+ 0x8F42, 0xDD9E,
+ 0x8F43, 0xDD9F,
+ 0x8F44, 0xDDA0,
+ 0x8F45, 0xDE40,
+ 0x8F46, 0xDE41,
+ 0x8F47, 0xDE42,
+ 0x8F48, 0xDE43,
+ 0x8F49, 0xDE44,
+ 0x8F4A, 0xDE45,
+ 0x8F4B, 0xDE46,
+ 0x8F4C, 0xDE47,
+ 0x8F4D, 0xDE48,
+ 0x8F4E, 0xDE49,
+ 0x8F4F, 0xDE4A,
+ 0x8F50, 0xDE4B,
+ 0x8F51, 0xDE4C,
+ 0x8F52, 0xDE4D,
+ 0x8F53, 0xDE4E,
+ 0x8F54, 0xDE4F,
+ 0x8F55, 0xDE50,
+ 0x8F56, 0xDE51,
+ 0x8F57, 0xDE52,
+ 0x8F58, 0xDE53,
+ 0x8F59, 0xDE54,
+ 0x8F5A, 0xDE55,
+ 0x8F5B, 0xDE56,
+ 0x8F5C, 0xDE57,
+ 0x8F5D, 0xDE58,
+ 0x8F5E, 0xDE59,
+ 0x8F5F, 0xDE5A,
+ 0x8F60, 0xDE5B,
+ 0x8F61, 0xDE5C,
+ 0x8F62, 0xDE5D,
+ 0x8F63, 0xDE5E,
+ 0x8F64, 0xDE5F,
+ 0x8F65, 0xDE60,
+ 0x8F6A, 0xDE61,
+ 0x8F80, 0xDE62,
+ 0x8F8C, 0xDE63,
+ 0x8F92, 0xDE64,
+ 0x8F9D, 0xDE65,
+ 0x8FA0, 0xDE66,
+ 0x8FA1, 0xDE67,
+ 0x8FA2, 0xDE68,
+ 0x8FA4, 0xDE69,
+ 0x8FA5, 0xDE6A,
+ 0x8FA6, 0xDE6B,
+ 0x8FA7, 0xDE6C,
+ 0x8FAA, 0xDE6D,
+ 0x8FAC, 0xDE6E,
+ 0x8FAD, 0xDE6F,
+ 0x8FAE, 0xDE70,
+ 0x8FAF, 0xDE71,
+ 0x8FB2, 0xDE72,
+ 0x8FB3, 0xDE73,
+ 0x8FB4, 0xDE74,
+ 0x8FB5, 0xDE75,
+ 0x8FB7, 0xDE76,
+ 0x8FB8, 0xDE77,
+ 0x8FBA, 0xDE78,
+ 0x8FBB, 0xDE79,
+ 0x8FBC, 0xDE7A,
+ 0x8FBF, 0xDE7B,
+ 0x8FC0, 0xDE7C,
+ 0x8FC3, 0xDE7D,
+ 0x8FC6, 0xDE7E,
+ 0x8FC9, 0xDE80,
+ 0x8FCA, 0xDE81,
+ 0x8FCB, 0xDE82,
+ 0x8FCC, 0xDE83,
+ 0x8FCD, 0xDE84,
+ 0x8FCF, 0xDE85,
+ 0x8FD2, 0xDE86,
+ 0x8FD6, 0xDE87,
+ 0x8FD7, 0xDE88,
+ 0x8FDA, 0xDE89,
+ 0x8FE0, 0xDE8A,
+ 0x8FE1, 0xDE8B,
+ 0x8FE3, 0xDE8C,
+ 0x8FE7, 0xDE8D,
+ 0x8FEC, 0xDE8E,
+ 0x8FEF, 0xDE8F,
+ 0x8FF1, 0xDE90,
+ 0x8FF2, 0xDE91,
+ 0x8FF4, 0xDE92,
+ 0x8FF5, 0xDE93,
+ 0x8FF6, 0xDE94,
+ 0x8FFA, 0xDE95,
+ 0x8FFB, 0xDE96,
+ 0x8FFC, 0xDE97,
+ 0x8FFE, 0xDE98,
+ 0x8FFF, 0xDE99,
+ 0x9007, 0xDE9A,
+ 0x9008, 0xDE9B,
+ 0x900C, 0xDE9C,
+ 0x900E, 0xDE9D,
+ 0x9013, 0xDE9E,
+ 0x9015, 0xDE9F,
+ 0x9018, 0xDEA0,
+ 0x9019, 0xDF40,
+ 0x901C, 0xDF41,
+ 0x9023, 0xDF42,
+ 0x9024, 0xDF43,
+ 0x9025, 0xDF44,
+ 0x9027, 0xDF45,
+ 0x9028, 0xDF46,
+ 0x9029, 0xDF47,
+ 0x902A, 0xDF48,
+ 0x902B, 0xDF49,
+ 0x902C, 0xDF4A,
+ 0x9030, 0xDF4B,
+ 0x9031, 0xDF4C,
+ 0x9032, 0xDF4D,
+ 0x9033, 0xDF4E,
+ 0x9034, 0xDF4F,
+ 0x9037, 0xDF50,
+ 0x9039, 0xDF51,
+ 0x903A, 0xDF52,
+ 0x903D, 0xDF53,
+ 0x903F, 0xDF54,
+ 0x9040, 0xDF55,
+ 0x9043, 0xDF56,
+ 0x9045, 0xDF57,
+ 0x9046, 0xDF58,
+ 0x9048, 0xDF59,
+ 0x9049, 0xDF5A,
+ 0x904A, 0xDF5B,
+ 0x904B, 0xDF5C,
+ 0x904C, 0xDF5D,
+ 0x904E, 0xDF5E,
+ 0x9054, 0xDF5F,
+ 0x9055, 0xDF60,
+ 0x9056, 0xDF61,
+ 0x9059, 0xDF62,
+ 0x905A, 0xDF63,
+ 0x905C, 0xDF64,
+ 0x905D, 0xDF65,
+ 0x905E, 0xDF66,
+ 0x905F, 0xDF67,
+ 0x9060, 0xDF68,
+ 0x9061, 0xDF69,
+ 0x9064, 0xDF6A,
+ 0x9066, 0xDF6B,
+ 0x9067, 0xDF6C,
+ 0x9069, 0xDF6D,
+ 0x906A, 0xDF6E,
+ 0x906B, 0xDF6F,
+ 0x906C, 0xDF70,
+ 0x906F, 0xDF71,
+ 0x9070, 0xDF72,
+ 0x9071, 0xDF73,
+ 0x9072, 0xDF74,
+ 0x9073, 0xDF75,
+ 0x9076, 0xDF76,
+ 0x9077, 0xDF77,
+ 0x9078, 0xDF78,
+ 0x9079, 0xDF79,
+ 0x907A, 0xDF7A,
+ 0x907B, 0xDF7B,
+ 0x907C, 0xDF7C,
+ 0x907E, 0xDF7D,
+ 0x9081, 0xDF7E,
+ 0x9084, 0xDF80,
+ 0x9085, 0xDF81,
+ 0x9086, 0xDF82,
+ 0x9087, 0xDF83,
+ 0x9089, 0xDF84,
+ 0x908A, 0xDF85,
+ 0x908C, 0xDF86,
+ 0x908D, 0xDF87,
+ 0x908E, 0xDF88,
+ 0x908F, 0xDF89,
+ 0x9090, 0xDF8A,
+ 0x9092, 0xDF8B,
+ 0x9094, 0xDF8C,
+ 0x9096, 0xDF8D,
+ 0x9098, 0xDF8E,
+ 0x909A, 0xDF8F,
+ 0x909C, 0xDF90,
+ 0x909E, 0xDF91,
+ 0x909F, 0xDF92,
+ 0x90A0, 0xDF93,
+ 0x90A4, 0xDF94,
+ 0x90A5, 0xDF95,
+ 0x90A7, 0xDF96,
+ 0x90A8, 0xDF97,
+ 0x90A9, 0xDF98,
+ 0x90AB, 0xDF99,
+ 0x90AD, 0xDF9A,
+ 0x90B2, 0xDF9B,
+ 0x90B7, 0xDF9C,
+ 0x90BC, 0xDF9D,
+ 0x90BD, 0xDF9E,
+ 0x90BF, 0xDF9F,
+ 0x90C0, 0xDFA0,
+ 0x90C2, 0xE040,
+ 0x90C3, 0xE041,
+ 0x90C6, 0xE042,
+ 0x90C8, 0xE043,
+ 0x90C9, 0xE044,
+ 0x90CB, 0xE045,
+ 0x90CC, 0xE046,
+ 0x90CD, 0xE047,
+ 0x90D2, 0xE048,
+ 0x90D4, 0xE049,
+ 0x90D5, 0xE04A,
+ 0x90D6, 0xE04B,
+ 0x90D8, 0xE04C,
+ 0x90D9, 0xE04D,
+ 0x90DA, 0xE04E,
+ 0x90DE, 0xE04F,
+ 0x90DF, 0xE050,
+ 0x90E0, 0xE051,
+ 0x90E3, 0xE052,
+ 0x90E4, 0xE053,
+ 0x90E5, 0xE054,
+ 0x90E9, 0xE055,
+ 0x90EA, 0xE056,
+ 0x90EC, 0xE057,
+ 0x90EE, 0xE058,
+ 0x90F0, 0xE059,
+ 0x90F1, 0xE05A,
+ 0x90F2, 0xE05B,
+ 0x90F3, 0xE05C,
+ 0x90F5, 0xE05D,
+ 0x90F6, 0xE05E,
+ 0x90F7, 0xE05F,
+ 0x90F9, 0xE060,
+ 0x90FA, 0xE061,
+ 0x90FB, 0xE062,
+ 0x90FC, 0xE063,
+ 0x90FF, 0xE064,
+ 0x9100, 0xE065,
+ 0x9101, 0xE066,
+ 0x9103, 0xE067,
+ 0x9105, 0xE068,
+ 0x9106, 0xE069,
+ 0x9107, 0xE06A,
+ 0x9108, 0xE06B,
+ 0x9109, 0xE06C,
+ 0x910A, 0xE06D,
+ 0x910B, 0xE06E,
+ 0x910C, 0xE06F,
+ 0x910D, 0xE070,
+ 0x910E, 0xE071,
+ 0x910F, 0xE072,
+ 0x9110, 0xE073,
+ 0x9111, 0xE074,
+ 0x9112, 0xE075,
+ 0x9113, 0xE076,
+ 0x9114, 0xE077,
+ 0x9115, 0xE078,
+ 0x9116, 0xE079,
+ 0x9117, 0xE07A,
+ 0x9118, 0xE07B,
+ 0x911A, 0xE07C,
+ 0x911B, 0xE07D,
+ 0x911C, 0xE07E,
+ 0x911D, 0xE080,
+ 0x911F, 0xE081,
+ 0x9120, 0xE082,
+ 0x9121, 0xE083,
+ 0x9124, 0xE084,
+ 0x9125, 0xE085,
+ 0x9126, 0xE086,
+ 0x9127, 0xE087,
+ 0x9128, 0xE088,
+ 0x9129, 0xE089,
+ 0x912A, 0xE08A,
+ 0x912B, 0xE08B,
+ 0x912C, 0xE08C,
+ 0x912D, 0xE08D,
+ 0x912E, 0xE08E,
+ 0x9130, 0xE08F,
+ 0x9132, 0xE090,
+ 0x9133, 0xE091,
+ 0x9134, 0xE092,
+ 0x9135, 0xE093,
+ 0x9136, 0xE094,
+ 0x9137, 0xE095,
+ 0x9138, 0xE096,
+ 0x913A, 0xE097,
+ 0x913B, 0xE098,
+ 0x913C, 0xE099,
+ 0x913D, 0xE09A,
+ 0x913E, 0xE09B,
+ 0x913F, 0xE09C,
+ 0x9140, 0xE09D,
+ 0x9141, 0xE09E,
+ 0x9142, 0xE09F,
+ 0x9144, 0xE0A0,
+ 0x9145, 0xE140,
+ 0x9147, 0xE141,
+ 0x9148, 0xE142,
+ 0x9151, 0xE143,
+ 0x9153, 0xE144,
+ 0x9154, 0xE145,
+ 0x9155, 0xE146,
+ 0x9156, 0xE147,
+ 0x9158, 0xE148,
+ 0x9159, 0xE149,
+ 0x915B, 0xE14A,
+ 0x915C, 0xE14B,
+ 0x915F, 0xE14C,
+ 0x9160, 0xE14D,
+ 0x9166, 0xE14E,
+ 0x9167, 0xE14F,
+ 0x9168, 0xE150,
+ 0x916B, 0xE151,
+ 0x916D, 0xE152,
+ 0x9173, 0xE153,
+ 0x917A, 0xE154,
+ 0x917B, 0xE155,
+ 0x917C, 0xE156,
+ 0x9180, 0xE157,
+ 0x9181, 0xE158,
+ 0x9182, 0xE159,
+ 0x9183, 0xE15A,
+ 0x9184, 0xE15B,
+ 0x9186, 0xE15C,
+ 0x9188, 0xE15D,
+ 0x918A, 0xE15E,
+ 0x918E, 0xE15F,
+ 0x918F, 0xE160,
+ 0x9193, 0xE161,
+ 0x9194, 0xE162,
+ 0x9195, 0xE163,
+ 0x9196, 0xE164,
+ 0x9197, 0xE165,
+ 0x9198, 0xE166,
+ 0x9199, 0xE167,
+ 0x919C, 0xE168,
+ 0x919D, 0xE169,
+ 0x919E, 0xE16A,
+ 0x919F, 0xE16B,
+ 0x91A0, 0xE16C,
+ 0x91A1, 0xE16D,
+ 0x91A4, 0xE16E,
+ 0x91A5, 0xE16F,
+ 0x91A6, 0xE170,
+ 0x91A7, 0xE171,
+ 0x91A8, 0xE172,
+ 0x91A9, 0xE173,
+ 0x91AB, 0xE174,
+ 0x91AC, 0xE175,
+ 0x91B0, 0xE176,
+ 0x91B1, 0xE177,
+ 0x91B2, 0xE178,
+ 0x91B3, 0xE179,
+ 0x91B6, 0xE17A,
+ 0x91B7, 0xE17B,
+ 0x91B8, 0xE17C,
+ 0x91B9, 0xE17D,
+ 0x91BB, 0xE17E,
+ 0x91BC, 0xE180,
+ 0x91BD, 0xE181,
+ 0x91BE, 0xE182,
+ 0x91BF, 0xE183,
+ 0x91C0, 0xE184,
+ 0x91C1, 0xE185,
+ 0x91C2, 0xE186,
+ 0x91C3, 0xE187,
+ 0x91C4, 0xE188,
+ 0x91C5, 0xE189,
+ 0x91C6, 0xE18A,
+ 0x91C8, 0xE18B,
+ 0x91CB, 0xE18C,
+ 0x91D0, 0xE18D,
+ 0x91D2, 0xE18E,
+ 0x91D3, 0xE18F,
+ 0x91D4, 0xE190,
+ 0x91D5, 0xE191,
+ 0x91D6, 0xE192,
+ 0x91D7, 0xE193,
+ 0x91D8, 0xE194,
+ 0x91D9, 0xE195,
+ 0x91DA, 0xE196,
+ 0x91DB, 0xE197,
+ 0x91DD, 0xE198,
+ 0x91DE, 0xE199,
+ 0x91DF, 0xE19A,
+ 0x91E0, 0xE19B,
+ 0x91E1, 0xE19C,
+ 0x91E2, 0xE19D,
+ 0x91E3, 0xE19E,
+ 0x91E4, 0xE19F,
+ 0x91E5, 0xE1A0,
+ 0x91E6, 0xE240,
+ 0x91E7, 0xE241,
+ 0x91E8, 0xE242,
+ 0x91E9, 0xE243,
+ 0x91EA, 0xE244,
+ 0x91EB, 0xE245,
+ 0x91EC, 0xE246,
+ 0x91ED, 0xE247,
+ 0x91EE, 0xE248,
+ 0x91EF, 0xE249,
+ 0x91F0, 0xE24A,
+ 0x91F1, 0xE24B,
+ 0x91F2, 0xE24C,
+ 0x91F3, 0xE24D,
+ 0x91F4, 0xE24E,
+ 0x91F5, 0xE24F,
+ 0x91F6, 0xE250,
+ 0x91F7, 0xE251,
+ 0x91F8, 0xE252,
+ 0x91F9, 0xE253,
+ 0x91FA, 0xE254,
+ 0x91FB, 0xE255,
+ 0x91FC, 0xE256,
+ 0x91FD, 0xE257,
+ 0x91FE, 0xE258,
+ 0x91FF, 0xE259,
+ 0x9200, 0xE25A,
+ 0x9201, 0xE25B,
+ 0x9202, 0xE25C,
+ 0x9203, 0xE25D,
+ 0x9204, 0xE25E,
+ 0x9205, 0xE25F,
+ 0x9206, 0xE260,
+ 0x9207, 0xE261,
+ 0x9208, 0xE262,
+ 0x9209, 0xE263,
+ 0x920A, 0xE264,
+ 0x920B, 0xE265,
+ 0x920C, 0xE266,
+ 0x920D, 0xE267,
+ 0x920E, 0xE268,
+ 0x920F, 0xE269,
+ 0x9210, 0xE26A,
+ 0x9211, 0xE26B,
+ 0x9212, 0xE26C,
+ 0x9213, 0xE26D,
+ 0x9214, 0xE26E,
+ 0x9215, 0xE26F,
+ 0x9216, 0xE270,
+ 0x9217, 0xE271,
+ 0x9218, 0xE272,
+ 0x9219, 0xE273,
+ 0x921A, 0xE274,
+ 0x921B, 0xE275,
+ 0x921C, 0xE276,
+ 0x921D, 0xE277,
+ 0x921E, 0xE278,
+ 0x921F, 0xE279,
+ 0x9220, 0xE27A,
+ 0x9221, 0xE27B,
+ 0x9222, 0xE27C,
+ 0x9223, 0xE27D,
+ 0x9224, 0xE27E,
+ 0x9225, 0xE280,
+ 0x9226, 0xE281,
+ 0x9227, 0xE282,
+ 0x9228, 0xE283,
+ 0x9229, 0xE284,
+ 0x922A, 0xE285,
+ 0x922B, 0xE286,
+ 0x922C, 0xE287,
+ 0x922D, 0xE288,
+ 0x922E, 0xE289,
+ 0x922F, 0xE28A,
+ 0x9230, 0xE28B,
+ 0x9231, 0xE28C,
+ 0x9232, 0xE28D,
+ 0x9233, 0xE28E,
+ 0x9234, 0xE28F,
+ 0x9235, 0xE290,
+ 0x9236, 0xE291,
+ 0x9237, 0xE292,
+ 0x9238, 0xE293,
+ 0x9239, 0xE294,
+ 0x923A, 0xE295,
+ 0x923B, 0xE296,
+ 0x923C, 0xE297,
+ 0x923D, 0xE298,
+ 0x923E, 0xE299,
+ 0x923F, 0xE29A,
+ 0x9240, 0xE29B,
+ 0x9241, 0xE29C,
+ 0x9242, 0xE29D,
+ 0x9243, 0xE29E,
+ 0x9244, 0xE29F,
+ 0x9245, 0xE2A0,
+ 0x9246, 0xE340,
+ 0x9247, 0xE341,
+ 0x9248, 0xE342,
+ 0x9249, 0xE343,
+ 0x924A, 0xE344,
+ 0x924B, 0xE345,
+ 0x924C, 0xE346,
+ 0x924D, 0xE347,
+ 0x924E, 0xE348,
+ 0x924F, 0xE349,
+ 0x9250, 0xE34A,
+ 0x9251, 0xE34B,
+ 0x9252, 0xE34C,
+ 0x9253, 0xE34D,
+ 0x9254, 0xE34E,
+ 0x9255, 0xE34F,
+ 0x9256, 0xE350,
+ 0x9257, 0xE351,
+ 0x9258, 0xE352,
+ 0x9259, 0xE353,
+ 0x925A, 0xE354,
+ 0x925B, 0xE355,
+ 0x925C, 0xE356,
+ 0x925D, 0xE357,
+ 0x925E, 0xE358,
+ 0x925F, 0xE359,
+ 0x9260, 0xE35A,
+ 0x9261, 0xE35B,
+ 0x9262, 0xE35C,
+ 0x9263, 0xE35D,
+ 0x9264, 0xE35E,
+ 0x9265, 0xE35F,
+ 0x9266, 0xE360,
+ 0x9267, 0xE361,
+ 0x9268, 0xE362,
+ 0x9269, 0xE363,
+ 0x926A, 0xE364,
+ 0x926B, 0xE365,
+ 0x926C, 0xE366,
+ 0x926D, 0xE367,
+ 0x926E, 0xE368,
+ 0x926F, 0xE369,
+ 0x9270, 0xE36A,
+ 0x9271, 0xE36B,
+ 0x9272, 0xE36C,
+ 0x9273, 0xE36D,
+ 0x9275, 0xE36E,
+ 0x9276, 0xE36F,
+ 0x9277, 0xE370,
+ 0x9278, 0xE371,
+ 0x9279, 0xE372,
+ 0x927A, 0xE373,
+ 0x927B, 0xE374,
+ 0x927C, 0xE375,
+ 0x927D, 0xE376,
+ 0x927E, 0xE377,
+ 0x927F, 0xE378,
+ 0x9280, 0xE379,
+ 0x9281, 0xE37A,
+ 0x9282, 0xE37B,
+ 0x9283, 0xE37C,
+ 0x9284, 0xE37D,
+ 0x9285, 0xE37E,
+ 0x9286, 0xE380,
+ 0x9287, 0xE381,
+ 0x9288, 0xE382,
+ 0x9289, 0xE383,
+ 0x928A, 0xE384,
+ 0x928B, 0xE385,
+ 0x928C, 0xE386,
+ 0x928D, 0xE387,
+ 0x928F, 0xE388,
+ 0x9290, 0xE389,
+ 0x9291, 0xE38A,
+ 0x9292, 0xE38B,
+ 0x9293, 0xE38C,
+ 0x9294, 0xE38D,
+ 0x9295, 0xE38E,
+ 0x9296, 0xE38F,
+ 0x9297, 0xE390,
+ 0x9298, 0xE391,
+ 0x9299, 0xE392,
+ 0x929A, 0xE393,
+ 0x929B, 0xE394,
+ 0x929C, 0xE395,
+ 0x929D, 0xE396,
+ 0x929E, 0xE397,
+ 0x929F, 0xE398,
+ 0x92A0, 0xE399,
+ 0x92A1, 0xE39A,
+ 0x92A2, 0xE39B,
+ 0x92A3, 0xE39C,
+ 0x92A4, 0xE39D,
+ 0x92A5, 0xE39E,
+ 0x92A6, 0xE39F,
+ 0x92A7, 0xE3A0,
+ 0x92A8, 0xE440,
+ 0x92A9, 0xE441,
+ 0x92AA, 0xE442,
+ 0x92AB, 0xE443,
+ 0x92AC, 0xE444,
+ 0x92AD, 0xE445,
+ 0x92AF, 0xE446,
+ 0x92B0, 0xE447,
+ 0x92B1, 0xE448,
+ 0x92B2, 0xE449,
+ 0x92B3, 0xE44A,
+ 0x92B4, 0xE44B,
+ 0x92B5, 0xE44C,
+ 0x92B6, 0xE44D,
+ 0x92B7, 0xE44E,
+ 0x92B8, 0xE44F,
+ 0x92B9, 0xE450,
+ 0x92BA, 0xE451,
+ 0x92BB, 0xE452,
+ 0x92BC, 0xE453,
+ 0x92BD, 0xE454,
+ 0x92BE, 0xE455,
+ 0x92BF, 0xE456,
+ 0x92C0, 0xE457,
+ 0x92C1, 0xE458,
+ 0x92C2, 0xE459,
+ 0x92C3, 0xE45A,
+ 0x92C4, 0xE45B,
+ 0x92C5, 0xE45C,
+ 0x92C6, 0xE45D,
+ 0x92C7, 0xE45E,
+ 0x92C9, 0xE45F,
+ 0x92CA, 0xE460,
+ 0x92CB, 0xE461,
+ 0x92CC, 0xE462,
+ 0x92CD, 0xE463,
+ 0x92CE, 0xE464,
+ 0x92CF, 0xE465,
+ 0x92D0, 0xE466,
+ 0x92D1, 0xE467,
+ 0x92D2, 0xE468,
+ 0x92D3, 0xE469,
+ 0x92D4, 0xE46A,
+ 0x92D5, 0xE46B,
+ 0x92D6, 0xE46C,
+ 0x92D7, 0xE46D,
+ 0x92D8, 0xE46E,
+ 0x92D9, 0xE46F,
+ 0x92DA, 0xE470,
+ 0x92DB, 0xE471,
+ 0x92DC, 0xE472,
+ 0x92DD, 0xE473,
+ 0x92DE, 0xE474,
+ 0x92DF, 0xE475,
+ 0x92E0, 0xE476,
+ 0x92E1, 0xE477,
+ 0x92E2, 0xE478,
+ 0x92E3, 0xE479,
+ 0x92E4, 0xE47A,
+ 0x92E5, 0xE47B,
+ 0x92E6, 0xE47C,
+ 0x92E7, 0xE47D,
+ 0x92E8, 0xE47E,
+ 0x92E9, 0xE480,
+ 0x92EA, 0xE481,
+ 0x92EB, 0xE482,
+ 0x92EC, 0xE483,
+ 0x92ED, 0xE484,
+ 0x92EE, 0xE485,
+ 0x92EF, 0xE486,
+ 0x92F0, 0xE487,
+ 0x92F1, 0xE488,
+ 0x92F2, 0xE489,
+ 0x92F3, 0xE48A,
+ 0x92F4, 0xE48B,
+ 0x92F5, 0xE48C,
+ 0x92F6, 0xE48D,
+ 0x92F7, 0xE48E,
+ 0x92F8, 0xE48F,
+ 0x92F9, 0xE490,
+ 0x92FA, 0xE491,
+ 0x92FB, 0xE492,
+ 0x92FC, 0xE493,
+ 0x92FD, 0xE494,
+ 0x92FE, 0xE495,
+ 0x92FF, 0xE496,
+ 0x9300, 0xE497,
+ 0x9301, 0xE498,
+ 0x9302, 0xE499,
+ 0x9303, 0xE49A,
+ 0x9304, 0xE49B,
+ 0x9305, 0xE49C,
+ 0x9306, 0xE49D,
+ 0x9307, 0xE49E,
+ 0x9308, 0xE49F,
+ 0x9309, 0xE4A0,
+ 0x930A, 0xE540,
+ 0x930B, 0xE541,
+ 0x930C, 0xE542,
+ 0x930D, 0xE543,
+ 0x930E, 0xE544,
+ 0x930F, 0xE545,
+ 0x9310, 0xE546,
+ 0x9311, 0xE547,
+ 0x9312, 0xE548,
+ 0x9313, 0xE549,
+ 0x9314, 0xE54A,
+ 0x9315, 0xE54B,
+ 0x9316, 0xE54C,
+ 0x9317, 0xE54D,
+ 0x9318, 0xE54E,
+ 0x9319, 0xE54F,
+ 0x931A, 0xE550,
+ 0x931B, 0xE551,
+ 0x931C, 0xE552,
+ 0x931D, 0xE553,
+ 0x931E, 0xE554,
+ 0x931F, 0xE555,
+ 0x9320, 0xE556,
+ 0x9321, 0xE557,
+ 0x9322, 0xE558,
+ 0x9323, 0xE559,
+ 0x9324, 0xE55A,
+ 0x9325, 0xE55B,
+ 0x9326, 0xE55C,
+ 0x9327, 0xE55D,
+ 0x9328, 0xE55E,
+ 0x9329, 0xE55F,
+ 0x932A, 0xE560,
+ 0x932B, 0xE561,
+ 0x932C, 0xE562,
+ 0x932D, 0xE563,
+ 0x932E, 0xE564,
+ 0x932F, 0xE565,
+ 0x9330, 0xE566,
+ 0x9331, 0xE567,
+ 0x9332, 0xE568,
+ 0x9333, 0xE569,
+ 0x9334, 0xE56A,
+ 0x9335, 0xE56B,
+ 0x9336, 0xE56C,
+ 0x9337, 0xE56D,
+ 0x9338, 0xE56E,
+ 0x9339, 0xE56F,
+ 0x933A, 0xE570,
+ 0x933B, 0xE571,
+ 0x933C, 0xE572,
+ 0x933D, 0xE573,
+ 0x933F, 0xE574,
+ 0x9340, 0xE575,
+ 0x9341, 0xE576,
+ 0x9342, 0xE577,
+ 0x9343, 0xE578,
+ 0x9344, 0xE579,
+ 0x9345, 0xE57A,
+ 0x9346, 0xE57B,
+ 0x9347, 0xE57C,
+ 0x9348, 0xE57D,
+ 0x9349, 0xE57E,
+ 0x934A, 0xE580,
+ 0x934B, 0xE581,
+ 0x934C, 0xE582,
+ 0x934D, 0xE583,
+ 0x934E, 0xE584,
+ 0x934F, 0xE585,
+ 0x9350, 0xE586,
+ 0x9351, 0xE587,
+ 0x9352, 0xE588,
+ 0x9353, 0xE589,
+ 0x9354, 0xE58A,
+ 0x9355, 0xE58B,
+ 0x9356, 0xE58C,
+ 0x9357, 0xE58D,
+ 0x9358, 0xE58E,
+ 0x9359, 0xE58F,
+ 0x935A, 0xE590,
+ 0x935B, 0xE591,
+ 0x935C, 0xE592,
+ 0x935D, 0xE593,
+ 0x935E, 0xE594,
+ 0x935F, 0xE595,
+ 0x9360, 0xE596,
+ 0x9361, 0xE597,
+ 0x9362, 0xE598,
+ 0x9363, 0xE599,
+ 0x9364, 0xE59A,
+ 0x9365, 0xE59B,
+ 0x9366, 0xE59C,
+ 0x9367, 0xE59D,
+ 0x9368, 0xE59E,
+ 0x9369, 0xE59F,
+ 0x936B, 0xE5A0,
+ 0x936C, 0xE640,
+ 0x936D, 0xE641,
+ 0x936E, 0xE642,
+ 0x936F, 0xE643,
+ 0x9370, 0xE644,
+ 0x9371, 0xE645,
+ 0x9372, 0xE646,
+ 0x9373, 0xE647,
+ 0x9374, 0xE648,
+ 0x9375, 0xE649,
+ 0x9376, 0xE64A,
+ 0x9377, 0xE64B,
+ 0x9378, 0xE64C,
+ 0x9379, 0xE64D,
+ 0x937A, 0xE64E,
+ 0x937B, 0xE64F,
+ 0x937C, 0xE650,
+ 0x937D, 0xE651,
+ 0x937E, 0xE652,
+ 0x937F, 0xE653,
+ 0x9380, 0xE654,
+ 0x9381, 0xE655,
+ 0x9382, 0xE656,
+ 0x9383, 0xE657,
+ 0x9384, 0xE658,
+ 0x9385, 0xE659,
+ 0x9386, 0xE65A,
+ 0x9387, 0xE65B,
+ 0x9388, 0xE65C,
+ 0x9389, 0xE65D,
+ 0x938A, 0xE65E,
+ 0x938B, 0xE65F,
+ 0x938C, 0xE660,
+ 0x938D, 0xE661,
+ 0x938E, 0xE662,
+ 0x9390, 0xE663,
+ 0x9391, 0xE664,
+ 0x9392, 0xE665,
+ 0x9393, 0xE666,
+ 0x9394, 0xE667,
+ 0x9395, 0xE668,
+ 0x9396, 0xE669,
+ 0x9397, 0xE66A,
+ 0x9398, 0xE66B,
+ 0x9399, 0xE66C,
+ 0x939A, 0xE66D,
+ 0x939B, 0xE66E,
+ 0x939C, 0xE66F,
+ 0x939D, 0xE670,
+ 0x939E, 0xE671,
+ 0x939F, 0xE672,
+ 0x93A0, 0xE673,
+ 0x93A1, 0xE674,
+ 0x93A2, 0xE675,
+ 0x93A3, 0xE676,
+ 0x93A4, 0xE677,
+ 0x93A5, 0xE678,
+ 0x93A6, 0xE679,
+ 0x93A7, 0xE67A,
+ 0x93A8, 0xE67B,
+ 0x93A9, 0xE67C,
+ 0x93AA, 0xE67D,
+ 0x93AB, 0xE67E,
+ 0x93AC, 0xE680,
+ 0x93AD, 0xE681,
+ 0x93AE, 0xE682,
+ 0x93AF, 0xE683,
+ 0x93B0, 0xE684,
+ 0x93B1, 0xE685,
+ 0x93B2, 0xE686,
+ 0x93B3, 0xE687,
+ 0x93B4, 0xE688,
+ 0x93B5, 0xE689,
+ 0x93B6, 0xE68A,
+ 0x93B7, 0xE68B,
+ 0x93B8, 0xE68C,
+ 0x93B9, 0xE68D,
+ 0x93BA, 0xE68E,
+ 0x93BB, 0xE68F,
+ 0x93BC, 0xE690,
+ 0x93BD, 0xE691,
+ 0x93BE, 0xE692,
+ 0x93BF, 0xE693,
+ 0x93C0, 0xE694,
+ 0x93C1, 0xE695,
+ 0x93C2, 0xE696,
+ 0x93C3, 0xE697,
+ 0x93C4, 0xE698,
+ 0x93C5, 0xE699,
+ 0x93C6, 0xE69A,
+ 0x93C7, 0xE69B,
+ 0x93C8, 0xE69C,
+ 0x93C9, 0xE69D,
+ 0x93CB, 0xE69E,
+ 0x93CC, 0xE69F,
+ 0x93CD, 0xE6A0,
+ 0x93CE, 0xE740,
+ 0x93CF, 0xE741,
+ 0x93D0, 0xE742,
+ 0x93D1, 0xE743,
+ 0x93D2, 0xE744,
+ 0x93D3, 0xE745,
+ 0x93D4, 0xE746,
+ 0x93D5, 0xE747,
+ 0x93D7, 0xE748,
+ 0x93D8, 0xE749,
+ 0x93D9, 0xE74A,
+ 0x93DA, 0xE74B,
+ 0x93DB, 0xE74C,
+ 0x93DC, 0xE74D,
+ 0x93DD, 0xE74E,
+ 0x93DE, 0xE74F,
+ 0x93DF, 0xE750,
+ 0x93E0, 0xE751,
+ 0x93E1, 0xE752,
+ 0x93E2, 0xE753,
+ 0x93E3, 0xE754,
+ 0x93E4, 0xE755,
+ 0x93E5, 0xE756,
+ 0x93E6, 0xE757,
+ 0x93E7, 0xE758,
+ 0x93E8, 0xE759,
+ 0x93E9, 0xE75A,
+ 0x93EA, 0xE75B,
+ 0x93EB, 0xE75C,
+ 0x93EC, 0xE75D,
+ 0x93ED, 0xE75E,
+ 0x93EE, 0xE75F,
+ 0x93EF, 0xE760,
+ 0x93F0, 0xE761,
+ 0x93F1, 0xE762,
+ 0x93F2, 0xE763,
+ 0x93F3, 0xE764,
+ 0x93F4, 0xE765,
+ 0x93F5, 0xE766,
+ 0x93F6, 0xE767,
+ 0x93F7, 0xE768,
+ 0x93F8, 0xE769,
+ 0x93F9, 0xE76A,
+ 0x93FA, 0xE76B,
+ 0x93FB, 0xE76C,
+ 0x93FC, 0xE76D,
+ 0x93FD, 0xE76E,
+ 0x93FE, 0xE76F,
+ 0x93FF, 0xE770,
+ 0x9400, 0xE771,
+ 0x9401, 0xE772,
+ 0x9402, 0xE773,
+ 0x9403, 0xE774,
+ 0x9404, 0xE775,
+ 0x9405, 0xE776,
+ 0x9406, 0xE777,
+ 0x9407, 0xE778,
+ 0x9408, 0xE779,
+ 0x9409, 0xE77A,
+ 0x940A, 0xE77B,
+ 0x940B, 0xE77C,
+ 0x940C, 0xE77D,
+ 0x940D, 0xE77E,
+ 0x940E, 0xE780,
+ 0x940F, 0xE781,
+ 0x9410, 0xE782,
+ 0x9411, 0xE783,
+ 0x9412, 0xE784,
+ 0x9413, 0xE785,
+ 0x9414, 0xE786,
+ 0x9415, 0xE787,
+ 0x9416, 0xE788,
+ 0x9417, 0xE789,
+ 0x9418, 0xE78A,
+ 0x9419, 0xE78B,
+ 0x941A, 0xE78C,
+ 0x941B, 0xE78D,
+ 0x941C, 0xE78E,
+ 0x941D, 0xE78F,
+ 0x941E, 0xE790,
+ 0x941F, 0xE791,
+ 0x9420, 0xE792,
+ 0x9421, 0xE793,
+ 0x9422, 0xE794,
+ 0x9423, 0xE795,
+ 0x9424, 0xE796,
+ 0x9425, 0xE797,
+ 0x9426, 0xE798,
+ 0x9427, 0xE799,
+ 0x9428, 0xE79A,
+ 0x9429, 0xE79B,
+ 0x942A, 0xE79C,
+ 0x942B, 0xE79D,
+ 0x942C, 0xE79E,
+ 0x942D, 0xE79F,
+ 0x942E, 0xE7A0,
+ 0x942F, 0xE840,
+ 0x9430, 0xE841,
+ 0x9431, 0xE842,
+ 0x9432, 0xE843,
+ 0x9433, 0xE844,
+ 0x9434, 0xE845,
+ 0x9435, 0xE846,
+ 0x9436, 0xE847,
+ 0x9437, 0xE848,
+ 0x9438, 0xE849,
+ 0x9439, 0xE84A,
+ 0x943A, 0xE84B,
+ 0x943B, 0xE84C,
+ 0x943C, 0xE84D,
+ 0x943D, 0xE84E,
+ 0x943F, 0xE84F,
+ 0x9440, 0xE850,
+ 0x9441, 0xE851,
+ 0x9442, 0xE852,
+ 0x9443, 0xE853,
+ 0x9444, 0xE854,
+ 0x9445, 0xE855,
+ 0x9446, 0xE856,
+ 0x9447, 0xE857,
+ 0x9448, 0xE858,
+ 0x9449, 0xE859,
+ 0x944A, 0xE85A,
+ 0x944B, 0xE85B,
+ 0x944C, 0xE85C,
+ 0x944D, 0xE85D,
+ 0x944E, 0xE85E,
+ 0x944F, 0xE85F,
+ 0x9450, 0xE860,
+ 0x9451, 0xE861,
+ 0x9452, 0xE862,
+ 0x9453, 0xE863,
+ 0x9454, 0xE864,
+ 0x9455, 0xE865,
+ 0x9456, 0xE866,
+ 0x9457, 0xE867,
+ 0x9458, 0xE868,
+ 0x9459, 0xE869,
+ 0x945A, 0xE86A,
+ 0x945B, 0xE86B,
+ 0x945C, 0xE86C,
+ 0x945D, 0xE86D,
+ 0x945E, 0xE86E,
+ 0x945F, 0xE86F,
+ 0x9460, 0xE870,
+ 0x9461, 0xE871,
+ 0x9462, 0xE872,
+ 0x9463, 0xE873,
+ 0x9464, 0xE874,
+ 0x9465, 0xE875,
+ 0x9466, 0xE876,
+ 0x9467, 0xE877,
+ 0x9468, 0xE878,
+ 0x9469, 0xE879,
+ 0x946A, 0xE87A,
+ 0x946C, 0xE87B,
+ 0x946D, 0xE87C,
+ 0x946E, 0xE87D,
+ 0x946F, 0xE87E,
+ 0x9470, 0xE880,
+ 0x9471, 0xE881,
+ 0x9472, 0xE882,
+ 0x9473, 0xE883,
+ 0x9474, 0xE884,
+ 0x9475, 0xE885,
+ 0x9476, 0xE886,
+ 0x9477, 0xE887,
+ 0x9478, 0xE888,
+ 0x9479, 0xE889,
+ 0x947A, 0xE88A,
+ 0x947B, 0xE88B,
+ 0x947C, 0xE88C,
+ 0x947D, 0xE88D,
+ 0x947E, 0xE88E,
+ 0x947F, 0xE88F,
+ 0x9480, 0xE890,
+ 0x9481, 0xE891,
+ 0x9482, 0xE892,
+ 0x9483, 0xE893,
+ 0x9484, 0xE894,
+ 0x9491, 0xE895,
+ 0x9496, 0xE896,
+ 0x9498, 0xE897,
+ 0x94C7, 0xE898,
+ 0x94CF, 0xE899,
+ 0x94D3, 0xE89A,
+ 0x94D4, 0xE89B,
+ 0x94DA, 0xE89C,
+ 0x94E6, 0xE89D,
+ 0x94FB, 0xE89E,
+ 0x951C, 0xE89F,
+ 0x9520, 0xE8A0,
+ 0x9527, 0xE940,
+ 0x9533, 0xE941,
+ 0x953D, 0xE942,
+ 0x9543, 0xE943,
+ 0x9548, 0xE944,
+ 0x954B, 0xE945,
+ 0x9555, 0xE946,
+ 0x955A, 0xE947,
+ 0x9560, 0xE948,
+ 0x956E, 0xE949,
+ 0x9574, 0xE94A,
+ 0x9575, 0xE94B,
+ 0x9577, 0xE94C,
+ 0x9578, 0xE94D,
+ 0x9579, 0xE94E,
+ 0x957A, 0xE94F,
+ 0x957B, 0xE950,
+ 0x957C, 0xE951,
+ 0x957D, 0xE952,
+ 0x957E, 0xE953,
+ 0x9580, 0xE954,
+ 0x9581, 0xE955,
+ 0x9582, 0xE956,
+ 0x9583, 0xE957,
+ 0x9584, 0xE958,
+ 0x9585, 0xE959,
+ 0x9586, 0xE95A,
+ 0x9587, 0xE95B,
+ 0x9588, 0xE95C,
+ 0x9589, 0xE95D,
+ 0x958A, 0xE95E,
+ 0x958B, 0xE95F,
+ 0x958C, 0xE960,
+ 0x958D, 0xE961,
+ 0x958E, 0xE962,
+ 0x958F, 0xE963,
+ 0x9590, 0xE964,
+ 0x9591, 0xE965,
+ 0x9592, 0xE966,
+ 0x9593, 0xE967,
+ 0x9594, 0xE968,
+ 0x9595, 0xE969,
+ 0x9596, 0xE96A,
+ 0x9597, 0xE96B,
+ 0x9598, 0xE96C,
+ 0x9599, 0xE96D,
+ 0x959A, 0xE96E,
+ 0x959B, 0xE96F,
+ 0x959C, 0xE970,
+ 0x959D, 0xE971,
+ 0x959E, 0xE972,
+ 0x959F, 0xE973,
+ 0x95A0, 0xE974,
+ 0x95A1, 0xE975,
+ 0x95A2, 0xE976,
+ 0x95A3, 0xE977,
+ 0x95A4, 0xE978,
+ 0x95A5, 0xE979,
+ 0x95A6, 0xE97A,
+ 0x95A7, 0xE97B,
+ 0x95A8, 0xE97C,
+ 0x95A9, 0xE97D,
+ 0x95AA, 0xE97E,
+ 0x95AB, 0xE980,
+ 0x95AC, 0xE981,
+ 0x95AD, 0xE982,
+ 0x95AE, 0xE983,
+ 0x95AF, 0xE984,
+ 0x95B0, 0xE985,
+ 0x95B1, 0xE986,
+ 0x95B2, 0xE987,
+ 0x95B3, 0xE988,
+ 0x95B4, 0xE989,
+ 0x95B5, 0xE98A,
+ 0x95B6, 0xE98B,
+ 0x95B7, 0xE98C,
+ 0x95B8, 0xE98D,
+ 0x95B9, 0xE98E,
+ 0x95BA, 0xE98F,
+ 0x95BB, 0xE990,
+ 0x95BC, 0xE991,
+ 0x95BD, 0xE992,
+ 0x95BE, 0xE993,
+ 0x95BF, 0xE994,
+ 0x95C0, 0xE995,
+ 0x95C1, 0xE996,
+ 0x95C2, 0xE997,
+ 0x95C3, 0xE998,
+ 0x95C4, 0xE999,
+ 0x95C5, 0xE99A,
+ 0x95C6, 0xE99B,
+ 0x95C7, 0xE99C,
+ 0x95C8, 0xE99D,
+ 0x95C9, 0xE99E,
+ 0x95CA, 0xE99F,
+ 0x95CB, 0xE9A0,
+ 0x95CC, 0xEA40,
+ 0x95CD, 0xEA41,
+ 0x95CE, 0xEA42,
+ 0x95CF, 0xEA43,
+ 0x95D0, 0xEA44,
+ 0x95D1, 0xEA45,
+ 0x95D2, 0xEA46,
+ 0x95D3, 0xEA47,
+ 0x95D4, 0xEA48,
+ 0x95D5, 0xEA49,
+ 0x95D6, 0xEA4A,
+ 0x95D7, 0xEA4B,
+ 0x95D8, 0xEA4C,
+ 0x95D9, 0xEA4D,
+ 0x95DA, 0xEA4E,
+ 0x95DB, 0xEA4F,
+ 0x95DC, 0xEA50,
+ 0x95DD, 0xEA51,
+ 0x95DE, 0xEA52,
+ 0x95DF, 0xEA53,
+ 0x95E0, 0xEA54,
+ 0x95E1, 0xEA55,
+ 0x95E2, 0xEA56,
+ 0x95E3, 0xEA57,
+ 0x95E4, 0xEA58,
+ 0x95E5, 0xEA59,
+ 0x95E6, 0xEA5A,
+ 0x95E7, 0xEA5B,
+ 0x95EC, 0xEA5C,
+ 0x95FF, 0xEA5D,
+ 0x9607, 0xEA5E,
+ 0x9613, 0xEA5F,
+ 0x9618, 0xEA60,
+ 0x961B, 0xEA61,
+ 0x961E, 0xEA62,
+ 0x9620, 0xEA63,
+ 0x9623, 0xEA64,
+ 0x9624, 0xEA65,
+ 0x9625, 0xEA66,
+ 0x9626, 0xEA67,
+ 0x9627, 0xEA68,
+ 0x9628, 0xEA69,
+ 0x9629, 0xEA6A,
+ 0x962B, 0xEA6B,
+ 0x962C, 0xEA6C,
+ 0x962D, 0xEA6D,
+ 0x962F, 0xEA6E,
+ 0x9630, 0xEA6F,
+ 0x9637, 0xEA70,
+ 0x9638, 0xEA71,
+ 0x9639, 0xEA72,
+ 0x963A, 0xEA73,
+ 0x963E, 0xEA74,
+ 0x9641, 0xEA75,
+ 0x9643, 0xEA76,
+ 0x964A, 0xEA77,
+ 0x964E, 0xEA78,
+ 0x964F, 0xEA79,
+ 0x9651, 0xEA7A,
+ 0x9652, 0xEA7B,
+ 0x9653, 0xEA7C,
+ 0x9656, 0xEA7D,
+ 0x9657, 0xEA7E,
+ 0x9658, 0xEA80,
+ 0x9659, 0xEA81,
+ 0x965A, 0xEA82,
+ 0x965C, 0xEA83,
+ 0x965D, 0xEA84,
+ 0x965E, 0xEA85,
+ 0x9660, 0xEA86,
+ 0x9663, 0xEA87,
+ 0x9665, 0xEA88,
+ 0x9666, 0xEA89,
+ 0x966B, 0xEA8A,
+ 0x966D, 0xEA8B,
+ 0x966E, 0xEA8C,
+ 0x966F, 0xEA8D,
+ 0x9670, 0xEA8E,
+ 0x9671, 0xEA8F,
+ 0x9673, 0xEA90,
+ 0x9678, 0xEA91,
+ 0x9679, 0xEA92,
+ 0x967A, 0xEA93,
+ 0x967B, 0xEA94,
+ 0x967C, 0xEA95,
+ 0x967D, 0xEA96,
+ 0x967E, 0xEA97,
+ 0x967F, 0xEA98,
+ 0x9680, 0xEA99,
+ 0x9681, 0xEA9A,
+ 0x9682, 0xEA9B,
+ 0x9683, 0xEA9C,
+ 0x9684, 0xEA9D,
+ 0x9687, 0xEA9E,
+ 0x9689, 0xEA9F,
+ 0x968A, 0xEAA0,
+ 0x968C, 0xEB40,
+ 0x968E, 0xEB41,
+ 0x9691, 0xEB42,
+ 0x9692, 0xEB43,
+ 0x9693, 0xEB44,
+ 0x9695, 0xEB45,
+ 0x9696, 0xEB46,
+ 0x969A, 0xEB47,
+ 0x969B, 0xEB48,
+ 0x969D, 0xEB49,
+ 0x969E, 0xEB4A,
+ 0x969F, 0xEB4B,
+ 0x96A0, 0xEB4C,
+ 0x96A1, 0xEB4D,
+ 0x96A2, 0xEB4E,
+ 0x96A3, 0xEB4F,
+ 0x96A4, 0xEB50,
+ 0x96A5, 0xEB51,
+ 0x96A6, 0xEB52,
+ 0x96A8, 0xEB53,
+ 0x96A9, 0xEB54,
+ 0x96AA, 0xEB55,
+ 0x96AB, 0xEB56,
+ 0x96AC, 0xEB57,
+ 0x96AD, 0xEB58,
+ 0x96AE, 0xEB59,
+ 0x96AF, 0xEB5A,
+ 0x96B1, 0xEB5B,
+ 0x96B2, 0xEB5C,
+ 0x96B4, 0xEB5D,
+ 0x96B5, 0xEB5E,
+ 0x96B7, 0xEB5F,
+ 0x96B8, 0xEB60,
+ 0x96BA, 0xEB61,
+ 0x96BB, 0xEB62,
+ 0x96BF, 0xEB63,
+ 0x96C2, 0xEB64,
+ 0x96C3, 0xEB65,
+ 0x96C8, 0xEB66,
+ 0x96CA, 0xEB67,
+ 0x96CB, 0xEB68,
+ 0x96D0, 0xEB69,
+ 0x96D1, 0xEB6A,
+ 0x96D3, 0xEB6B,
+ 0x96D4, 0xEB6C,
+ 0x96D6, 0xEB6D,
+ 0x96D7, 0xEB6E,
+ 0x96D8, 0xEB6F,
+ 0x96D9, 0xEB70,
+ 0x96DA, 0xEB71,
+ 0x96DB, 0xEB72,
+ 0x96DC, 0xEB73,
+ 0x96DD, 0xEB74,
+ 0x96DE, 0xEB75,
+ 0x96DF, 0xEB76,
+ 0x96E1, 0xEB77,
+ 0x96E2, 0xEB78,
+ 0x96E3, 0xEB79,
+ 0x96E4, 0xEB7A,
+ 0x96E5, 0xEB7B,
+ 0x96E6, 0xEB7C,
+ 0x96E7, 0xEB7D,
+ 0x96EB, 0xEB7E,
+ 0x96EC, 0xEB80,
+ 0x96ED, 0xEB81,
+ 0x96EE, 0xEB82,
+ 0x96F0, 0xEB83,
+ 0x96F1, 0xEB84,
+ 0x96F2, 0xEB85,
+ 0x96F4, 0xEB86,
+ 0x96F5, 0xEB87,
+ 0x96F8, 0xEB88,
+ 0x96FA, 0xEB89,
+ 0x96FB, 0xEB8A,
+ 0x96FC, 0xEB8B,
+ 0x96FD, 0xEB8C,
+ 0x96FF, 0xEB8D,
+ 0x9702, 0xEB8E,
+ 0x9703, 0xEB8F,
+ 0x9705, 0xEB90,
+ 0x970A, 0xEB91,
+ 0x970B, 0xEB92,
+ 0x970C, 0xEB93,
+ 0x9710, 0xEB94,
+ 0x9711, 0xEB95,
+ 0x9712, 0xEB96,
+ 0x9714, 0xEB97,
+ 0x9715, 0xEB98,
+ 0x9717, 0xEB99,
+ 0x9718, 0xEB9A,
+ 0x9719, 0xEB9B,
+ 0x971A, 0xEB9C,
+ 0x971B, 0xEB9D,
+ 0x971D, 0xEB9E,
+ 0x971F, 0xEB9F,
+ 0x9720, 0xEBA0,
+ 0x9721, 0xEC40,
+ 0x9722, 0xEC41,
+ 0x9723, 0xEC42,
+ 0x9724, 0xEC43,
+ 0x9725, 0xEC44,
+ 0x9726, 0xEC45,
+ 0x9727, 0xEC46,
+ 0x9728, 0xEC47,
+ 0x9729, 0xEC48,
+ 0x972B, 0xEC49,
+ 0x972C, 0xEC4A,
+ 0x972E, 0xEC4B,
+ 0x972F, 0xEC4C,
+ 0x9731, 0xEC4D,
+ 0x9733, 0xEC4E,
+ 0x9734, 0xEC4F,
+ 0x9735, 0xEC50,
+ 0x9736, 0xEC51,
+ 0x9737, 0xEC52,
+ 0x973A, 0xEC53,
+ 0x973B, 0xEC54,
+ 0x973C, 0xEC55,
+ 0x973D, 0xEC56,
+ 0x973F, 0xEC57,
+ 0x9740, 0xEC58,
+ 0x9741, 0xEC59,
+ 0x9742, 0xEC5A,
+ 0x9743, 0xEC5B,
+ 0x9744, 0xEC5C,
+ 0x9745, 0xEC5D,
+ 0x9746, 0xEC5E,
+ 0x9747, 0xEC5F,
+ 0x9748, 0xEC60,
+ 0x9749, 0xEC61,
+ 0x974A, 0xEC62,
+ 0x974B, 0xEC63,
+ 0x974C, 0xEC64,
+ 0x974D, 0xEC65,
+ 0x974E, 0xEC66,
+ 0x974F, 0xEC67,
+ 0x9750, 0xEC68,
+ 0x9751, 0xEC69,
+ 0x9754, 0xEC6A,
+ 0x9755, 0xEC6B,
+ 0x9757, 0xEC6C,
+ 0x9758, 0xEC6D,
+ 0x975A, 0xEC6E,
+ 0x975C, 0xEC6F,
+ 0x975D, 0xEC70,
+ 0x975F, 0xEC71,
+ 0x9763, 0xEC72,
+ 0x9764, 0xEC73,
+ 0x9766, 0xEC74,
+ 0x9767, 0xEC75,
+ 0x9768, 0xEC76,
+ 0x976A, 0xEC77,
+ 0x976B, 0xEC78,
+ 0x976C, 0xEC79,
+ 0x976D, 0xEC7A,
+ 0x976E, 0xEC7B,
+ 0x976F, 0xEC7C,
+ 0x9770, 0xEC7D,
+ 0x9771, 0xEC7E,
+ 0x9772, 0xEC80,
+ 0x9775, 0xEC81,
+ 0x9777, 0xEC82,
+ 0x9778, 0xEC83,
+ 0x9779, 0xEC84,
+ 0x977A, 0xEC85,
+ 0x977B, 0xEC86,
+ 0x977D, 0xEC87,
+ 0x977E, 0xEC88,
+ 0x977F, 0xEC89,
+ 0x9780, 0xEC8A,
+ 0x9781, 0xEC8B,
+ 0x9782, 0xEC8C,
+ 0x9783, 0xEC8D,
+ 0x9784, 0xEC8E,
+ 0x9786, 0xEC8F,
+ 0x9787, 0xEC90,
+ 0x9788, 0xEC91,
+ 0x9789, 0xEC92,
+ 0x978A, 0xEC93,
+ 0x978C, 0xEC94,
+ 0x978E, 0xEC95,
+ 0x978F, 0xEC96,
+ 0x9790, 0xEC97,
+ 0x9793, 0xEC98,
+ 0x9795, 0xEC99,
+ 0x9796, 0xEC9A,
+ 0x9797, 0xEC9B,
+ 0x9799, 0xEC9C,
+ 0x979A, 0xEC9D,
+ 0x979B, 0xEC9E,
+ 0x979C, 0xEC9F,
+ 0x979D, 0xECA0,
+ 0x979E, 0xED40,
+ 0x979F, 0xED41,
+ 0x97A1, 0xED42,
+ 0x97A2, 0xED43,
+ 0x97A4, 0xED44,
+ 0x97A5, 0xED45,
+ 0x97A6, 0xED46,
+ 0x97A7, 0xED47,
+ 0x97A8, 0xED48,
+ 0x97A9, 0xED49,
+ 0x97AA, 0xED4A,
+ 0x97AC, 0xED4B,
+ 0x97AE, 0xED4C,
+ 0x97B0, 0xED4D,
+ 0x97B1, 0xED4E,
+ 0x97B3, 0xED4F,
+ 0x97B5, 0xED50,
+ 0x97B6, 0xED51,
+ 0x97B7, 0xED52,
+ 0x97B8, 0xED53,
+ 0x97B9, 0xED54,
+ 0x97BA, 0xED55,
+ 0x97BB, 0xED56,
+ 0x97BC, 0xED57,
+ 0x97BD, 0xED58,
+ 0x97BE, 0xED59,
+ 0x97BF, 0xED5A,
+ 0x97C0, 0xED5B,
+ 0x97C1, 0xED5C,
+ 0x97C2, 0xED5D,
+ 0x97C3, 0xED5E,
+ 0x97C4, 0xED5F,
+ 0x97C5, 0xED60,
+ 0x97C6, 0xED61,
+ 0x97C7, 0xED62,
+ 0x97C8, 0xED63,
+ 0x97C9, 0xED64,
+ 0x97CA, 0xED65,
+ 0x97CB, 0xED66,
+ 0x97CC, 0xED67,
+ 0x97CD, 0xED68,
+ 0x97CE, 0xED69,
+ 0x97CF, 0xED6A,
+ 0x97D0, 0xED6B,
+ 0x97D1, 0xED6C,
+ 0x97D2, 0xED6D,
+ 0x97D3, 0xED6E,
+ 0x97D4, 0xED6F,
+ 0x97D5, 0xED70,
+ 0x97D6, 0xED71,
+ 0x97D7, 0xED72,
+ 0x97D8, 0xED73,
+ 0x97D9, 0xED74,
+ 0x97DA, 0xED75,
+ 0x97DB, 0xED76,
+ 0x97DC, 0xED77,
+ 0x97DD, 0xED78,
+ 0x97DE, 0xED79,
+ 0x97DF, 0xED7A,
+ 0x97E0, 0xED7B,
+ 0x97E1, 0xED7C,
+ 0x97E2, 0xED7D,
+ 0x97E3, 0xED7E,
+ 0x97E4, 0xED80,
+ 0x97E5, 0xED81,
+ 0x97E8, 0xED82,
+ 0x97EE, 0xED83,
+ 0x97EF, 0xED84,
+ 0x97F0, 0xED85,
+ 0x97F1, 0xED86,
+ 0x97F2, 0xED87,
+ 0x97F4, 0xED88,
+ 0x97F7, 0xED89,
+ 0x97F8, 0xED8A,
+ 0x97F9, 0xED8B,
+ 0x97FA, 0xED8C,
+ 0x97FB, 0xED8D,
+ 0x97FC, 0xED8E,
+ 0x97FD, 0xED8F,
+ 0x97FE, 0xED90,
+ 0x97FF, 0xED91,
+ 0x9800, 0xED92,
+ 0x9801, 0xED93,
+ 0x9802, 0xED94,
+ 0x9803, 0xED95,
+ 0x9804, 0xED96,
+ 0x9805, 0xED97,
+ 0x9806, 0xED98,
+ 0x9807, 0xED99,
+ 0x9808, 0xED9A,
+ 0x9809, 0xED9B,
+ 0x980A, 0xED9C,
+ 0x980B, 0xED9D,
+ 0x980C, 0xED9E,
+ 0x980D, 0xED9F,
+ 0x980E, 0xEDA0,
+ 0x980F, 0xEE40,
+ 0x9810, 0xEE41,
+ 0x9811, 0xEE42,
+ 0x9812, 0xEE43,
+ 0x9813, 0xEE44,
+ 0x9814, 0xEE45,
+ 0x9815, 0xEE46,
+ 0x9816, 0xEE47,
+ 0x9817, 0xEE48,
+ 0x9818, 0xEE49,
+ 0x9819, 0xEE4A,
+ 0x981A, 0xEE4B,
+ 0x981B, 0xEE4C,
+ 0x981C, 0xEE4D,
+ 0x981D, 0xEE4E,
+ 0x981E, 0xEE4F,
+ 0x981F, 0xEE50,
+ 0x9820, 0xEE51,
+ 0x9821, 0xEE52,
+ 0x9822, 0xEE53,
+ 0x9823, 0xEE54,
+ 0x9824, 0xEE55,
+ 0x9825, 0xEE56,
+ 0x9826, 0xEE57,
+ 0x9827, 0xEE58,
+ 0x9828, 0xEE59,
+ 0x9829, 0xEE5A,
+ 0x982A, 0xEE5B,
+ 0x982B, 0xEE5C,
+ 0x982C, 0xEE5D,
+ 0x982D, 0xEE5E,
+ 0x982E, 0xEE5F,
+ 0x982F, 0xEE60,
+ 0x9830, 0xEE61,
+ 0x9831, 0xEE62,
+ 0x9832, 0xEE63,
+ 0x9833, 0xEE64,
+ 0x9834, 0xEE65,
+ 0x9835, 0xEE66,
+ 0x9836, 0xEE67,
+ 0x9837, 0xEE68,
+ 0x9838, 0xEE69,
+ 0x9839, 0xEE6A,
+ 0x983A, 0xEE6B,
+ 0x983B, 0xEE6C,
+ 0x983C, 0xEE6D,
+ 0x983D, 0xEE6E,
+ 0x983E, 0xEE6F,
+ 0x983F, 0xEE70,
+ 0x9840, 0xEE71,
+ 0x9841, 0xEE72,
+ 0x9842, 0xEE73,
+ 0x9843, 0xEE74,
+ 0x9844, 0xEE75,
+ 0x9845, 0xEE76,
+ 0x9846, 0xEE77,
+ 0x9847, 0xEE78,
+ 0x9848, 0xEE79,
+ 0x9849, 0xEE7A,
+ 0x984A, 0xEE7B,
+ 0x984B, 0xEE7C,
+ 0x984C, 0xEE7D,
+ 0x984D, 0xEE7E,
+ 0x984E, 0xEE80,
+ 0x984F, 0xEE81,
+ 0x9850, 0xEE82,
+ 0x9851, 0xEE83,
+ 0x9852, 0xEE84,
+ 0x9853, 0xEE85,
+ 0x9854, 0xEE86,
+ 0x9855, 0xEE87,
+ 0x9856, 0xEE88,
+ 0x9857, 0xEE89,
+ 0x9858, 0xEE8A,
+ 0x9859, 0xEE8B,
+ 0x985A, 0xEE8C,
+ 0x985B, 0xEE8D,
+ 0x985C, 0xEE8E,
+ 0x985D, 0xEE8F,
+ 0x985E, 0xEE90,
+ 0x985F, 0xEE91,
+ 0x9860, 0xEE92,
+ 0x9861, 0xEE93,
+ 0x9862, 0xEE94,
+ 0x9863, 0xEE95,
+ 0x9864, 0xEE96,
+ 0x9865, 0xEE97,
+ 0x9866, 0xEE98,
+ 0x9867, 0xEE99,
+ 0x9868, 0xEE9A,
+ 0x9869, 0xEE9B,
+ 0x986A, 0xEE9C,
+ 0x986B, 0xEE9D,
+ 0x986C, 0xEE9E,
+ 0x986D, 0xEE9F,
+ 0x986E, 0xEEA0,
+ 0x986F, 0xEF40,
+ 0x9870, 0xEF41,
+ 0x9871, 0xEF42,
+ 0x9872, 0xEF43,
+ 0x9873, 0xEF44,
+ 0x9874, 0xEF45,
+ 0x988B, 0xEF46,
+ 0x988E, 0xEF47,
+ 0x9892, 0xEF48,
+ 0x9895, 0xEF49,
+ 0x9899, 0xEF4A,
+ 0x98A3, 0xEF4B,
+ 0x98A8, 0xEF4C,
+ 0x98A9, 0xEF4D,
+ 0x98AA, 0xEF4E,
+ 0x98AB, 0xEF4F,
+ 0x98AC, 0xEF50,
+ 0x98AD, 0xEF51,
+ 0x98AE, 0xEF52,
+ 0x98AF, 0xEF53,
+ 0x98B0, 0xEF54,
+ 0x98B1, 0xEF55,
+ 0x98B2, 0xEF56,
+ 0x98B3, 0xEF57,
+ 0x98B4, 0xEF58,
+ 0x98B5, 0xEF59,
+ 0x98B6, 0xEF5A,
+ 0x98B7, 0xEF5B,
+ 0x98B8, 0xEF5C,
+ 0x98B9, 0xEF5D,
+ 0x98BA, 0xEF5E,
+ 0x98BB, 0xEF5F,
+ 0x98BC, 0xEF60,
+ 0x98BD, 0xEF61,
+ 0x98BE, 0xEF62,
+ 0x98BF, 0xEF63,
+ 0x98C0, 0xEF64,
+ 0x98C1, 0xEF65,
+ 0x98C2, 0xEF66,
+ 0x98C3, 0xEF67,
+ 0x98C4, 0xEF68,
+ 0x98C5, 0xEF69,
+ 0x98C6, 0xEF6A,
+ 0x98C7, 0xEF6B,
+ 0x98C8, 0xEF6C,
+ 0x98C9, 0xEF6D,
+ 0x98CA, 0xEF6E,
+ 0x98CB, 0xEF6F,
+ 0x98CC, 0xEF70,
+ 0x98CD, 0xEF71,
+ 0x98CF, 0xEF72,
+ 0x98D0, 0xEF73,
+ 0x98D4, 0xEF74,
+ 0x98D6, 0xEF75,
+ 0x98D7, 0xEF76,
+ 0x98DB, 0xEF77,
+ 0x98DC, 0xEF78,
+ 0x98DD, 0xEF79,
+ 0x98E0, 0xEF7A,
+ 0x98E1, 0xEF7B,
+ 0x98E2, 0xEF7C,
+ 0x98E3, 0xEF7D,
+ 0x98E4, 0xEF7E,
+ 0x98E5, 0xEF80,
+ 0x98E6, 0xEF81,
+ 0x98E9, 0xEF82,
+ 0x98EA, 0xEF83,
+ 0x98EB, 0xEF84,
+ 0x98EC, 0xEF85,
+ 0x98ED, 0xEF86,
+ 0x98EE, 0xEF87,
+ 0x98EF, 0xEF88,
+ 0x98F0, 0xEF89,
+ 0x98F1, 0xEF8A,
+ 0x98F2, 0xEF8B,
+ 0x98F3, 0xEF8C,
+ 0x98F4, 0xEF8D,
+ 0x98F5, 0xEF8E,
+ 0x98F6, 0xEF8F,
+ 0x98F7, 0xEF90,
+ 0x98F8, 0xEF91,
+ 0x98F9, 0xEF92,
+ 0x98FA, 0xEF93,
+ 0x98FB, 0xEF94,
+ 0x98FC, 0xEF95,
+ 0x98FD, 0xEF96,
+ 0x98FE, 0xEF97,
+ 0x98FF, 0xEF98,
+ 0x9900, 0xEF99,
+ 0x9901, 0xEF9A,
+ 0x9902, 0xEF9B,
+ 0x9903, 0xEF9C,
+ 0x9904, 0xEF9D,
+ 0x9905, 0xEF9E,
+ 0x9906, 0xEF9F,
+ 0x9907, 0xEFA0,
+ 0x9908, 0xF040,
+ 0x9909, 0xF041,
+ 0x990A, 0xF042,
+ 0x990B, 0xF043,
+ 0x990C, 0xF044,
+ 0x990E, 0xF045,
+ 0x990F, 0xF046,
+ 0x9911, 0xF047,
+ 0x9912, 0xF048,
+ 0x9913, 0xF049,
+ 0x9914, 0xF04A,
+ 0x9915, 0xF04B,
+ 0x9916, 0xF04C,
+ 0x9917, 0xF04D,
+ 0x9918, 0xF04E,
+ 0x9919, 0xF04F,
+ 0x991A, 0xF050,
+ 0x991B, 0xF051,
+ 0x991C, 0xF052,
+ 0x991D, 0xF053,
+ 0x991E, 0xF054,
+ 0x991F, 0xF055,
+ 0x9920, 0xF056,
+ 0x9921, 0xF057,
+ 0x9922, 0xF058,
+ 0x9923, 0xF059,
+ 0x9924, 0xF05A,
+ 0x9925, 0xF05B,
+ 0x9926, 0xF05C,
+ 0x9927, 0xF05D,
+ 0x9928, 0xF05E,
+ 0x9929, 0xF05F,
+ 0x992A, 0xF060,
+ 0x992B, 0xF061,
+ 0x992C, 0xF062,
+ 0x992D, 0xF063,
+ 0x992F, 0xF064,
+ 0x9930, 0xF065,
+ 0x9931, 0xF066,
+ 0x9932, 0xF067,
+ 0x9933, 0xF068,
+ 0x9934, 0xF069,
+ 0x9935, 0xF06A,
+ 0x9936, 0xF06B,
+ 0x9937, 0xF06C,
+ 0x9938, 0xF06D,
+ 0x9939, 0xF06E,
+ 0x993A, 0xF06F,
+ 0x993B, 0xF070,
+ 0x993C, 0xF071,
+ 0x993D, 0xF072,
+ 0x993E, 0xF073,
+ 0x993F, 0xF074,
+ 0x9940, 0xF075,
+ 0x9941, 0xF076,
+ 0x9942, 0xF077,
+ 0x9943, 0xF078,
+ 0x9944, 0xF079,
+ 0x9945, 0xF07A,
+ 0x9946, 0xF07B,
+ 0x9947, 0xF07C,
+ 0x9948, 0xF07D,
+ 0x9949, 0xF07E,
+ 0x994A, 0xF080,
+ 0x994B, 0xF081,
+ 0x994C, 0xF082,
+ 0x994D, 0xF083,
+ 0x994E, 0xF084,
+ 0x994F, 0xF085,
+ 0x9950, 0xF086,
+ 0x9951, 0xF087,
+ 0x9952, 0xF088,
+ 0x9953, 0xF089,
+ 0x9956, 0xF08A,
+ 0x9957, 0xF08B,
+ 0x9958, 0xF08C,
+ 0x9959, 0xF08D,
+ 0x995A, 0xF08E,
+ 0x995B, 0xF08F,
+ 0x995C, 0xF090,
+ 0x995D, 0xF091,
+ 0x995E, 0xF092,
+ 0x995F, 0xF093,
+ 0x9960, 0xF094,
+ 0x9961, 0xF095,
+ 0x9962, 0xF096,
+ 0x9964, 0xF097,
+ 0x9966, 0xF098,
+ 0x9973, 0xF099,
+ 0x9978, 0xF09A,
+ 0x9979, 0xF09B,
+ 0x997B, 0xF09C,
+ 0x997E, 0xF09D,
+ 0x9982, 0xF09E,
+ 0x9983, 0xF09F,
+ 0x9989, 0xF0A0,
+ 0x998C, 0xF140,
+ 0x998E, 0xF141,
+ 0x999A, 0xF142,
+ 0x999B, 0xF143,
+ 0x999C, 0xF144,
+ 0x999D, 0xF145,
+ 0x999E, 0xF146,
+ 0x999F, 0xF147,
+ 0x99A0, 0xF148,
+ 0x99A1, 0xF149,
+ 0x99A2, 0xF14A,
+ 0x99A3, 0xF14B,
+ 0x99A4, 0xF14C,
+ 0x99A6, 0xF14D,
+ 0x99A7, 0xF14E,
+ 0x99A9, 0xF14F,
+ 0x99AA, 0xF150,
+ 0x99AB, 0xF151,
+ 0x99AC, 0xF152,
+ 0x99AD, 0xF153,
+ 0x99AE, 0xF154,
+ 0x99AF, 0xF155,
+ 0x99B0, 0xF156,
+ 0x99B1, 0xF157,
+ 0x99B2, 0xF158,
+ 0x99B3, 0xF159,
+ 0x99B4, 0xF15A,
+ 0x99B5, 0xF15B,
+ 0x99B6, 0xF15C,
+ 0x99B7, 0xF15D,
+ 0x99B8, 0xF15E,
+ 0x99B9, 0xF15F,
+ 0x99BA, 0xF160,
+ 0x99BB, 0xF161,
+ 0x99BC, 0xF162,
+ 0x99BD, 0xF163,
+ 0x99BE, 0xF164,
+ 0x99BF, 0xF165,
+ 0x99C0, 0xF166,
+ 0x99C1, 0xF167,
+ 0x99C2, 0xF168,
+ 0x99C3, 0xF169,
+ 0x99C4, 0xF16A,
+ 0x99C5, 0xF16B,
+ 0x99C6, 0xF16C,
+ 0x99C7, 0xF16D,
+ 0x99C8, 0xF16E,
+ 0x99C9, 0xF16F,
+ 0x99CA, 0xF170,
+ 0x99CB, 0xF171,
+ 0x99CC, 0xF172,
+ 0x99CD, 0xF173,
+ 0x99CE, 0xF174,
+ 0x99CF, 0xF175,
+ 0x99D0, 0xF176,
+ 0x99D1, 0xF177,
+ 0x99D2, 0xF178,
+ 0x99D3, 0xF179,
+ 0x99D4, 0xF17A,
+ 0x99D5, 0xF17B,
+ 0x99D6, 0xF17C,
+ 0x99D7, 0xF17D,
+ 0x99D8, 0xF17E,
+ 0x99D9, 0xF180,
+ 0x99DA, 0xF181,
+ 0x99DB, 0xF182,
+ 0x99DC, 0xF183,
+ 0x99DD, 0xF184,
+ 0x99DE, 0xF185,
+ 0x99DF, 0xF186,
+ 0x99E0, 0xF187,
+ 0x99E1, 0xF188,
+ 0x99E2, 0xF189,
+ 0x99E3, 0xF18A,
+ 0x99E4, 0xF18B,
+ 0x99E5, 0xF18C,
+ 0x99E6, 0xF18D,
+ 0x99E7, 0xF18E,
+ 0x99E8, 0xF18F,
+ 0x99E9, 0xF190,
+ 0x99EA, 0xF191,
+ 0x99EB, 0xF192,
+ 0x99EC, 0xF193,
+ 0x99ED, 0xF194,
+ 0x99EE, 0xF195,
+ 0x99EF, 0xF196,
+ 0x99F0, 0xF197,
+ 0x99F1, 0xF198,
+ 0x99F2, 0xF199,
+ 0x99F3, 0xF19A,
+ 0x99F4, 0xF19B,
+ 0x99F5, 0xF19C,
+ 0x99F6, 0xF19D,
+ 0x99F7, 0xF19E,
+ 0x99F8, 0xF19F,
+ 0x99F9, 0xF1A0,
+ 0x99FA, 0xF240,
+ 0x99FB, 0xF241,
+ 0x99FC, 0xF242,
+ 0x99FD, 0xF243,
+ 0x99FE, 0xF244,
+ 0x99FF, 0xF245,
+ 0x9A00, 0xF246,
+ 0x9A01, 0xF247,
+ 0x9A02, 0xF248,
+ 0x9A03, 0xF249,
+ 0x9A04, 0xF24A,
+ 0x9A05, 0xF24B,
+ 0x9A06, 0xF24C,
+ 0x9A07, 0xF24D,
+ 0x9A08, 0xF24E,
+ 0x9A09, 0xF24F,
+ 0x9A0A, 0xF250,
+ 0x9A0B, 0xF251,
+ 0x9A0C, 0xF252,
+ 0x9A0D, 0xF253,
+ 0x9A0E, 0xF254,
+ 0x9A0F, 0xF255,
+ 0x9A10, 0xF256,
+ 0x9A11, 0xF257,
+ 0x9A12, 0xF258,
+ 0x9A13, 0xF259,
+ 0x9A14, 0xF25A,
+ 0x9A15, 0xF25B,
+ 0x9A16, 0xF25C,
+ 0x9A17, 0xF25D,
+ 0x9A18, 0xF25E,
+ 0x9A19, 0xF25F,
+ 0x9A1A, 0xF260,
+ 0x9A1B, 0xF261,
+ 0x9A1C, 0xF262,
+ 0x9A1D, 0xF263,
+ 0x9A1E, 0xF264,
+ 0x9A1F, 0xF265,
+ 0x9A20, 0xF266,
+ 0x9A21, 0xF267,
+ 0x9A22, 0xF268,
+ 0x9A23, 0xF269,
+ 0x9A24, 0xF26A,
+ 0x9A25, 0xF26B,
+ 0x9A26, 0xF26C,
+ 0x9A27, 0xF26D,
+ 0x9A28, 0xF26E,
+ 0x9A29, 0xF26F,
+ 0x9A2A, 0xF270,
+ 0x9A2B, 0xF271,
+ 0x9A2C, 0xF272,
+ 0x9A2D, 0xF273,
+ 0x9A2E, 0xF274,
+ 0x9A2F, 0xF275,
+ 0x9A30, 0xF276,
+ 0x9A31, 0xF277,
+ 0x9A32, 0xF278,
+ 0x9A33, 0xF279,
+ 0x9A34, 0xF27A,
+ 0x9A35, 0xF27B,
+ 0x9A36, 0xF27C,
+ 0x9A37, 0xF27D,
+ 0x9A38, 0xF27E,
+ 0x9A39, 0xF280,
+ 0x9A3A, 0xF281,
+ 0x9A3B, 0xF282,
+ 0x9A3C, 0xF283,
+ 0x9A3D, 0xF284,
+ 0x9A3E, 0xF285,
+ 0x9A3F, 0xF286,
+ 0x9A40, 0xF287,
+ 0x9A41, 0xF288,
+ 0x9A42, 0xF289,
+ 0x9A43, 0xF28A,
+ 0x9A44, 0xF28B,
+ 0x9A45, 0xF28C,
+ 0x9A46, 0xF28D,
+ 0x9A47, 0xF28E,
+ 0x9A48, 0xF28F,
+ 0x9A49, 0xF290,
+ 0x9A4A, 0xF291,
+ 0x9A4B, 0xF292,
+ 0x9A4C, 0xF293,
+ 0x9A4D, 0xF294,
+ 0x9A4E, 0xF295,
+ 0x9A4F, 0xF296,
+ 0x9A50, 0xF297,
+ 0x9A51, 0xF298,
+ 0x9A52, 0xF299,
+ 0x9A53, 0xF29A,
+ 0x9A54, 0xF29B,
+ 0x9A55, 0xF29C,
+ 0x9A56, 0xF29D,
+ 0x9A57, 0xF29E,
+ 0x9A58, 0xF29F,
+ 0x9A59, 0xF2A0,
+ 0x9A5A, 0xF340,
+ 0x9A5B, 0xF341,
+ 0x9A5C, 0xF342,
+ 0x9A5D, 0xF343,
+ 0x9A5E, 0xF344,
+ 0x9A5F, 0xF345,
+ 0x9A60, 0xF346,
+ 0x9A61, 0xF347,
+ 0x9A62, 0xF348,
+ 0x9A63, 0xF349,
+ 0x9A64, 0xF34A,
+ 0x9A65, 0xF34B,
+ 0x9A66, 0xF34C,
+ 0x9A67, 0xF34D,
+ 0x9A68, 0xF34E,
+ 0x9A69, 0xF34F,
+ 0x9A6A, 0xF350,
+ 0x9A6B, 0xF351,
+ 0x9A72, 0xF352,
+ 0x9A83, 0xF353,
+ 0x9A89, 0xF354,
+ 0x9A8D, 0xF355,
+ 0x9A8E, 0xF356,
+ 0x9A94, 0xF357,
+ 0x9A95, 0xF358,
+ 0x9A99, 0xF359,
+ 0x9AA6, 0xF35A,
+ 0x9AA9, 0xF35B,
+ 0x9AAA, 0xF35C,
+ 0x9AAB, 0xF35D,
+ 0x9AAC, 0xF35E,
+ 0x9AAD, 0xF35F,
+ 0x9AAE, 0xF360,
+ 0x9AAF, 0xF361,
+ 0x9AB2, 0xF362,
+ 0x9AB3, 0xF363,
+ 0x9AB4, 0xF364,
+ 0x9AB5, 0xF365,
+ 0x9AB9, 0xF366,
+ 0x9ABB, 0xF367,
+ 0x9ABD, 0xF368,
+ 0x9ABE, 0xF369,
+ 0x9ABF, 0xF36A,
+ 0x9AC3, 0xF36B,
+ 0x9AC4, 0xF36C,
+ 0x9AC6, 0xF36D,
+ 0x9AC7, 0xF36E,
+ 0x9AC8, 0xF36F,
+ 0x9AC9, 0xF370,
+ 0x9ACA, 0xF371,
+ 0x9ACD, 0xF372,
+ 0x9ACE, 0xF373,
+ 0x9ACF, 0xF374,
+ 0x9AD0, 0xF375,
+ 0x9AD2, 0xF376,
+ 0x9AD4, 0xF377,
+ 0x9AD5, 0xF378,
+ 0x9AD6, 0xF379,
+ 0x9AD7, 0xF37A,
+ 0x9AD9, 0xF37B,
+ 0x9ADA, 0xF37C,
+ 0x9ADB, 0xF37D,
+ 0x9ADC, 0xF37E,
+ 0x9ADD, 0xF380,
+ 0x9ADE, 0xF381,
+ 0x9AE0, 0xF382,
+ 0x9AE2, 0xF383,
+ 0x9AE3, 0xF384,
+ 0x9AE4, 0xF385,
+ 0x9AE5, 0xF386,
+ 0x9AE7, 0xF387,
+ 0x9AE8, 0xF388,
+ 0x9AE9, 0xF389,
+ 0x9AEA, 0xF38A,
+ 0x9AEC, 0xF38B,
+ 0x9AEE, 0xF38C,
+ 0x9AF0, 0xF38D,
+ 0x9AF1, 0xF38E,
+ 0x9AF2, 0xF38F,
+ 0x9AF3, 0xF390,
+ 0x9AF4, 0xF391,
+ 0x9AF5, 0xF392,
+ 0x9AF6, 0xF393,
+ 0x9AF7, 0xF394,
+ 0x9AF8, 0xF395,
+ 0x9AFA, 0xF396,
+ 0x9AFC, 0xF397,
+ 0x9AFD, 0xF398,
+ 0x9AFE, 0xF399,
+ 0x9AFF, 0xF39A,
+ 0x9B00, 0xF39B,
+ 0x9B01, 0xF39C,
+ 0x9B02, 0xF39D,
+ 0x9B04, 0xF39E,
+ 0x9B05, 0xF39F,
+ 0x9B06, 0xF3A0,
+ 0x9B07, 0xF440,
+ 0x9B09, 0xF441,
+ 0x9B0A, 0xF442,
+ 0x9B0B, 0xF443,
+ 0x9B0C, 0xF444,
+ 0x9B0D, 0xF445,
+ 0x9B0E, 0xF446,
+ 0x9B10, 0xF447,
+ 0x9B11, 0xF448,
+ 0x9B12, 0xF449,
+ 0x9B14, 0xF44A,
+ 0x9B15, 0xF44B,
+ 0x9B16, 0xF44C,
+ 0x9B17, 0xF44D,
+ 0x9B18, 0xF44E,
+ 0x9B19, 0xF44F,
+ 0x9B1A, 0xF450,
+ 0x9B1B, 0xF451,
+ 0x9B1C, 0xF452,
+ 0x9B1D, 0xF453,
+ 0x9B1E, 0xF454,
+ 0x9B20, 0xF455,
+ 0x9B21, 0xF456,
+ 0x9B22, 0xF457,
+ 0x9B24, 0xF458,
+ 0x9B25, 0xF459,
+ 0x9B26, 0xF45A,
+ 0x9B27, 0xF45B,
+ 0x9B28, 0xF45C,
+ 0x9B29, 0xF45D,
+ 0x9B2A, 0xF45E,
+ 0x9B2B, 0xF45F,
+ 0x9B2C, 0xF460,
+ 0x9B2D, 0xF461,
+ 0x9B2E, 0xF462,
+ 0x9B30, 0xF463,
+ 0x9B31, 0xF464,
+ 0x9B33, 0xF465,
+ 0x9B34, 0xF466,
+ 0x9B35, 0xF467,
+ 0x9B36, 0xF468,
+ 0x9B37, 0xF469,
+ 0x9B38, 0xF46A,
+ 0x9B39, 0xF46B,
+ 0x9B3A, 0xF46C,
+ 0x9B3D, 0xF46D,
+ 0x9B3E, 0xF46E,
+ 0x9B3F, 0xF46F,
+ 0x9B40, 0xF470,
+ 0x9B46, 0xF471,
+ 0x9B4A, 0xF472,
+ 0x9B4B, 0xF473,
+ 0x9B4C, 0xF474,
+ 0x9B4E, 0xF475,
+ 0x9B50, 0xF476,
+ 0x9B52, 0xF477,
+ 0x9B53, 0xF478,
+ 0x9B55, 0xF479,
+ 0x9B56, 0xF47A,
+ 0x9B57, 0xF47B,
+ 0x9B58, 0xF47C,
+ 0x9B59, 0xF47D,
+ 0x9B5A, 0xF47E,
+ 0x9B5B, 0xF480,
+ 0x9B5C, 0xF481,
+ 0x9B5D, 0xF482,
+ 0x9B5E, 0xF483,
+ 0x9B5F, 0xF484,
+ 0x9B60, 0xF485,
+ 0x9B61, 0xF486,
+ 0x9B62, 0xF487,
+ 0x9B63, 0xF488,
+ 0x9B64, 0xF489,
+ 0x9B65, 0xF48A,
+ 0x9B66, 0xF48B,
+ 0x9B67, 0xF48C,
+ 0x9B68, 0xF48D,
+ 0x9B69, 0xF48E,
+ 0x9B6A, 0xF48F,
+ 0x9B6B, 0xF490,
+ 0x9B6C, 0xF491,
+ 0x9B6D, 0xF492,
+ 0x9B6E, 0xF493,
+ 0x9B6F, 0xF494,
+ 0x9B70, 0xF495,
+ 0x9B71, 0xF496,
+ 0x9B72, 0xF497,
+ 0x9B73, 0xF498,
+ 0x9B74, 0xF499,
+ 0x9B75, 0xF49A,
+ 0x9B76, 0xF49B,
+ 0x9B77, 0xF49C,
+ 0x9B78, 0xF49D,
+ 0x9B79, 0xF49E,
+ 0x9B7A, 0xF49F,
+ 0x9B7B, 0xF4A0,
+ 0x9B7C, 0xF540,
+ 0x9B7D, 0xF541,
+ 0x9B7E, 0xF542,
+ 0x9B7F, 0xF543,
+ 0x9B80, 0xF544,
+ 0x9B81, 0xF545,
+ 0x9B82, 0xF546,
+ 0x9B83, 0xF547,
+ 0x9B84, 0xF548,
+ 0x9B85, 0xF549,
+ 0x9B86, 0xF54A,
+ 0x9B87, 0xF54B,
+ 0x9B88, 0xF54C,
+ 0x9B89, 0xF54D,
+ 0x9B8A, 0xF54E,
+ 0x9B8B, 0xF54F,
+ 0x9B8C, 0xF550,
+ 0x9B8D, 0xF551,
+ 0x9B8E, 0xF552,
+ 0x9B8F, 0xF553,
+ 0x9B90, 0xF554,
+ 0x9B91, 0xF555,
+ 0x9B92, 0xF556,
+ 0x9B93, 0xF557,
+ 0x9B94, 0xF558,
+ 0x9B95, 0xF559,
+ 0x9B96, 0xF55A,
+ 0x9B97, 0xF55B,
+ 0x9B98, 0xF55C,
+ 0x9B99, 0xF55D,
+ 0x9B9A, 0xF55E,
+ 0x9B9B, 0xF55F,
+ 0x9B9C, 0xF560,
+ 0x9B9D, 0xF561,
+ 0x9B9E, 0xF562,
+ 0x9B9F, 0xF563,
+ 0x9BA0, 0xF564,
+ 0x9BA1, 0xF565,
+ 0x9BA2, 0xF566,
+ 0x9BA3, 0xF567,
+ 0x9BA4, 0xF568,
+ 0x9BA5, 0xF569,
+ 0x9BA6, 0xF56A,
+ 0x9BA7, 0xF56B,
+ 0x9BA8, 0xF56C,
+ 0x9BA9, 0xF56D,
+ 0x9BAA, 0xF56E,
+ 0x9BAB, 0xF56F,
+ 0x9BAC, 0xF570,
+ 0x9BAD, 0xF571,
+ 0x9BAE, 0xF572,
+ 0x9BAF, 0xF573,
+ 0x9BB0, 0xF574,
+ 0x9BB1, 0xF575,
+ 0x9BB2, 0xF576,
+ 0x9BB3, 0xF577,
+ 0x9BB4, 0xF578,
+ 0x9BB5, 0xF579,
+ 0x9BB6, 0xF57A,
+ 0x9BB7, 0xF57B,
+ 0x9BB8, 0xF57C,
+ 0x9BB9, 0xF57D,
+ 0x9BBA, 0xF57E,
+ 0x9BBB, 0xF580,
+ 0x9BBC, 0xF581,
+ 0x9BBD, 0xF582,
+ 0x9BBE, 0xF583,
+ 0x9BBF, 0xF584,
+ 0x9BC0, 0xF585,
+ 0x9BC1, 0xF586,
+ 0x9BC2, 0xF587,
+ 0x9BC3, 0xF588,
+ 0x9BC4, 0xF589,
+ 0x9BC5, 0xF58A,
+ 0x9BC6, 0xF58B,
+ 0x9BC7, 0xF58C,
+ 0x9BC8, 0xF58D,
+ 0x9BC9, 0xF58E,
+ 0x9BCA, 0xF58F,
+ 0x9BCB, 0xF590,
+ 0x9BCC, 0xF591,
+ 0x9BCD, 0xF592,
+ 0x9BCE, 0xF593,
+ 0x9BCF, 0xF594,
+ 0x9BD0, 0xF595,
+ 0x9BD1, 0xF596,
+ 0x9BD2, 0xF597,
+ 0x9BD3, 0xF598,
+ 0x9BD4, 0xF599,
+ 0x9BD5, 0xF59A,
+ 0x9BD6, 0xF59B,
+ 0x9BD7, 0xF59C,
+ 0x9BD8, 0xF59D,
+ 0x9BD9, 0xF59E,
+ 0x9BDA, 0xF59F,
+ 0x9BDB, 0xF5A0,
+ 0x9BDC, 0xF640,
+ 0x9BDD, 0xF641,
+ 0x9BDE, 0xF642,
+ 0x9BDF, 0xF643,
+ 0x9BE0, 0xF644,
+ 0x9BE1, 0xF645,
+ 0x9BE2, 0xF646,
+ 0x9BE3, 0xF647,
+ 0x9BE4, 0xF648,
+ 0x9BE5, 0xF649,
+ 0x9BE6, 0xF64A,
+ 0x9BE7, 0xF64B,
+ 0x9BE8, 0xF64C,
+ 0x9BE9, 0xF64D,
+ 0x9BEA, 0xF64E,
+ 0x9BEB, 0xF64F,
+ 0x9BEC, 0xF650,
+ 0x9BED, 0xF651,
+ 0x9BEE, 0xF652,
+ 0x9BEF, 0xF653,
+ 0x9BF0, 0xF654,
+ 0x9BF1, 0xF655,
+ 0x9BF2, 0xF656,
+ 0x9BF3, 0xF657,
+ 0x9BF4, 0xF658,
+ 0x9BF5, 0xF659,
+ 0x9BF6, 0xF65A,
+ 0x9BF7, 0xF65B,
+ 0x9BF8, 0xF65C,
+ 0x9BF9, 0xF65D,
+ 0x9BFA, 0xF65E,
+ 0x9BFB, 0xF65F,
+ 0x9BFC, 0xF660,
+ 0x9BFD, 0xF661,
+ 0x9BFE, 0xF662,
+ 0x9BFF, 0xF663,
+ 0x9C00, 0xF664,
+ 0x9C01, 0xF665,
+ 0x9C02, 0xF666,
+ 0x9C03, 0xF667,
+ 0x9C04, 0xF668,
+ 0x9C05, 0xF669,
+ 0x9C06, 0xF66A,
+ 0x9C07, 0xF66B,
+ 0x9C08, 0xF66C,
+ 0x9C09, 0xF66D,
+ 0x9C0A, 0xF66E,
+ 0x9C0B, 0xF66F,
+ 0x9C0C, 0xF670,
+ 0x9C0D, 0xF671,
+ 0x9C0E, 0xF672,
+ 0x9C0F, 0xF673,
+ 0x9C10, 0xF674,
+ 0x9C11, 0xF675,
+ 0x9C12, 0xF676,
+ 0x9C13, 0xF677,
+ 0x9C14, 0xF678,
+ 0x9C15, 0xF679,
+ 0x9C16, 0xF67A,
+ 0x9C17, 0xF67B,
+ 0x9C18, 0xF67C,
+ 0x9C19, 0xF67D,
+ 0x9C1A, 0xF67E,
+ 0x9C1B, 0xF680,
+ 0x9C1C, 0xF681,
+ 0x9C1D, 0xF682,
+ 0x9C1E, 0xF683,
+ 0x9C1F, 0xF684,
+ 0x9C20, 0xF685,
+ 0x9C21, 0xF686,
+ 0x9C22, 0xF687,
+ 0x9C23, 0xF688,
+ 0x9C24, 0xF689,
+ 0x9C25, 0xF68A,
+ 0x9C26, 0xF68B,
+ 0x9C27, 0xF68C,
+ 0x9C28, 0xF68D,
+ 0x9C29, 0xF68E,
+ 0x9C2A, 0xF68F,
+ 0x9C2B, 0xF690,
+ 0x9C2C, 0xF691,
+ 0x9C2D, 0xF692,
+ 0x9C2E, 0xF693,
+ 0x9C2F, 0xF694,
+ 0x9C30, 0xF695,
+ 0x9C31, 0xF696,
+ 0x9C32, 0xF697,
+ 0x9C33, 0xF698,
+ 0x9C34, 0xF699,
+ 0x9C35, 0xF69A,
+ 0x9C36, 0xF69B,
+ 0x9C37, 0xF69C,
+ 0x9C38, 0xF69D,
+ 0x9C39, 0xF69E,
+ 0x9C3A, 0xF69F,
+ 0x9C3B, 0xF6A0,
+ 0x9C3C, 0xF740,
+ 0x9C3D, 0xF741,
+ 0x9C3E, 0xF742,
+ 0x9C3F, 0xF743,
+ 0x9C40, 0xF744,
+ 0x9C41, 0xF745,
+ 0x9C42, 0xF746,
+ 0x9C43, 0xF747,
+ 0x9C44, 0xF748,
+ 0x9C45, 0xF749,
+ 0x9C46, 0xF74A,
+ 0x9C47, 0xF74B,
+ 0x9C48, 0xF74C,
+ 0x9C49, 0xF74D,
+ 0x9C4A, 0xF74E,
+ 0x9C4B, 0xF74F,
+ 0x9C4C, 0xF750,
+ 0x9C4D, 0xF751,
+ 0x9C4E, 0xF752,
+ 0x9C4F, 0xF753,
+ 0x9C50, 0xF754,
+ 0x9C51, 0xF755,
+ 0x9C52, 0xF756,
+ 0x9C53, 0xF757,
+ 0x9C54, 0xF758,
+ 0x9C55, 0xF759,
+ 0x9C56, 0xF75A,
+ 0x9C57, 0xF75B,
+ 0x9C58, 0xF75C,
+ 0x9C59, 0xF75D,
+ 0x9C5A, 0xF75E,
+ 0x9C5B, 0xF75F,
+ 0x9C5C, 0xF760,
+ 0x9C5D, 0xF761,
+ 0x9C5E, 0xF762,
+ 0x9C5F, 0xF763,
+ 0x9C60, 0xF764,
+ 0x9C61, 0xF765,
+ 0x9C62, 0xF766,
+ 0x9C63, 0xF767,
+ 0x9C64, 0xF768,
+ 0x9C65, 0xF769,
+ 0x9C66, 0xF76A,
+ 0x9C67, 0xF76B,
+ 0x9C68, 0xF76C,
+ 0x9C69, 0xF76D,
+ 0x9C6A, 0xF76E,
+ 0x9C6B, 0xF76F,
+ 0x9C6C, 0xF770,
+ 0x9C6D, 0xF771,
+ 0x9C6E, 0xF772,
+ 0x9C6F, 0xF773,
+ 0x9C70, 0xF774,
+ 0x9C71, 0xF775,
+ 0x9C72, 0xF776,
+ 0x9C73, 0xF777,
+ 0x9C74, 0xF778,
+ 0x9C75, 0xF779,
+ 0x9C76, 0xF77A,
+ 0x9C77, 0xF77B,
+ 0x9C78, 0xF77C,
+ 0x9C79, 0xF77D,
+ 0x9C7A, 0xF77E,
+ 0x9C7B, 0xF780,
+ 0x9C7D, 0xF781,
+ 0x9C7E, 0xF782,
+ 0x9C80, 0xF783,
+ 0x9C83, 0xF784,
+ 0x9C84, 0xF785,
+ 0x9C89, 0xF786,
+ 0x9C8A, 0xF787,
+ 0x9C8C, 0xF788,
+ 0x9C8F, 0xF789,
+ 0x9C93, 0xF78A,
+ 0x9C96, 0xF78B,
+ 0x9C97, 0xF78C,
+ 0x9C98, 0xF78D,
+ 0x9C99, 0xF78E,
+ 0x9C9D, 0xF78F,
+ 0x9CAA, 0xF790,
+ 0x9CAC, 0xF791,
+ 0x9CAF, 0xF792,
+ 0x9CB9, 0xF793,
+ 0x9CBE, 0xF794,
+ 0x9CBF, 0xF795,
+ 0x9CC0, 0xF796,
+ 0x9CC1, 0xF797,
+ 0x9CC2, 0xF798,
+ 0x9CC8, 0xF799,
+ 0x9CC9, 0xF79A,
+ 0x9CD1, 0xF79B,
+ 0x9CD2, 0xF79C,
+ 0x9CDA, 0xF79D,
+ 0x9CDB, 0xF79E,
+ 0x9CE0, 0xF79F,
+ 0x9CE1, 0xF7A0,
+ 0x9CE3, 0xF840,
+ 0x9CE4, 0xF841,
+ 0x9CE5, 0xF842,
+ 0x9CE6, 0xF843,
+ 0x9CE7, 0xF844,
+ 0x9CE8, 0xF845,
+ 0x9CE9, 0xF846,
+ 0x9CEA, 0xF847,
+ 0x9CEB, 0xF848,
+ 0x9CEC, 0xF849,
+ 0x9CED, 0xF84A,
+ 0x9CEE, 0xF84B,
+ 0x9CEF, 0xF84C,
+ 0x9CF0, 0xF84D,
+ 0x9CF1, 0xF84E,
+ 0x9CF2, 0xF84F,
+ 0x9CF3, 0xF850,
+ 0x9CF4, 0xF851,
+ 0x9CF5, 0xF852,
+ 0x9CF6, 0xF853,
+ 0x9CF7, 0xF854,
+ 0x9CF8, 0xF855,
+ 0x9CF9, 0xF856,
+ 0x9CFA, 0xF857,
+ 0x9CFB, 0xF858,
+ 0x9CFC, 0xF859,
+ 0x9CFD, 0xF85A,
+ 0x9CFE, 0xF85B,
+ 0x9CFF, 0xF85C,
+ 0x9D00, 0xF85D,
+ 0x9D01, 0xF85E,
+ 0x9D02, 0xF85F,
+ 0x9D03, 0xF860,
+ 0x9D04, 0xF861,
+ 0x9D05, 0xF862,
+ 0x9D06, 0xF863,
+ 0x9D07, 0xF864,
+ 0x9D08, 0xF865,
+ 0x9D09, 0xF866,
+ 0x9D0A, 0xF867,
+ 0x9D0B, 0xF868,
+ 0x9D0C, 0xF869,
+ 0x9D0D, 0xF86A,
+ 0x9D0E, 0xF86B,
+ 0x9D0F, 0xF86C,
+ 0x9D10, 0xF86D,
+ 0x9D11, 0xF86E,
+ 0x9D12, 0xF86F,
+ 0x9D13, 0xF870,
+ 0x9D14, 0xF871,
+ 0x9D15, 0xF872,
+ 0x9D16, 0xF873,
+ 0x9D17, 0xF874,
+ 0x9D18, 0xF875,
+ 0x9D19, 0xF876,
+ 0x9D1A, 0xF877,
+ 0x9D1B, 0xF878,
+ 0x9D1C, 0xF879,
+ 0x9D1D, 0xF87A,
+ 0x9D1E, 0xF87B,
+ 0x9D1F, 0xF87C,
+ 0x9D20, 0xF87D,
+ 0x9D21, 0xF87E,
+ 0x9D22, 0xF880,
+ 0x9D23, 0xF881,
+ 0x9D24, 0xF882,
+ 0x9D25, 0xF883,
+ 0x9D26, 0xF884,
+ 0x9D27, 0xF885,
+ 0x9D28, 0xF886,
+ 0x9D29, 0xF887,
+ 0x9D2A, 0xF888,
+ 0x9D2B, 0xF889,
+ 0x9D2C, 0xF88A,
+ 0x9D2D, 0xF88B,
+ 0x9D2E, 0xF88C,
+ 0x9D2F, 0xF88D,
+ 0x9D30, 0xF88E,
+ 0x9D31, 0xF88F,
+ 0x9D32, 0xF890,
+ 0x9D33, 0xF891,
+ 0x9D34, 0xF892,
+ 0x9D35, 0xF893,
+ 0x9D36, 0xF894,
+ 0x9D37, 0xF895,
+ 0x9D38, 0xF896,
+ 0x9D39, 0xF897,
+ 0x9D3A, 0xF898,
+ 0x9D3B, 0xF899,
+ 0x9D3C, 0xF89A,
+ 0x9D3D, 0xF89B,
+ 0x9D3E, 0xF89C,
+ 0x9D3F, 0xF89D,
+ 0x9D40, 0xF89E,
+ 0x9D41, 0xF89F,
+ 0x9D42, 0xF8A0,
+ 0x9D43, 0xF940,
+ 0x9D44, 0xF941,
+ 0x9D45, 0xF942,
+ 0x9D46, 0xF943,
+ 0x9D47, 0xF944,
+ 0x9D48, 0xF945,
+ 0x9D49, 0xF946,
+ 0x9D4A, 0xF947,
+ 0x9D4B, 0xF948,
+ 0x9D4C, 0xF949,
+ 0x9D4D, 0xF94A,
+ 0x9D4E, 0xF94B,
+ 0x9D4F, 0xF94C,
+ 0x9D50, 0xF94D,
+ 0x9D51, 0xF94E,
+ 0x9D52, 0xF94F,
+ 0x9D53, 0xF950,
+ 0x9D54, 0xF951,
+ 0x9D55, 0xF952,
+ 0x9D56, 0xF953,
+ 0x9D57, 0xF954,
+ 0x9D58, 0xF955,
+ 0x9D59, 0xF956,
+ 0x9D5A, 0xF957,
+ 0x9D5B, 0xF958,
+ 0x9D5C, 0xF959,
+ 0x9D5D, 0xF95A,
+ 0x9D5E, 0xF95B,
+ 0x9D5F, 0xF95C,
+ 0x9D60, 0xF95D,
+ 0x9D61, 0xF95E,
+ 0x9D62, 0xF95F,
+ 0x9D63, 0xF960,
+ 0x9D64, 0xF961,
+ 0x9D65, 0xF962,
+ 0x9D66, 0xF963,
+ 0x9D67, 0xF964,
+ 0x9D68, 0xF965,
+ 0x9D69, 0xF966,
+ 0x9D6A, 0xF967,
+ 0x9D6B, 0xF968,
+ 0x9D6C, 0xF969,
+ 0x9D6D, 0xF96A,
+ 0x9D6E, 0xF96B,
+ 0x9D6F, 0xF96C,
+ 0x9D70, 0xF96D,
+ 0x9D71, 0xF96E,
+ 0x9D72, 0xF96F,
+ 0x9D73, 0xF970,
+ 0x9D74, 0xF971,
+ 0x9D75, 0xF972,
+ 0x9D76, 0xF973,
+ 0x9D77, 0xF974,
+ 0x9D78, 0xF975,
+ 0x9D79, 0xF976,
+ 0x9D7A, 0xF977,
+ 0x9D7B, 0xF978,
+ 0x9D7C, 0xF979,
+ 0x9D7D, 0xF97A,
+ 0x9D7E, 0xF97B,
+ 0x9D7F, 0xF97C,
+ 0x9D80, 0xF97D,
+ 0x9D81, 0xF97E,
+ 0x9D82, 0xF980,
+ 0x9D83, 0xF981,
+ 0x9D84, 0xF982,
+ 0x9D85, 0xF983,
+ 0x9D86, 0xF984,
+ 0x9D87, 0xF985,
+ 0x9D88, 0xF986,
+ 0x9D89, 0xF987,
+ 0x9D8A, 0xF988,
+ 0x9D8B, 0xF989,
+ 0x9D8C, 0xF98A,
+ 0x9D8D, 0xF98B,
+ 0x9D8E, 0xF98C,
+ 0x9D8F, 0xF98D,
+ 0x9D90, 0xF98E,
+ 0x9D91, 0xF98F,
+ 0x9D92, 0xF990,
+ 0x9D93, 0xF991,
+ 0x9D94, 0xF992,
+ 0x9D95, 0xF993,
+ 0x9D96, 0xF994,
+ 0x9D97, 0xF995,
+ 0x9D98, 0xF996,
+ 0x9D99, 0xF997,
+ 0x9D9A, 0xF998,
+ 0x9D9B, 0xF999,
+ 0x9D9C, 0xF99A,
+ 0x9D9D, 0xF99B,
+ 0x9D9E, 0xF99C,
+ 0x9D9F, 0xF99D,
+ 0x9DA0, 0xF99E,
+ 0x9DA1, 0xF99F,
+ 0x9DA2, 0xF9A0,
+ 0x9DA3, 0xFA40,
+ 0x9DA4, 0xFA41,
+ 0x9DA5, 0xFA42,
+ 0x9DA6, 0xFA43,
+ 0x9DA7, 0xFA44,
+ 0x9DA8, 0xFA45,
+ 0x9DA9, 0xFA46,
+ 0x9DAA, 0xFA47,
+ 0x9DAB, 0xFA48,
+ 0x9DAC, 0xFA49,
+ 0x9DAD, 0xFA4A,
+ 0x9DAE, 0xFA4B,
+ 0x9DAF, 0xFA4C,
+ 0x9DB0, 0xFA4D,
+ 0x9DB1, 0xFA4E,
+ 0x9DB2, 0xFA4F,
+ 0x9DB3, 0xFA50,
+ 0x9DB4, 0xFA51,
+ 0x9DB5, 0xFA52,
+ 0x9DB6, 0xFA53,
+ 0x9DB7, 0xFA54,
+ 0x9DB8, 0xFA55,
+ 0x9DB9, 0xFA56,
+ 0x9DBA, 0xFA57,
+ 0x9DBB, 0xFA58,
+ 0x9DBC, 0xFA59,
+ 0x9DBD, 0xFA5A,
+ 0x9DBE, 0xFA5B,
+ 0x9DBF, 0xFA5C,
+ 0x9DC0, 0xFA5D,
+ 0x9DC1, 0xFA5E,
+ 0x9DC2, 0xFA5F,
+ 0x9DC3, 0xFA60,
+ 0x9DC4, 0xFA61,
+ 0x9DC5, 0xFA62,
+ 0x9DC6, 0xFA63,
+ 0x9DC7, 0xFA64,
+ 0x9DC8, 0xFA65,
+ 0x9DC9, 0xFA66,
+ 0x9DCA, 0xFA67,
+ 0x9DCB, 0xFA68,
+ 0x9DCC, 0xFA69,
+ 0x9DCD, 0xFA6A,
+ 0x9DCE, 0xFA6B,
+ 0x9DCF, 0xFA6C,
+ 0x9DD0, 0xFA6D,
+ 0x9DD1, 0xFA6E,
+ 0x9DD2, 0xFA6F,
+ 0x9DD3, 0xFA70,
+ 0x9DD4, 0xFA71,
+ 0x9DD5, 0xFA72,
+ 0x9DD6, 0xFA73,
+ 0x9DD7, 0xFA74,
+ 0x9DD8, 0xFA75,
+ 0x9DD9, 0xFA76,
+ 0x9DDA, 0xFA77,
+ 0x9DDB, 0xFA78,
+ 0x9DDC, 0xFA79,
+ 0x9DDD, 0xFA7A,
+ 0x9DDE, 0xFA7B,
+ 0x9DDF, 0xFA7C,
+ 0x9DE0, 0xFA7D,
+ 0x9DE1, 0xFA7E,
+ 0x9DE2, 0xFA80,
+ 0x9DE3, 0xFA81,
+ 0x9DE4, 0xFA82,
+ 0x9DE5, 0xFA83,
+ 0x9DE6, 0xFA84,
+ 0x9DE7, 0xFA85,
+ 0x9DE8, 0xFA86,
+ 0x9DE9, 0xFA87,
+ 0x9DEA, 0xFA88,
+ 0x9DEB, 0xFA89,
+ 0x9DEC, 0xFA8A,
+ 0x9DED, 0xFA8B,
+ 0x9DEE, 0xFA8C,
+ 0x9DEF, 0xFA8D,
+ 0x9DF0, 0xFA8E,
+ 0x9DF1, 0xFA8F,
+ 0x9DF2, 0xFA90,
+ 0x9DF3, 0xFA91,
+ 0x9DF4, 0xFA92,
+ 0x9DF5, 0xFA93,
+ 0x9DF6, 0xFA94,
+ 0x9DF7, 0xFA95,
+ 0x9DF8, 0xFA96,
+ 0x9DF9, 0xFA97,
+ 0x9DFA, 0xFA98,
+ 0x9DFB, 0xFA99,
+ 0x9DFC, 0xFA9A,
+ 0x9DFD, 0xFA9B,
+ 0x9DFE, 0xFA9C,
+ 0x9DFF, 0xFA9D,
+ 0x9E00, 0xFA9E,
+ 0x9E01, 0xFA9F,
+ 0x9E02, 0xFAA0,
+ 0x9E03, 0xFB40,
+ 0x9E04, 0xFB41,
+ 0x9E05, 0xFB42,
+ 0x9E06, 0xFB43,
+ 0x9E07, 0xFB44,
+ 0x9E08, 0xFB45,
+ 0x9E09, 0xFB46,
+ 0x9E0A, 0xFB47,
+ 0x9E0B, 0xFB48,
+ 0x9E0C, 0xFB49,
+ 0x9E0D, 0xFB4A,
+ 0x9E0E, 0xFB4B,
+ 0x9E0F, 0xFB4C,
+ 0x9E10, 0xFB4D,
+ 0x9E11, 0xFB4E,
+ 0x9E12, 0xFB4F,
+ 0x9E13, 0xFB50,
+ 0x9E14, 0xFB51,
+ 0x9E15, 0xFB52,
+ 0x9E16, 0xFB53,
+ 0x9E17, 0xFB54,
+ 0x9E18, 0xFB55,
+ 0x9E19, 0xFB56,
+ 0x9E1A, 0xFB57,
+ 0x9E1B, 0xFB58,
+ 0x9E1C, 0xFB59,
+ 0x9E1D, 0xFB5A,
+ 0x9E1E, 0xFB5B,
+ 0x9E24, 0xFB5C,
+ 0x9E27, 0xFB5D,
+ 0x9E2E, 0xFB5E,
+ 0x9E30, 0xFB5F,
+ 0x9E34, 0xFB60,
+ 0x9E3B, 0xFB61,
+ 0x9E3C, 0xFB62,
+ 0x9E40, 0xFB63,
+ 0x9E4D, 0xFB64,
+ 0x9E50, 0xFB65,
+ 0x9E52, 0xFB66,
+ 0x9E53, 0xFB67,
+ 0x9E54, 0xFB68,
+ 0x9E56, 0xFB69,
+ 0x9E59, 0xFB6A,
+ 0x9E5D, 0xFB6B,
+ 0x9E5F, 0xFB6C,
+ 0x9E60, 0xFB6D,
+ 0x9E61, 0xFB6E,
+ 0x9E62, 0xFB6F,
+ 0x9E65, 0xFB70,
+ 0x9E6E, 0xFB71,
+ 0x9E6F, 0xFB72,
+ 0x9E72, 0xFB73,
+ 0x9E74, 0xFB74,
+ 0x9E75, 0xFB75,
+ 0x9E76, 0xFB76,
+ 0x9E77, 0xFB77,
+ 0x9E78, 0xFB78,
+ 0x9E79, 0xFB79,
+ 0x9E7A, 0xFB7A,
+ 0x9E7B, 0xFB7B,
+ 0x9E7C, 0xFB7C,
+ 0x9E7D, 0xFB7D,
+ 0x9E80, 0xFB7E,
+ 0x9E81, 0xFB80,
+ 0x9E83, 0xFB81,
+ 0x9E84, 0xFB82,
+ 0x9E85, 0xFB83,
+ 0x9E86, 0xFB84,
+ 0x9E89, 0xFB85,
+ 0x9E8A, 0xFB86,
+ 0x9E8C, 0xFB87,
+ 0x9E8D, 0xFB88,
+ 0x9E8E, 0xFB89,
+ 0x9E8F, 0xFB8A,
+ 0x9E90, 0xFB8B,
+ 0x9E91, 0xFB8C,
+ 0x9E94, 0xFB8D,
+ 0x9E95, 0xFB8E,
+ 0x9E96, 0xFB8F,
+ 0x9E97, 0xFB90,
+ 0x9E98, 0xFB91,
+ 0x9E99, 0xFB92,
+ 0x9E9A, 0xFB93,
+ 0x9E9B, 0xFB94,
+ 0x9E9C, 0xFB95,
+ 0x9E9E, 0xFB96,
+ 0x9EA0, 0xFB97,
+ 0x9EA1, 0xFB98,
+ 0x9EA2, 0xFB99,
+ 0x9EA3, 0xFB9A,
+ 0x9EA4, 0xFB9B,
+ 0x9EA5, 0xFB9C,
+ 0x9EA7, 0xFB9D,
+ 0x9EA8, 0xFB9E,
+ 0x9EA9, 0xFB9F,
+ 0x9EAA, 0xFBA0,
+ 0x9EAB, 0xFC40,
+ 0x9EAC, 0xFC41,
+ 0x9EAD, 0xFC42,
+ 0x9EAE, 0xFC43,
+ 0x9EAF, 0xFC44,
+ 0x9EB0, 0xFC45,
+ 0x9EB1, 0xFC46,
+ 0x9EB2, 0xFC47,
+ 0x9EB3, 0xFC48,
+ 0x9EB5, 0xFC49,
+ 0x9EB6, 0xFC4A,
+ 0x9EB7, 0xFC4B,
+ 0x9EB9, 0xFC4C,
+ 0x9EBA, 0xFC4D,
+ 0x9EBC, 0xFC4E,
+ 0x9EBF, 0xFC4F,
+ 0x9EC0, 0xFC50,
+ 0x9EC1, 0xFC51,
+ 0x9EC2, 0xFC52,
+ 0x9EC3, 0xFC53,
+ 0x9EC5, 0xFC54,
+ 0x9EC6, 0xFC55,
+ 0x9EC7, 0xFC56,
+ 0x9EC8, 0xFC57,
+ 0x9ECA, 0xFC58,
+ 0x9ECB, 0xFC59,
+ 0x9ECC, 0xFC5A,
+ 0x9ED0, 0xFC5B,
+ 0x9ED2, 0xFC5C,
+ 0x9ED3, 0xFC5D,
+ 0x9ED5, 0xFC5E,
+ 0x9ED6, 0xFC5F,
+ 0x9ED7, 0xFC60,
+ 0x9ED9, 0xFC61,
+ 0x9EDA, 0xFC62,
+ 0x9EDE, 0xFC63,
+ 0x9EE1, 0xFC64,
+ 0x9EE3, 0xFC65,
+ 0x9EE4, 0xFC66,
+ 0x9EE6, 0xFC67,
+ 0x9EE8, 0xFC68,
+ 0x9EEB, 0xFC69,
+ 0x9EEC, 0xFC6A,
+ 0x9EED, 0xFC6B,
+ 0x9EEE, 0xFC6C,
+ 0x9EF0, 0xFC6D,
+ 0x9EF1, 0xFC6E,
+ 0x9EF2, 0xFC6F,
+ 0x9EF3, 0xFC70,
+ 0x9EF4, 0xFC71,
+ 0x9EF5, 0xFC72,
+ 0x9EF6, 0xFC73,
+ 0x9EF7, 0xFC74,
+ 0x9EF8, 0xFC75,
+ 0x9EFA, 0xFC76,
+ 0x9EFD, 0xFC77,
+ 0x9EFF, 0xFC78,
+ 0x9F00, 0xFC79,
+ 0x9F01, 0xFC7A,
+ 0x9F02, 0xFC7B,
+ 0x9F03, 0xFC7C,
+ 0x9F04, 0xFC7D,
+ 0x9F05, 0xFC7E,
+ 0x9F06, 0xFC80,
+ 0x9F07, 0xFC81,
+ 0x9F08, 0xFC82,
+ 0x9F09, 0xFC83,
+ 0x9F0A, 0xFC84,
+ 0x9F0C, 0xFC85,
+ 0x9F0F, 0xFC86,
+ 0x9F11, 0xFC87,
+ 0x9F12, 0xFC88,
+ 0x9F14, 0xFC89,
+ 0x9F15, 0xFC8A,
+ 0x9F16, 0xFC8B,
+ 0x9F18, 0xFC8C,
+ 0x9F1A, 0xFC8D,
+ 0x9F1B, 0xFC8E,
+ 0x9F1C, 0xFC8F,
+ 0x9F1D, 0xFC90,
+ 0x9F1E, 0xFC91,
+ 0x9F1F, 0xFC92,
+ 0x9F21, 0xFC93,
+ 0x9F23, 0xFC94,
+ 0x9F24, 0xFC95,
+ 0x9F25, 0xFC96,
+ 0x9F26, 0xFC97,
+ 0x9F27, 0xFC98,
+ 0x9F28, 0xFC99,
+ 0x9F29, 0xFC9A,
+ 0x9F2A, 0xFC9B,
+ 0x9F2B, 0xFC9C,
+ 0x9F2D, 0xFC9D,
+ 0x9F2E, 0xFC9E,
+ 0x9F30, 0xFC9F,
+ 0x9F31, 0xFCA0,
+ 0x9F32, 0xFD40,
+ 0x9F33, 0xFD41,
+ 0x9F34, 0xFD42,
+ 0x9F35, 0xFD43,
+ 0x9F36, 0xFD44,
+ 0x9F38, 0xFD45,
+ 0x9F3A, 0xFD46,
+ 0x9F3C, 0xFD47,
+ 0x9F3F, 0xFD48,
+ 0x9F40, 0xFD49,
+ 0x9F41, 0xFD4A,
+ 0x9F42, 0xFD4B,
+ 0x9F43, 0xFD4C,
+ 0x9F45, 0xFD4D,
+ 0x9F46, 0xFD4E,
+ 0x9F47, 0xFD4F,
+ 0x9F48, 0xFD50,
+ 0x9F49, 0xFD51,
+ 0x9F4A, 0xFD52,
+ 0x9F4B, 0xFD53,
+ 0x9F4C, 0xFD54,
+ 0x9F4D, 0xFD55,
+ 0x9F4E, 0xFD56,
+ 0x9F4F, 0xFD57,
+ 0x9F52, 0xFD58,
+ 0x9F53, 0xFD59,
+ 0x9F54, 0xFD5A,
+ 0x9F55, 0xFD5B,
+ 0x9F56, 0xFD5C,
+ 0x9F57, 0xFD5D,
+ 0x9F58, 0xFD5E,
+ 0x9F59, 0xFD5F,
+ 0x9F5A, 0xFD60,
+ 0x9F5B, 0xFD61,
+ 0x9F5C, 0xFD62,
+ 0x9F5D, 0xFD63,
+ 0x9F5E, 0xFD64,
+ 0x9F5F, 0xFD65,
+ 0x9F60, 0xFD66,
+ 0x9F61, 0xFD67,
+ 0x9F62, 0xFD68,
+ 0x9F63, 0xFD69,
+ 0x9F64, 0xFD6A,
+ 0x9F65, 0xFD6B,
+ 0x9F66, 0xFD6C,
+ 0x9F67, 0xFD6D,
+ 0x9F68, 0xFD6E,
+ 0x9F69, 0xFD6F,
+ 0x9F6A, 0xFD70,
+ 0x9F6B, 0xFD71,
+ 0x9F6C, 0xFD72,
+ 0x9F6D, 0xFD73,
+ 0x9F6E, 0xFD74,
+ 0x9F6F, 0xFD75,
+ 0x9F70, 0xFD76,
+ 0x9F71, 0xFD77,
+ 0x9F72, 0xFD78,
+ 0x9F73, 0xFD79,
+ 0x9F74, 0xFD7A,
+ 0x9F75, 0xFD7B,
+ 0x9F76, 0xFD7C,
+ 0x9F77, 0xFD7D,
+ 0x9F78, 0xFD7E,
+ 0x9F79, 0xFD80,
+ 0x9F7A, 0xFD81,
+ 0x9F7B, 0xFD82,
+ 0x9F7C, 0xFD83,
+ 0x9F7D, 0xFD84,
+ 0x9F7E, 0xFD85,
+ 0x9F81, 0xFD86,
+ 0x9F82, 0xFD87,
+ 0x9F8D, 0xFD88,
+ 0x9F8E, 0xFD89,
+ 0x9F8F, 0xFD8A,
+ 0x9F90, 0xFD8B,
+ 0x9F91, 0xFD8C,
+ 0x9F92, 0xFD8D,
+ 0x9F93, 0xFD8E,
+ 0x9F94, 0xFD8F,
+ 0x9F95, 0xFD90,
+ 0x9F96, 0xFD91,
+ 0x9F97, 0xFD92,
+ 0x9F98, 0xFD93,
+ 0x9F9C, 0xFD94,
+ 0x9F9D, 0xFD95,
+ 0x9F9E, 0xFD96,
+ 0x9FA1, 0xFD97,
+ 0x9FA2, 0xFD98,
+ 0x9FA3, 0xFD99,
+ 0x9FA4, 0xFD9A,
+ 0x9FA5, 0xFD9B,
+ 0xE000, 0xAAA1,
+ 0xE001, 0xAAA2,
+ 0xE002, 0xAAA3,
+ 0xE003, 0xAAA4,
+ 0xE004, 0xAAA5,
+ 0xE005, 0xAAA6,
+ 0xE006, 0xAAA7,
+ 0xE007, 0xAAA8,
+ 0xE008, 0xAAA9,
+ 0xE009, 0xAAAA,
+ 0xE00A, 0xAAAB,
+ 0xE00B, 0xAAAC,
+ 0xE00C, 0xAAAD,
+ 0xE00D, 0xAAAE,
+ 0xE00E, 0xAAAF,
+ 0xE00F, 0xAAB0,
+ 0xE010, 0xAAB1,
+ 0xE011, 0xAAB2,
+ 0xE012, 0xAAB3,
+ 0xE013, 0xAAB4,
+ 0xE014, 0xAAB5,
+ 0xE015, 0xAAB6,
+ 0xE016, 0xAAB7,
+ 0xE017, 0xAAB8,
+ 0xE018, 0xAAB9,
+ 0xE019, 0xAABA,
+ 0xE01A, 0xAABB,
+ 0xE01B, 0xAABC,
+ 0xE01C, 0xAABD,
+ 0xE01D, 0xAABE,
+ 0xE01E, 0xAABF,
+ 0xE01F, 0xAAC0,
+ 0xE020, 0xAAC1,
+ 0xE021, 0xAAC2,
+ 0xE022, 0xAAC3,
+ 0xE023, 0xAAC4,
+ 0xE024, 0xAAC5,
+ 0xE025, 0xAAC6,
+ 0xE026, 0xAAC7,
+ 0xE027, 0xAAC8,
+ 0xE028, 0xAAC9,
+ 0xE029, 0xAACA,
+ 0xE02A, 0xAACB,
+ 0xE02B, 0xAACC,
+ 0xE02C, 0xAACD,
+ 0xE02D, 0xAACE,
+ 0xE02E, 0xAACF,
+ 0xE02F, 0xAAD0,
+ 0xE030, 0xAAD1,
+ 0xE031, 0xAAD2,
+ 0xE032, 0xAAD3,
+ 0xE033, 0xAAD4,
+ 0xE034, 0xAAD5,
+ 0xE035, 0xAAD6,
+ 0xE036, 0xAAD7,
+ 0xE037, 0xAAD8,
+ 0xE038, 0xAAD9,
+ 0xE039, 0xAADA,
+ 0xE03A, 0xAADB,
+ 0xE03B, 0xAADC,
+ 0xE03C, 0xAADD,
+ 0xE03D, 0xAADE,
+ 0xE03E, 0xAADF,
+ 0xE03F, 0xAAE0,
+ 0xE040, 0xAAE1,
+ 0xE041, 0xAAE2,
+ 0xE042, 0xAAE3,
+ 0xE043, 0xAAE4,
+ 0xE044, 0xAAE5,
+ 0xE045, 0xAAE6,
+ 0xE046, 0xAAE7,
+ 0xE047, 0xAAE8,
+ 0xE048, 0xAAE9,
+ 0xE049, 0xAAEA,
+ 0xE04A, 0xAAEB,
+ 0xE04B, 0xAAEC,
+ 0xE04C, 0xAAED,
+ 0xE04D, 0xAAEE,
+ 0xE04E, 0xAAEF,
+ 0xE04F, 0xAAF0,
+ 0xE050, 0xAAF1,
+ 0xE051, 0xAAF2,
+ 0xE052, 0xAAF3,
+ 0xE053, 0xAAF4,
+ 0xE054, 0xAAF5,
+ 0xE055, 0xAAF6,
+ 0xE056, 0xAAF7,
+ 0xE057, 0xAAF8,
+ 0xE058, 0xAAF9,
+ 0xE059, 0xAAFA,
+ 0xE05A, 0xAAFB,
+ 0xE05B, 0xAAFC,
+ 0xE05C, 0xAAFD,
+ 0xE05D, 0xAAFE,
+ 0xE05E, 0xABA1,
+ 0xE05F, 0xABA2,
+ 0xE060, 0xABA3,
+ 0xE061, 0xABA4,
+ 0xE062, 0xABA5,
+ 0xE063, 0xABA6,
+ 0xE064, 0xABA7,
+ 0xE065, 0xABA8,
+ 0xE066, 0xABA9,
+ 0xE067, 0xABAA,
+ 0xE068, 0xABAB,
+ 0xE069, 0xABAC,
+ 0xE06A, 0xABAD,
+ 0xE06B, 0xABAE,
+ 0xE06C, 0xABAF,
+ 0xE06D, 0xABB0,
+ 0xE06E, 0xABB1,
+ 0xE06F, 0xABB2,
+ 0xE070, 0xABB3,
+ 0xE071, 0xABB4,
+ 0xE072, 0xABB5,
+ 0xE073, 0xABB6,
+ 0xE074, 0xABB7,
+ 0xE075, 0xABB8,
+ 0xE076, 0xABB9,
+ 0xE077, 0xABBA,
+ 0xE078, 0xABBB,
+ 0xE079, 0xABBC,
+ 0xE07A, 0xABBD,
+ 0xE07B, 0xABBE,
+ 0xE07C, 0xABBF,
+ 0xE07D, 0xABC0,
+ 0xE07E, 0xABC1,
+ 0xE07F, 0xABC2,
+ 0xE080, 0xABC3,
+ 0xE081, 0xABC4,
+ 0xE082, 0xABC5,
+ 0xE083, 0xABC6,
+ 0xE084, 0xABC7,
+ 0xE085, 0xABC8,
+ 0xE086, 0xABC9,
+ 0xE087, 0xABCA,
+ 0xE088, 0xABCB,
+ 0xE089, 0xABCC,
+ 0xE08A, 0xABCD,
+ 0xE08B, 0xABCE,
+ 0xE08C, 0xABCF,
+ 0xE08D, 0xABD0,
+ 0xE08E, 0xABD1,
+ 0xE08F, 0xABD2,
+ 0xE090, 0xABD3,
+ 0xE091, 0xABD4,
+ 0xE092, 0xABD5,
+ 0xE093, 0xABD6,
+ 0xE094, 0xABD7,
+ 0xE095, 0xABD8,
+ 0xE096, 0xABD9,
+ 0xE097, 0xABDA,
+ 0xE098, 0xABDB,
+ 0xE099, 0xABDC,
+ 0xE09A, 0xABDD,
+ 0xE09B, 0xABDE,
+ 0xE09C, 0xABDF,
+ 0xE09D, 0xABE0,
+ 0xE09E, 0xABE1,
+ 0xE09F, 0xABE2,
+ 0xE0A0, 0xABE3,
+ 0xE0A1, 0xABE4,
+ 0xE0A2, 0xABE5,
+ 0xE0A3, 0xABE6,
+ 0xE0A4, 0xABE7,
+ 0xE0A5, 0xABE8,
+ 0xE0A6, 0xABE9,
+ 0xE0A7, 0xABEA,
+ 0xE0A8, 0xABEB,
+ 0xE0A9, 0xABEC,
+ 0xE0AA, 0xABED,
+ 0xE0AB, 0xABEE,
+ 0xE0AC, 0xABEF,
+ 0xE0AD, 0xABF0,
+ 0xE0AE, 0xABF1,
+ 0xE0AF, 0xABF2,
+ 0xE0B0, 0xABF3,
+ 0xE0B1, 0xABF4,
+ 0xE0B2, 0xABF5,
+ 0xE0B3, 0xABF6,
+ 0xE0B4, 0xABF7,
+ 0xE0B5, 0xABF8,
+ 0xE0B6, 0xABF9,
+ 0xE0B7, 0xABFA,
+ 0xE0B8, 0xABFB,
+ 0xE0B9, 0xABFC,
+ 0xE0BA, 0xABFD,
+ 0xE0BB, 0xABFE,
+ 0xE0BC, 0xACA1,
+ 0xE0BD, 0xACA2,
+ 0xE0BE, 0xACA3,
+ 0xE0BF, 0xACA4,
+ 0xE0C0, 0xACA5,
+ 0xE0C1, 0xACA6,
+ 0xE0C2, 0xACA7,
+ 0xE0C3, 0xACA8,
+ 0xE0C4, 0xACA9,
+ 0xE0C5, 0xACAA,
+ 0xE0C6, 0xACAB,
+ 0xE0C7, 0xACAC,
+ 0xE0C8, 0xACAD,
+ 0xE0C9, 0xACAE,
+ 0xE0CA, 0xACAF,
+ 0xE0CB, 0xACB0,
+ 0xE0CC, 0xACB1,
+ 0xE0CD, 0xACB2,
+ 0xE0CE, 0xACB3,
+ 0xE0CF, 0xACB4,
+ 0xE0D0, 0xACB5,
+ 0xE0D1, 0xACB6,
+ 0xE0D2, 0xACB7,
+ 0xE0D3, 0xACB8,
+ 0xE0D4, 0xACB9,
+ 0xE0D5, 0xACBA,
+ 0xE0D6, 0xACBB,
+ 0xE0D7, 0xACBC,
+ 0xE0D8, 0xACBD,
+ 0xE0D9, 0xACBE,
+ 0xE0DA, 0xACBF,
+ 0xE0DB, 0xACC0,
+ 0xE0DC, 0xACC1,
+ 0xE0DD, 0xACC2,
+ 0xE0DE, 0xACC3,
+ 0xE0DF, 0xACC4,
+ 0xE0E0, 0xACC5,
+ 0xE0E1, 0xACC6,
+ 0xE0E2, 0xACC7,
+ 0xE0E3, 0xACC8,
+ 0xE0E4, 0xACC9,
+ 0xE0E5, 0xACCA,
+ 0xE0E6, 0xACCB,
+ 0xE0E7, 0xACCC,
+ 0xE0E8, 0xACCD,
+ 0xE0E9, 0xACCE,
+ 0xE0EA, 0xACCF,
+ 0xE0EB, 0xACD0,
+ 0xE0EC, 0xACD1,
+ 0xE0ED, 0xACD2,
+ 0xE0EE, 0xACD3,
+ 0xE0EF, 0xACD4,
+ 0xE0F0, 0xACD5,
+ 0xE0F1, 0xACD6,
+ 0xE0F2, 0xACD7,
+ 0xE0F3, 0xACD8,
+ 0xE0F4, 0xACD9,
+ 0xE0F5, 0xACDA,
+ 0xE0F6, 0xACDB,
+ 0xE0F7, 0xACDC,
+ 0xE0F8, 0xACDD,
+ 0xE0F9, 0xACDE,
+ 0xE0FA, 0xACDF,
+ 0xE0FB, 0xACE0,
+ 0xE0FC, 0xACE1,
+ 0xE0FD, 0xACE2,
+ 0xE0FE, 0xACE3,
+ 0xE0FF, 0xACE4,
+ 0xE100, 0xACE5,
+ 0xE101, 0xACE6,
+ 0xE102, 0xACE7,
+ 0xE103, 0xACE8,
+ 0xE104, 0xACE9,
+ 0xE105, 0xACEA,
+ 0xE106, 0xACEB,
+ 0xE107, 0xACEC,
+ 0xE108, 0xACED,
+ 0xE109, 0xACEE,
+ 0xE10A, 0xACEF,
+ 0xE10B, 0xACF0,
+ 0xE10C, 0xACF1,
+ 0xE10D, 0xACF2,
+ 0xE10E, 0xACF3,
+ 0xE10F, 0xACF4,
+ 0xE110, 0xACF5,
+ 0xE111, 0xACF6,
+ 0xE112, 0xACF7,
+ 0xE113, 0xACF8,
+ 0xE114, 0xACF9,
+ 0xE115, 0xACFA,
+ 0xE116, 0xACFB,
+ 0xE117, 0xACFC,
+ 0xE118, 0xACFD,
+ 0xE119, 0xACFE,
+ 0xE11A, 0xADA1,
+ 0xE11B, 0xADA2,
+ 0xE11C, 0xADA3,
+ 0xE11D, 0xADA4,
+ 0xE11E, 0xADA5,
+ 0xE11F, 0xADA6,
+ 0xE120, 0xADA7,
+ 0xE121, 0xADA8,
+ 0xE122, 0xADA9,
+ 0xE123, 0xADAA,
+ 0xE124, 0xADAB,
+ 0xE125, 0xADAC,
+ 0xE126, 0xADAD,
+ 0xE127, 0xADAE,
+ 0xE128, 0xADAF,
+ 0xE129, 0xADB0,
+ 0xE12A, 0xADB1,
+ 0xE12B, 0xADB2,
+ 0xE12C, 0xADB3,
+ 0xE12D, 0xADB4,
+ 0xE12E, 0xADB5,
+ 0xE12F, 0xADB6,
+ 0xE130, 0xADB7,
+ 0xE131, 0xADB8,
+ 0xE132, 0xADB9,
+ 0xE133, 0xADBA,
+ 0xE134, 0xADBB,
+ 0xE135, 0xADBC,
+ 0xE136, 0xADBD,
+ 0xE137, 0xADBE,
+ 0xE138, 0xADBF,
+ 0xE139, 0xADC0,
+ 0xE13A, 0xADC1,
+ 0xE13B, 0xADC2,
+ 0xE13C, 0xADC3,
+ 0xE13D, 0xADC4,
+ 0xE13E, 0xADC5,
+ 0xE13F, 0xADC6,
+ 0xE140, 0xADC7,
+ 0xE141, 0xADC8,
+ 0xE142, 0xADC9,
+ 0xE143, 0xADCA,
+ 0xE144, 0xADCB,
+ 0xE145, 0xADCC,
+ 0xE146, 0xADCD,
+ 0xE147, 0xADCE,
+ 0xE148, 0xADCF,
+ 0xE149, 0xADD0,
+ 0xE14A, 0xADD1,
+ 0xE14B, 0xADD2,
+ 0xE14C, 0xADD3,
+ 0xE14D, 0xADD4,
+ 0xE14E, 0xADD5,
+ 0xE14F, 0xADD6,
+ 0xE150, 0xADD7,
+ 0xE151, 0xADD8,
+ 0xE152, 0xADD9,
+ 0xE153, 0xADDA,
+ 0xE154, 0xADDB,
+ 0xE155, 0xADDC,
+ 0xE156, 0xADDD,
+ 0xE157, 0xADDE,
+ 0xE158, 0xADDF,
+ 0xE159, 0xADE0,
+ 0xE15A, 0xADE1,
+ 0xE15B, 0xADE2,
+ 0xE15C, 0xADE3,
+ 0xE15D, 0xADE4,
+ 0xE15E, 0xADE5,
+ 0xE15F, 0xADE6,
+ 0xE160, 0xADE7,
+ 0xE161, 0xADE8,
+ 0xE162, 0xADE9,
+ 0xE163, 0xADEA,
+ 0xE164, 0xADEB,
+ 0xE165, 0xADEC,
+ 0xE166, 0xADED,
+ 0xE167, 0xADEE,
+ 0xE168, 0xADEF,
+ 0xE169, 0xADF0,
+ 0xE16A, 0xADF1,
+ 0xE16B, 0xADF2,
+ 0xE16C, 0xADF3,
+ 0xE16D, 0xADF4,
+ 0xE16E, 0xADF5,
+ 0xE16F, 0xADF6,
+ 0xE170, 0xADF7,
+ 0xE171, 0xADF8,
+ 0xE172, 0xADF9,
+ 0xE173, 0xADFA,
+ 0xE174, 0xADFB,
+ 0xE175, 0xADFC,
+ 0xE176, 0xADFD,
+ 0xE177, 0xADFE,
+ 0xE178, 0xAEA1,
+ 0xE179, 0xAEA2,
+ 0xE17A, 0xAEA3,
+ 0xE17B, 0xAEA4,
+ 0xE17C, 0xAEA5,
+ 0xE17D, 0xAEA6,
+ 0xE17E, 0xAEA7,
+ 0xE17F, 0xAEA8,
+ 0xE180, 0xAEA9,
+ 0xE181, 0xAEAA,
+ 0xE182, 0xAEAB,
+ 0xE183, 0xAEAC,
+ 0xE184, 0xAEAD,
+ 0xE185, 0xAEAE,
+ 0xE186, 0xAEAF,
+ 0xE187, 0xAEB0,
+ 0xE188, 0xAEB1,
+ 0xE189, 0xAEB2,
+ 0xE18A, 0xAEB3,
+ 0xE18B, 0xAEB4,
+ 0xE18C, 0xAEB5,
+ 0xE18D, 0xAEB6,
+ 0xE18E, 0xAEB7,
+ 0xE18F, 0xAEB8,
+ 0xE190, 0xAEB9,
+ 0xE191, 0xAEBA,
+ 0xE192, 0xAEBB,
+ 0xE193, 0xAEBC,
+ 0xE194, 0xAEBD,
+ 0xE195, 0xAEBE,
+ 0xE196, 0xAEBF,
+ 0xE197, 0xAEC0,
+ 0xE198, 0xAEC1,
+ 0xE199, 0xAEC2,
+ 0xE19A, 0xAEC3,
+ 0xE19B, 0xAEC4,
+ 0xE19C, 0xAEC5,
+ 0xE19D, 0xAEC6,
+ 0xE19E, 0xAEC7,
+ 0xE19F, 0xAEC8,
+ 0xE1A0, 0xAEC9,
+ 0xE1A1, 0xAECA,
+ 0xE1A2, 0xAECB,
+ 0xE1A3, 0xAECC,
+ 0xE1A4, 0xAECD,
+ 0xE1A5, 0xAECE,
+ 0xE1A6, 0xAECF,
+ 0xE1A7, 0xAED0,
+ 0xE1A8, 0xAED1,
+ 0xE1A9, 0xAED2,
+ 0xE1AA, 0xAED3,
+ 0xE1AB, 0xAED4,
+ 0xE1AC, 0xAED5,
+ 0xE1AD, 0xAED6,
+ 0xE1AE, 0xAED7,
+ 0xE1AF, 0xAED8,
+ 0xE1B0, 0xAED9,
+ 0xE1B1, 0xAEDA,
+ 0xE1B2, 0xAEDB,
+ 0xE1B3, 0xAEDC,
+ 0xE1B4, 0xAEDD,
+ 0xE1B5, 0xAEDE,
+ 0xE1B6, 0xAEDF,
+ 0xE1B7, 0xAEE0,
+ 0xE1B8, 0xAEE1,
+ 0xE1B9, 0xAEE2,
+ 0xE1BA, 0xAEE3,
+ 0xE1BB, 0xAEE4,
+ 0xE1BC, 0xAEE5,
+ 0xE1BD, 0xAEE6,
+ 0xE1BE, 0xAEE7,
+ 0xE1BF, 0xAEE8,
+ 0xE1C0, 0xAEE9,
+ 0xE1C1, 0xAEEA,
+ 0xE1C2, 0xAEEB,
+ 0xE1C3, 0xAEEC,
+ 0xE1C4, 0xAEED,
+ 0xE1C5, 0xAEEE,
+ 0xE1C6, 0xAEEF,
+ 0xE1C7, 0xAEF0,
+ 0xE1C8, 0xAEF1,
+ 0xE1C9, 0xAEF2,
+ 0xE1CA, 0xAEF3,
+ 0xE1CB, 0xAEF4,
+ 0xE1CC, 0xAEF5,
+ 0xE1CD, 0xAEF6,
+ 0xE1CE, 0xAEF7,
+ 0xE1CF, 0xAEF8,
+ 0xE1D0, 0xAEF9,
+ 0xE1D1, 0xAEFA,
+ 0xE1D2, 0xAEFB,
+ 0xE1D3, 0xAEFC,
+ 0xE1D4, 0xAEFD,
+ 0xE1D5, 0xAEFE,
+ 0xE1D6, 0xAFA1,
+ 0xE1D7, 0xAFA2,
+ 0xE1D8, 0xAFA3,
+ 0xE1D9, 0xAFA4,
+ 0xE1DA, 0xAFA5,
+ 0xE1DB, 0xAFA6,
+ 0xE1DC, 0xAFA7,
+ 0xE1DD, 0xAFA8,
+ 0xE1DE, 0xAFA9,
+ 0xE1DF, 0xAFAA,
+ 0xE1E0, 0xAFAB,
+ 0xE1E1, 0xAFAC,
+ 0xE1E2, 0xAFAD,
+ 0xE1E3, 0xAFAE,
+ 0xE1E4, 0xAFAF,
+ 0xE1E5, 0xAFB0,
+ 0xE1E6, 0xAFB1,
+ 0xE1E7, 0xAFB2,
+ 0xE1E8, 0xAFB3,
+ 0xE1E9, 0xAFB4,
+ 0xE1EA, 0xAFB5,
+ 0xE1EB, 0xAFB6,
+ 0xE1EC, 0xAFB7,
+ 0xE1ED, 0xAFB8,
+ 0xE1EE, 0xAFB9,
+ 0xE1EF, 0xAFBA,
+ 0xE1F0, 0xAFBB,
+ 0xE1F1, 0xAFBC,
+ 0xE1F2, 0xAFBD,
+ 0xE1F3, 0xAFBE,
+ 0xE1F4, 0xAFBF,
+ 0xE1F5, 0xAFC0,
+ 0xE1F6, 0xAFC1,
+ 0xE1F7, 0xAFC2,
+ 0xE1F8, 0xAFC3,
+ 0xE1F9, 0xAFC4,
+ 0xE1FA, 0xAFC5,
+ 0xE1FB, 0xAFC6,
+ 0xE1FC, 0xAFC7,
+ 0xE1FD, 0xAFC8,
+ 0xE1FE, 0xAFC9,
+ 0xE1FF, 0xAFCA,
+ 0xE200, 0xAFCB,
+ 0xE201, 0xAFCC,
+ 0xE202, 0xAFCD,
+ 0xE203, 0xAFCE,
+ 0xE204, 0xAFCF,
+ 0xE205, 0xAFD0,
+ 0xE206, 0xAFD1,
+ 0xE207, 0xAFD2,
+ 0xE208, 0xAFD3,
+ 0xE209, 0xAFD4,
+ 0xE20A, 0xAFD5,
+ 0xE20B, 0xAFD6,
+ 0xE20C, 0xAFD7,
+ 0xE20D, 0xAFD8,
+ 0xE20E, 0xAFD9,
+ 0xE20F, 0xAFDA,
+ 0xE210, 0xAFDB,
+ 0xE211, 0xAFDC,
+ 0xE212, 0xAFDD,
+ 0xE213, 0xAFDE,
+ 0xE214, 0xAFDF,
+ 0xE215, 0xAFE0,
+ 0xE216, 0xAFE1,
+ 0xE217, 0xAFE2,
+ 0xE218, 0xAFE3,
+ 0xE219, 0xAFE4,
+ 0xE21A, 0xAFE5,
+ 0xE21B, 0xAFE6,
+ 0xE21C, 0xAFE7,
+ 0xE21D, 0xAFE8,
+ 0xE21E, 0xAFE9,
+ 0xE21F, 0xAFEA,
+ 0xE220, 0xAFEB,
+ 0xE221, 0xAFEC,
+ 0xE222, 0xAFED,
+ 0xE223, 0xAFEE,
+ 0xE224, 0xAFEF,
+ 0xE225, 0xAFF0,
+ 0xE226, 0xAFF1,
+ 0xE227, 0xAFF2,
+ 0xE228, 0xAFF3,
+ 0xE229, 0xAFF4,
+ 0xE22A, 0xAFF5,
+ 0xE22B, 0xAFF6,
+ 0xE22C, 0xAFF7,
+ 0xE22D, 0xAFF8,
+ 0xE22E, 0xAFF9,
+ 0xE22F, 0xAFFA,
+ 0xE230, 0xAFFB,
+ 0xE231, 0xAFFC,
+ 0xE232, 0xAFFD,
+ 0xE233, 0xAFFE,
+ 0xE234, 0xF8A1,
+ 0xE235, 0xF8A2,
+ 0xE236, 0xF8A3,
+ 0xE237, 0xF8A4,
+ 0xE238, 0xF8A5,
+ 0xE239, 0xF8A6,
+ 0xE23A, 0xF8A7,
+ 0xE23B, 0xF8A8,
+ 0xE23C, 0xF8A9,
+ 0xE23D, 0xF8AA,
+ 0xE23E, 0xF8AB,
+ 0xE23F, 0xF8AC,
+ 0xE240, 0xF8AD,
+ 0xE241, 0xF8AE,
+ 0xE242, 0xF8AF,
+ 0xE243, 0xF8B0,
+ 0xE244, 0xF8B1,
+ 0xE245, 0xF8B2,
+ 0xE246, 0xF8B3,
+ 0xE247, 0xF8B4,
+ 0xE248, 0xF8B5,
+ 0xE249, 0xF8B6,
+ 0xE24A, 0xF8B7,
+ 0xE24B, 0xF8B8,
+ 0xE24C, 0xF8B9,
+ 0xE24D, 0xF8BA,
+ 0xE24E, 0xF8BB,
+ 0xE24F, 0xF8BC,
+ 0xE250, 0xF8BD,
+ 0xE251, 0xF8BE,
+ 0xE252, 0xF8BF,
+ 0xE253, 0xF8C0,
+ 0xE254, 0xF8C1,
+ 0xE255, 0xF8C2,
+ 0xE256, 0xF8C3,
+ 0xE257, 0xF8C4,
+ 0xE258, 0xF8C5,
+ 0xE259, 0xF8C6,
+ 0xE25A, 0xF8C7,
+ 0xE25B, 0xF8C8,
+ 0xE25C, 0xF8C9,
+ 0xE25D, 0xF8CA,
+ 0xE25E, 0xF8CB,
+ 0xE25F, 0xF8CC,
+ 0xE260, 0xF8CD,
+ 0xE261, 0xF8CE,
+ 0xE262, 0xF8CF,
+ 0xE263, 0xF8D0,
+ 0xE264, 0xF8D1,
+ 0xE265, 0xF8D2,
+ 0xE266, 0xF8D3,
+ 0xE267, 0xF8D4,
+ 0xE268, 0xF8D5,
+ 0xE269, 0xF8D6,
+ 0xE26A, 0xF8D7,
+ 0xE26B, 0xF8D8,
+ 0xE26C, 0xF8D9,
+ 0xE26D, 0xF8DA,
+ 0xE26E, 0xF8DB,
+ 0xE26F, 0xF8DC,
+ 0xE270, 0xF8DD,
+ 0xE271, 0xF8DE,
+ 0xE272, 0xF8DF,
+ 0xE273, 0xF8E0,
+ 0xE274, 0xF8E1,
+ 0xE275, 0xF8E2,
+ 0xE276, 0xF8E3,
+ 0xE277, 0xF8E4,
+ 0xE278, 0xF8E5,
+ 0xE279, 0xF8E6,
+ 0xE27A, 0xF8E7,
+ 0xE27B, 0xF8E8,
+ 0xE27C, 0xF8E9,
+ 0xE27D, 0xF8EA,
+ 0xE27E, 0xF8EB,
+ 0xE27F, 0xF8EC,
+ 0xE280, 0xF8ED,
+ 0xE281, 0xF8EE,
+ 0xE282, 0xF8EF,
+ 0xE283, 0xF8F0,
+ 0xE284, 0xF8F1,
+ 0xE285, 0xF8F2,
+ 0xE286, 0xF8F3,
+ 0xE287, 0xF8F4,
+ 0xE288, 0xF8F5,
+ 0xE289, 0xF8F6,
+ 0xE28A, 0xF8F7,
+ 0xE28B, 0xF8F8,
+ 0xE28C, 0xF8F9,
+ 0xE28D, 0xF8FA,
+ 0xE28E, 0xF8FB,
+ 0xE28F, 0xF8FC,
+ 0xE290, 0xF8FD,
+ 0xE291, 0xF8FE,
+ 0xE292, 0xF9A1,
+ 0xE293, 0xF9A2,
+ 0xE294, 0xF9A3,
+ 0xE295, 0xF9A4,
+ 0xE296, 0xF9A5,
+ 0xE297, 0xF9A6,
+ 0xE298, 0xF9A7,
+ 0xE299, 0xF9A8,
+ 0xE29A, 0xF9A9,
+ 0xE29B, 0xF9AA,
+ 0xE29C, 0xF9AB,
+ 0xE29D, 0xF9AC,
+ 0xE29E, 0xF9AD,
+ 0xE29F, 0xF9AE,
+ 0xE2A0, 0xF9AF,
+ 0xE2A1, 0xF9B0,
+ 0xE2A2, 0xF9B1,
+ 0xE2A3, 0xF9B2,
+ 0xE2A4, 0xF9B3,
+ 0xE2A5, 0xF9B4,
+ 0xE2A6, 0xF9B5,
+ 0xE2A7, 0xF9B6,
+ 0xE2A8, 0xF9B7,
+ 0xE2A9, 0xF9B8,
+ 0xE2AA, 0xF9B9,
+ 0xE2AB, 0xF9BA,
+ 0xE2AC, 0xF9BB,
+ 0xE2AD, 0xF9BC,
+ 0xE2AE, 0xF9BD,
+ 0xE2AF, 0xF9BE,
+ 0xE2B0, 0xF9BF,
+ 0xE2B1, 0xF9C0,
+ 0xE2B2, 0xF9C1,
+ 0xE2B3, 0xF9C2,
+ 0xE2B4, 0xF9C3,
+ 0xE2B5, 0xF9C4,
+ 0xE2B6, 0xF9C5,
+ 0xE2B7, 0xF9C6,
+ 0xE2B8, 0xF9C7,
+ 0xE2B9, 0xF9C8,
+ 0xE2BA, 0xF9C9,
+ 0xE2BB, 0xF9CA,
+ 0xE2BC, 0xF9CB,
+ 0xE2BD, 0xF9CC,
+ 0xE2BE, 0xF9CD,
+ 0xE2BF, 0xF9CE,
+ 0xE2C0, 0xF9CF,
+ 0xE2C1, 0xF9D0,
+ 0xE2C2, 0xF9D1,
+ 0xE2C3, 0xF9D2,
+ 0xE2C4, 0xF9D3,
+ 0xE2C5, 0xF9D4,
+ 0xE2C6, 0xF9D5,
+ 0xE2C7, 0xF9D6,
+ 0xE2C8, 0xF9D7,
+ 0xE2C9, 0xF9D8,
+ 0xE2CA, 0xF9D9,
+ 0xE2CB, 0xF9DA,
+ 0xE2CC, 0xF9DB,
+ 0xE2CD, 0xF9DC,
+ 0xE2CE, 0xF9DD,
+ 0xE2CF, 0xF9DE,
+ 0xE2D0, 0xF9DF,
+ 0xE2D1, 0xF9E0,
+ 0xE2D2, 0xF9E1,
+ 0xE2D3, 0xF9E2,
+ 0xE2D4, 0xF9E3,
+ 0xE2D5, 0xF9E4,
+ 0xE2D6, 0xF9E5,
+ 0xE2D7, 0xF9E6,
+ 0xE2D8, 0xF9E7,
+ 0xE2D9, 0xF9E8,
+ 0xE2DA, 0xF9E9,
+ 0xE2DB, 0xF9EA,
+ 0xE2DC, 0xF9EB,
+ 0xE2DD, 0xF9EC,
+ 0xE2DE, 0xF9ED,
+ 0xE2DF, 0xF9EE,
+ 0xE2E0, 0xF9EF,
+ 0xE2E1, 0xF9F0,
+ 0xE2E2, 0xF9F1,
+ 0xE2E3, 0xF9F2,
+ 0xE2E4, 0xF9F3,
+ 0xE2E5, 0xF9F4,
+ 0xE2E6, 0xF9F5,
+ 0xE2E7, 0xF9F6,
+ 0xE2E8, 0xF9F7,
+ 0xE2E9, 0xF9F8,
+ 0xE2EA, 0xF9F9,
+ 0xE2EB, 0xF9FA,
+ 0xE2EC, 0xF9FB,
+ 0xE2ED, 0xF9FC,
+ 0xE2EE, 0xF9FD,
+ 0xE2EF, 0xF9FE,
+ 0xE2F0, 0xFAA1,
+ 0xE2F1, 0xFAA2,
+ 0xE2F2, 0xFAA3,
+ 0xE2F3, 0xFAA4,
+ 0xE2F4, 0xFAA5,
+ 0xE2F5, 0xFAA6,
+ 0xE2F6, 0xFAA7,
+ 0xE2F7, 0xFAA8,
+ 0xE2F8, 0xFAA9,
+ 0xE2F9, 0xFAAA,
+ 0xE2FA, 0xFAAB,
+ 0xE2FB, 0xFAAC,
+ 0xE2FC, 0xFAAD,
+ 0xE2FD, 0xFAAE,
+ 0xE2FE, 0xFAAF,
+ 0xE2FF, 0xFAB0,
+ 0xE300, 0xFAB1,
+ 0xE301, 0xFAB2,
+ 0xE302, 0xFAB3,
+ 0xE303, 0xFAB4,
+ 0xE304, 0xFAB5,
+ 0xE305, 0xFAB6,
+ 0xE306, 0xFAB7,
+ 0xE307, 0xFAB8,
+ 0xE308, 0xFAB9,
+ 0xE309, 0xFABA,
+ 0xE30A, 0xFABB,
+ 0xE30B, 0xFABC,
+ 0xE30C, 0xFABD,
+ 0xE30D, 0xFABE,
+ 0xE30E, 0xFABF,
+ 0xE30F, 0xFAC0,
+ 0xE310, 0xFAC1,
+ 0xE311, 0xFAC2,
+ 0xE312, 0xFAC3,
+ 0xE313, 0xFAC4,
+ 0xE314, 0xFAC5,
+ 0xE315, 0xFAC6,
+ 0xE316, 0xFAC7,
+ 0xE317, 0xFAC8,
+ 0xE318, 0xFAC9,
+ 0xE319, 0xFACA,
+ 0xE31A, 0xFACB,
+ 0xE31B, 0xFACC,
+ 0xE31C, 0xFACD,
+ 0xE31D, 0xFACE,
+ 0xE31E, 0xFACF,
+ 0xE31F, 0xFAD0,
+ 0xE320, 0xFAD1,
+ 0xE321, 0xFAD2,
+ 0xE322, 0xFAD3,
+ 0xE323, 0xFAD4,
+ 0xE324, 0xFAD5,
+ 0xE325, 0xFAD6,
+ 0xE326, 0xFAD7,
+ 0xE327, 0xFAD8,
+ 0xE328, 0xFAD9,
+ 0xE329, 0xFADA,
+ 0xE32A, 0xFADB,
+ 0xE32B, 0xFADC,
+ 0xE32C, 0xFADD,
+ 0xE32D, 0xFADE,
+ 0xE32E, 0xFADF,
+ 0xE32F, 0xFAE0,
+ 0xE330, 0xFAE1,
+ 0xE331, 0xFAE2,
+ 0xE332, 0xFAE3,
+ 0xE333, 0xFAE4,
+ 0xE334, 0xFAE5,
+ 0xE335, 0xFAE6,
+ 0xE336, 0xFAE7,
+ 0xE337, 0xFAE8,
+ 0xE338, 0xFAE9,
+ 0xE339, 0xFAEA,
+ 0xE33A, 0xFAEB,
+ 0xE33B, 0xFAEC,
+ 0xE33C, 0xFAED,
+ 0xE33D, 0xFAEE,
+ 0xE33E, 0xFAEF,
+ 0xE33F, 0xFAF0,
+ 0xE340, 0xFAF1,
+ 0xE341, 0xFAF2,
+ 0xE342, 0xFAF3,
+ 0xE343, 0xFAF4,
+ 0xE344, 0xFAF5,
+ 0xE345, 0xFAF6,
+ 0xE346, 0xFAF7,
+ 0xE347, 0xFAF8,
+ 0xE348, 0xFAF9,
+ 0xE349, 0xFAFA,
+ 0xE34A, 0xFAFB,
+ 0xE34B, 0xFAFC,
+ 0xE34C, 0xFAFD,
+ 0xE34D, 0xFAFE,
+ 0xE34E, 0xFBA1,
+ 0xE34F, 0xFBA2,
+ 0xE350, 0xFBA3,
+ 0xE351, 0xFBA4,
+ 0xE352, 0xFBA5,
+ 0xE353, 0xFBA6,
+ 0xE354, 0xFBA7,
+ 0xE355, 0xFBA8,
+ 0xE356, 0xFBA9,
+ 0xE357, 0xFBAA,
+ 0xE358, 0xFBAB,
+ 0xE359, 0xFBAC,
+ 0xE35A, 0xFBAD,
+ 0xE35B, 0xFBAE,
+ 0xE35C, 0xFBAF,
+ 0xE35D, 0xFBB0,
+ 0xE35E, 0xFBB1,
+ 0xE35F, 0xFBB2,
+ 0xE360, 0xFBB3,
+ 0xE361, 0xFBB4,
+ 0xE362, 0xFBB5,
+ 0xE363, 0xFBB6,
+ 0xE364, 0xFBB7,
+ 0xE365, 0xFBB8,
+ 0xE366, 0xFBB9,
+ 0xE367, 0xFBBA,
+ 0xE368, 0xFBBB,
+ 0xE369, 0xFBBC,
+ 0xE36A, 0xFBBD,
+ 0xE36B, 0xFBBE,
+ 0xE36C, 0xFBBF,
+ 0xE36D, 0xFBC0,
+ 0xE36E, 0xFBC1,
+ 0xE36F, 0xFBC2,
+ 0xE370, 0xFBC3,
+ 0xE371, 0xFBC4,
+ 0xE372, 0xFBC5,
+ 0xE373, 0xFBC6,
+ 0xE374, 0xFBC7,
+ 0xE375, 0xFBC8,
+ 0xE376, 0xFBC9,
+ 0xE377, 0xFBCA,
+ 0xE378, 0xFBCB,
+ 0xE379, 0xFBCC,
+ 0xE37A, 0xFBCD,
+ 0xE37B, 0xFBCE,
+ 0xE37C, 0xFBCF,
+ 0xE37D, 0xFBD0,
+ 0xE37E, 0xFBD1,
+ 0xE37F, 0xFBD2,
+ 0xE380, 0xFBD3,
+ 0xE381, 0xFBD4,
+ 0xE382, 0xFBD5,
+ 0xE383, 0xFBD6,
+ 0xE384, 0xFBD7,
+ 0xE385, 0xFBD8,
+ 0xE386, 0xFBD9,
+ 0xE387, 0xFBDA,
+ 0xE388, 0xFBDB,
+ 0xE389, 0xFBDC,
+ 0xE38A, 0xFBDD,
+ 0xE38B, 0xFBDE,
+ 0xE38C, 0xFBDF,
+ 0xE38D, 0xFBE0,
+ 0xE38E, 0xFBE1,
+ 0xE38F, 0xFBE2,
+ 0xE390, 0xFBE3,
+ 0xE391, 0xFBE4,
+ 0xE392, 0xFBE5,
+ 0xE393, 0xFBE6,
+ 0xE394, 0xFBE7,
+ 0xE395, 0xFBE8,
+ 0xE396, 0xFBE9,
+ 0xE397, 0xFBEA,
+ 0xE398, 0xFBEB,
+ 0xE399, 0xFBEC,
+ 0xE39A, 0xFBED,
+ 0xE39B, 0xFBEE,
+ 0xE39C, 0xFBEF,
+ 0xE39D, 0xFBF0,
+ 0xE39E, 0xFBF1,
+ 0xE39F, 0xFBF2,
+ 0xE3A0, 0xFBF3,
+ 0xE3A1, 0xFBF4,
+ 0xE3A2, 0xFBF5,
+ 0xE3A3, 0xFBF6,
+ 0xE3A4, 0xFBF7,
+ 0xE3A5, 0xFBF8,
+ 0xE3A6, 0xFBF9,
+ 0xE3A7, 0xFBFA,
+ 0xE3A8, 0xFBFB,
+ 0xE3A9, 0xFBFC,
+ 0xE3AA, 0xFBFD,
+ 0xE3AB, 0xFBFE,
+ 0xE3AC, 0xFCA1,
+ 0xE3AD, 0xFCA2,
+ 0xE3AE, 0xFCA3,
+ 0xE3AF, 0xFCA4,
+ 0xE3B0, 0xFCA5,
+ 0xE3B1, 0xFCA6,
+ 0xE3B2, 0xFCA7,
+ 0xE3B3, 0xFCA8,
+ 0xE3B4, 0xFCA9,
+ 0xE3B5, 0xFCAA,
+ 0xE3B6, 0xFCAB,
+ 0xE3B7, 0xFCAC,
+ 0xE3B8, 0xFCAD,
+ 0xE3B9, 0xFCAE,
+ 0xE3BA, 0xFCAF,
+ 0xE3BB, 0xFCB0,
+ 0xE3BC, 0xFCB1,
+ 0xE3BD, 0xFCB2,
+ 0xE3BE, 0xFCB3,
+ 0xE3BF, 0xFCB4,
+ 0xE3C0, 0xFCB5,
+ 0xE3C1, 0xFCB6,
+ 0xE3C2, 0xFCB7,
+ 0xE3C3, 0xFCB8,
+ 0xE3C4, 0xFCB9,
+ 0xE3C5, 0xFCBA,
+ 0xE3C6, 0xFCBB,
+ 0xE3C7, 0xFCBC,
+ 0xE3C8, 0xFCBD,
+ 0xE3C9, 0xFCBE,
+ 0xE3CA, 0xFCBF,
+ 0xE3CB, 0xFCC0,
+ 0xE3CC, 0xFCC1,
+ 0xE3CD, 0xFCC2,
+ 0xE3CE, 0xFCC3,
+ 0xE3CF, 0xFCC4,
+ 0xE3D0, 0xFCC5,
+ 0xE3D1, 0xFCC6,
+ 0xE3D2, 0xFCC7,
+ 0xE3D3, 0xFCC8,
+ 0xE3D4, 0xFCC9,
+ 0xE3D5, 0xFCCA,
+ 0xE3D6, 0xFCCB,
+ 0xE3D7, 0xFCCC,
+ 0xE3D8, 0xFCCD,
+ 0xE3D9, 0xFCCE,
+ 0xE3DA, 0xFCCF,
+ 0xE3DB, 0xFCD0,
+ 0xE3DC, 0xFCD1,
+ 0xE3DD, 0xFCD2,
+ 0xE3DE, 0xFCD3,
+ 0xE3DF, 0xFCD4,
+ 0xE3E0, 0xFCD5,
+ 0xE3E1, 0xFCD6,
+ 0xE3E2, 0xFCD7,
+ 0xE3E3, 0xFCD8,
+ 0xE3E4, 0xFCD9,
+ 0xE3E5, 0xFCDA,
+ 0xE3E6, 0xFCDB,
+ 0xE3E7, 0xFCDC,
+ 0xE3E8, 0xFCDD,
+ 0xE3E9, 0xFCDE,
+ 0xE3EA, 0xFCDF,
+ 0xE3EB, 0xFCE0,
+ 0xE3EC, 0xFCE1,
+ 0xE3ED, 0xFCE2,
+ 0xE3EE, 0xFCE3,
+ 0xE3EF, 0xFCE4,
+ 0xE3F0, 0xFCE5,
+ 0xE3F1, 0xFCE6,
+ 0xE3F2, 0xFCE7,
+ 0xE3F3, 0xFCE8,
+ 0xE3F4, 0xFCE9,
+ 0xE3F5, 0xFCEA,
+ 0xE3F6, 0xFCEB,
+ 0xE3F7, 0xFCEC,
+ 0xE3F8, 0xFCED,
+ 0xE3F9, 0xFCEE,
+ 0xE3FA, 0xFCEF,
+ 0xE3FB, 0xFCF0,
+ 0xE3FC, 0xFCF1,
+ 0xE3FD, 0xFCF2,
+ 0xE3FE, 0xFCF3,
+ 0xE3FF, 0xFCF4,
+ 0xE400, 0xFCF5,
+ 0xE401, 0xFCF6,
+ 0xE402, 0xFCF7,
+ 0xE403, 0xFCF8,
+ 0xE404, 0xFCF9,
+ 0xE405, 0xFCFA,
+ 0xE406, 0xFCFB,
+ 0xE407, 0xFCFC,
+ 0xE408, 0xFCFD,
+ 0xE409, 0xFCFE,
+ 0xE40A, 0xFDA1,
+ 0xE40B, 0xFDA2,
+ 0xE40C, 0xFDA3,
+ 0xE40D, 0xFDA4,
+ 0xE40E, 0xFDA5,
+ 0xE40F, 0xFDA6,
+ 0xE410, 0xFDA7,
+ 0xE411, 0xFDA8,
+ 0xE412, 0xFDA9,
+ 0xE413, 0xFDAA,
+ 0xE414, 0xFDAB,
+ 0xE415, 0xFDAC,
+ 0xE416, 0xFDAD,
+ 0xE417, 0xFDAE,
+ 0xE418, 0xFDAF,
+ 0xE419, 0xFDB0,
+ 0xE41A, 0xFDB1,
+ 0xE41B, 0xFDB2,
+ 0xE41C, 0xFDB3,
+ 0xE41D, 0xFDB4,
+ 0xE41E, 0xFDB5,
+ 0xE41F, 0xFDB6,
+ 0xE420, 0xFDB7,
+ 0xE421, 0xFDB8,
+ 0xE422, 0xFDB9,
+ 0xE423, 0xFDBA,
+ 0xE424, 0xFDBB,
+ 0xE425, 0xFDBC,
+ 0xE426, 0xFDBD,
+ 0xE427, 0xFDBE,
+ 0xE428, 0xFDBF,
+ 0xE429, 0xFDC0,
+ 0xE42A, 0xFDC1,
+ 0xE42B, 0xFDC2,
+ 0xE42C, 0xFDC3,
+ 0xE42D, 0xFDC4,
+ 0xE42E, 0xFDC5,
+ 0xE42F, 0xFDC6,
+ 0xE430, 0xFDC7,
+ 0xE431, 0xFDC8,
+ 0xE432, 0xFDC9,
+ 0xE433, 0xFDCA,
+ 0xE434, 0xFDCB,
+ 0xE435, 0xFDCC,
+ 0xE436, 0xFDCD,
+ 0xE437, 0xFDCE,
+ 0xE438, 0xFDCF,
+ 0xE439, 0xFDD0,
+ 0xE43A, 0xFDD1,
+ 0xE43B, 0xFDD2,
+ 0xE43C, 0xFDD3,
+ 0xE43D, 0xFDD4,
+ 0xE43E, 0xFDD5,
+ 0xE43F, 0xFDD6,
+ 0xE440, 0xFDD7,
+ 0xE441, 0xFDD8,
+ 0xE442, 0xFDD9,
+ 0xE443, 0xFDDA,
+ 0xE444, 0xFDDB,
+ 0xE445, 0xFDDC,
+ 0xE446, 0xFDDD,
+ 0xE447, 0xFDDE,
+ 0xE448, 0xFDDF,
+ 0xE449, 0xFDE0,
+ 0xE44A, 0xFDE1,
+ 0xE44B, 0xFDE2,
+ 0xE44C, 0xFDE3,
+ 0xE44D, 0xFDE4,
+ 0xE44E, 0xFDE5,
+ 0xE44F, 0xFDE6,
+ 0xE450, 0xFDE7,
+ 0xE451, 0xFDE8,
+ 0xE452, 0xFDE9,
+ 0xE453, 0xFDEA,
+ 0xE454, 0xFDEB,
+ 0xE455, 0xFDEC,
+ 0xE456, 0xFDED,
+ 0xE457, 0xFDEE,
+ 0xE458, 0xFDEF,
+ 0xE459, 0xFDF0,
+ 0xE45A, 0xFDF1,
+ 0xE45B, 0xFDF2,
+ 0xE45C, 0xFDF3,
+ 0xE45D, 0xFDF4,
+ 0xE45E, 0xFDF5,
+ 0xE45F, 0xFDF6,
+ 0xE460, 0xFDF7,
+ 0xE461, 0xFDF8,
+ 0xE462, 0xFDF9,
+ 0xE463, 0xFDFA,
+ 0xE464, 0xFDFB,
+ 0xE465, 0xFDFC,
+ 0xE466, 0xFDFD,
+ 0xE467, 0xFDFE,
+ 0xE468, 0xFEA1,
+ 0xE469, 0xFEA2,
+ 0xE46A, 0xFEA3,
+ 0xE46B, 0xFEA4,
+ 0xE46C, 0xFEA5,
+ 0xE46D, 0xFEA6,
+ 0xE46E, 0xFEA7,
+ 0xE46F, 0xFEA8,
+ 0xE470, 0xFEA9,
+ 0xE471, 0xFEAA,
+ 0xE472, 0xFEAB,
+ 0xE473, 0xFEAC,
+ 0xE474, 0xFEAD,
+ 0xE475, 0xFEAE,
+ 0xE476, 0xFEAF,
+ 0xE477, 0xFEB0,
+ 0xE478, 0xFEB1,
+ 0xE479, 0xFEB2,
+ 0xE47A, 0xFEB3,
+ 0xE47B, 0xFEB4,
+ 0xE47C, 0xFEB5,
+ 0xE47D, 0xFEB6,
+ 0xE47E, 0xFEB7,
+ 0xE47F, 0xFEB8,
+ 0xE480, 0xFEB9,
+ 0xE481, 0xFEBA,
+ 0xE482, 0xFEBB,
+ 0xE483, 0xFEBC,
+ 0xE484, 0xFEBD,
+ 0xE485, 0xFEBE,
+ 0xE486, 0xFEBF,
+ 0xE487, 0xFEC0,
+ 0xE488, 0xFEC1,
+ 0xE489, 0xFEC2,
+ 0xE48A, 0xFEC3,
+ 0xE48B, 0xFEC4,
+ 0xE48C, 0xFEC5,
+ 0xE48D, 0xFEC6,
+ 0xE48E, 0xFEC7,
+ 0xE48F, 0xFEC8,
+ 0xE490, 0xFEC9,
+ 0xE491, 0xFECA,
+ 0xE492, 0xFECB,
+ 0xE493, 0xFECC,
+ 0xE494, 0xFECD,
+ 0xE495, 0xFECE,
+ 0xE496, 0xFECF,
+ 0xE497, 0xFED0,
+ 0xE498, 0xFED1,
+ 0xE499, 0xFED2,
+ 0xE49A, 0xFED3,
+ 0xE49B, 0xFED4,
+ 0xE49C, 0xFED5,
+ 0xE49D, 0xFED6,
+ 0xE49E, 0xFED7,
+ 0xE49F, 0xFED8,
+ 0xE4A0, 0xFED9,
+ 0xE4A1, 0xFEDA,
+ 0xE4A2, 0xFEDB,
+ 0xE4A3, 0xFEDC,
+ 0xE4A4, 0xFEDD,
+ 0xE4A5, 0xFEDE,
+ 0xE4A6, 0xFEDF,
+ 0xE4A7, 0xFEE0,
+ 0xE4A8, 0xFEE1,
+ 0xE4A9, 0xFEE2,
+ 0xE4AA, 0xFEE3,
+ 0xE4AB, 0xFEE4,
+ 0xE4AC, 0xFEE5,
+ 0xE4AD, 0xFEE6,
+ 0xE4AE, 0xFEE7,
+ 0xE4AF, 0xFEE8,
+ 0xE4B0, 0xFEE9,
+ 0xE4B1, 0xFEEA,
+ 0xE4B2, 0xFEEB,
+ 0xE4B3, 0xFEEC,
+ 0xE4B4, 0xFEED,
+ 0xE4B5, 0xFEEE,
+ 0xE4B6, 0xFEEF,
+ 0xE4B7, 0xFEF0,
+ 0xE4B8, 0xFEF1,
+ 0xE4B9, 0xFEF2,
+ 0xE4BA, 0xFEF3,
+ 0xE4BB, 0xFEF4,
+ 0xE4BC, 0xFEF5,
+ 0xE4BD, 0xFEF6,
+ 0xE4BE, 0xFEF7,
+ 0xE4BF, 0xFEF8,
+ 0xE4C0, 0xFEF9,
+ 0xE4C1, 0xFEFA,
+ 0xE4C2, 0xFEFB,
+ 0xE4C3, 0xFEFC,
+ 0xE4C4, 0xFEFD,
+ 0xE4C5, 0xFEFE,
+ 0xE4C6, 0xA140,
+ 0xE4C7, 0xA141,
+ 0xE4C8, 0xA142,
+ 0xE4C9, 0xA143,
+ 0xE4CA, 0xA144,
+ 0xE4CB, 0xA145,
+ 0xE4CC, 0xA146,
+ 0xE4CD, 0xA147,
+ 0xE4CE, 0xA148,
+ 0xE4CF, 0xA149,
+ 0xE4D0, 0xA14A,
+ 0xE4D1, 0xA14B,
+ 0xE4D2, 0xA14C,
+ 0xE4D3, 0xA14D,
+ 0xE4D4, 0xA14E,
+ 0xE4D5, 0xA14F,
+ 0xE4D6, 0xA150,
+ 0xE4D7, 0xA151,
+ 0xE4D8, 0xA152,
+ 0xE4D9, 0xA153,
+ 0xE4DA, 0xA154,
+ 0xE4DB, 0xA155,
+ 0xE4DC, 0xA156,
+ 0xE4DD, 0xA157,
+ 0xE4DE, 0xA158,
+ 0xE4DF, 0xA159,
+ 0xE4E0, 0xA15A,
+ 0xE4E1, 0xA15B,
+ 0xE4E2, 0xA15C,
+ 0xE4E3, 0xA15D,
+ 0xE4E4, 0xA15E,
+ 0xE4E5, 0xA15F,
+ 0xE4E6, 0xA160,
+ 0xE4E7, 0xA161,
+ 0xE4E8, 0xA162,
+ 0xE4E9, 0xA163,
+ 0xE4EA, 0xA164,
+ 0xE4EB, 0xA165,
+ 0xE4EC, 0xA166,
+ 0xE4ED, 0xA167,
+ 0xE4EE, 0xA168,
+ 0xE4EF, 0xA169,
+ 0xE4F0, 0xA16A,
+ 0xE4F1, 0xA16B,
+ 0xE4F2, 0xA16C,
+ 0xE4F3, 0xA16D,
+ 0xE4F4, 0xA16E,
+ 0xE4F5, 0xA16F,
+ 0xE4F6, 0xA170,
+ 0xE4F7, 0xA171,
+ 0xE4F8, 0xA172,
+ 0xE4F9, 0xA173,
+ 0xE4FA, 0xA174,
+ 0xE4FB, 0xA175,
+ 0xE4FC, 0xA176,
+ 0xE4FD, 0xA177,
+ 0xE4FE, 0xA178,
+ 0xE4FF, 0xA179,
+ 0xE500, 0xA17A,
+ 0xE501, 0xA17B,
+ 0xE502, 0xA17C,
+ 0xE503, 0xA17D,
+ 0xE504, 0xA17E,
+ 0xE505, 0xA180,
+ 0xE506, 0xA181,
+ 0xE507, 0xA182,
+ 0xE508, 0xA183,
+ 0xE509, 0xA184,
+ 0xE50A, 0xA185,
+ 0xE50B, 0xA186,
+ 0xE50C, 0xA187,
+ 0xE50D, 0xA188,
+ 0xE50E, 0xA189,
+ 0xE50F, 0xA18A,
+ 0xE510, 0xA18B,
+ 0xE511, 0xA18C,
+ 0xE512, 0xA18D,
+ 0xE513, 0xA18E,
+ 0xE514, 0xA18F,
+ 0xE515, 0xA190,
+ 0xE516, 0xA191,
+ 0xE517, 0xA192,
+ 0xE518, 0xA193,
+ 0xE519, 0xA194,
+ 0xE51A, 0xA195,
+ 0xE51B, 0xA196,
+ 0xE51C, 0xA197,
+ 0xE51D, 0xA198,
+ 0xE51E, 0xA199,
+ 0xE51F, 0xA19A,
+ 0xE520, 0xA19B,
+ 0xE521, 0xA19C,
+ 0xE522, 0xA19D,
+ 0xE523, 0xA19E,
+ 0xE524, 0xA19F,
+ 0xE525, 0xA1A0,
+ 0xE526, 0xA240,
+ 0xE527, 0xA241,
+ 0xE528, 0xA242,
+ 0xE529, 0xA243,
+ 0xE52A, 0xA244,
+ 0xE52B, 0xA245,
+ 0xE52C, 0xA246,
+ 0xE52D, 0xA247,
+ 0xE52E, 0xA248,
+ 0xE52F, 0xA249,
+ 0xE530, 0xA24A,
+ 0xE531, 0xA24B,
+ 0xE532, 0xA24C,
+ 0xE533, 0xA24D,
+ 0xE534, 0xA24E,
+ 0xE535, 0xA24F,
+ 0xE536, 0xA250,
+ 0xE537, 0xA251,
+ 0xE538, 0xA252,
+ 0xE539, 0xA253,
+ 0xE53A, 0xA254,
+ 0xE53B, 0xA255,
+ 0xE53C, 0xA256,
+ 0xE53D, 0xA257,
+ 0xE53E, 0xA258,
+ 0xE53F, 0xA259,
+ 0xE540, 0xA25A,
+ 0xE541, 0xA25B,
+ 0xE542, 0xA25C,
+ 0xE543, 0xA25D,
+ 0xE544, 0xA25E,
+ 0xE545, 0xA25F,
+ 0xE546, 0xA260,
+ 0xE547, 0xA261,
+ 0xE548, 0xA262,
+ 0xE549, 0xA263,
+ 0xE54A, 0xA264,
+ 0xE54B, 0xA265,
+ 0xE54C, 0xA266,
+ 0xE54D, 0xA267,
+ 0xE54E, 0xA268,
+ 0xE54F, 0xA269,
+ 0xE550, 0xA26A,
+ 0xE551, 0xA26B,
+ 0xE552, 0xA26C,
+ 0xE553, 0xA26D,
+ 0xE554, 0xA26E,
+ 0xE555, 0xA26F,
+ 0xE556, 0xA270,
+ 0xE557, 0xA271,
+ 0xE558, 0xA272,
+ 0xE559, 0xA273,
+ 0xE55A, 0xA274,
+ 0xE55B, 0xA275,
+ 0xE55C, 0xA276,
+ 0xE55D, 0xA277,
+ 0xE55E, 0xA278,
+ 0xE55F, 0xA279,
+ 0xE560, 0xA27A,
+ 0xE561, 0xA27B,
+ 0xE562, 0xA27C,
+ 0xE563, 0xA27D,
+ 0xE564, 0xA27E,
+ 0xE565, 0xA280,
+ 0xE566, 0xA281,
+ 0xE567, 0xA282,
+ 0xE568, 0xA283,
+ 0xE569, 0xA284,
+ 0xE56A, 0xA285,
+ 0xE56B, 0xA286,
+ 0xE56C, 0xA287,
+ 0xE56D, 0xA288,
+ 0xE56E, 0xA289,
+ 0xE56F, 0xA28A,
+ 0xE570, 0xA28B,
+ 0xE571, 0xA28C,
+ 0xE572, 0xA28D,
+ 0xE573, 0xA28E,
+ 0xE574, 0xA28F,
+ 0xE575, 0xA290,
+ 0xE576, 0xA291,
+ 0xE577, 0xA292,
+ 0xE578, 0xA293,
+ 0xE579, 0xA294,
+ 0xE57A, 0xA295,
+ 0xE57B, 0xA296,
+ 0xE57C, 0xA297,
+ 0xE57D, 0xA298,
+ 0xE57E, 0xA299,
+ 0xE57F, 0xA29A,
+ 0xE580, 0xA29B,
+ 0xE581, 0xA29C,
+ 0xE582, 0xA29D,
+ 0xE583, 0xA29E,
+ 0xE584, 0xA29F,
+ 0xE585, 0xA2A0,
+ 0xE586, 0xA340,
+ 0xE587, 0xA341,
+ 0xE588, 0xA342,
+ 0xE589, 0xA343,
+ 0xE58A, 0xA344,
+ 0xE58B, 0xA345,
+ 0xE58C, 0xA346,
+ 0xE58D, 0xA347,
+ 0xE58E, 0xA348,
+ 0xE58F, 0xA349,
+ 0xE590, 0xA34A,
+ 0xE591, 0xA34B,
+ 0xE592, 0xA34C,
+ 0xE593, 0xA34D,
+ 0xE594, 0xA34E,
+ 0xE595, 0xA34F,
+ 0xE596, 0xA350,
+ 0xE597, 0xA351,
+ 0xE598, 0xA352,
+ 0xE599, 0xA353,
+ 0xE59A, 0xA354,
+ 0xE59B, 0xA355,
+ 0xE59C, 0xA356,
+ 0xE59D, 0xA357,
+ 0xE59E, 0xA358,
+ 0xE59F, 0xA359,
+ 0xE5A0, 0xA35A,
+ 0xE5A1, 0xA35B,
+ 0xE5A2, 0xA35C,
+ 0xE5A3, 0xA35D,
+ 0xE5A4, 0xA35E,
+ 0xE5A5, 0xA35F,
+ 0xE5A6, 0xA360,
+ 0xE5A7, 0xA361,
+ 0xE5A8, 0xA362,
+ 0xE5A9, 0xA363,
+ 0xE5AA, 0xA364,
+ 0xE5AB, 0xA365,
+ 0xE5AC, 0xA366,
+ 0xE5AD, 0xA367,
+ 0xE5AE, 0xA368,
+ 0xE5AF, 0xA369,
+ 0xE5B0, 0xA36A,
+ 0xE5B1, 0xA36B,
+ 0xE5B2, 0xA36C,
+ 0xE5B3, 0xA36D,
+ 0xE5B4, 0xA36E,
+ 0xE5B5, 0xA36F,
+ 0xE5B6, 0xA370,
+ 0xE5B7, 0xA371,
+ 0xE5B8, 0xA372,
+ 0xE5B9, 0xA373,
+ 0xE5BA, 0xA374,
+ 0xE5BB, 0xA375,
+ 0xE5BC, 0xA376,
+ 0xE5BD, 0xA377,
+ 0xE5BE, 0xA378,
+ 0xE5BF, 0xA379,
+ 0xE5C0, 0xA37A,
+ 0xE5C1, 0xA37B,
+ 0xE5C2, 0xA37C,
+ 0xE5C3, 0xA37D,
+ 0xE5C4, 0xA37E,
+ 0xE5C5, 0xA380,
+ 0xE5C6, 0xA381,
+ 0xE5C7, 0xA382,
+ 0xE5C8, 0xA383,
+ 0xE5C9, 0xA384,
+ 0xE5CA, 0xA385,
+ 0xE5CB, 0xA386,
+ 0xE5CC, 0xA387,
+ 0xE5CD, 0xA388,
+ 0xE5CE, 0xA389,
+ 0xE5CF, 0xA38A,
+ 0xE5D0, 0xA38B,
+ 0xE5D1, 0xA38C,
+ 0xE5D2, 0xA38D,
+ 0xE5D3, 0xA38E,
+ 0xE5D4, 0xA38F,
+ 0xE5D5, 0xA390,
+ 0xE5D6, 0xA391,
+ 0xE5D7, 0xA392,
+ 0xE5D8, 0xA393,
+ 0xE5D9, 0xA394,
+ 0xE5DA, 0xA395,
+ 0xE5DB, 0xA396,
+ 0xE5DC, 0xA397,
+ 0xE5DD, 0xA398,
+ 0xE5DE, 0xA399,
+ 0xE5DF, 0xA39A,
+ 0xE5E0, 0xA39B,
+ 0xE5E1, 0xA39C,
+ 0xE5E2, 0xA39D,
+ 0xE5E3, 0xA39E,
+ 0xE5E4, 0xA39F,
+ 0xE5E5, 0xA3A0,
+ 0xE5E6, 0xA440,
+ 0xE5E7, 0xA441,
+ 0xE5E8, 0xA442,
+ 0xE5E9, 0xA443,
+ 0xE5EA, 0xA444,
+ 0xE5EB, 0xA445,
+ 0xE5EC, 0xA446,
+ 0xE5ED, 0xA447,
+ 0xE5EE, 0xA448,
+ 0xE5EF, 0xA449,
+ 0xE5F0, 0xA44A,
+ 0xE5F1, 0xA44B,
+ 0xE5F2, 0xA44C,
+ 0xE5F3, 0xA44D,
+ 0xE5F4, 0xA44E,
+ 0xE5F5, 0xA44F,
+ 0xE5F6, 0xA450,
+ 0xE5F7, 0xA451,
+ 0xE5F8, 0xA452,
+ 0xE5F9, 0xA453,
+ 0xE5FA, 0xA454,
+ 0xE5FB, 0xA455,
+ 0xE5FC, 0xA456,
+ 0xE5FD, 0xA457,
+ 0xE5FE, 0xA458,
+ 0xE5FF, 0xA459,
+ 0xE600, 0xA45A,
+ 0xE601, 0xA45B,
+ 0xE602, 0xA45C,
+ 0xE603, 0xA45D,
+ 0xE604, 0xA45E,
+ 0xE605, 0xA45F,
+ 0xE606, 0xA460,
+ 0xE607, 0xA461,
+ 0xE608, 0xA462,
+ 0xE609, 0xA463,
+ 0xE60A, 0xA464,
+ 0xE60B, 0xA465,
+ 0xE60C, 0xA466,
+ 0xE60D, 0xA467,
+ 0xE60E, 0xA468,
+ 0xE60F, 0xA469,
+ 0xE610, 0xA46A,
+ 0xE611, 0xA46B,
+ 0xE612, 0xA46C,
+ 0xE613, 0xA46D,
+ 0xE614, 0xA46E,
+ 0xE615, 0xA46F,
+ 0xE616, 0xA470,
+ 0xE617, 0xA471,
+ 0xE618, 0xA472,
+ 0xE619, 0xA473,
+ 0xE61A, 0xA474,
+ 0xE61B, 0xA475,
+ 0xE61C, 0xA476,
+ 0xE61D, 0xA477,
+ 0xE61E, 0xA478,
+ 0xE61F, 0xA479,
+ 0xE620, 0xA47A,
+ 0xE621, 0xA47B,
+ 0xE622, 0xA47C,
+ 0xE623, 0xA47D,
+ 0xE624, 0xA47E,
+ 0xE625, 0xA480,
+ 0xE626, 0xA481,
+ 0xE627, 0xA482,
+ 0xE628, 0xA483,
+ 0xE629, 0xA484,
+ 0xE62A, 0xA485,
+ 0xE62B, 0xA486,
+ 0xE62C, 0xA487,
+ 0xE62D, 0xA488,
+ 0xE62E, 0xA489,
+ 0xE62F, 0xA48A,
+ 0xE630, 0xA48B,
+ 0xE631, 0xA48C,
+ 0xE632, 0xA48D,
+ 0xE633, 0xA48E,
+ 0xE634, 0xA48F,
+ 0xE635, 0xA490,
+ 0xE636, 0xA491,
+ 0xE637, 0xA492,
+ 0xE638, 0xA493,
+ 0xE639, 0xA494,
+ 0xE63A, 0xA495,
+ 0xE63B, 0xA496,
+ 0xE63C, 0xA497,
+ 0xE63D, 0xA498,
+ 0xE63E, 0xA499,
+ 0xE63F, 0xA49A,
+ 0xE640, 0xA49B,
+ 0xE641, 0xA49C,
+ 0xE642, 0xA49D,
+ 0xE643, 0xA49E,
+ 0xE644, 0xA49F,
+ 0xE645, 0xA4A0,
+ 0xE646, 0xA540,
+ 0xE647, 0xA541,
+ 0xE648, 0xA542,
+ 0xE649, 0xA543,
+ 0xE64A, 0xA544,
+ 0xE64B, 0xA545,
+ 0xE64C, 0xA546,
+ 0xE64D, 0xA547,
+ 0xE64E, 0xA548,
+ 0xE64F, 0xA549,
+ 0xE650, 0xA54A,
+ 0xE651, 0xA54B,
+ 0xE652, 0xA54C,
+ 0xE653, 0xA54D,
+ 0xE654, 0xA54E,
+ 0xE655, 0xA54F,
+ 0xE656, 0xA550,
+ 0xE657, 0xA551,
+ 0xE658, 0xA552,
+ 0xE659, 0xA553,
+ 0xE65A, 0xA554,
+ 0xE65B, 0xA555,
+ 0xE65C, 0xA556,
+ 0xE65D, 0xA557,
+ 0xE65E, 0xA558,
+ 0xE65F, 0xA559,
+ 0xE660, 0xA55A,
+ 0xE661, 0xA55B,
+ 0xE662, 0xA55C,
+ 0xE663, 0xA55D,
+ 0xE664, 0xA55E,
+ 0xE665, 0xA55F,
+ 0xE666, 0xA560,
+ 0xE667, 0xA561,
+ 0xE668, 0xA562,
+ 0xE669, 0xA563,
+ 0xE66A, 0xA564,
+ 0xE66B, 0xA565,
+ 0xE66C, 0xA566,
+ 0xE66D, 0xA567,
+ 0xE66E, 0xA568,
+ 0xE66F, 0xA569,
+ 0xE670, 0xA56A,
+ 0xE671, 0xA56B,
+ 0xE672, 0xA56C,
+ 0xE673, 0xA56D,
+ 0xE674, 0xA56E,
+ 0xE675, 0xA56F,
+ 0xE676, 0xA570,
+ 0xE677, 0xA571,
+ 0xE678, 0xA572,
+ 0xE679, 0xA573,
+ 0xE67A, 0xA574,
+ 0xE67B, 0xA575,
+ 0xE67C, 0xA576,
+ 0xE67D, 0xA577,
+ 0xE67E, 0xA578,
+ 0xE67F, 0xA579,
+ 0xE680, 0xA57A,
+ 0xE681, 0xA57B,
+ 0xE682, 0xA57C,
+ 0xE683, 0xA57D,
+ 0xE684, 0xA57E,
+ 0xE685, 0xA580,
+ 0xE686, 0xA581,
+ 0xE687, 0xA582,
+ 0xE688, 0xA583,
+ 0xE689, 0xA584,
+ 0xE68A, 0xA585,
+ 0xE68B, 0xA586,
+ 0xE68C, 0xA587,
+ 0xE68D, 0xA588,
+ 0xE68E, 0xA589,
+ 0xE68F, 0xA58A,
+ 0xE690, 0xA58B,
+ 0xE691, 0xA58C,
+ 0xE692, 0xA58D,
+ 0xE693, 0xA58E,
+ 0xE694, 0xA58F,
+ 0xE695, 0xA590,
+ 0xE696, 0xA591,
+ 0xE697, 0xA592,
+ 0xE698, 0xA593,
+ 0xE699, 0xA594,
+ 0xE69A, 0xA595,
+ 0xE69B, 0xA596,
+ 0xE69C, 0xA597,
+ 0xE69D, 0xA598,
+ 0xE69E, 0xA599,
+ 0xE69F, 0xA59A,
+ 0xE6A0, 0xA59B,
+ 0xE6A1, 0xA59C,
+ 0xE6A2, 0xA59D,
+ 0xE6A3, 0xA59E,
+ 0xE6A4, 0xA59F,
+ 0xE6A5, 0xA5A0,
+ 0xE6A6, 0xA640,
+ 0xE6A7, 0xA641,
+ 0xE6A8, 0xA642,
+ 0xE6A9, 0xA643,
+ 0xE6AA, 0xA644,
+ 0xE6AB, 0xA645,
+ 0xE6AC, 0xA646,
+ 0xE6AD, 0xA647,
+ 0xE6AE, 0xA648,
+ 0xE6AF, 0xA649,
+ 0xE6B0, 0xA64A,
+ 0xE6B1, 0xA64B,
+ 0xE6B2, 0xA64C,
+ 0xE6B3, 0xA64D,
+ 0xE6B4, 0xA64E,
+ 0xE6B5, 0xA64F,
+ 0xE6B6, 0xA650,
+ 0xE6B7, 0xA651,
+ 0xE6B8, 0xA652,
+ 0xE6B9, 0xA653,
+ 0xE6BA, 0xA654,
+ 0xE6BB, 0xA655,
+ 0xE6BC, 0xA656,
+ 0xE6BD, 0xA657,
+ 0xE6BE, 0xA658,
+ 0xE6BF, 0xA659,
+ 0xE6C0, 0xA65A,
+ 0xE6C1, 0xA65B,
+ 0xE6C2, 0xA65C,
+ 0xE6C3, 0xA65D,
+ 0xE6C4, 0xA65E,
+ 0xE6C5, 0xA65F,
+ 0xE6C6, 0xA660,
+ 0xE6C7, 0xA661,
+ 0xE6C8, 0xA662,
+ 0xE6C9, 0xA663,
+ 0xE6CA, 0xA664,
+ 0xE6CB, 0xA665,
+ 0xE6CC, 0xA666,
+ 0xE6CD, 0xA667,
+ 0xE6CE, 0xA668,
+ 0xE6CF, 0xA669,
+ 0xE6D0, 0xA66A,
+ 0xE6D1, 0xA66B,
+ 0xE6D2, 0xA66C,
+ 0xE6D3, 0xA66D,
+ 0xE6D4, 0xA66E,
+ 0xE6D5, 0xA66F,
+ 0xE6D6, 0xA670,
+ 0xE6D7, 0xA671,
+ 0xE6D8, 0xA672,
+ 0xE6D9, 0xA673,
+ 0xE6DA, 0xA674,
+ 0xE6DB, 0xA675,
+ 0xE6DC, 0xA676,
+ 0xE6DD, 0xA677,
+ 0xE6DE, 0xA678,
+ 0xE6DF, 0xA679,
+ 0xE6E0, 0xA67A,
+ 0xE6E1, 0xA67B,
+ 0xE6E2, 0xA67C,
+ 0xE6E3, 0xA67D,
+ 0xE6E4, 0xA67E,
+ 0xE6E5, 0xA680,
+ 0xE6E6, 0xA681,
+ 0xE6E7, 0xA682,
+ 0xE6E8, 0xA683,
+ 0xE6E9, 0xA684,
+ 0xE6EA, 0xA685,
+ 0xE6EB, 0xA686,
+ 0xE6EC, 0xA687,
+ 0xE6ED, 0xA688,
+ 0xE6EE, 0xA689,
+ 0xE6EF, 0xA68A,
+ 0xE6F0, 0xA68B,
+ 0xE6F1, 0xA68C,
+ 0xE6F2, 0xA68D,
+ 0xE6F3, 0xA68E,
+ 0xE6F4, 0xA68F,
+ 0xE6F5, 0xA690,
+ 0xE6F6, 0xA691,
+ 0xE6F7, 0xA692,
+ 0xE6F8, 0xA693,
+ 0xE6F9, 0xA694,
+ 0xE6FA, 0xA695,
+ 0xE6FB, 0xA696,
+ 0xE6FC, 0xA697,
+ 0xE6FD, 0xA698,
+ 0xE6FE, 0xA699,
+ 0xE6FF, 0xA69A,
+ 0xE700, 0xA69B,
+ 0xE701, 0xA69C,
+ 0xE702, 0xA69D,
+ 0xE703, 0xA69E,
+ 0xE704, 0xA69F,
+ 0xE705, 0xA6A0,
+ 0xE706, 0xA740,
+ 0xE707, 0xA741,
+ 0xE708, 0xA742,
+ 0xE709, 0xA743,
+ 0xE70A, 0xA744,
+ 0xE70B, 0xA745,
+ 0xE70C, 0xA746,
+ 0xE70D, 0xA747,
+ 0xE70E, 0xA748,
+ 0xE70F, 0xA749,
+ 0xE710, 0xA74A,
+ 0xE711, 0xA74B,
+ 0xE712, 0xA74C,
+ 0xE713, 0xA74D,
+ 0xE714, 0xA74E,
+ 0xE715, 0xA74F,
+ 0xE716, 0xA750,
+ 0xE717, 0xA751,
+ 0xE718, 0xA752,
+ 0xE719, 0xA753,
+ 0xE71A, 0xA754,
+ 0xE71B, 0xA755,
+ 0xE71C, 0xA756,
+ 0xE71D, 0xA757,
+ 0xE71E, 0xA758,
+ 0xE71F, 0xA759,
+ 0xE720, 0xA75A,
+ 0xE721, 0xA75B,
+ 0xE722, 0xA75C,
+ 0xE723, 0xA75D,
+ 0xE724, 0xA75E,
+ 0xE725, 0xA75F,
+ 0xE726, 0xA760,
+ 0xE727, 0xA761,
+ 0xE728, 0xA762,
+ 0xE729, 0xA763,
+ 0xE72A, 0xA764,
+ 0xE72B, 0xA765,
+ 0xE72C, 0xA766,
+ 0xE72D, 0xA767,
+ 0xE72E, 0xA768,
+ 0xE72F, 0xA769,
+ 0xE730, 0xA76A,
+ 0xE731, 0xA76B,
+ 0xE732, 0xA76C,
+ 0xE733, 0xA76D,
+ 0xE734, 0xA76E,
+ 0xE735, 0xA76F,
+ 0xE736, 0xA770,
+ 0xE737, 0xA771,
+ 0xE738, 0xA772,
+ 0xE739, 0xA773,
+ 0xE73A, 0xA774,
+ 0xE73B, 0xA775,
+ 0xE73C, 0xA776,
+ 0xE73D, 0xA777,
+ 0xE73E, 0xA778,
+ 0xE73F, 0xA779,
+ 0xE740, 0xA77A,
+ 0xE741, 0xA77B,
+ 0xE742, 0xA77C,
+ 0xE743, 0xA77D,
+ 0xE744, 0xA77E,
+ 0xE745, 0xA780,
+ 0xE746, 0xA781,
+ 0xE747, 0xA782,
+ 0xE748, 0xA783,
+ 0xE749, 0xA784,
+ 0xE74A, 0xA785,
+ 0xE74B, 0xA786,
+ 0xE74C, 0xA787,
+ 0xE74D, 0xA788,
+ 0xE74E, 0xA789,
+ 0xE74F, 0xA78A,
+ 0xE750, 0xA78B,
+ 0xE751, 0xA78C,
+ 0xE752, 0xA78D,
+ 0xE753, 0xA78E,
+ 0xE754, 0xA78F,
+ 0xE755, 0xA790,
+ 0xE756, 0xA791,
+ 0xE757, 0xA792,
+ 0xE758, 0xA793,
+ 0xE759, 0xA794,
+ 0xE75A, 0xA795,
+ 0xE75B, 0xA796,
+ 0xE75C, 0xA797,
+ 0xE75D, 0xA798,
+ 0xE75E, 0xA799,
+ 0xE75F, 0xA79A,
+ 0xE760, 0xA79B,
+ 0xE761, 0xA79C,
+ 0xE762, 0xA79D,
+ 0xE763, 0xA79E,
+ 0xE764, 0xA79F,
+ 0xE765, 0xA7A0,
+ 0xE766, 0xA2AB,
+ 0xE767, 0xA2AC,
+ 0xE768, 0xA2AD,
+ 0xE769, 0xA2AE,
+ 0xE76A, 0xA2AF,
+ 0xE76B, 0xA2B0,
+ 0xE76D, 0xA2E4,
+ 0xE76E, 0xA2EF,
+ 0xE76F, 0xA2F0,
+ 0xE770, 0xA2FD,
+ 0xE771, 0xA2FE,
+ 0xE772, 0xA4F4,
+ 0xE773, 0xA4F5,
+ 0xE774, 0xA4F6,
+ 0xE775, 0xA4F7,
+ 0xE776, 0xA4F8,
+ 0xE777, 0xA4F9,
+ 0xE778, 0xA4FA,
+ 0xE779, 0xA4FB,
+ 0xE77A, 0xA4FC,
+ 0xE77B, 0xA4FD,
+ 0xE77C, 0xA4FE,
+ 0xE77D, 0xA5F7,
+ 0xE77E, 0xA5F8,
+ 0xE77F, 0xA5F9,
+ 0xE780, 0xA5FA,
+ 0xE781, 0xA5FB,
+ 0xE782, 0xA5FC,
+ 0xE783, 0xA5FD,
+ 0xE784, 0xA5FE,
+ 0xE785, 0xA6B9,
+ 0xE786, 0xA6BA,
+ 0xE787, 0xA6BB,
+ 0xE788, 0xA6BC,
+ 0xE789, 0xA6BD,
+ 0xE78A, 0xA6BE,
+ 0xE78B, 0xA6BF,
+ 0xE78C, 0xA6C0,
+ 0xE78D, 0xA6D9,
+ 0xE78E, 0xA6DA,
+ 0xE78F, 0xA6DB,
+ 0xE790, 0xA6DC,
+ 0xE791, 0xA6DD,
+ 0xE792, 0xA6DE,
+ 0xE793, 0xA6DF,
+ 0xE794, 0xA6EC,
+ 0xE795, 0xA6ED,
+ 0xE796, 0xA6F3,
+ 0xE797, 0xA6F6,
+ 0xE798, 0xA6F7,
+ 0xE799, 0xA6F8,
+ 0xE79A, 0xA6F9,
+ 0xE79B, 0xA6FA,
+ 0xE79C, 0xA6FB,
+ 0xE79D, 0xA6FC,
+ 0xE79E, 0xA6FD,
+ 0xE79F, 0xA6FE,
+ 0xE7A0, 0xA7C2,
+ 0xE7A1, 0xA7C3,
+ 0xE7A2, 0xA7C4,
+ 0xE7A3, 0xA7C5,
+ 0xE7A4, 0xA7C6,
+ 0xE7A5, 0xA7C7,
+ 0xE7A6, 0xA7C8,
+ 0xE7A7, 0xA7C9,
+ 0xE7A8, 0xA7CA,
+ 0xE7A9, 0xA7CB,
+ 0xE7AA, 0xA7CC,
+ 0xE7AB, 0xA7CD,
+ 0xE7AC, 0xA7CE,
+ 0xE7AD, 0xA7CF,
+ 0xE7AE, 0xA7D0,
+ 0xE7AF, 0xA7F2,
+ 0xE7B0, 0xA7F3,
+ 0xE7B1, 0xA7F4,
+ 0xE7B2, 0xA7F5,
+ 0xE7B3, 0xA7F6,
+ 0xE7B4, 0xA7F7,
+ 0xE7B5, 0xA7F8,
+ 0xE7B6, 0xA7F9,
+ 0xE7B7, 0xA7FA,
+ 0xE7B8, 0xA7FB,
+ 0xE7B9, 0xA7FC,
+ 0xE7BA, 0xA7FD,
+ 0xE7BB, 0xA7FE,
+ 0xE7BC, 0xA896,
+ 0xE7BD, 0xA897,
+ 0xE7BE, 0xA898,
+ 0xE7BF, 0xA899,
+ 0xE7C0, 0xA89A,
+ 0xE7C1, 0xA89B,
+ 0xE7C2, 0xA89C,
+ 0xE7C3, 0xA89D,
+ 0xE7C4, 0xA89E,
+ 0xE7C5, 0xA89F,
+ 0xE7C6, 0xA8A0,
+ 0xE7C7, 0xA8BC,
+ 0xE7C9, 0xA8C1,
+ 0xE7CA, 0xA8C2,
+ 0xE7CB, 0xA8C3,
+ 0xE7CC, 0xA8C4,
+ 0xE7CD, 0xA8EA,
+ 0xE7CE, 0xA8EB,
+ 0xE7CF, 0xA8EC,
+ 0xE7D0, 0xA8ED,
+ 0xE7D1, 0xA8EE,
+ 0xE7D2, 0xA8EF,
+ 0xE7D3, 0xA8F0,
+ 0xE7D4, 0xA8F1,
+ 0xE7D5, 0xA8F2,
+ 0xE7D6, 0xA8F3,
+ 0xE7D7, 0xA8F4,
+ 0xE7D8, 0xA8F5,
+ 0xE7D9, 0xA8F6,
+ 0xE7DA, 0xA8F7,
+ 0xE7DB, 0xA8F8,
+ 0xE7DC, 0xA8F9,
+ 0xE7DD, 0xA8FA,
+ 0xE7DE, 0xA8FB,
+ 0xE7DF, 0xA8FC,
+ 0xE7E0, 0xA8FD,
+ 0xE7E1, 0xA8FE,
+ 0xE7E2, 0xA958,
+ 0xE7E3, 0xA95B,
+ 0xE7E4, 0xA95D,
+ 0xE7E5, 0xA95E,
+ 0xE7E6, 0xA95F,
+ 0xE7F4, 0xA997,
+ 0xE7F5, 0xA998,
+ 0xE7F6, 0xA999,
+ 0xE7F7, 0xA99A,
+ 0xE7F8, 0xA99B,
+ 0xE7F9, 0xA99C,
+ 0xE7FA, 0xA99D,
+ 0xE7FB, 0xA99E,
+ 0xE7FC, 0xA99F,
+ 0xE7FD, 0xA9A0,
+ 0xE7FE, 0xA9A1,
+ 0xE7FF, 0xA9A2,
+ 0xE800, 0xA9A3,
+ 0xE801, 0xA9F0,
+ 0xE802, 0xA9F1,
+ 0xE803, 0xA9F2,
+ 0xE804, 0xA9F3,
+ 0xE805, 0xA9F4,
+ 0xE806, 0xA9F5,
+ 0xE807, 0xA9F6,
+ 0xE808, 0xA9F7,
+ 0xE809, 0xA9F8,
+ 0xE80A, 0xA9F9,
+ 0xE80B, 0xA9FA,
+ 0xE80C, 0xA9FB,
+ 0xE80D, 0xA9FC,
+ 0xE80E, 0xA9FD,
+ 0xE80F, 0xA9FE,
+ 0xE810, 0xD7FA,
+ 0xE811, 0xD7FB,
+ 0xE812, 0xD7FC,
+ 0xE813, 0xD7FD,
+ 0xE814, 0xD7FE,
+ 0xE816, 0xFE51,
+ 0xE817, 0xFE52,
+ 0xE818, 0xFE53,
+ 0xE81E, 0xFE59,
+ 0xE826, 0xFE61,
+ 0xE82B, 0xFE66,
+ 0xE82C, 0xFE67,
+ 0xE831, 0xFE6C,
+ 0xE832, 0xFE6D,
+ 0xE83B, 0xFE76,
+ 0xE843, 0xFE7E,
+ 0xE854, 0xFE90,
+ 0xE855, 0xFE91,
+ 0xE864, 0xFEA0,
+ 0xF92C, 0xFD9C,
+ 0xF979, 0xFD9D,
+ 0xF995, 0xFD9E,
+ 0xF9E7, 0xFD9F,
+ 0xF9F1, 0xFDA0,
+ 0xFA0C, 0xFE40,
+ 0xFA0D, 0xFE41,
+ 0xFA0E, 0xFE42,
+ 0xFA0F, 0xFE43,
+ 0xFA11, 0xFE44,
+ 0xFA13, 0xFE45,
+ 0xFA14, 0xFE46,
+ 0xFA18, 0xFE47,
+ 0xFA1F, 0xFE48,
+ 0xFA20, 0xFE49,
+ 0xFA21, 0xFE4A,
+ 0xFA23, 0xFE4B,
+ 0xFA24, 0xFE4C,
+ 0xFA27, 0xFE4D,
+ 0xFA28, 0xFE4E,
+ 0xFA29, 0xFE4F,
+ 0xFE30, 0xA955,
+ 0xFE31, 0xA6F2,
+ 0xFE33, 0xA6F4,
+ 0xFE34, 0xA6F5,
+ 0xFE35, 0xA6E0,
+ 0xFE36, 0xA6E1,
+ 0xFE37, 0xA6F0,
+ 0xFE38, 0xA6F1,
+ 0xFE39, 0xA6E2,
+ 0xFE3A, 0xA6E3,
+ 0xFE3B, 0xA6EE,
+ 0xFE3C, 0xA6EF,
+ 0xFE3D, 0xA6E6,
+ 0xFE3E, 0xA6E7,
+ 0xFE3F, 0xA6E4,
+ 0xFE40, 0xA6E5,
+ 0xFE41, 0xA6E8,
+ 0xFE42, 0xA6E9,
+ 0xFE43, 0xA6EA,
+ 0xFE44, 0xA6EB,
+ 0xFE49, 0xA968,
+ 0xFE4A, 0xA969,
+ 0xFE4B, 0xA96A,
+ 0xFE4C, 0xA96B,
+ 0xFE4D, 0xA96C,
+ 0xFE4E, 0xA96D,
+ 0xFE4F, 0xA96E,
+ 0xFE50, 0xA96F,
+ 0xFE51, 0xA970,
+ 0xFE52, 0xA971,
+ 0xFE54, 0xA972,
+ 0xFE55, 0xA973,
+ 0xFE56, 0xA974,
+ 0xFE57, 0xA975,
+ 0xFE59, 0xA976,
+ 0xFE5A, 0xA977,
+ 0xFE5B, 0xA978,
+ 0xFE5C, 0xA979,
+ 0xFE5D, 0xA97A,
+ 0xFE5E, 0xA97B,
+ 0xFE5F, 0xA97C,
+ 0xFE60, 0xA97D,
+ 0xFE61, 0xA97E,
+ 0xFE62, 0xA980,
+ 0xFE63, 0xA981,
+ 0xFE64, 0xA982,
+ 0xFE65, 0xA983,
+ 0xFE66, 0xA984,
+ 0xFE68, 0xA985,
+ 0xFE69, 0xA986,
+ 0xFE6A, 0xA987,
+ 0xFE6B, 0xA988,
+ 0xFFE2, 0xA956,
+ 0xFFE4, 0xA957
+};
+
+static const unsigned short int gb18030_fourbyte_lookup[] = {
+ 0x0080, 0x8130, 0x8130,
+ 0x0081, 0x8130, 0x8131,
+ 0x0082, 0x8130, 0x8132,
+ 0x0083, 0x8130, 0x8133,
+ 0x0084, 0x8130, 0x8134,
+ 0x0085, 0x8130, 0x8135,
+ 0x0086, 0x8130, 0x8136,
+ 0x0087, 0x8130, 0x8137,
+ 0x0088, 0x8130, 0x8138,
+ 0x0089, 0x8130, 0x8139,
+ 0x008A, 0x8130, 0x8230,
+ 0x008B, 0x8130, 0x8231,
+ 0x008C, 0x8130, 0x8232,
+ 0x008D, 0x8130, 0x8233,
+ 0x008E, 0x8130, 0x8234,
+ 0x008F, 0x8130, 0x8235,
+ 0x0090, 0x8130, 0x8236,
+ 0x0091, 0x8130, 0x8237,
+ 0x0092, 0x8130, 0x8238,
+ 0x0093, 0x8130, 0x8239,
+ 0x0094, 0x8130, 0x8330,
+ 0x0095, 0x8130, 0x8331,
+ 0x0096, 0x8130, 0x8332,
+ 0x0097, 0x8130, 0x8333,
+ 0x0098, 0x8130, 0x8334,
+ 0x0099, 0x8130, 0x8335,
+ 0x009A, 0x8130, 0x8336,
+ 0x009B, 0x8130, 0x8337,
+ 0x009C, 0x8130, 0x8338,
+ 0x009D, 0x8130, 0x8339,
+ 0x009E, 0x8130, 0x8430,
+ 0x009F, 0x8130, 0x8431,
+ 0x00A0, 0x8130, 0x8432,
+ 0x00A1, 0x8130, 0x8433,
+ 0x00A2, 0x8130, 0x8434,
+ 0x00A3, 0x8130, 0x8435,
+ 0x00A5, 0x8130, 0x8436,
+ 0x00A6, 0x8130, 0x8437,
+ 0x00A9, 0x8130, 0x8438,
+ 0x00AA, 0x8130, 0x8439,
+ 0x00AB, 0x8130, 0x8530,
+ 0x00AC, 0x8130, 0x8531,
+ 0x00AD, 0x8130, 0x8532,
+ 0x00AE, 0x8130, 0x8533,
+ 0x00AF, 0x8130, 0x8534,
+ 0x00B2, 0x8130, 0x8535,
+ 0x00B3, 0x8130, 0x8536,
+ 0x00B4, 0x8130, 0x8537,
+ 0x00B5, 0x8130, 0x8538,
+ 0x00B6, 0x8130, 0x8539,
+ 0x00B8, 0x8130, 0x8630,
+ 0x00B9, 0x8130, 0x8631,
+ 0x00BA, 0x8130, 0x8632,
+ 0x00BB, 0x8130, 0x8633,
+ 0x00BC, 0x8130, 0x8634,
+ 0x00BD, 0x8130, 0x8635,
+ 0x00BE, 0x8130, 0x8636,
+ 0x00BF, 0x8130, 0x8637,
+ 0x00C0, 0x8130, 0x8638,
+ 0x00C1, 0x8130, 0x8639,
+ 0x00C2, 0x8130, 0x8730,
+ 0x00C3, 0x8130, 0x8731,
+ 0x00C4, 0x8130, 0x8732,
+ 0x00C5, 0x8130, 0x8733,
+ 0x00C6, 0x8130, 0x8734,
+ 0x00C7, 0x8130, 0x8735,
+ 0x00C8, 0x8130, 0x8736,
+ 0x00C9, 0x8130, 0x8737,
+ 0x00CA, 0x8130, 0x8738,
+ 0x00CB, 0x8130, 0x8739,
+ 0x00CC, 0x8130, 0x8830,
+ 0x00CD, 0x8130, 0x8831,
+ 0x00CE, 0x8130, 0x8832,
+ 0x00CF, 0x8130, 0x8833,
+ 0x00D0, 0x8130, 0x8834,
+ 0x00D1, 0x8130, 0x8835,
+ 0x00D2, 0x8130, 0x8836,
+ 0x00D3, 0x8130, 0x8837,
+ 0x00D4, 0x8130, 0x8838,
+ 0x00D5, 0x8130, 0x8839,
+ 0x00D6, 0x8130, 0x8930,
+ 0x00D8, 0x8130, 0x8931,
+ 0x00D9, 0x8130, 0x8932,
+ 0x00DA, 0x8130, 0x8933,
+ 0x00DB, 0x8130, 0x8934,
+ 0x00DC, 0x8130, 0x8935,
+ 0x00DD, 0x8130, 0x8936,
+ 0x00DE, 0x8130, 0x8937,
+ 0x00DF, 0x8130, 0x8938,
+ 0x00E2, 0x8130, 0x8939,
+ 0x00E3, 0x8130, 0x8A30,
+ 0x00E4, 0x8130, 0x8A31,
+ 0x00E5, 0x8130, 0x8A32,
+ 0x00E6, 0x8130, 0x8A33,
+ 0x00E7, 0x8130, 0x8A34,
+ 0x00EB, 0x8130, 0x8A35,
+ 0x00EE, 0x8130, 0x8A36,
+ 0x00EF, 0x8130, 0x8A37,
+ 0x00F0, 0x8130, 0x8A38,
+ 0x00F1, 0x8130, 0x8A39,
+ 0x00F4, 0x8130, 0x8B30,
+ 0x00F5, 0x8130, 0x8B31,
+ 0x00F6, 0x8130, 0x8B32,
+ 0x00F8, 0x8130, 0x8B33,
+ 0x00FB, 0x8130, 0x8B34,
+ 0x00FD, 0x8130, 0x8B35,
+ 0x00FE, 0x8130, 0x8B36,
+ 0x00FF, 0x8130, 0x8B37,
+ 0x0100, 0x8130, 0x8B38,
+ 0x0102, 0x8130, 0x8B39,
+ 0x0103, 0x8130, 0x8C30,
+ 0x0104, 0x8130, 0x8C31,
+ 0x0105, 0x8130, 0x8C32,
+ 0x0106, 0x8130, 0x8C33,
+ 0x0107, 0x8130, 0x8C34,
+ 0x0108, 0x8130, 0x8C35,
+ 0x0109, 0x8130, 0x8C36,
+ 0x010A, 0x8130, 0x8C37,
+ 0x010B, 0x8130, 0x8C38,
+ 0x010C, 0x8130, 0x8C39,
+ 0x010D, 0x8130, 0x8D30,
+ 0x010E, 0x8130, 0x8D31,
+ 0x010F, 0x8130, 0x8D32,
+ 0x0110, 0x8130, 0x8D33,
+ 0x0111, 0x8130, 0x8D34,
+ 0x0112, 0x8130, 0x8D35,
+ 0x0114, 0x8130, 0x8D36,
+ 0x0115, 0x8130, 0x8D37,
+ 0x0116, 0x8130, 0x8D38,
+ 0x0117, 0x8130, 0x8D39,
+ 0x0118, 0x8130, 0x8E30,
+ 0x0119, 0x8130, 0x8E31,
+ 0x011A, 0x8130, 0x8E32,
+ 0x011C, 0x8130, 0x8E33,
+ 0x011D, 0x8130, 0x8E34,
+ 0x011E, 0x8130, 0x8E35,
+ 0x011F, 0x8130, 0x8E36,
+ 0x0120, 0x8130, 0x8E37,
+ 0x0121, 0x8130, 0x8E38,
+ 0x0122, 0x8130, 0x8E39,
+ 0x0123, 0x8130, 0x8F30,
+ 0x0124, 0x8130, 0x8F31,
+ 0x0125, 0x8130, 0x8F32,
+ 0x0126, 0x8130, 0x8F33,
+ 0x0127, 0x8130, 0x8F34,
+ 0x0128, 0x8130, 0x8F35,
+ 0x0129, 0x8130, 0x8F36,
+ 0x012A, 0x8130, 0x8F37,
+ 0x012C, 0x8130, 0x8F38,
+ 0x012D, 0x8130, 0x8F39,
+ 0x012E, 0x8130, 0x9030,
+ 0x012F, 0x8130, 0x9031,
+ 0x0130, 0x8130, 0x9032,
+ 0x0131, 0x8130, 0x9033,
+ 0x0132, 0x8130, 0x9034,
+ 0x0133, 0x8130, 0x9035,
+ 0x0134, 0x8130, 0x9036,
+ 0x0135, 0x8130, 0x9037,
+ 0x0136, 0x8130, 0x9038,
+ 0x0137, 0x8130, 0x9039,
+ 0x0138, 0x8130, 0x9130,
+ 0x0139, 0x8130, 0x9131,
+ 0x013A, 0x8130, 0x9132,
+ 0x013B, 0x8130, 0x9133,
+ 0x013C, 0x8130, 0x9134,
+ 0x013D, 0x8130, 0x9135,
+ 0x013E, 0x8130, 0x9136,
+ 0x013F, 0x8130, 0x9137,
+ 0x0140, 0x8130, 0x9138,
+ 0x0141, 0x8130, 0x9139,
+ 0x0142, 0x8130, 0x9230,
+ 0x0143, 0x8130, 0x9231,
+ 0x0145, 0x8130, 0x9232,
+ 0x0146, 0x8130, 0x9233,
+ 0x0147, 0x8130, 0x9234,
+ 0x0149, 0x8130, 0x9235,
+ 0x014A, 0x8130, 0x9236,
+ 0x014B, 0x8130, 0x9237,
+ 0x014C, 0x8130, 0x9238,
+ 0x014E, 0x8130, 0x9239,
+ 0x014F, 0x8130, 0x9330,
+ 0x0150, 0x8130, 0x9331,
+ 0x0151, 0x8130, 0x9332,
+ 0x0152, 0x8130, 0x9333,
+ 0x0153, 0x8130, 0x9334,
+ 0x0154, 0x8130, 0x9335,
+ 0x0155, 0x8130, 0x9336,
+ 0x0156, 0x8130, 0x9337,
+ 0x0157, 0x8130, 0x9338,
+ 0x0158, 0x8130, 0x9339,
+ 0x0159, 0x8130, 0x9430,
+ 0x015A, 0x8130, 0x9431,
+ 0x015B, 0x8130, 0x9432,
+ 0x015C, 0x8130, 0x9433,
+ 0x015D, 0x8130, 0x9434,
+ 0x015E, 0x8130, 0x9435,
+ 0x015F, 0x8130, 0x9436,
+ 0x0160, 0x8130, 0x9437,
+ 0x0161, 0x8130, 0x9438,
+ 0x0162, 0x8130, 0x9439,
+ 0x0163, 0x8130, 0x9530,
+ 0x0164, 0x8130, 0x9531,
+ 0x0165, 0x8130, 0x9532,
+ 0x0166, 0x8130, 0x9533,
+ 0x0167, 0x8130, 0x9534,
+ 0x0168, 0x8130, 0x9535,
+ 0x0169, 0x8130, 0x9536,
+ 0x016A, 0x8130, 0x9537,
+ 0x016C, 0x8130, 0x9538,
+ 0x016D, 0x8130, 0x9539,
+ 0x016E, 0x8130, 0x9630,
+ 0x016F, 0x8130, 0x9631,
+ 0x0170, 0x8130, 0x9632,
+ 0x0171, 0x8130, 0x9633,
+ 0x0172, 0x8130, 0x9634,
+ 0x0173, 0x8130, 0x9635,
+ 0x0174, 0x8130, 0x9636,
+ 0x0175, 0x8130, 0x9637,
+ 0x0176, 0x8130, 0x9638,
+ 0x0177, 0x8130, 0x9639,
+ 0x0178, 0x8130, 0x9730,
+ 0x0179, 0x8130, 0x9731,
+ 0x017A, 0x8130, 0x9732,
+ 0x017B, 0x8130, 0x9733,
+ 0x017C, 0x8130, 0x9734,
+ 0x017D, 0x8130, 0x9735,
+ 0x017E, 0x8130, 0x9736,
+ 0x017F, 0x8130, 0x9737,
+ 0x0180, 0x8130, 0x9738,
+ 0x0181, 0x8130, 0x9739,
+ 0x0182, 0x8130, 0x9830,
+ 0x0183, 0x8130, 0x9831,
+ 0x0184, 0x8130, 0x9832,
+ 0x0185, 0x8130, 0x9833,
+ 0x0186, 0x8130, 0x9834,
+ 0x0187, 0x8130, 0x9835,
+ 0x0188, 0x8130, 0x9836,
+ 0x0189, 0x8130, 0x9837,
+ 0x018A, 0x8130, 0x9838,
+ 0x018B, 0x8130, 0x9839,
+ 0x018C, 0x8130, 0x9930,
+ 0x018D, 0x8130, 0x9931,
+ 0x018E, 0x8130, 0x9932,
+ 0x018F, 0x8130, 0x9933,
+ 0x0190, 0x8130, 0x9934,
+ 0x0191, 0x8130, 0x9935,
+ 0x0192, 0x8130, 0x9936,
+ 0x0193, 0x8130, 0x9937,
+ 0x0194, 0x8130, 0x9938,
+ 0x0195, 0x8130, 0x9939,
+ 0x0196, 0x8130, 0x9A30,
+ 0x0197, 0x8130, 0x9A31,
+ 0x0198, 0x8130, 0x9A32,
+ 0x0199, 0x8130, 0x9A33,
+ 0x019A, 0x8130, 0x9A34,
+ 0x019B, 0x8130, 0x9A35,
+ 0x019C, 0x8130, 0x9A36,
+ 0x019D, 0x8130, 0x9A37,
+ 0x019E, 0x8130, 0x9A38,
+ 0x019F, 0x8130, 0x9A39,
+ 0x01A0, 0x8130, 0x9B30,
+ 0x01A1, 0x8130, 0x9B31,
+ 0x01A2, 0x8130, 0x9B32,
+ 0x01A3, 0x8130, 0x9B33,
+ 0x01A4, 0x8130, 0x9B34,
+ 0x01A5, 0x8130, 0x9B35,
+ 0x01A6, 0x8130, 0x9B36,
+ 0x01A7, 0x8130, 0x9B37,
+ 0x01A8, 0x8130, 0x9B38,
+ 0x01A9, 0x8130, 0x9B39,
+ 0x01AA, 0x8130, 0x9C30,
+ 0x01AB, 0x8130, 0x9C31,
+ 0x01AC, 0x8130, 0x9C32,
+ 0x01AD, 0x8130, 0x9C33,
+ 0x01AE, 0x8130, 0x9C34,
+ 0x01AF, 0x8130, 0x9C35,
+ 0x01B0, 0x8130, 0x9C36,
+ 0x01B1, 0x8130, 0x9C37,
+ 0x01B2, 0x8130, 0x9C38,
+ 0x01B3, 0x8130, 0x9C39,
+ 0x01B4, 0x8130, 0x9D30,
+ 0x01B5, 0x8130, 0x9D31,
+ 0x01B6, 0x8130, 0x9D32,
+ 0x01B7, 0x8130, 0x9D33,
+ 0x01B8, 0x8130, 0x9D34,
+ 0x01B9, 0x8130, 0x9D35,
+ 0x01BA, 0x8130, 0x9D36,
+ 0x01BB, 0x8130, 0x9D37,
+ 0x01BC, 0x8130, 0x9D38,
+ 0x01BD, 0x8130, 0x9D39,
+ 0x01BE, 0x8130, 0x9E30,
+ 0x01BF, 0x8130, 0x9E31,
+ 0x01C0, 0x8130, 0x9E32,
+ 0x01C1, 0x8130, 0x9E33,
+ 0x01C2, 0x8130, 0x9E34,
+ 0x01C3, 0x8130, 0x9E35,
+ 0x01C4, 0x8130, 0x9E36,
+ 0x01C5, 0x8130, 0x9E37,
+ 0x01C6, 0x8130, 0x9E38,
+ 0x01C7, 0x8130, 0x9E39,
+ 0x01C8, 0x8130, 0x9F30,
+ 0x01C9, 0x8130, 0x9F31,
+ 0x01CA, 0x8130, 0x9F32,
+ 0x01CB, 0x8130, 0x9F33,
+ 0x01CC, 0x8130, 0x9F34,
+ 0x01CD, 0x8130, 0x9F35,
+ 0x01CF, 0x8130, 0x9F36,
+ 0x01D1, 0x8130, 0x9F37,
+ 0x01D3, 0x8130, 0x9F38,
+ 0x01D5, 0x8130, 0x9F39,
+ 0x01D7, 0x8130, 0xA030,
+ 0x01D9, 0x8130, 0xA031,
+ 0x01DB, 0x8130, 0xA032,
+ 0x01DD, 0x8130, 0xA033,
+ 0x01DE, 0x8130, 0xA034,
+ 0x01DF, 0x8130, 0xA035,
+ 0x01E0, 0x8130, 0xA036,
+ 0x01E1, 0x8130, 0xA037,
+ 0x01E2, 0x8130, 0xA038,
+ 0x01E3, 0x8130, 0xA039,
+ 0x01E4, 0x8130, 0xA130,
+ 0x01E5, 0x8130, 0xA131,
+ 0x01E6, 0x8130, 0xA132,
+ 0x01E7, 0x8130, 0xA133,
+ 0x01E8, 0x8130, 0xA134,
+ 0x01E9, 0x8130, 0xA135,
+ 0x01EA, 0x8130, 0xA136,
+ 0x01EB, 0x8130, 0xA137,
+ 0x01EC, 0x8130, 0xA138,
+ 0x01ED, 0x8130, 0xA139,
+ 0x01EE, 0x8130, 0xA230,
+ 0x01EF, 0x8130, 0xA231,
+ 0x01F0, 0x8130, 0xA232,
+ 0x01F1, 0x8130, 0xA233,
+ 0x01F2, 0x8130, 0xA234,
+ 0x01F3, 0x8130, 0xA235,
+ 0x01F4, 0x8130, 0xA236,
+ 0x01F5, 0x8130, 0xA237,
+ 0x01F6, 0x8130, 0xA238,
+ 0x01F7, 0x8130, 0xA239,
+ 0x01F8, 0x8130, 0xA330,
+ 0x01FA, 0x8130, 0xA331,
+ 0x01FB, 0x8130, 0xA332,
+ 0x01FC, 0x8130, 0xA333,
+ 0x01FD, 0x8130, 0xA334,
+ 0x01FE, 0x8130, 0xA335,
+ 0x01FF, 0x8130, 0xA336,
+ 0x0200, 0x8130, 0xA337,
+ 0x0201, 0x8130, 0xA338,
+ 0x0202, 0x8130, 0xA339,
+ 0x0203, 0x8130, 0xA430,
+ 0x0204, 0x8130, 0xA431,
+ 0x0205, 0x8130, 0xA432,
+ 0x0206, 0x8130, 0xA433,
+ 0x0207, 0x8130, 0xA434,
+ 0x0208, 0x8130, 0xA435,
+ 0x0209, 0x8130, 0xA436,
+ 0x020A, 0x8130, 0xA437,
+ 0x020B, 0x8130, 0xA438,
+ 0x020C, 0x8130, 0xA439,
+ 0x020D, 0x8130, 0xA530,
+ 0x020E, 0x8130, 0xA531,
+ 0x020F, 0x8130, 0xA532,
+ 0x0210, 0x8130, 0xA533,
+ 0x0211, 0x8130, 0xA534,
+ 0x0212, 0x8130, 0xA535,
+ 0x0213, 0x8130, 0xA536,
+ 0x0214, 0x8130, 0xA537,
+ 0x0215, 0x8130, 0xA538,
+ 0x0216, 0x8130, 0xA539,
+ 0x0217, 0x8130, 0xA630,
+ 0x0218, 0x8130, 0xA631,
+ 0x0219, 0x8130, 0xA632,
+ 0x021A, 0x8130, 0xA633,
+ 0x021B, 0x8130, 0xA634,
+ 0x021C, 0x8130, 0xA635,
+ 0x021D, 0x8130, 0xA636,
+ 0x021E, 0x8130, 0xA637,
+ 0x021F, 0x8130, 0xA638,
+ 0x0220, 0x8130, 0xA639,
+ 0x0221, 0x8130, 0xA730,
+ 0x0222, 0x8130, 0xA731,
+ 0x0223, 0x8130, 0xA732,
+ 0x0224, 0x8130, 0xA733,
+ 0x0225, 0x8130, 0xA734,
+ 0x0226, 0x8130, 0xA735,
+ 0x0227, 0x8130, 0xA736,
+ 0x0228, 0x8130, 0xA737,
+ 0x0229, 0x8130, 0xA738,
+ 0x022A, 0x8130, 0xA739,
+ 0x022B, 0x8130, 0xA830,
+ 0x022C, 0x8130, 0xA831,
+ 0x022D, 0x8130, 0xA832,
+ 0x022E, 0x8130, 0xA833,
+ 0x022F, 0x8130, 0xA834,
+ 0x0230, 0x8130, 0xA835,
+ 0x0231, 0x8130, 0xA836,
+ 0x0232, 0x8130, 0xA837,
+ 0x0233, 0x8130, 0xA838,
+ 0x0234, 0x8130, 0xA839,
+ 0x0235, 0x8130, 0xA930,
+ 0x0236, 0x8130, 0xA931,
+ 0x0237, 0x8130, 0xA932,
+ 0x0238, 0x8130, 0xA933,
+ 0x0239, 0x8130, 0xA934,
+ 0x023A, 0x8130, 0xA935,
+ 0x023B, 0x8130, 0xA936,
+ 0x023C, 0x8130, 0xA937,
+ 0x023D, 0x8130, 0xA938,
+ 0x023E, 0x8130, 0xA939,
+ 0x023F, 0x8130, 0xAA30,
+ 0x0240, 0x8130, 0xAA31,
+ 0x0241, 0x8130, 0xAA32,
+ 0x0242, 0x8130, 0xAA33,
+ 0x0243, 0x8130, 0xAA34,
+ 0x0244, 0x8130, 0xAA35,
+ 0x0245, 0x8130, 0xAA36,
+ 0x0246, 0x8130, 0xAA37,
+ 0x0247, 0x8130, 0xAA38,
+ 0x0248, 0x8130, 0xAA39,
+ 0x0249, 0x8130, 0xAB30,
+ 0x024A, 0x8130, 0xAB31,
+ 0x024B, 0x8130, 0xAB32,
+ 0x024C, 0x8130, 0xAB33,
+ 0x024D, 0x8130, 0xAB34,
+ 0x024E, 0x8130, 0xAB35,
+ 0x024F, 0x8130, 0xAB36,
+ 0x0250, 0x8130, 0xAB37,
+ 0x0252, 0x8130, 0xAB38,
+ 0x0253, 0x8130, 0xAB39,
+ 0x0254, 0x8130, 0xAC30,
+ 0x0255, 0x8130, 0xAC31,
+ 0x0256, 0x8130, 0xAC32,
+ 0x0257, 0x8130, 0xAC33,
+ 0x0258, 0x8130, 0xAC34,
+ 0x0259, 0x8130, 0xAC35,
+ 0x025A, 0x8130, 0xAC36,
+ 0x025B, 0x8130, 0xAC37,
+ 0x025C, 0x8130, 0xAC38,
+ 0x025D, 0x8130, 0xAC39,
+ 0x025E, 0x8130, 0xAD30,
+ 0x025F, 0x8130, 0xAD31,
+ 0x0260, 0x8130, 0xAD32,
+ 0x0262, 0x8130, 0xAD33,
+ 0x0263, 0x8130, 0xAD34,
+ 0x0264, 0x8130, 0xAD35,
+ 0x0265, 0x8130, 0xAD36,
+ 0x0266, 0x8130, 0xAD37,
+ 0x0267, 0x8130, 0xAD38,
+ 0x0268, 0x8130, 0xAD39,
+ 0x0269, 0x8130, 0xAE30,
+ 0x026A, 0x8130, 0xAE31,
+ 0x026B, 0x8130, 0xAE32,
+ 0x026C, 0x8130, 0xAE33,
+ 0x026D, 0x8130, 0xAE34,
+ 0x026E, 0x8130, 0xAE35,
+ 0x026F, 0x8130, 0xAE36,
+ 0x0270, 0x8130, 0xAE37,
+ 0x0271, 0x8130, 0xAE38,
+ 0x0272, 0x8130, 0xAE39,
+ 0x0273, 0x8130, 0xAF30,
+ 0x0274, 0x8130, 0xAF31,
+ 0x0275, 0x8130, 0xAF32,
+ 0x0276, 0x8130, 0xAF33,
+ 0x0277, 0x8130, 0xAF34,
+ 0x0278, 0x8130, 0xAF35,
+ 0x0279, 0x8130, 0xAF36,
+ 0x027A, 0x8130, 0xAF37,
+ 0x027B, 0x8130, 0xAF38,
+ 0x027C, 0x8130, 0xAF39,
+ 0x027D, 0x8130, 0xB030,
+ 0x027E, 0x8130, 0xB031,
+ 0x027F, 0x8130, 0xB032,
+ 0x0280, 0x8130, 0xB033,
+ 0x0281, 0x8130, 0xB034,
+ 0x0282, 0x8130, 0xB035,
+ 0x0283, 0x8130, 0xB036,
+ 0x0284, 0x8130, 0xB037,
+ 0x0285, 0x8130, 0xB038,
+ 0x0286, 0x8130, 0xB039,
+ 0x0287, 0x8130, 0xB130,
+ 0x0288, 0x8130, 0xB131,
+ 0x0289, 0x8130, 0xB132,
+ 0x028A, 0x8130, 0xB133,
+ 0x028B, 0x8130, 0xB134,
+ 0x028C, 0x8130, 0xB135,
+ 0x028D, 0x8130, 0xB136,
+ 0x028E, 0x8130, 0xB137,
+ 0x028F, 0x8130, 0xB138,
+ 0x0290, 0x8130, 0xB139,
+ 0x0291, 0x8130, 0xB230,
+ 0x0292, 0x8130, 0xB231,
+ 0x0293, 0x8130, 0xB232,
+ 0x0294, 0x8130, 0xB233,
+ 0x0295, 0x8130, 0xB234,
+ 0x0296, 0x8130, 0xB235,
+ 0x0297, 0x8130, 0xB236,
+ 0x0298, 0x8130, 0xB237,
+ 0x0299, 0x8130, 0xB238,
+ 0x029A, 0x8130, 0xB239,
+ 0x029B, 0x8130, 0xB330,
+ 0x029C, 0x8130, 0xB331,
+ 0x029D, 0x8130, 0xB332,
+ 0x029E, 0x8130, 0xB333,
+ 0x029F, 0x8130, 0xB334,
+ 0x02A0, 0x8130, 0xB335,
+ 0x02A1, 0x8130, 0xB336,
+ 0x02A2, 0x8130, 0xB337,
+ 0x02A3, 0x8130, 0xB338,
+ 0x02A4, 0x8130, 0xB339,
+ 0x02A5, 0x8130, 0xB430,
+ 0x02A6, 0x8130, 0xB431,
+ 0x02A7, 0x8130, 0xB432,
+ 0x02A8, 0x8130, 0xB433,
+ 0x02A9, 0x8130, 0xB434,
+ 0x02AA, 0x8130, 0xB435,
+ 0x02AB, 0x8130, 0xB436,
+ 0x02AC, 0x8130, 0xB437,
+ 0x02AD, 0x8130, 0xB438,
+ 0x02AE, 0x8130, 0xB439,
+ 0x02AF, 0x8130, 0xB530,
+ 0x02B0, 0x8130, 0xB531,
+ 0x02B1, 0x8130, 0xB532,
+ 0x02B2, 0x8130, 0xB533,
+ 0x02B3, 0x8130, 0xB534,
+ 0x02B4, 0x8130, 0xB535,
+ 0x02B5, 0x8130, 0xB536,
+ 0x02B6, 0x8130, 0xB537,
+ 0x02B7, 0x8130, 0xB538,
+ 0x02B8, 0x8130, 0xB539,
+ 0x02B9, 0x8130, 0xB630,
+ 0x02BA, 0x8130, 0xB631,
+ 0x02BB, 0x8130, 0xB632,
+ 0x02BC, 0x8130, 0xB633,
+ 0x02BD, 0x8130, 0xB634,
+ 0x02BE, 0x8130, 0xB635,
+ 0x02BF, 0x8130, 0xB636,
+ 0x02C0, 0x8130, 0xB637,
+ 0x02C1, 0x8130, 0xB638,
+ 0x02C2, 0x8130, 0xB639,
+ 0x02C3, 0x8130, 0xB730,
+ 0x02C4, 0x8130, 0xB731,
+ 0x02C5, 0x8130, 0xB732,
+ 0x02C6, 0x8130, 0xB733,
+ 0x02C8, 0x8130, 0xB734,
+ 0x02CC, 0x8130, 0xB735,
+ 0x02CD, 0x8130, 0xB736,
+ 0x02CE, 0x8130, 0xB737,
+ 0x02CF, 0x8130, 0xB738,
+ 0x02D0, 0x8130, 0xB739,
+ 0x02D1, 0x8130, 0xB830,
+ 0x02D2, 0x8130, 0xB831,
+ 0x02D3, 0x8130, 0xB832,
+ 0x02D4, 0x8130, 0xB833,
+ 0x02D5, 0x8130, 0xB834,
+ 0x02D6, 0x8130, 0xB835,
+ 0x02D7, 0x8130, 0xB836,
+ 0x02D8, 0x8130, 0xB837,
+ 0x02DA, 0x8130, 0xB838,
+ 0x02DB, 0x8130, 0xB839,
+ 0x02DC, 0x8130, 0xB930,
+ 0x02DD, 0x8130, 0xB931,
+ 0x02DE, 0x8130, 0xB932,
+ 0x02DF, 0x8130, 0xB933,
+ 0x02E0, 0x8130, 0xB934,
+ 0x02E1, 0x8130, 0xB935,
+ 0x02E2, 0x8130, 0xB936,
+ 0x02E3, 0x8130, 0xB937,
+ 0x02E4, 0x8130, 0xB938,
+ 0x02E5, 0x8130, 0xB939,
+ 0x02E6, 0x8130, 0xBA30,
+ 0x02E7, 0x8130, 0xBA31,
+ 0x02E8, 0x8130, 0xBA32,
+ 0x02E9, 0x8130, 0xBA33,
+ 0x02EA, 0x8130, 0xBA34,
+ 0x02EB, 0x8130, 0xBA35,
+ 0x02EC, 0x8130, 0xBA36,
+ 0x02ED, 0x8130, 0xBA37,
+ 0x02EE, 0x8130, 0xBA38,
+ 0x02EF, 0x8130, 0xBA39,
+ 0x02F0, 0x8130, 0xBB30,
+ 0x02F1, 0x8130, 0xBB31,
+ 0x02F2, 0x8130, 0xBB32,
+ 0x02F3, 0x8130, 0xBB33,
+ 0x02F4, 0x8130, 0xBB34,
+ 0x02F5, 0x8130, 0xBB35,
+ 0x02F6, 0x8130, 0xBB36,
+ 0x02F7, 0x8130, 0xBB37,
+ 0x02F8, 0x8130, 0xBB38,
+ 0x02F9, 0x8130, 0xBB39,
+ 0x02FA, 0x8130, 0xBC30,
+ 0x02FB, 0x8130, 0xBC31,
+ 0x02FC, 0x8130, 0xBC32,
+ 0x02FD, 0x8130, 0xBC33,
+ 0x02FE, 0x8130, 0xBC34,
+ 0x02FF, 0x8130, 0xBC35,
+ 0x0300, 0x8130, 0xBC36,
+ 0x0301, 0x8130, 0xBC37,
+ 0x0302, 0x8130, 0xBC38,
+ 0x0303, 0x8130, 0xBC39,
+ 0x0304, 0x8130, 0xBD30,
+ 0x0305, 0x8130, 0xBD31,
+ 0x0306, 0x8130, 0xBD32,
+ 0x0307, 0x8130, 0xBD33,
+ 0x0308, 0x8130, 0xBD34,
+ 0x0309, 0x8130, 0xBD35,
+ 0x030A, 0x8130, 0xBD36,
+ 0x030B, 0x8130, 0xBD37,
+ 0x030C, 0x8130, 0xBD38,
+ 0x030D, 0x8130, 0xBD39,
+ 0x030E, 0x8130, 0xBE30,
+ 0x030F, 0x8130, 0xBE31,
+ 0x0310, 0x8130, 0xBE32,
+ 0x0311, 0x8130, 0xBE33,
+ 0x0312, 0x8130, 0xBE34,
+ 0x0313, 0x8130, 0xBE35,
+ 0x0314, 0x8130, 0xBE36,
+ 0x0315, 0x8130, 0xBE37,
+ 0x0316, 0x8130, 0xBE38,
+ 0x0317, 0x8130, 0xBE39,
+ 0x0318, 0x8130, 0xBF30,
+ 0x0319, 0x8130, 0xBF31,
+ 0x031A, 0x8130, 0xBF32,
+ 0x031B, 0x8130, 0xBF33,
+ 0x031C, 0x8130, 0xBF34,
+ 0x031D, 0x8130, 0xBF35,
+ 0x031E, 0x8130, 0xBF36,
+ 0x031F, 0x8130, 0xBF37,
+ 0x0320, 0x8130, 0xBF38,
+ 0x0321, 0x8130, 0xBF39,
+ 0x0322, 0x8130, 0xC030,
+ 0x0323, 0x8130, 0xC031,
+ 0x0324, 0x8130, 0xC032,
+ 0x0325, 0x8130, 0xC033,
+ 0x0326, 0x8130, 0xC034,
+ 0x0327, 0x8130, 0xC035,
+ 0x0328, 0x8130, 0xC036,
+ 0x0329, 0x8130, 0xC037,
+ 0x032A, 0x8130, 0xC038,
+ 0x032B, 0x8130, 0xC039,
+ 0x032C, 0x8130, 0xC130,
+ 0x032D, 0x8130, 0xC131,
+ 0x032E, 0x8130, 0xC132,
+ 0x032F, 0x8130, 0xC133,
+ 0x0330, 0x8130, 0xC134,
+ 0x0331, 0x8130, 0xC135,
+ 0x0332, 0x8130, 0xC136,
+ 0x0333, 0x8130, 0xC137,
+ 0x0334, 0x8130, 0xC138,
+ 0x0335, 0x8130, 0xC139,
+ 0x0336, 0x8130, 0xC230,
+ 0x0337, 0x8130, 0xC231,
+ 0x0338, 0x8130, 0xC232,
+ 0x0339, 0x8130, 0xC233,
+ 0x033A, 0x8130, 0xC234,
+ 0x033B, 0x8130, 0xC235,
+ 0x033C, 0x8130, 0xC236,
+ 0x033D, 0x8130, 0xC237,
+ 0x033E, 0x8130, 0xC238,
+ 0x033F, 0x8130, 0xC239,
+ 0x0340, 0x8130, 0xC330,
+ 0x0341, 0x8130, 0xC331,
+ 0x0342, 0x8130, 0xC332,
+ 0x0343, 0x8130, 0xC333,
+ 0x0344, 0x8130, 0xC334,
+ 0x0345, 0x8130, 0xC335,
+ 0x0346, 0x8130, 0xC336,
+ 0x0347, 0x8130, 0xC337,
+ 0x0348, 0x8130, 0xC338,
+ 0x0349, 0x8130, 0xC339,
+ 0x034A, 0x8130, 0xC430,
+ 0x034B, 0x8130, 0xC431,
+ 0x034C, 0x8130, 0xC432,
+ 0x034D, 0x8130, 0xC433,
+ 0x034E, 0x8130, 0xC434,
+ 0x034F, 0x8130, 0xC435,
+ 0x0350, 0x8130, 0xC436,
+ 0x0351, 0x8130, 0xC437,
+ 0x0352, 0x8130, 0xC438,
+ 0x0353, 0x8130, 0xC439,
+ 0x0354, 0x8130, 0xC530,
+ 0x0355, 0x8130, 0xC531,
+ 0x0356, 0x8130, 0xC532,
+ 0x0357, 0x8130, 0xC533,
+ 0x0358, 0x8130, 0xC534,
+ 0x0359, 0x8130, 0xC535,
+ 0x035A, 0x8130, 0xC536,
+ 0x035B, 0x8130, 0xC537,
+ 0x035C, 0x8130, 0xC538,
+ 0x035D, 0x8130, 0xC539,
+ 0x035E, 0x8130, 0xC630,
+ 0x035F, 0x8130, 0xC631,
+ 0x0360, 0x8130, 0xC632,
+ 0x0361, 0x8130, 0xC633,
+ 0x0362, 0x8130, 0xC634,
+ 0x0363, 0x8130, 0xC635,
+ 0x0364, 0x8130, 0xC636,
+ 0x0365, 0x8130, 0xC637,
+ 0x0366, 0x8130, 0xC638,
+ 0x0367, 0x8130, 0xC639,
+ 0x0368, 0x8130, 0xC730,
+ 0x0369, 0x8130, 0xC731,
+ 0x036A, 0x8130, 0xC732,
+ 0x036B, 0x8130, 0xC733,
+ 0x036C, 0x8130, 0xC734,
+ 0x036D, 0x8130, 0xC735,
+ 0x036E, 0x8130, 0xC736,
+ 0x036F, 0x8130, 0xC737,
+ 0x0370, 0x8130, 0xC738,
+ 0x0371, 0x8130, 0xC739,
+ 0x0372, 0x8130, 0xC830,
+ 0x0373, 0x8130, 0xC831,
+ 0x0374, 0x8130, 0xC832,
+ 0x0375, 0x8130, 0xC833,
+ 0x0376, 0x8130, 0xC834,
+ 0x0377, 0x8130, 0xC835,
+ 0x0378, 0x8130, 0xC836,
+ 0x0379, 0x8130, 0xC837,
+ 0x037A, 0x8130, 0xC838,
+ 0x037B, 0x8130, 0xC839,
+ 0x037C, 0x8130, 0xC930,
+ 0x037D, 0x8130, 0xC931,
+ 0x037E, 0x8130, 0xC932,
+ 0x037F, 0x8130, 0xC933,
+ 0x0380, 0x8130, 0xC934,
+ 0x0381, 0x8130, 0xC935,
+ 0x0382, 0x8130, 0xC936,
+ 0x0383, 0x8130, 0xC937,
+ 0x0384, 0x8130, 0xC938,
+ 0x0385, 0x8130, 0xC939,
+ 0x0386, 0x8130, 0xCA30,
+ 0x0387, 0x8130, 0xCA31,
+ 0x0388, 0x8130, 0xCA32,
+ 0x0389, 0x8130, 0xCA33,
+ 0x038A, 0x8130, 0xCA34,
+ 0x038B, 0x8130, 0xCA35,
+ 0x038C, 0x8130, 0xCA36,
+ 0x038D, 0x8130, 0xCA37,
+ 0x038E, 0x8130, 0xCA38,
+ 0x038F, 0x8130, 0xCA39,
+ 0x0390, 0x8130, 0xCB30,
+ 0x03A2, 0x8130, 0xCB31,
+ 0x03AA, 0x8130, 0xCB32,
+ 0x03AB, 0x8130, 0xCB33,
+ 0x03AC, 0x8130, 0xCB34,
+ 0x03AD, 0x8130, 0xCB35,
+ 0x03AE, 0x8130, 0xCB36,
+ 0x03AF, 0x8130, 0xCB37,
+ 0x03B0, 0x8130, 0xCB38,
+ 0x03C2, 0x8130, 0xCB39,
+ 0x03CA, 0x8130, 0xCC30,
+ 0x03CB, 0x8130, 0xCC31,
+ 0x03CC, 0x8130, 0xCC32,
+ 0x03CD, 0x8130, 0xCC33,
+ 0x03CE, 0x8130, 0xCC34,
+ 0x03CF, 0x8130, 0xCC35,
+ 0x03D0, 0x8130, 0xCC36,
+ 0x03D1, 0x8130, 0xCC37,
+ 0x03D2, 0x8130, 0xCC38,
+ 0x03D3, 0x8130, 0xCC39,
+ 0x03D4, 0x8130, 0xCD30,
+ 0x03D5, 0x8130, 0xCD31,
+ 0x03D6, 0x8130, 0xCD32,
+ 0x03D7, 0x8130, 0xCD33,
+ 0x03D8, 0x8130, 0xCD34,
+ 0x03D9, 0x8130, 0xCD35,
+ 0x03DA, 0x8130, 0xCD36,
+ 0x03DB, 0x8130, 0xCD37,
+ 0x03DC, 0x8130, 0xCD38,
+ 0x03DD, 0x8130, 0xCD39,
+ 0x03DE, 0x8130, 0xCE30,
+ 0x03DF, 0x8130, 0xCE31,
+ 0x03E0, 0x8130, 0xCE32,
+ 0x03E1, 0x8130, 0xCE33,
+ 0x03E2, 0x8130, 0xCE34,
+ 0x03E3, 0x8130, 0xCE35,
+ 0x03E4, 0x8130, 0xCE36,
+ 0x03E5, 0x8130, 0xCE37,
+ 0x03E6, 0x8130, 0xCE38,
+ 0x03E7, 0x8130, 0xCE39,
+ 0x03E8, 0x8130, 0xCF30,
+ 0x03E9, 0x8130, 0xCF31,
+ 0x03EA, 0x8130, 0xCF32,
+ 0x03EB, 0x8130, 0xCF33,
+ 0x03EC, 0x8130, 0xCF34,
+ 0x03ED, 0x8130, 0xCF35,
+ 0x03EE, 0x8130, 0xCF36,
+ 0x03EF, 0x8130, 0xCF37,
+ 0x03F0, 0x8130, 0xCF38,
+ 0x03F1, 0x8130, 0xCF39,
+ 0x03F2, 0x8130, 0xD030,
+ 0x03F3, 0x8130, 0xD031,
+ 0x03F4, 0x8130, 0xD032,
+ 0x03F5, 0x8130, 0xD033,
+ 0x03F6, 0x8130, 0xD034,
+ 0x03F7, 0x8130, 0xD035,
+ 0x03F8, 0x8130, 0xD036,
+ 0x03F9, 0x8130, 0xD037,
+ 0x03FA, 0x8130, 0xD038,
+ 0x03FB, 0x8130, 0xD039,
+ 0x03FC, 0x8130, 0xD130,
+ 0x03FD, 0x8130, 0xD131,
+ 0x03FE, 0x8130, 0xD132,
+ 0x03FF, 0x8130, 0xD133,
+ 0x0400, 0x8130, 0xD134,
+ 0x0402, 0x8130, 0xD135,
+ 0x0403, 0x8130, 0xD136,
+ 0x0404, 0x8130, 0xD137,
+ 0x0405, 0x8130, 0xD138,
+ 0x0406, 0x8130, 0xD139,
+ 0x0407, 0x8130, 0xD230,
+ 0x0408, 0x8130, 0xD231,
+ 0x0409, 0x8130, 0xD232,
+ 0x040A, 0x8130, 0xD233,
+ 0x040B, 0x8130, 0xD234,
+ 0x040C, 0x8130, 0xD235,
+ 0x040D, 0x8130, 0xD236,
+ 0x040E, 0x8130, 0xD237,
+ 0x040F, 0x8130, 0xD238,
+ 0x0450, 0x8130, 0xD239,
+ 0x2011, 0x8136, 0xA532,
+ 0x2012, 0x8136, 0xA533,
+ 0x2017, 0x8136, 0xA534,
+ 0x201A, 0x8136, 0xA535,
+ 0x201B, 0x8136, 0xA536,
+ 0x201E, 0x8136, 0xA537,
+ 0x201F, 0x8136, 0xA538,
+ 0x2020, 0x8136, 0xA539,
+ 0x2021, 0x8136, 0xA630,
+ 0x2022, 0x8136, 0xA631,
+ 0x2023, 0x8136, 0xA632,
+ 0x2024, 0x8136, 0xA633,
+ 0x2027, 0x8136, 0xA634,
+ 0x2028, 0x8136, 0xA635,
+ 0x2029, 0x8136, 0xA636,
+ 0x202A, 0x8136, 0xA637,
+ 0x202B, 0x8136, 0xA638,
+ 0x202C, 0x8136, 0xA639,
+ 0x202D, 0x8136, 0xA730,
+ 0x202E, 0x8136, 0xA731,
+ 0x202F, 0x8136, 0xA732,
+ 0x2031, 0x8136, 0xA733,
+ 0x2034, 0x8136, 0xA734,
+ 0x2036, 0x8136, 0xA735,
+ 0x2037, 0x8136, 0xA736,
+ 0x2038, 0x8136, 0xA737,
+ 0x2039, 0x8136, 0xA738,
+ 0x203A, 0x8136, 0xA739,
+ 0x203C, 0x8136, 0xA830,
+ 0x203D, 0x8136, 0xA831,
+ 0x203E, 0x8136, 0xA832,
+ 0x203F, 0x8136, 0xA833,
+ 0x2040, 0x8136, 0xA834,
+ 0x2041, 0x8136, 0xA835,
+ 0x2042, 0x8136, 0xA836,
+ 0x2043, 0x8136, 0xA837,
+ 0x2044, 0x8136, 0xA838,
+ 0x2045, 0x8136, 0xA839,
+ 0x2046, 0x8136, 0xA930,
+ 0x2047, 0x8136, 0xA931,
+ 0x2048, 0x8136, 0xA932,
+ 0x2049, 0x8136, 0xA933,
+ 0x204A, 0x8136, 0xA934,
+ 0x204B, 0x8136, 0xA935,
+ 0x204C, 0x8136, 0xA936,
+ 0x204D, 0x8136, 0xA937,
+ 0x204E, 0x8136, 0xA938,
+ 0x204F, 0x8136, 0xA939,
+ 0x2050, 0x8136, 0xAA30,
+ 0x2051, 0x8136, 0xAA31,
+ 0x2052, 0x8136, 0xAA32,
+ 0x2053, 0x8136, 0xAA33,
+ 0x2054, 0x8136, 0xAA34,
+ 0x2055, 0x8136, 0xAA35,
+ 0x2056, 0x8136, 0xAA36,
+ 0x2057, 0x8136, 0xAA37,
+ 0x2058, 0x8136, 0xAA38,
+ 0x2059, 0x8136, 0xAA39,
+ 0x205A, 0x8136, 0xAB30,
+ 0x205B, 0x8136, 0xAB31,
+ 0x205C, 0x8136, 0xAB32,
+ 0x205D, 0x8136, 0xAB33,
+ 0x205E, 0x8136, 0xAB34,
+ 0x205F, 0x8136, 0xAB35,
+ 0x2060, 0x8136, 0xAB36,
+ 0x2061, 0x8136, 0xAB37,
+ 0x2062, 0x8136, 0xAB38,
+ 0x2063, 0x8136, 0xAB39,
+ 0x2064, 0x8136, 0xAC30,
+ 0x2065, 0x8136, 0xAC31,
+ 0x2066, 0x8136, 0xAC32,
+ 0x2067, 0x8136, 0xAC33,
+ 0x2068, 0x8136, 0xAC34,
+ 0x2069, 0x8136, 0xAC35,
+ 0x206A, 0x8136, 0xAC36,
+ 0x206B, 0x8136, 0xAC37,
+ 0x206C, 0x8136, 0xAC38,
+ 0x206D, 0x8136, 0xAC39,
+ 0x206E, 0x8136, 0xAD30,
+ 0x206F, 0x8136, 0xAD31,
+ 0x2070, 0x8136, 0xAD32,
+ 0x2071, 0x8136, 0xAD33,
+ 0x2072, 0x8136, 0xAD34,
+ 0x2073, 0x8136, 0xAD35,
+ 0x2074, 0x8136, 0xAD36,
+ 0x2075, 0x8136, 0xAD37,
+ 0x2076, 0x8136, 0xAD38,
+ 0x2077, 0x8136, 0xAD39,
+ 0x2078, 0x8136, 0xAE30,
+ 0x2079, 0x8136, 0xAE31,
+ 0x207A, 0x8136, 0xAE32,
+ 0x207B, 0x8136, 0xAE33,
+ 0x207C, 0x8136, 0xAE34,
+ 0x207D, 0x8136, 0xAE35,
+ 0x207E, 0x8136, 0xAE36,
+ 0x207F, 0x8136, 0xAE37,
+ 0x2080, 0x8136, 0xAE38,
+ 0x2081, 0x8136, 0xAE39,
+ 0x2082, 0x8136, 0xAF30,
+ 0x2083, 0x8136, 0xAF31,
+ 0x2084, 0x8136, 0xAF32,
+ 0x2085, 0x8136, 0xAF33,
+ 0x2086, 0x8136, 0xAF34,
+ 0x2087, 0x8136, 0xAF35,
+ 0x2088, 0x8136, 0xAF36,
+ 0x2089, 0x8136, 0xAF37,
+ 0x208A, 0x8136, 0xAF38,
+ 0x208B, 0x8136, 0xAF39,
+ 0x208C, 0x8136, 0xB030,
+ 0x208D, 0x8136, 0xB031,
+ 0x208E, 0x8136, 0xB032,
+ 0x208F, 0x8136, 0xB033,
+ 0x2090, 0x8136, 0xB034,
+ 0x2091, 0x8136, 0xB035,
+ 0x2092, 0x8136, 0xB036,
+ 0x2093, 0x8136, 0xB037,
+ 0x2094, 0x8136, 0xB038,
+ 0x2095, 0x8136, 0xB039,
+ 0x2096, 0x8136, 0xB130,
+ 0x2097, 0x8136, 0xB131,
+ 0x2098, 0x8136, 0xB132,
+ 0x2099, 0x8136, 0xB133,
+ 0x209A, 0x8136, 0xB134,
+ 0x209B, 0x8136, 0xB135,
+ 0x209C, 0x8136, 0xB136,
+ 0x209D, 0x8136, 0xB137,
+ 0x209E, 0x8136, 0xB138,
+ 0x209F, 0x8136, 0xB139,
+ 0x20A0, 0x8136, 0xB230,
+ 0x20A1, 0x8136, 0xB231,
+ 0x20A2, 0x8136, 0xB232,
+ 0x20A3, 0x8136, 0xB233,
+ 0x20A4, 0x8136, 0xB234,
+ 0x20A5, 0x8136, 0xB235,
+ 0x20A6, 0x8136, 0xB236,
+ 0x20A7, 0x8136, 0xB237,
+ 0x20A8, 0x8136, 0xB238,
+ 0x20A9, 0x8136, 0xB239,
+ 0x20AA, 0x8136, 0xB330,
+ 0x20AB, 0x8136, 0xB331,
+ 0x20AD, 0x8136, 0xB332,
+ 0x20AE, 0x8136, 0xB333,
+ 0x20AF, 0x8136, 0xB334,
+ 0x20B0, 0x8136, 0xB335,
+ 0x20B1, 0x8136, 0xB336,
+ 0x20B2, 0x8136, 0xB337,
+ 0x20B3, 0x8136, 0xB338,
+ 0x20B4, 0x8136, 0xB339,
+ 0x20B5, 0x8136, 0xB430,
+ 0x20B6, 0x8136, 0xB431,
+ 0x20B7, 0x8136, 0xB432,
+ 0x20B8, 0x8136, 0xB433,
+ 0x20B9, 0x8136, 0xB434,
+ 0x20BA, 0x8136, 0xB435,
+ 0x20BB, 0x8136, 0xB436,
+ 0x20BC, 0x8136, 0xB437,
+ 0x20BD, 0x8136, 0xB438,
+ 0x20BE, 0x8136, 0xB439,
+ 0x20BF, 0x8136, 0xB530,
+ 0x20C0, 0x8136, 0xB531,
+ 0x20C1, 0x8136, 0xB532,
+ 0x20C2, 0x8136, 0xB533,
+ 0x20C3, 0x8136, 0xB534,
+ 0x20C4, 0x8136, 0xB535,
+ 0x20C5, 0x8136, 0xB536,
+ 0x20C6, 0x8136, 0xB537,
+ 0x20C7, 0x8136, 0xB538,
+ 0x20C8, 0x8136, 0xB539,
+ 0x20C9, 0x8136, 0xB630,
+ 0x20CA, 0x8136, 0xB631,
+ 0x20CB, 0x8136, 0xB632,
+ 0x20CC, 0x8136, 0xB633,
+ 0x20CD, 0x8136, 0xB634,
+ 0x20CE, 0x8136, 0xB635,
+ 0x20CF, 0x8136, 0xB636,
+ 0x20D0, 0x8136, 0xB637,
+ 0x20D1, 0x8136, 0xB638,
+ 0x20D2, 0x8136, 0xB639,
+ 0x20D3, 0x8136, 0xB730,
+ 0x20D4, 0x8136, 0xB731,
+ 0x20D5, 0x8136, 0xB732,
+ 0x20D6, 0x8136, 0xB733,
+ 0x20D7, 0x8136, 0xB734,
+ 0x20D8, 0x8136, 0xB735,
+ 0x20D9, 0x8136, 0xB736,
+ 0x20DA, 0x8136, 0xB737,
+ 0x20DB, 0x8136, 0xB738,
+ 0x20DC, 0x8136, 0xB739,
+ 0x20DD, 0x8136, 0xB830,
+ 0x20DE, 0x8136, 0xB831,
+ 0x20DF, 0x8136, 0xB832,
+ 0x20E0, 0x8136, 0xB833,
+ 0x20E1, 0x8136, 0xB834,
+ 0x20E2, 0x8136, 0xB835,
+ 0x20E3, 0x8136, 0xB836,
+ 0x20E4, 0x8136, 0xB837,
+ 0x20E5, 0x8136, 0xB838,
+ 0x20E6, 0x8136, 0xB839,
+ 0x20E7, 0x8136, 0xB930,
+ 0x20E8, 0x8136, 0xB931,
+ 0x20E9, 0x8136, 0xB932,
+ 0x20EA, 0x8136, 0xB933,
+ 0x20EB, 0x8136, 0xB934,
+ 0x20EC, 0x8136, 0xB935,
+ 0x20ED, 0x8136, 0xB936,
+ 0x20EE, 0x8136, 0xB937,
+ 0x20EF, 0x8136, 0xB938,
+ 0x20F0, 0x8136, 0xB939,
+ 0x20F1, 0x8136, 0xBA30,
+ 0x20F2, 0x8136, 0xBA31,
+ 0x20F3, 0x8136, 0xBA32,
+ 0x20F4, 0x8136, 0xBA33,
+ 0x20F5, 0x8136, 0xBA34,
+ 0x20F6, 0x8136, 0xBA35,
+ 0x20F7, 0x8136, 0xBA36,
+ 0x20F8, 0x8136, 0xBA37,
+ 0x20F9, 0x8136, 0xBA38,
+ 0x20FA, 0x8136, 0xBA39,
+ 0x20FB, 0x8136, 0xBB30,
+ 0x20FC, 0x8136, 0xBB31,
+ 0x20FD, 0x8136, 0xBB32,
+ 0x20FE, 0x8136, 0xBB33,
+ 0x20FF, 0x8136, 0xBB34,
+ 0x2100, 0x8136, 0xBB35,
+ 0x2101, 0x8136, 0xBB36,
+ 0x2102, 0x8136, 0xBB37,
+ 0x2104, 0x8136, 0xBB38,
+ 0x2106, 0x8136, 0xBB39,
+ 0x2107, 0x8136, 0xBC30,
+ 0x2108, 0x8136, 0xBC31,
+ 0x210A, 0x8136, 0xBC32,
+ 0x210B, 0x8136, 0xBC33,
+ 0x210C, 0x8136, 0xBC34,
+ 0x210D, 0x8136, 0xBC35,
+ 0x210E, 0x8136, 0xBC36,
+ 0x210F, 0x8136, 0xBC37,
+ 0x2110, 0x8136, 0xBC38,
+ 0x2111, 0x8136, 0xBC39,
+ 0x2112, 0x8136, 0xBD30,
+ 0x2113, 0x8136, 0xBD31,
+ 0x2114, 0x8136, 0xBD32,
+ 0x2115, 0x8136, 0xBD33,
+ 0x2117, 0x8136, 0xBD34,
+ 0x2118, 0x8136, 0xBD35,
+ 0x2119, 0x8136, 0xBD36,
+ 0x211A, 0x8136, 0xBD37,
+ 0x211B, 0x8136, 0xBD38,
+ 0x211C, 0x8136, 0xBD39,
+ 0x211D, 0x8136, 0xBE30,
+ 0x211E, 0x8136, 0xBE31,
+ 0x211F, 0x8136, 0xBE32,
+ 0x2120, 0x8136, 0xBE33,
+ 0x2122, 0x8136, 0xBE34,
+ 0x2123, 0x8136, 0xBE35,
+ 0x2124, 0x8136, 0xBE36,
+ 0x2125, 0x8136, 0xBE37,
+ 0x2126, 0x8136, 0xBE38,
+ 0x2127, 0x8136, 0xBE39,
+ 0x2128, 0x8136, 0xBF30,
+ 0x2129, 0x8136, 0xBF31,
+ 0x212A, 0x8136, 0xBF32,
+ 0x212B, 0x8136, 0xBF33,
+ 0x212C, 0x8136, 0xBF34,
+ 0x212D, 0x8136, 0xBF35,
+ 0x212E, 0x8136, 0xBF36,
+ 0x212F, 0x8136, 0xBF37,
+ 0x2130, 0x8136, 0xBF38,
+ 0x2131, 0x8136, 0xBF39,
+ 0x2132, 0x8136, 0xC030,
+ 0x2133, 0x8136, 0xC031,
+ 0x2134, 0x8136, 0xC032,
+ 0x2135, 0x8136, 0xC033,
+ 0x2136, 0x8136, 0xC034,
+ 0x2137, 0x8136, 0xC035,
+ 0x2138, 0x8136, 0xC036,
+ 0x2139, 0x8136, 0xC037,
+ 0x213A, 0x8136, 0xC038,
+ 0x213B, 0x8136, 0xC039,
+ 0x213C, 0x8136, 0xC130,
+ 0x213D, 0x8136, 0xC131,
+ 0x213E, 0x8136, 0xC132,
+ 0x213F, 0x8136, 0xC133,
+ 0x2140, 0x8136, 0xC134,
+ 0x2141, 0x8136, 0xC135,
+ 0x2142, 0x8136, 0xC136,
+ 0x2143, 0x8136, 0xC137,
+ 0x2144, 0x8136, 0xC138,
+ 0x2145, 0x8136, 0xC139,
+ 0x2146, 0x8136, 0xC230,
+ 0x2147, 0x8136, 0xC231,
+ 0x2148, 0x8136, 0xC232,
+ 0x2149, 0x8136, 0xC233,
+ 0x214A, 0x8136, 0xC234,
+ 0x214B, 0x8136, 0xC235,
+ 0x214C, 0x8136, 0xC236,
+ 0x214D, 0x8136, 0xC237,
+ 0x214E, 0x8136, 0xC238,
+ 0x214F, 0x8136, 0xC239,
+ 0x2150, 0x8136, 0xC330,
+ 0x2151, 0x8136, 0xC331,
+ 0x2152, 0x8136, 0xC332,
+ 0x2153, 0x8136, 0xC333,
+ 0x2154, 0x8136, 0xC334,
+ 0x2155, 0x8136, 0xC335,
+ 0x2156, 0x8136, 0xC336,
+ 0x2157, 0x8136, 0xC337,
+ 0x2158, 0x8136, 0xC338,
+ 0x2159, 0x8136, 0xC339,
+ 0x215A, 0x8136, 0xC430,
+ 0x215B, 0x8136, 0xC431,
+ 0x215C, 0x8136, 0xC432,
+ 0x215D, 0x8136, 0xC433,
+ 0x215E, 0x8136, 0xC434,
+ 0x215F, 0x8136, 0xC435,
+ 0x216C, 0x8136, 0xC436,
+ 0x216D, 0x8136, 0xC437,
+ 0x216E, 0x8136, 0xC438,
+ 0x216F, 0x8136, 0xC439,
+ 0x217A, 0x8136, 0xC530,
+ 0x217B, 0x8136, 0xC531,
+ 0x217C, 0x8136, 0xC532,
+ 0x217D, 0x8136, 0xC533,
+ 0x217E, 0x8136, 0xC534,
+ 0x217F, 0x8136, 0xC535,
+ 0x2180, 0x8136, 0xC536,
+ 0x2181, 0x8136, 0xC537,
+ 0x2182, 0x8136, 0xC538,
+ 0x2183, 0x8136, 0xC539,
+ 0x2184, 0x8136, 0xC630,
+ 0x2185, 0x8136, 0xC631,
+ 0x2186, 0x8136, 0xC632,
+ 0x2187, 0x8136, 0xC633,
+ 0x2188, 0x8136, 0xC634,
+ 0x2189, 0x8136, 0xC635,
+ 0x218A, 0x8136, 0xC636,
+ 0x218B, 0x8136, 0xC637,
+ 0x218C, 0x8136, 0xC638,
+ 0x218D, 0x8136, 0xC639,
+ 0x218E, 0x8136, 0xC730,
+ 0x218F, 0x8136, 0xC731,
+ 0x2194, 0x8136, 0xC732,
+ 0x2195, 0x8136, 0xC733,
+ 0x219A, 0x8136, 0xC734,
+ 0x219B, 0x8136, 0xC735,
+ 0x219C, 0x8136, 0xC736,
+ 0x219D, 0x8136, 0xC737,
+ 0x219E, 0x8136, 0xC738,
+ 0x219F, 0x8136, 0xC739,
+ 0x21A0, 0x8136, 0xC830,
+ 0x21A1, 0x8136, 0xC831,
+ 0x21A2, 0x8136, 0xC832,
+ 0x21A3, 0x8136, 0xC833,
+ 0x21A4, 0x8136, 0xC834,
+ 0x21A5, 0x8136, 0xC835,
+ 0x21A6, 0x8136, 0xC836,
+ 0x21A7, 0x8136, 0xC837,
+ 0x21A8, 0x8136, 0xC838,
+ 0x21A9, 0x8136, 0xC839,
+ 0x21AA, 0x8136, 0xC930,
+ 0x21AB, 0x8136, 0xC931,
+ 0x21AC, 0x8136, 0xC932,
+ 0x21AD, 0x8136, 0xC933,
+ 0x21AE, 0x8136, 0xC934,
+ 0x21AF, 0x8136, 0xC935,
+ 0x21B0, 0x8136, 0xC936,
+ 0x21B1, 0x8136, 0xC937,
+ 0x21B2, 0x8136, 0xC938,
+ 0x21B3, 0x8136, 0xC939,
+ 0x21B4, 0x8136, 0xCA30,
+ 0x21B5, 0x8136, 0xCA31,
+ 0x21B6, 0x8136, 0xCA32,
+ 0x21B7, 0x8136, 0xCA33,
+ 0x21B8, 0x8136, 0xCA34,
+ 0x21B9, 0x8136, 0xCA35,
+ 0x21BA, 0x8136, 0xCA36,
+ 0x21BB, 0x8136, 0xCA37,
+ 0x21BC, 0x8136, 0xCA38,
+ 0x21BD, 0x8136, 0xCA39,
+ 0x21BE, 0x8136, 0xCB30,
+ 0x21BF, 0x8136, 0xCB31,
+ 0x21C0, 0x8136, 0xCB32,
+ 0x21C1, 0x8136, 0xCB33,
+ 0x21C2, 0x8136, 0xCB34,
+ 0x21C3, 0x8136, 0xCB35,
+ 0x21C4, 0x8136, 0xCB36,
+ 0x21C5, 0x8136, 0xCB37,
+ 0x21C6, 0x8136, 0xCB38,
+ 0x21C7, 0x8136, 0xCB39,
+ 0x21C8, 0x8136, 0xCC30,
+ 0x21C9, 0x8136, 0xCC31,
+ 0x21CA, 0x8136, 0xCC32,
+ 0x21CB, 0x8136, 0xCC33,
+ 0x21CC, 0x8136, 0xCC34,
+ 0x21CD, 0x8136, 0xCC35,
+ 0x21CE, 0x8136, 0xCC36,
+ 0x21CF, 0x8136, 0xCC37,
+ 0x21D0, 0x8136, 0xCC38,
+ 0x21D1, 0x8136, 0xCC39,
+ 0x21D2, 0x8136, 0xCD30,
+ 0x21D3, 0x8136, 0xCD31,
+ 0x21D4, 0x8136, 0xCD32,
+ 0x21D5, 0x8136, 0xCD33,
+ 0x21D6, 0x8136, 0xCD34,
+ 0x21D7, 0x8136, 0xCD35,
+ 0x21D8, 0x8136, 0xCD36,
+ 0x21D9, 0x8136, 0xCD37,
+ 0x21DA, 0x8136, 0xCD38,
+ 0x21DB, 0x8136, 0xCD39,
+ 0x21DC, 0x8136, 0xCE30,
+ 0x21DD, 0x8136, 0xCE31,
+ 0x21DE, 0x8136, 0xCE32,
+ 0x21DF, 0x8136, 0xCE33,
+ 0x21E0, 0x8136, 0xCE34,
+ 0x21E1, 0x8136, 0xCE35,
+ 0x21E2, 0x8136, 0xCE36,
+ 0x21E3, 0x8136, 0xCE37,
+ 0x21E4, 0x8136, 0xCE38,
+ 0x21E5, 0x8136, 0xCE39,
+ 0x21E6, 0x8136, 0xCF30,
+ 0x21E7, 0x8136, 0xCF31,
+ 0x21E8, 0x8136, 0xCF32,
+ 0x21E9, 0x8136, 0xCF33,
+ 0x21EA, 0x8136, 0xCF34,
+ 0x21EB, 0x8136, 0xCF35,
+ 0x21EC, 0x8136, 0xCF36,
+ 0x21ED, 0x8136, 0xCF37,
+ 0x21EE, 0x8136, 0xCF38,
+ 0x21EF, 0x8136, 0xCF39,
+ 0x21F0, 0x8136, 0xD030,
+ 0x21F1, 0x8136, 0xD031,
+ 0x21F2, 0x8136, 0xD032,
+ 0x21F3, 0x8136, 0xD033,
+ 0x21F4, 0x8136, 0xD034,
+ 0x21F5, 0x8136, 0xD035,
+ 0x21F6, 0x8136, 0xD036,
+ 0x21F7, 0x8136, 0xD037,
+ 0x21F8, 0x8136, 0xD038,
+ 0x21F9, 0x8136, 0xD039,
+ 0x21FA, 0x8136, 0xD130,
+ 0x21FB, 0x8136, 0xD131,
+ 0x21FC, 0x8136, 0xD132,
+ 0x21FD, 0x8136, 0xD133,
+ 0x21FE, 0x8136, 0xD134,
+ 0x21FF, 0x8136, 0xD135,
+ 0x2200, 0x8136, 0xD136,
+ 0x2201, 0x8136, 0xD137,
+ 0x2202, 0x8136, 0xD138,
+ 0x2203, 0x8136, 0xD139,
+ 0x2204, 0x8136, 0xD230,
+ 0x2205, 0x8136, 0xD231,
+ 0x2206, 0x8136, 0xD232,
+ 0x2207, 0x8136, 0xD233,
+ 0x2209, 0x8136, 0xD234,
+ 0x220A, 0x8136, 0xD235,
+ 0x220B, 0x8136, 0xD236,
+ 0x220C, 0x8136, 0xD237,
+ 0x220D, 0x8136, 0xD238,
+ 0x220E, 0x8136, 0xD239,
+ 0x2210, 0x8136, 0xD330,
+ 0x2212, 0x8136, 0xD331,
+ 0x2213, 0x8136, 0xD332,
+ 0x2214, 0x8136, 0xD333,
+ 0x2216, 0x8136, 0xD334,
+ 0x2217, 0x8136, 0xD335,
+ 0x2218, 0x8136, 0xD336,
+ 0x2219, 0x8136, 0xD337,
+ 0x221B, 0x8136, 0xD338,
+ 0x221C, 0x8136, 0xD339,
+ 0x2221, 0x8136, 0xD430,
+ 0x2222, 0x8136, 0xD431,
+ 0x2224, 0x8136, 0xD432,
+ 0x2226, 0x8136, 0xD433,
+ 0x222C, 0x8136, 0xD434,
+ 0x222D, 0x8136, 0xD435,
+ 0x222F, 0x8136, 0xD436,
+ 0x2230, 0x8136, 0xD437,
+ 0x2231, 0x8136, 0xD438,
+ 0x2232, 0x8136, 0xD439,
+ 0x2233, 0x8136, 0xD530,
+ 0x2238, 0x8136, 0xD531,
+ 0x2239, 0x8136, 0xD532,
+ 0x223A, 0x8136, 0xD533,
+ 0x223B, 0x8136, 0xD534,
+ 0x223C, 0x8136, 0xD535,
+ 0x223E, 0x8136, 0xD536,
+ 0x223F, 0x8136, 0xD537,
+ 0x2240, 0x8136, 0xD538,
+ 0x2241, 0x8136, 0xD539,
+ 0x2242, 0x8136, 0xD630,
+ 0x2243, 0x8136, 0xD631,
+ 0x2244, 0x8136, 0xD632,
+ 0x2245, 0x8136, 0xD633,
+ 0x2246, 0x8136, 0xD634,
+ 0x2247, 0x8136, 0xD635,
+ 0x2249, 0x8136, 0xD636,
+ 0x224A, 0x8136, 0xD637,
+ 0x224B, 0x8136, 0xD638,
+ 0x224D, 0x8136, 0xD639,
+ 0x224E, 0x8136, 0xD730,
+ 0x224F, 0x8136, 0xD731,
+ 0x2250, 0x8136, 0xD732,
+ 0x2251, 0x8136, 0xD733,
+ 0x2253, 0x8136, 0xD734,
+ 0x2254, 0x8136, 0xD735,
+ 0x2255, 0x8136, 0xD736,
+ 0x2256, 0x8136, 0xD737,
+ 0x2257, 0x8136, 0xD738,
+ 0x2258, 0x8136, 0xD739,
+ 0x2259, 0x8136, 0xD830,
+ 0x225A, 0x8136, 0xD831,
+ 0x225B, 0x8136, 0xD832,
+ 0x225C, 0x8136, 0xD833,
+ 0x225D, 0x8136, 0xD834,
+ 0x225E, 0x8136, 0xD835,
+ 0x225F, 0x8136, 0xD836,
+ 0x2262, 0x8136, 0xD837,
+ 0x2263, 0x8136, 0xD838,
+ 0x2268, 0x8136, 0xD839,
+ 0x2269, 0x8136, 0xD930,
+ 0x226A, 0x8136, 0xD931,
+ 0x226B, 0x8136, 0xD932,
+ 0x226C, 0x8136, 0xD933,
+ 0x226D, 0x8136, 0xD934,
+ 0x2270, 0x8136, 0xD935,
+ 0x2271, 0x8136, 0xD936,
+ 0x2272, 0x8136, 0xD937,
+ 0x2273, 0x8136, 0xD938,
+ 0x2274, 0x8136, 0xD939,
+ 0x2275, 0x8136, 0xDA30,
+ 0x2276, 0x8136, 0xDA31,
+ 0x2277, 0x8136, 0xDA32,
+ 0x2278, 0x8136, 0xDA33,
+ 0x2279, 0x8136, 0xDA34,
+ 0x227A, 0x8136, 0xDA35,
+ 0x227B, 0x8136, 0xDA36,
+ 0x227C, 0x8136, 0xDA37,
+ 0x227D, 0x8136, 0xDA38,
+ 0x227E, 0x8136, 0xDA39,
+ 0x227F, 0x8136, 0xDB30,
+ 0x2280, 0x8136, 0xDB31,
+ 0x2281, 0x8136, 0xDB32,
+ 0x2282, 0x8136, 0xDB33,
+ 0x2283, 0x8136, 0xDB34,
+ 0x2284, 0x8136, 0xDB35,
+ 0x2285, 0x8136, 0xDB36,
+ 0x2286, 0x8136, 0xDB37,
+ 0x2287, 0x8136, 0xDB38,
+ 0x2288, 0x8136, 0xDB39,
+ 0x2289, 0x8136, 0xDC30,
+ 0x228A, 0x8136, 0xDC31,
+ 0x228B, 0x8136, 0xDC32,
+ 0x228C, 0x8136, 0xDC33,
+ 0x228D, 0x8136, 0xDC34,
+ 0x228E, 0x8136, 0xDC35,
+ 0x228F, 0x8136, 0xDC36,
+ 0x2290, 0x8136, 0xDC37,
+ 0x2291, 0x8136, 0xDC38,
+ 0x2292, 0x8136, 0xDC39,
+ 0x2293, 0x8136, 0xDD30,
+ 0x2294, 0x8136, 0xDD31,
+ 0x2296, 0x8136, 0xDD32,
+ 0x2297, 0x8136, 0xDD33,
+ 0x2298, 0x8136, 0xDD34,
+ 0x229A, 0x8136, 0xDD35,
+ 0x229B, 0x8136, 0xDD36,
+ 0x229C, 0x8136, 0xDD37,
+ 0x229D, 0x8136, 0xDD38,
+ 0x229E, 0x8136, 0xDD39,
+ 0x229F, 0x8136, 0xDE30,
+ 0x22A0, 0x8136, 0xDE31,
+ 0x22A1, 0x8136, 0xDE32,
+ 0x22A2, 0x8136, 0xDE33,
+ 0x22A3, 0x8136, 0xDE34,
+ 0x22A4, 0x8136, 0xDE35,
+ 0x22A6, 0x8136, 0xDE36,
+ 0x22A7, 0x8136, 0xDE37,
+ 0x22A8, 0x8136, 0xDE38,
+ 0x22A9, 0x8136, 0xDE39,
+ 0x22AA, 0x8136, 0xDF30,
+ 0x22AB, 0x8136, 0xDF31,
+ 0x22AC, 0x8136, 0xDF32,
+ 0x22AD, 0x8136, 0xDF33,
+ 0x22AE, 0x8136, 0xDF34,
+ 0x22AF, 0x8136, 0xDF35,
+ 0x22B0, 0x8136, 0xDF36,
+ 0x22B1, 0x8136, 0xDF37,
+ 0x22B2, 0x8136, 0xDF38,
+ 0x22B3, 0x8136, 0xDF39,
+ 0x22B4, 0x8136, 0xE030,
+ 0x22B5, 0x8136, 0xE031,
+ 0x22B6, 0x8136, 0xE032,
+ 0x22B7, 0x8136, 0xE033,
+ 0x22B8, 0x8136, 0xE034,
+ 0x22B9, 0x8136, 0xE035,
+ 0x22BA, 0x8136, 0xE036,
+ 0x22BB, 0x8136, 0xE037,
+ 0x22BC, 0x8136, 0xE038,
+ 0x22BD, 0x8136, 0xE039,
+ 0x22BE, 0x8136, 0xE130,
+ 0x22C0, 0x8136, 0xE131,
+ 0x22C1, 0x8136, 0xE132,
+ 0x22C2, 0x8136, 0xE133,
+ 0x22C3, 0x8136, 0xE134,
+ 0x22C4, 0x8136, 0xE135,
+ 0x22C5, 0x8136, 0xE136,
+ 0x22C6, 0x8136, 0xE137,
+ 0x22C7, 0x8136, 0xE138,
+ 0x22C8, 0x8136, 0xE139,
+ 0x22C9, 0x8136, 0xE230,
+ 0x22CA, 0x8136, 0xE231,
+ 0x22CB, 0x8136, 0xE232,
+ 0x22CC, 0x8136, 0xE233,
+ 0x22CD, 0x8136, 0xE234,
+ 0x22CE, 0x8136, 0xE235,
+ 0x22CF, 0x8136, 0xE236,
+ 0x22D0, 0x8136, 0xE237,
+ 0x22D1, 0x8136, 0xE238,
+ 0x22D2, 0x8136, 0xE239,
+ 0x22D3, 0x8136, 0xE330,
+ 0x22D4, 0x8136, 0xE331,
+ 0x22D5, 0x8136, 0xE332,
+ 0x22D6, 0x8136, 0xE333,
+ 0x22D7, 0x8136, 0xE334,
+ 0x22D8, 0x8136, 0xE335,
+ 0x22D9, 0x8136, 0xE336,
+ 0x22DA, 0x8136, 0xE337,
+ 0x22DB, 0x8136, 0xE338,
+ 0x22DC, 0x8136, 0xE339,
+ 0x22DD, 0x8136, 0xE430,
+ 0x22DE, 0x8136, 0xE431,
+ 0x22DF, 0x8136, 0xE432,
+ 0x22E0, 0x8136, 0xE433,
+ 0x22E1, 0x8136, 0xE434,
+ 0x22E2, 0x8136, 0xE435,
+ 0x22E3, 0x8136, 0xE436,
+ 0x22E4, 0x8136, 0xE437,
+ 0x22E5, 0x8136, 0xE438,
+ 0x22E6, 0x8136, 0xE439,
+ 0x22E7, 0x8136, 0xE530,
+ 0x22E8, 0x8136, 0xE531,
+ 0x22E9, 0x8136, 0xE532,
+ 0x22EA, 0x8136, 0xE533,
+ 0x22EB, 0x8136, 0xE534,
+ 0x22EC, 0x8136, 0xE535,
+ 0x22ED, 0x8136, 0xE536,
+ 0x22EE, 0x8136, 0xE537,
+ 0x22EF, 0x8136, 0xE538,
+ 0x22F0, 0x8136, 0xE539,
+ 0x22F1, 0x8136, 0xE630,
+ 0x22F2, 0x8136, 0xE631,
+ 0x22F3, 0x8136, 0xE632,
+ 0x22F4, 0x8136, 0xE633,
+ 0x22F5, 0x8136, 0xE634,
+ 0x22F6, 0x8136, 0xE635,
+ 0x22F7, 0x8136, 0xE636,
+ 0x22F8, 0x8136, 0xE637,
+ 0x22F9, 0x8136, 0xE638,
+ 0x22FA, 0x8136, 0xE639,
+ 0x22FB, 0x8136, 0xE730,
+ 0x22FC, 0x8136, 0xE731,
+ 0x22FD, 0x8136, 0xE732,
+ 0x22FE, 0x8136, 0xE733,
+ 0x22FF, 0x8136, 0xE734,
+ 0x2300, 0x8136, 0xE735,
+ 0x2301, 0x8136, 0xE736,
+ 0x2302, 0x8136, 0xE737,
+ 0x2303, 0x8136, 0xE738,
+ 0x2304, 0x8136, 0xE739,
+ 0x2305, 0x8136, 0xE830,
+ 0x2306, 0x8136, 0xE831,
+ 0x2307, 0x8136, 0xE832,
+ 0x2308, 0x8136, 0xE833,
+ 0x2309, 0x8136, 0xE834,
+ 0x230A, 0x8136, 0xE835,
+ 0x230B, 0x8136, 0xE836,
+ 0x230C, 0x8136, 0xE837,
+ 0x230D, 0x8136, 0xE838,
+ 0x230E, 0x8136, 0xE839,
+ 0x230F, 0x8136, 0xE930,
+ 0x2310, 0x8136, 0xE931,
+ 0x2311, 0x8136, 0xE932,
+ 0x2313, 0x8136, 0xE933,
+ 0x2314, 0x8136, 0xE934,
+ 0x2315, 0x8136, 0xE935,
+ 0x2316, 0x8136, 0xE936,
+ 0x2317, 0x8136, 0xE937,
+ 0x2318, 0x8136, 0xE938,
+ 0x2319, 0x8136, 0xE939,
+ 0x231A, 0x8136, 0xEA30,
+ 0x231B, 0x8136, 0xEA31,
+ 0x231C, 0x8136, 0xEA32,
+ 0x231D, 0x8136, 0xEA33,
+ 0x231E, 0x8136, 0xEA34,
+ 0x231F, 0x8136, 0xEA35,
+ 0x2320, 0x8136, 0xEA36,
+ 0x2321, 0x8136, 0xEA37,
+ 0x2322, 0x8136, 0xEA38,
+ 0x2323, 0x8136, 0xEA39,
+ 0x2324, 0x8136, 0xEB30,
+ 0x2325, 0x8136, 0xEB31,
+ 0x2326, 0x8136, 0xEB32,
+ 0x2327, 0x8136, 0xEB33,
+ 0x2328, 0x8136, 0xEB34,
+ 0x2329, 0x8136, 0xEB35,
+ 0x232A, 0x8136, 0xEB36,
+ 0x232B, 0x8136, 0xEB37,
+ 0x232C, 0x8136, 0xEB38,
+ 0x232D, 0x8136, 0xEB39,
+ 0x232E, 0x8136, 0xEC30,
+ 0x232F, 0x8136, 0xEC31,
+ 0x2330, 0x8136, 0xEC32,
+ 0x2331, 0x8136, 0xEC33,
+ 0x2332, 0x8136, 0xEC34,
+ 0x2333, 0x8136, 0xEC35,
+ 0x2334, 0x8136, 0xEC36,
+ 0x2335, 0x8136, 0xEC37,
+ 0x2336, 0x8136, 0xEC38,
+ 0x2337, 0x8136, 0xEC39,
+ 0x2338, 0x8136, 0xED30,
+ 0x2339, 0x8136, 0xED31,
+ 0x233A, 0x8136, 0xED32,
+ 0x233B, 0x8136, 0xED33,
+ 0x233C, 0x8136, 0xED34,
+ 0x233D, 0x8136, 0xED35,
+ 0x233E, 0x8136, 0xED36,
+ 0x233F, 0x8136, 0xED37,
+ 0x2340, 0x8136, 0xED38,
+ 0x2341, 0x8136, 0xED39,
+ 0x2342, 0x8136, 0xEE30,
+ 0x2343, 0x8136, 0xEE31,
+ 0x2344, 0x8136, 0xEE32,
+ 0x2345, 0x8136, 0xEE33,
+ 0x2346, 0x8136, 0xEE34,
+ 0x2347, 0x8136, 0xEE35,
+ 0x2348, 0x8136, 0xEE36,
+ 0x2349, 0x8136, 0xEE37,
+ 0x234A, 0x8136, 0xEE38,
+ 0x234B, 0x8136, 0xEE39,
+ 0x234C, 0x8136, 0xEF30,
+ 0x234D, 0x8136, 0xEF31,
+ 0x234E, 0x8136, 0xEF32,
+ 0x234F, 0x8136, 0xEF33,
+ 0x2350, 0x8136, 0xEF34,
+ 0x2351, 0x8136, 0xEF35,
+ 0x2352, 0x8136, 0xEF36,
+ 0x2353, 0x8136, 0xEF37,
+ 0x2354, 0x8136, 0xEF38,
+ 0x2355, 0x8136, 0xEF39,
+ 0x2356, 0x8136, 0xF030,
+ 0x2357, 0x8136, 0xF031,
+ 0x2358, 0x8136, 0xF032,
+ 0x2359, 0x8136, 0xF033,
+ 0x235A, 0x8136, 0xF034,
+ 0x235B, 0x8136, 0xF035,
+ 0x235C, 0x8136, 0xF036,
+ 0x235D, 0x8136, 0xF037,
+ 0x235E, 0x8136, 0xF038,
+ 0x235F, 0x8136, 0xF039,
+ 0x2360, 0x8136, 0xF130,
+ 0x2361, 0x8136, 0xF131,
+ 0x2362, 0x8136, 0xF132,
+ 0x2363, 0x8136, 0xF133,
+ 0x2364, 0x8136, 0xF134,
+ 0x2365, 0x8136, 0xF135,
+ 0x2366, 0x8136, 0xF136,
+ 0x2367, 0x8136, 0xF137,
+ 0x2368, 0x8136, 0xF138,
+ 0x2369, 0x8136, 0xF139,
+ 0x236A, 0x8136, 0xF230,
+ 0x236B, 0x8136, 0xF231,
+ 0x236C, 0x8136, 0xF232,
+ 0x236D, 0x8136, 0xF233,
+ 0x236E, 0x8136, 0xF234,
+ 0x236F, 0x8136, 0xF235,
+ 0x2370, 0x8136, 0xF236,
+ 0x2371, 0x8136, 0xF237,
+ 0x2372, 0x8136, 0xF238,
+ 0x2373, 0x8136, 0xF239,
+ 0x2374, 0x8136, 0xF330,
+ 0x2375, 0x8136, 0xF331,
+ 0x2376, 0x8136, 0xF332,
+ 0x2377, 0x8136, 0xF333,
+ 0x2378, 0x8136, 0xF334,
+ 0x2379, 0x8136, 0xF335,
+ 0x237A, 0x8136, 0xF336,
+ 0x237B, 0x8136, 0xF337,
+ 0x237C, 0x8136, 0xF338,
+ 0x237D, 0x8136, 0xF339,
+ 0x237E, 0x8136, 0xF430,
+ 0x237F, 0x8136, 0xF431,
+ 0x2380, 0x8136, 0xF432,
+ 0x2381, 0x8136, 0xF433,
+ 0x2382, 0x8136, 0xF434,
+ 0x2383, 0x8136, 0xF435,
+ 0x2384, 0x8136, 0xF436,
+ 0x2385, 0x8136, 0xF437,
+ 0x2386, 0x8136, 0xF438,
+ 0x2387, 0x8136, 0xF439,
+ 0x2388, 0x8136, 0xF530,
+ 0x2389, 0x8136, 0xF531,
+ 0x238A, 0x8136, 0xF532,
+ 0x238B, 0x8136, 0xF533,
+ 0x238C, 0x8136, 0xF534,
+ 0x238D, 0x8136, 0xF535,
+ 0x238E, 0x8136, 0xF536,
+ 0x238F, 0x8136, 0xF537,
+ 0x2390, 0x8136, 0xF538,
+ 0x2391, 0x8136, 0xF539,
+ 0x2392, 0x8136, 0xF630,
+ 0x2393, 0x8136, 0xF631,
+ 0x2394, 0x8136, 0xF632,
+ 0x2395, 0x8136, 0xF633,
+ 0x2396, 0x8136, 0xF634,
+ 0x2397, 0x8136, 0xF635,
+ 0x2398, 0x8136, 0xF636,
+ 0x2399, 0x8136, 0xF637,
+ 0x239A, 0x8136, 0xF638,
+ 0x239B, 0x8136, 0xF639,
+ 0x239C, 0x8136, 0xF730,
+ 0x239D, 0x8136, 0xF731,
+ 0x239E, 0x8136, 0xF732,
+ 0x239F, 0x8136, 0xF733,
+ 0x23A0, 0x8136, 0xF734,
+ 0x23A1, 0x8136, 0xF735,
+ 0x23A2, 0x8136, 0xF736,
+ 0x23A3, 0x8136, 0xF737,
+ 0x23A4, 0x8136, 0xF738,
+ 0x23A5, 0x8136, 0xF739,
+ 0x23A6, 0x8136, 0xF830,
+ 0x23A7, 0x8136, 0xF831,
+ 0x23A8, 0x8136, 0xF832,
+ 0x23A9, 0x8136, 0xF833,
+ 0x23AA, 0x8136, 0xF834,
+ 0x23AB, 0x8136, 0xF835,
+ 0x23AC, 0x8136, 0xF836,
+ 0x23AD, 0x8136, 0xF837,
+ 0x23AE, 0x8136, 0xF838,
+ 0x23AF, 0x8136, 0xF839,
+ 0x23B0, 0x8136, 0xF930,
+ 0x23B1, 0x8136, 0xF931,
+ 0x23B2, 0x8136, 0xF932,
+ 0x23B3, 0x8136, 0xF933,
+ 0x23B4, 0x8136, 0xF934,
+ 0x23B5, 0x8136, 0xF935,
+ 0x23B6, 0x8136, 0xF936,
+ 0x23B7, 0x8136, 0xF937,
+ 0x23B8, 0x8136, 0xF938,
+ 0x23B9, 0x8136, 0xF939,
+ 0x23BA, 0x8136, 0xFA30,
+ 0x23BB, 0x8136, 0xFA31,
+ 0x23BC, 0x8136, 0xFA32,
+ 0x23BD, 0x8136, 0xFA33,
+ 0x23BE, 0x8136, 0xFA34,
+ 0x23BF, 0x8136, 0xFA35,
+ 0x23C0, 0x8136, 0xFA36,
+ 0x23C1, 0x8136, 0xFA37,
+ 0x23C2, 0x8136, 0xFA38,
+ 0x23C3, 0x8136, 0xFA39,
+ 0x23C4, 0x8136, 0xFB30,
+ 0x23C5, 0x8136, 0xFB31,
+ 0x23C6, 0x8136, 0xFB32,
+ 0x23C7, 0x8136, 0xFB33,
+ 0x23C8, 0x8136, 0xFB34,
+ 0x23C9, 0x8136, 0xFB35,
+ 0x23CA, 0x8136, 0xFB36,
+ 0x23CB, 0x8136, 0xFB37,
+ 0x23CC, 0x8136, 0xFB38,
+ 0x23CD, 0x8136, 0xFB39,
+ 0x23CE, 0x8136, 0xFC30,
+ 0x23CF, 0x8136, 0xFC31,
+ 0x23D0, 0x8136, 0xFC32,
+ 0x23D1, 0x8136, 0xFC33,
+ 0x23D2, 0x8136, 0xFC34,
+ 0x23D3, 0x8136, 0xFC35,
+ 0x23D4, 0x8136, 0xFC36,
+ 0x23D5, 0x8136, 0xFC37,
+ 0x23D6, 0x8136, 0xFC38,
+ 0x23D7, 0x8136, 0xFC39,
+ 0x23D8, 0x8136, 0xFD30,
+ 0x23D9, 0x8136, 0xFD31,
+ 0x23DA, 0x8136, 0xFD32,
+ 0x23DB, 0x8136, 0xFD33,
+ 0x23DC, 0x8136, 0xFD34,
+ 0x23DD, 0x8136, 0xFD35,
+ 0x23DE, 0x8136, 0xFD36,
+ 0x23DF, 0x8136, 0xFD37,
+ 0x23E0, 0x8136, 0xFD38,
+ 0x23E1, 0x8136, 0xFD39,
+ 0x23E2, 0x8136, 0xFE30,
+ 0x23E3, 0x8136, 0xFE31,
+ 0x23E4, 0x8136, 0xFE32,
+ 0x23E5, 0x8136, 0xFE33,
+ 0x23E6, 0x8136, 0xFE34,
+ 0x23E7, 0x8136, 0xFE35,
+ 0x23E8, 0x8136, 0xFE36,
+ 0x23E9, 0x8136, 0xFE37,
+ 0x23EA, 0x8136, 0xFE38,
+ 0x23EB, 0x8136, 0xFE39,
+ 0x23EC, 0x8137, 0x8130,
+ 0x23ED, 0x8137, 0x8131,
+ 0x23EE, 0x8137, 0x8132,
+ 0x23EF, 0x8137, 0x8133,
+ 0x23F0, 0x8137, 0x8134,
+ 0x23F1, 0x8137, 0x8135,
+ 0x23F2, 0x8137, 0x8136,
+ 0x23F3, 0x8137, 0x8137,
+ 0x23F4, 0x8137, 0x8138,
+ 0x23F5, 0x8137, 0x8139,
+ 0x23F6, 0x8137, 0x8230,
+ 0x23F7, 0x8137, 0x8231,
+ 0x23F8, 0x8137, 0x8232,
+ 0x23F9, 0x8137, 0x8233,
+ 0x23FA, 0x8137, 0x8234,
+ 0x23FB, 0x8137, 0x8235,
+ 0x23FC, 0x8137, 0x8236,
+ 0x23FD, 0x8137, 0x8237,
+ 0x23FE, 0x8137, 0x8238,
+ 0x23FF, 0x8137, 0x8239,
+ 0x2400, 0x8137, 0x8330,
+ 0x2401, 0x8137, 0x8331,
+ 0x2402, 0x8137, 0x8332,
+ 0x2403, 0x8137, 0x8333,
+ 0x2404, 0x8137, 0x8334,
+ 0x2405, 0x8137, 0x8335,
+ 0x2406, 0x8137, 0x8336,
+ 0x2407, 0x8137, 0x8337,
+ 0x2408, 0x8137, 0x8338,
+ 0x2409, 0x8137, 0x8339,
+ 0x240A, 0x8137, 0x8430,
+ 0x240B, 0x8137, 0x8431,
+ 0x240C, 0x8137, 0x8432,
+ 0x240D, 0x8137, 0x8433,
+ 0x240E, 0x8137, 0x8434,
+ 0x240F, 0x8137, 0x8435,
+ 0x2410, 0x8137, 0x8436,
+ 0x2411, 0x8137, 0x8437,
+ 0x2412, 0x8137, 0x8438,
+ 0x2413, 0x8137, 0x8439,
+ 0x2414, 0x8137, 0x8530,
+ 0x2415, 0x8137, 0x8531,
+ 0x2416, 0x8137, 0x8532,
+ 0x2417, 0x8137, 0x8533,
+ 0x2418, 0x8137, 0x8534,
+ 0x2419, 0x8137, 0x8535,
+ 0x241A, 0x8137, 0x8536,
+ 0x241B, 0x8137, 0x8537,
+ 0x241C, 0x8137, 0x8538,
+ 0x241D, 0x8137, 0x8539,
+ 0x241E, 0x8137, 0x8630,
+ 0x241F, 0x8137, 0x8631,
+ 0x2420, 0x8137, 0x8632,
+ 0x2421, 0x8137, 0x8633,
+ 0x2422, 0x8137, 0x8634,
+ 0x2423, 0x8137, 0x8635,
+ 0x2424, 0x8137, 0x8636,
+ 0x2425, 0x8137, 0x8637,
+ 0x2426, 0x8137, 0x8638,
+ 0x2427, 0x8137, 0x8639,
+ 0x2428, 0x8137, 0x8730,
+ 0x2429, 0x8137, 0x8731,
+ 0x242A, 0x8137, 0x8732,
+ 0x242B, 0x8137, 0x8733,
+ 0x242C, 0x8137, 0x8734,
+ 0x242D, 0x8137, 0x8735,
+ 0x242E, 0x8137, 0x8736,
+ 0x242F, 0x8137, 0x8737,
+ 0x2430, 0x8137, 0x8738,
+ 0x2431, 0x8137, 0x8739,
+ 0x2432, 0x8137, 0x8830,
+ 0x2433, 0x8137, 0x8831,
+ 0x2434, 0x8137, 0x8832,
+ 0x2435, 0x8137, 0x8833,
+ 0x2436, 0x8137, 0x8834,
+ 0x2437, 0x8137, 0x8835,
+ 0x2438, 0x8137, 0x8836,
+ 0x2439, 0x8137, 0x8837,
+ 0x243A, 0x8137, 0x8838,
+ 0x243B, 0x8137, 0x8839,
+ 0x243C, 0x8137, 0x8930,
+ 0x243D, 0x8137, 0x8931,
+ 0x243E, 0x8137, 0x8932,
+ 0x243F, 0x8137, 0x8933,
+ 0x2440, 0x8137, 0x8934,
+ 0x2441, 0x8137, 0x8935,
+ 0x2442, 0x8137, 0x8936,
+ 0x2443, 0x8137, 0x8937,
+ 0x2444, 0x8137, 0x8938,
+ 0x2445, 0x8137, 0x8939,
+ 0x2446, 0x8137, 0x8A30,
+ 0x2447, 0x8137, 0x8A31,
+ 0x2448, 0x8137, 0x8A32,
+ 0x2449, 0x8137, 0x8A33,
+ 0x244A, 0x8137, 0x8A34,
+ 0x244B, 0x8137, 0x8A35,
+ 0x244C, 0x8137, 0x8A36,
+ 0x244D, 0x8137, 0x8A37,
+ 0x244E, 0x8137, 0x8A38,
+ 0x244F, 0x8137, 0x8A39,
+ 0x2450, 0x8137, 0x8B30,
+ 0x2451, 0x8137, 0x8B31,
+ 0x2452, 0x8137, 0x8B32,
+ 0x2453, 0x8137, 0x8B33,
+ 0x2454, 0x8137, 0x8B34,
+ 0x2455, 0x8137, 0x8B35,
+ 0x2456, 0x8137, 0x8B36,
+ 0x2457, 0x8137, 0x8B37,
+ 0x2458, 0x8137, 0x8B38,
+ 0x2459, 0x8137, 0x8B39,
+ 0x245A, 0x8137, 0x8C30,
+ 0x245B, 0x8137, 0x8C31,
+ 0x245C, 0x8137, 0x8C32,
+ 0x245D, 0x8137, 0x8C33,
+ 0x245E, 0x8137, 0x8C34,
+ 0x245F, 0x8137, 0x8C35,
+ 0x246A, 0x8137, 0x8C36,
+ 0x246B, 0x8137, 0x8C37,
+ 0x246C, 0x8137, 0x8C38,
+ 0x246D, 0x8137, 0x8C39,
+ 0x246E, 0x8137, 0x8D30,
+ 0x246F, 0x8137, 0x8D31,
+ 0x2470, 0x8137, 0x8D32,
+ 0x2471, 0x8137, 0x8D33,
+ 0x2472, 0x8137, 0x8D34,
+ 0x2473, 0x8137, 0x8D35,
+ 0x249C, 0x8137, 0x8D36,
+ 0x249D, 0x8137, 0x8D37,
+ 0x249E, 0x8137, 0x8D38,
+ 0x249F, 0x8137, 0x8D39,
+ 0x24A0, 0x8137, 0x8E30,
+ 0x24A1, 0x8137, 0x8E31,
+ 0x24A2, 0x8137, 0x8E32,
+ 0x24A3, 0x8137, 0x8E33,
+ 0x24A4, 0x8137, 0x8E34,
+ 0x24A5, 0x8137, 0x8E35,
+ 0x24A6, 0x8137, 0x8E36,
+ 0x24A7, 0x8137, 0x8E37,
+ 0x24A8, 0x8137, 0x8E38,
+ 0x24A9, 0x8137, 0x8E39,
+ 0x24AA, 0x8137, 0x8F30,
+ 0x24AB, 0x8137, 0x8F31,
+ 0x24AC, 0x8137, 0x8F32,
+ 0x24AD, 0x8137, 0x8F33,
+ 0x24AE, 0x8137, 0x8F34,
+ 0x24AF, 0x8137, 0x8F35,
+ 0x24B0, 0x8137, 0x8F36,
+ 0x24B1, 0x8137, 0x8F37,
+ 0x24B2, 0x8137, 0x8F38,
+ 0x24B3, 0x8137, 0x8F39,
+ 0x24B4, 0x8137, 0x9030,
+ 0x24B5, 0x8137, 0x9031,
+ 0x24B6, 0x8137, 0x9032,
+ 0x24B7, 0x8137, 0x9033,
+ 0x24B8, 0x8137, 0x9034,
+ 0x24B9, 0x8137, 0x9035,
+ 0x24BA, 0x8137, 0x9036,
+ 0x24BB, 0x8137, 0x9037,
+ 0x24BC, 0x8137, 0x9038,
+ 0x24BD, 0x8137, 0x9039,
+ 0x24BE, 0x8137, 0x9130,
+ 0x24BF, 0x8137, 0x9131,
+ 0x24C0, 0x8137, 0x9132,
+ 0x24C1, 0x8137, 0x9133,
+ 0x24C2, 0x8137, 0x9134,
+ 0x24C3, 0x8137, 0x9135,
+ 0x24C4, 0x8137, 0x9136,
+ 0x24C5, 0x8137, 0x9137,
+ 0x24C6, 0x8137, 0x9138,
+ 0x24C7, 0x8137, 0x9139,
+ 0x24C8, 0x8137, 0x9230,
+ 0x24C9, 0x8137, 0x9231,
+ 0x24CA, 0x8137, 0x9232,
+ 0x24CB, 0x8137, 0x9233,
+ 0x24CC, 0x8137, 0x9234,
+ 0x24CD, 0x8137, 0x9235,
+ 0x24CE, 0x8137, 0x9236,
+ 0x24CF, 0x8137, 0x9237,
+ 0x24D0, 0x8137, 0x9238,
+ 0x24D1, 0x8137, 0x9239,
+ 0x24D2, 0x8137, 0x9330,
+ 0x24D3, 0x8137, 0x9331,
+ 0x24D4, 0x8137, 0x9332,
+ 0x24D5, 0x8137, 0x9333,
+ 0x24D6, 0x8137, 0x9334,
+ 0x24D7, 0x8137, 0x9335,
+ 0x24D8, 0x8137, 0x9336,
+ 0x24D9, 0x8137, 0x9337,
+ 0x24DA, 0x8137, 0x9338,
+ 0x24DB, 0x8137, 0x9339,
+ 0x24DC, 0x8137, 0x9430,
+ 0x24DD, 0x8137, 0x9431,
+ 0x24DE, 0x8137, 0x9432,
+ 0x24DF, 0x8137, 0x9433,
+ 0x24E0, 0x8137, 0x9434,
+ 0x24E1, 0x8137, 0x9435,
+ 0x24E2, 0x8137, 0x9436,
+ 0x24E3, 0x8137, 0x9437,
+ 0x24E4, 0x8137, 0x9438,
+ 0x24E5, 0x8137, 0x9439,
+ 0x24E6, 0x8137, 0x9530,
+ 0x24E7, 0x8137, 0x9531,
+ 0x24E8, 0x8137, 0x9532,
+ 0x24E9, 0x8137, 0x9533,
+ 0x24EA, 0x8137, 0x9534,
+ 0x24EB, 0x8137, 0x9535,
+ 0x24EC, 0x8137, 0x9536,
+ 0x24ED, 0x8137, 0x9537,
+ 0x24EE, 0x8137, 0x9538,
+ 0x24EF, 0x8137, 0x9539,
+ 0x24F0, 0x8137, 0x9630,
+ 0x24F1, 0x8137, 0x9631,
+ 0x24F2, 0x8137, 0x9632,
+ 0x24F3, 0x8137, 0x9633,
+ 0x24F4, 0x8137, 0x9634,
+ 0x24F5, 0x8137, 0x9635,
+ 0x24F6, 0x8137, 0x9636,
+ 0x24F7, 0x8137, 0x9637,
+ 0x24F8, 0x8137, 0x9638,
+ 0x24F9, 0x8137, 0x9639,
+ 0x24FA, 0x8137, 0x9730,
+ 0x24FB, 0x8137, 0x9731,
+ 0x24FC, 0x8137, 0x9732,
+ 0x24FD, 0x8137, 0x9733,
+ 0x24FE, 0x8137, 0x9734,
+ 0x24FF, 0x8137, 0x9735,
+ 0x254C, 0x8137, 0x9736,
+ 0x254D, 0x8137, 0x9737,
+ 0x254E, 0x8137, 0x9738,
+ 0x254F, 0x8137, 0x9739,
+ 0x2574, 0x8137, 0x9830,
+ 0x2575, 0x8137, 0x9831,
+ 0x2576, 0x8137, 0x9832,
+ 0x2577, 0x8137, 0x9833,
+ 0x2578, 0x8137, 0x9834,
+ 0x2579, 0x8137, 0x9835,
+ 0x257A, 0x8137, 0x9836,
+ 0x257B, 0x8137, 0x9837,
+ 0x257C, 0x8137, 0x9838,
+ 0x257D, 0x8137, 0x9839,
+ 0x257E, 0x8137, 0x9930,
+ 0x257F, 0x8137, 0x9931,
+ 0x2580, 0x8137, 0x9932,
+ 0x2590, 0x8137, 0x9933,
+ 0x2591, 0x8137, 0x9934,
+ 0x2592, 0x8137, 0x9935,
+ 0x2596, 0x8137, 0x9936,
+ 0x2597, 0x8137, 0x9937,
+ 0x2598, 0x8137, 0x9938,
+ 0x2599, 0x8137, 0x9939,
+ 0x259A, 0x8137, 0x9A30,
+ 0x259B, 0x8137, 0x9A31,
+ 0x259C, 0x8137, 0x9A32,
+ 0x259D, 0x8137, 0x9A33,
+ 0x259E, 0x8137, 0x9A34,
+ 0x259F, 0x8137, 0x9A35,
+ 0x25A2, 0x8137, 0x9A36,
+ 0x25A3, 0x8137, 0x9A37,
+ 0x25A4, 0x8137, 0x9A38,
+ 0x25A5, 0x8137, 0x9A39,
+ 0x25A6, 0x8137, 0x9B30,
+ 0x25A7, 0x8137, 0x9B31,
+ 0x25A8, 0x8137, 0x9B32,
+ 0x25A9, 0x8137, 0x9B33,
+ 0x25AA, 0x8137, 0x9B34,
+ 0x25AB, 0x8137, 0x9B35,
+ 0x25AC, 0x8137, 0x9B36,
+ 0x25AD, 0x8137, 0x9B37,
+ 0x25AE, 0x8137, 0x9B38,
+ 0x25AF, 0x8137, 0x9B39,
+ 0x25B0, 0x8137, 0x9C30,
+ 0x25B1, 0x8137, 0x9C31,
+ 0x25B4, 0x8137, 0x9C32,
+ 0x25B5, 0x8137, 0x9C33,
+ 0x25B6, 0x8137, 0x9C34,
+ 0x25B7, 0x8137, 0x9C35,
+ 0x25B8, 0x8137, 0x9C36,
+ 0x25B9, 0x8137, 0x9C37,
+ 0x25BA, 0x8137, 0x9C38,
+ 0x25BB, 0x8137, 0x9C39,
+ 0x25BE, 0x8137, 0x9D30,
+ 0x25BF, 0x8137, 0x9D31,
+ 0x25C0, 0x8137, 0x9D32,
+ 0x25C1, 0x8137, 0x9D33,
+ 0x25C2, 0x8137, 0x9D34,
+ 0x25C3, 0x8137, 0x9D35,
+ 0x25C4, 0x8137, 0x9D36,
+ 0x25C5, 0x8137, 0x9D37,
+ 0x25C8, 0x8137, 0x9D38,
+ 0x25C9, 0x8137, 0x9D39,
+ 0x25CA, 0x8137, 0x9E30,
+ 0x25CC, 0x8137, 0x9E31,
+ 0x25CD, 0x8137, 0x9E32,
+ 0x25D0, 0x8137, 0x9E33,
+ 0x25D1, 0x8137, 0x9E34,
+ 0x25D2, 0x8137, 0x9E35,
+ 0x25D3, 0x8137, 0x9E36,
+ 0x25D4, 0x8137, 0x9E37,
+ 0x25D5, 0x8137, 0x9E38,
+ 0x25D6, 0x8137, 0x9E39,
+ 0x25D7, 0x8137, 0x9F30,
+ 0x25D8, 0x8137, 0x9F31,
+ 0x25D9, 0x8137, 0x9F32,
+ 0x25DA, 0x8137, 0x9F33,
+ 0x25DB, 0x8137, 0x9F34,
+ 0x25DC, 0x8137, 0x9F35,
+ 0x25DD, 0x8137, 0x9F36,
+ 0x25DE, 0x8137, 0x9F37,
+ 0x25DF, 0x8137, 0x9F38,
+ 0x25E0, 0x8137, 0x9F39,
+ 0x25E1, 0x8137, 0xA030,
+ 0x25E6, 0x8137, 0xA031,
+ 0x25E7, 0x8137, 0xA032,
+ 0x25E8, 0x8137, 0xA033,
+ 0x25E9, 0x8137, 0xA034,
+ 0x25EA, 0x8137, 0xA035,
+ 0x25EB, 0x8137, 0xA036,
+ 0x25EC, 0x8137, 0xA037,
+ 0x25ED, 0x8137, 0xA038,
+ 0x25EE, 0x8137, 0xA039,
+ 0x25EF, 0x8137, 0xA130,
+ 0x25F0, 0x8137, 0xA131,
+ 0x25F1, 0x8137, 0xA132,
+ 0x25F2, 0x8137, 0xA133,
+ 0x25F3, 0x8137, 0xA134,
+ 0x25F4, 0x8137, 0xA135,
+ 0x25F5, 0x8137, 0xA136,
+ 0x25F6, 0x8137, 0xA137,
+ 0x25F7, 0x8137, 0xA138,
+ 0x25F8, 0x8137, 0xA139,
+ 0x25F9, 0x8137, 0xA230,
+ 0x25FA, 0x8137, 0xA231,
+ 0x25FB, 0x8137, 0xA232,
+ 0x25FC, 0x8137, 0xA233,
+ 0x25FD, 0x8137, 0xA234,
+ 0x25FE, 0x8137, 0xA235,
+ 0x25FF, 0x8137, 0xA236,
+ 0x2600, 0x8137, 0xA237,
+ 0x2601, 0x8137, 0xA238,
+ 0x2602, 0x8137, 0xA239,
+ 0x2603, 0x8137, 0xA330,
+ 0x2604, 0x8137, 0xA331,
+ 0x2607, 0x8137, 0xA332,
+ 0x2608, 0x8137, 0xA333,
+ 0x260A, 0x8137, 0xA334,
+ 0x260B, 0x8137, 0xA335,
+ 0x260C, 0x8137, 0xA336,
+ 0x260D, 0x8137, 0xA337,
+ 0x260E, 0x8137, 0xA338,
+ 0x260F, 0x8137, 0xA339,
+ 0x2610, 0x8137, 0xA430,
+ 0x2611, 0x8137, 0xA431,
+ 0x2612, 0x8137, 0xA432,
+ 0x2613, 0x8137, 0xA433,
+ 0x2614, 0x8137, 0xA434,
+ 0x2615, 0x8137, 0xA435,
+ 0x2616, 0x8137, 0xA436,
+ 0x2617, 0x8137, 0xA437,
+ 0x2618, 0x8137, 0xA438,
+ 0x2619, 0x8137, 0xA439,
+ 0x261A, 0x8137, 0xA530,
+ 0x261B, 0x8137, 0xA531,
+ 0x261C, 0x8137, 0xA532,
+ 0x261D, 0x8137, 0xA533,
+ 0x261E, 0x8137, 0xA534,
+ 0x261F, 0x8137, 0xA535,
+ 0x2620, 0x8137, 0xA536,
+ 0x2621, 0x8137, 0xA537,
+ 0x2622, 0x8137, 0xA538,
+ 0x2623, 0x8137, 0xA539,
+ 0x2624, 0x8137, 0xA630,
+ 0x2625, 0x8137, 0xA631,
+ 0x2626, 0x8137, 0xA632,
+ 0x2627, 0x8137, 0xA633,
+ 0x2628, 0x8137, 0xA634,
+ 0x2629, 0x8137, 0xA635,
+ 0x262A, 0x8137, 0xA636,
+ 0x262B, 0x8137, 0xA637,
+ 0x262C, 0x8137, 0xA638,
+ 0x262D, 0x8137, 0xA639,
+ 0x262E, 0x8137, 0xA730,
+ 0x262F, 0x8137, 0xA731,
+ 0x2630, 0x8137, 0xA732,
+ 0x2631, 0x8137, 0xA733,
+ 0x2632, 0x8137, 0xA734,
+ 0x2633, 0x8137, 0xA735,
+ 0x2634, 0x8137, 0xA736,
+ 0x2635, 0x8137, 0xA737,
+ 0x2636, 0x8137, 0xA738,
+ 0x2637, 0x8137, 0xA739,
+ 0x2638, 0x8137, 0xA830,
+ 0x2639, 0x8137, 0xA831,
+ 0x263A, 0x8137, 0xA832,
+ 0x263B, 0x8137, 0xA833,
+ 0x263C, 0x8137, 0xA834,
+ 0x263D, 0x8137, 0xA835,
+ 0x263E, 0x8137, 0xA836,
+ 0x263F, 0x8137, 0xA837,
+ 0x2641, 0x8137, 0xA838,
+ 0x2E82, 0x8138, 0xFD39,
+ 0x2E83, 0x8138, 0xFE30,
+ 0x2E85, 0x8138, 0xFE31,
+ 0x2E86, 0x8138, 0xFE32,
+ 0x2E87, 0x8138, 0xFE33,
+ 0x2E89, 0x8138, 0xFE34,
+ 0x2E8A, 0x8138, 0xFE35,
+ 0x2E8D, 0x8138, 0xFE36,
+ 0x2E8E, 0x8138, 0xFE37,
+ 0x2E8F, 0x8138, 0xFE38,
+ 0x2E90, 0x8138, 0xFE39,
+ 0x2E91, 0x8139, 0x8130,
+ 0x2E92, 0x8139, 0x8131,
+ 0x2E93, 0x8139, 0x8132,
+ 0x2E94, 0x8139, 0x8133,
+ 0x2E95, 0x8139, 0x8134,
+ 0x2E96, 0x8139, 0x8135,
+ 0x2E98, 0x8139, 0x8136,
+ 0x2E99, 0x8139, 0x8137,
+ 0x2E9A, 0x8139, 0x8138,
+ 0x2E9B, 0x8139, 0x8139,
+ 0x2E9C, 0x8139, 0x8230,
+ 0x2E9D, 0x8139, 0x8231,
+ 0x2E9E, 0x8139, 0x8232,
+ 0x2E9F, 0x8139, 0x8233,
+ 0x2EA0, 0x8139, 0x8234,
+ 0x2EA1, 0x8139, 0x8235,
+ 0x2EA2, 0x8139, 0x8236,
+ 0x2EA3, 0x8139, 0x8237,
+ 0x2EA4, 0x8139, 0x8238,
+ 0x2EA5, 0x8139, 0x8239,
+ 0x2EA6, 0x8139, 0x8330,
+ 0x2EA8, 0x8139, 0x8331,
+ 0x2EA9, 0x8139, 0x8332,
+ 0x2EAB, 0x8139, 0x8333,
+ 0x2EAC, 0x8139, 0x8334,
+ 0x2EAD, 0x8139, 0x8335,
+ 0x2EAF, 0x8139, 0x8336,
+ 0x2EB0, 0x8139, 0x8337,
+ 0x2EB1, 0x8139, 0x8338,
+ 0x2EB2, 0x8139, 0x8339,
+ 0x2EB4, 0x8139, 0x8430,
+ 0x2EB5, 0x8139, 0x8431,
+ 0x2EB8, 0x8139, 0x8432,
+ 0x2EB9, 0x8139, 0x8433,
+ 0x2EBA, 0x8139, 0x8434,
+ 0x2EBC, 0x8139, 0x8435,
+ 0x2EBD, 0x8139, 0x8436,
+ 0x2EBE, 0x8139, 0x8437,
+ 0x2EBF, 0x8139, 0x8438,
+ 0x2EC0, 0x8139, 0x8439,
+ 0x2EC1, 0x8139, 0x8530,
+ 0x2EC2, 0x8139, 0x8531,
+ 0x2EC3, 0x8139, 0x8532,
+ 0x2EC4, 0x8139, 0x8533,
+ 0x2EC5, 0x8139, 0x8534,
+ 0x2EC6, 0x8139, 0x8535,
+ 0x2EC7, 0x8139, 0x8536,
+ 0x2EC8, 0x8139, 0x8537,
+ 0x2EC9, 0x8139, 0x8538,
+ 0x2ECB, 0x8139, 0x8539,
+ 0x2ECC, 0x8139, 0x8630,
+ 0x2ECD, 0x8139, 0x8631,
+ 0x2ECE, 0x8139, 0x8632,
+ 0x2ECF, 0x8139, 0x8633,
+ 0x2ED0, 0x8139, 0x8634,
+ 0x2ED1, 0x8139, 0x8635,
+ 0x2ED2, 0x8139, 0x8636,
+ 0x2ED3, 0x8139, 0x8637,
+ 0x2ED4, 0x8139, 0x8638,
+ 0x2ED5, 0x8139, 0x8639,
+ 0x2ED6, 0x8139, 0x8730,
+ 0x2ED7, 0x8139, 0x8731,
+ 0x2ED8, 0x8139, 0x8732,
+ 0x2ED9, 0x8139, 0x8733,
+ 0x2EDA, 0x8139, 0x8734,
+ 0x2EDB, 0x8139, 0x8735,
+ 0x2EDC, 0x8139, 0x8736,
+ 0x2EDD, 0x8139, 0x8737,
+ 0x2EDE, 0x8139, 0x8738,
+ 0x2EDF, 0x8139, 0x8739,
+ 0x2EE0, 0x8139, 0x8830,
+ 0x2EE1, 0x8139, 0x8831,
+ 0x2EE2, 0x8139, 0x8832,
+ 0x2EE3, 0x8139, 0x8833,
+ 0x2EE4, 0x8139, 0x8834,
+ 0x2EE5, 0x8139, 0x8835,
+ 0x2EE6, 0x8139, 0x8836,
+ 0x2EE7, 0x8139, 0x8837,
+ 0x2EE8, 0x8139, 0x8838,
+ 0x2EE9, 0x8139, 0x8839,
+ 0x2EEA, 0x8139, 0x8930,
+ 0x2EEB, 0x8139, 0x8931,
+ 0x2EEC, 0x8139, 0x8932,
+ 0x2EED, 0x8139, 0x8933,
+ 0x2EEE, 0x8139, 0x8934,
+ 0x2EEF, 0x8139, 0x8935,
+ 0x2EF0, 0x8139, 0x8936,
+ 0x2EF1, 0x8139, 0x8937,
+ 0x2EF2, 0x8139, 0x8938,
+ 0x2EF3, 0x8139, 0x8939,
+ 0x2EF4, 0x8139, 0x8A30,
+ 0x2EF5, 0x8139, 0x8A31,
+ 0x2EF6, 0x8139, 0x8A32,
+ 0x2EF7, 0x8139, 0x8A33,
+ 0x2EF8, 0x8139, 0x8A34,
+ 0x2EF9, 0x8139, 0x8A35,
+ 0x2EFA, 0x8139, 0x8A36,
+ 0x2EFB, 0x8139, 0x8A37,
+ 0x2EFC, 0x8139, 0x8A38,
+ 0x2EFD, 0x8139, 0x8A39,
+ 0x2EFE, 0x8139, 0x8B30,
+ 0x2EFF, 0x8139, 0x8B31,
+ 0x2F00, 0x8139, 0x8B32,
+ 0x2F01, 0x8139, 0x8B33,
+ 0x2F02, 0x8139, 0x8B34,
+ 0x2F03, 0x8139, 0x8B35,
+ 0x2F04, 0x8139, 0x8B36,
+ 0x2F05, 0x8139, 0x8B37,
+ 0x2F06, 0x8139, 0x8B38,
+ 0x2F07, 0x8139, 0x8B39,
+ 0x2F08, 0x8139, 0x8C30,
+ 0x2F09, 0x8139, 0x8C31,
+ 0x2F0A, 0x8139, 0x8C32,
+ 0x2F0B, 0x8139, 0x8C33,
+ 0x2F0C, 0x8139, 0x8C34,
+ 0x2F0D, 0x8139, 0x8C35,
+ 0x2F0E, 0x8139, 0x8C36,
+ 0x2F0F, 0x8139, 0x8C37,
+ 0x2F10, 0x8139, 0x8C38,
+ 0x2F11, 0x8139, 0x8C39,
+ 0x2F12, 0x8139, 0x8D30,
+ 0x2F13, 0x8139, 0x8D31,
+ 0x2F14, 0x8139, 0x8D32,
+ 0x2F15, 0x8139, 0x8D33,
+ 0x2F16, 0x8139, 0x8D34,
+ 0x2F17, 0x8139, 0x8D35,
+ 0x2F18, 0x8139, 0x8D36,
+ 0x2F19, 0x8139, 0x8D37,
+ 0x2F1A, 0x8139, 0x8D38,
+ 0x2F1B, 0x8139, 0x8D39,
+ 0x2F1C, 0x8139, 0x8E30,
+ 0x2F1D, 0x8139, 0x8E31,
+ 0x2F1E, 0x8139, 0x8E32,
+ 0x2F1F, 0x8139, 0x8E33,
+ 0x2F20, 0x8139, 0x8E34,
+ 0x2F21, 0x8139, 0x8E35,
+ 0x2F22, 0x8139, 0x8E36,
+ 0x2F23, 0x8139, 0x8E37,
+ 0x2F24, 0x8139, 0x8E38,
+ 0x2F25, 0x8139, 0x8E39,
+ 0x2F26, 0x8139, 0x8F30,
+ 0x2F27, 0x8139, 0x8F31,
+ 0x2F28, 0x8139, 0x8F32,
+ 0x2F29, 0x8139, 0x8F33,
+ 0x2F2A, 0x8139, 0x8F34,
+ 0x2F2B, 0x8139, 0x8F35,
+ 0x2F2C, 0x8139, 0x8F36,
+ 0x2F2D, 0x8139, 0x8F37,
+ 0x2F2E, 0x8139, 0x8F38,
+ 0x2F2F, 0x8139, 0x8F39,
+ 0x2F30, 0x8139, 0x9030,
+ 0x2F31, 0x8139, 0x9031,
+ 0x2F32, 0x8139, 0x9032,
+ 0x2F33, 0x8139, 0x9033,
+ 0x2F34, 0x8139, 0x9034,
+ 0x2F35, 0x8139, 0x9035,
+ 0x2F36, 0x8139, 0x9036,
+ 0x2F37, 0x8139, 0x9037,
+ 0x2F38, 0x8139, 0x9038,
+ 0x2F39, 0x8139, 0x9039,
+ 0x2F3A, 0x8139, 0x9130,
+ 0x2F3B, 0x8139, 0x9131,
+ 0x2F3C, 0x8139, 0x9132,
+ 0x2F3D, 0x8139, 0x9133,
+ 0x2F3E, 0x8139, 0x9134,
+ 0x2F3F, 0x8139, 0x9135,
+ 0x2F40, 0x8139, 0x9136,
+ 0x2F41, 0x8139, 0x9137,
+ 0x2F42, 0x8139, 0x9138,
+ 0x2F43, 0x8139, 0x9139,
+ 0x2F44, 0x8139, 0x9230,
+ 0x2F45, 0x8139, 0x9231,
+ 0x2F46, 0x8139, 0x9232,
+ 0x2F47, 0x8139, 0x9233,
+ 0x2F48, 0x8139, 0x9234,
+ 0x2F49, 0x8139, 0x9235,
+ 0x2F4A, 0x8139, 0x9236,
+ 0x2F4B, 0x8139, 0x9237,
+ 0x2F4C, 0x8139, 0x9238,
+ 0x2F4D, 0x8139, 0x9239,
+ 0x2F4E, 0x8139, 0x9330,
+ 0x2F4F, 0x8139, 0x9331,
+ 0x2F50, 0x8139, 0x9332,
+ 0x2F51, 0x8139, 0x9333,
+ 0x2F52, 0x8139, 0x9334,
+ 0x2F53, 0x8139, 0x9335,
+ 0x2F54, 0x8139, 0x9336,
+ 0x2F55, 0x8139, 0x9337,
+ 0x2F56, 0x8139, 0x9338,
+ 0x2F57, 0x8139, 0x9339,
+ 0x2F58, 0x8139, 0x9430,
+ 0x2F59, 0x8139, 0x9431,
+ 0x2F5A, 0x8139, 0x9432,
+ 0x2F5B, 0x8139, 0x9433,
+ 0x2F5C, 0x8139, 0x9434,
+ 0x2F5D, 0x8139, 0x9435,
+ 0x2F5E, 0x8139, 0x9436,
+ 0x2F5F, 0x8139, 0x9437,
+ 0x2F60, 0x8139, 0x9438,
+ 0x2F61, 0x8139, 0x9439,
+ 0x2F62, 0x8139, 0x9530,
+ 0x2F63, 0x8139, 0x9531,
+ 0x2F64, 0x8139, 0x9532,
+ 0x2F65, 0x8139, 0x9533,
+ 0x2F66, 0x8139, 0x9534,
+ 0x2F67, 0x8139, 0x9535,
+ 0x2F68, 0x8139, 0x9536,
+ 0x2F69, 0x8139, 0x9537,
+ 0x2F6A, 0x8139, 0x9538,
+ 0x2F6B, 0x8139, 0x9539,
+ 0x2F6C, 0x8139, 0x9630,
+ 0x2F6D, 0x8139, 0x9631,
+ 0x2F6E, 0x8139, 0x9632,
+ 0x2F6F, 0x8139, 0x9633,
+ 0x2F70, 0x8139, 0x9634,
+ 0x2F71, 0x8139, 0x9635,
+ 0x2F72, 0x8139, 0x9636,
+ 0x2F73, 0x8139, 0x9637,
+ 0x2F74, 0x8139, 0x9638,
+ 0x2F75, 0x8139, 0x9639,
+ 0x2F76, 0x8139, 0x9730,
+ 0x2F77, 0x8139, 0x9731,
+ 0x2F78, 0x8139, 0x9732,
+ 0x2F79, 0x8139, 0x9733,
+ 0x2F7A, 0x8139, 0x9734,
+ 0x2F7B, 0x8139, 0x9735,
+ 0x2F7C, 0x8139, 0x9736,
+ 0x2F7D, 0x8139, 0x9737,
+ 0x2F7E, 0x8139, 0x9738,
+ 0x2F7F, 0x8139, 0x9739,
+ 0x2F80, 0x8139, 0x9830,
+ 0x2F81, 0x8139, 0x9831,
+ 0x2F82, 0x8139, 0x9832,
+ 0x2F83, 0x8139, 0x9833,
+ 0x2F84, 0x8139, 0x9834,
+ 0x2F85, 0x8139, 0x9835,
+ 0x2F86, 0x8139, 0x9836,
+ 0x2F87, 0x8139, 0x9837,
+ 0x2F88, 0x8139, 0x9838,
+ 0x2F89, 0x8139, 0x9839,
+ 0x2F8A, 0x8139, 0x9930,
+ 0x2F8B, 0x8139, 0x9931,
+ 0x2F8C, 0x8139, 0x9932,
+ 0x2F8D, 0x8139, 0x9933,
+ 0x2F8E, 0x8139, 0x9934,
+ 0x2F8F, 0x8139, 0x9935,
+ 0x2F90, 0x8139, 0x9936,
+ 0x2F91, 0x8139, 0x9937,
+ 0x2F92, 0x8139, 0x9938,
+ 0x2F93, 0x8139, 0x9939,
+ 0x2F94, 0x8139, 0x9A30,
+ 0x2F95, 0x8139, 0x9A31,
+ 0x2F96, 0x8139, 0x9A32,
+ 0x2F97, 0x8139, 0x9A33,
+ 0x2F98, 0x8139, 0x9A34,
+ 0x2F99, 0x8139, 0x9A35,
+ 0x2F9A, 0x8139, 0x9A36,
+ 0x2F9B, 0x8139, 0x9A37,
+ 0x2F9C, 0x8139, 0x9A38,
+ 0x2F9D, 0x8139, 0x9A39,
+ 0x2F9E, 0x8139, 0x9B30,
+ 0x2F9F, 0x8139, 0x9B31,
+ 0x2FA0, 0x8139, 0x9B32,
+ 0x2FA1, 0x8139, 0x9B33,
+ 0x2FA2, 0x8139, 0x9B34,
+ 0x2FA3, 0x8139, 0x9B35,
+ 0x2FA4, 0x8139, 0x9B36,
+ 0x2FA5, 0x8139, 0x9B37,
+ 0x2FA6, 0x8139, 0x9B38,
+ 0x2FA7, 0x8139, 0x9B39,
+ 0x2FA8, 0x8139, 0x9C30,
+ 0x2FA9, 0x8139, 0x9C31,
+ 0x2FAA, 0x8139, 0x9C32,
+ 0x2FAB, 0x8139, 0x9C33,
+ 0x2FAC, 0x8139, 0x9C34,
+ 0x2FAD, 0x8139, 0x9C35,
+ 0x2FAE, 0x8139, 0x9C36,
+ 0x2FAF, 0x8139, 0x9C37,
+ 0x2FB0, 0x8139, 0x9C38,
+ 0x2FB1, 0x8139, 0x9C39,
+ 0x2FB2, 0x8139, 0x9D30,
+ 0x2FB3, 0x8139, 0x9D31,
+ 0x2FB4, 0x8139, 0x9D32,
+ 0x2FB5, 0x8139, 0x9D33,
+ 0x2FB6, 0x8139, 0x9D34,
+ 0x2FB7, 0x8139, 0x9D35,
+ 0x2FB8, 0x8139, 0x9D36,
+ 0x2FB9, 0x8139, 0x9D37,
+ 0x2FBA, 0x8139, 0x9D38,
+ 0x2FBB, 0x8139, 0x9D39,
+ 0x2FBC, 0x8139, 0x9E30,
+ 0x2FBD, 0x8139, 0x9E31,
+ 0x2FBE, 0x8139, 0x9E32,
+ 0x2FBF, 0x8139, 0x9E33,
+ 0x2FC0, 0x8139, 0x9E34,
+ 0x2FC1, 0x8139, 0x9E35,
+ 0x2FC2, 0x8139, 0x9E36,
+ 0x2FC3, 0x8139, 0x9E37,
+ 0x2FC4, 0x8139, 0x9E38,
+ 0x2FC5, 0x8139, 0x9E39,
+ 0x2FC6, 0x8139, 0x9F30,
+ 0x2FC7, 0x8139, 0x9F31,
+ 0x2FC8, 0x8139, 0x9F32,
+ 0x2FC9, 0x8139, 0x9F33,
+ 0x2FCA, 0x8139, 0x9F34,
+ 0x2FCB, 0x8139, 0x9F35,
+ 0x2FCC, 0x8139, 0x9F36,
+ 0x2FCD, 0x8139, 0x9F37,
+ 0x2FCE, 0x8139, 0x9F38,
+ 0x2FCF, 0x8139, 0x9F39,
+ 0x2FD0, 0x8139, 0xA030,
+ 0x2FD1, 0x8139, 0xA031,
+ 0x2FD2, 0x8139, 0xA032,
+ 0x2FD3, 0x8139, 0xA033,
+ 0x2FD4, 0x8139, 0xA034,
+ 0x2FD5, 0x8139, 0xA035,
+ 0x2FD6, 0x8139, 0xA036,
+ 0x2FD7, 0x8139, 0xA037,
+ 0x2FD8, 0x8139, 0xA038,
+ 0x2FD9, 0x8139, 0xA039,
+ 0x2FDA, 0x8139, 0xA130,
+ 0x2FDB, 0x8139, 0xA131,
+ 0x2FDC, 0x8139, 0xA132,
+ 0x2FDD, 0x8139, 0xA133,
+ 0x2FDE, 0x8139, 0xA134,
+ 0x2FDF, 0x8139, 0xA135,
+ 0x2FE0, 0x8139, 0xA136,
+ 0x2FE1, 0x8139, 0xA137,
+ 0x2FE2, 0x8139, 0xA138,
+ 0x2FE3, 0x8139, 0xA139,
+ 0x2FE4, 0x8139, 0xA230,
+ 0x2FE5, 0x8139, 0xA231,
+ 0x2FE6, 0x8139, 0xA232,
+ 0x2FE7, 0x8139, 0xA233,
+ 0x2FE8, 0x8139, 0xA234,
+ 0x2FE9, 0x8139, 0xA235,
+ 0x2FEA, 0x8139, 0xA236,
+ 0x2FEB, 0x8139, 0xA237,
+ 0x2FEC, 0x8139, 0xA238,
+ 0x2FED, 0x8139, 0xA239,
+ 0x2FEE, 0x8139, 0xA330,
+ 0x2FEF, 0x8139, 0xA331,
+ 0x2FFC, 0x8139, 0xA332,
+ 0x2FFD, 0x8139, 0xA333,
+ 0x2FFE, 0x8139, 0xA334,
+ 0x2FFF, 0x8139, 0xA335,
+ 0x3004, 0x8139, 0xA336,
+ 0x3018, 0x8139, 0xA337,
+ 0x3019, 0x8139, 0xA338,
+ 0x301A, 0x8139, 0xA339,
+ 0x301B, 0x8139, 0xA430,
+ 0x301C, 0x8139, 0xA431,
+ 0x301F, 0x8139, 0xA432,
+ 0x3020, 0x8139, 0xA433,
+ 0x302A, 0x8139, 0xA434,
+ 0x302B, 0x8139, 0xA435,
+ 0x302C, 0x8139, 0xA436,
+ 0x302D, 0x8139, 0xA437,
+ 0x302E, 0x8139, 0xA438,
+ 0x302F, 0x8139, 0xA439,
+ 0x3030, 0x8139, 0xA530,
+ 0x3031, 0x8139, 0xA531,
+ 0x3032, 0x8139, 0xA532,
+ 0x3033, 0x8139, 0xA533,
+ 0x3034, 0x8139, 0xA534,
+ 0x3035, 0x8139, 0xA535,
+ 0x3036, 0x8139, 0xA536,
+ 0x3037, 0x8139, 0xA537,
+ 0x3038, 0x8139, 0xA538,
+ 0x3039, 0x8139, 0xA539,
+ 0x303A, 0x8139, 0xA630,
+ 0x303B, 0x8139, 0xA631,
+ 0x303C, 0x8139, 0xA632,
+ 0x303D, 0x8139, 0xA633,
+ 0x303F, 0x8139, 0xA634,
+ 0x3040, 0x8139, 0xA635,
+ 0x3094, 0x8139, 0xA636,
+ 0x3095, 0x8139, 0xA637,
+ 0x3096, 0x8139, 0xA638,
+ 0x3097, 0x8139, 0xA639,
+ 0x3098, 0x8139, 0xA730,
+ 0x3099, 0x8139, 0xA731,
+ 0x309A, 0x8139, 0xA732,
+ 0x309F, 0x8139, 0xA733,
+ 0x30A0, 0x8139, 0xA734,
+ 0x30F7, 0x8139, 0xA735,
+ 0x30F8, 0x8139, 0xA736,
+ 0x30F9, 0x8139, 0xA737,
+ 0x30FA, 0x8139, 0xA738,
+ 0x30FB, 0x8139, 0xA739,
+ 0x30FF, 0x8139, 0xA830,
+ 0x3100, 0x8139, 0xA831,
+ 0x3101, 0x8139, 0xA832,
+ 0x3102, 0x8139, 0xA833,
+ 0x3103, 0x8139, 0xA834,
+ 0x3104, 0x8139, 0xA835,
+ 0x312A, 0x8139, 0xA836,
+ 0x312B, 0x8139, 0xA837,
+ 0x312C, 0x8139, 0xA838,
+ 0x312D, 0x8139, 0xA839,
+ 0x312E, 0x8139, 0xA930,
+ 0x312F, 0x8139, 0xA931,
+ 0x3130, 0x8139, 0xA932,
+ 0x3131, 0x8139, 0xA933,
+ 0x3132, 0x8139, 0xA934,
+ 0x3133, 0x8139, 0xA935,
+ 0x3134, 0x8139, 0xA936,
+ 0x3135, 0x8139, 0xA937,
+ 0x3136, 0x8139, 0xA938,
+ 0x3137, 0x8139, 0xA939,
+ 0x3138, 0x8139, 0xAA30,
+ 0x3139, 0x8139, 0xAA31,
+ 0x313A, 0x8139, 0xAA32,
+ 0x313B, 0x8139, 0xAA33,
+ 0x313C, 0x8139, 0xAA34,
+ 0x313D, 0x8139, 0xAA35,
+ 0x313E, 0x8139, 0xAA36,
+ 0x313F, 0x8139, 0xAA37,
+ 0x3140, 0x8139, 0xAA38,
+ 0x3141, 0x8139, 0xAA39,
+ 0x3142, 0x8139, 0xAB30,
+ 0x3143, 0x8139, 0xAB31,
+ 0x3144, 0x8139, 0xAB32,
+ 0x3145, 0x8139, 0xAB33,
+ 0x3146, 0x8139, 0xAB34,
+ 0x3147, 0x8139, 0xAB35,
+ 0x3148, 0x8139, 0xAB36,
+ 0x3149, 0x8139, 0xAB37,
+ 0x314A, 0x8139, 0xAB38,
+ 0x314B, 0x8139, 0xAB39,
+ 0x314C, 0x8139, 0xAC30,
+ 0x314D, 0x8139, 0xAC31,
+ 0x314E, 0x8139, 0xAC32,
+ 0x314F, 0x8139, 0xAC33,
+ 0x3150, 0x8139, 0xAC34,
+ 0x3151, 0x8139, 0xAC35,
+ 0x3152, 0x8139, 0xAC36,
+ 0x3153, 0x8139, 0xAC37,
+ 0x3154, 0x8139, 0xAC38,
+ 0x3155, 0x8139, 0xAC39,
+ 0x3156, 0x8139, 0xAD30,
+ 0x3157, 0x8139, 0xAD31,
+ 0x3158, 0x8139, 0xAD32,
+ 0x3159, 0x8139, 0xAD33,
+ 0x315A, 0x8139, 0xAD34,
+ 0x315B, 0x8139, 0xAD35,
+ 0x315C, 0x8139, 0xAD36,
+ 0x315D, 0x8139, 0xAD37,
+ 0x315E, 0x8139, 0xAD38,
+ 0x315F, 0x8139, 0xAD39,
+ 0x3160, 0x8139, 0xAE30,
+ 0x3161, 0x8139, 0xAE31,
+ 0x3162, 0x8139, 0xAE32,
+ 0x3163, 0x8139, 0xAE33,
+ 0x3164, 0x8139, 0xAE34,
+ 0x3165, 0x8139, 0xAE35,
+ 0x3166, 0x8139, 0xAE36,
+ 0x3167, 0x8139, 0xAE37,
+ 0x3168, 0x8139, 0xAE38,
+ 0x3169, 0x8139, 0xAE39,
+ 0x316A, 0x8139, 0xAF30,
+ 0x316B, 0x8139, 0xAF31,
+ 0x316C, 0x8139, 0xAF32,
+ 0x316D, 0x8139, 0xAF33,
+ 0x316E, 0x8139, 0xAF34,
+ 0x316F, 0x8139, 0xAF35,
+ 0x3170, 0x8139, 0xAF36,
+ 0x3171, 0x8139, 0xAF37,
+ 0x3172, 0x8139, 0xAF38,
+ 0x3173, 0x8139, 0xAF39,
+ 0x3174, 0x8139, 0xB030,
+ 0x3175, 0x8139, 0xB031,
+ 0x3176, 0x8139, 0xB032,
+ 0x3177, 0x8139, 0xB033,
+ 0x3178, 0x8139, 0xB034,
+ 0x3179, 0x8139, 0xB035,
+ 0x317A, 0x8139, 0xB036,
+ 0x317B, 0x8139, 0xB037,
+ 0x317C, 0x8139, 0xB038,
+ 0x317D, 0x8139, 0xB039,
+ 0x317E, 0x8139, 0xB130,
+ 0x317F, 0x8139, 0xB131,
+ 0x3180, 0x8139, 0xB132,
+ 0x3181, 0x8139, 0xB133,
+ 0x3182, 0x8139, 0xB134,
+ 0x3183, 0x8139, 0xB135,
+ 0x3184, 0x8139, 0xB136,
+ 0x3185, 0x8139, 0xB137,
+ 0x3186, 0x8139, 0xB138,
+ 0x3187, 0x8139, 0xB139,
+ 0x3188, 0x8139, 0xB230,
+ 0x3189, 0x8139, 0xB231,
+ 0x318A, 0x8139, 0xB232,
+ 0x318B, 0x8139, 0xB233,
+ 0x318C, 0x8139, 0xB234,
+ 0x318D, 0x8139, 0xB235,
+ 0x318E, 0x8139, 0xB236,
+ 0x318F, 0x8139, 0xB237,
+ 0x3190, 0x8139, 0xB238,
+ 0x3191, 0x8139, 0xB239,
+ 0x3192, 0x8139, 0xB330,
+ 0x3193, 0x8139, 0xB331,
+ 0x3194, 0x8139, 0xB332,
+ 0x3195, 0x8139, 0xB333,
+ 0x3196, 0x8139, 0xB334,
+ 0x3197, 0x8139, 0xB335,
+ 0x3198, 0x8139, 0xB336,
+ 0x3199, 0x8139, 0xB337,
+ 0x319A, 0x8139, 0xB338,
+ 0x319B, 0x8139, 0xB339,
+ 0x319C, 0x8139, 0xB430,
+ 0x319D, 0x8139, 0xB431,
+ 0x319E, 0x8139, 0xB432,
+ 0x319F, 0x8139, 0xB433,
+ 0x31A0, 0x8139, 0xB434,
+ 0x31A1, 0x8139, 0xB435,
+ 0x31A2, 0x8139, 0xB436,
+ 0x31A3, 0x8139, 0xB437,
+ 0x31A4, 0x8139, 0xB438,
+ 0x31A5, 0x8139, 0xB439,
+ 0x31A6, 0x8139, 0xB530,
+ 0x31A7, 0x8139, 0xB531,
+ 0x31A8, 0x8139, 0xB532,
+ 0x31A9, 0x8139, 0xB533,
+ 0x31AA, 0x8139, 0xB534,
+ 0x31AB, 0x8139, 0xB535,
+ 0x31AC, 0x8139, 0xB536,
+ 0x31AD, 0x8139, 0xB537,
+ 0x31AE, 0x8139, 0xB538,
+ 0x31AF, 0x8139, 0xB539,
+ 0x31B0, 0x8139, 0xB630,
+ 0x31B1, 0x8139, 0xB631,
+ 0x31B2, 0x8139, 0xB632,
+ 0x31B3, 0x8139, 0xB633,
+ 0x31B4, 0x8139, 0xB634,
+ 0x31B5, 0x8139, 0xB635,
+ 0x31B6, 0x8139, 0xB636,
+ 0x31B7, 0x8139, 0xB637,
+ 0x31B8, 0x8139, 0xB638,
+ 0x31B9, 0x8139, 0xB639,
+ 0x31BA, 0x8139, 0xB730,
+ 0x31BB, 0x8139, 0xB731,
+ 0x31BC, 0x8139, 0xB732,
+ 0x31BD, 0x8139, 0xB733,
+ 0x31BE, 0x8139, 0xB734,
+ 0x31BF, 0x8139, 0xB735,
+ 0x31C0, 0x8139, 0xB736,
+ 0x31C1, 0x8139, 0xB737,
+ 0x31C2, 0x8139, 0xB738,
+ 0x31C3, 0x8139, 0xB739,
+ 0x31C4, 0x8139, 0xB830,
+ 0x31C5, 0x8139, 0xB831,
+ 0x31C6, 0x8139, 0xB832,
+ 0x31C7, 0x8139, 0xB833,
+ 0x31C8, 0x8139, 0xB834,
+ 0x31C9, 0x8139, 0xB835,
+ 0x31CA, 0x8139, 0xB836,
+ 0x31CB, 0x8139, 0xB837,
+ 0x31CC, 0x8139, 0xB838,
+ 0x31CD, 0x8139, 0xB839,
+ 0x31CE, 0x8139, 0xB930,
+ 0x31CF, 0x8139, 0xB931,
+ 0x31D0, 0x8139, 0xB932,
+ 0x31D1, 0x8139, 0xB933,
+ 0x31D2, 0x8139, 0xB934,
+ 0x31D3, 0x8139, 0xB935,
+ 0x31D4, 0x8139, 0xB936,
+ 0x31D5, 0x8139, 0xB937,
+ 0x31D6, 0x8139, 0xB938,
+ 0x31D7, 0x8139, 0xB939,
+ 0x31D8, 0x8139, 0xBA30,
+ 0x31D9, 0x8139, 0xBA31,
+ 0x31DA, 0x8139, 0xBA32,
+ 0x31DB, 0x8139, 0xBA33,
+ 0x31DC, 0x8139, 0xBA34,
+ 0x31DD, 0x8139, 0xBA35,
+ 0x31DE, 0x8139, 0xBA36,
+ 0x31DF, 0x8139, 0xBA37,
+ 0x31E0, 0x8139, 0xBA38,
+ 0x31E1, 0x8139, 0xBA39,
+ 0x31E2, 0x8139, 0xBB30,
+ 0x31E3, 0x8139, 0xBB31,
+ 0x31E4, 0x8139, 0xBB32,
+ 0x31E5, 0x8139, 0xBB33,
+ 0x31E6, 0x8139, 0xBB34,
+ 0x31E7, 0x8139, 0xBB35,
+ 0x31E8, 0x8139, 0xBB36,
+ 0x31E9, 0x8139, 0xBB37,
+ 0x31EA, 0x8139, 0xBB38,
+ 0x31EB, 0x8139, 0xBB39,
+ 0x31EC, 0x8139, 0xBC30,
+ 0x31ED, 0x8139, 0xBC31,
+ 0x31EE, 0x8139, 0xBC32,
+ 0x31EF, 0x8139, 0xBC33,
+ 0x31F0, 0x8139, 0xBC34,
+ 0x31F1, 0x8139, 0xBC35,
+ 0x31F2, 0x8139, 0xBC36,
+ 0x31F3, 0x8139, 0xBC37,
+ 0x31F4, 0x8139, 0xBC38,
+ 0x31F5, 0x8139, 0xBC39,
+ 0x31F6, 0x8139, 0xBD30,
+ 0x31F7, 0x8139, 0xBD31,
+ 0x31F8, 0x8139, 0xBD32,
+ 0x31F9, 0x8139, 0xBD33,
+ 0x31FA, 0x8139, 0xBD34,
+ 0x31FB, 0x8139, 0xBD35,
+ 0x31FC, 0x8139, 0xBD36,
+ 0x31FD, 0x8139, 0xBD37,
+ 0x31FE, 0x8139, 0xBD38,
+ 0x31FF, 0x8139, 0xBD39,
+ 0x3200, 0x8139, 0xBE30,
+ 0x3201, 0x8139, 0xBE31,
+ 0x3202, 0x8139, 0xBE32,
+ 0x3203, 0x8139, 0xBE33,
+ 0x3204, 0x8139, 0xBE34,
+ 0x3205, 0x8139, 0xBE35,
+ 0x3206, 0x8139, 0xBE36,
+ 0x3207, 0x8139, 0xBE37,
+ 0x3208, 0x8139, 0xBE38,
+ 0x3209, 0x8139, 0xBE39,
+ 0x320A, 0x8139, 0xBF30,
+ 0x320B, 0x8139, 0xBF31,
+ 0x320C, 0x8139, 0xBF32,
+ 0x320D, 0x8139, 0xBF33,
+ 0x320E, 0x8139, 0xBF34,
+ 0x320F, 0x8139, 0xBF35,
+ 0x3210, 0x8139, 0xBF36,
+ 0x3211, 0x8139, 0xBF37,
+ 0x3212, 0x8139, 0xBF38,
+ 0x3213, 0x8139, 0xBF39,
+ 0x3214, 0x8139, 0xC030,
+ 0x3215, 0x8139, 0xC031,
+ 0x3216, 0x8139, 0xC032,
+ 0x3217, 0x8139, 0xC033,
+ 0x3218, 0x8139, 0xC034,
+ 0x3219, 0x8139, 0xC035,
+ 0x321A, 0x8139, 0xC036,
+ 0x321B, 0x8139, 0xC037,
+ 0x321C, 0x8139, 0xC038,
+ 0x321D, 0x8139, 0xC039,
+ 0x321E, 0x8139, 0xC130,
+ 0x321F, 0x8139, 0xC131,
+ 0x322A, 0x8139, 0xC132,
+ 0x322B, 0x8139, 0xC133,
+ 0x322C, 0x8139, 0xC134,
+ 0x322D, 0x8139, 0xC135,
+ 0x322E, 0x8139, 0xC136,
+ 0x322F, 0x8139, 0xC137,
+ 0x3230, 0x8139, 0xC138,
+ 0x3232, 0x8139, 0xC139,
+ 0x3233, 0x8139, 0xC230,
+ 0x3234, 0x8139, 0xC231,
+ 0x3235, 0x8139, 0xC232,
+ 0x3236, 0x8139, 0xC233,
+ 0x3237, 0x8139, 0xC234,
+ 0x3238, 0x8139, 0xC235,
+ 0x3239, 0x8139, 0xC236,
+ 0x323A, 0x8139, 0xC237,
+ 0x323B, 0x8139, 0xC238,
+ 0x323C, 0x8139, 0xC239,
+ 0x323D, 0x8139, 0xC330,
+ 0x323E, 0x8139, 0xC331,
+ 0x323F, 0x8139, 0xC332,
+ 0x3240, 0x8139, 0xC333,
+ 0x3241, 0x8139, 0xC334,
+ 0x3242, 0x8139, 0xC335,
+ 0x3243, 0x8139, 0xC336,
+ 0x3244, 0x8139, 0xC337,
+ 0x3245, 0x8139, 0xC338,
+ 0x3246, 0x8139, 0xC339,
+ 0x3247, 0x8139, 0xC430,
+ 0x3248, 0x8139, 0xC431,
+ 0x3249, 0x8139, 0xC432,
+ 0x324A, 0x8139, 0xC433,
+ 0x324B, 0x8139, 0xC434,
+ 0x324C, 0x8139, 0xC435,
+ 0x324D, 0x8139, 0xC436,
+ 0x324E, 0x8139, 0xC437,
+ 0x324F, 0x8139, 0xC438,
+ 0x3250, 0x8139, 0xC439,
+ 0x3251, 0x8139, 0xC530,
+ 0x3252, 0x8139, 0xC531,
+ 0x3253, 0x8139, 0xC532,
+ 0x3254, 0x8139, 0xC533,
+ 0x3255, 0x8139, 0xC534,
+ 0x3256, 0x8139, 0xC535,
+ 0x3257, 0x8139, 0xC536,
+ 0x3258, 0x8139, 0xC537,
+ 0x3259, 0x8139, 0xC538,
+ 0x325A, 0x8139, 0xC539,
+ 0x325B, 0x8139, 0xC630,
+ 0x325C, 0x8139, 0xC631,
+ 0x325D, 0x8139, 0xC632,
+ 0x325E, 0x8139, 0xC633,
+ 0x325F, 0x8139, 0xC634,
+ 0x3260, 0x8139, 0xC635,
+ 0x3261, 0x8139, 0xC636,
+ 0x3262, 0x8139, 0xC637,
+ 0x3263, 0x8139, 0xC638,
+ 0x3264, 0x8139, 0xC639,
+ 0x3265, 0x8139, 0xC730,
+ 0x3266, 0x8139, 0xC731,
+ 0x3267, 0x8139, 0xC732,
+ 0x3268, 0x8139, 0xC733,
+ 0x3269, 0x8139, 0xC734,
+ 0x326A, 0x8139, 0xC735,
+ 0x326B, 0x8139, 0xC736,
+ 0x326C, 0x8139, 0xC737,
+ 0x326D, 0x8139, 0xC738,
+ 0x326E, 0x8139, 0xC739,
+ 0x326F, 0x8139, 0xC830,
+ 0x3270, 0x8139, 0xC831,
+ 0x3271, 0x8139, 0xC832,
+ 0x3272, 0x8139, 0xC833,
+ 0x3273, 0x8139, 0xC834,
+ 0x3274, 0x8139, 0xC835,
+ 0x3275, 0x8139, 0xC836,
+ 0x3276, 0x8139, 0xC837,
+ 0x3277, 0x8139, 0xC838,
+ 0x3278, 0x8139, 0xC839,
+ 0x3279, 0x8139, 0xC930,
+ 0x327A, 0x8139, 0xC931,
+ 0x327B, 0x8139, 0xC932,
+ 0x327C, 0x8139, 0xC933,
+ 0x327D, 0x8139, 0xC934,
+ 0x327E, 0x8139, 0xC935,
+ 0x327F, 0x8139, 0xC936,
+ 0x3280, 0x8139, 0xC937,
+ 0x3281, 0x8139, 0xC938,
+ 0x3282, 0x8139, 0xC939,
+ 0x3283, 0x8139, 0xCA30,
+ 0x3284, 0x8139, 0xCA31,
+ 0x3285, 0x8139, 0xCA32,
+ 0x3286, 0x8139, 0xCA33,
+ 0x3287, 0x8139, 0xCA34,
+ 0x3288, 0x8139, 0xCA35,
+ 0x3289, 0x8139, 0xCA36,
+ 0x328A, 0x8139, 0xCA37,
+ 0x328B, 0x8139, 0xCA38,
+ 0x328C, 0x8139, 0xCA39,
+ 0x328D, 0x8139, 0xCB30,
+ 0x328E, 0x8139, 0xCB31,
+ 0x328F, 0x8139, 0xCB32,
+ 0x3290, 0x8139, 0xCB33,
+ 0x3291, 0x8139, 0xCB34,
+ 0x3292, 0x8139, 0xCB35,
+ 0x3293, 0x8139, 0xCB36,
+ 0x3294, 0x8139, 0xCB37,
+ 0x3295, 0x8139, 0xCB38,
+ 0x3296, 0x8139, 0xCB39,
+ 0x3297, 0x8139, 0xCC30,
+ 0x3298, 0x8139, 0xCC31,
+ 0x3299, 0x8139, 0xCC32,
+ 0x329A, 0x8139, 0xCC33,
+ 0x329B, 0x8139, 0xCC34,
+ 0x329C, 0x8139, 0xCC35,
+ 0x329D, 0x8139, 0xCC36,
+ 0x329E, 0x8139, 0xCC37,
+ 0x329F, 0x8139, 0xCC38,
+ 0x32A0, 0x8139, 0xCC39,
+ 0x32A1, 0x8139, 0xCD30,
+ 0x32A2, 0x8139, 0xCD31,
+ 0x32A4, 0x8139, 0xCD32,
+ 0x32A5, 0x8139, 0xCD33,
+ 0x32A6, 0x8139, 0xCD34,
+ 0x32A7, 0x8139, 0xCD35,
+ 0x32A8, 0x8139, 0xCD36,
+ 0x32A9, 0x8139, 0xCD37,
+ 0x32AA, 0x8139, 0xCD38,
+ 0x32AB, 0x8139, 0xCD39,
+ 0x32AC, 0x8139, 0xCE30,
+ 0x32AD, 0x8139, 0xCE31,
+ 0x32AE, 0x8139, 0xCE32,
+ 0x32AF, 0x8139, 0xCE33,
+ 0x32B0, 0x8139, 0xCE34,
+ 0x32B1, 0x8139, 0xCE35,
+ 0x32B2, 0x8139, 0xCE36,
+ 0x32B3, 0x8139, 0xCE37,
+ 0x32B4, 0x8139, 0xCE38,
+ 0x32B5, 0x8139, 0xCE39,
+ 0x32B6, 0x8139, 0xCF30,
+ 0x32B7, 0x8139, 0xCF31,
+ 0x32B8, 0x8139, 0xCF32,
+ 0x32B9, 0x8139, 0xCF33,
+ 0x32BA, 0x8139, 0xCF34,
+ 0x32BB, 0x8139, 0xCF35,
+ 0x32BC, 0x8139, 0xCF36,
+ 0x32BD, 0x8139, 0xCF37,
+ 0x32BE, 0x8139, 0xCF38,
+ 0x32BF, 0x8139, 0xCF39,
+ 0x32C0, 0x8139, 0xD030,
+ 0x32C1, 0x8139, 0xD031,
+ 0x32C2, 0x8139, 0xD032,
+ 0x32C3, 0x8139, 0xD033,
+ 0x32C4, 0x8139, 0xD034,
+ 0x32C5, 0x8139, 0xD035,
+ 0x32C6, 0x8139, 0xD036,
+ 0x32C7, 0x8139, 0xD037,
+ 0x32C8, 0x8139, 0xD038,
+ 0x32C9, 0x8139, 0xD039,
+ 0x32CA, 0x8139, 0xD130,
+ 0x32CB, 0x8139, 0xD131,
+ 0x32CC, 0x8139, 0xD132,
+ 0x32CD, 0x8139, 0xD133,
+ 0x32CE, 0x8139, 0xD134,
+ 0x32CF, 0x8139, 0xD135,
+ 0x32D0, 0x8139, 0xD136,
+ 0x32D1, 0x8139, 0xD137,
+ 0x32D2, 0x8139, 0xD138,
+ 0x32D3, 0x8139, 0xD139,
+ 0x32D4, 0x8139, 0xD230,
+ 0x32D5, 0x8139, 0xD231,
+ 0x32D6, 0x8139, 0xD232,
+ 0x32D7, 0x8139, 0xD233,
+ 0x32D8, 0x8139, 0xD234,
+ 0x32D9, 0x8139, 0xD235,
+ 0x32DA, 0x8139, 0xD236,
+ 0x32DB, 0x8139, 0xD237,
+ 0x32DC, 0x8139, 0xD238,
+ 0x32DD, 0x8139, 0xD239,
+ 0x32DE, 0x8139, 0xD330,
+ 0x32DF, 0x8139, 0xD331,
+ 0x32E0, 0x8139, 0xD332,
+ 0x32E1, 0x8139, 0xD333,
+ 0x32E2, 0x8139, 0xD334,
+ 0x32E3, 0x8139, 0xD335,
+ 0x32E4, 0x8139, 0xD336,
+ 0x32E5, 0x8139, 0xD337,
+ 0x32E6, 0x8139, 0xD338,
+ 0x32E7, 0x8139, 0xD339,
+ 0x32E8, 0x8139, 0xD430,
+ 0x32E9, 0x8139, 0xD431,
+ 0x32EA, 0x8139, 0xD432,
+ 0x32EB, 0x8139, 0xD433,
+ 0x32EC, 0x8139, 0xD434,
+ 0x32ED, 0x8139, 0xD435,
+ 0x32EE, 0x8139, 0xD436,
+ 0x32EF, 0x8139, 0xD437,
+ 0x32F0, 0x8139, 0xD438,
+ 0x32F1, 0x8139, 0xD439,
+ 0x32F2, 0x8139, 0xD530,
+ 0x32F3, 0x8139, 0xD531,
+ 0x32F4, 0x8139, 0xD532,
+ 0x32F5, 0x8139, 0xD533,
+ 0x32F6, 0x8139, 0xD534,
+ 0x32F7, 0x8139, 0xD535,
+ 0x32F8, 0x8139, 0xD536,
+ 0x32F9, 0x8139, 0xD537,
+ 0x32FA, 0x8139, 0xD538,
+ 0x32FB, 0x8139, 0xD539,
+ 0x32FC, 0x8139, 0xD630,
+ 0x32FD, 0x8139, 0xD631,
+ 0x32FE, 0x8139, 0xD632,
+ 0x32FF, 0x8139, 0xD633,
+ 0x3300, 0x8139, 0xD634,
+ 0x3301, 0x8139, 0xD635,
+ 0x3302, 0x8139, 0xD636,
+ 0x3303, 0x8139, 0xD637,
+ 0x3304, 0x8139, 0xD638,
+ 0x3305, 0x8139, 0xD639,
+ 0x3306, 0x8139, 0xD730,
+ 0x3307, 0x8139, 0xD731,
+ 0x3308, 0x8139, 0xD732,
+ 0x3309, 0x8139, 0xD733,
+ 0x330A, 0x8139, 0xD734,
+ 0x330B, 0x8139, 0xD735,
+ 0x330C, 0x8139, 0xD736,
+ 0x330D, 0x8139, 0xD737,
+ 0x330E, 0x8139, 0xD738,
+ 0x330F, 0x8139, 0xD739,
+ 0x3310, 0x8139, 0xD830,
+ 0x3311, 0x8139, 0xD831,
+ 0x3312, 0x8139, 0xD832,
+ 0x3313, 0x8139, 0xD833,
+ 0x3314, 0x8139, 0xD834,
+ 0x3315, 0x8139, 0xD835,
+ 0x3316, 0x8139, 0xD836,
+ 0x3317, 0x8139, 0xD837,
+ 0x3318, 0x8139, 0xD838,
+ 0x3319, 0x8139, 0xD839,
+ 0x331A, 0x8139, 0xD930,
+ 0x331B, 0x8139, 0xD931,
+ 0x331C, 0x8139, 0xD932,
+ 0x331D, 0x8139, 0xD933,
+ 0x331E, 0x8139, 0xD934,
+ 0x331F, 0x8139, 0xD935,
+ 0x3320, 0x8139, 0xD936,
+ 0x3321, 0x8139, 0xD937,
+ 0x3322, 0x8139, 0xD938,
+ 0x3323, 0x8139, 0xD939,
+ 0x3324, 0x8139, 0xDA30,
+ 0x3325, 0x8139, 0xDA31,
+ 0x3326, 0x8139, 0xDA32,
+ 0x3327, 0x8139, 0xDA33,
+ 0x3328, 0x8139, 0xDA34,
+ 0x3329, 0x8139, 0xDA35,
+ 0x332A, 0x8139, 0xDA36,
+ 0x332B, 0x8139, 0xDA37,
+ 0x332C, 0x8139, 0xDA38,
+ 0x332D, 0x8139, 0xDA39,
+ 0x332E, 0x8139, 0xDB30,
+ 0x332F, 0x8139, 0xDB31,
+ 0x3330, 0x8139, 0xDB32,
+ 0x3331, 0x8139, 0xDB33,
+ 0x3332, 0x8139, 0xDB34,
+ 0x3333, 0x8139, 0xDB35,
+ 0x3334, 0x8139, 0xDB36,
+ 0x3335, 0x8139, 0xDB37,
+ 0x3336, 0x8139, 0xDB38,
+ 0x3337, 0x8139, 0xDB39,
+ 0x3338, 0x8139, 0xDC30,
+ 0x3339, 0x8139, 0xDC31,
+ 0x333A, 0x8139, 0xDC32,
+ 0x333B, 0x8139, 0xDC33,
+ 0x333C, 0x8139, 0xDC34,
+ 0x333D, 0x8139, 0xDC35,
+ 0x333E, 0x8139, 0xDC36,
+ 0x333F, 0x8139, 0xDC37,
+ 0x3340, 0x8139, 0xDC38,
+ 0x3341, 0x8139, 0xDC39,
+ 0x3342, 0x8139, 0xDD30,
+ 0x3343, 0x8139, 0xDD31,
+ 0x3344, 0x8139, 0xDD32,
+ 0x3345, 0x8139, 0xDD33,
+ 0x3346, 0x8139, 0xDD34,
+ 0x3347, 0x8139, 0xDD35,
+ 0x3348, 0x8139, 0xDD36,
+ 0x3349, 0x8139, 0xDD37,
+ 0x334A, 0x8139, 0xDD38,
+ 0x334B, 0x8139, 0xDD39,
+ 0x334C, 0x8139, 0xDE30,
+ 0x334D, 0x8139, 0xDE31,
+ 0x334E, 0x8139, 0xDE32,
+ 0x334F, 0x8139, 0xDE33,
+ 0x3350, 0x8139, 0xDE34,
+ 0x3351, 0x8139, 0xDE35,
+ 0x3352, 0x8139, 0xDE36,
+ 0x3353, 0x8139, 0xDE37,
+ 0x3354, 0x8139, 0xDE38,
+ 0x3355, 0x8139, 0xDE39,
+ 0x3356, 0x8139, 0xDF30,
+ 0x3357, 0x8139, 0xDF31,
+ 0x3358, 0x8139, 0xDF32,
+ 0x3359, 0x8139, 0xDF33,
+ 0x335A, 0x8139, 0xDF34,
+ 0x335B, 0x8139, 0xDF35,
+ 0x335C, 0x8139, 0xDF36,
+ 0x335D, 0x8139, 0xDF37,
+ 0x335E, 0x8139, 0xDF38,
+ 0x335F, 0x8139, 0xDF39,
+ 0x3360, 0x8139, 0xE030,
+ 0x3361, 0x8139, 0xE031,
+ 0x3362, 0x8139, 0xE032,
+ 0x3363, 0x8139, 0xE033,
+ 0x3364, 0x8139, 0xE034,
+ 0x3365, 0x8139, 0xE035,
+ 0x3366, 0x8139, 0xE036,
+ 0x3367, 0x8139, 0xE037,
+ 0x3368, 0x8139, 0xE038,
+ 0x3369, 0x8139, 0xE039,
+ 0x336A, 0x8139, 0xE130,
+ 0x336B, 0x8139, 0xE131,
+ 0x336C, 0x8139, 0xE132,
+ 0x336D, 0x8139, 0xE133,
+ 0x336E, 0x8139, 0xE134,
+ 0x336F, 0x8139, 0xE135,
+ 0x3370, 0x8139, 0xE136,
+ 0x3371, 0x8139, 0xE137,
+ 0x3372, 0x8139, 0xE138,
+ 0x3373, 0x8139, 0xE139,
+ 0x3374, 0x8139, 0xE230,
+ 0x3375, 0x8139, 0xE231,
+ 0x3376, 0x8139, 0xE232,
+ 0x3377, 0x8139, 0xE233,
+ 0x3378, 0x8139, 0xE234,
+ 0x3379, 0x8139, 0xE235,
+ 0x337A, 0x8139, 0xE236,
+ 0x337B, 0x8139, 0xE237,
+ 0x337C, 0x8139, 0xE238,
+ 0x337D, 0x8139, 0xE239,
+ 0x337E, 0x8139, 0xE330,
+ 0x337F, 0x8139, 0xE331,
+ 0x3380, 0x8139, 0xE332,
+ 0x3381, 0x8139, 0xE333,
+ 0x3382, 0x8139, 0xE334,
+ 0x3383, 0x8139, 0xE335,
+ 0x3384, 0x8139, 0xE336,
+ 0x3385, 0x8139, 0xE337,
+ 0x3386, 0x8139, 0xE338,
+ 0x3387, 0x8139, 0xE339,
+ 0x3388, 0x8139, 0xE430,
+ 0x3389, 0x8139, 0xE431,
+ 0x338A, 0x8139, 0xE432,
+ 0x338B, 0x8139, 0xE433,
+ 0x338C, 0x8139, 0xE434,
+ 0x338D, 0x8139, 0xE435,
+ 0x3390, 0x8139, 0xE436,
+ 0x3391, 0x8139, 0xE437,
+ 0x3392, 0x8139, 0xE438,
+ 0x3393, 0x8139, 0xE439,
+ 0x3394, 0x8139, 0xE530,
+ 0x3395, 0x8139, 0xE531,
+ 0x3396, 0x8139, 0xE532,
+ 0x3397, 0x8139, 0xE533,
+ 0x3398, 0x8139, 0xE534,
+ 0x3399, 0x8139, 0xE535,
+ 0x339A, 0x8139, 0xE536,
+ 0x339B, 0x8139, 0xE537,
+ 0x339F, 0x8139, 0xE538,
+ 0x33A0, 0x8139, 0xE539,
+ 0x33A2, 0x8139, 0xE630,
+ 0x33A3, 0x8139, 0xE631,
+ 0x33A4, 0x8139, 0xE632,
+ 0x33A5, 0x8139, 0xE633,
+ 0x33A6, 0x8139, 0xE634,
+ 0x33A7, 0x8139, 0xE635,
+ 0x33A8, 0x8139, 0xE636,
+ 0x33A9, 0x8139, 0xE637,
+ 0x33AA, 0x8139, 0xE638,
+ 0x33AB, 0x8139, 0xE639,
+ 0x33AC, 0x8139, 0xE730,
+ 0x33AD, 0x8139, 0xE731,
+ 0x33AE, 0x8139, 0xE732,
+ 0x33AF, 0x8139, 0xE733,
+ 0x33B0, 0x8139, 0xE734,
+ 0x33B1, 0x8139, 0xE735,
+ 0x33B2, 0x8139, 0xE736,
+ 0x33B3, 0x8139, 0xE737,
+ 0x33B4, 0x8139, 0xE738,
+ 0x33B5, 0x8139, 0xE739,
+ 0x33B6, 0x8139, 0xE830,
+ 0x33B7, 0x8139, 0xE831,
+ 0x33B8, 0x8139, 0xE832,
+ 0x33B9, 0x8139, 0xE833,
+ 0x33BA, 0x8139, 0xE834,
+ 0x33BB, 0x8139, 0xE835,
+ 0x33BC, 0x8139, 0xE836,
+ 0x33BD, 0x8139, 0xE837,
+ 0x33BE, 0x8139, 0xE838,
+ 0x33BF, 0x8139, 0xE839,
+ 0x33C0, 0x8139, 0xE930,
+ 0x33C1, 0x8139, 0xE931,
+ 0x33C2, 0x8139, 0xE932,
+ 0x33C3, 0x8139, 0xE933,
+ 0x33C5, 0x8139, 0xE934,
+ 0x33C6, 0x8139, 0xE935,
+ 0x33C7, 0x8139, 0xE936,
+ 0x33C8, 0x8139, 0xE937,
+ 0x33C9, 0x8139, 0xE938,
+ 0x33CA, 0x8139, 0xE939,
+ 0x33CB, 0x8139, 0xEA30,
+ 0x33CC, 0x8139, 0xEA31,
+ 0x33CD, 0x8139, 0xEA32,
+ 0x33CF, 0x8139, 0xEA33,
+ 0x33D0, 0x8139, 0xEA34,
+ 0x33D3, 0x8139, 0xEA35,
+ 0x33D4, 0x8139, 0xEA36,
+ 0x33D6, 0x8139, 0xEA37,
+ 0x33D7, 0x8139, 0xEA38,
+ 0x33D8, 0x8139, 0xEA39,
+ 0x33D9, 0x8139, 0xEB30,
+ 0x33DA, 0x8139, 0xEB31,
+ 0x33DB, 0x8139, 0xEB32,
+ 0x33DC, 0x8139, 0xEB33,
+ 0x33DD, 0x8139, 0xEB34,
+ 0x33DE, 0x8139, 0xEB35,
+ 0x33DF, 0x8139, 0xEB36,
+ 0x33E0, 0x8139, 0xEB37,
+ 0x33E1, 0x8139, 0xEB38,
+ 0x33E2, 0x8139, 0xEB39,
+ 0x33E3, 0x8139, 0xEC30,
+ 0x33E4, 0x8139, 0xEC31,
+ 0x33E5, 0x8139, 0xEC32,
+ 0x33E6, 0x8139, 0xEC33,
+ 0x33E7, 0x8139, 0xEC34,
+ 0x33E8, 0x8139, 0xEC35,
+ 0x33E9, 0x8139, 0xEC36,
+ 0x33EA, 0x8139, 0xEC37,
+ 0x33EB, 0x8139, 0xEC38,
+ 0x33EC, 0x8139, 0xEC39,
+ 0x33ED, 0x8139, 0xED30,
+ 0x33EE, 0x8139, 0xED31,
+ 0x33EF, 0x8139, 0xED32,
+ 0x33F0, 0x8139, 0xED33,
+ 0x33F1, 0x8139, 0xED34,
+ 0x33F2, 0x8139, 0xED35,
+ 0x33F3, 0x8139, 0xED36,
+ 0x33F4, 0x8139, 0xED37,
+ 0x33F5, 0x8139, 0xED38,
+ 0x33F6, 0x8139, 0xED39,
+ 0x33F7, 0x8139, 0xEE30,
+ 0x33F8, 0x8139, 0xEE31,
+ 0x33F9, 0x8139, 0xEE32,
+ 0x33FA, 0x8139, 0xEE33,
+ 0x33FB, 0x8139, 0xEE34,
+ 0x33FC, 0x8139, 0xEE35,
+ 0x33FD, 0x8139, 0xEE36,
+ 0x33FE, 0x8139, 0xEE37,
+ 0x33FF, 0x8139, 0xEE38,
+ 0x3400, 0x8139, 0xEE39,
+ 0x3401, 0x8139, 0xEF30,
+ 0x3402, 0x8139, 0xEF31,
+ 0x3403, 0x8139, 0xEF32,
+ 0x3404, 0x8139, 0xEF33,
+ 0x3405, 0x8139, 0xEF34,
+ 0x3406, 0x8139, 0xEF35,
+ 0x3407, 0x8139, 0xEF36,
+ 0x3408, 0x8139, 0xEF37,
+ 0x3409, 0x8139, 0xEF38,
+ 0x340A, 0x8139, 0xEF39,
+ 0x340B, 0x8139, 0xF030,
+ 0x340C, 0x8139, 0xF031,
+ 0x340D, 0x8139, 0xF032,
+ 0x340E, 0x8139, 0xF033,
+ 0x340F, 0x8139, 0xF034,
+ 0x3410, 0x8139, 0xF035,
+ 0x3411, 0x8139, 0xF036,
+ 0x3412, 0x8139, 0xF037,
+ 0x3413, 0x8139, 0xF038,
+ 0x3414, 0x8139, 0xF039,
+ 0x3415, 0x8139, 0xF130,
+ 0x3416, 0x8139, 0xF131,
+ 0x3417, 0x8139, 0xF132,
+ 0x3418, 0x8139, 0xF133,
+ 0x3419, 0x8139, 0xF134,
+ 0x341A, 0x8139, 0xF135,
+ 0x341B, 0x8139, 0xF136,
+ 0x341C, 0x8139, 0xF137,
+ 0x341D, 0x8139, 0xF138,
+ 0x341E, 0x8139, 0xF139,
+ 0x341F, 0x8139, 0xF230,
+ 0x3420, 0x8139, 0xF231,
+ 0x3421, 0x8139, 0xF232,
+ 0x3422, 0x8139, 0xF233,
+ 0x3423, 0x8139, 0xF234,
+ 0x3424, 0x8139, 0xF235,
+ 0x3425, 0x8139, 0xF236,
+ 0x3426, 0x8139, 0xF237,
+ 0x3427, 0x8139, 0xF238,
+ 0x3428, 0x8139, 0xF239,
+ 0x3429, 0x8139, 0xF330,
+ 0x342A, 0x8139, 0xF331,
+ 0x342B, 0x8139, 0xF332,
+ 0x342C, 0x8139, 0xF333,
+ 0x342D, 0x8139, 0xF334,
+ 0x342E, 0x8139, 0xF335,
+ 0x342F, 0x8139, 0xF336,
+ 0x3430, 0x8139, 0xF337,
+ 0x3431, 0x8139, 0xF338,
+ 0x3432, 0x8139, 0xF339,
+ 0x3433, 0x8139, 0xF430,
+ 0x3434, 0x8139, 0xF431,
+ 0x3435, 0x8139, 0xF432,
+ 0x3436, 0x8139, 0xF433,
+ 0x3437, 0x8139, 0xF434,
+ 0x3438, 0x8139, 0xF435,
+ 0x3439, 0x8139, 0xF436,
+ 0x343A, 0x8139, 0xF437,
+ 0x343B, 0x8139, 0xF438,
+ 0x343C, 0x8139, 0xF439,
+ 0x343D, 0x8139, 0xF530,
+ 0x343E, 0x8139, 0xF531,
+ 0x343F, 0x8139, 0xF532,
+ 0x3440, 0x8139, 0xF533,
+ 0x3441, 0x8139, 0xF534,
+ 0x3442, 0x8139, 0xF535,
+ 0x3443, 0x8139, 0xF536,
+ 0x3444, 0x8139, 0xF537,
+ 0x3445, 0x8139, 0xF538,
+ 0x3446, 0x8139, 0xF539,
+ 0x3448, 0x8139, 0xF630,
+ 0x3449, 0x8139, 0xF631,
+ 0x344A, 0x8139, 0xF632,
+ 0x344B, 0x8139, 0xF633,
+ 0x344C, 0x8139, 0xF634,
+ 0x344D, 0x8139, 0xF635,
+ 0x344E, 0x8139, 0xF636,
+ 0x344F, 0x8139, 0xF637,
+ 0x3450, 0x8139, 0xF638,
+ 0x3451, 0x8139, 0xF639,
+ 0x3452, 0x8139, 0xF730,
+ 0x3453, 0x8139, 0xF731,
+ 0x3454, 0x8139, 0xF732,
+ 0x3455, 0x8139, 0xF733,
+ 0x3456, 0x8139, 0xF734,
+ 0x3457, 0x8139, 0xF735,
+ 0x3458, 0x8139, 0xF736,
+ 0x3459, 0x8139, 0xF737,
+ 0x345A, 0x8139, 0xF738,
+ 0x345B, 0x8139, 0xF739,
+ 0x345C, 0x8139, 0xF830,
+ 0x345D, 0x8139, 0xF831,
+ 0x345E, 0x8139, 0xF832,
+ 0x345F, 0x8139, 0xF833,
+ 0x3460, 0x8139, 0xF834,
+ 0x3461, 0x8139, 0xF835,
+ 0x3462, 0x8139, 0xF836,
+ 0x3463, 0x8139, 0xF837,
+ 0x3464, 0x8139, 0xF838,
+ 0x3465, 0x8139, 0xF839,
+ 0x3466, 0x8139, 0xF930,
+ 0x3467, 0x8139, 0xF931,
+ 0x3468, 0x8139, 0xF932,
+ 0x3469, 0x8139, 0xF933,
+ 0x346A, 0x8139, 0xF934,
+ 0x346B, 0x8139, 0xF935,
+ 0x346C, 0x8139, 0xF936,
+ 0x346D, 0x8139, 0xF937,
+ 0x346E, 0x8139, 0xF938,
+ 0x346F, 0x8139, 0xF939,
+ 0x3470, 0x8139, 0xFA30,
+ 0x3471, 0x8139, 0xFA31,
+ 0x3472, 0x8139, 0xFA32,
+ 0x3474, 0x8139, 0xFA33,
+ 0x3475, 0x8139, 0xFA34,
+ 0x3476, 0x8139, 0xFA35,
+ 0x3477, 0x8139, 0xFA36,
+ 0x3478, 0x8139, 0xFA37,
+ 0x3479, 0x8139, 0xFA38,
+ 0x347A, 0x8139, 0xFA39,
+ 0x347B, 0x8139, 0xFB30,
+ 0x347C, 0x8139, 0xFB31,
+ 0x347D, 0x8139, 0xFB32,
+ 0x347E, 0x8139, 0xFB33,
+ 0x347F, 0x8139, 0xFB34,
+ 0x3480, 0x8139, 0xFB35,
+ 0x3481, 0x8139, 0xFB36,
+ 0x3482, 0x8139, 0xFB37,
+ 0x3483, 0x8139, 0xFB38,
+ 0x3484, 0x8139, 0xFB39,
+ 0x3485, 0x8139, 0xFC30,
+ 0x3486, 0x8139, 0xFC31,
+ 0x3487, 0x8139, 0xFC32,
+ 0x3488, 0x8139, 0xFC33,
+ 0x3489, 0x8139, 0xFC34,
+ 0x348A, 0x8139, 0xFC35,
+ 0x348B, 0x8139, 0xFC36,
+ 0x348C, 0x8139, 0xFC37,
+ 0x348D, 0x8139, 0xFC38,
+ 0x348E, 0x8139, 0xFC39,
+ 0x348F, 0x8139, 0xFD30,
+ 0x3490, 0x8139, 0xFD31,
+ 0x3491, 0x8139, 0xFD32,
+ 0x3492, 0x8139, 0xFD33,
+ 0x3493, 0x8139, 0xFD34,
+ 0x3494, 0x8139, 0xFD35,
+ 0x3495, 0x8139, 0xFD36,
+ 0x3496, 0x8139, 0xFD37,
+ 0x3497, 0x8139, 0xFD38,
+ 0x3498, 0x8139, 0xFD39,
+ 0x3499, 0x8139, 0xFE30,
+ 0x349A, 0x8139, 0xFE31,
+ 0x349B, 0x8139, 0xFE32,
+ 0x349C, 0x8139, 0xFE33,
+ 0x349D, 0x8139, 0xFE34,
+ 0x349E, 0x8139, 0xFE35,
+ 0x349F, 0x8139, 0xFE36,
+ 0x34A0, 0x8139, 0xFE37,
+ 0x34A1, 0x8139, 0xFE38,
+ 0x34A2, 0x8139, 0xFE39,
+ 0x34A3, 0x8230, 0x8130,
+ 0x34A4, 0x8230, 0x8131,
+ 0x34A5, 0x8230, 0x8132,
+ 0x34A6, 0x8230, 0x8133,
+ 0x34A7, 0x8230, 0x8134,
+ 0x34A8, 0x8230, 0x8135,
+ 0x34A9, 0x8230, 0x8136,
+ 0x34AA, 0x8230, 0x8137,
+ 0x34AB, 0x8230, 0x8138,
+ 0x34AC, 0x8230, 0x8139,
+ 0x34AD, 0x8230, 0x8230,
+ 0x34AE, 0x8230, 0x8231,
+ 0x34AF, 0x8230, 0x8232,
+ 0x34B0, 0x8230, 0x8233,
+ 0x34B1, 0x8230, 0x8234,
+ 0x34B2, 0x8230, 0x8235,
+ 0x34B3, 0x8230, 0x8236,
+ 0x34B4, 0x8230, 0x8237,
+ 0x34B5, 0x8230, 0x8238,
+ 0x34B6, 0x8230, 0x8239,
+ 0x34B7, 0x8230, 0x8330,
+ 0x34B8, 0x8230, 0x8331,
+ 0x34B9, 0x8230, 0x8332,
+ 0x34BA, 0x8230, 0x8333,
+ 0x34BB, 0x8230, 0x8334,
+ 0x34BC, 0x8230, 0x8335,
+ 0x34BD, 0x8230, 0x8336,
+ 0x34BE, 0x8230, 0x8337,
+ 0x34BF, 0x8230, 0x8338,
+ 0x34C0, 0x8230, 0x8339,
+ 0x34C1, 0x8230, 0x8430,
+ 0x34C2, 0x8230, 0x8431,
+ 0x34C3, 0x8230, 0x8432,
+ 0x34C4, 0x8230, 0x8433,
+ 0x34C5, 0x8230, 0x8434,
+ 0x34C6, 0x8230, 0x8435,
+ 0x34C7, 0x8230, 0x8436,
+ 0x34C8, 0x8230, 0x8437,
+ 0x34C9, 0x8230, 0x8438,
+ 0x34CA, 0x8230, 0x8439,
+ 0x34CB, 0x8230, 0x8530,
+ 0x34CC, 0x8230, 0x8531,
+ 0x34CD, 0x8230, 0x8532,
+ 0x34CE, 0x8230, 0x8533,
+ 0x34CF, 0x8230, 0x8534,
+ 0x34D0, 0x8230, 0x8535,
+ 0x34D1, 0x8230, 0x8536,
+ 0x34D2, 0x8230, 0x8537,
+ 0x34D3, 0x8230, 0x8538,
+ 0x34D4, 0x8230, 0x8539,
+ 0x34D5, 0x8230, 0x8630,
+ 0x34D6, 0x8230, 0x8631,
+ 0x34D7, 0x8230, 0x8632,
+ 0x34D8, 0x8230, 0x8633,
+ 0x34D9, 0x8230, 0x8634,
+ 0x34DA, 0x8230, 0x8635,
+ 0x34DB, 0x8230, 0x8636,
+ 0x34DC, 0x8230, 0x8637,
+ 0x34DD, 0x8230, 0x8638,
+ 0x34DE, 0x8230, 0x8639,
+ 0x34DF, 0x8230, 0x8730,
+ 0x34E0, 0x8230, 0x8731,
+ 0x34E1, 0x8230, 0x8732,
+ 0x34E2, 0x8230, 0x8733,
+ 0x34E3, 0x8230, 0x8734,
+ 0x34E4, 0x8230, 0x8735,
+ 0x34E5, 0x8230, 0x8736,
+ 0x34E6, 0x8230, 0x8737,
+ 0x34E7, 0x8230, 0x8738,
+ 0x34E8, 0x8230, 0x8739,
+ 0x34E9, 0x8230, 0x8830,
+ 0x34EA, 0x8230, 0x8831,
+ 0x34EB, 0x8230, 0x8832,
+ 0x34EC, 0x8230, 0x8833,
+ 0x34ED, 0x8230, 0x8834,
+ 0x34EE, 0x8230, 0x8835,
+ 0x34EF, 0x8230, 0x8836,
+ 0x34F0, 0x8230, 0x8837,
+ 0x34F1, 0x8230, 0x8838,
+ 0x34F2, 0x8230, 0x8839,
+ 0x34F3, 0x8230, 0x8930,
+ 0x34F4, 0x8230, 0x8931,
+ 0x34F5, 0x8230, 0x8932,
+ 0x34F6, 0x8230, 0x8933,
+ 0x34F7, 0x8230, 0x8934,
+ 0x34F8, 0x8230, 0x8935,
+ 0x34F9, 0x8230, 0x8936,
+ 0x34FA, 0x8230, 0x8937,
+ 0x34FB, 0x8230, 0x8938,
+ 0x34FC, 0x8230, 0x8939,
+ 0x34FD, 0x8230, 0x8A30,
+ 0x34FE, 0x8230, 0x8A31,
+ 0x34FF, 0x8230, 0x8A32,
+ 0x3500, 0x8230, 0x8A33,
+ 0x3501, 0x8230, 0x8A34,
+ 0x3502, 0x8230, 0x8A35,
+ 0x3503, 0x8230, 0x8A36,
+ 0x3504, 0x8230, 0x8A37,
+ 0x3505, 0x8230, 0x8A38,
+ 0x3506, 0x8230, 0x8A39,
+ 0x3507, 0x8230, 0x8B30,
+ 0x3508, 0x8230, 0x8B31,
+ 0x3509, 0x8230, 0x8B32,
+ 0x350A, 0x8230, 0x8B33,
+ 0x350B, 0x8230, 0x8B34,
+ 0x350C, 0x8230, 0x8B35,
+ 0x350D, 0x8230, 0x8B36,
+ 0x350E, 0x8230, 0x8B37,
+ 0x350F, 0x8230, 0x8B38,
+ 0x3510, 0x8230, 0x8B39,
+ 0x3511, 0x8230, 0x8C30,
+ 0x3512, 0x8230, 0x8C31,
+ 0x3513, 0x8230, 0x8C32,
+ 0x3514, 0x8230, 0x8C33,
+ 0x3515, 0x8230, 0x8C34,
+ 0x3516, 0x8230, 0x8C35,
+ 0x3517, 0x8230, 0x8C36,
+ 0x3518, 0x8230, 0x8C37,
+ 0x3519, 0x8230, 0x8C38,
+ 0x351A, 0x8230, 0x8C39,
+ 0x351B, 0x8230, 0x8D30,
+ 0x351C, 0x8230, 0x8D31,
+ 0x351D, 0x8230, 0x8D32,
+ 0x351E, 0x8230, 0x8D33,
+ 0x351F, 0x8230, 0x8D34,
+ 0x3520, 0x8230, 0x8D35,
+ 0x3521, 0x8230, 0x8D36,
+ 0x3522, 0x8230, 0x8D37,
+ 0x3523, 0x8230, 0x8D38,
+ 0x3524, 0x8230, 0x8D39,
+ 0x3525, 0x8230, 0x8E30,
+ 0x3526, 0x8230, 0x8E31,
+ 0x3527, 0x8230, 0x8E32,
+ 0x3528, 0x8230, 0x8E33,
+ 0x3529, 0x8230, 0x8E34,
+ 0x352A, 0x8230, 0x8E35,
+ 0x352B, 0x8230, 0x8E36,
+ 0x352C, 0x8230, 0x8E37,
+ 0x352D, 0x8230, 0x8E38,
+ 0x352E, 0x8230, 0x8E39,
+ 0x352F, 0x8230, 0x8F30,
+ 0x3530, 0x8230, 0x8F31,
+ 0x3531, 0x8230, 0x8F32,
+ 0x3532, 0x8230, 0x8F33,
+ 0x3533, 0x8230, 0x8F34,
+ 0x3534, 0x8230, 0x8F35,
+ 0x3535, 0x8230, 0x8F36,
+ 0x3536, 0x8230, 0x8F37,
+ 0x3537, 0x8230, 0x8F38,
+ 0x3538, 0x8230, 0x8F39,
+ 0x3539, 0x8230, 0x9030,
+ 0x353A, 0x8230, 0x9031,
+ 0x353B, 0x8230, 0x9032,
+ 0x353C, 0x8230, 0x9033,
+ 0x353D, 0x8230, 0x9034,
+ 0x353E, 0x8230, 0x9035,
+ 0x353F, 0x8230, 0x9036,
+ 0x3540, 0x8230, 0x9037,
+ 0x3541, 0x8230, 0x9038,
+ 0x3542, 0x8230, 0x9039,
+ 0x3543, 0x8230, 0x9130,
+ 0x3544, 0x8230, 0x9131,
+ 0x3545, 0x8230, 0x9132,
+ 0x3546, 0x8230, 0x9133,
+ 0x3547, 0x8230, 0x9134,
+ 0x3548, 0x8230, 0x9135,
+ 0x3549, 0x8230, 0x9136,
+ 0x354A, 0x8230, 0x9137,
+ 0x354B, 0x8230, 0x9138,
+ 0x354C, 0x8230, 0x9139,
+ 0x354D, 0x8230, 0x9230,
+ 0x354E, 0x8230, 0x9231,
+ 0x354F, 0x8230, 0x9232,
+ 0x3550, 0x8230, 0x9233,
+ 0x3551, 0x8230, 0x9234,
+ 0x3552, 0x8230, 0x9235,
+ 0x3553, 0x8230, 0x9236,
+ 0x3554, 0x8230, 0x9237,
+ 0x3555, 0x8230, 0x9238,
+ 0x3556, 0x8230, 0x9239,
+ 0x3557, 0x8230, 0x9330,
+ 0x3558, 0x8230, 0x9331,
+ 0x3559, 0x8230, 0x9332,
+ 0x355A, 0x8230, 0x9333,
+ 0x355B, 0x8230, 0x9334,
+ 0x355C, 0x8230, 0x9335,
+ 0x355D, 0x8230, 0x9336,
+ 0x355E, 0x8230, 0x9337,
+ 0x355F, 0x8230, 0x9338,
+ 0x3560, 0x8230, 0x9339,
+ 0x3561, 0x8230, 0x9430,
+ 0x3562, 0x8230, 0x9431,
+ 0x3563, 0x8230, 0x9432,
+ 0x3564, 0x8230, 0x9433,
+ 0x3565, 0x8230, 0x9434,
+ 0x3566, 0x8230, 0x9435,
+ 0x3567, 0x8230, 0x9436,
+ 0x3568, 0x8230, 0x9437,
+ 0x3569, 0x8230, 0x9438,
+ 0x356A, 0x8230, 0x9439,
+ 0x356B, 0x8230, 0x9530,
+ 0x356C, 0x8230, 0x9531,
+ 0x356D, 0x8230, 0x9532,
+ 0x356E, 0x8230, 0x9533,
+ 0x356F, 0x8230, 0x9534,
+ 0x3570, 0x8230, 0x9535,
+ 0x3571, 0x8230, 0x9536,
+ 0x3572, 0x8230, 0x9537,
+ 0x3573, 0x8230, 0x9538,
+ 0x3574, 0x8230, 0x9539,
+ 0x3575, 0x8230, 0x9630,
+ 0x3576, 0x8230, 0x9631,
+ 0x3577, 0x8230, 0x9632,
+ 0x3578, 0x8230, 0x9633,
+ 0x3579, 0x8230, 0x9634,
+ 0x357A, 0x8230, 0x9635,
+ 0x357B, 0x8230, 0x9636,
+ 0x357C, 0x8230, 0x9637,
+ 0x357D, 0x8230, 0x9638,
+ 0x357E, 0x8230, 0x9639,
+ 0x357F, 0x8230, 0x9730,
+ 0x3580, 0x8230, 0x9731,
+ 0x3581, 0x8230, 0x9732,
+ 0x3582, 0x8230, 0x9733,
+ 0x3583, 0x8230, 0x9734,
+ 0x3584, 0x8230, 0x9735,
+ 0x3585, 0x8230, 0x9736,
+ 0x3586, 0x8230, 0x9737,
+ 0x3587, 0x8230, 0x9738,
+ 0x3588, 0x8230, 0x9739,
+ 0x3589, 0x8230, 0x9830,
+ 0x358A, 0x8230, 0x9831,
+ 0x358B, 0x8230, 0x9832,
+ 0x358C, 0x8230, 0x9833,
+ 0x358D, 0x8230, 0x9834,
+ 0x358E, 0x8230, 0x9835,
+ 0x358F, 0x8230, 0x9836,
+ 0x3590, 0x8230, 0x9837,
+ 0x3591, 0x8230, 0x9838,
+ 0x3592, 0x8230, 0x9839,
+ 0x3593, 0x8230, 0x9930,
+ 0x3594, 0x8230, 0x9931,
+ 0x3595, 0x8230, 0x9932,
+ 0x3596, 0x8230, 0x9933,
+ 0x3597, 0x8230, 0x9934,
+ 0x3598, 0x8230, 0x9935,
+ 0x3599, 0x8230, 0x9936,
+ 0x359A, 0x8230, 0x9937,
+ 0x359B, 0x8230, 0x9938,
+ 0x359C, 0x8230, 0x9939,
+ 0x359D, 0x8230, 0x9A30,
+ 0x359F, 0x8230, 0x9A31,
+ 0x35A0, 0x8230, 0x9A32,
+ 0x35A1, 0x8230, 0x9A33,
+ 0x35A2, 0x8230, 0x9A34,
+ 0x35A3, 0x8230, 0x9A35,
+ 0x35A4, 0x8230, 0x9A36,
+ 0x35A5, 0x8230, 0x9A37,
+ 0x35A6, 0x8230, 0x9A38,
+ 0x35A7, 0x8230, 0x9A39,
+ 0x35A8, 0x8230, 0x9B30,
+ 0x35A9, 0x8230, 0x9B31,
+ 0x35AA, 0x8230, 0x9B32,
+ 0x35AB, 0x8230, 0x9B33,
+ 0x35AC, 0x8230, 0x9B34,
+ 0x35AD, 0x8230, 0x9B35,
+ 0x35AE, 0x8230, 0x9B36,
+ 0x35AF, 0x8230, 0x9B37,
+ 0x35B0, 0x8230, 0x9B38,
+ 0x35B1, 0x8230, 0x9B39,
+ 0x35B2, 0x8230, 0x9C30,
+ 0x35B3, 0x8230, 0x9C31,
+ 0x35B4, 0x8230, 0x9C32,
+ 0x35B5, 0x8230, 0x9C33,
+ 0x35B6, 0x8230, 0x9C34,
+ 0x35B7, 0x8230, 0x9C35,
+ 0x35B8, 0x8230, 0x9C36,
+ 0x35B9, 0x8230, 0x9C37,
+ 0x35BA, 0x8230, 0x9C38,
+ 0x35BB, 0x8230, 0x9C39,
+ 0x35BC, 0x8230, 0x9D30,
+ 0x35BD, 0x8230, 0x9D31,
+ 0x35BE, 0x8230, 0x9D32,
+ 0x35BF, 0x8230, 0x9D33,
+ 0x35C0, 0x8230, 0x9D34,
+ 0x35C1, 0x8230, 0x9D35,
+ 0x35C2, 0x8230, 0x9D36,
+ 0x35C3, 0x8230, 0x9D37,
+ 0x35C4, 0x8230, 0x9D38,
+ 0x35C5, 0x8230, 0x9D39,
+ 0x35C6, 0x8230, 0x9E30,
+ 0x35C7, 0x8230, 0x9E31,
+ 0x35C8, 0x8230, 0x9E32,
+ 0x35C9, 0x8230, 0x9E33,
+ 0x35CA, 0x8230, 0x9E34,
+ 0x35CB, 0x8230, 0x9E35,
+ 0x35CC, 0x8230, 0x9E36,
+ 0x35CD, 0x8230, 0x9E37,
+ 0x35CE, 0x8230, 0x9E38,
+ 0x35CF, 0x8230, 0x9E39,
+ 0x35D0, 0x8230, 0x9F30,
+ 0x35D1, 0x8230, 0x9F31,
+ 0x35D2, 0x8230, 0x9F32,
+ 0x35D3, 0x8230, 0x9F33,
+ 0x35D4, 0x8230, 0x9F34,
+ 0x35D5, 0x8230, 0x9F35,
+ 0x35D6, 0x8230, 0x9F36,
+ 0x35D7, 0x8230, 0x9F37,
+ 0x35D8, 0x8230, 0x9F38,
+ 0x35D9, 0x8230, 0x9F39,
+ 0x35DA, 0x8230, 0xA030,
+ 0x35DB, 0x8230, 0xA031,
+ 0x35DC, 0x8230, 0xA032,
+ 0x35DD, 0x8230, 0xA033,
+ 0x35DE, 0x8230, 0xA034,
+ 0x35DF, 0x8230, 0xA035,
+ 0x35E0, 0x8230, 0xA036,
+ 0x35E1, 0x8230, 0xA037,
+ 0x35E2, 0x8230, 0xA038,
+ 0x35E3, 0x8230, 0xA039,
+ 0x35E4, 0x8230, 0xA130,
+ 0x35E5, 0x8230, 0xA131,
+ 0x35E6, 0x8230, 0xA132,
+ 0x35E7, 0x8230, 0xA133,
+ 0x35E8, 0x8230, 0xA134,
+ 0x35E9, 0x8230, 0xA135,
+ 0x35EA, 0x8230, 0xA136,
+ 0x35EB, 0x8230, 0xA137,
+ 0x35EC, 0x8230, 0xA138,
+ 0x35ED, 0x8230, 0xA139,
+ 0x35EE, 0x8230, 0xA230,
+ 0x35EF, 0x8230, 0xA231,
+ 0x35F0, 0x8230, 0xA232,
+ 0x35F1, 0x8230, 0xA233,
+ 0x35F2, 0x8230, 0xA234,
+ 0x35F3, 0x8230, 0xA235,
+ 0x35F4, 0x8230, 0xA236,
+ 0x35F5, 0x8230, 0xA237,
+ 0x35F6, 0x8230, 0xA238,
+ 0x35F7, 0x8230, 0xA239,
+ 0x35F8, 0x8230, 0xA330,
+ 0x35F9, 0x8230, 0xA331,
+ 0x35FA, 0x8230, 0xA332,
+ 0x35FB, 0x8230, 0xA333,
+ 0x35FC, 0x8230, 0xA334,
+ 0x35FD, 0x8230, 0xA335,
+ 0x35FE, 0x8230, 0xA336,
+ 0x35FF, 0x8230, 0xA337,
+ 0x3600, 0x8230, 0xA338,
+ 0x3601, 0x8230, 0xA339,
+ 0x3602, 0x8230, 0xA430,
+ 0x3603, 0x8230, 0xA431,
+ 0x3604, 0x8230, 0xA432,
+ 0x3605, 0x8230, 0xA433,
+ 0x3606, 0x8230, 0xA434,
+ 0x3607, 0x8230, 0xA435,
+ 0x3608, 0x8230, 0xA436,
+ 0x3609, 0x8230, 0xA437,
+ 0x360A, 0x8230, 0xA438,
+ 0x360B, 0x8230, 0xA439,
+ 0x360C, 0x8230, 0xA530,
+ 0x360D, 0x8230, 0xA531,
+ 0x360F, 0x8230, 0xA532,
+ 0x3610, 0x8230, 0xA533,
+ 0x3611, 0x8230, 0xA534,
+ 0x3612, 0x8230, 0xA535,
+ 0x3613, 0x8230, 0xA536,
+ 0x3614, 0x8230, 0xA537,
+ 0x3615, 0x8230, 0xA538,
+ 0x3616, 0x8230, 0xA539,
+ 0x3617, 0x8230, 0xA630,
+ 0x3618, 0x8230, 0xA631,
+ 0x3619, 0x8230, 0xA632,
+ 0x3919, 0x8230, 0xF238,
+ 0x391A, 0x8230, 0xF239,
+ 0x391B, 0x8230, 0xF330,
+ 0x391C, 0x8230, 0xF331,
+ 0x391D, 0x8230, 0xF332,
+ 0x391E, 0x8230, 0xF333,
+ 0x391F, 0x8230, 0xF334,
+ 0x3920, 0x8230, 0xF335,
+ 0x3921, 0x8230, 0xF336,
+ 0x3922, 0x8230, 0xF337,
+ 0x3923, 0x8230, 0xF338,
+ 0x3924, 0x8230, 0xF339,
+ 0x3925, 0x8230, 0xF430,
+ 0x3926, 0x8230, 0xF431,
+ 0x3927, 0x8230, 0xF432,
+ 0x3928, 0x8230, 0xF433,
+ 0x3929, 0x8230, 0xF434,
+ 0x392A, 0x8230, 0xF435,
+ 0x392B, 0x8230, 0xF436,
+ 0x392C, 0x8230, 0xF437,
+ 0x392D, 0x8230, 0xF438,
+ 0x392E, 0x8230, 0xF439,
+ 0x392F, 0x8230, 0xF530,
+ 0x3930, 0x8230, 0xF531,
+ 0x3931, 0x8230, 0xF532,
+ 0x3932, 0x8230, 0xF533,
+ 0x3933, 0x8230, 0xF534,
+ 0x3934, 0x8230, 0xF535,
+ 0x3935, 0x8230, 0xF536,
+ 0x3936, 0x8230, 0xF537,
+ 0x3937, 0x8230, 0xF538,
+ 0x3938, 0x8230, 0xF539,
+ 0x3939, 0x8230, 0xF630,
+ 0x393A, 0x8230, 0xF631,
+ 0x393B, 0x8230, 0xF632,
+ 0x393C, 0x8230, 0xF633,
+ 0x393D, 0x8230, 0xF634,
+ 0x393E, 0x8230, 0xF635,
+ 0x393F, 0x8230, 0xF636,
+ 0x3940, 0x8230, 0xF637,
+ 0x3941, 0x8230, 0xF638,
+ 0x3942, 0x8230, 0xF639,
+ 0x3943, 0x8230, 0xF730,
+ 0x3944, 0x8230, 0xF731,
+ 0x3945, 0x8230, 0xF732,
+ 0x3946, 0x8230, 0xF733,
+ 0x3947, 0x8230, 0xF734,
+ 0x3948, 0x8230, 0xF735,
+ 0x3949, 0x8230, 0xF736,
+ 0x394A, 0x8230, 0xF737,
+ 0x394B, 0x8230, 0xF738,
+ 0x394C, 0x8230, 0xF739,
+ 0x394D, 0x8230, 0xF830,
+ 0x394E, 0x8230, 0xF831,
+ 0x394F, 0x8230, 0xF832,
+ 0x3950, 0x8230, 0xF833,
+ 0x3951, 0x8230, 0xF834,
+ 0x3952, 0x8230, 0xF835,
+ 0x3953, 0x8230, 0xF836,
+ 0x3954, 0x8230, 0xF837,
+ 0x3955, 0x8230, 0xF838,
+ 0x3956, 0x8230, 0xF839,
+ 0x3957, 0x8230, 0xF930,
+ 0x3958, 0x8230, 0xF931,
+ 0x3959, 0x8230, 0xF932,
+ 0x395A, 0x8230, 0xF933,
+ 0x395B, 0x8230, 0xF934,
+ 0x395C, 0x8230, 0xF935,
+ 0x395D, 0x8230, 0xF936,
+ 0x395E, 0x8230, 0xF937,
+ 0x395F, 0x8230, 0xF938,
+ 0x3960, 0x8230, 0xF939,
+ 0x3961, 0x8230, 0xFA30,
+ 0x3962, 0x8230, 0xFA31,
+ 0x3963, 0x8230, 0xFA32,
+ 0x3964, 0x8230, 0xFA33,
+ 0x3965, 0x8230, 0xFA34,
+ 0x3966, 0x8230, 0xFA35,
+ 0x3967, 0x8230, 0xFA36,
+ 0x3968, 0x8230, 0xFA37,
+ 0x3969, 0x8230, 0xFA38,
+ 0x396A, 0x8230, 0xFA39,
+ 0x396B, 0x8230, 0xFB30,
+ 0x396C, 0x8230, 0xFB31,
+ 0x396D, 0x8230, 0xFB32,
+ 0x396F, 0x8230, 0xFB33,
+ 0x3970, 0x8230, 0xFB34,
+ 0x3971, 0x8230, 0xFB35,
+ 0x3972, 0x8230, 0xFB36,
+ 0x3973, 0x8230, 0xFB37,
+ 0x3974, 0x8230, 0xFB38,
+ 0x3975, 0x8230, 0xFB39,
+ 0x3976, 0x8230, 0xFC30,
+ 0x3977, 0x8230, 0xFC31,
+ 0x3978, 0x8230, 0xFC32,
+ 0x3979, 0x8230, 0xFC33,
+ 0x397A, 0x8230, 0xFC34,
+ 0x397B, 0x8230, 0xFC35,
+ 0x397C, 0x8230, 0xFC36,
+ 0x397D, 0x8230, 0xFC37,
+ 0x397E, 0x8230, 0xFC38,
+ 0x397F, 0x8230, 0xFC39,
+ 0x3980, 0x8230, 0xFD30,
+ 0x3981, 0x8230, 0xFD31,
+ 0x3982, 0x8230, 0xFD32,
+ 0x3983, 0x8230, 0xFD33,
+ 0x3984, 0x8230, 0xFD34,
+ 0x3985, 0x8230, 0xFD35,
+ 0x3986, 0x8230, 0xFD36,
+ 0x3987, 0x8230, 0xFD37,
+ 0x3988, 0x8230, 0xFD38,
+ 0x3989, 0x8230, 0xFD39,
+ 0x398A, 0x8230, 0xFE30,
+ 0x398B, 0x8230, 0xFE31,
+ 0x398C, 0x8230, 0xFE32,
+ 0x398D, 0x8230, 0xFE33,
+ 0x398E, 0x8230, 0xFE34,
+ 0x398F, 0x8230, 0xFE35,
+ 0x3990, 0x8230, 0xFE36,
+ 0x3991, 0x8230, 0xFE37,
+ 0x3992, 0x8230, 0xFE38,
+ 0x3993, 0x8230, 0xFE39,
+ 0x3994, 0x8231, 0x8130,
+ 0x3995, 0x8231, 0x8131,
+ 0x3996, 0x8231, 0x8132,
+ 0x3997, 0x8231, 0x8133,
+ 0x3998, 0x8231, 0x8134,
+ 0x3999, 0x8231, 0x8135,
+ 0x399A, 0x8231, 0x8136,
+ 0x399B, 0x8231, 0x8137,
+ 0x399C, 0x8231, 0x8138,
+ 0x399D, 0x8231, 0x8139,
+ 0x399E, 0x8231, 0x8230,
+ 0x399F, 0x8231, 0x8231,
+ 0x39A0, 0x8231, 0x8232,
+ 0x39A1, 0x8231, 0x8233,
+ 0x39A2, 0x8231, 0x8234,
+ 0x39A3, 0x8231, 0x8235,
+ 0x39A4, 0x8231, 0x8236,
+ 0x39A5, 0x8231, 0x8237,
+ 0x39A6, 0x8231, 0x8238,
+ 0x39A7, 0x8231, 0x8239,
+ 0x39A8, 0x8231, 0x8330,
+ 0x39A9, 0x8231, 0x8331,
+ 0x39AA, 0x8231, 0x8332,
+ 0x39AB, 0x8231, 0x8333,
+ 0x39AC, 0x8231, 0x8334,
+ 0x39AD, 0x8231, 0x8335,
+ 0x39AE, 0x8231, 0x8336,
+ 0x39AF, 0x8231, 0x8337,
+ 0x39B0, 0x8231, 0x8338,
+ 0x39B1, 0x8231, 0x8339,
+ 0x39B2, 0x8231, 0x8430,
+ 0x39B3, 0x8231, 0x8431,
+ 0x39B4, 0x8231, 0x8432,
+ 0x39B5, 0x8231, 0x8433,
+ 0x39B6, 0x8231, 0x8434,
+ 0x39B7, 0x8231, 0x8435,
+ 0x39B8, 0x8231, 0x8436,
+ 0x39B9, 0x8231, 0x8437,
+ 0x39BA, 0x8231, 0x8438,
+ 0x39BB, 0x8231, 0x8439,
+ 0x39BC, 0x8231, 0x8530,
+ 0x39BD, 0x8231, 0x8531,
+ 0x39BE, 0x8231, 0x8532,
+ 0x39BF, 0x8231, 0x8533,
+ 0x39C0, 0x8231, 0x8534,
+ 0x39C1, 0x8231, 0x8535,
+ 0x39C2, 0x8231, 0x8536,
+ 0x39C3, 0x8231, 0x8537,
+ 0x39C4, 0x8231, 0x8538,
+ 0x39C5, 0x8231, 0x8539,
+ 0x39C6, 0x8231, 0x8630,
+ 0x39C7, 0x8231, 0x8631,
+ 0x39C8, 0x8231, 0x8632,
+ 0x39C9, 0x8231, 0x8633,
+ 0x39CA, 0x8231, 0x8634,
+ 0x39CB, 0x8231, 0x8635,
+ 0x39CC, 0x8231, 0x8636,
+ 0x39CD, 0x8231, 0x8637,
+ 0x39CE, 0x8231, 0x8638,
+ 0x39D1, 0x8231, 0x8639,
+ 0x39D2, 0x8231, 0x8730,
+ 0x39D3, 0x8231, 0x8731,
+ 0x39D4, 0x8231, 0x8732,
+ 0x39D5, 0x8231, 0x8733,
+ 0x39D6, 0x8231, 0x8734,
+ 0x39D7, 0x8231, 0x8735,
+ 0x39D8, 0x8231, 0x8736,
+ 0x39D9, 0x8231, 0x8737,
+ 0x39DA, 0x8231, 0x8738,
+ 0x39DB, 0x8231, 0x8739,
+ 0x39DC, 0x8231, 0x8830,
+ 0x39DD, 0x8231, 0x8831,
+ 0x39DE, 0x8231, 0x8832,
+ 0x39E0, 0x8231, 0x8833,
+ 0x39E1, 0x8231, 0x8834,
+ 0x39E2, 0x8231, 0x8835,
+ 0x39E3, 0x8231, 0x8836,
+ 0x39E4, 0x8231, 0x8837,
+ 0x39E5, 0x8231, 0x8838,
+ 0x39E6, 0x8231, 0x8839,
+ 0x39E7, 0x8231, 0x8930,
+ 0x39E8, 0x8231, 0x8931,
+ 0x39E9, 0x8231, 0x8932,
+ 0x39EA, 0x8231, 0x8933,
+ 0x39EB, 0x8231, 0x8934,
+ 0x39EC, 0x8231, 0x8935,
+ 0x39ED, 0x8231, 0x8936,
+ 0x39EE, 0x8231, 0x8937,
+ 0x39EF, 0x8231, 0x8938,
+ 0x39F0, 0x8231, 0x8939,
+ 0x39F1, 0x8231, 0x8A30,
+ 0x39F2, 0x8231, 0x8A31,
+ 0x39F3, 0x8231, 0x8A32,
+ 0x39F4, 0x8231, 0x8A33,
+ 0x39F5, 0x8231, 0x8A34,
+ 0x39F6, 0x8231, 0x8A35,
+ 0x39F7, 0x8231, 0x8A36,
+ 0x39F8, 0x8231, 0x8A37,
+ 0x39F9, 0x8231, 0x8A38,
+ 0x39FA, 0x8231, 0x8A39,
+ 0x39FB, 0x8231, 0x8B30,
+ 0x39FC, 0x8231, 0x8B31,
+ 0x39FD, 0x8231, 0x8B32,
+ 0x39FE, 0x8231, 0x8B33,
+ 0x39FF, 0x8231, 0x8B34,
+ 0x3A00, 0x8231, 0x8B35,
+ 0x3A01, 0x8231, 0x8B36,
+ 0x3A02, 0x8231, 0x8B37,
+ 0x3A03, 0x8231, 0x8B38,
+ 0x3A04, 0x8231, 0x8B39,
+ 0x3A05, 0x8231, 0x8C30,
+ 0x3A06, 0x8231, 0x8C31,
+ 0x3A07, 0x8231, 0x8C32,
+ 0x3A08, 0x8231, 0x8C33,
+ 0x3A09, 0x8231, 0x8C34,
+ 0x3A0A, 0x8231, 0x8C35,
+ 0x3A0B, 0x8231, 0x8C36,
+ 0x3A0C, 0x8231, 0x8C37,
+ 0x3A0D, 0x8231, 0x8C38,
+ 0x3A0E, 0x8231, 0x8C39,
+ 0x3A0F, 0x8231, 0x8D30,
+ 0x3A10, 0x8231, 0x8D31,
+ 0x3A11, 0x8231, 0x8D32,
+ 0x3A12, 0x8231, 0x8D33,
+ 0x3A13, 0x8231, 0x8D34,
+ 0x3A14, 0x8231, 0x8D35,
+ 0x3A15, 0x8231, 0x8D36,
+ 0x3A16, 0x8231, 0x8D37,
+ 0x3A17, 0x8231, 0x8D38,
+ 0x3A18, 0x8231, 0x8D39,
+ 0x3A19, 0x8231, 0x8E30,
+ 0x3A1A, 0x8231, 0x8E31,
+ 0x3A1B, 0x8231, 0x8E32,
+ 0x3A1C, 0x8231, 0x8E33,
+ 0x3A1D, 0x8231, 0x8E34,
+ 0x3A1E, 0x8231, 0x8E35,
+ 0x3A1F, 0x8231, 0x8E36,
+ 0x3A20, 0x8231, 0x8E37,
+ 0x3A21, 0x8231, 0x8E38,
+ 0x3A22, 0x8231, 0x8E39,
+ 0x3A23, 0x8231, 0x8F30,
+ 0x3A24, 0x8231, 0x8F31,
+ 0x3A25, 0x8231, 0x8F32,
+ 0x3A26, 0x8231, 0x8F33,
+ 0x3A27, 0x8231, 0x8F34,
+ 0x3A28, 0x8231, 0x8F35,
+ 0x3A29, 0x8231, 0x8F36,
+ 0x3A2A, 0x8231, 0x8F37,
+ 0x3A2B, 0x8231, 0x8F38,
+ 0x3A2C, 0x8231, 0x8F39,
+ 0x3A2D, 0x8231, 0x9030,
+ 0x3A2E, 0x8231, 0x9031,
+ 0x3A2F, 0x8231, 0x9032,
+ 0x3A30, 0x8231, 0x9033,
+ 0x3A31, 0x8231, 0x9034,
+ 0x3A32, 0x8231, 0x9035,
+ 0x3A33, 0x8231, 0x9036,
+ 0x3A34, 0x8231, 0x9037,
+ 0x3A35, 0x8231, 0x9038,
+ 0x3A36, 0x8231, 0x9039,
+ 0x3A37, 0x8231, 0x9130,
+ 0x3A38, 0x8231, 0x9131,
+ 0x3A39, 0x8231, 0x9132,
+ 0x3A3A, 0x8231, 0x9133,
+ 0x3A3B, 0x8231, 0x9134,
+ 0x3A3C, 0x8231, 0x9135,
+ 0x3A3D, 0x8231, 0x9136,
+ 0x3A3E, 0x8231, 0x9137,
+ 0x3A3F, 0x8231, 0x9138,
+ 0x3A40, 0x8231, 0x9139,
+ 0x3A41, 0x8231, 0x9230,
+ 0x3A42, 0x8231, 0x9231,
+ 0x3A43, 0x8231, 0x9232,
+ 0x3A44, 0x8231, 0x9233,
+ 0x3A45, 0x8231, 0x9234,
+ 0x3A46, 0x8231, 0x9235,
+ 0x3A47, 0x8231, 0x9236,
+ 0x3A48, 0x8231, 0x9237,
+ 0x3A49, 0x8231, 0x9238,
+ 0x3A4A, 0x8231, 0x9239,
+ 0x3A4B, 0x8231, 0x9330,
+ 0x3A4C, 0x8231, 0x9331,
+ 0x3A4D, 0x8231, 0x9332,
+ 0x3A4E, 0x8231, 0x9333,
+ 0x3A4F, 0x8231, 0x9334,
+ 0x3A50, 0x8231, 0x9335,
+ 0x3A51, 0x8231, 0x9336,
+ 0x3A52, 0x8231, 0x9337,
+ 0x3A53, 0x8231, 0x9338,
+ 0x3A54, 0x8231, 0x9339,
+ 0x3A55, 0x8231, 0x9430,
+ 0x3A56, 0x8231, 0x9431,
+ 0x3A57, 0x8231, 0x9432,
+ 0x3A58, 0x8231, 0x9433,
+ 0x3A59, 0x8231, 0x9434,
+ 0x3A5A, 0x8231, 0x9435,
+ 0x3A5B, 0x8231, 0x9436,
+ 0x3A5C, 0x8231, 0x9437,
+ 0x3A5D, 0x8231, 0x9438,
+ 0x3A5E, 0x8231, 0x9439,
+ 0x3A5F, 0x8231, 0x9530,
+ 0x3A60, 0x8231, 0x9531,
+ 0x3A61, 0x8231, 0x9532,
+ 0x3A62, 0x8231, 0x9533,
+ 0x3A63, 0x8231, 0x9534,
+ 0x3A64, 0x8231, 0x9535,
+ 0x3A65, 0x8231, 0x9536,
+ 0x3A66, 0x8231, 0x9537,
+ 0x3A67, 0x8231, 0x9538,
+ 0x3A68, 0x8231, 0x9539,
+ 0x3A69, 0x8231, 0x9630,
+ 0x3A6A, 0x8231, 0x9631,
+ 0x3A6B, 0x8231, 0x9632,
+ 0x3A6C, 0x8231, 0x9633,
+ 0x3A6D, 0x8231, 0x9634,
+ 0x3A6E, 0x8231, 0x9635,
+ 0x3A6F, 0x8231, 0x9636,
+ 0x3A70, 0x8231, 0x9637,
+ 0x3A71, 0x8231, 0x9638,
+ 0x3A72, 0x8231, 0x9639,
+ 0x3A74, 0x8231, 0x9730,
+ 0x3A75, 0x8231, 0x9731,
+ 0x3A76, 0x8231, 0x9732,
+ 0x3A77, 0x8231, 0x9733,
+ 0x3A78, 0x8231, 0x9734,
+ 0x3A79, 0x8231, 0x9735,
+ 0x3A7A, 0x8231, 0x9736,
+ 0x3A7B, 0x8231, 0x9737,
+ 0x3A7C, 0x8231, 0x9738,
+ 0x3A7D, 0x8231, 0x9739,
+ 0x3A7E, 0x8231, 0x9830,
+ 0x3A7F, 0x8231, 0x9831,
+ 0x3A80, 0x8231, 0x9832,
+ 0x3A81, 0x8231, 0x9833,
+ 0x3A82, 0x8231, 0x9834,
+ 0x3A83, 0x8231, 0x9835,
+ 0x3A84, 0x8231, 0x9836,
+ 0x3A85, 0x8231, 0x9837,
+ 0x3A86, 0x8231, 0x9838,
+ 0x3A87, 0x8231, 0x9839,
+ 0x3A88, 0x8231, 0x9930,
+ 0x3A89, 0x8231, 0x9931,
+ 0x3A8A, 0x8231, 0x9932,
+ 0x3A8B, 0x8231, 0x9933,
+ 0x3A8C, 0x8231, 0x9934,
+ 0x3A8D, 0x8231, 0x9935,
+ 0x3A8E, 0x8231, 0x9936,
+ 0x3A8F, 0x8231, 0x9937,
+ 0x3A90, 0x8231, 0x9938,
+ 0x3A91, 0x8231, 0x9939,
+ 0x3A92, 0x8231, 0x9A30,
+ 0x3A93, 0x8231, 0x9A31,
+ 0x3A94, 0x8231, 0x9A32,
+ 0x3A95, 0x8231, 0x9A33,
+ 0x3A96, 0x8231, 0x9A34,
+ 0x3A97, 0x8231, 0x9A35,
+ 0x3A98, 0x8231, 0x9A36,
+ 0x3A99, 0x8231, 0x9A37,
+ 0x3A9A, 0x8231, 0x9A38,
+ 0x3A9B, 0x8231, 0x9A39,
+ 0x3A9C, 0x8231, 0x9B30,
+ 0x3A9D, 0x8231, 0x9B31,
+ 0x3A9E, 0x8231, 0x9B32,
+ 0x3A9F, 0x8231, 0x9B33,
+ 0x3AA0, 0x8231, 0x9B34,
+ 0x3AA1, 0x8231, 0x9B35,
+ 0x3AA2, 0x8231, 0x9B36,
+ 0x3AA3, 0x8231, 0x9B37,
+ 0x3AA4, 0x8231, 0x9B38,
+ 0x3AA5, 0x8231, 0x9B39,
+ 0x3AA6, 0x8231, 0x9C30,
+ 0x3AA7, 0x8231, 0x9C31,
+ 0x3AA8, 0x8231, 0x9C32,
+ 0x3AA9, 0x8231, 0x9C33,
+ 0x3AAA, 0x8231, 0x9C34,
+ 0x3AAB, 0x8231, 0x9C35,
+ 0x3AAC, 0x8231, 0x9C36,
+ 0x3AAD, 0x8231, 0x9C37,
+ 0x3AAE, 0x8231, 0x9C38,
+ 0x3AAF, 0x8231, 0x9C39,
+ 0x3AB0, 0x8231, 0x9D30,
+ 0x3AB1, 0x8231, 0x9D31,
+ 0x3AB2, 0x8231, 0x9D32,
+ 0x3AB3, 0x8231, 0x9D33,
+ 0x3AB4, 0x8231, 0x9D34,
+ 0x3AB5, 0x8231, 0x9D35,
+ 0x3AB6, 0x8231, 0x9D36,
+ 0x3AB7, 0x8231, 0x9D37,
+ 0x3AB8, 0x8231, 0x9D38,
+ 0x3AB9, 0x8231, 0x9D39,
+ 0x3ABA, 0x8231, 0x9E30,
+ 0x3ABB, 0x8231, 0x9E31,
+ 0x3ABC, 0x8231, 0x9E32,
+ 0x3ABD, 0x8231, 0x9E33,
+ 0x3ABE, 0x8231, 0x9E34,
+ 0x3ABF, 0x8231, 0x9E35,
+ 0x3AC0, 0x8231, 0x9E36,
+ 0x3AC1, 0x8231, 0x9E37,
+ 0x3AC2, 0x8231, 0x9E38,
+ 0x3AC3, 0x8231, 0x9E39,
+ 0x3AC4, 0x8231, 0x9F30,
+ 0x3AC5, 0x8231, 0x9F31,
+ 0x3AC6, 0x8231, 0x9F32,
+ 0x3AC7, 0x8231, 0x9F33,
+ 0x3AC8, 0x8231, 0x9F34,
+ 0x3AC9, 0x8231, 0x9F35,
+ 0x3ACA, 0x8231, 0x9F36,
+ 0x3ACB, 0x8231, 0x9F37,
+ 0x3ACC, 0x8231, 0x9F38,
+ 0x3ACD, 0x8231, 0x9F39,
+ 0x3ACE, 0x8231, 0xA030,
+ 0x3ACF, 0x8231, 0xA031,
+ 0x3AD0, 0x8231, 0xA032,
+ 0x3AD1, 0x8231, 0xA033,
+ 0x3AD2, 0x8231, 0xA034,
+ 0x3AD3, 0x8231, 0xA035,
+ 0x3AD4, 0x8231, 0xA036,
+ 0x3AD5, 0x8231, 0xA037,
+ 0x3AD6, 0x8231, 0xA038,
+ 0x3AD7, 0x8231, 0xA039,
+ 0x3AD8, 0x8231, 0xA130,
+ 0x3AD9, 0x8231, 0xA131,
+ 0x3ADA, 0x8231, 0xA132,
+ 0x3ADB, 0x8231, 0xA133,
+ 0x3ADC, 0x8231, 0xA134,
+ 0x3ADD, 0x8231, 0xA135,
+ 0x3ADE, 0x8231, 0xA136,
+ 0x3ADF, 0x8231, 0xA137,
+ 0x3AE0, 0x8231, 0xA138,
+ 0x3AE1, 0x8231, 0xA139,
+ 0x3AE2, 0x8231, 0xA230,
+ 0x3AE3, 0x8231, 0xA231,
+ 0x3AE4, 0x8231, 0xA232,
+ 0x3AE5, 0x8231, 0xA233,
+ 0x3AE6, 0x8231, 0xA234,
+ 0x3AE7, 0x8231, 0xA235,
+ 0x3AE8, 0x8231, 0xA236,
+ 0x3AE9, 0x8231, 0xA237,
+ 0x3AEA, 0x8231, 0xA238,
+ 0x3AEB, 0x8231, 0xA239,
+ 0x3AEC, 0x8231, 0xA330,
+ 0x3AED, 0x8231, 0xA331,
+ 0x3AEE, 0x8231, 0xA332,
+ 0x3AEF, 0x8231, 0xA333,
+ 0x3AF0, 0x8231, 0xA334,
+ 0x3AF1, 0x8231, 0xA335,
+ 0x3AF2, 0x8231, 0xA336,
+ 0x3AF3, 0x8231, 0xA337,
+ 0x3AF4, 0x8231, 0xA338,
+ 0x3AF5, 0x8231, 0xA339,
+ 0x3AF6, 0x8231, 0xA430,
+ 0x3AF7, 0x8231, 0xA431,
+ 0x3AF8, 0x8231, 0xA432,
+ 0x3AF9, 0x8231, 0xA433,
+ 0x3AFA, 0x8231, 0xA434,
+ 0x3AFB, 0x8231, 0xA435,
+ 0x3AFC, 0x8231, 0xA436,
+ 0x3AFD, 0x8231, 0xA437,
+ 0x3AFE, 0x8231, 0xA438,
+ 0x3AFF, 0x8231, 0xA439,
+ 0x3B00, 0x8231, 0xA530,
+ 0x3B01, 0x8231, 0xA531,
+ 0x3B02, 0x8231, 0xA532,
+ 0x3B03, 0x8231, 0xA533,
+ 0x3B04, 0x8231, 0xA534,
+ 0x3B05, 0x8231, 0xA535,
+ 0x3B06, 0x8231, 0xA536,
+ 0x3B07, 0x8231, 0xA537,
+ 0x3B08, 0x8231, 0xA538,
+ 0x3B09, 0x8231, 0xA539,
+ 0x3B0A, 0x8231, 0xA630,
+ 0x3B0B, 0x8231, 0xA631,
+ 0x3B0C, 0x8231, 0xA632,
+ 0x3B0D, 0x8231, 0xA633,
+ 0x3B0E, 0x8231, 0xA634,
+ 0x3B0F, 0x8231, 0xA635,
+ 0x3B10, 0x8231, 0xA636,
+ 0x3B11, 0x8231, 0xA637,
+ 0x3B12, 0x8231, 0xA638,
+ 0x3B13, 0x8231, 0xA639,
+ 0x3B14, 0x8231, 0xA730,
+ 0x3B15, 0x8231, 0xA731,
+ 0x3B16, 0x8231, 0xA732,
+ 0x3B17, 0x8231, 0xA733,
+ 0x3B18, 0x8231, 0xA734,
+ 0x3B19, 0x8231, 0xA735,
+ 0x3B1A, 0x8231, 0xA736,
+ 0x3B1B, 0x8231, 0xA737,
+ 0x3B1C, 0x8231, 0xA738,
+ 0x3B1D, 0x8231, 0xA739,
+ 0x3B1E, 0x8231, 0xA830,
+ 0x3B1F, 0x8231, 0xA831,
+ 0x3B20, 0x8231, 0xA832,
+ 0x3B21, 0x8231, 0xA833,
+ 0x3B22, 0x8231, 0xA834,
+ 0x3B23, 0x8231, 0xA835,
+ 0x3B24, 0x8231, 0xA836,
+ 0x3B25, 0x8231, 0xA837,
+ 0x3B26, 0x8231, 0xA838,
+ 0x3B27, 0x8231, 0xA839,
+ 0x3B28, 0x8231, 0xA930,
+ 0x3B29, 0x8231, 0xA931,
+ 0x3B2A, 0x8231, 0xA932,
+ 0x3B2B, 0x8231, 0xA933,
+ 0x3B2C, 0x8231, 0xA934,
+ 0x3B2D, 0x8231, 0xA935,
+ 0x3B2E, 0x8231, 0xA936,
+ 0x3B2F, 0x8231, 0xA937,
+ 0x3B30, 0x8231, 0xA938,
+ 0x3B31, 0x8231, 0xA939,
+ 0x3B32, 0x8231, 0xAA30,
+ 0x3B33, 0x8231, 0xAA31,
+ 0x3B34, 0x8231, 0xAA32,
+ 0x3B35, 0x8231, 0xAA33,
+ 0x3B36, 0x8231, 0xAA34,
+ 0x3B37, 0x8231, 0xAA35,
+ 0x3B38, 0x8231, 0xAA36,
+ 0x3B39, 0x8231, 0xAA37,
+ 0x3B3A, 0x8231, 0xAA38,
+ 0x3B3B, 0x8231, 0xAA39,
+ 0x3B3C, 0x8231, 0xAB30,
+ 0x3B3D, 0x8231, 0xAB31,
+ 0x3B3E, 0x8231, 0xAB32,
+ 0x3B3F, 0x8231, 0xAB33,
+ 0x3B40, 0x8231, 0xAB34,
+ 0x3B41, 0x8231, 0xAB35,
+ 0x3B42, 0x8231, 0xAB36,
+ 0x3B43, 0x8231, 0xAB37,
+ 0x3B44, 0x8231, 0xAB38,
+ 0x3B45, 0x8231, 0xAB39,
+ 0x3B46, 0x8231, 0xAC30,
+ 0x3B47, 0x8231, 0xAC31,
+ 0x3B48, 0x8231, 0xAC32,
+ 0x3B49, 0x8231, 0xAC33,
+ 0x3B4A, 0x8231, 0xAC34,
+ 0x3B4B, 0x8231, 0xAC35,
+ 0x3B4C, 0x8231, 0xAC36,
+ 0x3B4D, 0x8231, 0xAC37,
+ 0x3B4F, 0x8231, 0xAC38,
+ 0x3B50, 0x8231, 0xAC39,
+ 0x3B51, 0x8231, 0xAD30,
+ 0x3B52, 0x8231, 0xAD31,
+ 0x3B53, 0x8231, 0xAD32,
+ 0x3B54, 0x8231, 0xAD33,
+ 0x3B55, 0x8231, 0xAD34,
+ 0x3B56, 0x8231, 0xAD35,
+ 0x3B57, 0x8231, 0xAD36,
+ 0x3B58, 0x8231, 0xAD37,
+ 0x3B59, 0x8231, 0xAD38,
+ 0x3B5A, 0x8231, 0xAD39,
+ 0x3B5B, 0x8231, 0xAE30,
+ 0x3B5C, 0x8231, 0xAE31,
+ 0x3B5D, 0x8231, 0xAE32,
+ 0x3B5E, 0x8231, 0xAE33,
+ 0x3B5F, 0x8231, 0xAE34,
+ 0x3B60, 0x8231, 0xAE35,
+ 0x3B61, 0x8231, 0xAE36,
+ 0x3B62, 0x8231, 0xAE37,
+ 0x3B63, 0x8231, 0xAE38,
+ 0x3B64, 0x8231, 0xAE39,
+ 0x3B65, 0x8231, 0xAF30,
+ 0x3B66, 0x8231, 0xAF31,
+ 0x3B67, 0x8231, 0xAF32,
+ 0x3B68, 0x8231, 0xAF33,
+ 0x3B69, 0x8231, 0xAF34,
+ 0x3B6A, 0x8231, 0xAF35,
+ 0x3B6B, 0x8231, 0xAF36,
+ 0x3B6C, 0x8231, 0xAF37,
+ 0x3B6D, 0x8231, 0xAF38,
+ 0x3B6E, 0x8231, 0xAF39,
+ 0x3B6F, 0x8231, 0xB030,
+ 0x3B70, 0x8231, 0xB031,
+ 0x3B71, 0x8231, 0xB032,
+ 0x3B72, 0x8231, 0xB033,
+ 0x3B73, 0x8231, 0xB034,
+ 0x3B74, 0x8231, 0xB035,
+ 0x3B75, 0x8231, 0xB036,
+ 0x3B76, 0x8231, 0xB037,
+ 0x3B77, 0x8231, 0xB038,
+ 0x3B78, 0x8231, 0xB039,
+ 0x3B79, 0x8231, 0xB130,
+ 0x3B7A, 0x8231, 0xB131,
+ 0x3B7B, 0x8231, 0xB132,
+ 0x3B7C, 0x8231, 0xB133,
+ 0x3B7D, 0x8231, 0xB134,
+ 0x3B7E, 0x8231, 0xB135,
+ 0x3B7F, 0x8231, 0xB136,
+ 0x3B80, 0x8231, 0xB137,
+ 0x3B81, 0x8231, 0xB138,
+ 0x3B82, 0x8231, 0xB139,
+ 0x3B83, 0x8231, 0xB230,
+ 0x3B84, 0x8231, 0xB231,
+ 0x3B85, 0x8231, 0xB232,
+ 0x3B86, 0x8231, 0xB233,
+ 0x3B87, 0x8231, 0xB234,
+ 0x3B88, 0x8231, 0xB235,
+ 0x3B89, 0x8231, 0xB236,
+ 0x3B8A, 0x8231, 0xB237,
+ 0x3B8B, 0x8231, 0xB238,
+ 0x3B8C, 0x8231, 0xB239,
+ 0x3B8D, 0x8231, 0xB330,
+ 0x3B8E, 0x8231, 0xB331,
+ 0x3B8F, 0x8231, 0xB332,
+ 0x3B90, 0x8231, 0xB333,
+ 0x3B91, 0x8231, 0xB334,
+ 0x3B92, 0x8231, 0xB335,
+ 0x3B93, 0x8231, 0xB336,
+ 0x3B94, 0x8231, 0xB337,
+ 0x3B95, 0x8231, 0xB338,
+ 0x3B96, 0x8231, 0xB339,
+ 0x3B97, 0x8231, 0xB430,
+ 0x3B98, 0x8231, 0xB431,
+ 0x3B99, 0x8231, 0xB432,
+ 0x3B9A, 0x8231, 0xB433,
+ 0x3B9B, 0x8231, 0xB434,
+ 0x3B9C, 0x8231, 0xB435,
+ 0x3B9D, 0x8231, 0xB436,
+ 0x3B9E, 0x8231, 0xB437,
+ 0x3B9F, 0x8231, 0xB438,
+ 0x3BA0, 0x8231, 0xB439,
+ 0x3BA1, 0x8231, 0xB530,
+ 0x3BA2, 0x8231, 0xB531,
+ 0x3BA3, 0x8231, 0xB532,
+ 0x3BA4, 0x8231, 0xB533,
+ 0x3BA5, 0x8231, 0xB534,
+ 0x3BA6, 0x8231, 0xB535,
+ 0x3BA7, 0x8231, 0xB536,
+ 0x3BA8, 0x8231, 0xB537,
+ 0x3BA9, 0x8231, 0xB538,
+ 0x3BAA, 0x8231, 0xB539,
+ 0x3BAB, 0x8231, 0xB630,
+ 0x3BAC, 0x8231, 0xB631,
+ 0x3BAD, 0x8231, 0xB632,
+ 0x3BAE, 0x8231, 0xB633,
+ 0x3BAF, 0x8231, 0xB634,
+ 0x3BB0, 0x8231, 0xB635,
+ 0x3BB1, 0x8231, 0xB636,
+ 0x3BB2, 0x8231, 0xB637,
+ 0x3BB3, 0x8231, 0xB638,
+ 0x3BB4, 0x8231, 0xB639,
+ 0x3BB5, 0x8231, 0xB730,
+ 0x3BB6, 0x8231, 0xB731,
+ 0x3BB7, 0x8231, 0xB732,
+ 0x3BB8, 0x8231, 0xB733,
+ 0x3BB9, 0x8231, 0xB734,
+ 0x3BBA, 0x8231, 0xB735,
+ 0x3BBB, 0x8231, 0xB736,
+ 0x3BBC, 0x8231, 0xB737,
+ 0x3BBD, 0x8231, 0xB738,
+ 0x3BBE, 0x8231, 0xB739,
+ 0x3BBF, 0x8231, 0xB830,
+ 0x3BC0, 0x8231, 0xB831,
+ 0x3BC1, 0x8231, 0xB832,
+ 0x3BC2, 0x8231, 0xB833,
+ 0x3BC3, 0x8231, 0xB834,
+ 0x3BC4, 0x8231, 0xB835,
+ 0x3BC5, 0x8231, 0xB836,
+ 0x3BC6, 0x8231, 0xB837,
+ 0x3BC7, 0x8231, 0xB838,
+ 0x3BC8, 0x8231, 0xB839,
+ 0x3BC9, 0x8231, 0xB930,
+ 0x3BCA, 0x8231, 0xB931,
+ 0x3BCB, 0x8231, 0xB932,
+ 0x3BCC, 0x8231, 0xB933,
+ 0x3BCD, 0x8231, 0xB934,
+ 0x3BCE, 0x8231, 0xB935,
+ 0x3BCF, 0x8231, 0xB936,
+ 0x3BD0, 0x8231, 0xB937,
+ 0x3BD1, 0x8231, 0xB938,
+ 0x3BD2, 0x8231, 0xB939,
+ 0x3BD3, 0x8231, 0xBA30,
+ 0x3BD4, 0x8231, 0xBA31,
+ 0x3BD5, 0x8231, 0xBA32,
+ 0x3BD6, 0x8231, 0xBA33,
+ 0x3BD7, 0x8231, 0xBA34,
+ 0x3BD8, 0x8231, 0xBA35,
+ 0x3BD9, 0x8231, 0xBA36,
+ 0x3BDA, 0x8231, 0xBA37,
+ 0x3BDB, 0x8231, 0xBA38,
+ 0x3BDC, 0x8231, 0xBA39,
+ 0x3BDD, 0x8231, 0xBB30,
+ 0x3BDE, 0x8231, 0xBB31,
+ 0x3BDF, 0x8231, 0xBB32,
+ 0x3BE0, 0x8231, 0xBB33,
+ 0x3BE1, 0x8231, 0xBB34,
+ 0x3BE2, 0x8231, 0xBB35,
+ 0x3BE3, 0x8231, 0xBB36,
+ 0x3BE4, 0x8231, 0xBB37,
+ 0x3BE5, 0x8231, 0xBB38,
+ 0x3BE6, 0x8231, 0xBB39,
+ 0x3BE7, 0x8231, 0xBC30,
+ 0x3BE8, 0x8231, 0xBC31,
+ 0x3BE9, 0x8231, 0xBC32,
+ 0x3BEA, 0x8231, 0xBC33,
+ 0x3BEB, 0x8231, 0xBC34,
+ 0x3BEC, 0x8231, 0xBC35,
+ 0x3BED, 0x8231, 0xBC36,
+ 0x3BEE, 0x8231, 0xBC37,
+ 0x3BEF, 0x8231, 0xBC38,
+ 0x3BF0, 0x8231, 0xBC39,
+ 0x3BF1, 0x8231, 0xBD30,
+ 0x3BF2, 0x8231, 0xBD31,
+ 0x3BF3, 0x8231, 0xBD32,
+ 0x3BF4, 0x8231, 0xBD33,
+ 0x3BF5, 0x8231, 0xBD34,
+ 0x3BF6, 0x8231, 0xBD35,
+ 0x3BF7, 0x8231, 0xBD36,
+ 0x3BF8, 0x8231, 0xBD37,
+ 0x3BF9, 0x8231, 0xBD38,
+ 0x3BFA, 0x8231, 0xBD39,
+ 0x3BFB, 0x8231, 0xBE30,
+ 0x3BFC, 0x8231, 0xBE31,
+ 0x3BFD, 0x8231, 0xBE32,
+ 0x3BFE, 0x8231, 0xBE33,
+ 0x3BFF, 0x8231, 0xBE34,
+ 0x3C00, 0x8231, 0xBE35,
+ 0x3C01, 0x8231, 0xBE36,
+ 0x3C02, 0x8231, 0xBE37,
+ 0x3C03, 0x8231, 0xBE38,
+ 0x3C04, 0x8231, 0xBE39,
+ 0x3C05, 0x8231, 0xBF30,
+ 0x3C06, 0x8231, 0xBF31,
+ 0x3C07, 0x8231, 0xBF32,
+ 0x3C08, 0x8231, 0xBF33,
+ 0x3C09, 0x8231, 0xBF34,
+ 0x3C0A, 0x8231, 0xBF35,
+ 0x3C0B, 0x8231, 0xBF36,
+ 0x3C0C, 0x8231, 0xBF37,
+ 0x3C0D, 0x8231, 0xBF38,
+ 0x3C0E, 0x8231, 0xBF39,
+ 0x3C0F, 0x8231, 0xC030,
+ 0x3C10, 0x8231, 0xC031,
+ 0x3C11, 0x8231, 0xC032,
+ 0x3C12, 0x8231, 0xC033,
+ 0x3C13, 0x8231, 0xC034,
+ 0x3C14, 0x8231, 0xC035,
+ 0x3C15, 0x8231, 0xC036,
+ 0x3C16, 0x8231, 0xC037,
+ 0x3C17, 0x8231, 0xC038,
+ 0x3C18, 0x8231, 0xC039,
+ 0x3C19, 0x8231, 0xC130,
+ 0x3C1A, 0x8231, 0xC131,
+ 0x3C1B, 0x8231, 0xC132,
+ 0x3C1C, 0x8231, 0xC133,
+ 0x3C1D, 0x8231, 0xC134,
+ 0x3C1E, 0x8231, 0xC135,
+ 0x3C1F, 0x8231, 0xC136,
+ 0x3C20, 0x8231, 0xC137,
+ 0x3C21, 0x8231, 0xC138,
+ 0x3C22, 0x8231, 0xC139,
+ 0x3C23, 0x8231, 0xC230,
+ 0x3C24, 0x8231, 0xC231,
+ 0x3C25, 0x8231, 0xC232,
+ 0x3C26, 0x8231, 0xC233,
+ 0x3C27, 0x8231, 0xC234,
+ 0x3C28, 0x8231, 0xC235,
+ 0x3C29, 0x8231, 0xC236,
+ 0x3C2A, 0x8231, 0xC237,
+ 0x3C2B, 0x8231, 0xC238,
+ 0x3C2C, 0x8231, 0xC239,
+ 0x3C2D, 0x8231, 0xC330,
+ 0x3C2E, 0x8231, 0xC331,
+ 0x3C2F, 0x8231, 0xC332,
+ 0x3C30, 0x8231, 0xC333,
+ 0x3C31, 0x8231, 0xC334,
+ 0x3C32, 0x8231, 0xC335,
+ 0x3C33, 0x8231, 0xC336,
+ 0x3C34, 0x8231, 0xC337,
+ 0x3C35, 0x8231, 0xC338,
+ 0x3C36, 0x8231, 0xC339,
+ 0x3C37, 0x8231, 0xC430,
+ 0x3C38, 0x8231, 0xC431,
+ 0x3C39, 0x8231, 0xC432,
+ 0x3C3A, 0x8231, 0xC433,
+ 0x3C3B, 0x8231, 0xC434,
+ 0x3C3C, 0x8231, 0xC435,
+ 0x3C3D, 0x8231, 0xC436,
+ 0x3C3E, 0x8231, 0xC437,
+ 0x3C3F, 0x8231, 0xC438,
+ 0x3C40, 0x8231, 0xC439,
+ 0x3C41, 0x8231, 0xC530,
+ 0x3C42, 0x8231, 0xC531,
+ 0x3C43, 0x8231, 0xC532,
+ 0x3C44, 0x8231, 0xC533,
+ 0x3C45, 0x8231, 0xC534,
+ 0x3C46, 0x8231, 0xC535,
+ 0x3C47, 0x8231, 0xC536,
+ 0x3C48, 0x8231, 0xC537,
+ 0x3C49, 0x8231, 0xC538,
+ 0x3C4A, 0x8231, 0xC539,
+ 0x3C4B, 0x8231, 0xC630,
+ 0x3C4C, 0x8231, 0xC631,
+ 0x3C4D, 0x8231, 0xC632,
+ 0x3C4E, 0x8231, 0xC633,
+ 0x3C4F, 0x8231, 0xC634,
+ 0x3C50, 0x8231, 0xC635,
+ 0x3C51, 0x8231, 0xC636,
+ 0x3C52, 0x8231, 0xC637,
+ 0x3C53, 0x8231, 0xC638,
+ 0x3C54, 0x8231, 0xC639,
+ 0x3C55, 0x8231, 0xC730,
+ 0x3C56, 0x8231, 0xC731,
+ 0x3C57, 0x8231, 0xC732,
+ 0x3C58, 0x8231, 0xC733,
+ 0x3C59, 0x8231, 0xC734,
+ 0x3C5A, 0x8231, 0xC735,
+ 0x3C5B, 0x8231, 0xC736,
+ 0x3C5C, 0x8231, 0xC737,
+ 0x3C5D, 0x8231, 0xC738,
+ 0x3C5E, 0x8231, 0xC739,
+ 0x3C5F, 0x8231, 0xC830,
+ 0x3C60, 0x8231, 0xC831,
+ 0x3C61, 0x8231, 0xC832,
+ 0x3C62, 0x8231, 0xC833,
+ 0x3C63, 0x8231, 0xC834,
+ 0x3C64, 0x8231, 0xC835,
+ 0x3C65, 0x8231, 0xC836,
+ 0x3C66, 0x8231, 0xC837,
+ 0x3C67, 0x8231, 0xC838,
+ 0x3C68, 0x8231, 0xC839,
+ 0x3C69, 0x8231, 0xC930,
+ 0x3C6A, 0x8231, 0xC931,
+ 0x3C6B, 0x8231, 0xC932,
+ 0x3C6C, 0x8231, 0xC933,
+ 0x3C6D, 0x8231, 0xC934,
+ 0x3C6F, 0x8231, 0xC935,
+ 0x3C70, 0x8231, 0xC936,
+ 0x3C71, 0x8231, 0xC937,
+ 0x3C72, 0x8231, 0xC938,
+ 0x3C73, 0x8231, 0xC939,
+ 0x3C74, 0x8231, 0xCA30,
+ 0x3C75, 0x8231, 0xCA31,
+ 0x3C76, 0x8231, 0xCA32,
+ 0x3C77, 0x8231, 0xCA33,
+ 0x3C78, 0x8231, 0xCA34,
+ 0x3C79, 0x8231, 0xCA35,
+ 0x3C7A, 0x8231, 0xCA36,
+ 0x3C7B, 0x8231, 0xCA37,
+ 0x3C7C, 0x8231, 0xCA38,
+ 0x3C7D, 0x8231, 0xCA39,
+ 0x3C7E, 0x8231, 0xCB30,
+ 0x3C7F, 0x8231, 0xCB31,
+ 0x3C80, 0x8231, 0xCB32,
+ 0x3C81, 0x8231, 0xCB33,
+ 0x3C82, 0x8231, 0xCB34,
+ 0x3C83, 0x8231, 0xCB35,
+ 0x3C84, 0x8231, 0xCB36,
+ 0x3C85, 0x8231, 0xCB37,
+ 0x3C86, 0x8231, 0xCB38,
+ 0x3C87, 0x8231, 0xCB39,
+ 0x3C88, 0x8231, 0xCC30,
+ 0x3C89, 0x8231, 0xCC31,
+ 0x3C8A, 0x8231, 0xCC32,
+ 0x3C8B, 0x8231, 0xCC33,
+ 0x3C8C, 0x8231, 0xCC34,
+ 0x3C8D, 0x8231, 0xCC35,
+ 0x3C8E, 0x8231, 0xCC36,
+ 0x3C8F, 0x8231, 0xCC37,
+ 0x3C90, 0x8231, 0xCC38,
+ 0x3C91, 0x8231, 0xCC39,
+ 0x3C92, 0x8231, 0xCD30,
+ 0x3C93, 0x8231, 0xCD31,
+ 0x3C94, 0x8231, 0xCD32,
+ 0x3C95, 0x8231, 0xCD33,
+ 0x3C96, 0x8231, 0xCD34,
+ 0x3C97, 0x8231, 0xCD35,
+ 0x3C98, 0x8231, 0xCD36,
+ 0x3C99, 0x8231, 0xCD37,
+ 0x3C9A, 0x8231, 0xCD38,
+ 0x3C9B, 0x8231, 0xCD39,
+ 0x3C9C, 0x8231, 0xCE30,
+ 0x3C9D, 0x8231, 0xCE31,
+ 0x3C9E, 0x8231, 0xCE32,
+ 0x3C9F, 0x8231, 0xCE33,
+ 0x3CA0, 0x8231, 0xCE34,
+ 0x3CA1, 0x8231, 0xCE35,
+ 0x3CA2, 0x8231, 0xCE36,
+ 0x3CA3, 0x8231, 0xCE37,
+ 0x3CA4, 0x8231, 0xCE38,
+ 0x3CA5, 0x8231, 0xCE39,
+ 0x3CA6, 0x8231, 0xCF30,
+ 0x3CA7, 0x8231, 0xCF31,
+ 0x3CA8, 0x8231, 0xCF32,
+ 0x3CA9, 0x8231, 0xCF33,
+ 0x3CAA, 0x8231, 0xCF34,
+ 0x3CAB, 0x8231, 0xCF35,
+ 0x3CAC, 0x8231, 0xCF36,
+ 0x3CAD, 0x8231, 0xCF37,
+ 0x3CAE, 0x8231, 0xCF38,
+ 0x3CAF, 0x8231, 0xCF39,
+ 0x3CB0, 0x8231, 0xD030,
+ 0x3CB1, 0x8231, 0xD031,
+ 0x3CB2, 0x8231, 0xD032,
+ 0x3CB3, 0x8231, 0xD033,
+ 0x3CB4, 0x8231, 0xD034,
+ 0x3CB5, 0x8231, 0xD035,
+ 0x3CB6, 0x8231, 0xD036,
+ 0x3CB7, 0x8231, 0xD037,
+ 0x3CB8, 0x8231, 0xD038,
+ 0x3CB9, 0x8231, 0xD039,
+ 0x3CBA, 0x8231, 0xD130,
+ 0x3CBB, 0x8231, 0xD131,
+ 0x3CBC, 0x8231, 0xD132,
+ 0x3CBD, 0x8231, 0xD133,
+ 0x3CBE, 0x8231, 0xD134,
+ 0x3CBF, 0x8231, 0xD135,
+ 0x3CC0, 0x8231, 0xD136,
+ 0x3CC1, 0x8231, 0xD137,
+ 0x3CC2, 0x8231, 0xD138,
+ 0x3CC3, 0x8231, 0xD139,
+ 0x3CC4, 0x8231, 0xD230,
+ 0x3CC5, 0x8231, 0xD231,
+ 0x3CC6, 0x8231, 0xD232,
+ 0x3CC7, 0x8231, 0xD233,
+ 0x3CC8, 0x8231, 0xD234,
+ 0x3CC9, 0x8231, 0xD235,
+ 0x3CCA, 0x8231, 0xD236,
+ 0x3CCB, 0x8231, 0xD237,
+ 0x3CCC, 0x8231, 0xD238,
+ 0x3CCD, 0x8231, 0xD239,
+ 0x3CCE, 0x8231, 0xD330,
+ 0x3CCF, 0x8231, 0xD331,
+ 0x3CD0, 0x8231, 0xD332,
+ 0x3CD1, 0x8231, 0xD333,
+ 0x3CD2, 0x8231, 0xD334,
+ 0x3CD3, 0x8231, 0xD335,
+ 0x3CD4, 0x8231, 0xD336,
+ 0x3CD5, 0x8231, 0xD337,
+ 0x3CD6, 0x8231, 0xD338,
+ 0x3CD7, 0x8231, 0xD339,
+ 0x3CD8, 0x8231, 0xD430,
+ 0x3CD9, 0x8231, 0xD431,
+ 0x3CDA, 0x8231, 0xD432,
+ 0x3CDB, 0x8231, 0xD433,
+ 0x3CDC, 0x8231, 0xD434,
+ 0x3CDD, 0x8231, 0xD435,
+ 0x3CDE, 0x8231, 0xD436,
+ 0x3CDF, 0x8231, 0xD437,
+ 0x4057, 0x8232, 0xAF33,
+ 0x4058, 0x8232, 0xAF34,
+ 0x4059, 0x8232, 0xAF35,
+ 0x405A, 0x8232, 0xAF36,
+ 0x405B, 0x8232, 0xAF37,
+ 0x405C, 0x8232, 0xAF38,
+ 0x405D, 0x8232, 0xAF39,
+ 0x405E, 0x8232, 0xB030,
+ 0x405F, 0x8232, 0xB031,
+ 0x4060, 0x8232, 0xB032,
+ 0x4061, 0x8232, 0xB033,
+ 0x4062, 0x8232, 0xB034,
+ 0x4063, 0x8232, 0xB035,
+ 0x4064, 0x8232, 0xB036,
+ 0x4065, 0x8232, 0xB037,
+ 0x4066, 0x8232, 0xB038,
+ 0x4067, 0x8232, 0xB039,
+ 0x4068, 0x8232, 0xB130,
+ 0x4069, 0x8232, 0xB131,
+ 0x406A, 0x8232, 0xB132,
+ 0x406B, 0x8232, 0xB133,
+ 0x406C, 0x8232, 0xB134,
+ 0x406D, 0x8232, 0xB135,
+ 0x406E, 0x8232, 0xB136,
+ 0x406F, 0x8232, 0xB137,
+ 0x4070, 0x8232, 0xB138,
+ 0x4071, 0x8232, 0xB139,
+ 0x4072, 0x8232, 0xB230,
+ 0x4073, 0x8232, 0xB231,
+ 0x4074, 0x8232, 0xB232,
+ 0x4075, 0x8232, 0xB233,
+ 0x4076, 0x8232, 0xB234,
+ 0x4077, 0x8232, 0xB235,
+ 0x4078, 0x8232, 0xB236,
+ 0x4079, 0x8232, 0xB237,
+ 0x407A, 0x8232, 0xB238,
+ 0x407B, 0x8232, 0xB239,
+ 0x407C, 0x8232, 0xB330,
+ 0x407D, 0x8232, 0xB331,
+ 0x407E, 0x8232, 0xB332,
+ 0x407F, 0x8232, 0xB333,
+ 0x4080, 0x8232, 0xB334,
+ 0x4081, 0x8232, 0xB335,
+ 0x4082, 0x8232, 0xB336,
+ 0x4083, 0x8232, 0xB337,
+ 0x4084, 0x8232, 0xB338,
+ 0x4085, 0x8232, 0xB339,
+ 0x4086, 0x8232, 0xB430,
+ 0x4087, 0x8232, 0xB431,
+ 0x4088, 0x8232, 0xB432,
+ 0x4089, 0x8232, 0xB433,
+ 0x408A, 0x8232, 0xB434,
+ 0x408B, 0x8232, 0xB435,
+ 0x408C, 0x8232, 0xB436,
+ 0x408D, 0x8232, 0xB437,
+ 0x408E, 0x8232, 0xB438,
+ 0x408F, 0x8232, 0xB439,
+ 0x4090, 0x8232, 0xB530,
+ 0x4091, 0x8232, 0xB531,
+ 0x4092, 0x8232, 0xB532,
+ 0x4093, 0x8232, 0xB533,
+ 0x4094, 0x8232, 0xB534,
+ 0x4095, 0x8232, 0xB535,
+ 0x4096, 0x8232, 0xB536,
+ 0x4097, 0x8232, 0xB537,
+ 0x4098, 0x8232, 0xB538,
+ 0x4099, 0x8232, 0xB539,
+ 0x409A, 0x8232, 0xB630,
+ 0x409B, 0x8232, 0xB631,
+ 0x409C, 0x8232, 0xB632,
+ 0x409D, 0x8232, 0xB633,
+ 0x409E, 0x8232, 0xB634,
+ 0x409F, 0x8232, 0xB635,
+ 0x40A0, 0x8232, 0xB636,
+ 0x40A1, 0x8232, 0xB637,
+ 0x40A2, 0x8232, 0xB638,
+ 0x40A3, 0x8232, 0xB639,
+ 0x40A4, 0x8232, 0xB730,
+ 0x40A5, 0x8232, 0xB731,
+ 0x40A6, 0x8232, 0xB732,
+ 0x40A7, 0x8232, 0xB733,
+ 0x40A8, 0x8232, 0xB734,
+ 0x40A9, 0x8232, 0xB735,
+ 0x40AA, 0x8232, 0xB736,
+ 0x40AB, 0x8232, 0xB737,
+ 0x40AC, 0x8232, 0xB738,
+ 0x40AD, 0x8232, 0xB739,
+ 0x40AE, 0x8232, 0xB830,
+ 0x40AF, 0x8232, 0xB831,
+ 0x40B0, 0x8232, 0xB832,
+ 0x40B1, 0x8232, 0xB833,
+ 0x40B2, 0x8232, 0xB834,
+ 0x40B3, 0x8232, 0xB835,
+ 0x40B4, 0x8232, 0xB836,
+ 0x40B5, 0x8232, 0xB837,
+ 0x40B6, 0x8232, 0xB838,
+ 0x40B7, 0x8232, 0xB839,
+ 0x40B8, 0x8232, 0xB930,
+ 0x40B9, 0x8232, 0xB931,
+ 0x40BA, 0x8232, 0xB932,
+ 0x40BB, 0x8232, 0xB933,
+ 0x40BC, 0x8232, 0xB934,
+ 0x40BD, 0x8232, 0xB935,
+ 0x40BE, 0x8232, 0xB936,
+ 0x40BF, 0x8232, 0xB937,
+ 0x40C0, 0x8232, 0xB938,
+ 0x40C1, 0x8232, 0xB939,
+ 0x40C2, 0x8232, 0xBA30,
+ 0x40C3, 0x8232, 0xBA31,
+ 0x40C4, 0x8232, 0xBA32,
+ 0x40C5, 0x8232, 0xBA33,
+ 0x40C6, 0x8232, 0xBA34,
+ 0x40C7, 0x8232, 0xBA35,
+ 0x40C8, 0x8232, 0xBA36,
+ 0x40C9, 0x8232, 0xBA37,
+ 0x40CA, 0x8232, 0xBA38,
+ 0x40CB, 0x8232, 0xBA39,
+ 0x40CC, 0x8232, 0xBB30,
+ 0x40CD, 0x8232, 0xBB31,
+ 0x40CE, 0x8232, 0xBB32,
+ 0x40CF, 0x8232, 0xBB33,
+ 0x40D0, 0x8232, 0xBB34,
+ 0x40D1, 0x8232, 0xBB35,
+ 0x40D2, 0x8232, 0xBB36,
+ 0x40D3, 0x8232, 0xBB37,
+ 0x40D4, 0x8232, 0xBB38,
+ 0x40D5, 0x8232, 0xBB39,
+ 0x40D6, 0x8232, 0xBC30,
+ 0x40D7, 0x8232, 0xBC31,
+ 0x40D8, 0x8232, 0xBC32,
+ 0x40D9, 0x8232, 0xBC33,
+ 0x40DA, 0x8232, 0xBC34,
+ 0x40DB, 0x8232, 0xBC35,
+ 0x40DC, 0x8232, 0xBC36,
+ 0x40DD, 0x8232, 0xBC37,
+ 0x40DE, 0x8232, 0xBC38,
+ 0x40DF, 0x8232, 0xBC39,
+ 0x40E0, 0x8232, 0xBD30,
+ 0x40E1, 0x8232, 0xBD31,
+ 0x40E2, 0x8232, 0xBD32,
+ 0x40E3, 0x8232, 0xBD33,
+ 0x40E4, 0x8232, 0xBD34,
+ 0x40E5, 0x8232, 0xBD35,
+ 0x40E6, 0x8232, 0xBD36,
+ 0x40E7, 0x8232, 0xBD37,
+ 0x40E8, 0x8232, 0xBD38,
+ 0x40E9, 0x8232, 0xBD39,
+ 0x40EA, 0x8232, 0xBE30,
+ 0x40EB, 0x8232, 0xBE31,
+ 0x40EC, 0x8232, 0xBE32,
+ 0x40ED, 0x8232, 0xBE33,
+ 0x40EE, 0x8232, 0xBE34,
+ 0x40EF, 0x8232, 0xBE35,
+ 0x40F0, 0x8232, 0xBE36,
+ 0x40F1, 0x8232, 0xBE37,
+ 0x40F2, 0x8232, 0xBE38,
+ 0x40F3, 0x8232, 0xBE39,
+ 0x40F4, 0x8232, 0xBF30,
+ 0x40F5, 0x8232, 0xBF31,
+ 0x40F6, 0x8232, 0xBF32,
+ 0x40F7, 0x8232, 0xBF33,
+ 0x40F8, 0x8232, 0xBF34,
+ 0x40F9, 0x8232, 0xBF35,
+ 0x40FA, 0x8232, 0xBF36,
+ 0x40FB, 0x8232, 0xBF37,
+ 0x40FC, 0x8232, 0xBF38,
+ 0x40FD, 0x8232, 0xBF39,
+ 0x40FE, 0x8232, 0xC030,
+ 0x40FF, 0x8232, 0xC031,
+ 0x4100, 0x8232, 0xC032,
+ 0x4101, 0x8232, 0xC033,
+ 0x4102, 0x8232, 0xC034,
+ 0x4103, 0x8232, 0xC035,
+ 0x4104, 0x8232, 0xC036,
+ 0x4105, 0x8232, 0xC037,
+ 0x4106, 0x8232, 0xC038,
+ 0x4107, 0x8232, 0xC039,
+ 0x4108, 0x8232, 0xC130,
+ 0x4109, 0x8232, 0xC131,
+ 0x410A, 0x8232, 0xC132,
+ 0x410B, 0x8232, 0xC133,
+ 0x410C, 0x8232, 0xC134,
+ 0x410D, 0x8232, 0xC135,
+ 0x410E, 0x8232, 0xC136,
+ 0x410F, 0x8232, 0xC137,
+ 0x4110, 0x8232, 0xC138,
+ 0x4111, 0x8232, 0xC139,
+ 0x4112, 0x8232, 0xC230,
+ 0x4113, 0x8232, 0xC231,
+ 0x4114, 0x8232, 0xC232,
+ 0x4115, 0x8232, 0xC233,
+ 0x4116, 0x8232, 0xC234,
+ 0x4117, 0x8232, 0xC235,
+ 0x4118, 0x8232, 0xC236,
+ 0x4119, 0x8232, 0xC237,
+ 0x411A, 0x8232, 0xC238,
+ 0x411B, 0x8232, 0xC239,
+ 0x411C, 0x8232, 0xC330,
+ 0x411D, 0x8232, 0xC331,
+ 0x411E, 0x8232, 0xC332,
+ 0x411F, 0x8232, 0xC333,
+ 0x4120, 0x8232, 0xC334,
+ 0x4121, 0x8232, 0xC335,
+ 0x4122, 0x8232, 0xC336,
+ 0x4123, 0x8232, 0xC337,
+ 0x4124, 0x8232, 0xC338,
+ 0x4125, 0x8232, 0xC339,
+ 0x4126, 0x8232, 0xC430,
+ 0x4127, 0x8232, 0xC431,
+ 0x4128, 0x8232, 0xC432,
+ 0x4129, 0x8232, 0xC433,
+ 0x412A, 0x8232, 0xC434,
+ 0x412B, 0x8232, 0xC435,
+ 0x412C, 0x8232, 0xC436,
+ 0x412D, 0x8232, 0xC437,
+ 0x412E, 0x8232, 0xC438,
+ 0x412F, 0x8232, 0xC439,
+ 0x4130, 0x8232, 0xC530,
+ 0x4131, 0x8232, 0xC531,
+ 0x4132, 0x8232, 0xC532,
+ 0x4133, 0x8232, 0xC533,
+ 0x4134, 0x8232, 0xC534,
+ 0x4135, 0x8232, 0xC535,
+ 0x4136, 0x8232, 0xC536,
+ 0x4137, 0x8232, 0xC537,
+ 0x4138, 0x8232, 0xC538,
+ 0x4139, 0x8232, 0xC539,
+ 0x413A, 0x8232, 0xC630,
+ 0x413B, 0x8232, 0xC631,
+ 0x413C, 0x8232, 0xC632,
+ 0x413D, 0x8232, 0xC633,
+ 0x413E, 0x8232, 0xC634,
+ 0x413F, 0x8232, 0xC635,
+ 0x4140, 0x8232, 0xC636,
+ 0x4141, 0x8232, 0xC637,
+ 0x4142, 0x8232, 0xC638,
+ 0x4143, 0x8232, 0xC639,
+ 0x4144, 0x8232, 0xC730,
+ 0x4145, 0x8232, 0xC731,
+ 0x4146, 0x8232, 0xC732,
+ 0x4147, 0x8232, 0xC733,
+ 0x4148, 0x8232, 0xC734,
+ 0x4149, 0x8232, 0xC735,
+ 0x414A, 0x8232, 0xC736,
+ 0x414B, 0x8232, 0xC737,
+ 0x414C, 0x8232, 0xC738,
+ 0x414D, 0x8232, 0xC739,
+ 0x414E, 0x8232, 0xC830,
+ 0x414F, 0x8232, 0xC831,
+ 0x4150, 0x8232, 0xC832,
+ 0x4151, 0x8232, 0xC833,
+ 0x4152, 0x8232, 0xC834,
+ 0x4153, 0x8232, 0xC835,
+ 0x4154, 0x8232, 0xC836,
+ 0x4155, 0x8232, 0xC837,
+ 0x4156, 0x8232, 0xC838,
+ 0x4157, 0x8232, 0xC839,
+ 0x4158, 0x8232, 0xC930,
+ 0x4159, 0x8232, 0xC931,
+ 0x415A, 0x8232, 0xC932,
+ 0x415B, 0x8232, 0xC933,
+ 0x415C, 0x8232, 0xC934,
+ 0x415D, 0x8232, 0xC935,
+ 0x415E, 0x8232, 0xC936,
+ 0x4338, 0x8232, 0xF838,
+ 0x4339, 0x8232, 0xF839,
+ 0x433A, 0x8232, 0xF930,
+ 0x433B, 0x8232, 0xF931,
+ 0x433C, 0x8232, 0xF932,
+ 0x433D, 0x8232, 0xF933,
+ 0x433E, 0x8232, 0xF934,
+ 0x433F, 0x8232, 0xF935,
+ 0x4340, 0x8232, 0xF936,
+ 0x4341, 0x8232, 0xF937,
+ 0x4342, 0x8232, 0xF938,
+ 0x4343, 0x8232, 0xF939,
+ 0x4344, 0x8232, 0xFA30,
+ 0x4345, 0x8232, 0xFA31,
+ 0x4346, 0x8232, 0xFA32,
+ 0x4347, 0x8232, 0xFA33,
+ 0x4348, 0x8232, 0xFA34,
+ 0x4349, 0x8232, 0xFA35,
+ 0x434A, 0x8232, 0xFA36,
+ 0x434B, 0x8232, 0xFA37,
+ 0x434C, 0x8232, 0xFA38,
+ 0x434D, 0x8232, 0xFA39,
+ 0x434E, 0x8232, 0xFB30,
+ 0x434F, 0x8232, 0xFB31,
+ 0x4350, 0x8232, 0xFB32,
+ 0x4351, 0x8232, 0xFB33,
+ 0x4352, 0x8232, 0xFB34,
+ 0x4353, 0x8232, 0xFB35,
+ 0x4354, 0x8232, 0xFB36,
+ 0x4355, 0x8232, 0xFB37,
+ 0x4356, 0x8232, 0xFB38,
+ 0x4357, 0x8232, 0xFB39,
+ 0x4358, 0x8232, 0xFC30,
+ 0x4359, 0x8232, 0xFC31,
+ 0x435A, 0x8232, 0xFC32,
+ 0x435B, 0x8232, 0xFC33,
+ 0x435C, 0x8232, 0xFC34,
+ 0x435D, 0x8232, 0xFC35,
+ 0x435E, 0x8232, 0xFC36,
+ 0x435F, 0x8232, 0xFC37,
+ 0x4360, 0x8232, 0xFC38,
+ 0x4361, 0x8232, 0xFC39,
+ 0x4362, 0x8232, 0xFD30,
+ 0x4363, 0x8232, 0xFD31,
+ 0x4364, 0x8232, 0xFD32,
+ 0x4365, 0x8232, 0xFD33,
+ 0x4366, 0x8232, 0xFD34,
+ 0x4367, 0x8232, 0xFD35,
+ 0x4368, 0x8232, 0xFD36,
+ 0x4369, 0x8232, 0xFD37,
+ 0x436A, 0x8232, 0xFD38,
+ 0x436B, 0x8232, 0xFD39,
+ 0x436C, 0x8232, 0xFE30,
+ 0x436D, 0x8232, 0xFE31,
+ 0x436E, 0x8232, 0xFE32,
+ 0x436F, 0x8232, 0xFE33,
+ 0x4370, 0x8232, 0xFE34,
+ 0x4371, 0x8232, 0xFE35,
+ 0x4372, 0x8232, 0xFE36,
+ 0x4373, 0x8232, 0xFE37,
+ 0x4374, 0x8232, 0xFE38,
+ 0x4375, 0x8232, 0xFE39,
+ 0x4376, 0x8233, 0x8130,
+ 0x4377, 0x8233, 0x8131,
+ 0x4378, 0x8233, 0x8132,
+ 0x4379, 0x8233, 0x8133,
+ 0x437A, 0x8233, 0x8134,
+ 0x437B, 0x8233, 0x8135,
+ 0x437C, 0x8233, 0x8136,
+ 0x437D, 0x8233, 0x8137,
+ 0x437E, 0x8233, 0x8138,
+ 0x437F, 0x8233, 0x8139,
+ 0x4380, 0x8233, 0x8230,
+ 0x4381, 0x8233, 0x8231,
+ 0x4382, 0x8233, 0x8232,
+ 0x4383, 0x8233, 0x8233,
+ 0x4384, 0x8233, 0x8234,
+ 0x4385, 0x8233, 0x8235,
+ 0x4386, 0x8233, 0x8236,
+ 0x4387, 0x8233, 0x8237,
+ 0x4388, 0x8233, 0x8238,
+ 0x4389, 0x8233, 0x8239,
+ 0x438A, 0x8233, 0x8330,
+ 0x438B, 0x8233, 0x8331,
+ 0x438C, 0x8233, 0x8332,
+ 0x438D, 0x8233, 0x8333,
+ 0x438E, 0x8233, 0x8334,
+ 0x438F, 0x8233, 0x8335,
+ 0x4390, 0x8233, 0x8336,
+ 0x4391, 0x8233, 0x8337,
+ 0x4392, 0x8233, 0x8338,
+ 0x4393, 0x8233, 0x8339,
+ 0x4394, 0x8233, 0x8430,
+ 0x4395, 0x8233, 0x8431,
+ 0x4396, 0x8233, 0x8432,
+ 0x4397, 0x8233, 0x8433,
+ 0x4398, 0x8233, 0x8434,
+ 0x4399, 0x8233, 0x8435,
+ 0x439A, 0x8233, 0x8436,
+ 0x439B, 0x8233, 0x8437,
+ 0x439C, 0x8233, 0x8438,
+ 0x439D, 0x8233, 0x8439,
+ 0x439E, 0x8233, 0x8530,
+ 0x439F, 0x8233, 0x8531,
+ 0x43A0, 0x8233, 0x8532,
+ 0x43A1, 0x8233, 0x8533,
+ 0x43A2, 0x8233, 0x8534,
+ 0x43A3, 0x8233, 0x8535,
+ 0x43A4, 0x8233, 0x8536,
+ 0x43A5, 0x8233, 0x8537,
+ 0x43A6, 0x8233, 0x8538,
+ 0x43A7, 0x8233, 0x8539,
+ 0x43A8, 0x8233, 0x8630,
+ 0x43A9, 0x8233, 0x8631,
+ 0x43AA, 0x8233, 0x8632,
+ 0x43AB, 0x8233, 0x8633,
+ 0x43AD, 0x8233, 0x8634,
+ 0x43AE, 0x8233, 0x8635,
+ 0x43AF, 0x8233, 0x8636,
+ 0x43B0, 0x8233, 0x8637,
+ 0x43B2, 0x8233, 0x8638,
+ 0x43B3, 0x8233, 0x8639,
+ 0x43B4, 0x8233, 0x8730,
+ 0x43B5, 0x8233, 0x8731,
+ 0x43B6, 0x8233, 0x8732,
+ 0x43B7, 0x8233, 0x8733,
+ 0x43B8, 0x8233, 0x8734,
+ 0x43B9, 0x8233, 0x8735,
+ 0x43BA, 0x8233, 0x8736,
+ 0x43BB, 0x8233, 0x8737,
+ 0x43BC, 0x8233, 0x8738,
+ 0x43BD, 0x8233, 0x8739,
+ 0x43BE, 0x8233, 0x8830,
+ 0x43BF, 0x8233, 0x8831,
+ 0x43C0, 0x8233, 0x8832,
+ 0x43C1, 0x8233, 0x8833,
+ 0x43C2, 0x8233, 0x8834,
+ 0x43C3, 0x8233, 0x8835,
+ 0x43C4, 0x8233, 0x8836,
+ 0x43C5, 0x8233, 0x8837,
+ 0x43C6, 0x8233, 0x8838,
+ 0x43C7, 0x8233, 0x8839,
+ 0x43C8, 0x8233, 0x8930,
+ 0x43C9, 0x8233, 0x8931,
+ 0x43CA, 0x8233, 0x8932,
+ 0x43CB, 0x8233, 0x8933,
+ 0x43CC, 0x8233, 0x8934,
+ 0x43CD, 0x8233, 0x8935,
+ 0x43CE, 0x8233, 0x8936,
+ 0x43CF, 0x8233, 0x8937,
+ 0x43D0, 0x8233, 0x8938,
+ 0x43D1, 0x8233, 0x8939,
+ 0x43D2, 0x8233, 0x8A30,
+ 0x43D3, 0x8233, 0x8A31,
+ 0x43D4, 0x8233, 0x8A32,
+ 0x43D5, 0x8233, 0x8A33,
+ 0x43D6, 0x8233, 0x8A34,
+ 0x43D7, 0x8233, 0x8A35,
+ 0x43D8, 0x8233, 0x8A36,
+ 0x43D9, 0x8233, 0x8A37,
+ 0x43DA, 0x8233, 0x8A38,
+ 0x43DB, 0x8233, 0x8A39,
+ 0x43DC, 0x8233, 0x8B30,
+ 0x43DE, 0x8233, 0x8B31,
+ 0x43DF, 0x8233, 0x8B32,
+ 0x43E0, 0x8233, 0x8B33,
+ 0x43E1, 0x8233, 0x8B34,
+ 0x43E2, 0x8233, 0x8B35,
+ 0x43E3, 0x8233, 0x8B36,
+ 0x43E4, 0x8233, 0x8B37,
+ 0x43E5, 0x8233, 0x8B38,
+ 0x43E6, 0x8233, 0x8B39,
+ 0x43E7, 0x8233, 0x8C30,
+ 0x43E8, 0x8233, 0x8C31,
+ 0x43E9, 0x8233, 0x8C32,
+ 0x43EA, 0x8233, 0x8C33,
+ 0x43EB, 0x8233, 0x8C34,
+ 0x43EC, 0x8233, 0x8C35,
+ 0x43ED, 0x8233, 0x8C36,
+ 0x43EE, 0x8233, 0x8C37,
+ 0x43EF, 0x8233, 0x8C38,
+ 0x43F0, 0x8233, 0x8C39,
+ 0x43F1, 0x8233, 0x8D30,
+ 0x43F2, 0x8233, 0x8D31,
+ 0x43F3, 0x8233, 0x8D32,
+ 0x43F4, 0x8233, 0x8D33,
+ 0x43F5, 0x8233, 0x8D34,
+ 0x43F6, 0x8233, 0x8D35,
+ 0x43F7, 0x8233, 0x8D36,
+ 0x43F8, 0x8233, 0x8D37,
+ 0x43F9, 0x8233, 0x8D38,
+ 0x43FA, 0x8233, 0x8D39,
+ 0x43FB, 0x8233, 0x8E30,
+ 0x43FC, 0x8233, 0x8E31,
+ 0x43FD, 0x8233, 0x8E32,
+ 0x43FE, 0x8233, 0x8E33,
+ 0x43FF, 0x8233, 0x8E34,
+ 0x4400, 0x8233, 0x8E35,
+ 0x4401, 0x8233, 0x8E36,
+ 0x4402, 0x8233, 0x8E37,
+ 0x4403, 0x8233, 0x8E38,
+ 0x4404, 0x8233, 0x8E39,
+ 0x4405, 0x8233, 0x8F30,
+ 0x4406, 0x8233, 0x8F31,
+ 0x4407, 0x8233, 0x8F32,
+ 0x4408, 0x8233, 0x8F33,
+ 0x4409, 0x8233, 0x8F34,
+ 0x440A, 0x8233, 0x8F35,
+ 0x440B, 0x8233, 0x8F36,
+ 0x440C, 0x8233, 0x8F37,
+ 0x440D, 0x8233, 0x8F38,
+ 0x440E, 0x8233, 0x8F39,
+ 0x440F, 0x8233, 0x9030,
+ 0x4410, 0x8233, 0x9031,
+ 0x4411, 0x8233, 0x9032,
+ 0x4412, 0x8233, 0x9033,
+ 0x4413, 0x8233, 0x9034,
+ 0x4414, 0x8233, 0x9035,
+ 0x4415, 0x8233, 0x9036,
+ 0x4416, 0x8233, 0x9037,
+ 0x4417, 0x8233, 0x9038,
+ 0x4418, 0x8233, 0x9039,
+ 0x4419, 0x8233, 0x9130,
+ 0x441A, 0x8233, 0x9131,
+ 0x441B, 0x8233, 0x9132,
+ 0x441C, 0x8233, 0x9133,
+ 0x441D, 0x8233, 0x9134,
+ 0x441E, 0x8233, 0x9135,
+ 0x441F, 0x8233, 0x9136,
+ 0x4420, 0x8233, 0x9137,
+ 0x4421, 0x8233, 0x9138,
+ 0x4422, 0x8233, 0x9139,
+ 0x4423, 0x8233, 0x9230,
+ 0x4424, 0x8233, 0x9231,
+ 0x4425, 0x8233, 0x9232,
+ 0x4426, 0x8233, 0x9233,
+ 0x4427, 0x8233, 0x9234,
+ 0x4428, 0x8233, 0x9235,
+ 0x4429, 0x8233, 0x9236,
+ 0x442A, 0x8233, 0x9237,
+ 0x442B, 0x8233, 0x9238,
+ 0x442C, 0x8233, 0x9239,
+ 0x442D, 0x8233, 0x9330,
+ 0x442E, 0x8233, 0x9331,
+ 0x442F, 0x8233, 0x9332,
+ 0x4430, 0x8233, 0x9333,
+ 0x4431, 0x8233, 0x9334,
+ 0x4432, 0x8233, 0x9335,
+ 0x4433, 0x8233, 0x9336,
+ 0x4434, 0x8233, 0x9337,
+ 0x4435, 0x8233, 0x9338,
+ 0x4436, 0x8233, 0x9339,
+ 0x4437, 0x8233, 0x9430,
+ 0x4438, 0x8233, 0x9431,
+ 0x4439, 0x8233, 0x9432,
+ 0x443A, 0x8233, 0x9433,
+ 0x443B, 0x8233, 0x9434,
+ 0x443C, 0x8233, 0x9435,
+ 0x443D, 0x8233, 0x9436,
+ 0x443E, 0x8233, 0x9437,
+ 0x443F, 0x8233, 0x9438,
+ 0x4440, 0x8233, 0x9439,
+ 0x4441, 0x8233, 0x9530,
+ 0x4442, 0x8233, 0x9531,
+ 0x4443, 0x8233, 0x9532,
+ 0x4444, 0x8233, 0x9533,
+ 0x4445, 0x8233, 0x9534,
+ 0x4446, 0x8233, 0x9535,
+ 0x4447, 0x8233, 0x9536,
+ 0x4448, 0x8233, 0x9537,
+ 0x4449, 0x8233, 0x9538,
+ 0x444A, 0x8233, 0x9539,
+ 0x444B, 0x8233, 0x9630,
+ 0x444C, 0x8233, 0x9631,
+ 0x444D, 0x8233, 0x9632,
+ 0x444E, 0x8233, 0x9633,
+ 0x444F, 0x8233, 0x9634,
+ 0x4450, 0x8233, 0x9635,
+ 0x4451, 0x8233, 0x9636,
+ 0x4452, 0x8233, 0x9637,
+ 0x4453, 0x8233, 0x9638,
+ 0x4454, 0x8233, 0x9639,
+ 0x4455, 0x8233, 0x9730,
+ 0x4456, 0x8233, 0x9731,
+ 0x4457, 0x8233, 0x9732,
+ 0x4458, 0x8233, 0x9733,
+ 0x4459, 0x8233, 0x9734,
+ 0x445A, 0x8233, 0x9735,
+ 0x445B, 0x8233, 0x9736,
+ 0x445C, 0x8233, 0x9737,
+ 0x445D, 0x8233, 0x9738,
+ 0x445E, 0x8233, 0x9739,
+ 0x445F, 0x8233, 0x9830,
+ 0x4460, 0x8233, 0x9831,
+ 0x4461, 0x8233, 0x9832,
+ 0x4462, 0x8233, 0x9833,
+ 0x4463, 0x8233, 0x9834,
+ 0x4464, 0x8233, 0x9835,
+ 0x4465, 0x8233, 0x9836,
+ 0x4466, 0x8233, 0x9837,
+ 0x4467, 0x8233, 0x9838,
+ 0x4468, 0x8233, 0x9839,
+ 0x4469, 0x8233, 0x9930,
+ 0x446A, 0x8233, 0x9931,
+ 0x446B, 0x8233, 0x9932,
+ 0x446C, 0x8233, 0x9933,
+ 0x446D, 0x8233, 0x9934,
+ 0x446E, 0x8233, 0x9935,
+ 0x446F, 0x8233, 0x9936,
+ 0x4470, 0x8233, 0x9937,
+ 0x4471, 0x8233, 0x9938,
+ 0x4472, 0x8233, 0x9939,
+ 0x4473, 0x8233, 0x9A30,
+ 0x4474, 0x8233, 0x9A31,
+ 0x4475, 0x8233, 0x9A32,
+ 0x4476, 0x8233, 0x9A33,
+ 0x4477, 0x8233, 0x9A34,
+ 0x4478, 0x8233, 0x9A35,
+ 0x4479, 0x8233, 0x9A36,
+ 0x447A, 0x8233, 0x9A37,
+ 0x447B, 0x8233, 0x9A38,
+ 0x447C, 0x8233, 0x9A39,
+ 0x447D, 0x8233, 0x9B30,
+ 0x447E, 0x8233, 0x9B31,
+ 0x447F, 0x8233, 0x9B32,
+ 0x4480, 0x8233, 0x9B33,
+ 0x4481, 0x8233, 0x9B34,
+ 0x4482, 0x8233, 0x9B35,
+ 0x4483, 0x8233, 0x9B36,
+ 0x4484, 0x8233, 0x9B37,
+ 0x4485, 0x8233, 0x9B38,
+ 0x4486, 0x8233, 0x9B39,
+ 0x4487, 0x8233, 0x9C30,
+ 0x4488, 0x8233, 0x9C31,
+ 0x4489, 0x8233, 0x9C32,
+ 0x448A, 0x8233, 0x9C33,
+ 0x448B, 0x8233, 0x9C34,
+ 0x448C, 0x8233, 0x9C35,
+ 0x448D, 0x8233, 0x9C36,
+ 0x448E, 0x8233, 0x9C37,
+ 0x448F, 0x8233, 0x9C38,
+ 0x4490, 0x8233, 0x9C39,
+ 0x4491, 0x8233, 0x9D30,
+ 0x4492, 0x8233, 0x9D31,
+ 0x4493, 0x8233, 0x9D32,
+ 0x4494, 0x8233, 0x9D33,
+ 0x4495, 0x8233, 0x9D34,
+ 0x4496, 0x8233, 0x9D35,
+ 0x4497, 0x8233, 0x9D36,
+ 0x4498, 0x8233, 0x9D37,
+ 0x4499, 0x8233, 0x9D38,
+ 0x449A, 0x8233, 0x9D39,
+ 0x449B, 0x8233, 0x9E30,
+ 0x449C, 0x8233, 0x9E31,
+ 0x449D, 0x8233, 0x9E32,
+ 0x449E, 0x8233, 0x9E33,
+ 0x449F, 0x8233, 0x9E34,
+ 0x44A0, 0x8233, 0x9E35,
+ 0x44A1, 0x8233, 0x9E36,
+ 0x44A2, 0x8233, 0x9E37,
+ 0x44A3, 0x8233, 0x9E38,
+ 0x44A4, 0x8233, 0x9E39,
+ 0x44A5, 0x8233, 0x9F30,
+ 0x44A6, 0x8233, 0x9F31,
+ 0x44A7, 0x8233, 0x9F32,
+ 0x44A8, 0x8233, 0x9F33,
+ 0x44A9, 0x8233, 0x9F34,
+ 0x44AA, 0x8233, 0x9F35,
+ 0x44AB, 0x8233, 0x9F36,
+ 0x44AC, 0x8233, 0x9F37,
+ 0x44AD, 0x8233, 0x9F38,
+ 0x44AE, 0x8233, 0x9F39,
+ 0x44AF, 0x8233, 0xA030,
+ 0x44B0, 0x8233, 0xA031,
+ 0x44B1, 0x8233, 0xA032,
+ 0x44B2, 0x8233, 0xA033,
+ 0x44B3, 0x8233, 0xA034,
+ 0x44B4, 0x8233, 0xA035,
+ 0x44B5, 0x8233, 0xA036,
+ 0x44B6, 0x8233, 0xA037,
+ 0x44B7, 0x8233, 0xA038,
+ 0x44B8, 0x8233, 0xA039,
+ 0x44B9, 0x8233, 0xA130,
+ 0x44BA, 0x8233, 0xA131,
+ 0x44BB, 0x8233, 0xA132,
+ 0x44BC, 0x8233, 0xA133,
+ 0x44BD, 0x8233, 0xA134,
+ 0x44BE, 0x8233, 0xA135,
+ 0x44BF, 0x8233, 0xA136,
+ 0x44C0, 0x8233, 0xA137,
+ 0x44C1, 0x8233, 0xA138,
+ 0x44C2, 0x8233, 0xA139,
+ 0x44C3, 0x8233, 0xA230,
+ 0x44C4, 0x8233, 0xA231,
+ 0x44C5, 0x8233, 0xA232,
+ 0x44C6, 0x8233, 0xA233,
+ 0x44C7, 0x8233, 0xA234,
+ 0x44C8, 0x8233, 0xA235,
+ 0x44C9, 0x8233, 0xA236,
+ 0x44CA, 0x8233, 0xA237,
+ 0x44CB, 0x8233, 0xA238,
+ 0x44CC, 0x8233, 0xA239,
+ 0x44CD, 0x8233, 0xA330,
+ 0x44CE, 0x8233, 0xA331,
+ 0x44CF, 0x8233, 0xA332,
+ 0x44D0, 0x8233, 0xA333,
+ 0x44D1, 0x8233, 0xA334,
+ 0x44D2, 0x8233, 0xA335,
+ 0x44D3, 0x8233, 0xA336,
+ 0x44D4, 0x8233, 0xA337,
+ 0x44D5, 0x8233, 0xA338,
+ 0x464D, 0x8233, 0xC932,
+ 0x464E, 0x8233, 0xC933,
+ 0x464F, 0x8233, 0xC934,
+ 0x4650, 0x8233, 0xC935,
+ 0x4651, 0x8233, 0xC936,
+ 0x4652, 0x8233, 0xC937,
+ 0x4653, 0x8233, 0xC938,
+ 0x4654, 0x8233, 0xC939,
+ 0x4655, 0x8233, 0xCA30,
+ 0x4656, 0x8233, 0xCA31,
+ 0x4657, 0x8233, 0xCA32,
+ 0x4658, 0x8233, 0xCA33,
+ 0x4659, 0x8233, 0xCA34,
+ 0x465A, 0x8233, 0xCA35,
+ 0x465B, 0x8233, 0xCA36,
+ 0x465C, 0x8233, 0xCA37,
+ 0x465D, 0x8233, 0xCA38,
+ 0x465E, 0x8233, 0xCA39,
+ 0x465F, 0x8233, 0xCB30,
+ 0x4660, 0x8233, 0xCB31,
+ 0x4662, 0x8233, 0xCB32,
+ 0x4663, 0x8233, 0xCB33,
+ 0x4664, 0x8233, 0xCB34,
+ 0x4665, 0x8233, 0xCB35,
+ 0x4666, 0x8233, 0xCB36,
+ 0x4667, 0x8233, 0xCB37,
+ 0x4668, 0x8233, 0xCB38,
+ 0x4669, 0x8233, 0xCB39,
+ 0x466A, 0x8233, 0xCC30,
+ 0x466B, 0x8233, 0xCC31,
+ 0x466C, 0x8233, 0xCC32,
+ 0x466D, 0x8233, 0xCC33,
+ 0x466E, 0x8233, 0xCC34,
+ 0x466F, 0x8233, 0xCC35,
+ 0x4670, 0x8233, 0xCC36,
+ 0x4671, 0x8233, 0xCC37,
+ 0x4672, 0x8233, 0xCC38,
+ 0x4673, 0x8233, 0xCC39,
+ 0x4674, 0x8233, 0xCD30,
+ 0x4675, 0x8233, 0xCD31,
+ 0x4676, 0x8233, 0xCD32,
+ 0x4677, 0x8233, 0xCD33,
+ 0x4678, 0x8233, 0xCD34,
+ 0x4679, 0x8233, 0xCD35,
+ 0x467A, 0x8233, 0xCD36,
+ 0x467B, 0x8233, 0xCD37,
+ 0x467C, 0x8233, 0xCD38,
+ 0x467D, 0x8233, 0xCD39,
+ 0x467E, 0x8233, 0xCE30,
+ 0x467F, 0x8233, 0xCE31,
+ 0x4680, 0x8233, 0xCE32,
+ 0x4681, 0x8233, 0xCE33,
+ 0x4682, 0x8233, 0xCE34,
+ 0x4683, 0x8233, 0xCE35,
+ 0x4684, 0x8233, 0xCE36,
+ 0x4685, 0x8233, 0xCE37,
+ 0x4686, 0x8233, 0xCE38,
+ 0x4687, 0x8233, 0xCE39,
+ 0x4688, 0x8233, 0xCF30,
+ 0x4689, 0x8233, 0xCF31,
+ 0x468A, 0x8233, 0xCF32,
+ 0x468B, 0x8233, 0xCF33,
+ 0x468C, 0x8233, 0xCF34,
+ 0x468D, 0x8233, 0xCF35,
+ 0x468E, 0x8233, 0xCF36,
+ 0x468F, 0x8233, 0xCF37,
+ 0x4690, 0x8233, 0xCF38,
+ 0x4691, 0x8233, 0xCF39,
+ 0x4692, 0x8233, 0xD030,
+ 0x4693, 0x8233, 0xD031,
+ 0x4694, 0x8233, 0xD032,
+ 0x4695, 0x8233, 0xD033,
+ 0x4696, 0x8233, 0xD034,
+ 0x4697, 0x8233, 0xD035,
+ 0x4698, 0x8233, 0xD036,
+ 0x4699, 0x8233, 0xD037,
+ 0x469A, 0x8233, 0xD038,
+ 0x469B, 0x8233, 0xD039,
+ 0x469C, 0x8233, 0xD130,
+ 0x469D, 0x8233, 0xD131,
+ 0x469E, 0x8233, 0xD132,
+ 0x469F, 0x8233, 0xD133,
+ 0x46A0, 0x8233, 0xD134,
+ 0x46A1, 0x8233, 0xD135,
+ 0x46A2, 0x8233, 0xD136,
+ 0x46A3, 0x8233, 0xD137,
+ 0x46A4, 0x8233, 0xD138,
+ 0x46A5, 0x8233, 0xD139,
+ 0x46A6, 0x8233, 0xD230,
+ 0x46A7, 0x8233, 0xD231,
+ 0x46A8, 0x8233, 0xD232,
+ 0x46A9, 0x8233, 0xD233,
+ 0x46AA, 0x8233, 0xD234,
+ 0x46AB, 0x8233, 0xD235,
+ 0x46AC, 0x8233, 0xD236,
+ 0x46AD, 0x8233, 0xD237,
+ 0x46AE, 0x8233, 0xD238,
+ 0x46AF, 0x8233, 0xD239,
+ 0x46B0, 0x8233, 0xD330,
+ 0x46B1, 0x8233, 0xD331,
+ 0x46B2, 0x8233, 0xD332,
+ 0x46B3, 0x8233, 0xD333,
+ 0x46B4, 0x8233, 0xD334,
+ 0x46B5, 0x8233, 0xD335,
+ 0x46B6, 0x8233, 0xD336,
+ 0x46B7, 0x8233, 0xD337,
+ 0x46B8, 0x8233, 0xD338,
+ 0x46B9, 0x8233, 0xD339,
+ 0x46BA, 0x8233, 0xD430,
+ 0x46BB, 0x8233, 0xD431,
+ 0x46BC, 0x8233, 0xD432,
+ 0x46BD, 0x8233, 0xD433,
+ 0x46BE, 0x8233, 0xD434,
+ 0x46BF, 0x8233, 0xD435,
+ 0x46C0, 0x8233, 0xD436,
+ 0x46C1, 0x8233, 0xD437,
+ 0x46C2, 0x8233, 0xD438,
+ 0x46C3, 0x8233, 0xD439,
+ 0x46C4, 0x8233, 0xD530,
+ 0x46C5, 0x8233, 0xD531,
+ 0x46C6, 0x8233, 0xD532,
+ 0x46C7, 0x8233, 0xD533,
+ 0x46C8, 0x8233, 0xD534,
+ 0x46C9, 0x8233, 0xD535,
+ 0x46CA, 0x8233, 0xD536,
+ 0x46CB, 0x8233, 0xD537,
+ 0x46CC, 0x8233, 0xD538,
+ 0x46CD, 0x8233, 0xD539,
+ 0x46CE, 0x8233, 0xD630,
+ 0x46CF, 0x8233, 0xD631,
+ 0x46D0, 0x8233, 0xD632,
+ 0x46D1, 0x8233, 0xD633,
+ 0x46D2, 0x8233, 0xD634,
+ 0x46D3, 0x8233, 0xD635,
+ 0x46D4, 0x8233, 0xD636,
+ 0x46D5, 0x8233, 0xD637,
+ 0x46D6, 0x8233, 0xD638,
+ 0x46D7, 0x8233, 0xD639,
+ 0x46D8, 0x8233, 0xD730,
+ 0x46D9, 0x8233, 0xD731,
+ 0x46DA, 0x8233, 0xD732,
+ 0x46DB, 0x8233, 0xD733,
+ 0x46DC, 0x8233, 0xD734,
+ 0x46DD, 0x8233, 0xD735,
+ 0x46DE, 0x8233, 0xD736,
+ 0x46DF, 0x8233, 0xD737,
+ 0x46E0, 0x8233, 0xD738,
+ 0x46E1, 0x8233, 0xD739,
+ 0x46E2, 0x8233, 0xD830,
+ 0x46E3, 0x8233, 0xD831,
+ 0x46E4, 0x8233, 0xD832,
+ 0x46E5, 0x8233, 0xD833,
+ 0x46E6, 0x8233, 0xD834,
+ 0x46E7, 0x8233, 0xD835,
+ 0x46E8, 0x8233, 0xD836,
+ 0x46E9, 0x8233, 0xD837,
+ 0x46EA, 0x8233, 0xD838,
+ 0x46EB, 0x8233, 0xD839,
+ 0x46EC, 0x8233, 0xD930,
+ 0x46ED, 0x8233, 0xD931,
+ 0x46EE, 0x8233, 0xD932,
+ 0x46EF, 0x8233, 0xD933,
+ 0x46F0, 0x8233, 0xD934,
+ 0x46F1, 0x8233, 0xD935,
+ 0x46F2, 0x8233, 0xD936,
+ 0x46F3, 0x8233, 0xD937,
+ 0x46F4, 0x8233, 0xD938,
+ 0x46F5, 0x8233, 0xD939,
+ 0x46F6, 0x8233, 0xDA30,
+ 0x46F7, 0x8233, 0xDA31,
+ 0x46F8, 0x8233, 0xDA32,
+ 0x46F9, 0x8233, 0xDA33,
+ 0x46FA, 0x8233, 0xDA34,
+ 0x46FB, 0x8233, 0xDA35,
+ 0x46FC, 0x8233, 0xDA36,
+ 0x46FD, 0x8233, 0xDA37,
+ 0x46FE, 0x8233, 0xDA38,
+ 0x46FF, 0x8233, 0xDA39,
+ 0x4700, 0x8233, 0xDB30,
+ 0x4701, 0x8233, 0xDB31,
+ 0x4702, 0x8233, 0xDB32,
+ 0x4703, 0x8233, 0xDB33,
+ 0x4704, 0x8233, 0xDB34,
+ 0x4705, 0x8233, 0xDB35,
+ 0x4706, 0x8233, 0xDB36,
+ 0x4707, 0x8233, 0xDB37,
+ 0x4708, 0x8233, 0xDB38,
+ 0x4709, 0x8233, 0xDB39,
+ 0x470A, 0x8233, 0xDC30,
+ 0x470B, 0x8233, 0xDC31,
+ 0x470C, 0x8233, 0xDC32,
+ 0x470D, 0x8233, 0xDC33,
+ 0x470E, 0x8233, 0xDC34,
+ 0x470F, 0x8233, 0xDC35,
+ 0x4710, 0x8233, 0xDC36,
+ 0x4711, 0x8233, 0xDC37,
+ 0x4712, 0x8233, 0xDC38,
+ 0x4713, 0x8233, 0xDC39,
+ 0x4714, 0x8233, 0xDD30,
+ 0x4715, 0x8233, 0xDD31,
+ 0x4716, 0x8233, 0xDD32,
+ 0x4717, 0x8233, 0xDD33,
+ 0x4718, 0x8233, 0xDD34,
+ 0x4719, 0x8233, 0xDD35,
+ 0x471A, 0x8233, 0xDD36,
+ 0x471B, 0x8233, 0xDD37,
+ 0x471C, 0x8233, 0xDD38,
+ 0x471D, 0x8233, 0xDD39,
+ 0x471E, 0x8233, 0xDE30,
+ 0x471F, 0x8233, 0xDE31,
+ 0x4720, 0x8233, 0xDE32,
+ 0x4721, 0x8233, 0xDE33,
+ 0x4722, 0x8233, 0xDE34,
+ 0x4724, 0x8233, 0xDE35,
+ 0x4725, 0x8233, 0xDE36,
+ 0x4726, 0x8233, 0xDE37,
+ 0x4727, 0x8233, 0xDE38,
+ 0x4728, 0x8233, 0xDE39,
+ 0x472A, 0x8233, 0xDF30,
+ 0x472B, 0x8233, 0xDF31,
+ 0x472C, 0x8233, 0xDF32,
+ 0x472D, 0x8233, 0xDF33,
+ 0x472E, 0x8233, 0xDF34,
+ 0x472F, 0x8233, 0xDF35,
+ 0x4730, 0x8233, 0xDF36,
+ 0x4731, 0x8233, 0xDF37,
+ 0x4732, 0x8233, 0xDF38,
+ 0x4733, 0x8233, 0xDF39,
+ 0x4734, 0x8233, 0xE030,
+ 0x4735, 0x8233, 0xE031,
+ 0x4736, 0x8233, 0xE032,
+ 0x4737, 0x8233, 0xE033,
+ 0x4738, 0x8233, 0xE034,
+ 0x4739, 0x8233, 0xE035,
+ 0x473A, 0x8233, 0xE036,
+ 0x473B, 0x8233, 0xE037,
+ 0x473C, 0x8233, 0xE038,
+ 0x473D, 0x8233, 0xE039,
+ 0x473E, 0x8233, 0xE130,
+ 0x473F, 0x8233, 0xE131,
+ 0x4740, 0x8233, 0xE132,
+ 0x4741, 0x8233, 0xE133,
+ 0x4742, 0x8233, 0xE134,
+ 0x4743, 0x8233, 0xE135,
+ 0x4744, 0x8233, 0xE136,
+ 0x4745, 0x8233, 0xE137,
+ 0x4746, 0x8233, 0xE138,
+ 0x4747, 0x8233, 0xE139,
+ 0x4748, 0x8233, 0xE230,
+ 0x4749, 0x8233, 0xE231,
+ 0x474A, 0x8233, 0xE232,
+ 0x474B, 0x8233, 0xE233,
+ 0x474C, 0x8233, 0xE234,
+ 0x474D, 0x8233, 0xE235,
+ 0x474E, 0x8233, 0xE236,
+ 0x474F, 0x8233, 0xE237,
+ 0x4750, 0x8233, 0xE238,
+ 0x4751, 0x8233, 0xE239,
+ 0x4752, 0x8233, 0xE330,
+ 0x4753, 0x8233, 0xE331,
+ 0x4754, 0x8233, 0xE332,
+ 0x4755, 0x8233, 0xE333,
+ 0x4756, 0x8233, 0xE334,
+ 0x4757, 0x8233, 0xE335,
+ 0x4758, 0x8233, 0xE336,
+ 0x4759, 0x8233, 0xE337,
+ 0x475A, 0x8233, 0xE338,
+ 0x475B, 0x8233, 0xE339,
+ 0x475C, 0x8233, 0xE430,
+ 0x475D, 0x8233, 0xE431,
+ 0x475E, 0x8233, 0xE432,
+ 0x475F, 0x8233, 0xE433,
+ 0x4760, 0x8233, 0xE434,
+ 0x4761, 0x8233, 0xE435,
+ 0x4762, 0x8233, 0xE436,
+ 0x4763, 0x8233, 0xE437,
+ 0x4764, 0x8233, 0xE438,
+ 0x4765, 0x8233, 0xE439,
+ 0x4766, 0x8233, 0xE530,
+ 0x4767, 0x8233, 0xE531,
+ 0x4768, 0x8233, 0xE532,
+ 0x4769, 0x8233, 0xE533,
+ 0x476A, 0x8233, 0xE534,
+ 0x476B, 0x8233, 0xE535,
+ 0x476C, 0x8233, 0xE536,
+ 0x476D, 0x8233, 0xE537,
+ 0x476E, 0x8233, 0xE538,
+ 0x476F, 0x8233, 0xE539,
+ 0x4770, 0x8233, 0xE630,
+ 0x4771, 0x8233, 0xE631,
+ 0x4772, 0x8233, 0xE632,
+ 0x4773, 0x8233, 0xE633,
+ 0x4774, 0x8233, 0xE634,
+ 0x4775, 0x8233, 0xE635,
+ 0x4776, 0x8233, 0xE636,
+ 0x4777, 0x8233, 0xE637,
+ 0x4778, 0x8233, 0xE638,
+ 0x4779, 0x8233, 0xE639,
+ 0x477A, 0x8233, 0xE730,
+ 0x477B, 0x8233, 0xE731,
+ 0x477D, 0x8233, 0xE732,
+ 0x477E, 0x8233, 0xE733,
+ 0x477F, 0x8233, 0xE734,
+ 0x4780, 0x8233, 0xE735,
+ 0x4781, 0x8233, 0xE736,
+ 0x4782, 0x8233, 0xE737,
+ 0x4783, 0x8233, 0xE738,
+ 0x4784, 0x8233, 0xE739,
+ 0x4785, 0x8233, 0xE830,
+ 0x4786, 0x8233, 0xE831,
+ 0x4787, 0x8233, 0xE832,
+ 0x4788, 0x8233, 0xE833,
+ 0x4789, 0x8233, 0xE834,
+ 0x478A, 0x8233, 0xE835,
+ 0x478B, 0x8233, 0xE836,
+ 0x478C, 0x8233, 0xE837,
+ 0x4948, 0x8234, 0x9639,
+ 0x4949, 0x8234, 0x9730,
+ 0x494A, 0x8234, 0x9731,
+ 0x494B, 0x8234, 0x9732,
+ 0x494C, 0x8234, 0x9733,
+ 0x494D, 0x8234, 0x9734,
+ 0x494E, 0x8234, 0x9735,
+ 0x494F, 0x8234, 0x9736,
+ 0x4950, 0x8234, 0x9737,
+ 0x4951, 0x8234, 0x9738,
+ 0x4952, 0x8234, 0x9739,
+ 0x4953, 0x8234, 0x9830,
+ 0x4954, 0x8234, 0x9831,
+ 0x4955, 0x8234, 0x9832,
+ 0x4956, 0x8234, 0x9833,
+ 0x4957, 0x8234, 0x9834,
+ 0x4958, 0x8234, 0x9835,
+ 0x4959, 0x8234, 0x9836,
+ 0x495A, 0x8234, 0x9837,
+ 0x495B, 0x8234, 0x9838,
+ 0x495C, 0x8234, 0x9839,
+ 0x495D, 0x8234, 0x9930,
+ 0x495E, 0x8234, 0x9931,
+ 0x495F, 0x8234, 0x9932,
+ 0x4960, 0x8234, 0x9933,
+ 0x4961, 0x8234, 0x9934,
+ 0x4962, 0x8234, 0x9935,
+ 0x4963, 0x8234, 0x9936,
+ 0x4964, 0x8234, 0x9937,
+ 0x4965, 0x8234, 0x9938,
+ 0x4966, 0x8234, 0x9939,
+ 0x4967, 0x8234, 0x9A30,
+ 0x4968, 0x8234, 0x9A31,
+ 0x4969, 0x8234, 0x9A32,
+ 0x496A, 0x8234, 0x9A33,
+ 0x496B, 0x8234, 0x9A34,
+ 0x496C, 0x8234, 0x9A35,
+ 0x496D, 0x8234, 0x9A36,
+ 0x496E, 0x8234, 0x9A37,
+ 0x496F, 0x8234, 0x9A38,
+ 0x4970, 0x8234, 0x9A39,
+ 0x4971, 0x8234, 0x9B30,
+ 0x4972, 0x8234, 0x9B31,
+ 0x4973, 0x8234, 0x9B32,
+ 0x4974, 0x8234, 0x9B33,
+ 0x4975, 0x8234, 0x9B34,
+ 0x4976, 0x8234, 0x9B35,
+ 0x4977, 0x8234, 0x9B36,
+ 0x4978, 0x8234, 0x9B37,
+ 0x4979, 0x8234, 0x9B38,
+ 0x497B, 0x8234, 0x9B39,
+ 0x497C, 0x8234, 0x9C30,
+ 0x497E, 0x8234, 0x9C31,
+ 0x497F, 0x8234, 0x9C32,
+ 0x4980, 0x8234, 0x9C33,
+ 0x4981, 0x8234, 0x9C34,
+ 0x4984, 0x8234, 0x9C35,
+ 0x4987, 0x8234, 0x9C36,
+ 0x4988, 0x8234, 0x9C37,
+ 0x4989, 0x8234, 0x9C38,
+ 0x498A, 0x8234, 0x9C39,
+ 0x498B, 0x8234, 0x9D30,
+ 0x498C, 0x8234, 0x9D31,
+ 0x498D, 0x8234, 0x9D32,
+ 0x498E, 0x8234, 0x9D33,
+ 0x498F, 0x8234, 0x9D34,
+ 0x4990, 0x8234, 0x9D35,
+ 0x4991, 0x8234, 0x9D36,
+ 0x4992, 0x8234, 0x9D37,
+ 0x4993, 0x8234, 0x9D38,
+ 0x4994, 0x8234, 0x9D39,
+ 0x4995, 0x8234, 0x9E30,
+ 0x4996, 0x8234, 0x9E31,
+ 0x4997, 0x8234, 0x9E32,
+ 0x4998, 0x8234, 0x9E33,
+ 0x4999, 0x8234, 0x9E34,
+ 0x499A, 0x8234, 0x9E35,
+ 0x499C, 0x8234, 0x9E36,
+ 0x499D, 0x8234, 0x9E37,
+ 0x499E, 0x8234, 0x9E38,
+ 0x49A0, 0x8234, 0x9E39,
+ 0x49A1, 0x8234, 0x9F30,
+ 0x49A2, 0x8234, 0x9F31,
+ 0x49A3, 0x8234, 0x9F32,
+ 0x49A4, 0x8234, 0x9F33,
+ 0x49A5, 0x8234, 0x9F34,
+ 0x49A6, 0x8234, 0x9F35,
+ 0x49A7, 0x8234, 0x9F36,
+ 0x49A8, 0x8234, 0x9F37,
+ 0x49A9, 0x8234, 0x9F38,
+ 0x49AA, 0x8234, 0x9F39,
+ 0x49AB, 0x8234, 0xA030,
+ 0x49AC, 0x8234, 0xA031,
+ 0x49AD, 0x8234, 0xA032,
+ 0x49AE, 0x8234, 0xA033,
+ 0x49AF, 0x8234, 0xA034,
+ 0x49B0, 0x8234, 0xA035,
+ 0x49B1, 0x8234, 0xA036,
+ 0x49B2, 0x8234, 0xA037,
+ 0x49B3, 0x8234, 0xA038,
+ 0x49B4, 0x8234, 0xA039,
+ 0x49B5, 0x8234, 0xA130,
+ 0x4C78, 0x8234, 0xE734,
+ 0x4C79, 0x8234, 0xE735,
+ 0x4C7A, 0x8234, 0xE736,
+ 0x4C7B, 0x8234, 0xE737,
+ 0x4C7C, 0x8234, 0xE738,
+ 0x4C7D, 0x8234, 0xE739,
+ 0x4C7E, 0x8234, 0xE830,
+ 0x4C7F, 0x8234, 0xE831,
+ 0x4C80, 0x8234, 0xE832,
+ 0x4C81, 0x8234, 0xE833,
+ 0x4C82, 0x8234, 0xE834,
+ 0x4C83, 0x8234, 0xE835,
+ 0x4C84, 0x8234, 0xE836,
+ 0x4C85, 0x8234, 0xE837,
+ 0x4C86, 0x8234, 0xE838,
+ 0x4C87, 0x8234, 0xE839,
+ 0x4C88, 0x8234, 0xE930,
+ 0x4C89, 0x8234, 0xE931,
+ 0x4C8A, 0x8234, 0xE932,
+ 0x4C8B, 0x8234, 0xE933,
+ 0x4C8C, 0x8234, 0xE934,
+ 0x4C8D, 0x8234, 0xE935,
+ 0x4C8E, 0x8234, 0xE936,
+ 0x4C8F, 0x8234, 0xE937,
+ 0x4C90, 0x8234, 0xE938,
+ 0x4C91, 0x8234, 0xE939,
+ 0x4C92, 0x8234, 0xEA30,
+ 0x4C93, 0x8234, 0xEA31,
+ 0x4C94, 0x8234, 0xEA32,
+ 0x4C95, 0x8234, 0xEA33,
+ 0x4C96, 0x8234, 0xEA34,
+ 0x4C97, 0x8234, 0xEA35,
+ 0x4C98, 0x8234, 0xEA36,
+ 0x4C99, 0x8234, 0xEA37,
+ 0x4C9A, 0x8234, 0xEA38,
+ 0x4C9B, 0x8234, 0xEA39,
+ 0x4C9C, 0x8234, 0xEB30,
+ 0x4C9D, 0x8234, 0xEB31,
+ 0x4C9E, 0x8234, 0xEB32,
+ 0x4CA4, 0x8234, 0xEB33,
+ 0x4CA5, 0x8234, 0xEB34,
+ 0x4CA6, 0x8234, 0xEB35,
+ 0x4CA7, 0x8234, 0xEB36,
+ 0x4CA8, 0x8234, 0xEB37,
+ 0x4CA9, 0x8234, 0xEB38,
+ 0x4CAA, 0x8234, 0xEB39,
+ 0x4CAB, 0x8234, 0xEC30,
+ 0x4CAC, 0x8234, 0xEC31,
+ 0x4CAD, 0x8234, 0xEC32,
+ 0x4CAE, 0x8234, 0xEC33,
+ 0x4CAF, 0x8234, 0xEC34,
+ 0x4CB0, 0x8234, 0xEC35,
+ 0x4CB1, 0x8234, 0xEC36,
+ 0x4CB2, 0x8234, 0xEC37,
+ 0x4CB3, 0x8234, 0xEC38,
+ 0x4CB4, 0x8234, 0xEC39,
+ 0x4CB5, 0x8234, 0xED30,
+ 0x4CB6, 0x8234, 0xED31,
+ 0x4CB7, 0x8234, 0xED32,
+ 0x4CB8, 0x8234, 0xED33,
+ 0x4CB9, 0x8234, 0xED34,
+ 0x4CBA, 0x8234, 0xED35,
+ 0x4CBB, 0x8234, 0xED36,
+ 0x4CBC, 0x8234, 0xED37,
+ 0x4CBD, 0x8234, 0xED38,
+ 0x4CBE, 0x8234, 0xED39,
+ 0x4CBF, 0x8234, 0xEE30,
+ 0x4CC0, 0x8234, 0xEE31,
+ 0x4CC1, 0x8234, 0xEE32,
+ 0x4CC2, 0x8234, 0xEE33,
+ 0x4CC3, 0x8234, 0xEE34,
+ 0x4CC4, 0x8234, 0xEE35,
+ 0x4CC5, 0x8234, 0xEE36,
+ 0x4CC6, 0x8234, 0xEE37,
+ 0x4CC7, 0x8234, 0xEE38,
+ 0x4CC8, 0x8234, 0xEE39,
+ 0x4CC9, 0x8234, 0xEF30,
+ 0x4CCA, 0x8234, 0xEF31,
+ 0x4CCB, 0x8234, 0xEF32,
+ 0x4CCC, 0x8234, 0xEF33,
+ 0x4CCD, 0x8234, 0xEF34,
+ 0x4CCE, 0x8234, 0xEF35,
+ 0x4CCF, 0x8234, 0xEF36,
+ 0x4CD0, 0x8234, 0xEF37,
+ 0x4CD1, 0x8234, 0xEF38,
+ 0x4CD2, 0x8234, 0xEF39,
+ 0x4CD3, 0x8234, 0xF030,
+ 0x4CD4, 0x8234, 0xF031,
+ 0x4CD5, 0x8234, 0xF032,
+ 0x4CD6, 0x8234, 0xF033,
+ 0x4CD7, 0x8234, 0xF034,
+ 0x4CD8, 0x8234, 0xF035,
+ 0x4CD9, 0x8234, 0xF036,
+ 0x4CDA, 0x8234, 0xF037,
+ 0x4CDB, 0x8234, 0xF038,
+ 0x4CDC, 0x8234, 0xF039,
+ 0x4CDD, 0x8234, 0xF130,
+ 0x4CDE, 0x8234, 0xF131,
+ 0x4CDF, 0x8234, 0xF132,
+ 0x4CE0, 0x8234, 0xF133,
+ 0x4CE1, 0x8234, 0xF134,
+ 0x4CE2, 0x8234, 0xF135,
+ 0x4CE3, 0x8234, 0xF136,
+ 0x4CE4, 0x8234, 0xF137,
+ 0x4CE5, 0x8234, 0xF138,
+ 0x4CE6, 0x8234, 0xF139,
+ 0x4CE7, 0x8234, 0xF230,
+ 0x4CE8, 0x8234, 0xF231,
+ 0x4CE9, 0x8234, 0xF232,
+ 0x4CEA, 0x8234, 0xF233,
+ 0x4CEB, 0x8234, 0xF234,
+ 0x4CEC, 0x8234, 0xF235,
+ 0x4CED, 0x8234, 0xF236,
+ 0x4CEE, 0x8234, 0xF237,
+ 0x4CEF, 0x8234, 0xF238,
+ 0x4CF0, 0x8234, 0xF239,
+ 0x4CF1, 0x8234, 0xF330,
+ 0x4CF2, 0x8234, 0xF331,
+ 0x4CF3, 0x8234, 0xF332,
+ 0x4CF4, 0x8234, 0xF333,
+ 0x4CF5, 0x8234, 0xF334,
+ 0x4CF6, 0x8234, 0xF335,
+ 0x4CF7, 0x8234, 0xF336,
+ 0x4CF8, 0x8234, 0xF337,
+ 0x4CF9, 0x8234, 0xF338,
+ 0x4CFA, 0x8234, 0xF339,
+ 0x4CFB, 0x8234, 0xF430,
+ 0x4CFC, 0x8234, 0xF431,
+ 0x4CFD, 0x8234, 0xF432,
+ 0x4CFE, 0x8234, 0xF433,
+ 0x4CFF, 0x8234, 0xF434,
+ 0x4D00, 0x8234, 0xF435,
+ 0x4D01, 0x8234, 0xF436,
+ 0x4D02, 0x8234, 0xF437,
+ 0x4D03, 0x8234, 0xF438,
+ 0x4D04, 0x8234, 0xF439,
+ 0x4D05, 0x8234, 0xF530,
+ 0x4D06, 0x8234, 0xF531,
+ 0x4D07, 0x8234, 0xF532,
+ 0x4D08, 0x8234, 0xF533,
+ 0x4D09, 0x8234, 0xF534,
+ 0x4D0A, 0x8234, 0xF535,
+ 0x4D0B, 0x8234, 0xF536,
+ 0x4D0C, 0x8234, 0xF537,
+ 0x4D0D, 0x8234, 0xF538,
+ 0x4D0E, 0x8234, 0xF539,
+ 0x4D0F, 0x8234, 0xF630,
+ 0x4D10, 0x8234, 0xF631,
+ 0x4D11, 0x8234, 0xF632,
+ 0x4D12, 0x8234, 0xF633,
+ 0x4D1A, 0x8234, 0xF634,
+ 0x4D1B, 0x8234, 0xF635,
+ 0x4D1C, 0x8234, 0xF636,
+ 0x4D1D, 0x8234, 0xF637,
+ 0x4D1E, 0x8234, 0xF638,
+ 0x4D1F, 0x8234, 0xF639,
+ 0x4D20, 0x8234, 0xF730,
+ 0x4D21, 0x8234, 0xF731,
+ 0x4D22, 0x8234, 0xF732,
+ 0x4D23, 0x8234, 0xF733,
+ 0x4D24, 0x8234, 0xF734,
+ 0x4D25, 0x8234, 0xF735,
+ 0x4D26, 0x8234, 0xF736,
+ 0x4D27, 0x8234, 0xF737,
+ 0x4D28, 0x8234, 0xF738,
+ 0x4D29, 0x8234, 0xF739,
+ 0x4D2A, 0x8234, 0xF830,
+ 0x4D2B, 0x8234, 0xF831,
+ 0x4D2C, 0x8234, 0xF832,
+ 0x4D2D, 0x8234, 0xF833,
+ 0x4D2E, 0x8234, 0xF834,
+ 0x4D2F, 0x8234, 0xF835,
+ 0x4D30, 0x8234, 0xF836,
+ 0x4D31, 0x8234, 0xF837,
+ 0x4D32, 0x8234, 0xF838,
+ 0x4D33, 0x8234, 0xF839,
+ 0x4D34, 0x8234, 0xF930,
+ 0x4D35, 0x8234, 0xF931,
+ 0x4D36, 0x8234, 0xF932,
+ 0x4D37, 0x8234, 0xF933,
+ 0x4D38, 0x8234, 0xF934,
+ 0x4D39, 0x8234, 0xF935,
+ 0x4D3A, 0x8234, 0xF936,
+ 0x4D3B, 0x8234, 0xF937,
+ 0x4D3C, 0x8234, 0xF938,
+ 0x4D3D, 0x8234, 0xF939,
+ 0x4D3E, 0x8234, 0xFA30,
+ 0x4D3F, 0x8234, 0xFA31,
+ 0x4D40, 0x8234, 0xFA32,
+ 0x4D41, 0x8234, 0xFA33,
+ 0x4D42, 0x8234, 0xFA34,
+ 0x4D43, 0x8234, 0xFA35,
+ 0x4D44, 0x8234, 0xFA36,
+ 0x4D45, 0x8234, 0xFA37,
+ 0x4D46, 0x8234, 0xFA38,
+ 0x4D47, 0x8234, 0xFA39,
+ 0x4D48, 0x8234, 0xFB30,
+ 0x4D49, 0x8234, 0xFB31,
+ 0x4D4A, 0x8234, 0xFB32,
+ 0x4D4B, 0x8234, 0xFB33,
+ 0x4D4C, 0x8234, 0xFB34,
+ 0x4D4D, 0x8234, 0xFB35,
+ 0x4D4E, 0x8234, 0xFB36,
+ 0x4D4F, 0x8234, 0xFB37,
+ 0x4D50, 0x8234, 0xFB38,
+ 0x4D51, 0x8234, 0xFB39,
+ 0x4D52, 0x8234, 0xFC30,
+ 0x4D53, 0x8234, 0xFC31,
+ 0x4D54, 0x8234, 0xFC32,
+ 0x4D55, 0x8234, 0xFC33,
+ 0x4D56, 0x8234, 0xFC34,
+ 0x4D57, 0x8234, 0xFC35,
+ 0x4D58, 0x8234, 0xFC36,
+ 0x4D59, 0x8234, 0xFC37,
+ 0x4D5A, 0x8234, 0xFC38,
+ 0x4D5B, 0x8234, 0xFC39,
+ 0x4D5C, 0x8234, 0xFD30,
+ 0x4D5D, 0x8234, 0xFD31,
+ 0x4D5E, 0x8234, 0xFD32,
+ 0x4D5F, 0x8234, 0xFD33,
+ 0x4D60, 0x8234, 0xFD34,
+ 0x4D61, 0x8234, 0xFD35,
+ 0x4D62, 0x8234, 0xFD36,
+ 0x4D63, 0x8234, 0xFD37,
+ 0x4D64, 0x8234, 0xFD38,
+ 0x4D65, 0x8234, 0xFD39,
+ 0x4D66, 0x8234, 0xFE30,
+ 0x4D67, 0x8234, 0xFE31,
+ 0x4D68, 0x8234, 0xFE32,
+ 0x4D69, 0x8234, 0xFE33,
+ 0x4D6A, 0x8234, 0xFE34,
+ 0x4D6B, 0x8234, 0xFE35,
+ 0x4D6C, 0x8234, 0xFE36,
+ 0x4D6D, 0x8234, 0xFE37,
+ 0x4D6E, 0x8234, 0xFE38,
+ 0x4D6F, 0x8234, 0xFE39,
+ 0x4D70, 0x8235, 0x8130,
+ 0x4D71, 0x8235, 0x8131,
+ 0x4D72, 0x8235, 0x8132,
+ 0x4D73, 0x8235, 0x8133,
+ 0x4D74, 0x8235, 0x8134,
+ 0x4D75, 0x8235, 0x8135,
+ 0x4D76, 0x8235, 0x8136,
+ 0x4D77, 0x8235, 0x8137,
+ 0x4D78, 0x8235, 0x8138,
+ 0x4D79, 0x8235, 0x8139,
+ 0x4D7A, 0x8235, 0x8230,
+ 0x4D7B, 0x8235, 0x8231,
+ 0x4D7C, 0x8235, 0x8232,
+ 0x4D7D, 0x8235, 0x8233,
+ 0x4D7E, 0x8235, 0x8234,
+ 0x4D7F, 0x8235, 0x8235,
+ 0x4D80, 0x8235, 0x8236,
+ 0x4D81, 0x8235, 0x8237,
+ 0x4D82, 0x8235, 0x8238,
+ 0x4D83, 0x8235, 0x8239,
+ 0x4D84, 0x8235, 0x8330,
+ 0x4D85, 0x8235, 0x8331,
+ 0x4D86, 0x8235, 0x8332,
+ 0x4D87, 0x8235, 0x8333,
+ 0x4D88, 0x8235, 0x8334,
+ 0x4D89, 0x8235, 0x8335,
+ 0x4D8A, 0x8235, 0x8336,
+ 0x4D8B, 0x8235, 0x8337,
+ 0x4D8C, 0x8235, 0x8338,
+ 0x4D8D, 0x8235, 0x8339,
+ 0x4D8E, 0x8235, 0x8430,
+ 0x4D8F, 0x8235, 0x8431,
+ 0x4D90, 0x8235, 0x8432,
+ 0x4D91, 0x8235, 0x8433,
+ 0x4D92, 0x8235, 0x8434,
+ 0x4D93, 0x8235, 0x8435,
+ 0x4D94, 0x8235, 0x8436,
+ 0x4D95, 0x8235, 0x8437,
+ 0x4D96, 0x8235, 0x8438,
+ 0x4D97, 0x8235, 0x8439,
+ 0x4D98, 0x8235, 0x8530,
+ 0x4D99, 0x8235, 0x8531,
+ 0x4D9A, 0x8235, 0x8532,
+ 0x4D9B, 0x8235, 0x8533,
+ 0x4D9C, 0x8235, 0x8534,
+ 0x4D9D, 0x8235, 0x8535,
+ 0x4D9E, 0x8235, 0x8536,
+ 0x4D9F, 0x8235, 0x8537,
+ 0x4DA0, 0x8235, 0x8538,
+ 0x4DA1, 0x8235, 0x8539,
+ 0x4DA2, 0x8235, 0x8630,
+ 0x4DA3, 0x8235, 0x8631,
+ 0x4DA4, 0x8235, 0x8632,
+ 0x4DA5, 0x8235, 0x8633,
+ 0x4DA6, 0x8235, 0x8634,
+ 0x4DA7, 0x8235, 0x8635,
+ 0x4DA8, 0x8235, 0x8636,
+ 0x4DA9, 0x8235, 0x8637,
+ 0x4DAA, 0x8235, 0x8638,
+ 0x4DAB, 0x8235, 0x8639,
+ 0x4DAC, 0x8235, 0x8730,
+ 0x4DAD, 0x8235, 0x8731,
+ 0x4DAF, 0x8235, 0x8732,
+ 0x4DB0, 0x8235, 0x8733,
+ 0x4DB1, 0x8235, 0x8734,
+ 0x4DB2, 0x8235, 0x8735,
+ 0x4DB3, 0x8235, 0x8736,
+ 0x4DB4, 0x8235, 0x8737,
+ 0x4DB5, 0x8235, 0x8738,
+ 0x4DB6, 0x8235, 0x8739,
+ 0x4DB7, 0x8235, 0x8830,
+ 0x4DB8, 0x8235, 0x8831,
+ 0x4DB9, 0x8235, 0x8832,
+ 0x4DBA, 0x8235, 0x8833,
+ 0x4DBB, 0x8235, 0x8834,
+ 0x4DBC, 0x8235, 0x8835,
+ 0x4DBD, 0x8235, 0x8836,
+ 0x4DBE, 0x8235, 0x8837,
+ 0x4DBF, 0x8235, 0x8838,
+ 0x4DC0, 0x8235, 0x8839,
+ 0x4DC1, 0x8235, 0x8930,
+ 0x4DC2, 0x8235, 0x8931,
+ 0x4DC3, 0x8235, 0x8932,
+ 0x4DC4, 0x8235, 0x8933,
+ 0x4DC5, 0x8235, 0x8934,
+ 0x4DC6, 0x8235, 0x8935,
+ 0x4DC7, 0x8235, 0x8936,
+ 0x4DC8, 0x8235, 0x8937,
+ 0x4DC9, 0x8235, 0x8938,
+ 0x4DCA, 0x8235, 0x8939,
+ 0x4DCB, 0x8235, 0x8A30,
+ 0x4DCC, 0x8235, 0x8A31,
+ 0x4DCD, 0x8235, 0x8A32,
+ 0x4DCE, 0x8235, 0x8A33,
+ 0x4DCF, 0x8235, 0x8A34,
+ 0x4DD0, 0x8235, 0x8A35,
+ 0x4DD1, 0x8235, 0x8A36,
+ 0x4DD2, 0x8235, 0x8A37,
+ 0x4DD3, 0x8235, 0x8A38,
+ 0x4DD4, 0x8235, 0x8A39,
+ 0x4DD5, 0x8235, 0x8B30,
+ 0x4DD6, 0x8235, 0x8B31,
+ 0x4DD7, 0x8235, 0x8B32,
+ 0x4DD8, 0x8235, 0x8B33,
+ 0x4DD9, 0x8235, 0x8B34,
+ 0x4DDA, 0x8235, 0x8B35,
+ 0x4DDB, 0x8235, 0x8B36,
+ 0x4DDC, 0x8235, 0x8B37,
+ 0x4DDD, 0x8235, 0x8B38,
+ 0x4DDE, 0x8235, 0x8B39,
+ 0x4DDF, 0x8235, 0x8C30,
+ 0x4DE0, 0x8235, 0x8C31,
+ 0x4DE1, 0x8235, 0x8C32,
+ 0x4DE2, 0x8235, 0x8C33,
+ 0x4DE3, 0x8235, 0x8C34,
+ 0x4DE4, 0x8235, 0x8C35,
+ 0x4DE5, 0x8235, 0x8C36,
+ 0x4DE6, 0x8235, 0x8C37,
+ 0x4DE7, 0x8235, 0x8C38,
+ 0x4DE8, 0x8235, 0x8C39,
+ 0x4DE9, 0x8235, 0x8D30,
+ 0x4DEA, 0x8235, 0x8D31,
+ 0x4DEB, 0x8235, 0x8D32,
+ 0x4DEC, 0x8235, 0x8D33,
+ 0x4DED, 0x8235, 0x8D34,
+ 0x4DEE, 0x8235, 0x8D35,
+ 0x4DEF, 0x8235, 0x8D36,
+ 0x4DF0, 0x8235, 0x8D37,
+ 0x4DF1, 0x8235, 0x8D38,
+ 0x4DF2, 0x8235, 0x8D39,
+ 0x4DF3, 0x8235, 0x8E30,
+ 0x4DF4, 0x8235, 0x8E31,
+ 0x4DF5, 0x8235, 0x8E32,
+ 0x4DF6, 0x8235, 0x8E33,
+ 0x4DF7, 0x8235, 0x8E34,
+ 0x4DF8, 0x8235, 0x8E35,
+ 0x4DF9, 0x8235, 0x8E36,
+ 0x4DFA, 0x8235, 0x8E37,
+ 0x4DFB, 0x8235, 0x8E38,
+ 0x4DFC, 0x8235, 0x8E39,
+ 0x4DFD, 0x8235, 0x8F30,
+ 0x4DFE, 0x8235, 0x8F31,
+ 0x4DFF, 0x8235, 0x8F32,
+ 0xE76C, 0x8336, 0xC739,
+ 0xE7C8, 0x8336, 0xC830,
+ 0xE7E7, 0x8336, 0xC831,
+ 0xE7E8, 0x8336, 0xC832,
+ 0xE7E9, 0x8336, 0xC833,
+ 0xE7EA, 0x8336, 0xC834,
+ 0xE7EB, 0x8336, 0xC835,
+ 0xE7EC, 0x8336, 0xC836,
+ 0xE7ED, 0x8336, 0xC837,
+ 0xE7EE, 0x8336, 0xC838,
+ 0xE7EF, 0x8336, 0xC839,
+ 0xE7F0, 0x8336, 0xC930,
+ 0xE7F1, 0x8336, 0xC931,
+ 0xE7F2, 0x8336, 0xC932,
+ 0xE7F3, 0x8336, 0xC933,
+ 0xE815, 0x8336, 0xC934,
+ 0xE819, 0x8336, 0xC935,
+ 0xE81A, 0x8336, 0xC936,
+ 0xE81B, 0x8336, 0xC937,
+ 0xE81C, 0x8336, 0xC938,
+ 0xE81D, 0x8336, 0xC939,
+ 0xE81F, 0x8336, 0xCA30,
+ 0xE820, 0x8336, 0xCA31,
+ 0xE821, 0x8336, 0xCA32,
+ 0xE822, 0x8336, 0xCA33,
+ 0xE823, 0x8336, 0xCA34,
+ 0xE824, 0x8336, 0xCA35,
+ 0xE825, 0x8336, 0xCA36,
+ 0xE827, 0x8336, 0xCA37,
+ 0xE828, 0x8336, 0xCA38,
+ 0xE829, 0x8336, 0xCA39,
+ 0xE82A, 0x8336, 0xCB30,
+ 0xE82D, 0x8336, 0xCB31,
+ 0xE82E, 0x8336, 0xCB32,
+ 0xE82F, 0x8336, 0xCB33,
+ 0xE830, 0x8336, 0xCB34,
+ 0xE833, 0x8336, 0xCB35,
+ 0xE834, 0x8336, 0xCB36,
+ 0xE835, 0x8336, 0xCB37,
+ 0xE836, 0x8336, 0xCB38,
+ 0xE837, 0x8336, 0xCB39,
+ 0xE838, 0x8336, 0xCC30,
+ 0xE839, 0x8336, 0xCC31,
+ 0xE83A, 0x8336, 0xCC32,
+ 0xE83C, 0x8336, 0xCC33,
+ 0xE83D, 0x8336, 0xCC34,
+ 0xE83E, 0x8336, 0xCC35,
+ 0xE83F, 0x8336, 0xCC36,
+ 0xE840, 0x8336, 0xCC37,
+ 0xE841, 0x8336, 0xCC38,
+ 0xE842, 0x8336, 0xCC39,
+ 0xE844, 0x8336, 0xCD30,
+ 0xE845, 0x8336, 0xCD31,
+ 0xE846, 0x8336, 0xCD32,
+ 0xE847, 0x8336, 0xCD33,
+ 0xE848, 0x8336, 0xCD34,
+ 0xE849, 0x8336, 0xCD35,
+ 0xE84A, 0x8336, 0xCD36,
+ 0xE84B, 0x8336, 0xCD37,
+ 0xE84C, 0x8336, 0xCD38,
+ 0xE84D, 0x8336, 0xCD39,
+ 0xE84E, 0x8336, 0xCE30,
+ 0xE84F, 0x8336, 0xCE31,
+ 0xE850, 0x8336, 0xCE32,
+ 0xE851, 0x8336, 0xCE33,
+ 0xE852, 0x8336, 0xCE34,
+ 0xE853, 0x8336, 0xCE35,
+ 0xE856, 0x8336, 0xCE36,
+ 0xE857, 0x8336, 0xCE37,
+ 0xE858, 0x8336, 0xCE38,
+ 0xE859, 0x8336, 0xCE39,
+ 0xE85A, 0x8336, 0xCF30,
+ 0xE85B, 0x8336, 0xCF31,
+ 0xE85C, 0x8336, 0xCF32,
+ 0xE85D, 0x8336, 0xCF33,
+ 0xE85E, 0x8336, 0xCF34,
+ 0xE85F, 0x8336, 0xCF35,
+ 0xE860, 0x8336, 0xCF36,
+ 0xE861, 0x8336, 0xCF37,
+ 0xE862, 0x8336, 0xCF38,
+ 0xE863, 0x8336, 0xCF39,
+ 0xF92D, 0x8430, 0x8535,
+ 0xF92E, 0x8430, 0x8536,
+ 0xF92F, 0x8430, 0x8537,
+ 0xF930, 0x8430, 0x8538,
+ 0xF931, 0x8430, 0x8539,
+ 0xF932, 0x8430, 0x8630,
+ 0xF933, 0x8430, 0x8631,
+ 0xF934, 0x8430, 0x8632,
+ 0xF935, 0x8430, 0x8633,
+ 0xF936, 0x8430, 0x8634,
+ 0xF937, 0x8430, 0x8635,
+ 0xF938, 0x8430, 0x8636,
+ 0xF939, 0x8430, 0x8637,
+ 0xF93A, 0x8430, 0x8638,
+ 0xF93B, 0x8430, 0x8639,
+ 0xF93C, 0x8430, 0x8730,
+ 0xF93D, 0x8430, 0x8731,
+ 0xF93E, 0x8430, 0x8732,
+ 0xF93F, 0x8430, 0x8733,
+ 0xF940, 0x8430, 0x8734,
+ 0xF941, 0x8430, 0x8735,
+ 0xF942, 0x8430, 0x8736,
+ 0xF943, 0x8430, 0x8737,
+ 0xF944, 0x8430, 0x8738,
+ 0xF945, 0x8430, 0x8739,
+ 0xF946, 0x8430, 0x8830,
+ 0xF947, 0x8430, 0x8831,
+ 0xF948, 0x8430, 0x8832,
+ 0xF949, 0x8430, 0x8833,
+ 0xF94A, 0x8430, 0x8834,
+ 0xF94B, 0x8430, 0x8835,
+ 0xF94C, 0x8430, 0x8836,
+ 0xF94D, 0x8430, 0x8837,
+ 0xF94E, 0x8430, 0x8838,
+ 0xF94F, 0x8430, 0x8839,
+ 0xF950, 0x8430, 0x8930,
+ 0xF951, 0x8430, 0x8931,
+ 0xF952, 0x8430, 0x8932,
+ 0xF953, 0x8430, 0x8933,
+ 0xF954, 0x8430, 0x8934,
+ 0xF955, 0x8430, 0x8935,
+ 0xF956, 0x8430, 0x8936,
+ 0xF957, 0x8430, 0x8937,
+ 0xF958, 0x8430, 0x8938,
+ 0xF959, 0x8430, 0x8939,
+ 0xF95A, 0x8430, 0x8A30,
+ 0xF95B, 0x8430, 0x8A31,
+ 0xF95C, 0x8430, 0x8A32,
+ 0xF95D, 0x8430, 0x8A33,
+ 0xF95E, 0x8430, 0x8A34,
+ 0xF95F, 0x8430, 0x8A35,
+ 0xF960, 0x8430, 0x8A36,
+ 0xF961, 0x8430, 0x8A37,
+ 0xF962, 0x8430, 0x8A38,
+ 0xF963, 0x8430, 0x8A39,
+ 0xF964, 0x8430, 0x8B30,
+ 0xF965, 0x8430, 0x8B31,
+ 0xF966, 0x8430, 0x8B32,
+ 0xF967, 0x8430, 0x8B33,
+ 0xF968, 0x8430, 0x8B34,
+ 0xF969, 0x8430, 0x8B35,
+ 0xF96A, 0x8430, 0x8B36,
+ 0xF96B, 0x8430, 0x8B37,
+ 0xF96C, 0x8430, 0x8B38,
+ 0xF96D, 0x8430, 0x8B39,
+ 0xF96E, 0x8430, 0x8C30,
+ 0xF96F, 0x8430, 0x8C31,
+ 0xF970, 0x8430, 0x8C32,
+ 0xF971, 0x8430, 0x8C33,
+ 0xF972, 0x8430, 0x8C34,
+ 0xF973, 0x8430, 0x8C35,
+ 0xF974, 0x8430, 0x8C36,
+ 0xF975, 0x8430, 0x8C37,
+ 0xF976, 0x8430, 0x8C38,
+ 0xF977, 0x8430, 0x8C39,
+ 0xF978, 0x8430, 0x8D30,
+ 0xF97A, 0x8430, 0x8D31,
+ 0xF97B, 0x8430, 0x8D32,
+ 0xF97C, 0x8430, 0x8D33,
+ 0xF97D, 0x8430, 0x8D34,
+ 0xF97E, 0x8430, 0x8D35,
+ 0xF97F, 0x8430, 0x8D36,
+ 0xF980, 0x8430, 0x8D37,
+ 0xF981, 0x8430, 0x8D38,
+ 0xF982, 0x8430, 0x8D39,
+ 0xF983, 0x8430, 0x8E30,
+ 0xF984, 0x8430, 0x8E31,
+ 0xF985, 0x8430, 0x8E32,
+ 0xF986, 0x8430, 0x8E33,
+ 0xF987, 0x8430, 0x8E34,
+ 0xF988, 0x8430, 0x8E35,
+ 0xF989, 0x8430, 0x8E36,
+ 0xF98A, 0x8430, 0x8E37,
+ 0xF98B, 0x8430, 0x8E38,
+ 0xF98C, 0x8430, 0x8E39,
+ 0xF98D, 0x8430, 0x8F30,
+ 0xF98E, 0x8430, 0x8F31,
+ 0xF98F, 0x8430, 0x8F32,
+ 0xF990, 0x8430, 0x8F33,
+ 0xF991, 0x8430, 0x8F34,
+ 0xF992, 0x8430, 0x8F35,
+ 0xF993, 0x8430, 0x8F36,
+ 0xF994, 0x8430, 0x8F37,
+ 0xF996, 0x8430, 0x8F38,
+ 0xF997, 0x8430, 0x8F39,
+ 0xF998, 0x8430, 0x9030,
+ 0xF999, 0x8430, 0x9031,
+ 0xF99A, 0x8430, 0x9032,
+ 0xF99B, 0x8430, 0x9033,
+ 0xF99C, 0x8430, 0x9034,
+ 0xF99D, 0x8430, 0x9035,
+ 0xF99E, 0x8430, 0x9036,
+ 0xF99F, 0x8430, 0x9037,
+ 0xF9A0, 0x8430, 0x9038,
+ 0xF9A1, 0x8430, 0x9039,
+ 0xF9A2, 0x8430, 0x9130,
+ 0xF9A3, 0x8430, 0x9131,
+ 0xF9A4, 0x8430, 0x9132,
+ 0xF9A5, 0x8430, 0x9133,
+ 0xF9A6, 0x8430, 0x9134,
+ 0xF9A7, 0x8430, 0x9135,
+ 0xF9A8, 0x8430, 0x9136,
+ 0xF9A9, 0x8430, 0x9137,
+ 0xF9AA, 0x8430, 0x9138,
+ 0xF9AB, 0x8430, 0x9139,
+ 0xF9AC, 0x8430, 0x9230,
+ 0xF9AD, 0x8430, 0x9231,
+ 0xF9AE, 0x8430, 0x9232,
+ 0xF9AF, 0x8430, 0x9233,
+ 0xF9B0, 0x8430, 0x9234,
+ 0xF9B1, 0x8430, 0x9235,
+ 0xF9B2, 0x8430, 0x9236,
+ 0xF9B3, 0x8430, 0x9237,
+ 0xF9B4, 0x8430, 0x9238,
+ 0xF9B5, 0x8430, 0x9239,
+ 0xF9B6, 0x8430, 0x9330,
+ 0xF9B7, 0x8430, 0x9331,
+ 0xF9B8, 0x8430, 0x9332,
+ 0xF9B9, 0x8430, 0x9333,
+ 0xF9BA, 0x8430, 0x9334,
+ 0xF9BB, 0x8430, 0x9335,
+ 0xF9BC, 0x8430, 0x9336,
+ 0xF9BD, 0x8430, 0x9337,
+ 0xF9BE, 0x8430, 0x9338,
+ 0xF9BF, 0x8430, 0x9339,
+ 0xF9C0, 0x8430, 0x9430,
+ 0xF9C1, 0x8430, 0x9431,
+ 0xF9C2, 0x8430, 0x9432,
+ 0xF9C3, 0x8430, 0x9433,
+ 0xF9C4, 0x8430, 0x9434,
+ 0xF9C5, 0x8430, 0x9435,
+ 0xF9C6, 0x8430, 0x9436,
+ 0xF9C7, 0x8430, 0x9437,
+ 0xF9C8, 0x8430, 0x9438,
+ 0xF9C9, 0x8430, 0x9439,
+ 0xF9CA, 0x8430, 0x9530,
+ 0xF9CB, 0x8430, 0x9531,
+ 0xF9CC, 0x8430, 0x9532,
+ 0xF9CD, 0x8430, 0x9533,
+ 0xF9CE, 0x8430, 0x9534,
+ 0xF9CF, 0x8430, 0x9535,
+ 0xF9D0, 0x8430, 0x9536,
+ 0xF9D1, 0x8430, 0x9537,
+ 0xF9D2, 0x8430, 0x9538,
+ 0xF9D3, 0x8430, 0x9539,
+ 0xF9D4, 0x8430, 0x9630,
+ 0xF9D5, 0x8430, 0x9631,
+ 0xF9D6, 0x8430, 0x9632,
+ 0xF9D7, 0x8430, 0x9633,
+ 0xF9D8, 0x8430, 0x9634,
+ 0xF9D9, 0x8430, 0x9635,
+ 0xF9DA, 0x8430, 0x9636,
+ 0xF9DB, 0x8430, 0x9637,
+ 0xF9DC, 0x8430, 0x9638,
+ 0xF9DD, 0x8430, 0x9639,
+ 0xF9DE, 0x8430, 0x9730,
+ 0xF9DF, 0x8430, 0x9731,
+ 0xF9E0, 0x8430, 0x9732,
+ 0xF9E1, 0x8430, 0x9733,
+ 0xF9E2, 0x8430, 0x9734,
+ 0xF9E3, 0x8430, 0x9735,
+ 0xF9E4, 0x8430, 0x9736,
+ 0xF9E5, 0x8430, 0x9737,
+ 0xF9E6, 0x8430, 0x9738,
+ 0xF9E8, 0x8430, 0x9739,
+ 0xF9E9, 0x8430, 0x9830,
+ 0xF9EA, 0x8430, 0x9831,
+ 0xF9EB, 0x8430, 0x9832,
+ 0xF9EC, 0x8430, 0x9833,
+ 0xF9ED, 0x8430, 0x9834,
+ 0xF9EE, 0x8430, 0x9835,
+ 0xF9EF, 0x8430, 0x9836,
+ 0xF9F0, 0x8430, 0x9837,
+ 0xF9F2, 0x8430, 0x9838,
+ 0xF9F3, 0x8430, 0x9839,
+ 0xF9F4, 0x8430, 0x9930,
+ 0xF9F5, 0x8430, 0x9931,
+ 0xF9F6, 0x8430, 0x9932,
+ 0xF9F7, 0x8430, 0x9933,
+ 0xF9F8, 0x8430, 0x9934,
+ 0xF9F9, 0x8430, 0x9935,
+ 0xF9FA, 0x8430, 0x9936,
+ 0xF9FB, 0x8430, 0x9937,
+ 0xF9FC, 0x8430, 0x9938,
+ 0xF9FD, 0x8430, 0x9939,
+ 0xF9FE, 0x8430, 0x9A30,
+ 0xF9FF, 0x8430, 0x9A31,
+ 0xFA00, 0x8430, 0x9A32,
+ 0xFA01, 0x8430, 0x9A33,
+ 0xFA02, 0x8430, 0x9A34,
+ 0xFA03, 0x8430, 0x9A35,
+ 0xFA04, 0x8430, 0x9A36,
+ 0xFA05, 0x8430, 0x9A37,
+ 0xFA06, 0x8430, 0x9A38,
+ 0xFA07, 0x8430, 0x9A39,
+ 0xFA08, 0x8430, 0x9B30,
+ 0xFA09, 0x8430, 0x9B31,
+ 0xFA0A, 0x8430, 0x9B32,
+ 0xFA0B, 0x8430, 0x9B33,
+ 0xFA10, 0x8430, 0x9B34,
+ 0xFA12, 0x8430, 0x9B35,
+ 0xFA15, 0x8430, 0x9B36,
+ 0xFA16, 0x8430, 0x9B37,
+ 0xFA17, 0x8430, 0x9B38,
+ 0xFA19, 0x8430, 0x9B39,
+ 0xFA1A, 0x8430, 0x9C30,
+ 0xFA1B, 0x8430, 0x9C31,
+ 0xFA1C, 0x8430, 0x9C32,
+ 0xFA1D, 0x8430, 0x9C33,
+ 0xFA1E, 0x8430, 0x9C34,
+ 0xFA22, 0x8430, 0x9C35,
+ 0xFA25, 0x8430, 0x9C36,
+ 0xFA26, 0x8430, 0x9C37,
+ 0xFE32, 0x8431, 0x8538,
+ 0xFE45, 0x8431, 0x8539,
+ 0xFE46, 0x8431, 0x8630,
+ 0xFE47, 0x8431, 0x8631,
+ 0xFE48, 0x8431, 0x8632,
+ 0xFE53, 0x8431, 0x8633,
+ 0xFE58, 0x8431, 0x8634,
+ 0xFE67, 0x8431, 0x8635,
+ 0xFE6C, 0x8431, 0x8636,
+ 0xFE6D, 0x8431, 0x8637,
+ 0xFE6E, 0x8431, 0x8638,
+ 0xFE6F, 0x8431, 0x8639,
+ 0xFE70, 0x8431, 0x8730,
+ 0xFE71, 0x8431, 0x8731,
+ 0xFE72, 0x8431, 0x8732,
+ 0xFE73, 0x8431, 0x8733,
+ 0xFE74, 0x8431, 0x8734,
+ 0xFE75, 0x8431, 0x8735,
+ 0xFE76, 0x8431, 0x8736,
+ 0xFE77, 0x8431, 0x8737,
+ 0xFE78, 0x8431, 0x8738,
+ 0xFE79, 0x8431, 0x8739,
+ 0xFE7A, 0x8431, 0x8830,
+ 0xFE7B, 0x8431, 0x8831,
+ 0xFE7C, 0x8431, 0x8832,
+ 0xFE7D, 0x8431, 0x8833,
+ 0xFE7E, 0x8431, 0x8834,
+ 0xFE7F, 0x8431, 0x8835,
+ 0xFE80, 0x8431, 0x8836,
+ 0xFE81, 0x8431, 0x8837,
+ 0xFE82, 0x8431, 0x8838,
+ 0xFE83, 0x8431, 0x8839,
+ 0xFE84, 0x8431, 0x8930,
+ 0xFE85, 0x8431, 0x8931,
+ 0xFE86, 0x8431, 0x8932,
+ 0xFE87, 0x8431, 0x8933,
+ 0xFE88, 0x8431, 0x8934,
+ 0xFE89, 0x8431, 0x8935,
+ 0xFE8A, 0x8431, 0x8936,
+ 0xFE8B, 0x8431, 0x8937,
+ 0xFE8C, 0x8431, 0x8938,
+ 0xFE8D, 0x8431, 0x8939,
+ 0xFE8E, 0x8431, 0x8A30,
+ 0xFE8F, 0x8431, 0x8A31,
+ 0xFE90, 0x8431, 0x8A32,
+ 0xFE91, 0x8431, 0x8A33,
+ 0xFE92, 0x8431, 0x8A34,
+ 0xFE93, 0x8431, 0x8A35,
+ 0xFE94, 0x8431, 0x8A36,
+ 0xFE95, 0x8431, 0x8A37,
+ 0xFE96, 0x8431, 0x8A38,
+ 0xFE97, 0x8431, 0x8A39,
+ 0xFE98, 0x8431, 0x8B30,
+ 0xFE99, 0x8431, 0x8B31,
+ 0xFE9A, 0x8431, 0x8B32,
+ 0xFE9B, 0x8431, 0x8B33,
+ 0xFE9C, 0x8431, 0x8B34,
+ 0xFE9D, 0x8431, 0x8B35,
+ 0xFE9E, 0x8431, 0x8B36,
+ 0xFE9F, 0x8431, 0x8B37,
+ 0xFEA0, 0x8431, 0x8B38,
+ 0xFEA1, 0x8431, 0x8B39,
+ 0xFEA2, 0x8431, 0x8C30,
+ 0xFEA3, 0x8431, 0x8C31,
+ 0xFEA4, 0x8431, 0x8C32,
+ 0xFEA5, 0x8431, 0x8C33,
+ 0xFEA6, 0x8431, 0x8C34,
+ 0xFEA7, 0x8431, 0x8C35,
+ 0xFEA8, 0x8431, 0x8C36,
+ 0xFEA9, 0x8431, 0x8C37,
+ 0xFEAA, 0x8431, 0x8C38,
+ 0xFEAB, 0x8431, 0x8C39,
+ 0xFEAC, 0x8431, 0x8D30,
+ 0xFEAD, 0x8431, 0x8D31,
+ 0xFEAE, 0x8431, 0x8D32,
+ 0xFEAF, 0x8431, 0x8D33,
+ 0xFEB0, 0x8431, 0x8D34,
+ 0xFEB1, 0x8431, 0x8D35,
+ 0xFEB2, 0x8431, 0x8D36,
+ 0xFEB3, 0x8431, 0x8D37,
+ 0xFEB4, 0x8431, 0x8D38,
+ 0xFEB5, 0x8431, 0x8D39,
+ 0xFEB6, 0x8431, 0x8E30,
+ 0xFEB7, 0x8431, 0x8E31,
+ 0xFEB8, 0x8431, 0x8E32,
+ 0xFEB9, 0x8431, 0x8E33,
+ 0xFEBA, 0x8431, 0x8E34,
+ 0xFEBB, 0x8431, 0x8E35,
+ 0xFEBC, 0x8431, 0x8E36,
+ 0xFEBD, 0x8431, 0x8E37,
+ 0xFEBE, 0x8431, 0x8E38,
+ 0xFEBF, 0x8431, 0x8E39,
+ 0xFEC0, 0x8431, 0x8F30,
+ 0xFEC1, 0x8431, 0x8F31,
+ 0xFEC2, 0x8431, 0x8F32,
+ 0xFEC3, 0x8431, 0x8F33,
+ 0xFEC4, 0x8431, 0x8F34,
+ 0xFEC5, 0x8431, 0x8F35,
+ 0xFEC6, 0x8431, 0x8F36,
+ 0xFEC7, 0x8431, 0x8F37,
+ 0xFEC8, 0x8431, 0x8F38,
+ 0xFEC9, 0x8431, 0x8F39,
+ 0xFECA, 0x8431, 0x9030,
+ 0xFECB, 0x8431, 0x9031,
+ 0xFECC, 0x8431, 0x9032,
+ 0xFECD, 0x8431, 0x9033,
+ 0xFECE, 0x8431, 0x9034,
+ 0xFECF, 0x8431, 0x9035,
+ 0xFED0, 0x8431, 0x9036,
+ 0xFED1, 0x8431, 0x9037,
+ 0xFED2, 0x8431, 0x9038,
+ 0xFED3, 0x8431, 0x9039,
+ 0xFED4, 0x8431, 0x9130,
+ 0xFED5, 0x8431, 0x9131,
+ 0xFED6, 0x8431, 0x9132,
+ 0xFED7, 0x8431, 0x9133,
+ 0xFED8, 0x8431, 0x9134,
+ 0xFED9, 0x8431, 0x9135,
+ 0xFEDA, 0x8431, 0x9136,
+ 0xFEDB, 0x8431, 0x9137,
+ 0xFEDC, 0x8431, 0x9138,
+ 0xFEDD, 0x8431, 0x9139,
+ 0xFEDE, 0x8431, 0x9230,
+ 0xFEDF, 0x8431, 0x9231,
+ 0xFEE0, 0x8431, 0x9232,
+ 0xFEE1, 0x8431, 0x9233,
+ 0xFEE2, 0x8431, 0x9234,
+ 0xFEE3, 0x8431, 0x9235,
+ 0xFEE4, 0x8431, 0x9236,
+ 0xFEE5, 0x8431, 0x9237,
+ 0xFEE6, 0x8431, 0x9238,
+ 0xFEE7, 0x8431, 0x9239,
+ 0xFEE8, 0x8431, 0x9330,
+ 0xFEE9, 0x8431, 0x9331,
+ 0xFEEA, 0x8431, 0x9332,
+ 0xFEEB, 0x8431, 0x9333,
+ 0xFEEC, 0x8431, 0x9334,
+ 0xFEED, 0x8431, 0x9335,
+ 0xFEEE, 0x8431, 0x9336,
+ 0xFEEF, 0x8431, 0x9337,
+ 0xFEF0, 0x8431, 0x9338,
+ 0xFEF1, 0x8431, 0x9339,
+ 0xFEF2, 0x8431, 0x9430,
+ 0xFEF3, 0x8431, 0x9431,
+ 0xFEF4, 0x8431, 0x9432,
+ 0xFEF5, 0x8431, 0x9433,
+ 0xFEF6, 0x8431, 0x9434,
+ 0xFEF7, 0x8431, 0x9435,
+ 0xFEF8, 0x8431, 0x9436,
+ 0xFEF9, 0x8431, 0x9437,
+ 0xFEFA, 0x8431, 0x9438,
+ 0xFEFB, 0x8431, 0x9439,
+ 0xFEFC, 0x8431, 0x9530,
+ 0xFEFD, 0x8431, 0x9531,
+ 0xFEFE, 0x8431, 0x9532,
+ 0xFEFF, 0x8431, 0x9533,
+ 0xFF00, 0x8431, 0x9534,
+ 0xFF5F, 0x8431, 0x9535,
+ 0xFF60, 0x8431, 0x9536,
+ 0xFF61, 0x8431, 0x9537,
+ 0xFF62, 0x8431, 0x9538,
+ 0xFF63, 0x8431, 0x9539,
+ 0xFF64, 0x8431, 0x9630,
+ 0xFF65, 0x8431, 0x9631,
+ 0xFF66, 0x8431, 0x9632,
+ 0xFF67, 0x8431, 0x9633,
+ 0xFF68, 0x8431, 0x9634,
+ 0xFF69, 0x8431, 0x9635,
+ 0xFF6A, 0x8431, 0x9636,
+ 0xFF6B, 0x8431, 0x9637,
+ 0xFF6C, 0x8431, 0x9638,
+ 0xFF6D, 0x8431, 0x9639,
+ 0xFF6E, 0x8431, 0x9730,
+ 0xFF6F, 0x8431, 0x9731,
+ 0xFF70, 0x8431, 0x9732,
+ 0xFF71, 0x8431, 0x9733,
+ 0xFF72, 0x8431, 0x9734,
+ 0xFF73, 0x8431, 0x9735,
+ 0xFF74, 0x8431, 0x9736,
+ 0xFF75, 0x8431, 0x9737,
+ 0xFF76, 0x8431, 0x9738,
+ 0xFF77, 0x8431, 0x9739,
+ 0xFF78, 0x8431, 0x9830,
+ 0xFF79, 0x8431, 0x9831,
+ 0xFF7A, 0x8431, 0x9832,
+ 0xFF7B, 0x8431, 0x9833,
+ 0xFF7C, 0x8431, 0x9834,
+ 0xFF7D, 0x8431, 0x9835,
+ 0xFF7E, 0x8431, 0x9836,
+ 0xFF7F, 0x8431, 0x9837,
+ 0xFF80, 0x8431, 0x9838,
+ 0xFF81, 0x8431, 0x9839,
+ 0xFF82, 0x8431, 0x9930,
+ 0xFF83, 0x8431, 0x9931,
+ 0xFF84, 0x8431, 0x9932,
+ 0xFF85, 0x8431, 0x9933,
+ 0xFF86, 0x8431, 0x9934,
+ 0xFF87, 0x8431, 0x9935,
+ 0xFF88, 0x8431, 0x9936,
+ 0xFF89, 0x8431, 0x9937,
+ 0xFF8A, 0x8431, 0x9938,
+ 0xFF8B, 0x8431, 0x9939,
+ 0xFF8C, 0x8431, 0x9A30,
+ 0xFF8D, 0x8431, 0x9A31,
+ 0xFF8E, 0x8431, 0x9A32,
+ 0xFF8F, 0x8431, 0x9A33,
+ 0xFF90, 0x8431, 0x9A34,
+ 0xFF91, 0x8431, 0x9A35,
+ 0xFF92, 0x8431, 0x9A36,
+ 0xFF93, 0x8431, 0x9A37,
+ 0xFF94, 0x8431, 0x9A38,
+ 0xFF95, 0x8431, 0x9A39,
+ 0xFF96, 0x8431, 0x9B30,
+ 0xFF97, 0x8431, 0x9B31,
+ 0xFF98, 0x8431, 0x9B32,
+ 0xFF99, 0x8431, 0x9B33,
+ 0xFF9A, 0x8431, 0x9B34,
+ 0xFF9B, 0x8431, 0x9B35,
+ 0xFF9C, 0x8431, 0x9B36,
+ 0xFF9D, 0x8431, 0x9B37,
+ 0xFF9E, 0x8431, 0x9B38,
+ 0xFF9F, 0x8431, 0x9B39,
+ 0xFFA0, 0x8431, 0x9C30,
+ 0xFFA1, 0x8431, 0x9C31,
+ 0xFFA2, 0x8431, 0x9C32,
+ 0xFFA3, 0x8431, 0x9C33,
+ 0xFFA4, 0x8431, 0x9C34,
+ 0xFFA5, 0x8431, 0x9C35,
+ 0xFFA6, 0x8431, 0x9C36,
+ 0xFFA7, 0x8431, 0x9C37,
+ 0xFFA8, 0x8431, 0x9C38,
+ 0xFFA9, 0x8431, 0x9C39,
+ 0xFFAA, 0x8431, 0x9D30,
+ 0xFFAB, 0x8431, 0x9D31,
+ 0xFFAC, 0x8431, 0x9D32,
+ 0xFFAD, 0x8431, 0x9D33,
+ 0xFFAE, 0x8431, 0x9D34,
+ 0xFFAF, 0x8431, 0x9D35,
+ 0xFFB0, 0x8431, 0x9D36,
+ 0xFFB1, 0x8431, 0x9D37,
+ 0xFFB2, 0x8431, 0x9D38,
+ 0xFFB3, 0x8431, 0x9D39,
+ 0xFFB4, 0x8431, 0x9E30,
+ 0xFFB5, 0x8431, 0x9E31,
+ 0xFFB6, 0x8431, 0x9E32,
+ 0xFFB7, 0x8431, 0x9E33,
+ 0xFFB8, 0x8431, 0x9E34,
+ 0xFFB9, 0x8431, 0x9E35,
+ 0xFFBA, 0x8431, 0x9E36,
+ 0xFFBB, 0x8431, 0x9E37,
+ 0xFFBC, 0x8431, 0x9E38,
+ 0xFFBD, 0x8431, 0x9E39,
+ 0xFFBE, 0x8431, 0x9F30,
+ 0xFFBF, 0x8431, 0x9F31,
+ 0xFFC0, 0x8431, 0x9F32,
+ 0xFFC1, 0x8431, 0x9F33,
+ 0xFFC2, 0x8431, 0x9F34,
+ 0xFFC3, 0x8431, 0x9F35,
+ 0xFFC4, 0x8431, 0x9F36,
+ 0xFFC5, 0x8431, 0x9F37,
+ 0xFFC6, 0x8431, 0x9F38,
+ 0xFFC7, 0x8431, 0x9F39,
+ 0xFFC8, 0x8431, 0xA030,
+ 0xFFC9, 0x8431, 0xA031,
+ 0xFFCA, 0x8431, 0xA032,
+ 0xFFCB, 0x8431, 0xA033,
+ 0xFFCC, 0x8431, 0xA034,
+ 0xFFCD, 0x8431, 0xA035,
+ 0xFFCE, 0x8431, 0xA036,
+ 0xFFCF, 0x8431, 0xA037,
+ 0xFFD0, 0x8431, 0xA038,
+ 0xFFD1, 0x8431, 0xA039,
+ 0xFFD2, 0x8431, 0xA130,
+ 0xFFD3, 0x8431, 0xA131,
+ 0xFFD4, 0x8431, 0xA132,
+ 0xFFD5, 0x8431, 0xA133,
+ 0xFFD6, 0x8431, 0xA134,
+ 0xFFD7, 0x8431, 0xA135,
+ 0xFFD8, 0x8431, 0xA136,
+ 0xFFD9, 0x8431, 0xA137,
+ 0xFFDA, 0x8431, 0xA138,
+ 0xFFDB, 0x8431, 0xA139,
+ 0xFFDC, 0x8431, 0xA230,
+ 0xFFDD, 0x8431, 0xA231,
+ 0xFFDE, 0x8431, 0xA232,
+ 0xFFDF, 0x8431, 0xA233
+};
\ No newline at end of file
diff --git a/3rdparty/zint-2.6.1/backend/gb2312.h b/3rdparty/zint-2.6.1/backend/gb2312.h
new file mode 100644
index 0000000..56cc4b2
--- /dev/null
+++ b/3rdparty/zint-2.6.1/backend/gb2312.h
@@ -0,0 +1,7478 @@
+/* gb2312.h - Unicode to GB 2312-1980 lookup table
+
+ libzint - the open source barcode library
+ Copyright (C) 2009-2017 Robin Stuart
+
+ Redistribution and use in source and binary forms, with or without
+ modification, are permitted provided that the following conditions
+ are met:
+
+ 1. Redistributions of source code must retain the above copyright
+ notice, this list of conditions and the following disclaimer.
+ 2. Redistributions in binary form must reproduce the above copyright
+ notice, this list of conditions and the following disclaimer in the
+ documentation and/or other materials provided with the distribution.
+ 3. Neither the name of the project nor the names of its contributors
+ may be used to endorse or promote products derived from this software
+ without specific prior written permission.
+
+ THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND
+ ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+ ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE
+ FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+ DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
+ OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
+ HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
+ LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
+ OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+ SUCH DAMAGE.
+ */
+
+static const unsigned short int gb2312_lookup[] = {
+ 0x00A4, 0xA1E8,
+ 0x00A7, 0xA1EC,
+ 0x00A8, 0xA1A7,
+ 0x00B0, 0xA1E3,
+ 0x00B1, 0xA1C0,
+ 0x00B7, 0xA1A4,
+ 0x00D7, 0xA1C1,
+ 0x00E0, 0xA8A4,
+ 0x00E1, 0xA8A2,
+ 0x00E8, 0xA8A8,
+ 0x00E9, 0xA8A6,
+ 0x00EA, 0xA8BA,
+ 0x00EC, 0xA8AC,
+ 0x00ED, 0xA8AA,
+ 0x00F2, 0xA8B0,
+ 0x00F3, 0xA8AE,
+ 0x00F7, 0xA1C2,
+ 0x00F9, 0xA8B4,
+ 0x00FA, 0xA8B2,
+ 0x00FC, 0xA8B9,
+ 0x0101, 0xA8A1,
+ 0x0113, 0xA8A5,
+ 0x011B, 0xA8A7,
+ 0x012B, 0xA8A9,
+ 0x014D, 0xA8AD,
+ 0x016B, 0xA8B1,
+ 0x01CE, 0xA8A3,
+ 0x01D0, 0xA8AB,
+ 0x01D2, 0xA8AF,
+ 0x01D4, 0xA8B3,
+ 0x01D6, 0xA8B5,
+ 0x01D8, 0xA8B6,
+ 0x01DA, 0xA8B7,
+ 0x01DC, 0xA8B8,
+ 0x02C7, 0xA1A6,
+ 0x02C9, 0xA1A5,
+ 0x0391, 0xA6A1,
+ 0x0392, 0xA6A2,
+ 0x0393, 0xA6A3,
+ 0x0394, 0xA6A4,
+ 0x0395, 0xA6A5,
+ 0x0396, 0xA6A6,
+ 0x0397, 0xA6A7,
+ 0x0398, 0xA6A8,
+ 0x0399, 0xA6A9,
+ 0x039A, 0xA6AA,
+ 0x039B, 0xA6AB,
+ 0x039C, 0xA6AC,
+ 0x039D, 0xA6AD,
+ 0x039E, 0xA6AE,
+ 0x039F, 0xA6AF,
+ 0x03A0, 0xA6B0,
+ 0x03A1, 0xA6B1,
+ 0x03A3, 0xA6B2,
+ 0x03A4, 0xA6B3,
+ 0x03A5, 0xA6B4,
+ 0x03A6, 0xA6B5,
+ 0x03A7, 0xA6B6,
+ 0x03A8, 0xA6B7,
+ 0x03A9, 0xA6B8,
+ 0x03B1, 0xA6C1,
+ 0x03B2, 0xA6C2,
+ 0x03B3, 0xA6C3,
+ 0x03B4, 0xA6C4,
+ 0x03B5, 0xA6C5,
+ 0x03B6, 0xA6C6,
+ 0x03B7, 0xA6C7,
+ 0x03B8, 0xA6C8,
+ 0x03B9, 0xA6C9,
+ 0x03BA, 0xA6CA,
+ 0x03BB, 0xA6CB,
+ 0x03BC, 0xA6CC,
+ 0x03BD, 0xA6CD,
+ 0x03BE, 0xA6CE,
+ 0x03BF, 0xA6CF,
+ 0x03C0, 0xA6D0,
+ 0x03C1, 0xA6D1,
+ 0x03C3, 0xA6D2,
+ 0x03C4, 0xA6D3,
+ 0x03C5, 0xA6D4,
+ 0x03C6, 0xA6D5,
+ 0x03C7, 0xA6D6,
+ 0x03C8, 0xA6D7,
+ 0x03C9, 0xA6D8,
+ 0x0401, 0xA7A7,
+ 0x0410, 0xA7A1,
+ 0x0411, 0xA7A2,
+ 0x0412, 0xA7A3,
+ 0x0413, 0xA7A4,
+ 0x0414, 0xA7A5,
+ 0x0415, 0xA7A6,
+ 0x0416, 0xA7A8,
+ 0x0417, 0xA7A9,
+ 0x0418, 0xA7AA,
+ 0x0419, 0xA7AB,
+ 0x041A, 0xA7AC,
+ 0x041B, 0xA7AD,
+ 0x041C, 0xA7AE,
+ 0x041D, 0xA7AF,
+ 0x041E, 0xA7B0,
+ 0x041F, 0xA7B1,
+ 0x0420, 0xA7B2,
+ 0x0421, 0xA7B3,
+ 0x0422, 0xA7B4,
+ 0x0423, 0xA7B5,
+ 0x0424, 0xA7B6,
+ 0x0425, 0xA7B7,
+ 0x0426, 0xA7B8,
+ 0x0427, 0xA7B9,
+ 0x0428, 0xA7BA,
+ 0x0429, 0xA7BB,
+ 0x042A, 0xA7BC,
+ 0x042B, 0xA7BD,
+ 0x042C, 0xA7BE,
+ 0x042D, 0xA7BF,
+ 0x042E, 0xA7C0,
+ 0x042F, 0xA7C1,
+ 0x0430, 0xA7D1,
+ 0x0431, 0xA7D2,
+ 0x0432, 0xA7D3,
+ 0x0433, 0xA7D4,
+ 0x0434, 0xA7D5,
+ 0x0435, 0xA7D6,
+ 0x0436, 0xA7D8,
+ 0x0437, 0xA7D9,
+ 0x0438, 0xA7DA,
+ 0x0439, 0xA7DB,
+ 0x043A, 0xA7DC,
+ 0x043B, 0xA7DD,
+ 0x043C, 0xA7DE,
+ 0x043D, 0xA7DF,
+ 0x043E, 0xA7E0,
+ 0x043F, 0xA7E1,
+ 0x0440, 0xA7E2,
+ 0x0441, 0xA7E3,
+ 0x0442, 0xA7E4,
+ 0x0443, 0xA7E5,
+ 0x0444, 0xA7E6,
+ 0x0445, 0xA7E7,
+ 0x0446, 0xA7E8,
+ 0x0447, 0xA7E9,
+ 0x0448, 0xA7EA,
+ 0x0449, 0xA7EB,
+ 0x044A, 0xA7EC,
+ 0x044B, 0xA7ED,
+ 0x044C, 0xA7EE,
+ 0x044D, 0xA7EF,
+ 0x044E, 0xA7F0,
+ 0x044F, 0xA7F1,
+ 0x0451, 0xA7D7,
+ 0x2014, 0xA1AA,
+ 0x2016, 0xA1AC,
+ 0x2018, 0xA1AE,
+ 0x2019, 0xA1AF,
+ 0x201C, 0xA1B0,
+ 0x201D, 0xA1B1,
+ 0x2026, 0xA1AD,
+ 0x2030, 0xA1EB,
+ 0x2032, 0xA1E4,
+ 0x2033, 0xA1E5,
+ 0x203B, 0xA1F9,
+ 0x2103, 0xA1E6,
+ 0x2116, 0xA1ED,
+ 0x2160, 0xA2F1,
+ 0x2161, 0xA2F2,
+ 0x2162, 0xA2F3,
+ 0x2163, 0xA2F4,
+ 0x2164, 0xA2F5,
+ 0x2165, 0xA2F6,
+ 0x2166, 0xA2F7,
+ 0x2167, 0xA2F8,
+ 0x2168, 0xA2F9,
+ 0x2169, 0xA2FA,
+ 0x216A, 0xA2FB,
+ 0x216B, 0xA2FC,
+ 0x2190, 0xA1FB,
+ 0x2191, 0xA1FC,
+ 0x2192, 0xA1FA,
+ 0x2193, 0xA1FD,
+ 0x2208, 0xA1CA,
+ 0x220F, 0xA1C7,
+ 0x2211, 0xA1C6,
+ 0x221A, 0xA1CC,
+ 0x221D, 0xA1D8,
+ 0x221E, 0xA1DE,
+ 0x2220, 0xA1CF,
+ 0x2225, 0xA1CE,
+ 0x2227, 0xA1C4,
+ 0x2228, 0xA1C5,
+ 0x2229, 0xA1C9,
+ 0x222A, 0xA1C8,
+ 0x222B, 0xA1D2,
+ 0x222E, 0xA1D3,
+ 0x2234, 0xA1E0,
+ 0x2235, 0xA1DF,
+ 0x2236, 0xA1C3,
+ 0x2237, 0xA1CB,
+ 0x223D, 0xA1D7,
+ 0x2248, 0xA1D6,
+ 0x224C, 0xA1D5,
+ 0x2260, 0xA1D9,
+ 0x2261, 0xA1D4,
+ 0x2264, 0xA1DC,
+ 0x2265, 0xA1DD,
+ 0x226E, 0xA1DA,
+ 0x226F, 0xA1DB,
+ 0x2299, 0xA1D1,
+ 0x22A5, 0xA1CD,
+ 0x2312, 0xA1D0,
+ 0x2460, 0xA2D9,
+ 0x2461, 0xA2DA,
+ 0x2462, 0xA2DB,
+ 0x2463, 0xA2DC,
+ 0x2464, 0xA2DD,
+ 0x2465, 0xA2DE,
+ 0x2466, 0xA2DF,
+ 0x2467, 0xA2E0,
+ 0x2468, 0xA2E1,
+ 0x2469, 0xA2E2,
+ 0x2474, 0xA2C5,
+ 0x2475, 0xA2C6,
+ 0x2476, 0xA2C7,
+ 0x2477, 0xA2C8,
+ 0x2478, 0xA2C9,
+ 0x2479, 0xA2CA,
+ 0x247A, 0xA2CB,
+ 0x247B, 0xA2CC,
+ 0x247C, 0xA2CD,
+ 0x247D, 0xA2CE,
+ 0x247E, 0xA2CF,
+ 0x247F, 0xA2D0,
+ 0x2480, 0xA2D1,
+ 0x2481, 0xA2D2,
+ 0x2482, 0xA2D3,
+ 0x2483, 0xA2D4,
+ 0x2484, 0xA2D5,
+ 0x2485, 0xA2D6,
+ 0x2486, 0xA2D7,
+ 0x2487, 0xA2D8,
+ 0x2488, 0xA2B1,
+ 0x2489, 0xA2B2,
+ 0x248A, 0xA2B3,
+ 0x248B, 0xA2B4,
+ 0x248C, 0xA2B5,
+ 0x248D, 0xA2B6,
+ 0x248E, 0xA2B7,
+ 0x248F, 0xA2B8,
+ 0x2490, 0xA2B9,
+ 0x2491, 0xA2BA,
+ 0x2492, 0xA2BB,
+ 0x2493, 0xA2BC,
+ 0x2494, 0xA2BD,
+ 0x2495, 0xA2BE,
+ 0x2496, 0xA2BF,
+ 0x2497, 0xA2C0,
+ 0x2498, 0xA2C1,
+ 0x2499, 0xA2C2,
+ 0x249A, 0xA2C3,
+ 0x249B, 0xA2C4,
+ 0x2500, 0xA9A4,
+ 0x2501, 0xA9A5,
+ 0x2502, 0xA9A6,
+ 0x2503, 0xA9A7,
+ 0x2504, 0xA9A8,
+ 0x2505, 0xA9A9,
+ 0x2506, 0xA9AA,
+ 0x2507, 0xA9AB,
+ 0x2508, 0xA9AC,
+ 0x2509, 0xA9AD,
+ 0x250A, 0xA9AE,
+ 0x250B, 0xA9AF,
+ 0x250C, 0xA9B0,
+ 0x250D, 0xA9B1,
+ 0x250E, 0xA9B2,
+ 0x250F, 0xA9B3,
+ 0x2510, 0xA9B4,
+ 0x2511, 0xA9B5,
+ 0x2512, 0xA9B6,
+ 0x2513, 0xA9B7,
+ 0x2514, 0xA9B8,
+ 0x2515, 0xA9B9,
+ 0x2516, 0xA9BA,
+ 0x2517, 0xA9BB,
+ 0x2518, 0xA9BC,
+ 0x2519, 0xA9BD,
+ 0x251A, 0xA9BE,
+ 0x251B, 0xA9BF,
+ 0x251C, 0xA9C0,
+ 0x251D, 0xA9C1,
+ 0x251E, 0xA9C2,
+ 0x251F, 0xA9C3,
+ 0x2520, 0xA9C4,
+ 0x2521, 0xA9C5,
+ 0x2522, 0xA9C6,
+ 0x2523, 0xA9C7,
+ 0x2524, 0xA9C8,
+ 0x2525, 0xA9C9,
+ 0x2526, 0xA9CA,
+ 0x2527, 0xA9CB,
+ 0x2528, 0xA9CC,
+ 0x2529, 0xA9CD,
+ 0x252A, 0xA9CE,
+ 0x252B, 0xA9CF,
+ 0x252C, 0xA9D0,
+ 0x252D, 0xA9D1,
+ 0x252E, 0xA9D2,
+ 0x252F, 0xA9D3,
+ 0x2530, 0xA9D4,
+ 0x2531, 0xA9D5,
+ 0x2532, 0xA9D6,
+ 0x2533, 0xA9D7,
+ 0x2534, 0xA9D8,
+ 0x2535, 0xA9D9,
+ 0x2536, 0xA9DA,
+ 0x2537, 0xA9DB,
+ 0x2538, 0xA9DC,
+ 0x2539, 0xA9DD,
+ 0x253A, 0xA9DE,
+ 0x253B, 0xA9DF,
+ 0x253C, 0xA9E0,
+ 0x253D, 0xA9E1,
+ 0x253E, 0xA9E2,
+ 0x253F, 0xA9E3,
+ 0x2540, 0xA9E4,
+ 0x2541, 0xA9E5,
+ 0x2542, 0xA9E6,
+ 0x2543, 0xA9E7,
+ 0x2544, 0xA9E8,
+ 0x2545, 0xA9E9,
+ 0x2546, 0xA9EA,
+ 0x2547, 0xA9EB,
+ 0x2548, 0xA9EC,
+ 0x2549, 0xA9ED,
+ 0x254A, 0xA9EE,
+ 0x254B, 0xA9EF,
+ 0x25A0, 0xA1F6,
+ 0x25A1, 0xA1F5,
+ 0x25B2, 0xA1F8,
+ 0x25B3, 0xA1F7,
+ 0x25C6, 0xA1F4,
+ 0x25C7, 0xA1F3,
+ 0x25CB, 0xA1F0,
+ 0x25CE, 0xA1F2,
+ 0x25CF, 0xA1F1,
+ 0x2605, 0xA1EF,
+ 0x2606, 0xA1EE,
+ 0x2640, 0xA1E2,
+ 0x2642, 0xA1E1,
+ 0x3000, 0xA1A1,
+ 0x3001, 0xA1A2,
+ 0x3002, 0xA1A3,
+ 0x3003, 0xA1A8,
+ 0x3005, 0xA1A9,
+ 0x3008, 0xA1B4,
+ 0x3009, 0xA1B5,
+ 0x300A, 0xA1B6,
+ 0x300B, 0xA1B7,
+ 0x300C, 0xA1B8,
+ 0x300D, 0xA1B9,
+ 0x300E, 0xA1BA,
+ 0x300F, 0xA1BB,
+ 0x3010, 0xA1BE,
+ 0x3011, 0xA1BF,
+ 0x3013, 0xA1FE,
+ 0x3014, 0xA1B2,
+ 0x3015, 0xA1B3,
+ 0x3016, 0xA1BC,
+ 0x3017, 0xA1BD,
+ 0x3041, 0xA4A1,
+ 0x3042, 0xA4A2,
+ 0x3043, 0xA4A3,
+ 0x3044, 0xA4A4,
+ 0x3045, 0xA4A5,
+ 0x3046, 0xA4A6,
+ 0x3047, 0xA4A7,
+ 0x3048, 0xA4A8,
+ 0x3049, 0xA4A9,
+ 0x304A, 0xA4AA,
+ 0x304B, 0xA4AB,
+ 0x304C, 0xA4AC,
+ 0x304D, 0xA4AD,
+ 0x304E, 0xA4AE,
+ 0x304F, 0xA4AF,
+ 0x3050, 0xA4B0,
+ 0x3051, 0xA4B1,
+ 0x3052, 0xA4B2,
+ 0x3053, 0xA4B3,
+ 0x3054, 0xA4B4,
+ 0x3055, 0xA4B5,
+ 0x3056, 0xA4B6,
+ 0x3057, 0xA4B7,
+ 0x3058, 0xA4B8,
+ 0x3059, 0xA4B9,
+ 0x305A, 0xA4BA,
+ 0x305B, 0xA4BB,
+ 0x305C, 0xA4BC,
+ 0x305D, 0xA4BD,
+ 0x305E, 0xA4BE,
+ 0x305F, 0xA4BF,
+ 0x3060, 0xA4C0,
+ 0x3061, 0xA4C1,
+ 0x3062, 0xA4C2,
+ 0x3063, 0xA4C3,
+ 0x3064, 0xA4C4,
+ 0x3065, 0xA4C5,
+ 0x3066, 0xA4C6,
+ 0x3067, 0xA4C7,
+ 0x3068, 0xA4C8,
+ 0x3069, 0xA4C9,
+ 0x306A, 0xA4CA,
+ 0x306B, 0xA4CB,
+ 0x306C, 0xA4CC,
+ 0x306D, 0xA4CD,
+ 0x306E, 0xA4CE,
+ 0x306F, 0xA4CF,
+ 0x3070, 0xA4D0,
+ 0x3071, 0xA4D1,
+ 0x3072, 0xA4D2,
+ 0x3073, 0xA4D3,
+ 0x3074, 0xA4D4,
+ 0x3075, 0xA4D5,
+ 0x3076, 0xA4D6,
+ 0x3077, 0xA4D7,
+ 0x3078, 0xA4D8,
+ 0x3079, 0xA4D9,
+ 0x307A, 0xA4DA,
+ 0x307B, 0xA4DB,
+ 0x307C, 0xA4DC,
+ 0x307D, 0xA4DD,
+ 0x307E, 0xA4DE,
+ 0x307F, 0xA4DF,
+ 0x3080, 0xA4E0,
+ 0x3081, 0xA4E1,
+ 0x3082, 0xA4E2,
+ 0x3083, 0xA4E3,
+ 0x3084, 0xA4E4,
+ 0x3085, 0xA4E5,
+ 0x3086, 0xA4E6,
+ 0x3087, 0xA4E7,
+ 0x3088, 0xA4E8,
+ 0x3089, 0xA4E9,
+ 0x308A, 0xA4EA,
+ 0x308B, 0xA4EB,
+ 0x308C, 0xA4EC,
+ 0x308D, 0xA4ED,
+ 0x308E, 0xA4EE,
+ 0x308F, 0xA4EF,
+ 0x3090, 0xA4F0,
+ 0x3091, 0xA4F1,
+ 0x3092, 0xA4F2,
+ 0x3093, 0xA4F3,
+ 0x30A1, 0xA5A1,
+ 0x30A2, 0xA5A2,
+ 0x30A3, 0xA5A3,
+ 0x30A4, 0xA5A4,
+ 0x30A5, 0xA5A5,
+ 0x30A6, 0xA5A6,
+ 0x30A7, 0xA5A7,
+ 0x30A8, 0xA5A8,
+ 0x30A9, 0xA5A9,
+ 0x30AA, 0xA5AA,
+ 0x30AB, 0xA5AB,
+ 0x30AC, 0xA5AC,
+ 0x30AD, 0xA5AD,
+ 0x30AE, 0xA5AE,
+ 0x30AF, 0xA5AF,
+ 0x30B0, 0xA5B0,
+ 0x30B1, 0xA5B1,
+ 0x30B2, 0xA5B2,
+ 0x30B3, 0xA5B3,
+ 0x30B4, 0xA5B4,
+ 0x30B5, 0xA5B5,
+ 0x30B6, 0xA5B6,
+ 0x30B7, 0xA5B7,
+ 0x30B8, 0xA5B8,
+ 0x30B9, 0xA5B9,
+ 0x30BA, 0xA5BA,
+ 0x30BB, 0xA5BB,
+ 0x30BC, 0xA5BC,
+ 0x30BD, 0xA5BD,
+ 0x30BE, 0xA5BE,
+ 0x30BF, 0xA5BF,
+ 0x30C0, 0xA5C0,
+ 0x30C1, 0xA5C1,
+ 0x30C2, 0xA5C2,
+ 0x30C3, 0xA5C3,
+ 0x30C4, 0xA5C4,
+ 0x30C5, 0xA5C5,
+ 0x30C6, 0xA5C6,
+ 0x30C7, 0xA5C7,
+ 0x30C8, 0xA5C8,
+ 0x30C9, 0xA5C9,
+ 0x30CA, 0xA5CA,
+ 0x30CB, 0xA5CB,
+ 0x30CC, 0xA5CC,
+ 0x30CD, 0xA5CD,
+ 0x30CE, 0xA5CE,
+ 0x30CF, 0xA5CF,
+ 0x30D0, 0xA5D0,
+ 0x30D1, 0xA5D1,
+ 0x30D2, 0xA5D2,
+ 0x30D3, 0xA5D3,
+ 0x30D4, 0xA5D4,
+ 0x30D5, 0xA5D5,
+ 0x30D6, 0xA5D6,
+ 0x30D7, 0xA5D7,
+ 0x30D8, 0xA5D8,
+ 0x30D9, 0xA5D9,
+ 0x30DA, 0xA5DA,
+ 0x30DB, 0xA5DB,
+ 0x30DC, 0xA5DC,
+ 0x30DD, 0xA5DD,
+ 0x30DE, 0xA5DE,
+ 0x30DF, 0xA5DF,
+ 0x30E0, 0xA5E0,
+ 0x30E1, 0xA5E1,
+ 0x30E2, 0xA5E2,
+ 0x30E3, 0xA5E3,
+ 0x30E4, 0xA5E4,
+ 0x30E5, 0xA5E5,
+ 0x30E6, 0xA5E6,
+ 0x30E7, 0xA5E7,
+ 0x30E8, 0xA5E8,
+ 0x30E9, 0xA5E9,
+ 0x30EA, 0xA5EA,
+ 0x30EB, 0xA5EB,
+ 0x30EC, 0xA5EC,
+ 0x30ED, 0xA5ED,
+ 0x30EE, 0xA5EE,
+ 0x30EF, 0xA5EF,
+ 0x30F0, 0xA5F0,
+ 0x30F1, 0xA5F1,
+ 0x30F2, 0xA5F2,
+ 0x30F3, 0xA5F3,
+ 0x30F4, 0xA5F4,
+ 0x30F5, 0xA5F5,
+ 0x30F6, 0xA5F6,
+ 0x3105, 0xA8C5,
+ 0x3106, 0xA8C6,
+ 0x3107, 0xA8C7,
+ 0x3108, 0xA8C8,
+ 0x3109, 0xA8C9,
+ 0x310A, 0xA8CA,
+ 0x310B, 0xA8CB,
+ 0x310C, 0xA8CC,
+ 0x310D, 0xA8CD,
+ 0x310E, 0xA8CE,
+ 0x310F, 0xA8CF,
+ 0x3110, 0xA8D0,
+ 0x3111, 0xA8D1,
+ 0x3112, 0xA8D2,
+ 0x3113, 0xA8D3,
+ 0x3114, 0xA8D4,
+ 0x3115, 0xA8D5,
+ 0x3116, 0xA8D6,
+ 0x3117, 0xA8D7,
+ 0x3118, 0xA8D8,
+ 0x3119, 0xA8D9,
+ 0x311A, 0xA8DA,
+ 0x311B, 0xA8DB,
+ 0x311C, 0xA8DC,
+ 0x311D, 0xA8DD,
+ 0x311E, 0xA8DE,
+ 0x311F, 0xA8DF,
+ 0x3120, 0xA8E0,
+ 0x3121, 0xA8E1,
+ 0x3122, 0xA8E2,
+ 0x3123, 0xA8E3,
+ 0x3124, 0xA8E4,
+ 0x3125, 0xA8E5,
+ 0x3126, 0xA8E6,
+ 0x3127, 0xA8E7,
+ 0x3128, 0xA8E8,
+ 0x3129, 0xA8E9,
+ 0x3220, 0xA2E5,
+ 0x3221, 0xA2E6,
+ 0x3222, 0xA2E7,
+ 0x3223, 0xA2E8,
+ 0x3224, 0xA2E9,
+ 0x3225, 0xA2EA,
+ 0x3226, 0xA2EB,
+ 0x3227, 0xA2EC,
+ 0x3228, 0xA2ED,
+ 0x3229, 0xA2EE,
+ 0x4E00, 0xD2BB,
+ 0x4E01, 0xB6A1,
+ 0x4E03, 0xC6DF,
+ 0x4E07, 0xCDF2,
+ 0x4E08, 0xD5C9,
+ 0x4E09, 0xC8FD,
+ 0x4E0A, 0xC9CF,
+ 0x4E0B, 0xCFC2,
+ 0x4E0C, 0xD8A2,
+ 0x4E0D, 0xB2BB,
+ 0x4E0E, 0xD3EB,
+ 0x4E10, 0xD8A4,
+ 0x4E11, 0xB3F3,
+ 0x4E13, 0xD7A8,
+ 0x4E14, 0xC7D2,
+ 0x4E15, 0xD8A7,
+ 0x4E16, 0xCAC0,
+ 0x4E18, 0xC7F0,
+ 0x4E19, 0xB1FB,
+ 0x4E1A, 0xD2B5,
+ 0x4E1B, 0xB4D4,
+ 0x4E1C, 0xB6AB,
+ 0x4E1D, 0xCBBF,
+ 0x4E1E, 0xD8A9,
+ 0x4E22, 0xB6AA,
+ 0x4E24, 0xC1BD,
+ 0x4E25, 0xD1CF,
+ 0x4E27, 0xC9A5,
+ 0x4E28, 0xD8AD,
+ 0x4E2A, 0xB8F6,
+ 0x4E2B, 0xD1BE,
+ 0x4E2C, 0xE3DC,
+ 0x4E2D, 0xD6D0,
+ 0x4E30, 0xB7E1,
+ 0x4E32, 0xB4AE,
+ 0x4E34, 0xC1D9,
+ 0x4E36, 0xD8BC,
+ 0x4E38, 0xCDE8,
+ 0x4E39, 0xB5A4,
+ 0x4E3A, 0xCEAA,
+ 0x4E3B, 0xD6F7,
+ 0x4E3D, 0xC0F6,
+ 0x4E3E, 0xBED9,
+ 0x4E3F, 0xD8AF,
+ 0x4E43, 0xC4CB,
+ 0x4E45, 0xBEC3,
+ 0x4E47, 0xD8B1,
+ 0x4E48, 0xC3B4,
+ 0x4E49, 0xD2E5,
+ 0x4E4B, 0xD6AE,
+ 0x4E4C, 0xCEDA,
+ 0x4E4D, 0xD5A7,
+ 0x4E4E, 0xBAF5,
+ 0x4E4F, 0xB7A6,
+ 0x4E50, 0xC0D6,
+ 0x4E52, 0xC6B9,
+ 0x4E53, 0xC5D2,
+ 0x4E54, 0xC7C7,
+ 0x4E56, 0xB9D4,
+ 0x4E58, 0xB3CB,
+ 0x4E59, 0xD2D2,
+ 0x4E5C, 0xD8BF,
+ 0x4E5D, 0xBEC5,
+ 0x4E5E, 0xC6F2,
+ 0x4E5F, 0xD2B2,
+ 0x4E60, 0xCFB0,
+ 0x4E61, 0xCFE7,
+ 0x4E66, 0xCAE9,
+ 0x4E69, 0xD8C0,
+ 0x4E70, 0xC2F2,
+ 0x4E71, 0xC2D2,
+ 0x4E73, 0xC8E9,
+ 0x4E7E, 0xC7AC,
+ 0x4E86, 0xC1CB,
+ 0x4E88, 0xD3E8,
+ 0x4E89, 0xD5F9,
+ 0x4E8B, 0xCAC2,
+ 0x4E8C, 0xB6FE,
+ 0x4E8D, 0xD8A1,
+ 0x4E8E, 0xD3DA,
+ 0x4E8F, 0xBFF7,
+ 0x4E91, 0xD4C6,
+ 0x4E92, 0xBBA5,
+ 0x4E93, 0xD8C1,
+ 0x4E94, 0xCEE5,
+ 0x4E95, 0xBEAE,
+ 0x4E98, 0xD8A8,
+ 0x4E9A, 0xD1C7,
+ 0x4E9B, 0xD0A9,
+ 0x4E9F, 0xD8BD,
+ 0x4EA0, 0xD9EF,
+ 0x4EA1, 0xCDF6,
+ 0x4EA2, 0xBFBA,
+ 0x4EA4, 0xBDBB,
+ 0x4EA5, 0xBAA5,
+ 0x4EA6, 0xD2E0,
+ 0x4EA7, 0xB2FA,
+ 0x4EA8, 0xBAE0,
+ 0x4EA9, 0xC4B6,
+ 0x4EAB, 0xCFED,
+ 0x4EAC, 0xBEA9,
+ 0x4EAD, 0xCDA4,
+ 0x4EAE, 0xC1C1,
+ 0x4EB2, 0xC7D7,
+ 0x4EB3, 0xD9F1,
+ 0x4EB5, 0xD9F4,
+ 0x4EBA, 0xC8CB,
+ 0x4EBB, 0xD8E9,
+ 0x4EBF, 0xD2DA,
+ 0x4EC0, 0xCAB2,
+ 0x4EC1, 0xC8CA,
+ 0x4EC2, 0xD8EC,
+ 0x4EC3, 0xD8EA,
+ 0x4EC4, 0xD8C6,
+ 0x4EC5, 0xBDF6,
+ 0x4EC6, 0xC6CD,
+ 0x4EC7, 0xB3F0,
+ 0x4EC9, 0xD8EB,
+ 0x4ECA, 0xBDF1,
+ 0x4ECB, 0xBDE9,
+ 0x4ECD, 0xC8D4,
+ 0x4ECE, 0xB4D3,
+ 0x4ED1, 0xC2D8,
+ 0x4ED3, 0xB2D6,
+ 0x4ED4, 0xD7D0,
+ 0x4ED5, 0xCACB,
+ 0x4ED6, 0xCBFB,
+ 0x4ED7, 0xD5CC,
+ 0x4ED8, 0xB8B6,
+ 0x4ED9, 0xCFC9,
+ 0x4EDD, 0xD9DA,
+ 0x4EDE, 0xD8F0,
+ 0x4EDF, 0xC7AA,
+ 0x4EE1, 0xD8EE,
+ 0x4EE3, 0xB4FA,
+ 0x4EE4, 0xC1EE,
+ 0x4EE5, 0xD2D4,
+ 0x4EE8, 0xD8ED,
+ 0x4EEA, 0xD2C7,
+ 0x4EEB, 0xD8EF,
+ 0x4EEC, 0xC3C7,
+ 0x4EF0, 0xD1F6,
+ 0x4EF2, 0xD6D9,
+ 0x4EF3, 0xD8F2,
+ 0x4EF5, 0xD8F5,
+ 0x4EF6, 0xBCFE,
+ 0x4EF7, 0xBCDB,
+ 0x4EFB, 0xC8CE,
+ 0x4EFD, 0xB7DD,
+ 0x4EFF, 0xB7C2,
+ 0x4F01, 0xC6F3,
+ 0x4F09, 0xD8F8,
+ 0x4F0A, 0xD2C1,
+ 0x4F0D, 0xCEE9,
+ 0x4F0E, 0xBCBF,
+ 0x4F0F, 0xB7FC,
+ 0x4F10, 0xB7A5,
+ 0x4F11, 0xD0DD,
+ 0x4F17, 0xD6DA,
+ 0x4F18, 0xD3C5,
+ 0x4F19, 0xBBEF,
+ 0x4F1A, 0xBBE1,
+ 0x4F1B, 0xD8F1,
+ 0x4F1E, 0xC9A1,
+ 0x4F1F, 0xCEB0,
+ 0x4F20, 0xB4AB,
+ 0x4F22, 0xD8F3,
+ 0x4F24, 0xC9CB,
+ 0x4F25, 0xD8F6,
+ 0x4F26, 0xC2D7,
+ 0x4F27, 0xD8F7,
+ 0x4F2A, 0xCEB1,
+ 0x4F2B, 0xD8F9,
+ 0x4F2F, 0xB2AE,
+ 0x4F30, 0xB9C0,
+ 0x4F32, 0xD9A3,
+ 0x4F34, 0xB0E9,
+ 0x4F36, 0xC1E6,
+ 0x4F38, 0xC9EC,
+ 0x4F3A, 0xCBC5,
+ 0x4F3C, 0xCBC6,
+ 0x4F3D, 0xD9A4,
+ 0x4F43, 0xB5E8,
+ 0x4F46, 0xB5AB,
+ 0x4F4D, 0xCEBB,
+ 0x4F4E, 0xB5CD,
+ 0x4F4F, 0xD7A1,
+ 0x4F50, 0xD7F4,
+ 0x4F51, 0xD3D3,
+ 0x4F53, 0xCCE5,
+ 0x4F55, 0xBACE,
+ 0x4F57, 0xD9A2,
+ 0x4F58, 0xD9DC,
+ 0x4F59, 0xD3E0,
+ 0x4F5A, 0xD8FD,
+ 0x4F5B, 0xB7F0,
+ 0x4F5C, 0xD7F7,
+ 0x4F5D, 0xD8FE,
+ 0x4F5E, 0xD8FA,
+ 0x4F5F, 0xD9A1,
+ 0x4F60, 0xC4E3,
+ 0x4F63, 0xD3B6,
+ 0x4F64, 0xD8F4,
+ 0x4F65, 0xD9DD,
+ 0x4F67, 0xD8FB,
+ 0x4F69, 0xC5E5,
+ 0x4F6C, 0xC0D0,
+ 0x4F6F, 0xD1F0,
+ 0x4F70, 0xB0DB,
+ 0x4F73, 0xBCD1,
+ 0x4F74, 0xD9A6,
+ 0x4F76, 0xD9A5,
+ 0x4F7B, 0xD9AC,
+ 0x4F7C, 0xD9AE,
+ 0x4F7E, 0xD9AB,
+ 0x4F7F, 0xCAB9,
+ 0x4F83, 0xD9A9,
+ 0x4F84, 0xD6B6,
+ 0x4F88, 0xB3DE,
+ 0x4F89, 0xD9A8,
+ 0x4F8B, 0xC0FD,
+ 0x4F8D, 0xCACC,
+ 0x4F8F, 0xD9AA,
+ 0x4F91, 0xD9A7,
+ 0x4F94, 0xD9B0,
+ 0x4F97, 0xB6B1,
+ 0x4F9B, 0xB9A9,
+ 0x4F9D, 0xD2C0,
+ 0x4FA0, 0xCFC0,
+ 0x4FA3, 0xC2C2,
+ 0x4FA5, 0xBDC4,
+ 0x4FA6, 0xD5EC,
+ 0x4FA7, 0xB2E0,
+ 0x4FA8, 0xC7C8,
+ 0x4FA9, 0xBFEB,
+ 0x4FAA, 0xD9AD,
+ 0x4FAC, 0xD9AF,
+ 0x4FAE, 0xCEEA,
+ 0x4FAF, 0xBAEE,
+ 0x4FB5, 0xC7D6,
+ 0x4FBF, 0xB1E3,
+ 0x4FC3, 0xB4D9,
+ 0x4FC4, 0xB6ED,
+ 0x4FC5, 0xD9B4,
+ 0x4FCA, 0xBFA1,
+ 0x4FCE, 0xD9DE,
+ 0x4FCF, 0xC7CE,
+ 0x4FD0, 0xC0FE,
+ 0x4FD1, 0xD9B8,
+ 0x4FD7, 0xCBD7,
+ 0x4FD8, 0xB7FD,
+ 0x4FDA, 0xD9B5,
+ 0x4FDC, 0xD9B7,
+ 0x4FDD, 0xB1A3,
+ 0x4FDE, 0xD3E1,
+ 0x4FDF, 0xD9B9,
+ 0x4FE1, 0xD0C5,
+ 0x4FE3, 0xD9B6,
+ 0x4FE6, 0xD9B1,
+ 0x4FE8, 0xD9B2,
+ 0x4FE9, 0xC1A9,
+ 0x4FEA, 0xD9B3,
+ 0x4FED, 0xBCF3,
+ 0x4FEE, 0xD0DE,
+ 0x4FEF, 0xB8A9,
+ 0x4FF1, 0xBEE3,
+ 0x4FF3, 0xD9BD,
+ 0x4FF8, 0xD9BA,
+ 0x4FFA, 0xB0B3,
+ 0x4FFE, 0xD9C2,
+ 0x500C, 0xD9C4,
+ 0x500D, 0xB1B6,
+ 0x500F, 0xD9BF,
+ 0x5012, 0xB5B9,
+ 0x5014, 0xBEF3,
+ 0x5018, 0xCCC8,
+ 0x5019, 0xBAF2,
+ 0x501A, 0xD2D0,
+ 0x501C, 0xD9C3,
+ 0x501F, 0xBDE8,
+ 0x5021, 0xB3AB,
+ 0x5025, 0xD9C5,
+ 0x5026, 0xBEEB,
+ 0x5028, 0xD9C6,
+ 0x5029, 0xD9BB,
+ 0x502A, 0xC4DF,
+ 0x502C, 0xD9BE,
+ 0x502D, 0xD9C1,
+ 0x502E, 0xD9C0,
+ 0x503A, 0xD5AE,
+ 0x503C, 0xD6B5,
+ 0x503E, 0xC7E3,
+ 0x5043, 0xD9C8,
+ 0x5047, 0xBCD9,
+ 0x5048, 0xD9CA,
+ 0x504C, 0xD9BC,
+ 0x504E, 0xD9CB,
+ 0x504F, 0xC6AB,
+ 0x5055, 0xD9C9,
+ 0x505A, 0xD7F6,
+ 0x505C, 0xCDA3,
+ 0x5065, 0xBDA1,
+ 0x506C, 0xD9CC,
+ 0x5076, 0xC5BC,
+ 0x5077, 0xCDB5,
+ 0x507B, 0xD9CD,
+ 0x507E, 0xD9C7,
+ 0x507F, 0xB3A5,
+ 0x5080, 0xBFFE,
+ 0x5085, 0xB8B5,
+ 0x5088, 0xC0FC,
+ 0x508D, 0xB0F8,
+ 0x50A3, 0xB4F6,
+ 0x50A5, 0xD9CE,
+ 0x50A7, 0xD9CF,
+ 0x50A8, 0xB4A2,
+ 0x50A9, 0xD9D0,
+ 0x50AC, 0xB4DF,
+ 0x50B2, 0xB0C1,
+ 0x50BA, 0xD9D1,
+ 0x50BB, 0xC9B5,
+ 0x50CF, 0xCFF1,
+ 0x50D6, 0xD9D2,
+ 0x50DA, 0xC1C5,
+ 0x50E6, 0xD9D6,
+ 0x50E7, 0xC9AE,
+ 0x50EC, 0xD9D5,
+ 0x50ED, 0xD9D4,
+ 0x50EE, 0xD9D7,
+ 0x50F3, 0xCBDB,
+ 0x50F5, 0xBDA9,
+ 0x50FB, 0xC6A7,
+ 0x5106, 0xD9D3,
+ 0x5107, 0xD9D8,
+ 0x510B, 0xD9D9,
+ 0x5112, 0xC8E5,
+ 0x5121, 0xC0DC,
+ 0x513F, 0xB6F9,
+ 0x5140, 0xD8A3,
+ 0x5141, 0xD4CA,
+ 0x5143, 0xD4AA,
+ 0x5144, 0xD0D6,
+ 0x5145, 0xB3E4,
+ 0x5146, 0xD5D7,
+ 0x5148, 0xCFC8,
+ 0x5149, 0xB9E2,
+ 0x514B, 0xBFCB,
+ 0x514D, 0xC3E2,
+ 0x5151, 0xB6D2,
+ 0x5154, 0xCDC3,
+ 0x5155, 0xD9EE,
+ 0x5156, 0xD9F0,
+ 0x515A, 0xB5B3,
+ 0x515C, 0xB6B5,
+ 0x5162, 0xBEA4,
+ 0x5165, 0xC8EB,
+ 0x5168, 0xC8AB,
+ 0x516B, 0xB0CB,
+ 0x516C, 0xB9AB,
+ 0x516D, 0xC1F9,
+ 0x516E, 0xD9E2,
+ 0x5170, 0xC0BC,
+ 0x5171, 0xB9B2,
+ 0x5173, 0xB9D8,
+ 0x5174, 0xD0CB,
+ 0x5175, 0xB1F8,
+ 0x5176, 0xC6E4,
+ 0x5177, 0xBEDF,
+ 0x5178, 0xB5E4,
+ 0x5179, 0xD7C8,
+ 0x517B, 0xD1F8,
+ 0x517C, 0xBCE6,
+ 0x517D, 0xCADE,
+ 0x5180, 0xBCBD,
+ 0x5181, 0xD9E6,
+ 0x5182, 0xD8E7,
+ 0x5185, 0xC4DA,
+ 0x5188, 0xB8D4,
+ 0x5189, 0xC8BD,
+ 0x518C, 0xB2E1,
+ 0x518D, 0xD4D9,
+ 0x5192, 0xC3B0,
+ 0x5195, 0xC3E1,
+ 0x5196, 0xDAA2,
+ 0x5197, 0xC8DF,
+ 0x5199, 0xD0B4,
+ 0x519B, 0xBEFC,
+ 0x519C, 0xC5A9,
+ 0x51A0, 0xB9DA,
+ 0x51A2, 0xDAA3,
+ 0x51A4, 0xD4A9,
+ 0x51A5, 0xDAA4,
+ 0x51AB, 0xD9FB,
+ 0x51AC, 0xB6AC,
+ 0x51AF, 0xB7EB,
+ 0x51B0, 0xB1F9,
+ 0x51B1, 0xD9FC,
+ 0x51B2, 0xB3E5,
+ 0x51B3, 0xBEF6,
+ 0x51B5, 0xBFF6,
+ 0x51B6, 0xD2B1,
+ 0x51B7, 0xC0E4,
+ 0x51BB, 0xB6B3,
+ 0x51BC, 0xD9FE,
+ 0x51BD, 0xD9FD,
+ 0x51C0, 0xBEBB,
+ 0x51C4, 0xC6E0,
+ 0x51C6, 0xD7BC,
+ 0x51C7, 0xDAA1,
+ 0x51C9, 0xC1B9,
+ 0x51CB, 0xB5F2,
+ 0x51CC, 0xC1E8,
+ 0x51CF, 0xBCF5,
+ 0x51D1, 0xB4D5,
+ 0x51DB, 0xC1DD,
+ 0x51DD, 0xC4FD,
+ 0x51E0, 0xBCB8,
+ 0x51E1, 0xB7B2,
+ 0x51E4, 0xB7EF,
+ 0x51EB, 0xD9EC,
+ 0x51ED, 0xC6BE,
+ 0x51EF, 0xBFAD,
+ 0x51F0, 0xBBCB,
+ 0x51F3, 0xB5CA,
+ 0x51F5, 0xDBC9,
+ 0x51F6, 0xD0D7,
+ 0x51F8, 0xCDB9,
+ 0x51F9, 0xB0BC,
+ 0x51FA, 0xB3F6,
+ 0x51FB, 0xBBF7,
+ 0x51FC, 0xDBCA,
+ 0x51FD, 0xBAAF,
+ 0x51FF, 0xD4E4,
+ 0x5200, 0xB5B6,
+ 0x5201, 0xB5F3,
+ 0x5202, 0xD8D6,
+ 0x5203, 0xC8D0,
+ 0x5206, 0xB7D6,
+ 0x5207, 0xC7D0,
+ 0x5208, 0xD8D7,
+ 0x520A, 0xBFAF,
+ 0x520D, 0xDBBB,
+ 0x520E, 0xD8D8,
+ 0x5211, 0xD0CC,
+ 0x5212, 0xBBAE,
+ 0x5216, 0xEBBE,
+ 0x5217, 0xC1D0,
+ 0x5218, 0xC1F5,
+ 0x5219, 0xD4F2,
+ 0x521A, 0xB8D5,
+ 0x521B, 0xB4B4,
+ 0x521D, 0xB3F5,
+ 0x5220, 0xC9BE,
+ 0x5224, 0xC5D0,
+ 0x5228, 0xC5D9,
+ 0x5229, 0xC0FB,
+ 0x522B, 0xB1F0,
+ 0x522D, 0xD8D9,
+ 0x522E, 0xB9CE,
+ 0x5230, 0xB5BD,
+ 0x5233, 0xD8DA,
+ 0x5236, 0xD6C6,
+ 0x5237, 0xCBA2,
+ 0x5238, 0xC8AF,
+ 0x5239, 0xC9B2,
+ 0x523A, 0xB4CC,
+ 0x523B, 0xBFCC,
+ 0x523D, 0xB9F4,
+ 0x523F, 0xD8DB,
+ 0x5240, 0xD8DC,
+ 0x5241, 0xB6E7,
+ 0x5242, 0xBCC1,
+ 0x5243, 0xCCEA,
+ 0x524A, 0xCFF7,
+ 0x524C, 0xD8DD,
+ 0x524D, 0xC7B0,
+ 0x5250, 0xB9D0,
+ 0x5251, 0xBDA3,
+ 0x5254, 0xCCDE,
+ 0x5256, 0xC6CA,
+ 0x525C, 0xD8E0,
+ 0x525E, 0xD8DE,
+ 0x5261, 0xD8DF,
+ 0x5265, 0xB0FE,
+ 0x5267, 0xBEE7,
+ 0x5269, 0xCAA3,
+ 0x526A, 0xBCF4,
+ 0x526F, 0xB8B1,
+ 0x5272, 0xB8EE,
+ 0x527D, 0xD8E2,
+ 0x527F, 0xBDCB,
+ 0x5281, 0xD8E4,
+ 0x5282, 0xD8E3,
+ 0x5288, 0xC5FC,
+ 0x5290, 0xD8E5,
+ 0x5293, 0xD8E6,
+ 0x529B, 0xC1A6,
+ 0x529D, 0xC8B0,
+ 0x529E, 0xB0EC,
+ 0x529F, 0xB9A6,
+ 0x52A0, 0xBCD3,
+ 0x52A1, 0xCEF1,
+ 0x52A2, 0xDBBD,
+ 0x52A3, 0xC1D3,
+ 0x52A8, 0xB6AF,
+ 0x52A9, 0xD6FA,
+ 0x52AA, 0xC5AC,
+ 0x52AB, 0xBDD9,
+ 0x52AC, 0xDBBE,
+ 0x52AD, 0xDBBF,
+ 0x52B1, 0xC0F8,
+ 0x52B2, 0xBEA2,
+ 0x52B3, 0xC0CD,
+ 0x52BE, 0xDBC0,
+ 0x52BF, 0xCAC6,
+ 0x52C3, 0xB2AA,
+ 0x52C7, 0xD3C2,
+ 0x52C9, 0xC3E3,
+ 0x52CB, 0xD1AB,
+ 0x52D0, 0xDBC2,
+ 0x52D2, 0xC0D5,
+ 0x52D6, 0xDBC3,
+ 0x52D8, 0xBFB1,
+ 0x52DF, 0xC4BC,
+ 0x52E4, 0xC7DA,
+ 0x52F0, 0xDBC4,
+ 0x52F9, 0xD9E8,
+ 0x52FA, 0xC9D7,
+ 0x52FE, 0xB9B4,
+ 0x52FF, 0xCEF0,
+ 0x5300, 0xD4C8,
+ 0x5305, 0xB0FC,
+ 0x5306, 0xB4D2,
+ 0x5308, 0xD0D9,
+ 0x530D, 0xD9E9,
+ 0x530F, 0xDECB,
+ 0x5310, 0xD9EB,
+ 0x5315, 0xD8B0,
+ 0x5316, 0xBBAF,
+ 0x5317, 0xB1B1,
+ 0x5319, 0xB3D7,
+ 0x531A, 0xD8CE,
+ 0x531D, 0xD4D1,
+ 0x5320, 0xBDB3,
+ 0x5321, 0xBFEF,
+ 0x5323, 0xCFBB,
+ 0x5326, 0xD8D0,
+ 0x532A, 0xB7CB,
+ 0x532E, 0xD8D1,
+ 0x5339, 0xC6A5,
+ 0x533A, 0xC7F8,
+ 0x533B, 0xD2BD,
+ 0x533E, 0xD8D2,
+ 0x533F, 0xC4E4,
+ 0x5341, 0xCAAE,
+ 0x5343, 0xC7A7,
+ 0x5345, 0xD8A6,
+ 0x5347, 0xC9FD,
+ 0x5348, 0xCEE7,
+ 0x5349, 0xBBDC,
+ 0x534A, 0xB0EB,
+ 0x534E, 0xBBAA,
+ 0x534F, 0xD0AD,
+ 0x5351, 0xB1B0,
+ 0x5352, 0xD7E4,
+ 0x5353, 0xD7BF,
+ 0x5355, 0xB5A5,
+ 0x5356, 0xC2F4,
+ 0x5357, 0xC4CF,
+ 0x535A, 0xB2A9,
+ 0x535C, 0xB2B7,
+ 0x535E, 0xB1E5,
+ 0x535F, 0xDFB2,
+ 0x5360, 0xD5BC,
+ 0x5361, 0xBFA8,
+ 0x5362, 0xC2AC,
+ 0x5363, 0xD8D5,
+ 0x5364, 0xC2B1,
+ 0x5366, 0xD8D4,
+ 0x5367, 0xCED4,
+ 0x5369, 0xDAE0,
+ 0x536B, 0xCEC0,
+ 0x536E, 0xD8B4,
+ 0x536F, 0xC3AE,
+ 0x5370, 0xD3A1,
+ 0x5371, 0xCEA3,
+ 0x5373, 0xBCB4,
+ 0x5374, 0xC8B4,
+ 0x5375, 0xC2D1,
+ 0x5377, 0xBEED,
+ 0x5378, 0xD0B6,
+ 0x537A, 0xDAE1,
+ 0x537F, 0xC7E4,
+ 0x5382, 0xB3A7,
+ 0x5384, 0xB6F2,
+ 0x5385, 0xCCFC,
+ 0x5386, 0xC0FA,
+ 0x5389, 0xC0F7,
+ 0x538B, 0xD1B9,
+ 0x538C, 0xD1E1,
+ 0x538D, 0xD8C7,
+ 0x5395, 0xB2DE,
+ 0x5398, 0xC0E5,
+ 0x539A, 0xBAF1,
+ 0x539D, 0xD8C8,
+ 0x539F, 0xD4AD,
+ 0x53A2, 0xCFE1,
+ 0x53A3, 0xD8C9,
+ 0x53A5, 0xD8CA,
+ 0x53A6, 0xCFC3,
+ 0x53A8, 0xB3F8,
+ 0x53A9, 0xBEC7,
+ 0x53AE, 0xD8CB,
+ 0x53B6, 0xDBCC,
+ 0x53BB, 0xC8A5,
+ 0x53BF, 0xCFD8,
+ 0x53C1, 0xC8FE,
+ 0x53C2, 0xB2CE,
+ 0x53C8, 0xD3D6,
+ 0x53C9, 0xB2E6,
+ 0x53CA, 0xBCB0,
+ 0x53CB, 0xD3D1,
+ 0x53CC, 0xCBAB,
+ 0x53CD, 0xB7B4,
+ 0x53D1, 0xB7A2,
+ 0x53D4, 0xCAE5,
+ 0x53D6, 0xC8A1,
+ 0x53D7, 0xCADC,
+ 0x53D8, 0xB1E4,
+ 0x53D9, 0xD0F0,
+ 0x53DB, 0xC5D1,
+ 0x53DF, 0xDBC5,
+ 0x53E0, 0xB5FE,
+ 0x53E3, 0xBFDA,
+ 0x53E4, 0xB9C5,
+ 0x53E5, 0xBEE4,
+ 0x53E6, 0xC1ED,
+ 0x53E8, 0xDFB6,
+ 0x53E9, 0xDFB5,
+ 0x53EA, 0xD6BB,
+ 0x53EB, 0xBDD0,
+ 0x53EC, 0xD5D9,
+ 0x53ED, 0xB0C8,
+ 0x53EE, 0xB6A3,
+ 0x53EF, 0xBFC9,
+ 0x53F0, 0xCCA8,
+ 0x53F1, 0xDFB3,
+ 0x53F2, 0xCAB7,
+ 0x53F3, 0xD3D2,
+ 0x53F5, 0xD8CF,
+ 0x53F6, 0xD2B6,
+ 0x53F7, 0xBAC5,
+ 0x53F8, 0xCBBE,
+ 0x53F9, 0xCCBE,
+ 0x53FB, 0xDFB7,
+ 0x53FC, 0xB5F0,
+ 0x53FD, 0xDFB4,
+ 0x5401, 0xD3F5,
+ 0x5403, 0xB3D4,
+ 0x5404, 0xB8F7,
+ 0x5406, 0xDFBA,
+ 0x5408, 0xBACF,
+ 0x5409, 0xBCAA,
+ 0x540A, 0xB5F5,
+ 0x540C, 0xCDAC,
+ 0x540D, 0xC3FB,
+ 0x540E, 0xBAF3,
+ 0x540F, 0xC0F4,
+ 0x5410, 0xCDC2,
+ 0x5411, 0xCFF2,
+ 0x5412, 0xDFB8,
+ 0x5413, 0xCFC5,
+ 0x5415, 0xC2C0,
+ 0x5416, 0xDFB9,
+ 0x5417, 0xC2F0,
+ 0x541B, 0xBEFD,
+ 0x541D, 0xC1DF,
+ 0x541E, 0xCDCC,
+ 0x541F, 0xD2F7,
+ 0x5420, 0xB7CD,
+ 0x5421, 0xDFC1,
+ 0x5423, 0xDFC4,
+ 0x5426, 0xB7F1,
+ 0x5427, 0xB0C9,
+ 0x5428, 0xB6D6,
+ 0x5429, 0xB7D4,
+ 0x542B, 0xBAAC,
+ 0x542C, 0xCCFD,
+ 0x542D, 0xBFD4,
+ 0x542E, 0xCBB1,
+ 0x542F, 0xC6F4,
+ 0x5431, 0xD6A8,
+ 0x5432, 0xDFC5,
+ 0x5434, 0xCEE2,
+ 0x5435, 0xB3B3,
+ 0x5438, 0xCEFC,
+ 0x5439, 0xB4B5,
+ 0x543B, 0xCEC7,
+ 0x543C, 0xBAF0,
+ 0x543E, 0xCEE1,
+ 0x5440, 0xD1BD,
+ 0x5443, 0xDFC0,
+ 0x5446, 0xB4F4,
+ 0x5448, 0xB3CA,
+ 0x544A, 0xB8E6,
+ 0x544B, 0xDFBB,
+ 0x5450, 0xC4C5,
+ 0x5452, 0xDFBC,
+ 0x5453, 0xDFBD,
+ 0x5454, 0xDFBE,
+ 0x5455, 0xC5BB,
+ 0x5456, 0xDFBF,
+ 0x5457, 0xDFC2,
+ 0x5458, 0xD4B1,
+ 0x5459, 0xDFC3,
+ 0x545B, 0xC7BA,
+ 0x545C, 0xCED8,
+ 0x5462, 0xC4D8,
+ 0x5464, 0xDFCA,
+ 0x5466, 0xDFCF,
+ 0x5468, 0xD6DC,
+ 0x5471, 0xDFC9,
+ 0x5472, 0xDFDA,
+ 0x5473, 0xCEB6,
+ 0x5475, 0xBAC7,
+ 0x5476, 0xDFCE,
+ 0x5477, 0xDFC8,
+ 0x5478, 0xC5DE,
+ 0x547B, 0xC9EB,
+ 0x547C, 0xBAF4,
+ 0x547D, 0xC3FC,
+ 0x5480, 0xBED7,
+ 0x5482, 0xDFC6,
+ 0x5484, 0xDFCD,
+ 0x5486, 0xC5D8,
+ 0x548B, 0xD5A6,
+ 0x548C, 0xBACD,
+ 0x548E, 0xBECC,
+ 0x548F, 0xD3BD,
+ 0x5490, 0xB8C0,
+ 0x5492, 0xD6E4,
+ 0x5494, 0xDFC7,
+ 0x5495, 0xB9BE,
+ 0x5496, 0xBFA7,
+ 0x5499, 0xC1FC,
+ 0x549A, 0xDFCB,
+ 0x549B, 0xDFCC,
+ 0x549D, 0xDFD0,
+ 0x54A3, 0xDFDB,
+ 0x54A4, 0xDFE5,
+ 0x54A6, 0xDFD7,
+ 0x54A7, 0xDFD6,
+ 0x54A8, 0xD7C9,
+ 0x54A9, 0xDFE3,
+ 0x54AA, 0xDFE4,
+ 0x54AB, 0xE5EB,
+ 0x54AC, 0xD2A7,
+ 0x54AD, 0xDFD2,
+ 0x54AF, 0xBFA9,
+ 0x54B1, 0xD4DB,
+ 0x54B3, 0xBFC8,
+ 0x54B4, 0xDFD4,
+ 0x54B8, 0xCFCC,
+ 0x54BB, 0xDFDD,
+ 0x54BD, 0xD1CA,
+ 0x54BF, 0xDFDE,
+ 0x54C0, 0xB0A7,
+ 0x54C1, 0xC6B7,
+ 0x54C2, 0xDFD3,
+ 0x54C4, 0xBAE5,
+ 0x54C6, 0xB6DF,
+ 0x54C7, 0xCDDB,
+ 0x54C8, 0xB9FE,
+ 0x54C9, 0xD4D5,
+ 0x54CC, 0xDFDF,
+ 0x54CD, 0xCFEC,
+ 0x54CE, 0xB0A5,
+ 0x54CF, 0xDFE7,
+ 0x54D0, 0xDFD1,
+ 0x54D1, 0xD1C6,
+ 0x54D2, 0xDFD5,
+ 0x54D3, 0xDFD8,
+ 0x54D4, 0xDFD9,
+ 0x54D5, 0xDFDC,
+ 0x54D7, 0xBBA9,
+ 0x54D9, 0xDFE0,
+ 0x54DA, 0xDFE1,
+ 0x54DC, 0xDFE2,
+ 0x54DD, 0xDFE6,
+ 0x54DE, 0xDFE8,
+ 0x54DF, 0xD3B4,
+ 0x54E5, 0xB8E7,
+ 0x54E6, 0xC5B6,
+ 0x54E7, 0xDFEA,
+ 0x54E8, 0xC9DA,
+ 0x54E9, 0xC1A8,
+ 0x54EA, 0xC4C4,
+ 0x54ED, 0xBFDE,
+ 0x54EE, 0xCFF8,
+ 0x54F2, 0xD5DC,
+ 0x54F3, 0xDFEE,
+ 0x54FA, 0xB2B8,
+ 0x54FC, 0xBADF,
+ 0x54FD, 0xDFEC,
+ 0x54FF, 0xDBC1,
+ 0x5501, 0xD1E4,
+ 0x5506, 0xCBF4,
+ 0x5507, 0xB4BD,
+ 0x5509, 0xB0A6,
+ 0x550F, 0xDFF1,
+ 0x5510, 0xCCC6,
+ 0x5511, 0xDFF2,
+ 0x5514, 0xDFED,
+ 0x551B, 0xDFE9,
+ 0x5520, 0xDFEB,
+ 0x5522, 0xDFEF,
+ 0x5523, 0xDFF0,
+ 0x5524, 0xBBBD,
+ 0x5527, 0xDFF3,
+ 0x552A, 0xDFF4,
+ 0x552C, 0xBBA3,
+ 0x552E, 0xCADB,
+ 0x552F, 0xCEA8,
+ 0x5530, 0xE0A7,
+ 0x5531, 0xB3AA,
+ 0x5533, 0xE0A6,
+ 0x5537, 0xE0A1,
+ 0x553C, 0xDFFE,
+ 0x553E, 0xCDD9,
+ 0x553F, 0xDFFC,
+ 0x5541, 0xDFFA,
+ 0x5543, 0xBFD0,
+ 0x5544, 0xD7C4,
+ 0x5546, 0xC9CC,
+ 0x5549, 0xDFF8,
+ 0x554A, 0xB0A1,
+ 0x5550, 0xDFFD,
+ 0x5555, 0xDFFB,
+ 0x5556, 0xE0A2,
+ 0x555C, 0xE0A8,
+ 0x5561, 0xB7C8,
+ 0x5564, 0xC6A1,
+ 0x5565, 0xC9B6,
+ 0x5566, 0xC0B2,
+ 0x5567, 0xDFF5,
+ 0x556A, 0xC5BE,
+ 0x556C, 0xD8C4,
+ 0x556D, 0xDFF9,
+ 0x556E, 0xC4F6,
+ 0x5575, 0xE0A3,
+ 0x5576, 0xE0A4,
+ 0x5577, 0xE0A5,
+ 0x5578, 0xD0A5,
+ 0x557B, 0xE0B4,
+ 0x557C, 0xCCE4,
+ 0x557E, 0xE0B1,
+ 0x5580, 0xBFA6,
+ 0x5581, 0xE0AF,
+ 0x5582, 0xCEB9,
+ 0x5583, 0xE0AB,
+ 0x5584, 0xC9C6,
+ 0x5587, 0xC0AE,
+ 0x5588, 0xE0AE,
+ 0x5589, 0xBAED,
+ 0x558A, 0xBAB0,
+ 0x558B, 0xE0A9,
+ 0x558F, 0xDFF6,
+ 0x5591, 0xE0B3,
+ 0x5594, 0xE0B8,
+ 0x5598, 0xB4AD,
+ 0x5599, 0xE0B9,
+ 0x559C, 0xCFB2,
+ 0x559D, 0xBAC8,
+ 0x559F, 0xE0B0,
+ 0x55A7, 0xD0FA,
+ 0x55B1, 0xE0AC,
+ 0x55B3, 0xD4FB,
+ 0x55B5, 0xDFF7,
+ 0x55B7, 0xC5E7,
+ 0x55B9, 0xE0AD,
+ 0x55BB, 0xD3F7,
+ 0x55BD, 0xE0B6,
+ 0x55BE, 0xE0B7,
+ 0x55C4, 0xE0C4,
+ 0x55C5, 0xD0E1,
+ 0x55C9, 0xE0BC,
+ 0x55CC, 0xE0C9,
+ 0x55CD, 0xE0CA,
+ 0x55D1, 0xE0BE,
+ 0x55D2, 0xE0AA,
+ 0x55D3, 0xC9A4,
+ 0x55D4, 0xE0C1,
+ 0x55D6, 0xE0B2,
+ 0x55DC, 0xCAC8,
+ 0x55DD, 0xE0C3,
+ 0x55DF, 0xE0B5,
+ 0x55E1, 0xCECB,
+ 0x55E3, 0xCBC3,
+ 0x55E4, 0xE0CD,
+ 0x55E5, 0xE0C6,
+ 0x55E6, 0xE0C2,
+ 0x55E8, 0xE0CB,
+ 0x55EA, 0xE0BA,
+ 0x55EB, 0xE0BF,
+ 0x55EC, 0xE0C0,
+ 0x55EF, 0xE0C5,
+ 0x55F2, 0xE0C7,
+ 0x55F3, 0xE0C8,
+ 0x55F5, 0xE0CC,
+ 0x55F7, 0xE0BB,
+ 0x55FD, 0xCBD4,
+ 0x55FE, 0xE0D5,
+ 0x5600, 0xE0D6,
+ 0x5601, 0xE0D2,
+ 0x5608, 0xE0D0,
+ 0x5609, 0xBCCE,
+ 0x560C, 0xE0D1,
+ 0x560E, 0xB8C2,
+ 0x560F, 0xD8C5,
+ 0x5618, 0xD0EA,
+ 0x561B, 0xC2EF,
+ 0x561E, 0xE0CF,
+ 0x561F, 0xE0BD,
+ 0x5623, 0xE0D4,
+ 0x5624, 0xE0D3,
+ 0x5627, 0xE0D7,
+ 0x562C, 0xE0DC,
+ 0x562D, 0xE0D8,
+ 0x5631, 0xD6F6,
+ 0x5632, 0xB3B0,
+ 0x5634, 0xD7EC,
+ 0x5636, 0xCBBB,
+ 0x5639, 0xE0DA,
+ 0x563B, 0xCEFB,
+ 0x563F, 0xBAD9,
+ 0x564C, 0xE0E1,
+ 0x564D, 0xE0DD,
+ 0x564E, 0xD2AD,
+ 0x5654, 0xE0E2,
+ 0x5657, 0xE0DB,
+ 0x5658, 0xE0D9,
+ 0x5659, 0xE0DF,
+ 0x565C, 0xE0E0,
+ 0x5662, 0xE0DE,
+ 0x5664, 0xE0E4,
+ 0x5668, 0xC6F7,
+ 0x5669, 0xD8AC,
+ 0x566A, 0xD4EB,
+ 0x566B, 0xE0E6,
+ 0x566C, 0xCAC9,
+ 0x5671, 0xE0E5,
+ 0x5676, 0xB8C1,
+ 0x567B, 0xE0E7,
+ 0x567C, 0xE0E8,
+ 0x5685, 0xE0E9,
+ 0x5686, 0xE0E3,
+ 0x568E, 0xBABF,
+ 0x568F, 0xCCE7,
+ 0x5693, 0xE0EA,
+ 0x56A3, 0xCFF9,
+ 0x56AF, 0xE0EB,
+ 0x56B7, 0xC8C2,
+ 0x56BC, 0xBDC0,
+ 0x56CA, 0xC4D2,
+ 0x56D4, 0xE0EC,
+ 0x56D7, 0xE0ED,
+ 0x56DA, 0xC7F4,
+ 0x56DB, 0xCBC4,
+ 0x56DD, 0xE0EE,
+ 0x56DE, 0xBBD8,
+ 0x56DF, 0xD8B6,
+ 0x56E0, 0xD2F2,
+ 0x56E1, 0xE0EF,
+ 0x56E2, 0xCDC5,
+ 0x56E4, 0xB6DA,
+ 0x56EB, 0xE0F1,
+ 0x56ED, 0xD4B0,
+ 0x56F0, 0xC0A7,
+ 0x56F1, 0xB4D1,
+ 0x56F4, 0xCEA7,
+ 0x56F5, 0xE0F0,
+ 0x56F9, 0xE0F2,
+ 0x56FA, 0xB9CC,
+ 0x56FD, 0xB9FA,
+ 0x56FE, 0xCDBC,
+ 0x56FF, 0xE0F3,
+ 0x5703, 0xC6D4,
+ 0x5704, 0xE0F4,
+ 0x5706, 0xD4B2,
+ 0x5708, 0xC8A6,
+ 0x5709, 0xE0F6,
+ 0x570A, 0xE0F5,
+ 0x571C, 0xE0F7,
+ 0x571F, 0xCDC1,
+ 0x5723, 0xCAA5,
+ 0x5728, 0xD4DA,
+ 0x5729, 0xDBD7,
+ 0x572A, 0xDBD9,
+ 0x572C, 0xDBD8,
+ 0x572D, 0xB9E7,
+ 0x572E, 0xDBDC,
+ 0x572F, 0xDBDD,
+ 0x5730, 0xB5D8,
+ 0x5733, 0xDBDA,
+ 0x5739, 0xDBDB,
+ 0x573A, 0xB3A1,
+ 0x573B, 0xDBDF,
+ 0x573E, 0xBBF8,
+ 0x5740, 0xD6B7,
+ 0x5742, 0xDBE0,
+ 0x5747, 0xBEF9,
+ 0x574A, 0xB7BB,
+ 0x574C, 0xDBD0,
+ 0x574D, 0xCCAE,
+ 0x574E, 0xBFB2,
+ 0x574F, 0xBBB5,
+ 0x5750, 0xD7F8,
+ 0x5751, 0xBFD3,
+ 0x5757, 0xBFE9,
+ 0x575A, 0xBCE1,
+ 0x575B, 0xCCB3,
+ 0x575C, 0xDBDE,
+ 0x575D, 0xB0D3,
+ 0x575E, 0xCEEB,
+ 0x575F, 0xB7D8,
+ 0x5760, 0xD7B9,
+ 0x5761, 0xC6C2,
+ 0x5764, 0xC0A4,
+ 0x5766, 0xCCB9,
+ 0x5768, 0xDBE7,
+ 0x5769, 0xDBE1,
+ 0x576A, 0xC6BA,
+ 0x576B, 0xDBE3,
+ 0x576D, 0xDBE8,
+ 0x576F, 0xC5F7,
+ 0x5773, 0xDBEA,
+ 0x5776, 0xDBE9,
+ 0x5777, 0xBFC0,
+ 0x577B, 0xDBE6,
+ 0x577C, 0xDBE5,
+ 0x5782, 0xB4B9,
+ 0x5783, 0xC0AC,
+ 0x5784, 0xC2A2,
+ 0x5785, 0xDBE2,
+ 0x5786, 0xDBE4,
+ 0x578B, 0xD0CD,
+ 0x578C, 0xDBED,
+ 0x5792, 0xC0DD,
+ 0x5793, 0xDBF2,
+ 0x579B, 0xB6E2,
+ 0x57A0, 0xDBF3,
+ 0x57A1, 0xDBD2,
+ 0x57A2, 0xB9B8,
+ 0x57A3, 0xD4AB,
+ 0x57A4, 0xDBEC,
+ 0x57A6, 0xBFD1,
+ 0x57A7, 0xDBF0,
+ 0x57A9, 0xDBD1,
+ 0x57AB, 0xB5E6,
+ 0x57AD, 0xDBEB,
+ 0x57AE, 0xBFE5,
+ 0x57B2, 0xDBEE,
+ 0x57B4, 0xDBF1,
+ 0x57B8, 0xDBF9,
+ 0x57C2, 0xB9A1,
+ 0x57C3, 0xB0A3,
+ 0x57CB, 0xC2F1,
+ 0x57CE, 0xB3C7,
+ 0x57CF, 0xDBEF,
+ 0x57D2, 0xDBF8,
+ 0x57D4, 0xC6D2,
+ 0x57D5, 0xDBF4,
+ 0x57D8, 0xDBF5,
+ 0x57D9, 0xDBF7,
+ 0x57DA, 0xDBF6,
+ 0x57DD, 0xDBFE,
+ 0x57DF, 0xD3F2,
+ 0x57E0, 0xB2BA,
+ 0x57E4, 0xDBFD,
+ 0x57ED, 0xDCA4,
+ 0x57EF, 0xDBFB,
+ 0x57F4, 0xDBFA,
+ 0x57F8, 0xDBFC,
+ 0x57F9, 0xC5E0,
+ 0x57FA, 0xBBF9,
+ 0x57FD, 0xDCA3,
+ 0x5800, 0xDCA5,
+ 0x5802, 0xCCC3,
+ 0x5806, 0xB6D1,
+ 0x5807, 0xDDC0,
+ 0x580B, 0xDCA1,
+ 0x580D, 0xDCA2,
+ 0x5811, 0xC7B5,
+ 0x5815, 0xB6E9,
+ 0x5819, 0xDCA7,
+ 0x581E, 0xDCA6,
+ 0x5820, 0xDCA9,
+ 0x5821, 0xB1A4,
+ 0x5824, 0xB5CC,
+ 0x582A, 0xBFB0,
+ 0x5830, 0xD1DF,
+ 0x5835, 0xB6C2,
+ 0x5844, 0xDCA8,
+ 0x584C, 0xCBFA,
+ 0x584D, 0xEBF3,
+ 0x5851, 0xCBDC,
+ 0x5854, 0xCBFE,
+ 0x5858, 0xCCC1,
+ 0x585E, 0xC8FB,
+ 0x5865, 0xDCAA,
+ 0x586B, 0xCCEE,
+ 0x586C, 0xDCAB,
+ 0x587E, 0xDBD3,
+ 0x5880, 0xDCAF,
+ 0x5881, 0xDCAC,
+ 0x5883, 0xBEB3,
+ 0x5885, 0xCAFB,
+ 0x5889, 0xDCAD,
+ 0x5892, 0xC9CA,
+ 0x5893, 0xC4B9,
+ 0x5899, 0xC7BD,
+ 0x589A, 0xDCAE,
+ 0x589E, 0xD4F6,
+ 0x589F, 0xD0E6,
+ 0x58A8, 0xC4AB,
+ 0x58A9, 0xB6D5,
+ 0x58BC, 0xDBD4,
+ 0x58C1, 0xB1DA,
+ 0x58C5, 0xDBD5,
+ 0x58D1, 0xDBD6,
+ 0x58D5, 0xBABE,
+ 0x58E4, 0xC8C0,
+ 0x58EB, 0xCABF,
+ 0x58EC, 0xC8C9,
+ 0x58EE, 0xD7B3,
+ 0x58F0, 0xC9F9,
+ 0x58F3, 0xBFC7,
+ 0x58F6, 0xBAF8,
+ 0x58F9, 0xD2BC,
+ 0x5902, 0xE2BA,
+ 0x5904, 0xB4A6,
+ 0x5907, 0xB1B8,
+ 0x590D, 0xB8B4,
+ 0x590F, 0xCFC4,
+ 0x5914, 0xD9E7,
+ 0x5915, 0xCFA6,
+ 0x5916, 0xCDE2,
+ 0x5919, 0xD9ED,
+ 0x591A, 0xB6E0,
+ 0x591C, 0xD2B9,
+ 0x591F, 0xB9BB,
+ 0x5924, 0xE2B9,
+ 0x5925, 0xE2B7,
+ 0x5927, 0xB4F3,
+ 0x5929, 0xCCEC,
+ 0x592A, 0xCCAB,
+ 0x592B, 0xB7F2,
+ 0x592D, 0xD8B2,
+ 0x592E, 0xD1EB,
+ 0x592F, 0xBABB,
+ 0x5931, 0xCAA7,
+ 0x5934, 0xCDB7,
+ 0x5937, 0xD2C4,
+ 0x5938, 0xBFE4,
+ 0x5939, 0xBCD0,
+ 0x593A, 0xB6E1,
+ 0x593C, 0xDEC5,
+ 0x5941, 0xDEC6,
+ 0x5942, 0xDBBC,
+ 0x5944, 0xD1D9,
+ 0x5947, 0xC6E6,
+ 0x5948, 0xC4CE,
+ 0x5949, 0xB7EE,
+ 0x594B, 0xB7DC,
+ 0x594E, 0xBFFC,
+ 0x594F, 0xD7E0,
+ 0x5951, 0xC6F5,
+ 0x5954, 0xB1BC,
+ 0x5955, 0xDEC8,
+ 0x5956, 0xBDB1,
+ 0x5957, 0xCCD7,
+ 0x5958, 0xDECA,
+ 0x595A, 0xDEC9,
+ 0x5960, 0xB5EC,
+ 0x5962, 0xC9DD,
+ 0x5965, 0xB0C2,
+ 0x5973, 0xC5AE,
+ 0x5974, 0xC5AB,
+ 0x5976, 0xC4CC,
+ 0x5978, 0xBCE9,
+ 0x5979, 0xCBFD,
+ 0x597D, 0xBAC3,
+ 0x5981, 0xE5F9,
+ 0x5982, 0xC8E7,
+ 0x5983, 0xE5FA,
+ 0x5984, 0xCDFD,
+ 0x5986, 0xD7B1,
+ 0x5987, 0xB8BE,
+ 0x5988, 0xC2E8,
+ 0x598A, 0xC8D1,
+ 0x598D, 0xE5FB,
+ 0x5992, 0xB6CA,
+ 0x5993, 0xBCCB,
+ 0x5996, 0xD1FD,
+ 0x5997, 0xE6A1,
+ 0x5999, 0xC3EE,
+ 0x599E, 0xE6A4,
+ 0x59A3, 0xE5FE,
+ 0x59A4, 0xE6A5,
+ 0x59A5, 0xCDD7,
+ 0x59A8, 0xB7C1,
+ 0x59A9, 0xE5FC,
+ 0x59AA, 0xE5FD,
+ 0x59AB, 0xE6A3,
+ 0x59AE, 0xC4DD,
+ 0x59AF, 0xE6A8,
+ 0x59B2, 0xE6A7,
+ 0x59B9, 0xC3C3,
+ 0x59BB, 0xC6DE,
+ 0x59BE, 0xE6AA,
+ 0x59C6, 0xC4B7,
+ 0x59CA, 0xE6A2,
+ 0x59CB, 0xCABC,
+ 0x59D0, 0xBDE3,
+ 0x59D1, 0xB9C3,
+ 0x59D2, 0xE6A6,
+ 0x59D3, 0xD0D5,
+ 0x59D4, 0xCEAF,
+ 0x59D7, 0xE6A9,
+ 0x59D8, 0xE6B0,
+ 0x59DA, 0xD2A6,
+ 0x59DC, 0xBDAA,
+ 0x59DD, 0xE6AD,
+ 0x59E3, 0xE6AF,
+ 0x59E5, 0xC0D1,
+ 0x59E8, 0xD2CC,
+ 0x59EC, 0xBCA7,
+ 0x59F9, 0xE6B1,
+ 0x59FB, 0xD2F6,
+ 0x59FF, 0xD7CB,
+ 0x5A01, 0xCDFE,
+ 0x5A03, 0xCDDE,
+ 0x5A04, 0xC2A6,
+ 0x5A05, 0xE6AB,
+ 0x5A06, 0xE6AC,
+ 0x5A07, 0xBDBF,
+ 0x5A08, 0xE6AE,
+ 0x5A09, 0xE6B3,
+ 0x5A0C, 0xE6B2,
+ 0x5A11, 0xE6B6,
+ 0x5A13, 0xE6B8,
+ 0x5A18, 0xC4EF,
+ 0x5A1C, 0xC4C8,
+ 0x5A1F, 0xBEEA,
+ 0x5A20, 0xC9EF,
+ 0x5A23, 0xE6B7,
+ 0x5A25, 0xB6F0,
+ 0x5A29, 0xC3E4,
+ 0x5A31, 0xD3E9,
+ 0x5A32, 0xE6B4,
+ 0x5A34, 0xE6B5,
+ 0x5A36, 0xC8A2,
+ 0x5A3C, 0xE6BD,
+ 0x5A40, 0xE6B9,
+ 0x5A46, 0xC6C5,
+ 0x5A49, 0xCDF1,
+ 0x5A4A, 0xE6BB,
+ 0x5A55, 0xE6BC,
+ 0x5A5A, 0xBBE9,
+ 0x5A62, 0xE6BE,
+ 0x5A67, 0xE6BA,
+ 0x5A6A, 0xC0B7,
+ 0x5A74, 0xD3A4,
+ 0x5A75, 0xE6BF,
+ 0x5A76, 0xC9F4,
+ 0x5A77, 0xE6C3,
+ 0x5A7A, 0xE6C4,
+ 0x5A7F, 0xD0F6,
+ 0x5A92, 0xC3BD,
+ 0x5A9A, 0xC3C4,
+ 0x5A9B, 0xE6C2,
+ 0x5AAA, 0xE6C1,
+ 0x5AB2, 0xE6C7,
+ 0x5AB3, 0xCFB1,
+ 0x5AB5, 0xEBF4,
+ 0x5AB8, 0xE6CA,
+ 0x5ABE, 0xE6C5,
+ 0x5AC1, 0xBCDE,
+ 0x5AC2, 0xC9A9,
+ 0x5AC9, 0xBCB5,
+ 0x5ACC, 0xCFD3,
+ 0x5AD2, 0xE6C8,
+ 0x5AD4, 0xE6C9,
+ 0x5AD6, 0xE6CE,
+ 0x5AD8, 0xE6D0,
+ 0x5ADC, 0xE6D1,
+ 0x5AE0, 0xE6CB,
+ 0x5AE1, 0xB5D5,
+ 0x5AE3, 0xE6CC,
+ 0x5AE6, 0xE6CF,
+ 0x5AE9, 0xC4DB,
+ 0x5AEB, 0xE6C6,
+ 0x5AF1, 0xE6CD,
+ 0x5B09, 0xE6D2,
+ 0x5B16, 0xE6D4,
+ 0x5B17, 0xE6D3,
+ 0x5B32, 0xE6D5,
+ 0x5B34, 0xD9F8,
+ 0x5B37, 0xE6D6,
+ 0x5B40, 0xE6D7,
+ 0x5B50, 0xD7D3,
+ 0x5B51, 0xE6DD,
+ 0x5B53, 0xE6DE,
+ 0x5B54, 0xBFD7,
+ 0x5B55, 0xD4D0,
+ 0x5B57, 0xD7D6,
+ 0x5B58, 0xB4E6,
+ 0x5B59, 0xCBEF,
+ 0x5B5A, 0xE6DA,
+ 0x5B5B, 0xD8C3,
+ 0x5B5C, 0xD7CE,
+ 0x5B5D, 0xD0A2,
+ 0x5B5F, 0xC3CF,
+ 0x5B62, 0xE6DF,
+ 0x5B63, 0xBCBE,
+ 0x5B64, 0xB9C2,
+ 0x5B65, 0xE6DB,
+ 0x5B66, 0xD1A7,
+ 0x5B69, 0xBAA2,
+ 0x5B6A, 0xC2CF,
+ 0x5B6C, 0xD8AB,
+ 0x5B70, 0xCAEB,
+ 0x5B71, 0xE5EE,
+ 0x5B73, 0xE6DC,
+ 0x5B75, 0xB7F5,
+ 0x5B7A, 0xC8E6,
+ 0x5B7D, 0xC4F5,
+ 0x5B80, 0xE5B2,
+ 0x5B81, 0xC4FE,
+ 0x5B83, 0xCBFC,
+ 0x5B84, 0xE5B3,
+ 0x5B85, 0xD5AC,
+ 0x5B87, 0xD3EE,
+ 0x5B88, 0xCAD8,
+ 0x5B89, 0xB0B2,
+ 0x5B8B, 0xCBCE,
+ 0x5B8C, 0xCDEA,
+ 0x5B8F, 0xBAEA,
+ 0x5B93, 0xE5B5,
+ 0x5B95, 0xE5B4,
+ 0x5B97, 0xD7DA,
+ 0x5B98, 0xB9D9,
+ 0x5B99, 0xD6E6,
+ 0x5B9A, 0xB6A8,
+ 0x5B9B, 0xCDF0,
+ 0x5B9C, 0xD2CB,
+ 0x5B9D, 0xB1A6,
+ 0x5B9E, 0xCAB5,
+ 0x5BA0, 0xB3E8,
+ 0x5BA1, 0xC9F3,
+ 0x5BA2, 0xBFCD,
+ 0x5BA3, 0xD0FB,
+ 0x5BA4, 0xCAD2,
+ 0x5BA5, 0xE5B6,
+ 0x5BA6, 0xBBC2,
+ 0x5BAA, 0xCFDC,
+ 0x5BAB, 0xB9AC,
+ 0x5BB0, 0xD4D7,
+ 0x5BB3, 0xBAA6,
+ 0x5BB4, 0xD1E7,
+ 0x5BB5, 0xCFFC,
+ 0x5BB6, 0xBCD2,
+ 0x5BB8, 0xE5B7,
+ 0x5BB9, 0xC8DD,
+ 0x5BBD, 0xBFED,
+ 0x5BBE, 0xB1F6,
+ 0x5BBF, 0xCBDE,
+ 0x5BC2, 0xBCC5,
+ 0x5BC4, 0xBCC4,
+ 0x5BC5, 0xD2FA,
+ 0x5BC6, 0xC3DC,
+ 0x5BC7, 0xBFDC,
+ 0x5BCC, 0xB8BB,
+ 0x5BD0, 0xC3C2,
+ 0x5BD2, 0xBAAE,
+ 0x5BD3, 0xD4A2,
+ 0x5BDD, 0xC7DE,
+ 0x5BDE, 0xC4AF,
+ 0x5BDF, 0xB2EC,
+ 0x5BE1, 0xB9D1,
+ 0x5BE4, 0xE5BB,
+ 0x5BE5, 0xC1C8,
+ 0x5BE8, 0xD5AF,
+ 0x5BEE, 0xE5BC,
+ 0x5BF0, 0xE5BE,
+ 0x5BF8, 0xB4E7,
+ 0x5BF9, 0xB6D4,
+ 0x5BFA, 0xCBC2,
+ 0x5BFB, 0xD1B0,
+ 0x5BFC, 0xB5BC,
+ 0x5BFF, 0xCAD9,
+ 0x5C01, 0xB7E2,
+ 0x5C04, 0xC9E4,
+ 0x5C06, 0xBDAB,
+ 0x5C09, 0xCEBE,
+ 0x5C0A, 0xD7F0,
+ 0x5C0F, 0xD0A1,
+ 0x5C11, 0xC9D9,
+ 0x5C14, 0xB6FB,
+ 0x5C15, 0xE6D8,
+ 0x5C16, 0xBCE2,
+ 0x5C18, 0xB3BE,
+ 0x5C1A, 0xC9D0,
+ 0x5C1C, 0xE6D9,
+ 0x5C1D, 0xB3A2,
+ 0x5C22, 0xDECC,
+ 0x5C24, 0xD3C8,
+ 0x5C25, 0xDECD,
+ 0x5C27, 0xD2A2,
+ 0x5C2C, 0xDECE,
+ 0x5C31, 0xBECD,
+ 0x5C34, 0xDECF,
+ 0x5C38, 0xCAAC,
+ 0x5C39, 0xD2FC,
+ 0x5C3A, 0xB3DF,
+ 0x5C3B, 0xE5EA,
+ 0x5C3C, 0xC4E1,
+ 0x5C3D, 0xBEA1,
+ 0x5C3E, 0xCEB2,
+ 0x5C3F, 0xC4F2,
+ 0x5C40, 0xBED6,
+ 0x5C41, 0xC6A8,
+ 0x5C42, 0xB2E3,
+ 0x5C45, 0xBED3,
+ 0x5C48, 0xC7FC,
+ 0x5C49, 0xCCEB,
+ 0x5C4A, 0xBDEC,
+ 0x5C4B, 0xCEDD,
+ 0x5C4E, 0xCABA,
+ 0x5C4F, 0xC6C1,
+ 0x5C50, 0xE5EC,
+ 0x5C51, 0xD0BC,
+ 0x5C55, 0xD5B9,
+ 0x5C59, 0xE5ED,
+ 0x5C5E, 0xCAF4,
+ 0x5C60, 0xCDC0,
+ 0x5C61, 0xC2C5,
+ 0x5C63, 0xE5EF,
+ 0x5C65, 0xC2C4,
+ 0x5C66, 0xE5F0,
+ 0x5C6E, 0xE5F8,
+ 0x5C6F, 0xCDCD,
+ 0x5C71, 0xC9BD,
+ 0x5C79, 0xD2D9,
+ 0x5C7A, 0xE1A8,
+ 0x5C7F, 0xD3EC,
+ 0x5C81, 0xCBEA,
+ 0x5C82, 0xC6F1,
+ 0x5C88, 0xE1AC,
+ 0x5C8C, 0xE1A7,
+ 0x5C8D, 0xE1A9,
+ 0x5C90, 0xE1AA,
+ 0x5C91, 0xE1AF,
+ 0x5C94, 0xB2ED,
+ 0x5C96, 0xE1AB,
+ 0x5C97, 0xB8DA,
+ 0x5C98, 0xE1AD,
+ 0x5C99, 0xE1AE,
+ 0x5C9A, 0xE1B0,
+ 0x5C9B, 0xB5BA,
+ 0x5C9C, 0xE1B1,
+ 0x5CA2, 0xE1B3,
+ 0x5CA3, 0xE1B8,
+ 0x5CA9, 0xD1D2,
+ 0x5CAB, 0xE1B6,
+ 0x5CAC, 0xE1B5,
+ 0x5CAD, 0xC1EB,
+ 0x5CB1, 0xE1B7,
+ 0x5CB3, 0xD4C0,
+ 0x5CB5, 0xE1B2,
+ 0x5CB7, 0xE1BA,
+ 0x5CB8, 0xB0B6,
+ 0x5CBD, 0xE1B4,
+ 0x5CBF, 0xBFF9,
+ 0x5CC1, 0xE1B9,
+ 0x5CC4, 0xE1BB,
+ 0x5CCB, 0xE1BE,
+ 0x5CD2, 0xE1BC,
+ 0x5CD9, 0xD6C5,
+ 0x5CE1, 0xCFBF,
+ 0x5CE4, 0xE1BD,
+ 0x5CE5, 0xE1BF,
+ 0x5CE6, 0xC2CD,
+ 0x5CE8, 0xB6EB,
+ 0x5CEA, 0xD3F8,
+ 0x5CED, 0xC7CD,
+ 0x5CF0, 0xB7E5,
+ 0x5CFB, 0xBEFE,
+ 0x5D02, 0xE1C0,
+ 0x5D03, 0xE1C1,
+ 0x5D06, 0xE1C7,
+ 0x5D07, 0xB3E7,
+ 0x5D0E, 0xC6E9,
+ 0x5D14, 0xB4DE,
+ 0x5D16, 0xD1C2,
+ 0x5D1B, 0xE1C8,
+ 0x5D1E, 0xE1C6,
+ 0x5D24, 0xE1C5,
+ 0x5D26, 0xE1C3,
+ 0x5D27, 0xE1C2,
+ 0x5D29, 0xB1C0,
+ 0x5D2D, 0xD5B8,
+ 0x5D2E, 0xE1C4,
+ 0x5D34, 0xE1CB,
+ 0x5D3D, 0xE1CC,
+ 0x5D3E, 0xE1CA,
+ 0x5D47, 0xEFFA,
+ 0x5D4A, 0xE1D3,
+ 0x5D4B, 0xE1D2,
+ 0x5D4C, 0xC7B6,
+ 0x5D58, 0xE1C9,
+ 0x5D5B, 0xE1CE,
+ 0x5D5D, 0xE1D0,
+ 0x5D69, 0xE1D4,
+ 0x5D6B, 0xE1D1,
+ 0x5D6C, 0xE1CD,
+ 0x5D6F, 0xE1CF,
+ 0x5D74, 0xE1D5,
+ 0x5D82, 0xE1D6,
+ 0x5D99, 0xE1D7,
+ 0x5D9D, 0xE1D8,
+ 0x5DB7, 0xE1DA,
+ 0x5DC5, 0xE1DB,
+ 0x5DCD, 0xCEA1,
+ 0x5DDB, 0xE7DD,
+ 0x5DDD, 0xB4A8,
+ 0x5DDE, 0xD6DD,
+ 0x5DE1, 0xD1B2,
+ 0x5DE2, 0xB3B2,
+ 0x5DE5, 0xB9A4,
+ 0x5DE6, 0xD7F3,
+ 0x5DE7, 0xC7C9,
+ 0x5DE8, 0xBEDE,
+ 0x5DE9, 0xB9AE,
+ 0x5DEB, 0xCED7,
+ 0x5DEE, 0xB2EE,
+ 0x5DEF, 0xDBCF,
+ 0x5DF1, 0xBCBA,
+ 0x5DF2, 0xD2D1,
+ 0x5DF3, 0xCBC8,
+ 0x5DF4, 0xB0CD,
+ 0x5DF7, 0xCFEF,
+ 0x5DFD, 0xD9E3,
+ 0x5DFE, 0xBDED,
+ 0x5E01, 0xB1D2,
+ 0x5E02, 0xCAD0,
+ 0x5E03, 0xB2BC,
+ 0x5E05, 0xCBA7,
+ 0x5E06, 0xB7AB,
+ 0x5E08, 0xCAA6,
+ 0x5E0C, 0xCFA3,
+ 0x5E0F, 0xE0F8,
+ 0x5E10, 0xD5CA,
+ 0x5E11, 0xE0FB,
+ 0x5E14, 0xE0FA,
+ 0x5E15, 0xC5C1,
+ 0x5E16, 0xCCFB,
+ 0x5E18, 0xC1B1,
+ 0x5E19, 0xE0F9,
+ 0x5E1A, 0xD6E3,
+ 0x5E1B, 0xB2AF,
+ 0x5E1C, 0xD6C4,
+ 0x5E1D, 0xB5DB,
+ 0x5E26, 0xB4F8,
+ 0x5E27, 0xD6A1,
+ 0x5E2D, 0xCFAF,
+ 0x5E2E, 0xB0EF,
+ 0x5E31, 0xE0FC,
+ 0x5E37, 0xE1A1,
+ 0x5E38, 0xB3A3,
+ 0x5E3B, 0xE0FD,
+ 0x5E3C, 0xE0FE,
+ 0x5E3D, 0xC3B1,
+ 0x5E42, 0xC3DD,
+ 0x5E44, 0xE1A2,
+ 0x5E45, 0xB7F9,
+ 0x5E4C, 0xBBCF,
+ 0x5E54, 0xE1A3,
+ 0x5E55, 0xC4BB,
+ 0x5E5B, 0xE1A4,
+ 0x5E5E, 0xE1A5,
+ 0x5E61, 0xE1A6,
+ 0x5E62, 0xB4B1,
+ 0x5E72, 0xB8C9,
+ 0x5E73, 0xC6BD,
+ 0x5E74, 0xC4EA,
+ 0x5E76, 0xB2A2,
+ 0x5E78, 0xD0D2,
+ 0x5E7A, 0xE7DB,
+ 0x5E7B, 0xBBC3,
+ 0x5E7C, 0xD3D7,
+ 0x5E7D, 0xD3C4,
+ 0x5E7F, 0xB9E3,
+ 0x5E80, 0xE2CF,
+ 0x5E84, 0xD7AF,
+ 0x5E86, 0xC7EC,
+ 0x5E87, 0xB1D3,
+ 0x5E8A, 0xB4B2,
+ 0x5E8B, 0xE2D1,
+ 0x5E8F, 0xD0F2,
+ 0x5E90, 0xC2AE,
+ 0x5E91, 0xE2D0,
+ 0x5E93, 0xBFE2,
+ 0x5E94, 0xD3A6,
+ 0x5E95, 0xB5D7,
+ 0x5E96, 0xE2D2,
+ 0x5E97, 0xB5EA,
+ 0x5E99, 0xC3ED,
+ 0x5E9A, 0xB8FD,
+ 0x5E9C, 0xB8AE,
+ 0x5E9E, 0xC5D3,
+ 0x5E9F, 0xB7CF,
+ 0x5EA0, 0xE2D4,
+ 0x5EA5, 0xE2D3,
+ 0x5EA6, 0xB6C8,
+ 0x5EA7, 0xD7F9,
+ 0x5EAD, 0xCDA5,
+ 0x5EB3, 0xE2D8,
+ 0x5EB5, 0xE2D6,
+ 0x5EB6, 0xCAFC,
+ 0x5EB7, 0xBFB5,
+ 0x5EB8, 0xD3B9,
+ 0x5EB9, 0xE2D5,
+ 0x5EBE, 0xE2D7,
+ 0x5EC9, 0xC1AE,
+ 0x5ECA, 0xC0C8,
+ 0x5ED1, 0xE2DB,
+ 0x5ED2, 0xE2DA,
+ 0x5ED3, 0xC0AA,
+ 0x5ED6, 0xC1CE,
+ 0x5EDB, 0xE2DC,
+ 0x5EE8, 0xE2DD,
+ 0x5EEA, 0xE2DE,
+ 0x5EF4, 0xDBC8,
+ 0x5EF6, 0xD1D3,
+ 0x5EF7, 0xCDA2,
+ 0x5EFA, 0xBDA8,
+ 0x5EFE, 0xDEC3,
+ 0x5EFF, 0xD8A5,
+ 0x5F00, 0xBFAA,
+ 0x5F01, 0xDBCD,
+ 0x5F02, 0xD2EC,
+ 0x5F03, 0xC6FA,
+ 0x5F04, 0xC5AA,
+ 0x5F08, 0xDEC4,
+ 0x5F0A, 0xB1D7,
+ 0x5F0B, 0xDFAE,
+ 0x5F0F, 0xCABD,
+ 0x5F11, 0xDFB1,
+ 0x5F13, 0xB9AD,
+ 0x5F15, 0xD2FD,
+ 0x5F17, 0xB8A5,
+ 0x5F18, 0xBAEB,
+ 0x5F1B, 0xB3DA,
+ 0x5F1F, 0xB5DC,
+ 0x5F20, 0xD5C5,
+ 0x5F25, 0xC3D6,
+ 0x5F26, 0xCFD2,
+ 0x5F27, 0xBBA1,
+ 0x5F29, 0xE5F3,
+ 0x5F2A, 0xE5F2,
+ 0x5F2D, 0xE5F4,
+ 0x5F2F, 0xCDE4,
+ 0x5F31, 0xC8F5,
+ 0x5F39, 0xB5AF,
+ 0x5F3A, 0xC7BF,
+ 0x5F3C, 0xE5F6,
+ 0x5F40, 0xECB0,
+ 0x5F50, 0xE5E6,
+ 0x5F52, 0xB9E9,
+ 0x5F53, 0xB5B1,
+ 0x5F55, 0xC2BC,
+ 0x5F56, 0xE5E8,
+ 0x5F57, 0xE5E7,
+ 0x5F58, 0xE5E9,
+ 0x5F5D, 0xD2CD,
+ 0x5F61, 0xE1EA,
+ 0x5F62, 0xD0CE,
+ 0x5F64, 0xCDAE,
+ 0x5F66, 0xD1E5,
+ 0x5F69, 0xB2CA,
+ 0x5F6A, 0xB1EB,
+ 0x5F6C, 0xB1F2,
+ 0x5F6D, 0xC5ED,
+ 0x5F70, 0xD5C3,
+ 0x5F71, 0xD3B0,
+ 0x5F73, 0xE1DC,
+ 0x5F77, 0xE1DD,
+ 0x5F79, 0xD2DB,
+ 0x5F7B, 0xB3B9,
+ 0x5F7C, 0xB1CB,
+ 0x5F80, 0xCDF9,
+ 0x5F81, 0xD5F7,
+ 0x5F82, 0xE1DE,
+ 0x5F84, 0xBEB6,
+ 0x5F85, 0xB4FD,
+ 0x5F87, 0xE1DF,
+ 0x5F88, 0xBADC,
+ 0x5F89, 0xE1E0,
+ 0x5F8A, 0xBBB2,
+ 0x5F8B, 0xC2C9,
+ 0x5F8C, 0xE1E1,
+ 0x5F90, 0xD0EC,
+ 0x5F92, 0xCDBD,
+ 0x5F95, 0xE1E2,
+ 0x5F97, 0xB5C3,
+ 0x5F98, 0xC5C7,
+ 0x5F99, 0xE1E3,
+ 0x5F9C, 0xE1E4,
+ 0x5FA1, 0xD3F9,
+ 0x5FA8, 0xE1E5,
+ 0x5FAA, 0xD1AD,
+ 0x5FAD, 0xE1E6,
+ 0x5FAE, 0xCEA2,
+ 0x5FB5, 0xE1E7,
+ 0x5FB7, 0xB5C2,
+ 0x5FBC, 0xE1E8,
+ 0x5FBD, 0xBBD5,
+ 0x5FC3, 0xD0C4,
+ 0x5FC4, 0xE2E0,
+ 0x5FC5, 0xB1D8,
+ 0x5FC6, 0xD2E4,
+ 0x5FC9, 0xE2E1,
+ 0x5FCC, 0xBCC9,
+ 0x5FCD, 0xC8CC,
+ 0x5FCF, 0xE2E3,
+ 0x5FD0, 0xECFE,
+ 0x5FD1, 0xECFD,
+ 0x5FD2, 0xDFAF,
+ 0x5FD6, 0xE2E2,
+ 0x5FD7, 0xD6BE,
+ 0x5FD8, 0xCDFC,
+ 0x5FD9, 0xC3A6,
+ 0x5FDD, 0xE3C3,
+ 0x5FE0, 0xD6D2,
+ 0x5FE1, 0xE2E7,
+ 0x5FE4, 0xE2E8,
+ 0x5FE7, 0xD3C7,
+ 0x5FEA, 0xE2EC,
+ 0x5FEB, 0xBFEC,
+ 0x5FED, 0xE2ED,
+ 0x5FEE, 0xE2E5,
+ 0x5FF1, 0xB3C0,
+ 0x5FF5, 0xC4EE,
+ 0x5FF8, 0xE2EE,
+ 0x5FFB, 0xD0C3,
+ 0x5FFD, 0xBAF6,
+ 0x5FFE, 0xE2E9,
+ 0x5FFF, 0xB7DE,
+ 0x6000, 0xBBB3,
+ 0x6001, 0xCCAC,
+ 0x6002, 0xCBCB,
+ 0x6003, 0xE2E4,
+ 0x6004, 0xE2E6,
+ 0x6005, 0xE2EA,
+ 0x6006, 0xE2EB,
+ 0x600A, 0xE2F7,
+ 0x600D, 0xE2F4,
+ 0x600E, 0xD4F5,
+ 0x600F, 0xE2F3,
+ 0x6012, 0xC5AD,
+ 0x6014, 0xD5FA,
+ 0x6015, 0xC5C2,
+ 0x6016, 0xB2C0,
+ 0x6019, 0xE2EF,
+ 0x601B, 0xE2F2,
+ 0x601C, 0xC1AF,
+ 0x601D, 0xCBBC,
+ 0x6020, 0xB5A1,
+ 0x6021, 0xE2F9,
+ 0x6025, 0xBCB1,
+ 0x6026, 0xE2F1,
+ 0x6027, 0xD0D4,
+ 0x6028, 0xD4B9,
+ 0x6029, 0xE2F5,
+ 0x602A, 0xB9D6,
+ 0x602B, 0xE2F6,
+ 0x602F, 0xC7D3,
+ 0x6035, 0xE2F0,
+ 0x603B, 0xD7DC,
+ 0x603C, 0xEDA1,
+ 0x603F, 0xE2F8,
+ 0x6041, 0xEDA5,
+ 0x6042, 0xE2FE,
+ 0x6043, 0xCAD1,
+ 0x604B, 0xC1B5,
+ 0x604D, 0xBBD0,
+ 0x6050, 0xBFD6,
+ 0x6052, 0xBAE3,
+ 0x6055, 0xCBA1,
+ 0x6059, 0xEDA6,
+ 0x605A, 0xEDA3,
+ 0x605D, 0xEDA2,
+ 0x6062, 0xBBD6,
+ 0x6063, 0xEDA7,
+ 0x6064, 0xD0F4,
+ 0x6067, 0xEDA4,
+ 0x6068, 0xBADE,
+ 0x6069, 0xB6F7,
+ 0x606A, 0xE3A1,
+ 0x606B, 0xB6B2,
+ 0x606C, 0xCCF1,
+ 0x606D, 0xB9A7,
+ 0x606F, 0xCFA2,
+ 0x6070, 0xC7A1,
+ 0x6073, 0xBFD2,
+ 0x6076, 0xB6F1,
+ 0x6078, 0xE2FA,
+ 0x6079, 0xE2FB,
+ 0x607A, 0xE2FD,
+ 0x607B, 0xE2FC,
+ 0x607C, 0xC4D5,
+ 0x607D, 0xE3A2,
+ 0x607F, 0xD3C1,
+ 0x6083, 0xE3A7,
+ 0x6084, 0xC7C4,
+ 0x6089, 0xCFA4,
+ 0x608C, 0xE3A9,
+ 0x608D, 0xBAB7,
+ 0x6092, 0xE3A8,
+ 0x6094, 0xBBDA,
+ 0x6096, 0xE3A3,
+ 0x609A, 0xE3A4,
+ 0x609B, 0xE3AA,
+ 0x609D, 0xE3A6,
+ 0x609F, 0xCEF2,
+ 0x60A0, 0xD3C6,
+ 0x60A3, 0xBBBC,
+ 0x60A6, 0xD4C3,
+ 0x60A8, 0xC4FA,
+ 0x60AB, 0xEDA8,
+ 0x60AC, 0xD0FC,
+ 0x60AD, 0xE3A5,
+ 0x60AF, 0xC3F5,
+ 0x60B1, 0xE3AD,
+ 0x60B2, 0xB1AF,
+ 0x60B4, 0xE3B2,
+ 0x60B8, 0xBCC2,
+ 0x60BB, 0xE3AC,
+ 0x60BC, 0xB5BF,
+ 0x60C5, 0xC7E9,
+ 0x60C6, 0xE3B0,
+ 0x60CA, 0xBEAA,
+ 0x60CB, 0xCDEF,
+ 0x60D1, 0xBBF3,
+ 0x60D5, 0xCCE8,
+ 0x60D8, 0xE3AF,
+ 0x60DA, 0xE3B1,
+ 0x60DC, 0xCFA7,
+ 0x60DD, 0xE3AE,
+ 0x60DF, 0xCEA9,
+ 0x60E0, 0xBBDD,
+ 0x60E6, 0xB5EB,
+ 0x60E7, 0xBEE5,
+ 0x60E8, 0xB2D2,
+ 0x60E9, 0xB3CD,
+ 0x60EB, 0xB1B9,
+ 0x60EC, 0xE3AB,
+ 0x60ED, 0xB2D1,
+ 0x60EE, 0xB5AC,
+ 0x60EF, 0xB9DF,
+ 0x60F0, 0xB6E8,
+ 0x60F3, 0xCFEB,
+ 0x60F4, 0xE3B7,
+ 0x60F6, 0xBBCC,
+ 0x60F9, 0xC8C7,
+ 0x60FA, 0xD0CA,
+ 0x6100, 0xE3B8,
+ 0x6101, 0xB3EE,
+ 0x6106, 0xEDA9,
+ 0x6108, 0xD3FA,
+ 0x6109, 0xD3E4,
+ 0x610D, 0xEDAA,
+ 0x610E, 0xE3B9,
+ 0x610F, 0xD2E2,
+ 0x6115, 0xE3B5,
+ 0x611A, 0xD3DE,
+ 0x611F, 0xB8D0,
+ 0x6120, 0xE3B3,
+ 0x6123, 0xE3B6,
+ 0x6124, 0xB7DF,
+ 0x6126, 0xE3B4,
+ 0x6127, 0xC0A2,
+ 0x612B, 0xE3BA,
+ 0x613F, 0xD4B8,
+ 0x6148, 0xB4C8,
+ 0x614A, 0xE3BB,
+ 0x614C, 0xBBC5,
+ 0x614E, 0xC9F7,
+ 0x6151, 0xC9E5,
+ 0x6155, 0xC4BD,
+ 0x615D, 0xEDAB,
+ 0x6162, 0xC2FD,
+ 0x6167, 0xBBDB,
+ 0x6168, 0xBFAE,
+ 0x6170, 0xCEBF,
+ 0x6175, 0xE3BC,
+ 0x6177, 0xBFB6,
+ 0x618B, 0xB1EF,
+ 0x618E, 0xD4F7,
+ 0x6194, 0xE3BE,
+ 0x619D, 0xEDAD,
+ 0x61A7, 0xE3BF,
+ 0x61A8, 0xBAA9,
+ 0x61A9, 0xEDAC,
+ 0x61AC, 0xE3BD,
+ 0x61B7, 0xE3C0,
+ 0x61BE, 0xBAB6,
+ 0x61C2, 0xB6AE,
+ 0x61C8, 0xD0B8,
+ 0x61CA, 0xB0C3,
+ 0x61CB, 0xEDAE,
+ 0x61D1, 0xEDAF,
+ 0x61D2, 0xC0C1,
+ 0x61D4, 0xE3C1,
+ 0x61E6, 0xC5B3,
+ 0x61F5, 0xE3C2,
+ 0x61FF, 0xDCB2,
+ 0x6206, 0xEDB0,
+ 0x6208, 0xB8EA,
+ 0x620A, 0xCEEC,
+ 0x620B, 0xEAA7,
+ 0x620C, 0xD0E7,
+ 0x620D, 0xCAF9,
+ 0x620E, 0xC8D6,
+ 0x620F, 0xCFB7,
+ 0x6210, 0xB3C9,
+ 0x6211, 0xCED2,
+ 0x6212, 0xBDE4,
+ 0x6215, 0xE3DE,
+ 0x6216, 0xBBF2,
+ 0x6217, 0xEAA8,
+ 0x6218, 0xD5BD,
+ 0x621A, 0xC6DD,
+ 0x621B, 0xEAA9,
+ 0x621F, 0xEAAA,
+ 0x6221, 0xEAAC,
+ 0x6222, 0xEAAB,
+ 0x6224, 0xEAAE,
+ 0x6225, 0xEAAD,
+ 0x622A, 0xBDD8,
+ 0x622C, 0xEAAF,
+ 0x622E, 0xC2BE,
+ 0x6233, 0xB4C1,
+ 0x6234, 0xB4F7,
+ 0x6237, 0xBBA7,
+ 0x623D, 0xECE6,
+ 0x623E, 0xECE5,
+ 0x623F, 0xB7BF,
+ 0x6240, 0xCBF9,
+ 0x6241, 0xB1E2,
+ 0x6243, 0xECE7,
+ 0x6247, 0xC9C8,
+ 0x6248, 0xECE8,
+ 0x6249, 0xECE9,
+ 0x624B, 0xCAD6,
+ 0x624C, 0xDED0,
+ 0x624D, 0xB2C5,
+ 0x624E, 0xD4FA,
+ 0x6251, 0xC6CB,
+ 0x6252, 0xB0C7,
+ 0x6253, 0xB4F2,
+ 0x6254, 0xC8D3,
+ 0x6258, 0xCDD0,
+ 0x625B, 0xBFB8,
+ 0x6263, 0xBFDB,
+ 0x6266, 0xC7A4,
+ 0x6267, 0xD6B4,
+ 0x6269, 0xC0A9,
+ 0x626A, 0xDED1,
+ 0x626B, 0xC9A8,
+ 0x626C, 0xD1EF,
+ 0x626D, 0xC5A4,
+ 0x626E, 0xB0E7,
+ 0x626F, 0xB3B6,
+ 0x6270, 0xC8C5,
+ 0x6273, 0xB0E2,
+ 0x6276, 0xB7F6,
+ 0x6279, 0xC5FA,
+ 0x627C, 0xB6F3,
+ 0x627E, 0xD5D2,
+ 0x627F, 0xB3D0,
+ 0x6280, 0xBCBC,
+ 0x6284, 0xB3AD,
+ 0x6289, 0xBEF1,
+ 0x628A, 0xB0D1,
+ 0x6291, 0xD2D6,
+ 0x6292, 0xCAE3,
+ 0x6293, 0xD7A5,
+ 0x6295, 0xCDB6,
+ 0x6296, 0xB6B6,
+ 0x6297, 0xBFB9,
+ 0x6298, 0xD5DB,
+ 0x629A, 0xB8A7,
+ 0x629B, 0xC5D7,
+ 0x629F, 0xDED2,
+ 0x62A0, 0xBFD9,
+ 0x62A1, 0xC2D5,
+ 0x62A2, 0xC7C0,
+ 0x62A4, 0xBBA4,
+ 0x62A5, 0xB1A8,
+ 0x62A8, 0xC5EA,
+ 0x62AB, 0xC5FB,
+ 0x62AC, 0xCCA7,
+ 0x62B1, 0xB1A7,
+ 0x62B5, 0xB5D6,
+ 0x62B9, 0xC4A8,
+ 0x62BB, 0xDED3,
+ 0x62BC, 0xD1BA,
+ 0x62BD, 0xB3E9,
+ 0x62BF, 0xC3F2,
+ 0x62C2, 0xB7F7,
+ 0x62C4, 0xD6F4,
+ 0x62C5, 0xB5A3,
+ 0x62C6, 0xB2F0,
+ 0x62C7, 0xC4B4,
+ 0x62C8, 0xC4E9,
+ 0x62C9, 0xC0AD,
+ 0x62CA, 0xDED4,
+ 0x62CC, 0xB0E8,
+ 0x62CD, 0xC5C4,
+ 0x62CE, 0xC1E0,
+ 0x62D0, 0xB9D5,
+ 0x62D2, 0xBEDC,
+ 0x62D3, 0xCDD8,
+ 0x62D4, 0xB0CE,
+ 0x62D6, 0xCDCF,
+ 0x62D7, 0xDED6,
+ 0x62D8, 0xBED0,
+ 0x62D9, 0xD7BE,
+ 0x62DA, 0xDED5,
+ 0x62DB, 0xD5D0,
+ 0x62DC, 0xB0DD,
+ 0x62DF, 0xC4E2,
+ 0x62E2, 0xC2A3,
+ 0x62E3, 0xBCF0,
+ 0x62E5, 0xD3B5,
+ 0x62E6, 0xC0B9,
+ 0x62E7, 0xC5A1,
+ 0x62E8, 0xB2A6,
+ 0x62E9, 0xD4F1,
+ 0x62EC, 0xC0A8,
+ 0x62ED, 0xCAC3,
+ 0x62EE, 0xDED7,
+ 0x62EF, 0xD5FC,
+ 0x62F1, 0xB9B0,
+ 0x62F3, 0xC8AD,
+ 0x62F4, 0xCBA9,
+ 0x62F6, 0xDED9,
+ 0x62F7, 0xBFBD,
+ 0x62FC, 0xC6B4,
+ 0x62FD, 0xD7A7,
+ 0x62FE, 0xCAB0,
+ 0x62FF, 0xC4C3,
+ 0x6301, 0xB3D6,
+ 0x6302, 0xB9D2,
+ 0x6307, 0xD6B8,
+ 0x6308, 0xEAFC,
+ 0x6309, 0xB0B4,
+ 0x630E, 0xBFE6,
+ 0x6311, 0xCCF4,
+ 0x6316, 0xCDDA,
+ 0x631A, 0xD6BF,
+ 0x631B, 0xC2CE,
+ 0x631D, 0xCECE,
+ 0x631E, 0xCCA2,
+ 0x631F, 0xD0AE,
+ 0x6320, 0xC4D3,
+ 0x6321, 0xB5B2,
+ 0x6322, 0xDED8,
+ 0x6323, 0xD5F5,
+ 0x6324, 0xBCB7,
+ 0x6325, 0xBBD3,
+ 0x6328, 0xB0A4,
+ 0x632A, 0xC5B2,
+ 0x632B, 0xB4EC,
+ 0x632F, 0xD5F1,
+ 0x6332, 0xEAFD,
+ 0x6339, 0xDEDA,
+ 0x633A, 0xCDA6,
+ 0x633D, 0xCDEC,
+ 0x6342, 0xCEE6,
+ 0x6343, 0xDEDC,
+ 0x6345, 0xCDB1,
+ 0x6346, 0xC0A6,
+ 0x6349, 0xD7BD,
+ 0x634B, 0xDEDB,
+ 0x634C, 0xB0C6,
+ 0x634D, 0xBAB4,
+ 0x634E, 0xC9D3,
+ 0x634F, 0xC4F3,
+ 0x6350, 0xBEE8,
+ 0x6355, 0xB2B6,
+ 0x635E, 0xC0CC,
+ 0x635F, 0xCBF0,
+ 0x6361, 0xBCF1,
+ 0x6362, 0xBBBB,
+ 0x6363, 0xB5B7,
+ 0x6367, 0xC5F5,
+ 0x6369, 0xDEE6,
+ 0x636D, 0xDEE3,
+ 0x636E, 0xBEDD,
+ 0x6371, 0xDEDF,
+ 0x6376, 0xB4B7,
+ 0x6377, 0xBDDD,
+ 0x637A, 0xDEE0,
+ 0x637B, 0xC4ED,
+ 0x6380, 0xCFC6,
+ 0x6382, 0xB5E0,
+ 0x6387, 0xB6DE,
+ 0x6388, 0xCADA,
+ 0x6389, 0xB5F4,
+ 0x638A, 0xDEE5,
+ 0x638C, 0xD5C6,
+ 0x638E, 0xDEE1,
+ 0x638F, 0xCCCD,
+ 0x6390, 0xC6FE,
+ 0x6392, 0xC5C5,
+ 0x6396, 0xD2B4,
+ 0x6398, 0xBEF2,
+ 0x63A0, 0xC2D3,
+ 0x63A2, 0xCCBD,
+ 0x63A3, 0xB3B8,
+ 0x63A5, 0xBDD3,
+ 0x63A7, 0xBFD8,
+ 0x63A8, 0xCDC6,
+ 0x63A9, 0xD1DA,
+ 0x63AA, 0xB4EB,
+ 0x63AC, 0xDEE4,
+ 0x63AD, 0xDEDD,
+ 0x63AE, 0xDEE7,
+ 0x63B0, 0xEAFE,
+ 0x63B3, 0xC2B0,
+ 0x63B4, 0xDEE2,
+ 0x63B7, 0xD6C0,
+ 0x63B8, 0xB5A7,
+ 0x63BA, 0xB2F4,
+ 0x63BC, 0xDEE8,
+ 0x63BE, 0xDEF2,
+ 0x63C4, 0xDEED,
+ 0x63C6, 0xDEF1,
+ 0x63C9, 0xC8E0,
+ 0x63CD, 0xD7E1,
+ 0x63CE, 0xDEEF,
+ 0x63CF, 0xC3E8,
+ 0x63D0, 0xCCE1,
+ 0x63D2, 0xB2E5,
+ 0x63D6, 0xD2BE,
+ 0x63DE, 0xDEEE,
+ 0x63E0, 0xDEEB,
+ 0x63E1, 0xCED5,
+ 0x63E3, 0xB4A7,
+ 0x63E9, 0xBFAB,
+ 0x63EA, 0xBEBE,
+ 0x63ED, 0xBDD2,
+ 0x63F2, 0xDEE9,
+ 0x63F4, 0xD4AE,
+ 0x63F6, 0xDEDE,
+ 0x63F8, 0xDEEA,
+ 0x63FD, 0xC0BF,
+ 0x63FF, 0xDEEC,
+ 0x6400, 0xB2F3,
+ 0x6401, 0xB8E9,
+ 0x6402, 0xC2A7,
+ 0x6405, 0xBDC1,
+ 0x640B, 0xDEF5,
+ 0x640C, 0xDEF8,
+ 0x640F, 0xB2AB,
+ 0x6410, 0xB4A4,
+ 0x6413, 0xB4EA,
+ 0x6414, 0xC9A6,
+ 0x641B, 0xDEF6,
+ 0x641C, 0xCBD1,
+ 0x641E, 0xB8E3,
+ 0x6420, 0xDEF7,
+ 0x6421, 0xDEFA,
+ 0x6426, 0xDEF9,
+ 0x642A, 0xCCC2,
+ 0x642C, 0xB0E1,
+ 0x642D, 0xB4EE,
+ 0x6434, 0xE5BA,
+ 0x643A, 0xD0AF,
+ 0x643D, 0xB2EB,
+ 0x643F, 0xEBA1,
+ 0x6441, 0xDEF4,
+ 0x6444, 0xC9E3,
+ 0x6445, 0xDEF3,
+ 0x6446, 0xB0DA,
+ 0x6447, 0xD2A1,
+ 0x6448, 0xB1F7,
+ 0x644A, 0xCCAF,
+ 0x6452, 0xDEF0,
+ 0x6454, 0xCBA4,
+ 0x6458, 0xD5AA,
+ 0x645E, 0xDEFB,
+ 0x6467, 0xB4DD,
+ 0x6469, 0xC4A6,
+ 0x646D, 0xDEFD,
+ 0x6478, 0xC3FE,
+ 0x6479, 0xC4A1,
+ 0x647A, 0xDFA1,
+ 0x6482, 0xC1CC,
+ 0x6484, 0xDEFC,
+ 0x6485, 0xBEEF,
+ 0x6487, 0xC6B2,
+ 0x6491, 0xB3C5,
+ 0x6492, 0xC8F6,
+ 0x6495, 0xCBBA,
+ 0x6496, 0xDEFE,
+ 0x6499, 0xDFA4,
+ 0x649E, 0xD7B2,
+ 0x64A4, 0xB3B7,
+ 0x64A9, 0xC1C3,
+ 0x64AC, 0xC7CB,
+ 0x64AD, 0xB2A5,
+ 0x64AE, 0xB4E9,
+ 0x64B0, 0xD7AB,
+ 0x64B5, 0xC4EC,
+ 0x64B7, 0xDFA2,
+ 0x64B8, 0xDFA3,
+ 0x64BA, 0xDFA5,
+ 0x64BC, 0xBAB3,
+ 0x64C0, 0xDFA6,
+ 0x64C2, 0xC0DE,
+ 0x64C5, 0xC9C3,
+ 0x64CD, 0xB2D9,
+ 0x64CE, 0xC7E6,
+ 0x64D0, 0xDFA7,
+ 0x64D2, 0xC7DC,
+ 0x64D7, 0xDFA8,
+ 0x64D8, 0xEBA2,
+ 0x64DE, 0xCBD3,
+ 0x64E2, 0xDFAA,
+ 0x64E4, 0xDFA9,
+ 0x64E6, 0xB2C1,
+ 0x6500, 0xC5CA,
+ 0x6509, 0xDFAB,
+ 0x6512, 0xD4DC,
+ 0x6518, 0xC8C1,
+ 0x6525, 0xDFAC,
+ 0x652B, 0xBEF0,
+ 0x652E, 0xDFAD,
+ 0x652F, 0xD6A7,
+ 0x6534, 0xEAB7,
+ 0x6535, 0xEBB6,
+ 0x6536, 0xCAD5,
+ 0x6538, 0xD8FC,
+ 0x6539, 0xB8C4,
+ 0x653B, 0xB9A5,
+ 0x653E, 0xB7C5,
+ 0x653F, 0xD5FE,
+ 0x6545, 0xB9CA,
+ 0x6548, 0xD0A7,
+ 0x6549, 0xF4CD,
+ 0x654C, 0xB5D0,
+ 0x654F, 0xC3F4,
+ 0x6551, 0xBEC8,
+ 0x6555, 0xEBB7,
+ 0x6556, 0xB0BD,
+ 0x6559, 0xBDCC,
+ 0x655B, 0xC1B2,
+ 0x655D, 0xB1D6,
+ 0x655E, 0xB3A8,
+ 0x6562, 0xB8D2,
+ 0x6563, 0xC9A2,
+ 0x6566, 0xB6D8,
+ 0x656B, 0xEBB8,
+ 0x656C, 0xBEB4,
+ 0x6570, 0xCAFD,
+ 0x6572, 0xC7C3,
+ 0x6574, 0xD5FB,
+ 0x6577, 0xB7F3,
+ 0x6587, 0xCEC4,
+ 0x658B, 0xD5AB,
+ 0x658C, 0xB1F3,
+ 0x6590, 0xECB3,
+ 0x6591, 0xB0DF,
+ 0x6593, 0xECB5,
+ 0x6597, 0xB6B7,
+ 0x6599, 0xC1CF,
+ 0x659B, 0xF5FA,
+ 0x659C, 0xD0B1,
+ 0x659F, 0xD5E5,
+ 0x65A1, 0xCED3,
+ 0x65A4, 0xBDEF,
+ 0x65A5, 0xB3E2,
+ 0x65A7, 0xB8AB,
+ 0x65A9, 0xD5B6,
+ 0x65AB, 0xEDBD,
+ 0x65AD, 0xB6CF,
+ 0x65AF, 0xCBB9,
+ 0x65B0, 0xD0C2,
+ 0x65B9, 0xB7BD,
+ 0x65BC, 0xECB6,
+ 0x65BD, 0xCAA9,
+ 0x65C1, 0xC5D4,
+ 0x65C3, 0xECB9,
+ 0x65C4, 0xECB8,
+ 0x65C5, 0xC2C3,
+ 0x65C6, 0xECB7,
+ 0x65CB, 0xD0FD,
+ 0x65CC, 0xECBA,
+ 0x65CE, 0xECBB,
+ 0x65CF, 0xD7E5,
+ 0x65D2, 0xECBC,
+ 0x65D6, 0xECBD,
+ 0x65D7, 0xC6EC,
+ 0x65E0, 0xCEDE,
+ 0x65E2, 0xBCC8,
+ 0x65E5, 0xC8D5,
+ 0x65E6, 0xB5A9,
+ 0x65E7, 0xBEC9,
+ 0x65E8, 0xD6BC,
+ 0x65E9, 0xD4E7,
+ 0x65EC, 0xD1AE,
+ 0x65ED, 0xD0F1,
+ 0x65EE, 0xEAB8,
+ 0x65EF, 0xEAB9,
+ 0x65F0, 0xEABA,
+ 0x65F1, 0xBAB5,
+ 0x65F6, 0xCAB1,
+ 0x65F7, 0xBFF5,
+ 0x65FA, 0xCDFA,
+ 0x6600, 0xEAC0,
+ 0x6602, 0xB0BA,
+ 0x6603, 0xEABE,
+ 0x6606, 0xC0A5,
+ 0x660A, 0xEABB,
+ 0x660C, 0xB2FD,
+ 0x660E, 0xC3F7,
+ 0x660F, 0xBBE8,
+ 0x6613, 0xD2D7,
+ 0x6614, 0xCEF4,
+ 0x6615, 0xEABF,
+ 0x6619, 0xEABC,
+ 0x661D, 0xEAC3,
+ 0x661F, 0xD0C7,
+ 0x6620, 0xD3B3,
+ 0x6625, 0xB4BA,
+ 0x6627, 0xC3C1,
+ 0x6628, 0xD7F2,
+ 0x662D, 0xD5D1,
+ 0x662F, 0xCAC7,
+ 0x6631, 0xEAC5,
+ 0x6634, 0xEAC4,
+ 0x6635, 0xEAC7,
+ 0x6636, 0xEAC6,
+ 0x663C, 0xD6E7,
+ 0x663E, 0xCFD4,
+ 0x6641, 0xEACB,
+ 0x6643, 0xBBCE,
+ 0x664B, 0xBDFA,
+ 0x664C, 0xC9CE,
+ 0x664F, 0xEACC,
+ 0x6652, 0xC9B9,
+ 0x6653, 0xCFFE,
+ 0x6654, 0xEACA,
+ 0x6655, 0xD4CE,
+ 0x6656, 0xEACD,
+ 0x6657, 0xEACF,
+ 0x665A, 0xCDED,
+ 0x665F, 0xEAC9,
+ 0x6661, 0xEACE,
+ 0x6664, 0xCEEE,
+ 0x6666, 0xBBDE,
+ 0x6668, 0xB3BF,
+ 0x666E, 0xC6D5,
+ 0x666F, 0xBEB0,
+ 0x6670, 0xCEFA,
+ 0x6674, 0xC7E7,
+ 0x6676, 0xBEA7,
+ 0x6677, 0xEAD0,
+ 0x667A, 0xD6C7,
+ 0x667E, 0xC1C0,
+ 0x6682, 0xD4DD,
+ 0x6684, 0xEAD1,
+ 0x6687, 0xCFBE,
+ 0x668C, 0xEAD2,
+ 0x6691, 0xCAEE,
+ 0x6696, 0xC5AF,
+ 0x6697, 0xB0B5,
+ 0x669D, 0xEAD4,
+ 0x66A7, 0xEAD3,
+ 0x66A8, 0xF4DF,
+ 0x66AE, 0xC4BA,
+ 0x66B4, 0xB1A9,
+ 0x66B9, 0xE5DF,
+ 0x66BE, 0xEAD5,
+ 0x66D9, 0xCAEF,
+ 0x66DB, 0xEAD6,
+ 0x66DC, 0xEAD7,
+ 0x66DD, 0xC6D8,
+ 0x66E6, 0xEAD8,
+ 0x66E9, 0xEAD9,
+ 0x66F0, 0xD4BB,
+ 0x66F2, 0xC7FA,
+ 0x66F3, 0xD2B7,
+ 0x66F4, 0xB8FC,
+ 0x66F7, 0xEAC2,
+ 0x66F9, 0xB2DC,
+ 0x66FC, 0xC2FC,
+ 0x66FE, 0xD4F8,
+ 0x66FF, 0xCCE6,
+ 0x6700, 0xD7EE,
+ 0x6708, 0xD4C2,
+ 0x6709, 0xD3D0,
+ 0x670A, 0xEBC3,
+ 0x670B, 0xC5F3,
+ 0x670D, 0xB7FE,
+ 0x6710, 0xEBD4,
+ 0x6714, 0xCBB7,
+ 0x6715, 0xEBDE,
+ 0x6717, 0xC0CA,
+ 0x671B, 0xCDFB,
+ 0x671D, 0xB3AF,
+ 0x671F, 0xC6DA,
+ 0x6726, 0xEBFC,
+ 0x6728, 0xC4BE,
+ 0x672A, 0xCEB4,
+ 0x672B, 0xC4A9,
+ 0x672C, 0xB1BE,
+ 0x672D, 0xD4FD,
+ 0x672F, 0xCAF5,
+ 0x6731, 0xD6EC,
+ 0x6734, 0xC6D3,
+ 0x6735, 0xB6E4,
+ 0x673A, 0xBBFA,
+ 0x673D, 0xD0E0,
+ 0x6740, 0xC9B1,
+ 0x6742, 0xD4D3,
+ 0x6743, 0xC8A8,
+ 0x6746, 0xB8CB,
+ 0x6748, 0xE8BE,
+ 0x6749, 0xC9BC,
+ 0x674C, 0xE8BB,
+ 0x674E, 0xC0EE,
+ 0x674F, 0xD0D3,
+ 0x6750, 0xB2C4,
+ 0x6751, 0xB4E5,
+ 0x6753, 0xE8BC,
+ 0x6756, 0xD5C8,
+ 0x675C, 0xB6C5,
+ 0x675E, 0xE8BD,
+ 0x675F, 0xCAF8,
+ 0x6760, 0xB8DC,
+ 0x6761, 0xCCF5,
+ 0x6765, 0xC0B4,
+ 0x6768, 0xD1EE,
+ 0x6769, 0xE8BF,
+ 0x676A, 0xE8C2,
+ 0x676D, 0xBABC,
+ 0x676F, 0xB1AD,
+ 0x6770, 0xBDDC,
+ 0x6772, 0xEABD,
+ 0x6773, 0xE8C3,
+ 0x6775, 0xE8C6,
+ 0x6777, 0xE8CB,
+ 0x677C, 0xE8CC,
+ 0x677E, 0xCBC9,
+ 0x677F, 0xB0E5,
+ 0x6781, 0xBCAB,
+ 0x6784, 0xB9B9,
+ 0x6787, 0xE8C1,
+ 0x6789, 0xCDF7,
+ 0x678B, 0xE8CA,
+ 0x6790, 0xCEF6,
+ 0x6795, 0xD5ED,
+ 0x6797, 0xC1D6,
+ 0x6798, 0xE8C4,
+ 0x679A, 0xC3B6,
+ 0x679C, 0xB9FB,
+ 0x679D, 0xD6A6,
+ 0x679E, 0xE8C8,
+ 0x67A2, 0xCAE0,
+ 0x67A3, 0xD4E6,
+ 0x67A5, 0xE8C0,
+ 0x67A7, 0xE8C5,
+ 0x67A8, 0xE8C7,
+ 0x67AA, 0xC7B9,
+ 0x67AB, 0xB7E3,
+ 0x67AD, 0xE8C9,
+ 0x67AF, 0xBFDD,
+ 0x67B0, 0xE8D2,
+ 0x67B3, 0xE8D7,
+ 0x67B5, 0xE8D5,
+ 0x67B6, 0xBCDC,
+ 0x67B7, 0xBCCF,
+ 0x67B8, 0xE8DB,
+ 0x67C1, 0xE8DE,
+ 0x67C3, 0xE8DA,
+ 0x67C4, 0xB1FA,
+ 0x67CF, 0xB0D8,
+ 0x67D0, 0xC4B3,
+ 0x67D1, 0xB8CC,
+ 0x67D2, 0xC6E2,
+ 0x67D3, 0xC8BE,
+ 0x67D4, 0xC8E1,
+ 0x67D8, 0xE8CF,
+ 0x67D9, 0xE8D4,
+ 0x67DA, 0xE8D6,
+ 0x67DC, 0xB9F1,
+ 0x67DD, 0xE8D8,
+ 0x67DE, 0xD7F5,
+ 0x67E0, 0xC4FB,
+ 0x67E2, 0xE8DC,
+ 0x67E5, 0xB2E9,
+ 0x67E9, 0xE8D1,
+ 0x67EC, 0xBCED,
+ 0x67EF, 0xBFC2,
+ 0x67F0, 0xE8CD,
+ 0x67F1, 0xD6F9,
+ 0x67F3, 0xC1F8,
+ 0x67F4, 0xB2F1,
+ 0x67FD, 0xE8DF,
+ 0x67FF, 0xCAC1,
+ 0x6800, 0xE8D9,
+ 0x6805, 0xD5A4,
+ 0x6807, 0xB1EA,
+ 0x6808, 0xD5BB,
+ 0x6809, 0xE8CE,
+ 0x680A, 0xE8D0,
+ 0x680B, 0xB6B0,
+ 0x680C, 0xE8D3,
+ 0x680E, 0xE8DD,
+ 0x680F, 0xC0B8,
+ 0x6811, 0xCAF7,
+ 0x6813, 0xCBA8,
+ 0x6816, 0xC6DC,
+ 0x6817, 0xC0F5,
+ 0x681D, 0xE8E9,
+ 0x6821, 0xD0A3,
+ 0x6829, 0xE8F2,
+ 0x682A, 0xD6EA,
+ 0x6832, 0xE8E0,
+ 0x6833, 0xE8E1,
+ 0x6837, 0xD1F9,
+ 0x6838, 0xBACB,
+ 0x6839, 0xB8F9,
+ 0x683C, 0xB8F1,
+ 0x683D, 0xD4D4,
+ 0x683E, 0xE8EF,
+ 0x6840, 0xE8EE,
+ 0x6841, 0xE8EC,
+ 0x6842, 0xB9F0,
+ 0x6843, 0xCCD2,
+ 0x6844, 0xE8E6,
+ 0x6845, 0xCEA6,
+ 0x6846, 0xBFF2,
+ 0x6848, 0xB0B8,
+ 0x6849, 0xE8F1,
+ 0x684A, 0xE8F0,
+ 0x684C, 0xD7C0,
+ 0x684E, 0xE8E4,
+ 0x6850, 0xCDA9,
+ 0x6851, 0xC9A3,
+ 0x6853, 0xBBB8,
+ 0x6854, 0xBDDB,
+ 0x6855, 0xE8EA,
+ 0x6860, 0xE8E2,
+ 0x6861, 0xE8E3,
+ 0x6862, 0xE8E5,
+ 0x6863, 0xB5B5,
+ 0x6864, 0xE8E7,
+ 0x6865, 0xC7C5,
+ 0x6866, 0xE8EB,
+ 0x6867, 0xE8ED,
+ 0x6868, 0xBDB0,
+ 0x6869, 0xD7AE,
+ 0x686B, 0xE8F8,
+ 0x6874, 0xE8F5,
+ 0x6876, 0xCDB0,
+ 0x6877, 0xE8F6,
+ 0x6881, 0xC1BA,
+ 0x6883, 0xE8E8,
+ 0x6885, 0xC3B7,
+ 0x6886, 0xB0F0,
+ 0x688F, 0xE8F4,
+ 0x6893, 0xE8F7,
+ 0x6897, 0xB9A3,
+ 0x68A2, 0xC9D2,
+ 0x68A6, 0xC3CE,
+ 0x68A7, 0xCEE0,
+ 0x68A8, 0xC0E6,
+ 0x68AD, 0xCBF3,
+ 0x68AF, 0xCCDD,
+ 0x68B0, 0xD0B5,
+ 0x68B3, 0xCAE1,
+ 0x68B5, 0xE8F3,
+ 0x68C0, 0xBCEC,
+ 0x68C2, 0xE8F9,
+ 0x68C9, 0xC3DE,
+ 0x68CB, 0xC6E5,
+ 0x68CD, 0xB9F7,
+ 0x68D2, 0xB0F4,
+ 0x68D5, 0xD7D8,
+ 0x68D8, 0xBCAC,
+ 0x68DA, 0xC5EF,
+ 0x68E0, 0xCCC4,
+ 0x68E3, 0xE9A6,
+ 0x68EE, 0xC9AD,
+ 0x68F0, 0xE9A2,
+ 0x68F1, 0xC0E2,
+ 0x68F5, 0xBFC3,
+ 0x68F9, 0xE8FE,
+ 0x68FA, 0xB9D7,
+ 0x68FC, 0xE8FB,
+ 0x6901, 0xE9A4,
+ 0x6905, 0xD2CE,
+ 0x690B, 0xE9A3,
+ 0x690D, 0xD6B2,
+ 0x690E, 0xD7B5,
+ 0x6910, 0xE9A7,
+ 0x6912, 0xBDB7,
+ 0x691F, 0xE8FC,
+ 0x6920, 0xE8FD,
+ 0x6924, 0xE9A1,
+ 0x692D, 0xCDD6,
+ 0x6930, 0xD2AC,
+ 0x6934, 0xE9B2,
+ 0x6939, 0xE9A9,
+ 0x693D, 0xB4AA,
+ 0x693F, 0xB4BB,
+ 0x6942, 0xE9AB,
+ 0x6954, 0xD0A8,
+ 0x6957, 0xE9A5,
+ 0x695A, 0xB3FE,
+ 0x695D, 0xE9AC,
+ 0x695E, 0xC0E3,
+ 0x6960, 0xE9AA,
+ 0x6963, 0xE9B9,
+ 0x6966, 0xE9B8,
+ 0x696B, 0xE9AE,
+ 0x696E, 0xE8FA,
+ 0x6971, 0xE9A8,
+ 0x6977, 0xBFAC,
+ 0x6978, 0xE9B1,
+ 0x6979, 0xE9BA,
+ 0x697C, 0xC2A5,
+ 0x6980, 0xE9AF,
+ 0x6982, 0xB8C5,
+ 0x6984, 0xE9AD,
+ 0x6986, 0xD3DC,
+ 0x6987, 0xE9B4,
+ 0x6988, 0xE9B5,
+ 0x6989, 0xE9B7,
+ 0x698D, 0xE9C7,
+ 0x6994, 0xC0C6,
+ 0x6995, 0xE9C5,
+ 0x6998, 0xE9B0,
+ 0x699B, 0xE9BB,
+ 0x699C, 0xB0F1,
+ 0x69A7, 0xE9BC,
+ 0x69A8, 0xD5A5,
+ 0x69AB, 0xE9BE,
+ 0x69AD, 0xE9BF,
+ 0x69B1, 0xE9C1,
+ 0x69B4, 0xC1F1,
+ 0x69B7, 0xC8B6,
+ 0x69BB, 0xE9BD,
+ 0x69C1, 0xE9C2,
+ 0x69CA, 0xE9C3,
+ 0x69CC, 0xE9B3,
+ 0x69CE, 0xE9B6,
+ 0x69D0, 0xBBB1,
+ 0x69D4, 0xE9C0,
+ 0x69DB, 0xBCF7,
+ 0x69DF, 0xE9C4,
+ 0x69E0, 0xE9C6,
+ 0x69ED, 0xE9CA,
+ 0x69F2, 0xE9CE,
+ 0x69FD, 0xB2DB,
+ 0x69FF, 0xE9C8,
+ 0x6A0A, 0xB7AE,
+ 0x6A17, 0xE9CB,
+ 0x6A18, 0xE9CC,
+ 0x6A1F, 0xD5C1,
+ 0x6A21, 0xC4A3,
+ 0x6A28, 0xE9D8,
+ 0x6A2A, 0xBAE1,
+ 0x6A2F, 0xE9C9,
+ 0x6A31, 0xD3A3,
+ 0x6A35, 0xE9D4,
+ 0x6A3D, 0xE9D7,
+ 0x6A3E, 0xE9D0,
+ 0x6A44, 0xE9CF,
+ 0x6A47, 0xC7C1,
+ 0x6A50, 0xE9D2,
+ 0x6A58, 0xE9D9,
+ 0x6A59, 0xB3C8,
+ 0x6A5B, 0xE9D3,
+ 0x6A61, 0xCFF0,
+ 0x6A65, 0xE9CD,
+ 0x6A71, 0xB3F7,
+ 0x6A79, 0xE9D6,
+ 0x6A7C, 0xE9DA,
+ 0x6A80, 0xCCB4,
+ 0x6A84, 0xCFAD,
+ 0x6A8E, 0xE9D5,
+ 0x6A90, 0xE9DC,
+ 0x6A91, 0xE9DB,
+ 0x6A97, 0xE9DE,
+ 0x6AA0, 0xE9D1,
+ 0x6AA9, 0xE9DD,
+ 0x6AAB, 0xE9DF,
+ 0x6AAC, 0xC3CA,
+ 0x6B20, 0xC7B7,
+ 0x6B21, 0xB4CE,
+ 0x6B22, 0xBBB6,
+ 0x6B23, 0xD0C0,
+ 0x6B24, 0xECA3,
+ 0x6B27, 0xC5B7,
+ 0x6B32, 0xD3FB,
+ 0x6B37, 0xECA4,
+ 0x6B39, 0xECA5,
+ 0x6B3A, 0xC6DB,
+ 0x6B3E, 0xBFEE,
+ 0x6B43, 0xECA6,
+ 0x6B46, 0xECA7,
+ 0x6B47, 0xD0AA,
+ 0x6B49, 0xC7B8,
+ 0x6B4C, 0xB8E8,
+ 0x6B59, 0xECA8,
+ 0x6B62, 0xD6B9,
+ 0x6B63, 0xD5FD,
+ 0x6B64, 0xB4CB,
+ 0x6B65, 0xB2BD,
+ 0x6B66, 0xCEE4,
+ 0x6B67, 0xC6E7,
+ 0x6B6A, 0xCDE1,
+ 0x6B79, 0xB4F5,
+ 0x6B7B, 0xCBC0,
+ 0x6B7C, 0xBCDF,
+ 0x6B81, 0xE9E2,
+ 0x6B82, 0xE9E3,
+ 0x6B83, 0xD1EA,
+ 0x6B84, 0xE9E5,
+ 0x6B86, 0xB4F9,
+ 0x6B87, 0xE9E4,
+ 0x6B89, 0xD1B3,
+ 0x6B8A, 0xCAE2,
+ 0x6B8B, 0xB2D0,
+ 0x6B8D, 0xE9E8,
+ 0x6B92, 0xE9E6,
+ 0x6B93, 0xE9E7,
+ 0x6B96, 0xD6B3,
+ 0x6B9A, 0xE9E9,
+ 0x6B9B, 0xE9EA,
+ 0x6BA1, 0xE9EB,
+ 0x6BAA, 0xE9EC,
+ 0x6BB3, 0xECAF,
+ 0x6BB4, 0xC5B9,
+ 0x6BB5, 0xB6CE,
+ 0x6BB7, 0xD2F3,
+ 0x6BBF, 0xB5EE,
+ 0x6BC1, 0xBBD9,
+ 0x6BC2, 0xECB1,
+ 0x6BC5, 0xD2E3,
+ 0x6BCB, 0xCEE3,
+ 0x6BCD, 0xC4B8,
+ 0x6BCF, 0xC3BF,
+ 0x6BD2, 0xB6BE,
+ 0x6BD3, 0xD8B9,
+ 0x6BD4, 0xB1C8,
+ 0x6BD5, 0xB1CF,
+ 0x6BD6, 0xB1D1,
+ 0x6BD7, 0xC5FE,
+ 0x6BD9, 0xB1D0,
+ 0x6BDB, 0xC3AB,
+ 0x6BE1, 0xD5B1,
+ 0x6BEA, 0xEBA4,
+ 0x6BEB, 0xBAC1,
+ 0x6BEF, 0xCCBA,
+ 0x6BF3, 0xEBA5,
+ 0x6BF5, 0xEBA7,
+ 0x6BF9, 0xEBA8,
+ 0x6BFD, 0xEBA6,
+ 0x6C05, 0xEBA9,
+ 0x6C06, 0xEBAB,
+ 0x6C07, 0xEBAA,
+ 0x6C0D, 0xEBAC,
+ 0x6C0F, 0xCACF,
+ 0x6C10, 0xD8B5,
+ 0x6C11, 0xC3F1,
+ 0x6C13, 0xC3A5,
+ 0x6C14, 0xC6F8,
+ 0x6C15, 0xEBAD,
+ 0x6C16, 0xC4CA,
+ 0x6C18, 0xEBAE,
+ 0x6C19, 0xEBAF,
+ 0x6C1A, 0xEBB0,
+ 0x6C1B, 0xB7D5,
+ 0x6C1F, 0xB7FA,
+ 0x6C21, 0xEBB1,
+ 0x6C22, 0xC7E2,
+ 0x6C24, 0xEBB3,
+ 0x6C26, 0xBAA4,
+ 0x6C27, 0xD1F5,
+ 0x6C28, 0xB0B1,
+ 0x6C29, 0xEBB2,
+ 0x6C2A, 0xEBB4,
+ 0x6C2E, 0xB5AA,
+ 0x6C2F, 0xC2C8,
+ 0x6C30, 0xC7E8,
+ 0x6C32, 0xEBB5,
+ 0x6C34, 0xCBAE,
+ 0x6C35, 0xE3DF,
+ 0x6C38, 0xD3C0,
+ 0x6C3D, 0xD9DB,
+ 0x6C40, 0xCDA1,
+ 0x6C41, 0xD6AD,
+ 0x6C42, 0xC7F3,
+ 0x6C46, 0xD9E0,
+ 0x6C47, 0xBBE3,
+ 0x6C49, 0xBABA,
+ 0x6C4A, 0xE3E2,
+ 0x6C50, 0xCFAB,
+ 0x6C54, 0xE3E0,
+ 0x6C55, 0xC9C7,
+ 0x6C57, 0xBAB9,
+ 0x6C5B, 0xD1B4,
+ 0x6C5C, 0xE3E1,
+ 0x6C5D, 0xC8EA,
+ 0x6C5E, 0xB9AF,
+ 0x6C5F, 0xBDAD,
+ 0x6C60, 0xB3D8,
+ 0x6C61, 0xCEDB,
+ 0x6C64, 0xCCC0,
+ 0x6C68, 0xE3E8,
+ 0x6C69, 0xE3E9,
+ 0x6C6A, 0xCDF4,
+ 0x6C70, 0xCCAD,
+ 0x6C72, 0xBCB3,
+ 0x6C74, 0xE3EA,
+ 0x6C76, 0xE3EB,
+ 0x6C79, 0xD0DA,
+ 0x6C7D, 0xC6FB,
+ 0x6C7E, 0xB7DA,
+ 0x6C81, 0xC7DF,
+ 0x6C82, 0xD2CA,
+ 0x6C83, 0xCED6,
+ 0x6C85, 0xE3E4,
+ 0x6C86, 0xE3EC,
+ 0x6C88, 0xC9F2,
+ 0x6C89, 0xB3C1,
+ 0x6C8C, 0xE3E7,
+ 0x6C8F, 0xC6E3,
+ 0x6C90, 0xE3E5,
+ 0x6C93, 0xEDB3,
+ 0x6C94, 0xE3E6,
+ 0x6C99, 0xC9B3,
+ 0x6C9B, 0xC5E6,
+ 0x6C9F, 0xB9B5,
+ 0x6CA1, 0xC3BB,
+ 0x6CA3, 0xE3E3,
+ 0x6CA4, 0xC5BD,
+ 0x6CA5, 0xC1A4,
+ 0x6CA6, 0xC2D9,
+ 0x6CA7, 0xB2D7,
+ 0x6CA9, 0xE3ED,
+ 0x6CAA, 0xBBA6,
+ 0x6CAB, 0xC4AD,
+ 0x6CAD, 0xE3F0,
+ 0x6CAE, 0xBEDA,
+ 0x6CB1, 0xE3FB,
+ 0x6CB2, 0xE3F5,
+ 0x6CB3, 0xBAD3,
+ 0x6CB8, 0xB7D0,
+ 0x6CB9, 0xD3CD,
+ 0x6CBB, 0xD6CE,
+ 0x6CBC, 0xD5D3,
+ 0x6CBD, 0xB9C1,
+ 0x6CBE, 0xD5B4,
+ 0x6CBF, 0xD1D8,
+ 0x6CC4, 0xD0B9,
+ 0x6CC5, 0xC7F6,
+ 0x6CC9, 0xC8AA,
+ 0x6CCA, 0xB2B4,
+ 0x6CCC, 0xC3DA,
+ 0x6CD0, 0xE3EE,
+ 0x6CD3, 0xE3FC,
+ 0x6CD4, 0xE3EF,
+ 0x6CD5, 0xB7A8,
+ 0x6CD6, 0xE3F7,
+ 0x6CD7, 0xE3F4,
+ 0x6CDB, 0xB7BA,
+ 0x6CDE, 0xC5A2,
+ 0x6CE0, 0xE3F6,
+ 0x6CE1, 0xC5DD,
+ 0x6CE2, 0xB2A8,
+ 0x6CE3, 0xC6FC,
+ 0x6CE5, 0xC4E0,
+ 0x6CE8, 0xD7A2,
+ 0x6CEA, 0xC0E1,
+ 0x6CEB, 0xE3F9,
+ 0x6CEE, 0xE3FA,
+ 0x6CEF, 0xE3FD,
+ 0x6CF0, 0xCCA9,
+ 0x6CF1, 0xE3F3,
+ 0x6CF3, 0xD3BE,
+ 0x6CF5, 0xB1C3,
+ 0x6CF6, 0xEDB4,
+ 0x6CF7, 0xE3F1,
+ 0x6CF8, 0xE3F2,
+ 0x6CFA, 0xE3F8,
+ 0x6CFB, 0xD0BA,
+ 0x6CFC, 0xC6C3,
+ 0x6CFD, 0xD4F3,
+ 0x6CFE, 0xE3FE,
+ 0x6D01, 0xBDE0,
+ 0x6D04, 0xE4A7,
+ 0x6D07, 0xE4A6,
+ 0x6D0B, 0xD1F3,
+ 0x6D0C, 0xE4A3,
+ 0x6D0E, 0xE4A9,
+ 0x6D12, 0xC8F7,
+ 0x6D17, 0xCFB4,
+ 0x6D19, 0xE4A8,
+ 0x6D1A, 0xE4AE,
+ 0x6D1B, 0xC2E5,
+ 0x6D1E, 0xB6B4,
+ 0x6D25, 0xBDF2,
+ 0x6D27, 0xE4A2,
+ 0x6D2A, 0xBAE9,
+ 0x6D2B, 0xE4AA,
+ 0x6D2E, 0xE4AC,
+ 0x6D31, 0xB6FD,
+ 0x6D32, 0xD6DE,
+ 0x6D33, 0xE4B2,
+ 0x6D35, 0xE4AD,
+ 0x6D39, 0xE4A1,
+ 0x6D3B, 0xBBEE,
+ 0x6D3C, 0xCDDD,
+ 0x6D3D, 0xC7A2,
+ 0x6D3E, 0xC5C9,
+ 0x6D41, 0xC1F7,
+ 0x6D43, 0xE4A4,
+ 0x6D45, 0xC7B3,
+ 0x6D46, 0xBDAC,
+ 0x6D47, 0xBDBD,
+ 0x6D48, 0xE4A5,
+ 0x6D4A, 0xD7C7,
+ 0x6D4B, 0xB2E2,
+ 0x6D4D, 0xE4AB,
+ 0x6D4E, 0xBCC3,
+ 0x6D4F, 0xE4AF,
+ 0x6D51, 0xBBEB,
+ 0x6D52, 0xE4B0,
+ 0x6D53, 0xC5A8,
+ 0x6D54, 0xE4B1,
+ 0x6D59, 0xD5E3,
+ 0x6D5A, 0xBFA3,
+ 0x6D5C, 0xE4BA,
+ 0x6D5E, 0xE4B7,
+ 0x6D60, 0xE4BB,
+ 0x6D63, 0xE4BD,
+ 0x6D66, 0xC6D6,
+ 0x6D69, 0xBAC6,
+ 0x6D6A, 0xC0CB,
+ 0x6D6E, 0xB8A1,
+ 0x6D6F, 0xE4B4,
+ 0x6D74, 0xD4A1,
+ 0x6D77, 0xBAA3,
+ 0x6D78, 0xBDFE,
+ 0x6D7C, 0xE4BC,
+ 0x6D82, 0xCDBF,
+ 0x6D85, 0xC4F9,
+ 0x6D88, 0xCFFB,
+ 0x6D89, 0xC9E6,
+ 0x6D8C, 0xD3BF,
+ 0x6D8E, 0xCFD1,
+ 0x6D91, 0xE4B3,
+ 0x6D93, 0xE4B8,
+ 0x6D94, 0xE4B9,
+ 0x6D95, 0xCCE9,
+ 0x6D9B, 0xCCCE,
+ 0x6D9D, 0xC0D4,
+ 0x6D9E, 0xE4B5,
+ 0x6D9F, 0xC1B0,
+ 0x6DA0, 0xE4B6,
+ 0x6DA1, 0xCED0,
+ 0x6DA3, 0xBBC1,
+ 0x6DA4, 0xB5D3,
+ 0x6DA6, 0xC8F3,
+ 0x6DA7, 0xBDA7,
+ 0x6DA8, 0xD5C7,
+ 0x6DA9, 0xC9AC,
+ 0x6DAA, 0xB8A2,
+ 0x6DAB, 0xE4CA,
+ 0x6DAE, 0xE4CC,
+ 0x6DAF, 0xD1C4,
+ 0x6DB2, 0xD2BA,
+ 0x6DB5, 0xBAAD,
+ 0x6DB8, 0xBAD4,
+ 0x6DBF, 0xE4C3,
+ 0x6DC0, 0xB5ED,
+ 0x6DC4, 0xD7CD,
+ 0x6DC5, 0xE4C0,
+ 0x6DC6, 0xCFFD,
+ 0x6DC7, 0xE4BF,
+ 0x6DCB, 0xC1DC,
+ 0x6DCC, 0xCCCA,
+ 0x6DD1, 0xCAE7,
+ 0x6DD6, 0xC4D7,
+ 0x6DD8, 0xCCD4,
+ 0x6DD9, 0xE4C8,
+ 0x6DDD, 0xE4C7,
+ 0x6DDE, 0xE4C1,
+ 0x6DE0, 0xE4C4,
+ 0x6DE1, 0xB5AD,
+ 0x6DE4, 0xD3D9,
+ 0x6DE6, 0xE4C6,
+ 0x6DEB, 0xD2F9,
+ 0x6DEC, 0xB4E3,
+ 0x6DEE, 0xBBB4,
+ 0x6DF1, 0xC9EE,
+ 0x6DF3, 0xB4BE,
+ 0x6DF7, 0xBBEC,
+ 0x6DF9, 0xD1CD,
+ 0x6DFB, 0xCCED,
+ 0x6DFC, 0xEDB5,
+ 0x6E05, 0xC7E5,
+ 0x6E0A, 0xD4A8,
+ 0x6E0C, 0xE4CB,
+ 0x6E0D, 0xD7D5,
+ 0x6E0E, 0xE4C2,
+ 0x6E10, 0xBDA5,
+ 0x6E11, 0xE4C5,
+ 0x6E14, 0xD3E6,
+ 0x6E16, 0xE4C9,
+ 0x6E17, 0xC9F8,
+ 0x6E1A, 0xE4BE,
+ 0x6E1D, 0xD3E5,
+ 0x6E20, 0xC7FE,
+ 0x6E21, 0xB6C9,
+ 0x6E23, 0xD4FC,
+ 0x6E24, 0xB2B3,
+ 0x6E25, 0xE4D7,
+ 0x6E29, 0xCEC2,
+ 0x6E2B, 0xE4CD,
+ 0x6E2D, 0xCEBC,
+ 0x6E2F, 0xB8DB,
+ 0x6E32, 0xE4D6,
+ 0x6E34, 0xBFCA,
+ 0x6E38, 0xD3CE,
+ 0x6E3A, 0xC3EC,
+ 0x6E43, 0xC5C8,
+ 0x6E44, 0xE4D8,
+ 0x6E4D, 0xCDC4,
+ 0x6E4E, 0xE4CF,
+ 0x6E53, 0xE4D4,
+ 0x6E54, 0xE4D5,
+ 0x6E56, 0xBAFE,
+ 0x6E58, 0xCFE6,
+ 0x6E5B, 0xD5BF,
+ 0x6E5F, 0xE4D2,
+ 0x6E6B, 0xE4D0,
+ 0x6E6E, 0xE4CE,
+ 0x6E7E, 0xCDE5,
+ 0x6E7F, 0xCAAA,
+ 0x6E83, 0xC0A3,
+ 0x6E85, 0xBDA6,
+ 0x6E86, 0xE4D3,
+ 0x6E89, 0xB8C8,
+ 0x6E8F, 0xE4E7,
+ 0x6E90, 0xD4B4,
+ 0x6E98, 0xE4DB,
+ 0x6E9C, 0xC1EF,
+ 0x6E9F, 0xE4E9,
+ 0x6EA2, 0xD2E7,
+ 0x6EA5, 0xE4DF,
+ 0x6EA7, 0xE4E0,
+ 0x6EAA, 0xCFAA,
+ 0x6EAF, 0xCBDD,
+ 0x6EB1, 0xE4DA,
+ 0x6EB2, 0xE4D1,
+ 0x6EB4, 0xE4E5,
+ 0x6EB6, 0xC8DC,
+ 0x6EB7, 0xE4E3,
+ 0x6EBA, 0xC4E7,
+ 0x6EBB, 0xE4E2,
+ 0x6EBD, 0xE4E1,
+ 0x6EC1, 0xB3FC,
+ 0x6EC2, 0xE4E8,
+ 0x6EC7, 0xB5E1,
+ 0x6ECB, 0xD7CC,
+ 0x6ECF, 0xE4E6,
+ 0x6ED1, 0xBBAC,
+ 0x6ED3, 0xD7D2,
+ 0x6ED4, 0xCCCF,
+ 0x6ED5, 0xEBF8,
+ 0x6ED7, 0xE4E4,
+ 0x6EDA, 0xB9F6,
+ 0x6EDE, 0xD6CD,
+ 0x6EDF, 0xE4D9,
+ 0x6EE0, 0xE4DC,
+ 0x6EE1, 0xC2FA,
+ 0x6EE2, 0xE4DE,
+ 0x6EE4, 0xC2CB,
+ 0x6EE5, 0xC0C4,
+ 0x6EE6, 0xC2D0,
+ 0x6EE8, 0xB1F5,
+ 0x6EE9, 0xCCB2,
+ 0x6EF4, 0xB5CE,
+ 0x6EF9, 0xE4EF,
+ 0x6F02, 0xC6AF,
+ 0x6F06, 0xC6E1,
+ 0x6F09, 0xE4F5,
+ 0x6F0F, 0xC2A9,
+ 0x6F13, 0xC0EC,
+ 0x6F14, 0xD1DD,
+ 0x6F15, 0xE4EE,
+ 0x6F20, 0xC4AE,
+ 0x6F24, 0xE4ED,
+ 0x6F29, 0xE4F6,
+ 0x6F2A, 0xE4F4,
+ 0x6F2B, 0xC2FE,
+ 0x6F2D, 0xE4DD,
+ 0x6F2F, 0xE4F0,
+ 0x6F31, 0xCAFE,
+ 0x6F33, 0xD5C4,
+ 0x6F36, 0xE4F1,
+ 0x6F3E, 0xD1FA,
+ 0x6F46, 0xE4EB,
+ 0x6F47, 0xE4EC,
+ 0x6F4B, 0xE4F2,
+ 0x6F4D, 0xCEAB,
+ 0x6F58, 0xC5CB,
+ 0x6F5C, 0xC7B1,
+ 0x6F5E, 0xC2BA,
+ 0x6F62, 0xE4EA,
+ 0x6F66, 0xC1CA,
+ 0x6F6D, 0xCCB6,
+ 0x6F6E, 0xB3B1,
+ 0x6F72, 0xE4FB,
+ 0x6F74, 0xE4F3,
+ 0x6F78, 0xE4FA,
+ 0x6F7A, 0xE4FD,
+ 0x6F7C, 0xE4FC,
+ 0x6F84, 0xB3CE,
+ 0x6F88, 0xB3BA,
+ 0x6F89, 0xE4F7,
+ 0x6F8C, 0xE4F9,
+ 0x6F8D, 0xE4F8,
+ 0x6F8E, 0xC5EC,
+ 0x6F9C, 0xC0BD,
+ 0x6FA1, 0xD4E8,
+ 0x6FA7, 0xE5A2,
+ 0x6FB3, 0xB0C4,
+ 0x6FB6, 0xE5A4,
+ 0x6FB9, 0xE5A3,
+ 0x6FC0, 0xBCA4,
+ 0x6FC2, 0xE5A5,
+ 0x6FC9, 0xE5A1,
+ 0x6FD1, 0xE4FE,
+ 0x6FD2, 0xB1F4,
+ 0x6FDE, 0xE5A8,
+ 0x6FE0, 0xE5A9,
+ 0x6FE1, 0xE5A6,
+ 0x6FEE, 0xE5A7,
+ 0x6FEF, 0xE5AA,
+ 0x7011, 0xC6D9,
+ 0x701A, 0xE5AB,
+ 0x701B, 0xE5AD,
+ 0x7023, 0xE5AC,
+ 0x7035, 0xE5AF,
+ 0x7039, 0xE5AE,
+ 0x704C, 0xB9E0,
+ 0x704F, 0xE5B0,
+ 0x705E, 0xE5B1,
+ 0x706B, 0xBBF0,
+ 0x706C, 0xECE1,
+ 0x706D, 0xC3F0,
+ 0x706F, 0xB5C6,
+ 0x7070, 0xBBD2,
+ 0x7075, 0xC1E9,
+ 0x7076, 0xD4EE,
+ 0x7078, 0xBEC4,
+ 0x707C, 0xD7C6,
+ 0x707E, 0xD4D6,
+ 0x707F, 0xB2D3,
+ 0x7080, 0xECBE,
+ 0x7085, 0xEAC1,
+ 0x7089, 0xC2AF,
+ 0x708A, 0xB4B6,
+ 0x708E, 0xD1D7,
+ 0x7092, 0xB3B4,
+ 0x7094, 0xC8B2,
+ 0x7095, 0xBFBB,
+ 0x7096, 0xECC0,
+ 0x7099, 0xD6CB,
+ 0x709C, 0xECBF,
+ 0x709D, 0xECC1,
+ 0x70AB, 0xECC5,
+ 0x70AC, 0xBEE6,
+ 0x70AD, 0xCCBF,
+ 0x70AE, 0xC5DA,
+ 0x70AF, 0xBEBC,
+ 0x70B1, 0xECC6,
+ 0x70B3, 0xB1FE,
+ 0x70B7, 0xECC4,
+ 0x70B8, 0xD5A8,
+ 0x70B9, 0xB5E3,
+ 0x70BB, 0xECC2,
+ 0x70BC, 0xC1B6,
+ 0x70BD, 0xB3E3,
+ 0x70C0, 0xECC3,
+ 0x70C1, 0xCBB8,
+ 0x70C2, 0xC0C3,
+ 0x70C3, 0xCCFE,
+ 0x70C8, 0xC1D2,
+ 0x70CA, 0xECC8,
+ 0x70D8, 0xBAE6,
+ 0x70D9, 0xC0D3,
+ 0x70DB, 0xD6F2,
+ 0x70DF, 0xD1CC,
+ 0x70E4, 0xBFBE,
+ 0x70E6, 0xB7B3,
+ 0x70E7, 0xC9D5,
+ 0x70E8, 0xECC7,
+ 0x70E9, 0xBBE2,
+ 0x70EB, 0xCCCC,
+ 0x70EC, 0xBDFD,
+ 0x70ED, 0xC8C8,
+ 0x70EF, 0xCFA9,
+ 0x70F7, 0xCDE9,
+ 0x70F9, 0xC5EB,
+ 0x70FD, 0xB7E9,
+ 0x7109, 0xD1C9,
+ 0x710A, 0xBAB8,
+ 0x7110, 0xECC9,
+ 0x7113, 0xECCA,
+ 0x7115, 0xBBC0,
+ 0x7116, 0xECCB,
+ 0x7118, 0xECE2,
+ 0x7119, 0xB1BA,
+ 0x711A, 0xB7D9,
+ 0x7126, 0xBDB9,
+ 0x712F, 0xECCC,
+ 0x7130, 0xD1E6,
+ 0x7131, 0xECCD,
+ 0x7136, 0xC8BB,
+ 0x7145, 0xECD1,
+ 0x714A, 0xECD3,
+ 0x714C, 0xBBCD,
+ 0x714E, 0xBCE5,
+ 0x715C, 0xECCF,
+ 0x715E, 0xC9B7,
+ 0x7164, 0xC3BA,
+ 0x7166, 0xECE3,
+ 0x7167, 0xD5D5,
+ 0x7168, 0xECD0,
+ 0x716E, 0xD6F3,
+ 0x7172, 0xECD2,
+ 0x7173, 0xECCE,
+ 0x7178, 0xECD4,
+ 0x717A, 0xECD5,
+ 0x717D, 0xC9BF,
+ 0x7184, 0xCFA8,
+ 0x718A, 0xD0DC,
+ 0x718F, 0xD1AC,
+ 0x7194, 0xC8DB,
+ 0x7198, 0xECD6,
+ 0x7199, 0xCEF5,
+ 0x719F, 0xCAEC,
+ 0x71A0, 0xECDA,
+ 0x71A8, 0xECD9,
+ 0x71AC, 0xB0BE,
+ 0x71B3, 0xECD7,
+ 0x71B5, 0xECD8,
+ 0x71B9, 0xECE4,
+ 0x71C3, 0xC8BC,
+ 0x71CE, 0xC1C7,
+ 0x71D4, 0xECDC,
+ 0x71D5, 0xD1E0,
+ 0x71E0, 0xECDB,
+ 0x71E5, 0xD4EF,
+ 0x71E7, 0xECDD,
+ 0x71EE, 0xDBC6,
+ 0x71F9, 0xECDE,
+ 0x7206, 0xB1AC,
+ 0x721D, 0xECDF,
+ 0x7228, 0xECE0,
+ 0x722A, 0xD7A6,
+ 0x722C, 0xC5C0,
+ 0x7230, 0xEBBC,
+ 0x7231, 0xB0AE,
+ 0x7235, 0xBEF4,
+ 0x7236, 0xB8B8,
+ 0x7237, 0xD2AF,
+ 0x7238, 0xB0D6,
+ 0x7239, 0xB5F9,
+ 0x723B, 0xD8B3,
+ 0x723D, 0xCBAC,
+ 0x723F, 0xE3DD,
+ 0x7247, 0xC6AC,
+ 0x7248, 0xB0E6,
+ 0x724C, 0xC5C6,
+ 0x724D, 0xEBB9,
+ 0x7252, 0xEBBA,
+ 0x7256, 0xEBBB,
+ 0x7259, 0xD1C0,
+ 0x725B, 0xC5A3,
+ 0x725D, 0xEAF2,
+ 0x725F, 0xC4B2,
+ 0x7261, 0xC4B5,
+ 0x7262, 0xC0CE,
+ 0x7266, 0xEAF3,
+ 0x7267, 0xC4C1,
+ 0x7269, 0xCEEF,
+ 0x726E, 0xEAF0,
+ 0x726F, 0xEAF4,
+ 0x7272, 0xC9FC,
+ 0x7275, 0xC7A3,
+ 0x7279, 0xCCD8,
+ 0x727A, 0xCEFE,
+ 0x727E, 0xEAF5,
+ 0x727F, 0xEAF6,
+ 0x7280, 0xCFAC,
+ 0x7281, 0xC0E7,
+ 0x7284, 0xEAF7,
+ 0x728A, 0xB6BF,
+ 0x728B, 0xEAF8,
+ 0x728D, 0xEAF9,
+ 0x728F, 0xEAFA,
+ 0x7292, 0xEAFB,
+ 0x729F, 0xEAF1,
+ 0x72AC, 0xC8AE,
+ 0x72AD, 0xE1EB,
+ 0x72AF, 0xB7B8,
+ 0x72B0, 0xE1EC,
+ 0x72B4, 0xE1ED,
+ 0x72B6, 0xD7B4,
+ 0x72B7, 0xE1EE,
+ 0x72B8, 0xE1EF,
+ 0x72B9, 0xD3CC,
+ 0x72C1, 0xE1F1,
+ 0x72C2, 0xBFF1,
+ 0x72C3, 0xE1F0,
+ 0x72C4, 0xB5D2,
+ 0x72C8, 0xB1B7,
+ 0x72CD, 0xE1F3,
+ 0x72CE, 0xE1F2,
+ 0x72D0, 0xBAFC,
+ 0x72D2, 0xE1F4,
+ 0x72D7, 0xB9B7,
+ 0x72D9, 0xBED1,
+ 0x72DE, 0xC4FC,
+ 0x72E0, 0xBADD,
+ 0x72E1, 0xBDC6,
+ 0x72E8, 0xE1F5,
+ 0x72E9, 0xE1F7,
+ 0x72EC, 0xB6C0,
+ 0x72ED, 0xCFC1,
+ 0x72EE, 0xCAA8,
+ 0x72EF, 0xE1F6,
+ 0x72F0, 0xD5F8,
+ 0x72F1, 0xD3FC,
+ 0x72F2, 0xE1F8,
+ 0x72F3, 0xE1FC,
+ 0x72F4, 0xE1F9,
+ 0x72F7, 0xE1FA,
+ 0x72F8, 0xC0EA,
+ 0x72FA, 0xE1FE,
+ 0x72FB, 0xE2A1,
+ 0x72FC, 0xC0C7,
+ 0x7301, 0xE1FB,
+ 0x7303, 0xE1FD,
+ 0x730A, 0xE2A5,
+ 0x730E, 0xC1D4,
+ 0x7313, 0xE2A3,
+ 0x7315, 0xE2A8,
+ 0x7316, 0xB2FE,
+ 0x7317, 0xE2A2,
+ 0x731B, 0xC3CD,
+ 0x731C, 0xB2C2,
+ 0x731D, 0xE2A7,
+ 0x731E, 0xE2A6,
+ 0x7321, 0xE2A4,
+ 0x7322, 0xE2A9,
+ 0x7325, 0xE2AB,
+ 0x7329, 0xD0C9,
+ 0x732A, 0xD6ED,
+ 0x732B, 0xC3A8,
+ 0x732C, 0xE2AC,
+ 0x732E, 0xCFD7,
+ 0x7331, 0xE2AE,
+ 0x7334, 0xBAEF,
+ 0x7337, 0xE9E0,
+ 0x7338, 0xE2AD,
+ 0x7339, 0xE2AA,
+ 0x733E, 0xBBAB,
+ 0x733F, 0xD4B3,
+ 0x734D, 0xE2B0,
+ 0x7350, 0xE2AF,
+ 0x7352, 0xE9E1,
+ 0x7357, 0xE2B1,
+ 0x7360, 0xE2B2,
+ 0x736C, 0xE2B3,
+ 0x736D, 0xCCA1,
+ 0x736F, 0xE2B4,
+ 0x737E, 0xE2B5,
+ 0x7384, 0xD0FE,
+ 0x7387, 0xC2CA,
+ 0x7389, 0xD3F1,
+ 0x738B, 0xCDF5,
+ 0x738E, 0xE7E0,
+ 0x7391, 0xE7E1,
+ 0x7396, 0xBEC1,
+ 0x739B, 0xC2EA,
+ 0x739F, 0xE7E4,
+ 0x73A2, 0xE7E3,
+ 0x73A9, 0xCDE6,
+ 0x73AB, 0xC3B5,
+ 0x73AE, 0xE7E2,
+ 0x73AF, 0xBBB7,
+ 0x73B0, 0xCFD6,
+ 0x73B2, 0xC1E1,
+ 0x73B3, 0xE7E9,
+ 0x73B7, 0xE7E8,
+ 0x73BA, 0xE7F4,
+ 0x73BB, 0xB2A3,
+ 0x73C0, 0xE7EA,
+ 0x73C2, 0xE7E6,
+ 0x73C8, 0xE7EC,
+ 0x73C9, 0xE7EB,
+ 0x73CA, 0xC9BA,
+ 0x73CD, 0xD5E4,
+ 0x73CF, 0xE7E5,
+ 0x73D0, 0xB7A9,
+ 0x73D1, 0xE7E7,
+ 0x73D9, 0xE7EE,
+ 0x73DE, 0xE7F3,
+ 0x73E0, 0xD6E9,
+ 0x73E5, 0xE7ED,
+ 0x73E7, 0xE7F2,
+ 0x73E9, 0xE7F1,
+ 0x73ED, 0xB0E0,
+ 0x73F2, 0xE7F5,
+ 0x7403, 0xC7F2,
+ 0x7405, 0xC0C5,
+ 0x7406, 0xC0ED,
+ 0x7409, 0xC1F0,
+ 0x740A, 0xE7F0,
+ 0x740F, 0xE7F6,
+ 0x7410, 0xCBF6,
+ 0x741A, 0xE8A2,
+ 0x741B, 0xE8A1,
+ 0x7422, 0xD7C1,
+ 0x7425, 0xE7FA,
+ 0x7426, 0xE7F9,
+ 0x7428, 0xE7FB,
+ 0x742A, 0xE7F7,
+ 0x742C, 0xE7FE,
+ 0x742E, 0xE7FD,
+ 0x7430, 0xE7FC,
+ 0x7433, 0xC1D5,
+ 0x7434, 0xC7D9,
+ 0x7435, 0xC5FD,
+ 0x7436, 0xC5C3,
+ 0x743C, 0xC7ED,
+ 0x7441, 0xE8A3,
+ 0x7455, 0xE8A6,
+ 0x7457, 0xE8A5,
+ 0x7459, 0xE8A7,
+ 0x745A, 0xBAF7,
+ 0x745B, 0xE7F8,
+ 0x745C, 0xE8A4,
+ 0x745E, 0xC8F0,
+ 0x745F, 0xC9AA,
+ 0x746D, 0xE8A9,
+ 0x7470, 0xB9E5,
+ 0x7476, 0xD1FE,
+ 0x7477, 0xE8A8,
+ 0x747E, 0xE8AA,
+ 0x7480, 0xE8AD,
+ 0x7481, 0xE8AE,
+ 0x7483, 0xC1A7,
+ 0x7487, 0xE8AF,
+ 0x748B, 0xE8B0,
+ 0x748E, 0xE8AC,
+ 0x7490, 0xE8B4,
+ 0x749C, 0xE8AB,
+ 0x749E, 0xE8B1,
+ 0x74A7, 0xE8B5,
+ 0x74A8, 0xE8B2,
+ 0x74A9, 0xE8B3,
+ 0x74BA, 0xE8B7,
+ 0x74D2, 0xE8B6,
+ 0x74DC, 0xB9CF,
+ 0x74DE, 0xF0AC,
+ 0x74E0, 0xF0AD,
+ 0x74E2, 0xC6B0,
+ 0x74E3, 0xB0EA,
+ 0x74E4, 0xC8BF,
+ 0x74E6, 0xCDDF,
+ 0x74EE, 0xCECD,
+ 0x74EF, 0xEAB1,
+ 0x74F4, 0xEAB2,
+ 0x74F6, 0xC6BF,
+ 0x74F7, 0xB4C9,
+ 0x74FF, 0xEAB3,
+ 0x7504, 0xD5E7,
+ 0x750D, 0xDDF9,
+ 0x750F, 0xEAB4,
+ 0x7511, 0xEAB5,
+ 0x7513, 0xEAB6,
+ 0x7518, 0xB8CA,
+ 0x7519, 0xDFB0,
+ 0x751A, 0xC9F5,
+ 0x751C, 0xCCF0,
+ 0x751F, 0xC9FA,
+ 0x7525, 0xC9FB,
+ 0x7528, 0xD3C3,
+ 0x7529, 0xCBA6,
+ 0x752B, 0xB8A6,
+ 0x752C, 0xF0AE,
+ 0x752D, 0xB1C2,
+ 0x752F, 0xE5B8,
+ 0x7530, 0xCCEF,
+ 0x7531, 0xD3C9,
+ 0x7532, 0xBCD7,
+ 0x7533, 0xC9EA,
+ 0x7535, 0xB5E7,
+ 0x7537, 0xC4D0,
+ 0x7538, 0xB5E9,
+ 0x753A, 0xEEAE,
+ 0x753B, 0xBBAD,
+ 0x753E, 0xE7DE,
+ 0x7540, 0xEEAF,
+ 0x7545, 0xB3A9,
+ 0x7548, 0xEEB2,
+ 0x754B, 0xEEB1,
+ 0x754C, 0xBDE7,
+ 0x754E, 0xEEB0,
+ 0x754F, 0xCEB7,
+ 0x7554, 0xC5CF,
+ 0x7559, 0xC1F4,
+ 0x755A, 0xDBCE,
+ 0x755B, 0xEEB3,
+ 0x755C, 0xD0F3,
+ 0x7565, 0xC2D4,
+ 0x7566, 0xC6E8,
+ 0x756A, 0xB7AC,
+ 0x7572, 0xEEB4,
+ 0x7574, 0xB3EB,
+ 0x7578, 0xBBFB,
+ 0x7579, 0xEEB5,
+ 0x757F, 0xE7DC,
+ 0x7583, 0xEEB6,
+ 0x7586, 0xBDAE,
+ 0x758B, 0xF1E2,
+ 0x758F, 0xCAE8,
+ 0x7591, 0xD2C9,
+ 0x7592, 0xF0DA,
+ 0x7594, 0xF0DB,
+ 0x7596, 0xF0DC,
+ 0x7597, 0xC1C6,
+ 0x7599, 0xB8ED,
+ 0x759A, 0xBECE,
+ 0x759D, 0xF0DE,
+ 0x759F, 0xC5B1,
+ 0x75A0, 0xF0DD,
+ 0x75A1, 0xD1F1,
+ 0x75A3, 0xF0E0,
+ 0x75A4, 0xB0CC,
+ 0x75A5, 0xBDEA,
+ 0x75AB, 0xD2DF,
+ 0x75AC, 0xF0DF,
+ 0x75AE, 0xB4AF,
+ 0x75AF, 0xB7E8,
+ 0x75B0, 0xF0E6,
+ 0x75B1, 0xF0E5,
+ 0x75B2, 0xC6A3,
+ 0x75B3, 0xF0E1,
+ 0x75B4, 0xF0E2,
+ 0x75B5, 0xB4C3,
+ 0x75B8, 0xF0E3,
+ 0x75B9, 0xD5EE,
+ 0x75BC, 0xCCDB,
+ 0x75BD, 0xBED2,
+ 0x75BE, 0xBCB2,
+ 0x75C2, 0xF0E8,
+ 0x75C3, 0xF0E7,
+ 0x75C4, 0xF0E4,
+ 0x75C5, 0xB2A1,
+ 0x75C7, 0xD6A2,
+ 0x75C8, 0xD3B8,
+ 0x75C9, 0xBEB7,
+ 0x75CA, 0xC8AC,
+ 0x75CD, 0xF0EA,
+ 0x75D2, 0xD1F7,
+ 0x75D4, 0xD6CC,
+ 0x75D5, 0xBADB,
+ 0x75D6, 0xF0E9,
+ 0x75D8, 0xB6BB,
+ 0x75DB, 0xCDB4,
+ 0x75DE, 0xC6A6,
+ 0x75E2, 0xC1A1,
+ 0x75E3, 0xF0EB,
+ 0x75E4, 0xF0EE,
+ 0x75E6, 0xF0ED,
+ 0x75E7, 0xF0F0,
+ 0x75E8, 0xF0EC,
+ 0x75EA, 0xBBBE,
+ 0x75EB, 0xF0EF,
+ 0x75F0, 0xCCB5,
+ 0x75F1, 0xF0F2,
+ 0x75F4, 0xB3D5,
+ 0x75F9, 0xB1D4,
+ 0x75FC, 0xF0F3,
+ 0x75FF, 0xF0F4,
+ 0x7600, 0xF0F6,
+ 0x7601, 0xB4E1,
+ 0x7603, 0xF0F1,
+ 0x7605, 0xF0F7,
+ 0x760A, 0xF0FA,
+ 0x760C, 0xF0F8,
+ 0x7610, 0xF0F5,
+ 0x7615, 0xF0FD,
+ 0x7617, 0xF0F9,
+ 0x7618, 0xF0FC,
+ 0x7619, 0xF0FE,
+ 0x761B, 0xF1A1,
+ 0x761F, 0xCEC1,
+ 0x7620, 0xF1A4,
+ 0x7622, 0xF1A3,
+ 0x7624, 0xC1F6,
+ 0x7625, 0xF0FB,
+ 0x7626, 0xCADD,
+ 0x7629, 0xB4F1,
+ 0x762A, 0xB1F1,
+ 0x762B, 0xCCB1,
+ 0x762D, 0xF1A6,
+ 0x7630, 0xF1A7,
+ 0x7633, 0xF1AC,
+ 0x7634, 0xD5CE,
+ 0x7635, 0xF1A9,
+ 0x7638, 0xC8B3,
+ 0x763C, 0xF1A2,
+ 0x763E, 0xF1AB,
+ 0x763F, 0xF1A8,
+ 0x7640, 0xF1A5,
+ 0x7643, 0xF1AA,
+ 0x764C, 0xB0A9,
+ 0x764D, 0xF1AD,
+ 0x7654, 0xF1AF,
+ 0x7656, 0xF1B1,
+ 0x765C, 0xF1B0,
+ 0x765E, 0xF1AE,
+ 0x7663, 0xD1A2,
+ 0x766B, 0xF1B2,
+ 0x766F, 0xF1B3,
+ 0x7678, 0xB9EF,
+ 0x767B, 0xB5C7,
+ 0x767D, 0xB0D7,
+ 0x767E, 0xB0D9,
+ 0x7682, 0xD4ED,
+ 0x7684, 0xB5C4,
+ 0x7686, 0xBDD4,
+ 0x7687, 0xBBCA,
+ 0x7688, 0xF0A7,
+ 0x768B, 0xB8DE,
+ 0x768E, 0xF0A8,
+ 0x7691, 0xB0A8,
+ 0x7693, 0xF0A9,
+ 0x7696, 0xCDEE,
+ 0x7699, 0xF0AA,
+ 0x76A4, 0xF0AB,
+ 0x76AE, 0xC6A4,
+ 0x76B1, 0xD6E5,
+ 0x76B2, 0xF1E4,
+ 0x76B4, 0xF1E5,
+ 0x76BF, 0xC3F3,
+ 0x76C2, 0xD3DB,
+ 0x76C5, 0xD6D1,
+ 0x76C6, 0xC5E8,
+ 0x76C8, 0xD3AF,
+ 0x76CA, 0xD2E6,
+ 0x76CD, 0xEEC1,
+ 0x76CE, 0xB0BB,
+ 0x76CF, 0xD5B5,
+ 0x76D0, 0xD1CE,
+ 0x76D1, 0xBCE0,
+ 0x76D2, 0xBAD0,
+ 0x76D4, 0xBFF8,
+ 0x76D6, 0xB8C7,
+ 0x76D7, 0xB5C1,
+ 0x76D8, 0xC5CC,
+ 0x76DB, 0xCAA2,
+ 0x76DF, 0xC3CB,
+ 0x76E5, 0xEEC2,
+ 0x76EE, 0xC4BF,
+ 0x76EF, 0xB6A2,
+ 0x76F1, 0xEDEC,
+ 0x76F2, 0xC3A4,
+ 0x76F4, 0xD6B1,
+ 0x76F8, 0xCFE0,
+ 0x76F9, 0xEDEF,
+ 0x76FC, 0xC5CE,
+ 0x76FE, 0xB6DC,
+ 0x7701, 0xCAA1,
+ 0x7704, 0xEDED,
+ 0x7707, 0xEDF0,
+ 0x7708, 0xEDF1,
+ 0x7709, 0xC3BC,
+ 0x770B, 0xBFB4,
+ 0x770D, 0xEDEE,
+ 0x7719, 0xEDF4,
+ 0x771A, 0xEDF2,
+ 0x771F, 0xD5E6,
+ 0x7720, 0xC3DF,
+ 0x7722, 0xEDF3,
+ 0x7726, 0xEDF6,
+ 0x7728, 0xD5A3,
+ 0x7729, 0xD1A3,
+ 0x772D, 0xEDF5,
+ 0x772F, 0xC3D0,
+ 0x7735, 0xEDF7,
+ 0x7736, 0xBFF4,
+ 0x7737, 0xBEEC,
+ 0x7738, 0xEDF8,
+ 0x773A, 0xCCF7,
+ 0x773C, 0xD1DB,
+ 0x7740, 0xD7C5,
+ 0x7741, 0xD5F6,
+ 0x7743, 0xEDFC,
+ 0x7747, 0xEDFB,
+ 0x7750, 0xEDF9,
+ 0x7751, 0xEDFA,
+ 0x775A, 0xEDFD,
+ 0x775B, 0xBEA6,
+ 0x7761, 0xCBAF,
+ 0x7762, 0xEEA1,
+ 0x7763, 0xB6BD,
+ 0x7765, 0xEEA2,
+ 0x7766, 0xC4C0,
+ 0x7768, 0xEDFE,
+ 0x776B, 0xBDDE,
+ 0x776C, 0xB2C7,
+ 0x7779, 0xB6C3,
+ 0x777D, 0xEEA5,
+ 0x777E, 0xD8BA,
+ 0x777F, 0xEEA3,
+ 0x7780, 0xEEA6,
+ 0x7784, 0xC3E9,
+ 0x7785, 0xB3F2,
+ 0x778C, 0xEEA7,
+ 0x778D, 0xEEA4,
+ 0x778E, 0xCFB9,
+ 0x7791, 0xEEA8,
+ 0x7792, 0xC2F7,
+ 0x779F, 0xEEA9,
+ 0x77A0, 0xEEAA,
+ 0x77A2, 0xDEAB,
+ 0x77A5, 0xC6B3,
+ 0x77A7, 0xC7C6,
+ 0x77A9, 0xD6F5,
+ 0x77AA, 0xB5C9,
+ 0x77AC, 0xCBB2,
+ 0x77B0, 0xEEAB,
+ 0x77B3, 0xCDAB,
+ 0x77B5, 0xEEAC,
+ 0x77BB, 0xD5B0,
+ 0x77BD, 0xEEAD,
+ 0x77BF, 0xF6C4,
+ 0x77CD, 0xDBC7,
+ 0x77D7, 0xB4A3,
+ 0x77DB, 0xC3AC,
+ 0x77DC, 0xF1E6,
+ 0x77E2, 0xCAB8,
+ 0x77E3, 0xD2D3,
+ 0x77E5, 0xD6AA,
+ 0x77E7, 0xEFF2,
+ 0x77E9, 0xBED8,
+ 0x77EB, 0xBDC3,
+ 0x77EC, 0xEFF3,
+ 0x77ED, 0xB6CC,
+ 0x77EE, 0xB0AB,
+ 0x77F3, 0xCAAF,
+ 0x77F6, 0xEDB6,
+ 0x77F8, 0xEDB7,
+ 0x77FD, 0xCEF9,
+ 0x77FE, 0xB7AF,
+ 0x77FF, 0xBFF3,
+ 0x7800, 0xEDB8,
+ 0x7801, 0xC2EB,
+ 0x7802, 0xC9B0,
+ 0x7809, 0xEDB9,
+ 0x780C, 0xC6F6,
+ 0x780D, 0xBFB3,
+ 0x7811, 0xEDBC,
+ 0x7812, 0xC5F8,
+ 0x7814, 0xD1D0,
+ 0x7816, 0xD7A9,
+ 0x7817, 0xEDBA,
+ 0x7818, 0xEDBB,
+ 0x781A, 0xD1E2,
+ 0x781C, 0xEDBF,
+ 0x781D, 0xEDC0,
+ 0x781F, 0xEDC4,
+ 0x7823, 0xEDC8,
+ 0x7825, 0xEDC6,
+ 0x7826, 0xEDCE,
+ 0x7827, 0xD5E8,
+ 0x7829, 0xEDC9,
+ 0x782C, 0xEDC7,
+ 0x782D, 0xEDBE,
+ 0x7830, 0xC5E9,
+ 0x7834, 0xC6C6,
+ 0x7837, 0xC9E9,
+ 0x7838, 0xD4D2,
+ 0x7839, 0xEDC1,
+ 0x783A, 0xEDC2,
+ 0x783B, 0xEDC3,
+ 0x783C, 0xEDC5,
+ 0x783E, 0xC0F9,
+ 0x7840, 0xB4A1,
+ 0x7845, 0xB9E8,
+ 0x7847, 0xEDD0,
+ 0x784C, 0xEDD1,
+ 0x784E, 0xEDCA,
+ 0x7850, 0xEDCF,
+ 0x7852, 0xCEF8,
+ 0x7855, 0xCBB6,
+ 0x7856, 0xEDCC,
+ 0x7857, 0xEDCD,
+ 0x785D, 0xCFF5,
+ 0x786A, 0xEDD2,
+ 0x786B, 0xC1F2,
+ 0x786C, 0xD3B2,
+ 0x786D, 0xEDCB,
+ 0x786E, 0xC8B7,
+ 0x7877, 0xBCEF,
+ 0x787C, 0xC5F0,
+ 0x7887, 0xEDD6,
+ 0x7889, 0xB5EF,
+ 0x788C, 0xC2B5,
+ 0x788D, 0xB0AD,
+ 0x788E, 0xCBE9,
+ 0x7891, 0xB1AE,
+ 0x7893, 0xEDD4,
+ 0x7897, 0xCDEB,
+ 0x7898, 0xB5E2,
+ 0x789A, 0xEDD5,
+ 0x789B, 0xEDD3,
+ 0x789C, 0xEDD7,
+ 0x789F, 0xB5FA,
+ 0x78A1, 0xEDD8,
+ 0x78A3, 0xEDD9,
+ 0x78A5, 0xEDDC,
+ 0x78A7, 0xB1CC,
+ 0x78B0, 0xC5F6,
+ 0x78B1, 0xBCEE,
+ 0x78B2, 0xEDDA,
+ 0x78B3, 0xCCBC,
+ 0x78B4, 0xB2EA,
+ 0x78B9, 0xEDDB,
+ 0x78BE, 0xC4EB,
+ 0x78C1, 0xB4C5,
+ 0x78C5, 0xB0F5,
+ 0x78C9, 0xEDDF,
+ 0x78CA, 0xC0DA,
+ 0x78CB, 0xB4E8,
+ 0x78D0, 0xC5CD,
+ 0x78D4, 0xEDDD,
+ 0x78D5, 0xBFC4,
+ 0x78D9, 0xEDDE,
+ 0x78E8, 0xC4A5,
+ 0x78EC, 0xEDE0,
+ 0x78F2, 0xEDE1,
+ 0x78F4, 0xEDE3,
+ 0x78F7, 0xC1D7,
+ 0x78FA, 0xBBC7,
+ 0x7901, 0xBDB8,
+ 0x7905, 0xEDE2,
+ 0x7913, 0xEDE4,
+ 0x791E, 0xEDE6,
+ 0x7924, 0xEDE5,
+ 0x7934, 0xEDE7,
+ 0x793A, 0xCABE,
+ 0x793B, 0xECEA,
+ 0x793C, 0xC0F1,
+ 0x793E, 0xC9E7,
+ 0x7940, 0xECEB,
+ 0x7941, 0xC6EE,
+ 0x7946, 0xECEC,
+ 0x7948, 0xC6ED,
+ 0x7949, 0xECED,
+ 0x7953, 0xECF0,
+ 0x7956, 0xD7E6,
+ 0x7957, 0xECF3,
+ 0x795A, 0xECF1,
+ 0x795B, 0xECEE,
+ 0x795C, 0xECEF,
+ 0x795D, 0xD7A3,
+ 0x795E, 0xC9F1,
+ 0x795F, 0xCBEE,
+ 0x7960, 0xECF4,
+ 0x7962, 0xECF2,
+ 0x7965, 0xCFE9,
+ 0x7967, 0xECF6,
+ 0x7968, 0xC6B1,
+ 0x796D, 0xBCC0,
+ 0x796F, 0xECF5,
+ 0x7977, 0xB5BB,
+ 0x7978, 0xBBF6,
+ 0x797A, 0xECF7,
+ 0x7980, 0xD9F7,
+ 0x7981, 0xBDFB,
+ 0x7984, 0xC2BB,
+ 0x7985, 0xECF8,
+ 0x798A, 0xECF9,
+ 0x798F, 0xB8A3,
+ 0x799A, 0xECFA,
+ 0x79A7, 0xECFB,
+ 0x79B3, 0xECFC,
+ 0x79B9, 0xD3ED,
+ 0x79BA, 0xD8AE,
+ 0x79BB, 0xC0EB,
+ 0x79BD, 0xC7DD,
+ 0x79BE, 0xBACC,
+ 0x79C0, 0xD0E3,
+ 0x79C1, 0xCBBD,
+ 0x79C3, 0xCDBA,
+ 0x79C6, 0xB8D1,
+ 0x79C9, 0xB1FC,
+ 0x79CB, 0xC7EF,
+ 0x79CD, 0xD6D6,
+ 0x79D1, 0xBFC6,
+ 0x79D2, 0xC3EB,
+ 0x79D5, 0xEFF5,
+ 0x79D8, 0xC3D8,
+ 0x79DF, 0xD7E2,
+ 0x79E3, 0xEFF7,
+ 0x79E4, 0xB3D3,
+ 0x79E6, 0xC7D8,
+ 0x79E7, 0xD1ED,
+ 0x79E9, 0xD6C8,
+ 0x79EB, 0xEFF8,
+ 0x79ED, 0xEFF6,
+ 0x79EF, 0xBBFD,
+ 0x79F0, 0xB3C6,
+ 0x79F8, 0xBDD5,
+ 0x79FB, 0xD2C6,
+ 0x79FD, 0xBBE0,
+ 0x7A00, 0xCFA1,
+ 0x7A02, 0xEFFC,
+ 0x7A03, 0xEFFB,
+ 0x7A06, 0xEFF9,
+ 0x7A0B, 0xB3CC,
+ 0x7A0D, 0xC9D4,
+ 0x7A0E, 0xCBB0,
+ 0x7A14, 0xEFFE,
+ 0x7A17, 0xB0DE,
+ 0x7A1A, 0xD6C9,
+ 0x7A1E, 0xEFFD,
+ 0x7A20, 0xB3ED,
+ 0x7A23, 0xF6D5,
+ 0x7A33, 0xCEC8,
+ 0x7A37, 0xF0A2,
+ 0x7A39, 0xF0A1,
+ 0x7A3B, 0xB5BE,
+ 0x7A3C, 0xBCDA,
+ 0x7A3D, 0xBBFC,
+ 0x7A3F, 0xB8E5,
+ 0x7A46, 0xC4C2,
+ 0x7A51, 0xF0A3,
+ 0x7A57, 0xCBEB,
+ 0x7A70, 0xF0A6,
+ 0x7A74, 0xD1A8,
+ 0x7A76, 0xBEBF,
+ 0x7A77, 0xC7EE,
+ 0x7A78, 0xF1B6,
+ 0x7A79, 0xF1B7,
+ 0x7A7A, 0xBFD5,
+ 0x7A7F, 0xB4A9,
+ 0x7A80, 0xF1B8,
+ 0x7A81, 0xCDBB,
+ 0x7A83, 0xC7D4,
+ 0x7A84, 0xD5AD,
+ 0x7A86, 0xF1B9,
+ 0x7A88, 0xF1BA,
+ 0x7A8D, 0xC7CF,
+ 0x7A91, 0xD2A4,
+ 0x7A92, 0xD6CF,
+ 0x7A95, 0xF1BB,
+ 0x7A96, 0xBDD1,
+ 0x7A97, 0xB4B0,
+ 0x7A98, 0xBEBD,
+ 0x7A9C, 0xB4DC,
+ 0x7A9D, 0xCED1,
+ 0x7A9F, 0xBFDF,
+ 0x7AA0, 0xF1BD,
+ 0x7AA5, 0xBFFA,
+ 0x7AA6, 0xF1BC,
+ 0x7AA8, 0xF1BF,
+ 0x7AAC, 0xF1BE,
+ 0x7AAD, 0xF1C0,
+ 0x7AB3, 0xF1C1,
+ 0x7ABF, 0xC1FE,
+ 0x7ACB, 0xC1A2,
+ 0x7AD6, 0xCAFA,
+ 0x7AD9, 0xD5BE,
+ 0x7ADE, 0xBEBA,
+ 0x7ADF, 0xBEB9,
+ 0x7AE0, 0xD5C2,
+ 0x7AE3, 0xBFA2,
+ 0x7AE5, 0xCDAF,
+ 0x7AE6, 0xF1B5,
+ 0x7AED, 0xBDDF,
+ 0x7AEF, 0xB6CB,
+ 0x7AF9, 0xD6F1,
+ 0x7AFA, 0xF3C3,
+ 0x7AFD, 0xF3C4,
+ 0x7AFF, 0xB8CD,
+ 0x7B03, 0xF3C6,
+ 0x7B04, 0xF3C7,
+ 0x7B06, 0xB0CA,
+ 0x7B08, 0xF3C5,
+ 0x7B0A, 0xF3C9,
+ 0x7B0B, 0xCBF1,
+ 0x7B0F, 0xF3CB,
+ 0x7B11, 0xD0A6,
+ 0x7B14, 0xB1CA,
+ 0x7B15, 0xF3C8,
+ 0x7B19, 0xF3CF,
+ 0x7B1B, 0xB5D1,
+ 0x7B1E, 0xF3D7,
+ 0x7B20, 0xF3D2,
+ 0x7B24, 0xF3D4,
+ 0x7B25, 0xF3D3,
+ 0x7B26, 0xB7FB,
+ 0x7B28, 0xB1BF,
+ 0x7B2A, 0xF3CE,
+ 0x7B2B, 0xF3CA,
+ 0x7B2C, 0xB5DA,
+ 0x7B2E, 0xF3D0,
+ 0x7B31, 0xF3D1,
+ 0x7B33, 0xF3D5,
+ 0x7B38, 0xF3CD,
+ 0x7B3A, 0xBCE3,
+ 0x7B3C, 0xC1FD,
+ 0x7B3E, 0xF3D6,
+ 0x7B45, 0xF3DA,
+ 0x7B47, 0xF3CC,
+ 0x7B49, 0xB5C8,
+ 0x7B4B, 0xBDEE,
+ 0x7B4C, 0xF3DC,
+ 0x7B4F, 0xB7A4,
+ 0x7B50, 0xBFF0,
+ 0x7B51, 0xD6FE,
+ 0x7B52, 0xCDB2,
+ 0x7B54, 0xB4F0,
+ 0x7B56, 0xB2DF,
+ 0x7B58, 0xF3D8,
+ 0x7B5A, 0xF3D9,
+ 0x7B5B, 0xC9B8,
+ 0x7B5D, 0xF3DD,
+ 0x7B60, 0xF3DE,
+ 0x7B62, 0xF3E1,
+ 0x7B6E, 0xF3DF,
+ 0x7B71, 0xF3E3,
+ 0x7B72, 0xF3E2,
+ 0x7B75, 0xF3DB,
+ 0x7B77, 0xBFEA,
+ 0x7B79, 0xB3EF,
+ 0x7B7B, 0xF3E0,
+ 0x7B7E, 0xC7A9,
+ 0x7B80, 0xBCF2,
+ 0x7B85, 0xF3EB,
+ 0x7B8D, 0xB9BF,
+ 0x7B90, 0xF3E4,
+ 0x7B94, 0xB2AD,
+ 0x7B95, 0xBBFE,
+ 0x7B97, 0xCBE3,
+ 0x7B9C, 0xF3ED,
+ 0x7B9D, 0xF3E9,
+ 0x7BA1, 0xB9DC,
+ 0x7BA2, 0xF3EE,
+ 0x7BA6, 0xF3E5,
+ 0x7BA7, 0xF3E6,
+ 0x7BA8, 0xF3EA,
+ 0x7BA9, 0xC2E1,
+ 0x7BAA, 0xF3EC,
+ 0x7BAB, 0xF3EF,
+ 0x7BAC, 0xF3E8,
+ 0x7BAD, 0xBCFD,
+ 0x7BB1, 0xCFE4,
+ 0x7BB4, 0xF3F0,
+ 0x7BB8, 0xF3E7,
+ 0x7BC1, 0xF3F2,
+ 0x7BC6, 0xD7AD,
+ 0x7BC7, 0xC6AA,
+ 0x7BCC, 0xF3F3,
+ 0x7BD1, 0xF3F1,
+ 0x7BD3, 0xC2A8,
+ 0x7BD9, 0xB8DD,
+ 0x7BDA, 0xF3F5,
+ 0x7BDD, 0xF3F4,
+ 0x7BE1, 0xB4DB,
+ 0x7BE5, 0xF3F6,
+ 0x7BE6, 0xF3F7,
+ 0x7BEA, 0xF3F8,
+ 0x7BEE, 0xC0BA,
+ 0x7BF1, 0xC0E9,
+ 0x7BF7, 0xC5F1,
+ 0x7BFC, 0xF3FB,
+ 0x7BFE, 0xF3FA,
+ 0x7C07, 0xB4D8,
+ 0x7C0B, 0xF3FE,
+ 0x7C0C, 0xF3F9,
+ 0x7C0F, 0xF3FC,
+ 0x7C16, 0xF3FD,
+ 0x7C1F, 0xF4A1,
+ 0x7C26, 0xF4A3,
+ 0x7C27, 0xBBC9,
+ 0x7C2A, 0xF4A2,
+ 0x7C38, 0xF4A4,
+ 0x7C3F, 0xB2BE,
+ 0x7C40, 0xF4A6,
+ 0x7C41, 0xF4A5,
+ 0x7C4D, 0xBCAE,
+ 0x7C73, 0xC3D7,
+ 0x7C74, 0xD9E1,
+ 0x7C7B, 0xC0E0,
+ 0x7C7C, 0xF4CC,
+ 0x7C7D, 0xD7D1,
+ 0x7C89, 0xB7DB,
+ 0x7C91, 0xF4CE,
+ 0x7C92, 0xC1A3,
+ 0x7C95, 0xC6C9,
+ 0x7C97, 0xB4D6,
+ 0x7C98, 0xD5B3,
+ 0x7C9C, 0xF4D0,
+ 0x7C9D, 0xF4CF,
+ 0x7C9E, 0xF4D1,
+ 0x7C9F, 0xCBDA,
+ 0x7CA2, 0xF4D2,
+ 0x7CA4, 0xD4C1,
+ 0x7CA5, 0xD6E0,
+ 0x7CAA, 0xB7E0,
+ 0x7CAE, 0xC1B8,
+ 0x7CB1, 0xC1BB,
+ 0x7CB2, 0xF4D3,
+ 0x7CB3, 0xBEAC,
+ 0x7CB9, 0xB4E2,
+ 0x7CBC, 0xF4D4,
+ 0x7CBD, 0xF4D5,
+ 0x7CBE, 0xBEAB,
+ 0x7CC1, 0xF4D6,
+ 0x7CC5, 0xF4DB,
+ 0x7CC7, 0xF4D7,
+ 0x7CC8, 0xF4DA,
+ 0x7CCA, 0xBAFD,
+ 0x7CCC, 0xF4D8,
+ 0x7CCD, 0xF4D9,
+ 0x7CD5, 0xB8E2,
+ 0x7CD6, 0xCCC7,
+ 0x7CD7, 0xF4DC,
+ 0x7CD9, 0xB2DA,
+ 0x7CDC, 0xC3D3,
+ 0x7CDF, 0xD4E3,
+ 0x7CE0, 0xBFB7,
+ 0x7CE8, 0xF4DD,
+ 0x7CEF, 0xC5B4,
+ 0x7CF8, 0xF4E9,
+ 0x7CFB, 0xCFB5,
+ 0x7D0A, 0xCEC9,
+ 0x7D20, 0xCBD8,
+ 0x7D22, 0xCBF7,
+ 0x7D27, 0xBDF4,
+ 0x7D2B, 0xD7CF,
+ 0x7D2F, 0xC0DB,
+ 0x7D6E, 0xD0F5,
+ 0x7D77, 0xF4EA,
+ 0x7DA6, 0xF4EB,
+ 0x7DAE, 0xF4EC,
+ 0x7E3B, 0xF7E3,
+ 0x7E41, 0xB7B1,
+ 0x7E47, 0xF4ED,
+ 0x7E82, 0xD7EB,
+ 0x7E9B, 0xF4EE,
+ 0x7E9F, 0xE6F9,
+ 0x7EA0, 0xBEC0,
+ 0x7EA1, 0xE6FA,
+ 0x7EA2, 0xBAEC,
+ 0x7EA3, 0xE6FB,
+ 0x7EA4, 0xCFCB,
+ 0x7EA5, 0xE6FC,
+ 0x7EA6, 0xD4BC,
+ 0x7EA7, 0xBCB6,
+ 0x7EA8, 0xE6FD,
+ 0x7EA9, 0xE6FE,
+ 0x7EAA, 0xBCCD,
+ 0x7EAB, 0xC8D2,
+ 0x7EAC, 0xCEB3,
+ 0x7EAD, 0xE7A1,
+ 0x7EAF, 0xB4BF,
+ 0x7EB0, 0xE7A2,
+ 0x7EB1, 0xC9B4,
+ 0x7EB2, 0xB8D9,
+ 0x7EB3, 0xC4C9,
+ 0x7EB5, 0xD7DD,
+ 0x7EB6, 0xC2DA,
+ 0x7EB7, 0xB7D7,
+ 0x7EB8, 0xD6BD,
+ 0x7EB9, 0xCEC6,
+ 0x7EBA, 0xB7C4,
+ 0x7EBD, 0xC5A6,
+ 0x7EBE, 0xE7A3,
+ 0x7EBF, 0xCFDF,
+ 0x7EC0, 0xE7A4,
+ 0x7EC1, 0xE7A5,
+ 0x7EC2, 0xE7A6,
+ 0x7EC3, 0xC1B7,
+ 0x7EC4, 0xD7E9,
+ 0x7EC5, 0xC9F0,
+ 0x7EC6, 0xCFB8,
+ 0x7EC7, 0xD6AF,
+ 0x7EC8, 0xD6D5,
+ 0x7EC9, 0xE7A7,
+ 0x7ECA, 0xB0ED,
+ 0x7ECB, 0xE7A8,
+ 0x7ECC, 0xE7A9,
+ 0x7ECD, 0xC9DC,
+ 0x7ECE, 0xD2EF,
+ 0x7ECF, 0xBEAD,
+ 0x7ED0, 0xE7AA,
+ 0x7ED1, 0xB0F3,
+ 0x7ED2, 0xC8DE,
+ 0x7ED3, 0xBDE1,
+ 0x7ED4, 0xE7AB,
+ 0x7ED5, 0xC8C6,
+ 0x7ED7, 0xE7AC,
+ 0x7ED8, 0xBBE6,
+ 0x7ED9, 0xB8F8,
+ 0x7EDA, 0xD1A4,
+ 0x7EDB, 0xE7AD,
+ 0x7EDC, 0xC2E7,
+ 0x7EDD, 0xBEF8,
+ 0x7EDE, 0xBDCA,
+ 0x7EDF, 0xCDB3,
+ 0x7EE0, 0xE7AE,
+ 0x7EE1, 0xE7AF,
+ 0x7EE2, 0xBEEE,
+ 0x7EE3, 0xD0E5,
+ 0x7EE5, 0xCBE7,
+ 0x7EE6, 0xCCD0,
+ 0x7EE7, 0xBCCC,
+ 0x7EE8, 0xE7B0,
+ 0x7EE9, 0xBCA8,
+ 0x7EEA, 0xD0F7,
+ 0x7EEB, 0xE7B1,
+ 0x7EED, 0xD0F8,
+ 0x7EEE, 0xE7B2,
+ 0x7EEF, 0xE7B3,
+ 0x7EF0, 0xB4C2,
+ 0x7EF1, 0xE7B4,
+ 0x7EF2, 0xE7B5,
+ 0x7EF3, 0xC9FE,
+ 0x7EF4, 0xCEAC,
+ 0x7EF5, 0xC3E0,
+ 0x7EF6, 0xE7B7,
+ 0x7EF7, 0xB1C1,
+ 0x7EF8, 0xB3F1,
+ 0x7EFA, 0xE7B8,
+ 0x7EFB, 0xE7B9,
+ 0x7EFC, 0xD7DB,
+ 0x7EFD, 0xD5C0,
+ 0x7EFE, 0xE7BA,
+ 0x7EFF, 0xC2CC,
+ 0x7F00, 0xD7BA,
+ 0x7F01, 0xE7BB,
+ 0x7F02, 0xE7BC,
+ 0x7F03, 0xE7BD,
+ 0x7F04, 0xBCEA,
+ 0x7F05, 0xC3E5,
+ 0x7F06, 0xC0C2,
+ 0x7F07, 0xE7BE,
+ 0x7F08, 0xE7BF,
+ 0x7F09, 0xBCA9,
+ 0x7F0B, 0xE7C0,
+ 0x7F0C, 0xE7C1,
+ 0x7F0D, 0xE7B6,
+ 0x7F0E, 0xB6D0,
+ 0x7F0F, 0xE7C2,
+ 0x7F11, 0xE7C3,
+ 0x7F12, 0xE7C4,
+ 0x7F13, 0xBBBA,
+ 0x7F14, 0xB5DE,
+ 0x7F15, 0xC2C6,
+ 0x7F16, 0xB1E0,
+ 0x7F17, 0xE7C5,
+ 0x7F18, 0xD4B5,
+ 0x7F19, 0xE7C6,
+ 0x7F1A, 0xB8BF,
+ 0x7F1B, 0xE7C8,
+ 0x7F1C, 0xE7C7,
+ 0x7F1D, 0xB7EC,
+ 0x7F1F, 0xE7C9,
+ 0x7F20, 0xB2F8,
+ 0x7F21, 0xE7CA,
+ 0x7F22, 0xE7CB,
+ 0x7F23, 0xE7CC,
+ 0x7F24, 0xE7CD,
+ 0x7F25, 0xE7CE,
+ 0x7F26, 0xE7CF,
+ 0x7F27, 0xE7D0,
+ 0x7F28, 0xD3A7,
+ 0x7F29, 0xCBF5,
+ 0x7F2A, 0xE7D1,
+ 0x7F2B, 0xE7D2,
+ 0x7F2C, 0xE7D3,
+ 0x7F2D, 0xE7D4,
+ 0x7F2E, 0xC9C9,
+ 0x7F2F, 0xE7D5,
+ 0x7F30, 0xE7D6,
+ 0x7F31, 0xE7D7,
+ 0x7F32, 0xE7D8,
+ 0x7F33, 0xE7D9,
+ 0x7F34, 0xBDC9,
+ 0x7F35, 0xE7DA,
+ 0x7F36, 0xF3BE,
+ 0x7F38, 0xB8D7,
+ 0x7F3A, 0xC8B1,
+ 0x7F42, 0xF3BF,
+ 0x7F44, 0xF3C0,
+ 0x7F45, 0xF3C1,
+ 0x7F50, 0xB9DE,
+ 0x7F51, 0xCDF8,
+ 0x7F54, 0xD8E8,
+ 0x7F55, 0xBAB1,
+ 0x7F57, 0xC2DE,
+ 0x7F58, 0xEEB7,
+ 0x7F5A, 0xB7A3,
+ 0x7F5F, 0xEEB9,
+ 0x7F61, 0xEEB8,
+ 0x7F62, 0xB0D5,
+ 0x7F68, 0xEEBB,
+ 0x7F69, 0xD5D6,
+ 0x7F6A, 0xD7EF,
+ 0x7F6E, 0xD6C3,
+ 0x7F71, 0xEEBD,
+ 0x7F72, 0xCAF0,
+ 0x7F74, 0xEEBC,
+ 0x7F79, 0xEEBE,
+ 0x7F7E, 0xEEC0,
+ 0x7F81, 0xEEBF,
+ 0x7F8A, 0xD1F2,
+ 0x7F8C, 0xC7BC,
+ 0x7F8E, 0xC3C0,
+ 0x7F94, 0xB8E1,
+ 0x7F9A, 0xC1E7,
+ 0x7F9D, 0xF4C6,
+ 0x7F9E, 0xD0DF,
+ 0x7F9F, 0xF4C7,
+ 0x7FA1, 0xCFDB,
+ 0x7FA4, 0xC8BA,
+ 0x7FA7, 0xF4C8,
+ 0x7FAF, 0xF4C9,
+ 0x7FB0, 0xF4CA,
+ 0x7FB2, 0xF4CB,
+ 0x7FB8, 0xD9FA,
+ 0x7FB9, 0xB8FE,
+ 0x7FBC, 0xE5F1,
+ 0x7FBD, 0xD3F0,
+ 0x7FBF, 0xF4E0,
+ 0x7FC1, 0xCECC,
+ 0x7FC5, 0xB3E1,
+ 0x7FCA, 0xF1B4,
+ 0x7FCC, 0xD2EE,
+ 0x7FCE, 0xF4E1,
+ 0x7FD4, 0xCFE8,
+ 0x7FD5, 0xF4E2,
+ 0x7FD8, 0xC7CC,
+ 0x7FDF, 0xB5D4,
+ 0x7FE0, 0xB4E4,
+ 0x7FE1, 0xF4E4,
+ 0x7FE5, 0xF4E3,
+ 0x7FE6, 0xF4E5,
+ 0x7FE9, 0xF4E6,
+ 0x7FEE, 0xF4E7,
+ 0x7FF0, 0xBAB2,
+ 0x7FF1, 0xB0BF,
+ 0x7FF3, 0xF4E8,
+ 0x7FFB, 0xB7AD,
+ 0x7FFC, 0xD2ED,
+ 0x8000, 0xD2AB,
+ 0x8001, 0xC0CF,
+ 0x8003, 0xBFBC,
+ 0x8004, 0xEBA3,
+ 0x8005, 0xD5DF,
+ 0x8006, 0xEAC8,
+ 0x800B, 0xF1F3,
+ 0x800C, 0xB6F8,
+ 0x800D, 0xCBA3,
+ 0x8010, 0xC4CD,
+ 0x8012, 0xF1E7,
+ 0x8014, 0xF1E8,
+ 0x8015, 0xB8FB,
+ 0x8016, 0xF1E9,
+ 0x8017, 0xBAC4,
+ 0x8018, 0xD4C5,
+ 0x8019, 0xB0D2,
+ 0x801C, 0xF1EA,
+ 0x8020, 0xF1EB,
+ 0x8022, 0xF1EC,
+ 0x8025, 0xF1ED,
+ 0x8026, 0xF1EE,
+ 0x8027, 0xF1EF,
+ 0x8028, 0xF1F1,
+ 0x8029, 0xF1F0,
+ 0x802A, 0xC5D5,
+ 0x8031, 0xF1F2,
+ 0x8033, 0xB6FA,
+ 0x8035, 0xF1F4,
+ 0x8036, 0xD2AE,
+ 0x8037, 0xDEC7,
+ 0x8038, 0xCBCA,
+ 0x803B, 0xB3DC,
+ 0x803D, 0xB5A2,
+ 0x803F, 0xB9A2,
+ 0x8042, 0xC4F4,
+ 0x8043, 0xF1F5,
+ 0x8046, 0xF1F6,
+ 0x804A, 0xC1C4,
+ 0x804B, 0xC1FB,
+ 0x804C, 0xD6B0,
+ 0x804D, 0xF1F7,
+ 0x8052, 0xF1F8,
+ 0x8054, 0xC1AA,
+ 0x8058, 0xC6B8,
+ 0x805A, 0xBEDB,
+ 0x8069, 0xF1F9,
+ 0x806A, 0xB4CF,
+ 0x8071, 0xF1FA,
+ 0x807F, 0xEDB2,
+ 0x8080, 0xEDB1,
+ 0x8083, 0xCBE0,
+ 0x8084, 0xD2DE,
+ 0x8086, 0xCBC1,
+ 0x8087, 0xD5D8,
+ 0x8089, 0xC8E2,
+ 0x808B, 0xC0DF,
+ 0x808C, 0xBCA1,
+ 0x8093, 0xEBC1,
+ 0x8096, 0xD0A4,
+ 0x8098, 0xD6E2,
+ 0x809A, 0xB6C7,
+ 0x809B, 0xB8D8,
+ 0x809C, 0xEBC0,
+ 0x809D, 0xB8CE,
+ 0x809F, 0xEBBF,
+ 0x80A0, 0xB3A6,
+ 0x80A1, 0xB9C9,
+ 0x80A2, 0xD6AB,
+ 0x80A4, 0xB7F4,
+ 0x80A5, 0xB7CA,
+ 0x80A9, 0xBCE7,
+ 0x80AA, 0xB7BE,
+ 0x80AB, 0xEBC6,
+ 0x80AD, 0xEBC7,
+ 0x80AE, 0xB0B9,
+ 0x80AF, 0xBFCF,
+ 0x80B1, 0xEBC5,
+ 0x80B2, 0xD3FD,
+ 0x80B4, 0xEBC8,
+ 0x80B7, 0xEBC9,
+ 0x80BA, 0xB7CE,
+ 0x80BC, 0xEBC2,
+ 0x80BD, 0xEBC4,
+ 0x80BE, 0xC9F6,
+ 0x80BF, 0xD6D7,
+ 0x80C0, 0xD5CD,
+ 0x80C1, 0xD0B2,
+ 0x80C2, 0xEBCF,
+ 0x80C3, 0xCEB8,
+ 0x80C4, 0xEBD0,
+ 0x80C6, 0xB5A8,
+ 0x80CC, 0xB1B3,
+ 0x80CD, 0xEBD2,
+ 0x80CE, 0xCCA5,
+ 0x80D6, 0xC5D6,
+ 0x80D7, 0xEBD3,
+ 0x80D9, 0xEBD1,
+ 0x80DA, 0xC5DF,
+ 0x80DB, 0xEBCE,
+ 0x80DC, 0xCAA4,
+ 0x80DD, 0xEBD5,
+ 0x80DE, 0xB0FB,
+ 0x80E1, 0xBAFA,
+ 0x80E4, 0xD8B7,
+ 0x80E5, 0xF1E3,
+ 0x80E7, 0xEBCA,
+ 0x80E8, 0xEBCB,
+ 0x80E9, 0xEBCC,
+ 0x80EA, 0xEBCD,
+ 0x80EB, 0xEBD6,
+ 0x80EC, 0xE6C0,
+ 0x80ED, 0xEBD9,
+ 0x80EF, 0xBFE8,
+ 0x80F0, 0xD2C8,
+ 0x80F1, 0xEBD7,
+ 0x80F2, 0xEBDC,
+ 0x80F3, 0xB8EC,
+ 0x80F4, 0xEBD8,
+ 0x80F6, 0xBDBA,
+ 0x80F8, 0xD0D8,
+ 0x80FA, 0xB0B7,
+ 0x80FC, 0xEBDD,
+ 0x80FD, 0xC4DC,
+ 0x8102, 0xD6AC,
+ 0x8106, 0xB4E0,
+ 0x8109, 0xC2F6,
+ 0x810A, 0xBCB9,
+ 0x810D, 0xEBDA,
+ 0x810E, 0xEBDB,
+ 0x810F, 0xD4E0,
+ 0x8110, 0xC6EA,
+ 0x8111, 0xC4D4,
+ 0x8112, 0xEBDF,
+ 0x8113, 0xC5A7,
+ 0x8114, 0xD9F5,
+ 0x8116, 0xB2B1,
+ 0x8118, 0xEBE4,
+ 0x811A, 0xBDC5,
+ 0x811E, 0xEBE2,
+ 0x812C, 0xEBE3,
+ 0x812F, 0xB8AC,
+ 0x8131, 0xCDD1,
+ 0x8132, 0xEBE5,
+ 0x8136, 0xEBE1,
+ 0x8138, 0xC1B3,
+ 0x813E, 0xC6A2,
+ 0x8146, 0xCCF3,
+ 0x8148, 0xEBE6,
+ 0x814A, 0xC0B0,
+ 0x814B, 0xD2B8,
+ 0x814C, 0xEBE7,
+ 0x8150, 0xB8AF,
+ 0x8151, 0xB8AD,
+ 0x8153, 0xEBE8,
+ 0x8154, 0xC7BB,
+ 0x8155, 0xCDF3,
+ 0x8159, 0xEBEA,
+ 0x815A, 0xEBEB,
+ 0x8160, 0xEBED,
+ 0x8165, 0xD0C8,
+ 0x8167, 0xEBF2,
+ 0x8169, 0xEBEE,
+ 0x816D, 0xEBF1,
+ 0x816E, 0xC8F9,
+ 0x8170, 0xD1FC,
+ 0x8171, 0xEBEC,
+ 0x8174, 0xEBE9,
+ 0x8179, 0xB8B9,
+ 0x817A, 0xCFD9,
+ 0x817B, 0xC4E5,
+ 0x817C, 0xEBEF,
+ 0x817D, 0xEBF0,
+ 0x817E, 0xCCDA,
+ 0x817F, 0xCDC8,
+ 0x8180, 0xB0F2,
+ 0x8182, 0xEBF6,
+ 0x8188, 0xEBF5,
+ 0x818A, 0xB2B2,
+ 0x818F, 0xB8E0,
+ 0x8191, 0xEBF7,
+ 0x8198, 0xB1EC,
+ 0x819B, 0xCCC5,
+ 0x819C, 0xC4A4,
+ 0x819D, 0xCFA5,
+ 0x81A3, 0xEBF9,
+ 0x81A6, 0xECA2,
+ 0x81A8, 0xC5F2,
+ 0x81AA, 0xEBFA,
+ 0x81B3, 0xC9C5,
+ 0x81BA, 0xE2DF,
+ 0x81BB, 0xEBFE,
+ 0x81C0, 0xCDCE,
+ 0x81C1, 0xECA1,
+ 0x81C2, 0xB1DB,
+ 0x81C3, 0xD3B7,
+ 0x81C6, 0xD2DC,
+ 0x81CA, 0xEBFD,
+ 0x81CC, 0xEBFB,
+ 0x81E3, 0xB3BC,
+ 0x81E7, 0xEAB0,
+ 0x81EA, 0xD7D4,
+ 0x81EC, 0xF4AB,
+ 0x81ED, 0xB3F4,
+ 0x81F3, 0xD6C1,
+ 0x81F4, 0xD6C2,
+ 0x81FB, 0xD5E9,
+ 0x81FC, 0xBECA,
+ 0x81FE, 0xF4A7,
+ 0x8200, 0xD2A8,
+ 0x8201, 0xF4A8,
+ 0x8202, 0xF4A9,
+ 0x8204, 0xF4AA,
+ 0x8205, 0xBECB,
+ 0x8206, 0xD3DF,
+ 0x820C, 0xC9E0,
+ 0x820D, 0xC9E1,
+ 0x8210, 0xF3C2,
+ 0x8212, 0xCAE6,
+ 0x8214, 0xCCF2,
+ 0x821B, 0xE2B6,
+ 0x821C, 0xCBB4,
+ 0x821E, 0xCEE8,
+ 0x821F, 0xD6DB,
+ 0x8221, 0xF4AD,
+ 0x8222, 0xF4AE,
+ 0x8223, 0xF4AF,
+ 0x8228, 0xF4B2,
+ 0x822A, 0xBABD,
+ 0x822B, 0xF4B3,
+ 0x822C, 0xB0E3,
+ 0x822D, 0xF4B0,
+ 0x822F, 0xF4B1,
+ 0x8230, 0xBDA2,
+ 0x8231, 0xB2D5,
+ 0x8233, 0xF4B6,
+ 0x8234, 0xF4B7,
+ 0x8235, 0xB6E6,
+ 0x8236, 0xB2B0,
+ 0x8237, 0xCFCF,
+ 0x8238, 0xF4B4,
+ 0x8239, 0xB4AC,
+ 0x823B, 0xF4B5,
+ 0x823E, 0xF4B8,
+ 0x8244, 0xF4B9,
+ 0x8247, 0xCDA7,
+ 0x8249, 0xF4BA,
+ 0x824B, 0xF4BB,
+ 0x824F, 0xF4BC,
+ 0x8258, 0xCBD2,
+ 0x825A, 0xF4BD,
+ 0x825F, 0xF4BE,
+ 0x8268, 0xF4BF,
+ 0x826E, 0xF4DE,
+ 0x826F, 0xC1BC,
+ 0x8270, 0xBCE8,
+ 0x8272, 0xC9AB,
+ 0x8273, 0xD1DE,
+ 0x8274, 0xE5F5,
+ 0x8279, 0xDCB3,
+ 0x827A, 0xD2D5,
+ 0x827D, 0xDCB4,
+ 0x827E, 0xB0AC,
+ 0x827F, 0xDCB5,
+ 0x8282, 0xBDDA,
+ 0x8284, 0xDCB9,
+ 0x8288, 0xD8C2,
+ 0x828A, 0xDCB7,
+ 0x828B, 0xD3F3,
+ 0x828D, 0xC9D6,
+ 0x828E, 0xDCBA,
+ 0x828F, 0xDCB6,
+ 0x8291, 0xDCBB,
+ 0x8292, 0xC3A2,
+ 0x8297, 0xDCBC,
+ 0x8298, 0xDCC5,
+ 0x8299, 0xDCBD,
+ 0x829C, 0xCEDF,
+ 0x829D, 0xD6A5,
+ 0x829F, 0xDCCF,
+ 0x82A1, 0xDCCD,
+ 0x82A4, 0xDCD2,
+ 0x82A5, 0xBDE6,
+ 0x82A6, 0xC2AB,
+ 0x82A8, 0xDCB8,
+ 0x82A9, 0xDCCB,
+ 0x82AA, 0xDCCE,
+ 0x82AB, 0xDCBE,
+ 0x82AC, 0xB7D2,
+ 0x82AD, 0xB0C5,
+ 0x82AE, 0xDCC7,
+ 0x82AF, 0xD0BE,
+ 0x82B0, 0xDCC1,
+ 0x82B1, 0xBBA8,
+ 0x82B3, 0xB7BC,
+ 0x82B4, 0xDCCC,
+ 0x82B7, 0xDCC6,
+ 0x82B8, 0xDCBF,
+ 0x82B9, 0xC7DB,
+ 0x82BD, 0xD1BF,
+ 0x82BE, 0xDCC0,
+ 0x82C1, 0xDCCA,
+ 0x82C4, 0xDCD0,
+ 0x82C7, 0xCEAD,
+ 0x82C8, 0xDCC2,
+ 0x82CA, 0xDCC3,
+ 0x82CB, 0xDCC8,
+ 0x82CC, 0xDCC9,
+ 0x82CD, 0xB2D4,
+ 0x82CE, 0xDCD1,
+ 0x82CF, 0xCBD5,
+ 0x82D1, 0xD4B7,
+ 0x82D2, 0xDCDB,
+ 0x82D3, 0xDCDF,
+ 0x82D4, 0xCCA6,
+ 0x82D5, 0xDCE6,
+ 0x82D7, 0xC3E7,
+ 0x82D8, 0xDCDC,
+ 0x82DB, 0xBFC1,
+ 0x82DC, 0xDCD9,
+ 0x82DE, 0xB0FA,
+ 0x82DF, 0xB9B6,
+ 0x82E0, 0xDCE5,
+ 0x82E1, 0xDCD3,
+ 0x82E3, 0xDCC4,
+ 0x82E4, 0xDCD6,
+ 0x82E5, 0xC8F4,
+ 0x82E6, 0xBFE0,
+ 0x82EB, 0xC9BB,
+ 0x82EF, 0xB1BD,
+ 0x82F1, 0xD3A2,
+ 0x82F4, 0xDCDA,
+ 0x82F7, 0xDCD5,
+ 0x82F9, 0xC6BB,
+ 0x82FB, 0xDCDE,
+ 0x8301, 0xD7C2,
+ 0x8302, 0xC3AF,
+ 0x8303, 0xB7B6,
+ 0x8304, 0xC7D1,
+ 0x8305, 0xC3A9,
+ 0x8306, 0xDCE2,
+ 0x8307, 0xDCD8,
+ 0x8308, 0xDCEB,
+ 0x8309, 0xDCD4,
+ 0x830C, 0xDCDD,
+ 0x830E, 0xBEA5,
+ 0x830F, 0xDCD7,
+ 0x8311, 0xDCE0,
+ 0x8314, 0xDCE3,
+ 0x8315, 0xDCE4,
+ 0x8317, 0xDCF8,
+ 0x831A, 0xDCE1,
+ 0x831B, 0xDDA2,
+ 0x831C, 0xDCE7,
+ 0x8327, 0xBCEB,
+ 0x8328, 0xB4C4,
+ 0x832B, 0xC3A3,
+ 0x832C, 0xB2E7,
+ 0x832D, 0xDCFA,
+ 0x832F, 0xDCF2,
+ 0x8331, 0xDCEF,
+ 0x8333, 0xDCFC,
+ 0x8334, 0xDCEE,
+ 0x8335, 0xD2F0,
+ 0x8336, 0xB2E8,
+ 0x8338, 0xC8D7,
+ 0x8339, 0xC8E3,
+ 0x833A, 0xDCFB,
+ 0x833C, 0xDCED,
+ 0x8340, 0xDCF7,
+ 0x8343, 0xDCF5,
+ 0x8346, 0xBEA3,
+ 0x8347, 0xDCF4,
+ 0x8349, 0xB2DD,
+ 0x834F, 0xDCF3,
+ 0x8350, 0xBCF6,
+ 0x8351, 0xDCE8,
+ 0x8352, 0xBBC4,
+ 0x8354, 0xC0F3,
+ 0x835A, 0xBCD4,
+ 0x835B, 0xDCE9,
+ 0x835C, 0xDCEA,
+ 0x835E, 0xDCF1,
+ 0x835F, 0xDCF6,
+ 0x8360, 0xDCF9,
+ 0x8361, 0xB5B4,
+ 0x8363, 0xC8D9,
+ 0x8364, 0xBBE7,
+ 0x8365, 0xDCFE,
+ 0x8366, 0xDCFD,
+ 0x8367, 0xD3AB,
+ 0x8368, 0xDDA1,
+ 0x8369, 0xDDA3,
+ 0x836A, 0xDDA5,
+ 0x836B, 0xD2F1,
+ 0x836C, 0xDDA4,
+ 0x836D, 0xDDA6,
+ 0x836E, 0xDDA7,
+ 0x836F, 0xD2A9,
+ 0x8377, 0xBAC9,
+ 0x8378, 0xDDA9,
+ 0x837B, 0xDDB6,
+ 0x837C, 0xDDB1,
+ 0x837D, 0xDDB4,
+ 0x8385, 0xDDB0,
+ 0x8386, 0xC6CE,
+ 0x8389, 0xC0F2,
+ 0x838E, 0xC9AF,
+ 0x8392, 0xDCEC,
+ 0x8393, 0xDDAE,
+ 0x8398, 0xDDB7,
+ 0x839B, 0xDCF0,
+ 0x839C, 0xDDAF,
+ 0x839E, 0xDDB8,
+ 0x83A0, 0xDDAC,
+ 0x83A8, 0xDDB9,
+ 0x83A9, 0xDDB3,
+ 0x83AA, 0xDDAD,
+ 0x83AB, 0xC4AA,
+ 0x83B0, 0xDDA8,
+ 0x83B1, 0xC0B3,
+ 0x83B2, 0xC1AB,
+ 0x83B3, 0xDDAA,
+ 0x83B4, 0xDDAB,
+ 0x83B6, 0xDDB2,
+ 0x83B7, 0xBBF1,
+ 0x83B8, 0xDDB5,
+ 0x83B9, 0xD3A8,
+ 0x83BA, 0xDDBA,
+ 0x83BC, 0xDDBB,
+ 0x83BD, 0xC3A7,
+ 0x83C0, 0xDDD2,
+ 0x83C1, 0xDDBC,
+ 0x83C5, 0xDDD1,
+ 0x83C7, 0xB9BD,
+ 0x83CA, 0xBED5,
+ 0x83CC, 0xBEFA,
+ 0x83CF, 0xBACA,
+ 0x83D4, 0xDDCA,
+ 0x83D6, 0xDDC5,
+ 0x83D8, 0xDDBF,
+ 0x83DC, 0xB2CB,
+ 0x83DD, 0xDDC3,
+ 0x83DF, 0xDDCB,
+ 0x83E0, 0xB2A4,
+ 0x83E1, 0xDDD5,
+ 0x83E5, 0xDDBE,
+ 0x83E9, 0xC6D0,
+ 0x83EA, 0xDDD0,
+ 0x83F0, 0xDDD4,
+ 0x83F1, 0xC1E2,
+ 0x83F2, 0xB7C6,
+ 0x83F8, 0xDDCE,
+ 0x83F9, 0xDDCF,
+ 0x83FD, 0xDDC4,
+ 0x8401, 0xDDBD,
+ 0x8403, 0xDDCD,
+ 0x8404, 0xCCD1,
+ 0x8406, 0xDDC9,
+ 0x840B, 0xDDC2,
+ 0x840C, 0xC3C8,
+ 0x840D, 0xC6BC,
+ 0x840E, 0xCEAE,
+ 0x840F, 0xDDCC,
+ 0x8411, 0xDDC8,
+ 0x8418, 0xDDC1,
+ 0x841C, 0xDDC6,
+ 0x841D, 0xC2DC,
+ 0x8424, 0xD3A9,
+ 0x8425, 0xD3AA,
+ 0x8426, 0xDDD3,
+ 0x8427, 0xCFF4,
+ 0x8428, 0xC8F8,
+ 0x8431, 0xDDE6,
+ 0x8438, 0xDDC7,
+ 0x843C, 0xDDE0,
+ 0x843D, 0xC2E4,
+ 0x8446, 0xDDE1,
+ 0x8451, 0xDDD7,
+ 0x8457, 0xD6F8,
+ 0x8459, 0xDDD9,
+ 0x845A, 0xDDD8,
+ 0x845B, 0xB8F0,
+ 0x845C, 0xDDD6,
+ 0x8461, 0xC6CF,
+ 0x8463, 0xB6AD,
+ 0x8469, 0xDDE2,
+ 0x846B, 0xBAF9,
+ 0x846C, 0xD4E1,
+ 0x846D, 0xDDE7,
+ 0x8471, 0xB4D0,
+ 0x8473, 0xDDDA,
+ 0x8475, 0xBFFB,
+ 0x8476, 0xDDE3,
+ 0x8478, 0xDDDF,
+ 0x847A, 0xDDDD,
+ 0x8482, 0xB5D9,
+ 0x8487, 0xDDDB,
+ 0x8488, 0xDDDC,
+ 0x8489, 0xDDDE,
+ 0x848B, 0xBDAF,
+ 0x848C, 0xDDE4,
+ 0x848E, 0xDDE5,
+ 0x8497, 0xDDF5,
+ 0x8499, 0xC3C9,
+ 0x849C, 0xCBE2,
+ 0x84A1, 0xDDF2,
+ 0x84AF, 0xD8E1,
+ 0x84B2, 0xC6D1,
+ 0x84B4, 0xDDF4,
+ 0x84B8, 0xD5F4,
+ 0x84B9, 0xDDF3,
+ 0x84BA, 0xDDF0,
+ 0x84BD, 0xDDEC,
+ 0x84BF, 0xDDEF,
+ 0x84C1, 0xDDE8,
+ 0x84C4, 0xD0EE,
+ 0x84C9, 0xC8D8,
+ 0x84CA, 0xDDEE,
+ 0x84CD, 0xDDE9,
+ 0x84D0, 0xDDEA,
+ 0x84D1, 0xCBF2,
+ 0x84D3, 0xDDED,
+ 0x84D6, 0xB1CD,
+ 0x84DD, 0xC0B6,
+ 0x84DF, 0xBCBB,
+ 0x84E0, 0xDDF1,
+ 0x84E3, 0xDDF7,
+ 0x84E5, 0xDDF6,
+ 0x84E6, 0xDDEB,
+ 0x84EC, 0xC5EE,
+ 0x84F0, 0xDDFB,
+ 0x84FC, 0xDEA4,
+ 0x84FF, 0xDEA3,
+ 0x850C, 0xDDF8,
+ 0x8511, 0xC3EF,
+ 0x8513, 0xC2FB,
+ 0x8517, 0xD5E1,
+ 0x851A, 0xCEB5,
+ 0x851F, 0xDDFD,
+ 0x8521, 0xB2CC,
+ 0x852B, 0xC4E8,
+ 0x852C, 0xCADF,
+ 0x8537, 0xC7BE,
+ 0x8538, 0xDDFA,
+ 0x8539, 0xDDFC,
+ 0x853A, 0xDDFE,
+ 0x853B, 0xDEA2,
+ 0x853C, 0xB0AA,
+ 0x853D, 0xB1CE,
+ 0x8543, 0xDEAC,
+ 0x8548, 0xDEA6,
+ 0x8549, 0xBDB6,
+ 0x854A, 0xC8EF,
+ 0x8556, 0xDEA1,
+ 0x8559, 0xDEA5,
+ 0x855E, 0xDEA9,
+ 0x8564, 0xDEA8,
+ 0x8568, 0xDEA7,
+ 0x8572, 0xDEAD,
+ 0x8574, 0xD4CC,
+ 0x8579, 0xDEB3,
+ 0x857A, 0xDEAA,
+ 0x857B, 0xDEAE,
+ 0x857E, 0xC0D9,
+ 0x8584, 0xB1A1,
+ 0x8585, 0xDEB6,
+ 0x8587, 0xDEB1,
+ 0x858F, 0xDEB2,
+ 0x859B, 0xD1A6,
+ 0x859C, 0xDEB5,
+ 0x85A4, 0xDEAF,
+ 0x85A8, 0xDEB0,
+ 0x85AA, 0xD0BD,
+ 0x85AE, 0xDEB4,
+ 0x85AF, 0xCAED,
+ 0x85B0, 0xDEB9,
+ 0x85B7, 0xDEB8,
+ 0x85B9, 0xDEB7,
+ 0x85C1, 0xDEBB,
+ 0x85C9, 0xBDE5,
+ 0x85CF, 0xB2D8,
+ 0x85D0, 0xC3EA,
+ 0x85D3, 0xDEBA,
+ 0x85D5, 0xC5BA,
+ 0x85DC, 0xDEBC,
+ 0x85E4, 0xCCD9,
+ 0x85E9, 0xB7AA,
+ 0x85FB, 0xD4E5,
+ 0x85FF, 0xDEBD,
+ 0x8605, 0xDEBF,
+ 0x8611, 0xC4A2,
+ 0x8616, 0xDEC1,
+ 0x8627, 0xDEBE,
+ 0x8629, 0xDEC0,
+ 0x8638, 0xD5BA,
+ 0x863C, 0xDEC2,
+ 0x864D, 0xF2AE,
+ 0x864E, 0xBBA2,
+ 0x864F, 0xC2B2,
+ 0x8650, 0xC5B0,
+ 0x8651, 0xC2C7,
+ 0x8654, 0xF2AF,
+ 0x865A, 0xD0E9,
+ 0x865E, 0xD3DD,
+ 0x8662, 0xEBBD,
+ 0x866B, 0xB3E6,
+ 0x866C, 0xF2B0,
+ 0x866E, 0xF2B1,
+ 0x8671, 0xCAAD,
+ 0x8679, 0xBAE7,
+ 0x867A, 0xF2B3,
+ 0x867B, 0xF2B5,
+ 0x867C, 0xF2B4,
+ 0x867D, 0xCBE4,
+ 0x867E, 0xCFBA,
+ 0x867F, 0xF2B2,
+ 0x8680, 0xCAB4,
+ 0x8681, 0xD2CF,
+ 0x8682, 0xC2EC,
+ 0x868A, 0xCEC3,
+ 0x868B, 0xF2B8,
+ 0x868C, 0xB0F6,
+ 0x868D, 0xF2B7,
+ 0x8693, 0xF2BE,
+ 0x8695, 0xB2CF,
+ 0x869C, 0xD1C1,
+ 0x869D, 0xF2BA,
+ 0x86A3, 0xF2BC,
+ 0x86A4, 0xD4E9,
+ 0x86A7, 0xF2BB,
+ 0x86A8, 0xF2B6,
+ 0x86A9, 0xF2BF,
+ 0x86AA, 0xF2BD,
+ 0x86AC, 0xF2B9,
+ 0x86AF, 0xF2C7,
+ 0x86B0, 0xF2C4,
+ 0x86B1, 0xF2C6,
+ 0x86B4, 0xF2CA,
+ 0x86B5, 0xF2C2,
+ 0x86B6, 0xF2C0,
+ 0x86BA, 0xF2C5,
+ 0x86C0, 0xD6FB,
+ 0x86C4, 0xF2C1,
+ 0x86C6, 0xC7F9,
+ 0x86C7, 0xC9DF,
+ 0x86C9, 0xF2C8,
+ 0x86CA, 0xB9C6,
+ 0x86CB, 0xB5B0,
+ 0x86CE, 0xF2C3,
+ 0x86CF, 0xF2C9,
+ 0x86D0, 0xF2D0,
+ 0x86D1, 0xF2D6,
+ 0x86D4, 0xBBD7,
+ 0x86D8, 0xF2D5,
+ 0x86D9, 0xCDDC,
+ 0x86DB, 0xD6EB,
+ 0x86DE, 0xF2D2,
+ 0x86DF, 0xF2D4,
+ 0x86E4, 0xB8F2,
+ 0x86E9, 0xF2CB,
+ 0x86ED, 0xF2CE,
+ 0x86EE, 0xC2F9,
+ 0x86F0, 0xD5DD,
+ 0x86F1, 0xF2CC,
+ 0x86F2, 0xF2CD,
+ 0x86F3, 0xF2CF,
+ 0x86F4, 0xF2D3,
+ 0x86F8, 0xF2D9,
+ 0x86F9, 0xD3BC,
+ 0x86FE, 0xB6EA,
+ 0x8700, 0xCAF1,
+ 0x8702, 0xB7E4,
+ 0x8703, 0xF2D7,
+ 0x8707, 0xF2D8,
+ 0x8708, 0xF2DA,
+ 0x8709, 0xF2DD,
+ 0x870A, 0xF2DB,
+ 0x870D, 0xF2DC,
+ 0x8712, 0xD1D1,
+ 0x8713, 0xF2D1,
+ 0x8715, 0xCDC9,
+ 0x8717, 0xCECF,
+ 0x8718, 0xD6A9,
+ 0x871A, 0xF2E3,
+ 0x871C, 0xC3DB,
+ 0x871E, 0xF2E0,
+ 0x8721, 0xC0AF,
+ 0x8722, 0xF2EC,
+ 0x8723, 0xF2DE,
+ 0x8725, 0xF2E1,
+ 0x8729, 0xF2E8,
+ 0x872E, 0xF2E2,
+ 0x8731, 0xF2E7,
+ 0x8734, 0xF2E6,
+ 0x8737, 0xF2E9,
+ 0x873B, 0xF2DF,
+ 0x873E, 0xF2E4,
+ 0x873F, 0xF2EA,
+ 0x8747, 0xD3AC,
+ 0x8748, 0xF2E5,
+ 0x8749, 0xB2F5,
+ 0x874C, 0xF2F2,
+ 0x874E, 0xD0AB,
+ 0x8753, 0xF2F5,
+ 0x8757, 0xBBC8,
+ 0x8759, 0xF2F9,
+ 0x8760, 0xF2F0,
+ 0x8763, 0xF2F6,
+ 0x8764, 0xF2F8,
+ 0x8765, 0xF2FA,
+ 0x876E, 0xF2F3,
+ 0x8770, 0xF2F1,
+ 0x8774, 0xBAFB,
+ 0x8776, 0xB5FB,
+ 0x877B, 0xF2EF,
+ 0x877C, 0xF2F7,
+ 0x877D, 0xF2ED,
+ 0x877E, 0xF2EE,
+ 0x8782, 0xF2EB,
+ 0x8783, 0xF3A6,
+ 0x8785, 0xF3A3,
+ 0x8788, 0xF3A2,
+ 0x878B, 0xF2F4,
+ 0x878D, 0xC8DA,
+ 0x8793, 0xF2FB,
+ 0x8797, 0xF3A5,
+ 0x879F, 0xC3F8,
+ 0x87A8, 0xF2FD,
+ 0x87AB, 0xF3A7,
+ 0x87AC, 0xF3A9,
+ 0x87AD, 0xF3A4,
+ 0x87AF, 0xF2FC,
+ 0x87B3, 0xF3AB,
+ 0x87B5, 0xF3AA,
+ 0x87BA, 0xC2DD,
+ 0x87BD, 0xF3AE,
+ 0x87C0, 0xF3B0,
+ 0x87C6, 0xF3A1,
+ 0x87CA, 0xF3B1,
+ 0x87CB, 0xF3AC,
+ 0x87D1, 0xF3AF,
+ 0x87D2, 0xF2FE,
+ 0x87D3, 0xF3AD,
+ 0x87DB, 0xF3B2,
+ 0x87E0, 0xF3B4,
+ 0x87E5, 0xF3A8,
+ 0x87EA, 0xF3B3,
+ 0x87EE, 0xF3B5,
+ 0x87F9, 0xD0B7,
+ 0x87FE, 0xF3B8,
+ 0x8803, 0xD9F9,
+ 0x880A, 0xF3B9,
+ 0x8813, 0xF3B7,
+ 0x8815, 0xC8E4,
+ 0x8816, 0xF3B6,
+ 0x881B, 0xF3BA,
+ 0x8821, 0xF3BB,
+ 0x8822, 0xB4C0,
+ 0x8832, 0xEEC3,
+ 0x8839, 0xF3BC,
+ 0x883C, 0xF3BD,
+ 0x8840, 0xD1AA,
+ 0x8844, 0xF4AC,
+ 0x8845, 0xD0C6,
+ 0x884C, 0xD0D0,
+ 0x884D, 0xD1DC,
+ 0x8854, 0xCFCE,
+ 0x8857, 0xBDD6,
+ 0x8859, 0xD1C3,
+ 0x8861, 0xBAE2,
+ 0x8862, 0xE1E9,
+ 0x8863, 0xD2C2,
+ 0x8864, 0xF1C2,
+ 0x8865, 0xB2B9,
+ 0x8868, 0xB1ED,
+ 0x8869, 0xF1C3,
+ 0x886B, 0xC9C0,
+ 0x886C, 0xB3C4,
+ 0x886E, 0xD9F2,
+ 0x8870, 0xCBA5,
+ 0x8872, 0xF1C4,
+ 0x8877, 0xD6D4,
+ 0x887D, 0xF1C5,
+ 0x887E, 0xF4C0,
+ 0x887F, 0xF1C6,
+ 0x8881, 0xD4AC,
+ 0x8882, 0xF1C7,
+ 0x8884, 0xB0C0,
+ 0x8885, 0xF4C1,
+ 0x8888, 0xF4C2,
+ 0x888B, 0xB4FC,
+ 0x888D, 0xC5DB,
+ 0x8892, 0xCCBB,
+ 0x8896, 0xD0E4,
+ 0x889C, 0xCDE0,
+ 0x88A2, 0xF1C8,
+ 0x88A4, 0xD9F3,
+ 0x88AB, 0xB1BB,
+ 0x88AD, 0xCFAE,
+ 0x88B1, 0xB8A4,
+ 0x88B7, 0xF1CA,
+ 0x88BC, 0xF1CB,
+ 0x88C1, 0xB2C3,
+ 0x88C2, 0xC1D1,
+ 0x88C5, 0xD7B0,
+ 0x88C6, 0xF1C9,
+ 0x88C9, 0xF1CC,
+ 0x88CE, 0xF1CE,
+ 0x88D2, 0xD9F6,
+ 0x88D4, 0xD2E1,
+ 0x88D5, 0xD4A3,
+ 0x88D8, 0xF4C3,
+ 0x88D9, 0xC8B9,
+ 0x88DF, 0xF4C4,
+ 0x88E2, 0xF1CD,
+ 0x88E3, 0xF1CF,
+ 0x88E4, 0xBFE3,
+ 0x88E5, 0xF1D0,
+ 0x88E8, 0xF1D4,
+ 0x88F0, 0xF1D6,
+ 0x88F1, 0xF1D1,
+ 0x88F3, 0xC9D1,
+ 0x88F4, 0xC5E1,
+ 0x88F8, 0xC2E3,
+ 0x88F9, 0xB9FC,
+ 0x88FC, 0xF1D3,
+ 0x88FE, 0xF1D5,
+ 0x8902, 0xB9D3,
+ 0x890A, 0xF1DB,
+ 0x8910, 0xBAD6,
+ 0x8912, 0xB0FD,
+ 0x8913, 0xF1D9,
+ 0x8919, 0xF1D8,
+ 0x891A, 0xF1D2,
+ 0x891B, 0xF1DA,
+ 0x8921, 0xF1D7,
+ 0x8925, 0xC8EC,
+ 0x892A, 0xCDCA,
+ 0x892B, 0xF1DD,
+ 0x8930, 0xE5BD,
+ 0x8934, 0xF1DC,
+ 0x8936, 0xF1DE,
+ 0x8941, 0xF1DF,
+ 0x8944, 0xCFE5,
+ 0x895E, 0xF4C5,
+ 0x895F, 0xBDF3,
+ 0x8966, 0xF1E0,
+ 0x897B, 0xF1E1,
+ 0x897F, 0xCEF7,
+ 0x8981, 0xD2AA,
+ 0x8983, 0xF1FB,
+ 0x8986, 0xB8B2,
+ 0x89C1, 0xBCFB,
+ 0x89C2, 0xB9DB,
+ 0x89C4, 0xB9E6,
+ 0x89C5, 0xC3D9,
+ 0x89C6, 0xCAD3,
+ 0x89C7, 0xEAE8,
+ 0x89C8, 0xC0C0,
+ 0x89C9, 0xBEF5,
+ 0x89CA, 0xEAE9,
+ 0x89CB, 0xEAEA,
+ 0x89CC, 0xEAEB,
+ 0x89CE, 0xEAEC,
+ 0x89CF, 0xEAED,
+ 0x89D0, 0xEAEE,
+ 0x89D1, 0xEAEF,
+ 0x89D2, 0xBDC7,
+ 0x89D6, 0xF5FB,
+ 0x89DA, 0xF5FD,
+ 0x89DC, 0xF5FE,
+ 0x89DE, 0xF5FC,
+ 0x89E3, 0xBDE2,
+ 0x89E5, 0xF6A1,
+ 0x89E6, 0xB4A5,
+ 0x89EB, 0xF6A2,
+ 0x89EF, 0xF6A3,
+ 0x89F3, 0xECB2,
+ 0x8A00, 0xD1D4,
+ 0x8A07, 0xD9EA,
+ 0x8A3E, 0xF6A4,
+ 0x8A48, 0xEEBA,
+ 0x8A79, 0xD5B2,
+ 0x8A89, 0xD3FE,
+ 0x8A8A, 0xCCDC,
+ 0x8A93, 0xCAC4,
+ 0x8B07, 0xE5C0,
+ 0x8B26, 0xF6A5,
+ 0x8B66, 0xBEAF,
+ 0x8B6C, 0xC6A9,
+ 0x8BA0, 0xDAA5,
+ 0x8BA1, 0xBCC6,
+ 0x8BA2, 0xB6A9,
+ 0x8BA3, 0xB8BC,
+ 0x8BA4, 0xC8CF,
+ 0x8BA5, 0xBCA5,
+ 0x8BA6, 0xDAA6,
+ 0x8BA7, 0xDAA7,
+ 0x8BA8, 0xCCD6,
+ 0x8BA9, 0xC8C3,
+ 0x8BAA, 0xDAA8,
+ 0x8BAB, 0xC6FD,
+ 0x8BAD, 0xD1B5,
+ 0x8BAE, 0xD2E9,
+ 0x8BAF, 0xD1B6,
+ 0x8BB0, 0xBCC7,
+ 0x8BB2, 0xBDB2,
+ 0x8BB3, 0xBBE4,
+ 0x8BB4, 0xDAA9,
+ 0x8BB5, 0xDAAA,
+ 0x8BB6, 0xD1C8,
+ 0x8BB7, 0xDAAB,
+ 0x8BB8, 0xD0ED,
+ 0x8BB9, 0xB6EF,
+ 0x8BBA, 0xC2DB,
+ 0x8BBC, 0xCBCF,
+ 0x8BBD, 0xB7ED,
+ 0x8BBE, 0xC9E8,
+ 0x8BBF, 0xB7C3,
+ 0x8BC0, 0xBEF7,
+ 0x8BC1, 0xD6A4,
+ 0x8BC2, 0xDAAC,
+ 0x8BC3, 0xDAAD,
+ 0x8BC4, 0xC6C0,
+ 0x8BC5, 0xD7E7,
+ 0x8BC6, 0xCAB6,
+ 0x8BC8, 0xD5A9,
+ 0x8BC9, 0xCBDF,
+ 0x8BCA, 0xD5EF,
+ 0x8BCB, 0xDAAE,
+ 0x8BCC, 0xD6DF,
+ 0x8BCD, 0xB4CA,
+ 0x8BCE, 0xDAB0,
+ 0x8BCF, 0xDAAF,
+ 0x8BD1, 0xD2EB,
+ 0x8BD2, 0xDAB1,
+ 0x8BD3, 0xDAB2,
+ 0x8BD4, 0xDAB3,
+ 0x8BD5, 0xCAD4,
+ 0x8BD6, 0xDAB4,
+ 0x8BD7, 0xCAAB,
+ 0x8BD8, 0xDAB5,
+ 0x8BD9, 0xDAB6,
+ 0x8BDA, 0xB3CF,
+ 0x8BDB, 0xD6EF,
+ 0x8BDC, 0xDAB7,
+ 0x8BDD, 0xBBB0,
+ 0x8BDE, 0xB5AE,
+ 0x8BDF, 0xDAB8,
+ 0x8BE0, 0xDAB9,
+ 0x8BE1, 0xB9EE,
+ 0x8BE2, 0xD1AF,
+ 0x8BE3, 0xD2E8,
+ 0x8BE4, 0xDABA,
+ 0x8BE5, 0xB8C3,
+ 0x8BE6, 0xCFEA,
+ 0x8BE7, 0xB2EF,
+ 0x8BE8, 0xDABB,
+ 0x8BE9, 0xDABC,
+ 0x8BEB, 0xBDEB,
+ 0x8BEC, 0xCEDC,
+ 0x8BED, 0xD3EF,
+ 0x8BEE, 0xDABD,
+ 0x8BEF, 0xCEF3,
+ 0x8BF0, 0xDABE,
+ 0x8BF1, 0xD3D5,
+ 0x8BF2, 0xBBE5,
+ 0x8BF3, 0xDABF,
+ 0x8BF4, 0xCBB5,
+ 0x8BF5, 0xCBD0,
+ 0x8BF6, 0xDAC0,
+ 0x8BF7, 0xC7EB,
+ 0x8BF8, 0xD6EE,
+ 0x8BF9, 0xDAC1,
+ 0x8BFA, 0xC5B5,
+ 0x8BFB, 0xB6C1,
+ 0x8BFC, 0xDAC2,
+ 0x8BFD, 0xB7CC,
+ 0x8BFE, 0xBFCE,
+ 0x8BFF, 0xDAC3,
+ 0x8C00, 0xDAC4,
+ 0x8C01, 0xCBAD,
+ 0x8C02, 0xDAC5,
+ 0x8C03, 0xB5F7,
+ 0x8C04, 0xDAC6,
+ 0x8C05, 0xC1C2,
+ 0x8C06, 0xD7BB,
+ 0x8C07, 0xDAC7,
+ 0x8C08, 0xCCB8,
+ 0x8C0A, 0xD2EA,
+ 0x8C0B, 0xC4B1,
+ 0x8C0C, 0xDAC8,
+ 0x8C0D, 0xB5FD,
+ 0x8C0E, 0xBBD1,
+ 0x8C0F, 0xDAC9,
+ 0x8C10, 0xD0B3,
+ 0x8C11, 0xDACA,
+ 0x8C12, 0xDACB,
+ 0x8C13, 0xCEBD,
+ 0x8C14, 0xDACC,
+ 0x8C15, 0xDACD,
+ 0x8C16, 0xDACE,
+ 0x8C17, 0xB2F7,
+ 0x8C18, 0xDAD1,
+ 0x8C19, 0xDACF,
+ 0x8C1A, 0xD1E8,
+ 0x8C1B, 0xDAD0,
+ 0x8C1C, 0xC3D5,
+ 0x8C1D, 0xDAD2,
+ 0x8C1F, 0xDAD3,
+ 0x8C20, 0xDAD4,
+ 0x8C21, 0xDAD5,
+ 0x8C22, 0xD0BB,
+ 0x8C23, 0xD2A5,
+ 0x8C24, 0xB0F9,
+ 0x8C25, 0xDAD6,
+ 0x8C26, 0xC7AB,
+ 0x8C27, 0xDAD7,
+ 0x8C28, 0xBDF7,
+ 0x8C29, 0xC3A1,
+ 0x8C2A, 0xDAD8,
+ 0x8C2B, 0xDAD9,
+ 0x8C2C, 0xC3FD,
+ 0x8C2D, 0xCCB7,
+ 0x8C2E, 0xDADA,
+ 0x8C2F, 0xDADB,
+ 0x8C30, 0xC0BE,
+ 0x8C31, 0xC6D7,
+ 0x8C32, 0xDADC,
+ 0x8C33, 0xDADD,
+ 0x8C34, 0xC7B4,
+ 0x8C35, 0xDADE,
+ 0x8C36, 0xDADF,
+ 0x8C37, 0xB9C8,
+ 0x8C41, 0xBBED,
+ 0x8C46, 0xB6B9,
+ 0x8C47, 0xF4F8,
+ 0x8C49, 0xF4F9,
+ 0x8C4C, 0xCDE3,
+ 0x8C55, 0xF5B9,
+ 0x8C5A, 0xEBE0,
+ 0x8C61, 0xCFF3,
+ 0x8C62, 0xBBBF,
+ 0x8C6A, 0xBAC0,
+ 0x8C6B, 0xD4A5,
+ 0x8C73, 0xE1D9,
+ 0x8C78, 0xF5F4,
+ 0x8C79, 0xB1AA,
+ 0x8C7A, 0xB2F2,
+ 0x8C82, 0xF5F5,
+ 0x8C85, 0xF5F7,
+ 0x8C89, 0xBAD1,
+ 0x8C8A, 0xF5F6,
+ 0x8C8C, 0xC3B2,
+ 0x8C94, 0xF5F9,
+ 0x8C98, 0xF5F8,
+ 0x8D1D, 0xB1B4,
+ 0x8D1E, 0xD5EA,
+ 0x8D1F, 0xB8BA,
+ 0x8D21, 0xB9B1,
+ 0x8D22, 0xB2C6,
+ 0x8D23, 0xD4F0,
+ 0x8D24, 0xCFCD,
+ 0x8D25, 0xB0DC,
+ 0x8D26, 0xD5CB,
+ 0x8D27, 0xBBF5,
+ 0x8D28, 0xD6CA,
+ 0x8D29, 0xB7B7,
+ 0x8D2A, 0xCCB0,
+ 0x8D2B, 0xC6B6,
+ 0x8D2C, 0xB1E1,
+ 0x8D2D, 0xB9BA,
+ 0x8D2E, 0xD6FC,
+ 0x8D2F, 0xB9E1,
+ 0x8D30, 0xB7A1,
+ 0x8D31, 0xBCFA,
+ 0x8D32, 0xEADA,
+ 0x8D33, 0xEADB,
+ 0x8D34, 0xCCF9,
+ 0x8D35, 0xB9F3,
+ 0x8D36, 0xEADC,
+ 0x8D37, 0xB4FB,
+ 0x8D38, 0xC3B3,
+ 0x8D39, 0xB7D1,
+ 0x8D3A, 0xBAD8,
+ 0x8D3B, 0xEADD,
+ 0x8D3C, 0xD4F4,
+ 0x8D3D, 0xEADE,
+ 0x8D3E, 0xBCD6,
+ 0x8D3F, 0xBBDF,
+ 0x8D40, 0xEADF,
+ 0x8D41, 0xC1DE,
+ 0x8D42, 0xC2B8,
+ 0x8D43, 0xD4DF,
+ 0x8D44, 0xD7CA,
+ 0x8D45, 0xEAE0,
+ 0x8D46, 0xEAE1,
+ 0x8D47, 0xEAE4,
+ 0x8D48, 0xEAE2,
+ 0x8D49, 0xEAE3,
+ 0x8D4A, 0xC9DE,
+ 0x8D4B, 0xB8B3,
+ 0x8D4C, 0xB6C4,
+ 0x8D4D, 0xEAE5,
+ 0x8D4E, 0xCAEA,
+ 0x8D4F, 0xC9CD,
+ 0x8D50, 0xB4CD,
+ 0x8D53, 0xE2D9,
+ 0x8D54, 0xC5E2,
+ 0x8D55, 0xEAE6,
+ 0x8D56, 0xC0B5,
+ 0x8D58, 0xD7B8,
+ 0x8D59, 0xEAE7,
+ 0x8D5A, 0xD7AC,
+ 0x8D5B, 0xC8FC,
+ 0x8D5C, 0xD8D3,
+ 0x8D5D, 0xD8CD,
+ 0x8D5E, 0xD4DE,
+ 0x8D60, 0xD4F9,
+ 0x8D61, 0xC9C4,
+ 0x8D62, 0xD3AE,
+ 0x8D63, 0xB8D3,
+ 0x8D64, 0xB3E0,
+ 0x8D66, 0xC9E2,
+ 0x8D67, 0xF4F6,
+ 0x8D6B, 0xBAD5,
+ 0x8D6D, 0xF4F7,
+ 0x8D70, 0xD7DF,
+ 0x8D73, 0xF4F1,
+ 0x8D74, 0xB8B0,
+ 0x8D75, 0xD5D4,
+ 0x8D76, 0xB8CF,
+ 0x8D77, 0xC6F0,
+ 0x8D81, 0xB3C3,
+ 0x8D84, 0xF4F2,
+ 0x8D85, 0xB3AC,
+ 0x8D8A, 0xD4BD,
+ 0x8D8B, 0xC7F7,
+ 0x8D91, 0xF4F4,
+ 0x8D94, 0xF4F3,
+ 0x8D9F, 0xCCCB,
+ 0x8DA3, 0xC8A4,
+ 0x8DB1, 0xF4F5,
+ 0x8DB3, 0xD7E3,
+ 0x8DB4, 0xC5BF,
+ 0x8DB5, 0xF5C0,
+ 0x8DB8, 0xF5BB,
+ 0x8DBA, 0xF5C3,
+ 0x8DBC, 0xF5C2,
+ 0x8DBE, 0xD6BA,
+ 0x8DBF, 0xF5C1,
+ 0x8DC3, 0xD4BE,
+ 0x8DC4, 0xF5C4,
+ 0x8DC6, 0xF5CC,
+ 0x8DCB, 0xB0CF,
+ 0x8DCC, 0xB5F8,
+ 0x8DCE, 0xF5C9,
+ 0x8DCF, 0xF5CA,
+ 0x8DD1, 0xC5DC,
+ 0x8DD6, 0xF5C5,
+ 0x8DD7, 0xF5C6,
+ 0x8DDA, 0xF5C7,
+ 0x8DDB, 0xF5CB,
+ 0x8DDD, 0xBEE0,
+ 0x8DDE, 0xF5C8,
+ 0x8DDF, 0xB8FA,
+ 0x8DE3, 0xF5D0,
+ 0x8DE4, 0xF5D3,
+ 0x8DE8, 0xBFE7,
+ 0x8DEA, 0xB9F2,
+ 0x8DEB, 0xF5BC,
+ 0x8DEC, 0xF5CD,
+ 0x8DEF, 0xC2B7,
+ 0x8DF3, 0xCCF8,
+ 0x8DF5, 0xBCF9,
+ 0x8DF7, 0xF5CE,
+ 0x8DF8, 0xF5CF,
+ 0x8DF9, 0xF5D1,
+ 0x8DFA, 0xB6E5,
+ 0x8DFB, 0xF5D2,
+ 0x8DFD, 0xF5D5,
+ 0x8E05, 0xF5BD,
+ 0x8E09, 0xF5D4,
+ 0x8E0A, 0xD3BB,
+ 0x8E0C, 0xB3EC,
+ 0x8E0F, 0xCCA4,
+ 0x8E14, 0xF5D6,
+ 0x8E1D, 0xF5D7,
+ 0x8E1E, 0xBEE1,
+ 0x8E1F, 0xF5D8,
+ 0x8E22, 0xCCDF,
+ 0x8E23, 0xF5DB,
+ 0x8E29, 0xB2C8,
+ 0x8E2A, 0xD7D9,
+ 0x8E2C, 0xF5D9,
+ 0x8E2E, 0xF5DA,
+ 0x8E2F, 0xF5DC,
+ 0x8E31, 0xF5E2,
+ 0x8E35, 0xF5E0,
+ 0x8E39, 0xF5DF,
+ 0x8E3A, 0xF5DD,
+ 0x8E3D, 0xF5E1,
+ 0x8E40, 0xF5DE,
+ 0x8E41, 0xF5E4,
+ 0x8E42, 0xF5E5,
+ 0x8E44, 0xCCE3,
+ 0x8E47, 0xE5BF,
+ 0x8E48, 0xB5B8,
+ 0x8E49, 0xF5E3,
+ 0x8E4A, 0xF5E8,
+ 0x8E4B, 0xCCA3,
+ 0x8E51, 0xF5E6,
+ 0x8E52, 0xF5E7,
+ 0x8E59, 0xF5BE,
+ 0x8E66, 0xB1C4,
+ 0x8E69, 0xF5BF,
+ 0x8E6C, 0xB5C5,
+ 0x8E6D, 0xB2E4,
+ 0x8E6F, 0xF5EC,
+ 0x8E70, 0xF5E9,
+ 0x8E72, 0xB6D7,
+ 0x8E74, 0xF5ED,
+ 0x8E76, 0xF5EA,
+ 0x8E7C, 0xF5EB,
+ 0x8E7F, 0xB4DA,
+ 0x8E81, 0xD4EA,
+ 0x8E85, 0xF5EE,
+ 0x8E87, 0xB3F9,
+ 0x8E8F, 0xF5EF,
+ 0x8E90, 0xF5F1,
+ 0x8E94, 0xF5F0,
+ 0x8E9C, 0xF5F2,
+ 0x8E9E, 0xF5F3,
+ 0x8EAB, 0xC9ED,
+ 0x8EAC, 0xB9AA,
+ 0x8EAF, 0xC7FB,
+ 0x8EB2, 0xB6E3,
+ 0x8EBA, 0xCCC9,
+ 0x8ECE, 0xEAA6,
+ 0x8F66, 0xB3B5,
+ 0x8F67, 0xD4FE,
+ 0x8F68, 0xB9EC,
+ 0x8F69, 0xD0F9,
+ 0x8F6B, 0xE9ED,
+ 0x8F6C, 0xD7AA,
+ 0x8F6D, 0xE9EE,
+ 0x8F6E, 0xC2D6,
+ 0x8F6F, 0xC8ED,
+ 0x8F70, 0xBAE4,
+ 0x8F71, 0xE9EF,
+ 0x8F72, 0xE9F0,
+ 0x8F73, 0xE9F1,
+ 0x8F74, 0xD6E1,
+ 0x8F75, 0xE9F2,
+ 0x8F76, 0xE9F3,
+ 0x8F77, 0xE9F5,
+ 0x8F78, 0xE9F4,
+ 0x8F79, 0xE9F6,
+ 0x8F7A, 0xE9F7,
+ 0x8F7B, 0xC7E1,
+ 0x8F7C, 0xE9F8,
+ 0x8F7D, 0xD4D8,
+ 0x8F7E, 0xE9F9,
+ 0x8F7F, 0xBDCE,
+ 0x8F81, 0xE9FA,
+ 0x8F82, 0xE9FB,
+ 0x8F83, 0xBDCF,
+ 0x8F84, 0xE9FC,
+ 0x8F85, 0xB8A8,
+ 0x8F86, 0xC1BE,
+ 0x8F87, 0xE9FD,
+ 0x8F88, 0xB1B2,
+ 0x8F89, 0xBBD4,
+ 0x8F8A, 0xB9F5,
+ 0x8F8B, 0xE9FE,
+ 0x8F8D, 0xEAA1,
+ 0x8F8E, 0xEAA2,
+ 0x8F8F, 0xEAA3,
+ 0x8F90, 0xB7F8,
+ 0x8F91, 0xBCAD,
+ 0x8F93, 0xCAE4,
+ 0x8F94, 0xE0CE,
+ 0x8F95, 0xD4AF,
+ 0x8F96, 0xCFBD,
+ 0x8F97, 0xD5B7,
+ 0x8F98, 0xEAA4,
+ 0x8F99, 0xD5DE,
+ 0x8F9A, 0xEAA5,
+ 0x8F9B, 0xD0C1,
+ 0x8F9C, 0xB9BC,
+ 0x8F9E, 0xB4C7,
+ 0x8F9F, 0xB1D9,
+ 0x8FA3, 0xC0B1,
+ 0x8FA8, 0xB1E6,
+ 0x8FA9, 0xB1E7,
+ 0x8FAB, 0xB1E8,
+ 0x8FB0, 0xB3BD,
+ 0x8FB1, 0xC8E8,
+ 0x8FB6, 0xE5C1,
+ 0x8FB9, 0xB1DF,
+ 0x8FBD, 0xC1C9,
+ 0x8FBE, 0xB4EF,
+ 0x8FC1, 0xC7A8,
+ 0x8FC2, 0xD3D8,
+ 0x8FC4, 0xC6F9,
+ 0x8FC5, 0xD1B8,
+ 0x8FC7, 0xB9FD,
+ 0x8FC8, 0xC2F5,
+ 0x8FCE, 0xD3AD,
+ 0x8FD0, 0xD4CB,
+ 0x8FD1, 0xBDFC,
+ 0x8FD3, 0xE5C2,
+ 0x8FD4, 0xB7B5,
+ 0x8FD5, 0xE5C3,
+ 0x8FD8, 0xBBB9,
+ 0x8FD9, 0xD5E2,
+ 0x8FDB, 0xBDF8,
+ 0x8FDC, 0xD4B6,
+ 0x8FDD, 0xCEA5,
+ 0x8FDE, 0xC1AC,
+ 0x8FDF, 0xB3D9,
+ 0x8FE2, 0xCCF6,
+ 0x8FE4, 0xE5C6,
+ 0x8FE5, 0xE5C4,
+ 0x8FE6, 0xE5C8,
+ 0x8FE8, 0xE5CA,
+ 0x8FE9, 0xE5C7,
+ 0x8FEA, 0xB5CF,
+ 0x8FEB, 0xC6C8,
+ 0x8FED, 0xB5FC,
+ 0x8FEE, 0xE5C5,
+ 0x8FF0, 0xCAF6,
+ 0x8FF3, 0xE5C9,
+ 0x8FF7, 0xC3D4,
+ 0x8FF8, 0xB1C5,
+ 0x8FF9, 0xBCA3,
+ 0x8FFD, 0xD7B7,
+ 0x9000, 0xCDCB,
+ 0x9001, 0xCBCD,
+ 0x9002, 0xCACA,
+ 0x9003, 0xCCD3,
+ 0x9004, 0xE5CC,
+ 0x9005, 0xE5CB,
+ 0x9006, 0xC4E6,
+ 0x9009, 0xD1A1,
+ 0x900A, 0xD1B7,
+ 0x900B, 0xE5CD,
+ 0x900D, 0xE5D0,
+ 0x900F, 0xCDB8,
+ 0x9010, 0xD6F0,
+ 0x9011, 0xE5CF,
+ 0x9012, 0xB5DD,
+ 0x9014, 0xCDBE,
+ 0x9016, 0xE5D1,
+ 0x9017, 0xB6BA,
+ 0x901A, 0xCDA8,
+ 0x901B, 0xB9E4,
+ 0x901D, 0xCAC5,
+ 0x901E, 0xB3D1,
+ 0x901F, 0xCBD9,
+ 0x9020, 0xD4EC,
+ 0x9021, 0xE5D2,
+ 0x9022, 0xB7EA,
+ 0x9026, 0xE5CE,
+ 0x902D, 0xE5D5,
+ 0x902E, 0xB4FE,
+ 0x902F, 0xE5D6,
+ 0x9035, 0xE5D3,
+ 0x9036, 0xE5D4,
+ 0x9038, 0xD2DD,
+ 0x903B, 0xC2DF,
+ 0x903C, 0xB1C6,
+ 0x903E, 0xD3E2,
+ 0x9041, 0xB6DD,
+ 0x9042, 0xCBEC,
+ 0x9044, 0xE5D7,
+ 0x9047, 0xD3F6,
+ 0x904D, 0xB1E9,
+ 0x904F, 0xB6F4,
+ 0x9050, 0xE5DA,
+ 0x9051, 0xE5D8,
+ 0x9052, 0xE5D9,
+ 0x9053, 0xB5C0,
+ 0x9057, 0xD2C5,
+ 0x9058, 0xE5DC,
+ 0x905B, 0xE5DE,
+ 0x9062, 0xE5DD,
+ 0x9063, 0xC7B2,
+ 0x9065, 0xD2A3,
+ 0x9068, 0xE5DB,
+ 0x906D, 0xD4E2,
+ 0x906E, 0xD5DA,
+ 0x9074, 0xE5E0,
+ 0x9075, 0xD7F1,
+ 0x907D, 0xE5E1,
+ 0x907F, 0xB1DC,
+ 0x9080, 0xD1FB,
+ 0x9082, 0xE5E2,
+ 0x9083, 0xE5E4,
+ 0x9088, 0xE5E3,
+ 0x908B, 0xE5E5,
+ 0x9091, 0xD2D8,
+ 0x9093, 0xB5CB,
+ 0x9095, 0xE7DF,
+ 0x9097, 0xDAF5,
+ 0x9099, 0xDAF8,
+ 0x909B, 0xDAF6,
+ 0x909D, 0xDAF7,
+ 0x90A1, 0xDAFA,
+ 0x90A2, 0xD0CF,
+ 0x90A3, 0xC4C7,
+ 0x90A6, 0xB0EE,
+ 0x90AA, 0xD0B0,
+ 0x90AC, 0xDAF9,
+ 0x90AE, 0xD3CA,
+ 0x90AF, 0xBAAA,
+ 0x90B0, 0xDBA2,
+ 0x90B1, 0xC7F1,
+ 0x90B3, 0xDAFC,
+ 0x90B4, 0xDAFB,
+ 0x90B5, 0xC9DB,
+ 0x90B6, 0xDAFD,
+ 0x90B8, 0xDBA1,
+ 0x90B9, 0xD7DE,
+ 0x90BA, 0xDAFE,
+ 0x90BB, 0xC1DA,
+ 0x90BE, 0xDBA5,
+ 0x90C1, 0xD3F4,
+ 0x90C4, 0xDBA7,
+ 0x90C5, 0xDBA4,
+ 0x90C7, 0xDBA8,
+ 0x90CA, 0xBDBC,
+ 0x90CE, 0xC0C9,
+ 0x90CF, 0xDBA3,
+ 0x90D0, 0xDBA6,
+ 0x90D1, 0xD6A3,
+ 0x90D3, 0xDBA9,
+ 0x90D7, 0xDBAD,
+ 0x90DB, 0xDBAE,
+ 0x90DC, 0xDBAC,
+ 0x90DD, 0xBAC2,
+ 0x90E1, 0xBFA4,
+ 0x90E2, 0xDBAB,
+ 0x90E6, 0xDBAA,
+ 0x90E7, 0xD4C7,
+ 0x90E8, 0xB2BF,
+ 0x90EB, 0xDBAF,
+ 0x90ED, 0xB9F9,
+ 0x90EF, 0xDBB0,
+ 0x90F4, 0xB3BB,
+ 0x90F8, 0xB5A6,
+ 0x90FD, 0xB6BC,
+ 0x90FE, 0xDBB1,
+ 0x9102, 0xB6F5,
+ 0x9104, 0xDBB2,
+ 0x9119, 0xB1C9,
+ 0x911E, 0xDBB4,
+ 0x9122, 0xDBB3,
+ 0x9123, 0xDBB5,
+ 0x912F, 0xDBB7,
+ 0x9131, 0xDBB6,
+ 0x9139, 0xDBB8,
+ 0x9143, 0xDBB9,
+ 0x9146, 0xDBBA,
+ 0x9149, 0xD3CF,
+ 0x914A, 0xF4FA,
+ 0x914B, 0xC7F5,
+ 0x914C, 0xD7C3,
+ 0x914D, 0xC5E4,
+ 0x914E, 0xF4FC,
+ 0x914F, 0xF4FD,
+ 0x9150, 0xF4FB,
+ 0x9152, 0xBEC6,
+ 0x9157, 0xD0EF,
+ 0x915A, 0xB7D3,
+ 0x915D, 0xD4CD,
+ 0x915E, 0xCCAA,
+ 0x9161, 0xF5A2,
+ 0x9162, 0xF5A1,
+ 0x9163, 0xBAA8,
+ 0x9164, 0xF4FE,
+ 0x9165, 0xCBD6,
+ 0x9169, 0xF5A4,
+ 0x916A, 0xC0D2,
+ 0x916C, 0xB3EA,
+ 0x916E, 0xCDAA,
+ 0x916F, 0xF5A5,
+ 0x9170, 0xF5A3,
+ 0x9171, 0xBDB4,
+ 0x9172, 0xF5A8,
+ 0x9174, 0xF5A9,
+ 0x9175, 0xBDCD,
+ 0x9176, 0xC3B8,
+ 0x9177, 0xBFE1,
+ 0x9178, 0xCBE1,
+ 0x9179, 0xF5AA,
+ 0x917D, 0xF5A6,
+ 0x917E, 0xF5A7,
+ 0x917F, 0xC4F0,
+ 0x9185, 0xF5AC,
+ 0x9187, 0xB4BC,
+ 0x9189, 0xD7ED,
+ 0x918B, 0xB4D7,
+ 0x918C, 0xF5AB,
+ 0x918D, 0xF5AE,
+ 0x9190, 0xF5AD,
+ 0x9191, 0xF5AF,
+ 0x9192, 0xD0D1,
+ 0x919A, 0xC3D1,
+ 0x919B, 0xC8A9,
+ 0x91A2, 0xF5B0,
+ 0x91A3, 0xF5B1,
+ 0x91AA, 0xF5B2,
+ 0x91AD, 0xF5B3,
+ 0x91AE, 0xF5B4,
+ 0x91AF, 0xF5B5,
+ 0x91B4, 0xF5B7,
+ 0x91B5, 0xF5B6,
+ 0x91BA, 0xF5B8,
+ 0x91C7, 0xB2C9,
+ 0x91C9, 0xD3D4,
+ 0x91CA, 0xCACD,
+ 0x91CC, 0xC0EF,
+ 0x91CD, 0xD6D8,
+ 0x91CE, 0xD2B0,
+ 0x91CF, 0xC1BF,
+ 0x91D1, 0xBDF0,
+ 0x91DC, 0xB8AA,
+ 0x9274, 0xBCF8,
+ 0x928E, 0xF6C6,
+ 0x92AE, 0xF6C7,
+ 0x92C8, 0xF6C8,
+ 0x933E, 0xF6C9,
+ 0x936A, 0xF6CA,
+ 0x938F, 0xF6CC,
+ 0x93CA, 0xF6CB,
+ 0x93D6, 0xF7E9,
+ 0x943E, 0xF6CD,
+ 0x946B, 0xF6CE,
+ 0x9485, 0xEEC4,
+ 0x9486, 0xEEC5,
+ 0x9487, 0xEEC6,
+ 0x9488, 0xD5EB,
+ 0x9489, 0xB6A4,
+ 0x948A, 0xEEC8,
+ 0x948B, 0xEEC7,
+ 0x948C, 0xEEC9,
+ 0x948D, 0xEECA,
+ 0x948E, 0xC7A5,
+ 0x948F, 0xEECB,
+ 0x9490, 0xEECC,
+ 0x9492, 0xB7B0,
+ 0x9493, 0xB5F6,
+ 0x9494, 0xEECD,
+ 0x9495, 0xEECF,
+ 0x9497, 0xEECE,
+ 0x9499, 0xB8C6,
+ 0x949A, 0xEED0,
+ 0x949B, 0xEED1,
+ 0x949C, 0xEED2,
+ 0x949D, 0xB6DB,
+ 0x949E, 0xB3AE,
+ 0x949F, 0xD6D3,
+ 0x94A0, 0xC4C6,
+ 0x94A1, 0xB1B5,
+ 0x94A2, 0xB8D6,
+ 0x94A3, 0xEED3,
+ 0x94A4, 0xEED4,
+ 0x94A5, 0xD4BF,
+ 0x94A6, 0xC7D5,
+ 0x94A7, 0xBEFB,
+ 0x94A8, 0xCED9,
+ 0x94A9, 0xB9B3,
+ 0x94AA, 0xEED6,
+ 0x94AB, 0xEED5,
+ 0x94AC, 0xEED8,
+ 0x94AD, 0xEED7,
+ 0x94AE, 0xC5A5,
+ 0x94AF, 0xEED9,
+ 0x94B0, 0xEEDA,
+ 0x94B1, 0xC7AE,
+ 0x94B2, 0xEEDB,
+ 0x94B3, 0xC7AF,
+ 0x94B4, 0xEEDC,
+ 0x94B5, 0xB2A7,
+ 0x94B6, 0xEEDD,
+ 0x94B7, 0xEEDE,
+ 0x94B8, 0xEEDF,
+ 0x94B9, 0xEEE0,
+ 0x94BA, 0xEEE1,
+ 0x94BB, 0xD7EA,
+ 0x94BC, 0xEEE2,
+ 0x94BD, 0xEEE3,
+ 0x94BE, 0xBCD8,
+ 0x94BF, 0xEEE4,
+ 0x94C0, 0xD3CB,
+ 0x94C1, 0xCCFA,
+ 0x94C2, 0xB2AC,
+ 0x94C3, 0xC1E5,
+ 0x94C4, 0xEEE5,
+ 0x94C5, 0xC7A6,
+ 0x94C6, 0xC3AD,
+ 0x94C8, 0xEEE6,
+ 0x94C9, 0xEEE7,
+ 0x94CA, 0xEEE8,
+ 0x94CB, 0xEEE9,
+ 0x94CC, 0xEEEA,
+ 0x94CD, 0xEEEB,
+ 0x94CE, 0xEEEC,
+ 0x94D0, 0xEEED,
+ 0x94D1, 0xEEEE,
+ 0x94D2, 0xEEEF,
+ 0x94D5, 0xEEF0,
+ 0x94D6, 0xEEF1,
+ 0x94D7, 0xEEF2,
+ 0x94D8, 0xEEF4,
+ 0x94D9, 0xEEF3,
+ 0x94DB, 0xEEF5,
+ 0x94DC, 0xCDAD,
+ 0x94DD, 0xC2C1,
+ 0x94DE, 0xEEF6,
+ 0x94DF, 0xEEF7,
+ 0x94E0, 0xEEF8,
+ 0x94E1, 0xD5A1,
+ 0x94E2, 0xEEF9,
+ 0x94E3, 0xCFB3,
+ 0x94E4, 0xEEFA,
+ 0x94E5, 0xEEFB,
+ 0x94E7, 0xEEFC,
+ 0x94E8, 0xEEFD,
+ 0x94E9, 0xEFA1,
+ 0x94EA, 0xEEFE,
+ 0x94EB, 0xEFA2,
+ 0x94EC, 0xB8F5,
+ 0x94ED, 0xC3FA,
+ 0x94EE, 0xEFA3,
+ 0x94EF, 0xEFA4,
+ 0x94F0, 0xBDC2,
+ 0x94F1, 0xD2BF,
+ 0x94F2, 0xB2F9,
+ 0x94F3, 0xEFA5,
+ 0x94F4, 0xEFA6,
+ 0x94F5, 0xEFA7,
+ 0x94F6, 0xD2F8,
+ 0x94F7, 0xEFA8,
+ 0x94F8, 0xD6FD,
+ 0x94F9, 0xEFA9,
+ 0x94FA, 0xC6CC,
+ 0x94FC, 0xEFAA,
+ 0x94FD, 0xEFAB,
+ 0x94FE, 0xC1B4,
+ 0x94FF, 0xEFAC,
+ 0x9500, 0xCFFA,
+ 0x9501, 0xCBF8,
+ 0x9502, 0xEFAE,
+ 0x9503, 0xEFAD,
+ 0x9504, 0xB3FA,
+ 0x9505, 0xB9F8,
+ 0x9506, 0xEFAF,
+ 0x9507, 0xEFB0,
+ 0x9508, 0xD0E2,
+ 0x9509, 0xEFB1,
+ 0x950A, 0xEFB2,
+ 0x950B, 0xB7E6,
+ 0x950C, 0xD0BF,
+ 0x950D, 0xEFB3,
+ 0x950E, 0xEFB4,
+ 0x950F, 0xEFB5,
+ 0x9510, 0xC8F1,
+ 0x9511, 0xCCE0,
+ 0x9512, 0xEFB6,
+ 0x9513, 0xEFB7,
+ 0x9514, 0xEFB8,
+ 0x9515, 0xEFB9,
+ 0x9516, 0xEFBA,
+ 0x9517, 0xD5E0,
+ 0x9518, 0xEFBB,
+ 0x9519, 0xB4ED,
+ 0x951A, 0xC3AA,
+ 0x951B, 0xEFBC,
+ 0x951D, 0xEFBD,
+ 0x951E, 0xEFBE,
+ 0x951F, 0xEFBF,
+ 0x9521, 0xCEFD,
+ 0x9522, 0xEFC0,
+ 0x9523, 0xC2E0,
+ 0x9524, 0xB4B8,
+ 0x9525, 0xD7B6,
+ 0x9526, 0xBDF5,
+ 0x9528, 0xCFC7,
+ 0x9529, 0xEFC3,
+ 0x952A, 0xEFC1,
+ 0x952B, 0xEFC2,
+ 0x952C, 0xEFC4,
+ 0x952D, 0xB6A7,
+ 0x952E, 0xBCFC,
+ 0x952F, 0xBEE2,
+ 0x9530, 0xC3CC,
+ 0x9531, 0xEFC5,
+ 0x9532, 0xEFC6,
+ 0x9534, 0xEFC7,
+ 0x9535, 0xEFCF,
+ 0x9536, 0xEFC8,
+ 0x9537, 0xEFC9,
+ 0x9538, 0xEFCA,
+ 0x9539, 0xC7C2,
+ 0x953A, 0xEFF1,
+ 0x953B, 0xB6CD,
+ 0x953C, 0xEFCB,
+ 0x953E, 0xEFCC,
+ 0x953F, 0xEFCD,
+ 0x9540, 0xB6C6,
+ 0x9541, 0xC3BE,
+ 0x9542, 0xEFCE,
+ 0x9544, 0xEFD0,
+ 0x9545, 0xEFD1,
+ 0x9546, 0xEFD2,
+ 0x9547, 0xD5F2,
+ 0x9549, 0xEFD3,
+ 0x954A, 0xC4F7,
+ 0x954C, 0xEFD4,
+ 0x954D, 0xC4F8,
+ 0x954E, 0xEFD5,
+ 0x954F, 0xEFD6,
+ 0x9550, 0xB8E4,
+ 0x9551, 0xB0F7,
+ 0x9552, 0xEFD7,
+ 0x9553, 0xEFD8,
+ 0x9554, 0xEFD9,
+ 0x9556, 0xEFDA,
+ 0x9557, 0xEFDB,
+ 0x9558, 0xEFDC,
+ 0x9559, 0xEFDD,
+ 0x955B, 0xEFDE,
+ 0x955C, 0xBEB5,
+ 0x955D, 0xEFE1,
+ 0x955E, 0xEFDF,
+ 0x955F, 0xEFE0,
+ 0x9561, 0xEFE2,
+ 0x9562, 0xEFE3,
+ 0x9563, 0xC1CD,
+ 0x9564, 0xEFE4,
+ 0x9565, 0xEFE5,
+ 0x9566, 0xEFE6,
+ 0x9567, 0xEFE7,
+ 0x9568, 0xEFE8,
+ 0x9569, 0xEFE9,
+ 0x956A, 0xEFEA,
+ 0x956B, 0xEFEB,
+ 0x956C, 0xEFEC,
+ 0x956D, 0xC0D8,
+ 0x956F, 0xEFED,
+ 0x9570, 0xC1AD,
+ 0x9571, 0xEFEE,
+ 0x9572, 0xEFEF,
+ 0x9573, 0xEFF0,
+ 0x9576, 0xCFE2,
+ 0x957F, 0xB3A4,
+ 0x95E8, 0xC3C5,
+ 0x95E9, 0xE3C5,
+ 0x95EA, 0xC9C1,
+ 0x95EB, 0xE3C6,
+ 0x95ED, 0xB1D5,
+ 0x95EE, 0xCECA,
+ 0x95EF, 0xB4B3,
+ 0x95F0, 0xC8F2,
+ 0x95F1, 0xE3C7,
+ 0x95F2, 0xCFD0,
+ 0x95F3, 0xE3C8,
+ 0x95F4, 0xBCE4,
+ 0x95F5, 0xE3C9,
+ 0x95F6, 0xE3CA,
+ 0x95F7, 0xC3C6,
+ 0x95F8, 0xD5A2,
+ 0x95F9, 0xC4D6,
+ 0x95FA, 0xB9EB,
+ 0x95FB, 0xCEC5,
+ 0x95FC, 0xE3CB,
+ 0x95FD, 0xC3F6,
+ 0x95FE, 0xE3CC,
+ 0x9600, 0xB7A7,
+ 0x9601, 0xB8F3,
+ 0x9602, 0xBAD2,
+ 0x9603, 0xE3CD,
+ 0x9604, 0xE3CE,
+ 0x9605, 0xD4C4,
+ 0x9606, 0xE3CF,
+ 0x9608, 0xE3D0,
+ 0x9609, 0xD1CB,
+ 0x960A, 0xE3D1,
+ 0x960B, 0xE3D2,
+ 0x960C, 0xE3D3,
+ 0x960D, 0xE3D4,
+ 0x960E, 0xD1D6,
+ 0x960F, 0xE3D5,
+ 0x9610, 0xB2FB,
+ 0x9611, 0xC0BB,
+ 0x9612, 0xE3D6,
+ 0x9614, 0xC0AB,
+ 0x9615, 0xE3D7,
+ 0x9616, 0xE3D8,
+ 0x9617, 0xE3D9,
+ 0x9619, 0xE3DA,
+ 0x961A, 0xE3DB,
+ 0x961C, 0xB8B7,
+ 0x961D, 0xDAE2,
+ 0x961F, 0xB6D3,
+ 0x9621, 0xDAE4,
+ 0x9622, 0xDAE3,
+ 0x962A, 0xDAE6,
+ 0x962E, 0xC8EE,
+ 0x9631, 0xDAE5,
+ 0x9632, 0xB7C0,
+ 0x9633, 0xD1F4,
+ 0x9634, 0xD2F5,
+ 0x9635, 0xD5F3,
+ 0x9636, 0xBDD7,
+ 0x963B, 0xD7E8,
+ 0x963C, 0xDAE8,
+ 0x963D, 0xDAE7,
+ 0x963F, 0xB0A2,
+ 0x9640, 0xCDD3,
+ 0x9642, 0xDAE9,
+ 0x9644, 0xB8BD,
+ 0x9645, 0xBCCA,
+ 0x9646, 0xC2BD,
+ 0x9647, 0xC2A4,
+ 0x9648, 0xB3C2,
+ 0x9649, 0xDAEA,
+ 0x964B, 0xC2AA,
+ 0x964C, 0xC4B0,
+ 0x964D, 0xBDB5,
+ 0x9650, 0xCFDE,
+ 0x9654, 0xDAEB,
+ 0x9655, 0xC9C2,
+ 0x965B, 0xB1DD,
+ 0x965F, 0xDAEC,
+ 0x9661, 0xB6B8,
+ 0x9662, 0xD4BA,
+ 0x9664, 0xB3FD,
+ 0x9667, 0xDAED,
+ 0x9668, 0xD4C9,
+ 0x9669, 0xCFD5,
+ 0x966A, 0xC5E3,
+ 0x966C, 0xDAEE,
+ 0x9672, 0xDAEF,
+ 0x9674, 0xDAF0,
+ 0x9675, 0xC1EA,
+ 0x9676, 0xCCD5,
+ 0x9677, 0xCFDD,
+ 0x9685, 0xD3E7,
+ 0x9686, 0xC2A1,
+ 0x9688, 0xDAF1,
+ 0x968B, 0xCBE5,
+ 0x968D, 0xDAF2,
+ 0x968F, 0xCBE6,
+ 0x9690, 0xD2FE,
+ 0x9694, 0xB8F4,
+ 0x9697, 0xDAF3,
+ 0x9698, 0xB0AF,
+ 0x9699, 0xCFB6,
+ 0x969C, 0xD5CF,
+ 0x96A7, 0xCBED,
+ 0x96B0, 0xDAF4,
+ 0x96B3, 0xE3C4,
+ 0x96B6, 0xC1A5,
+ 0x96B9, 0xF6BF,
+ 0x96BC, 0xF6C0,
+ 0x96BD, 0xF6C1,
+ 0x96BE, 0xC4D1,
+ 0x96C0, 0xC8B8,
+ 0x96C1, 0xD1E3,
+ 0x96C4, 0xD0DB,
+ 0x96C5, 0xD1C5,
+ 0x96C6, 0xBCAF,
+ 0x96C7, 0xB9CD,
+ 0x96C9, 0xEFF4,
+ 0x96CC, 0xB4C6,
+ 0x96CD, 0xD3BA,
+ 0x96CE, 0xF6C2,
+ 0x96CF, 0xB3FB,
+ 0x96D2, 0xF6C3,
+ 0x96D5, 0xB5F1,
+ 0x96E0, 0xF6C5,
+ 0x96E8, 0xD3EA,
+ 0x96E9, 0xF6A7,
+ 0x96EA, 0xD1A9,
+ 0x96EF, 0xF6A9,
+ 0x96F3, 0xF6A8,
+ 0x96F6, 0xC1E3,
+ 0x96F7, 0xC0D7,
+ 0x96F9, 0xB1A2,
+ 0x96FE, 0xCEED,
+ 0x9700, 0xD0E8,
+ 0x9701, 0xF6AB,
+ 0x9704, 0xCFF6,
+ 0x9706, 0xF6AA,
+ 0x9707, 0xD5F0,
+ 0x9708, 0xF6AC,
+ 0x9709, 0xC3B9,
+ 0x970D, 0xBBF4,
+ 0x970E, 0xF6AE,
+ 0x970F, 0xF6AD,
+ 0x9713, 0xC4DE,
+ 0x9716, 0xC1D8,
+ 0x971C, 0xCBAA,
+ 0x971E, 0xCFBC,
+ 0x972A, 0xF6AF,
+ 0x972D, 0xF6B0,
+ 0x9730, 0xF6B1,
+ 0x9732, 0xC2B6,
+ 0x9738, 0xB0D4,
+ 0x9739, 0xC5F9,
+ 0x973E, 0xF6B2,
+ 0x9752, 0xC7E0,
+ 0x9753, 0xF6A6,
+ 0x9756, 0xBEB8,
+ 0x9759, 0xBEB2,
+ 0x975B, 0xB5E5,
+ 0x975E, 0xB7C7,
+ 0x9760, 0xBFBF,
+ 0x9761, 0xC3D2,
+ 0x9762, 0xC3E6,
+ 0x9765, 0xD8CC,
+ 0x9769, 0xB8EF,
+ 0x9773, 0xBDF9,
+ 0x9774, 0xD1A5,
+ 0x9776, 0xB0D0,
+ 0x977C, 0xF7B0,
+ 0x9785, 0xF7B1,
+ 0x978B, 0xD0AC,
+ 0x978D, 0xB0B0,
+ 0x9791, 0xF7B2,
+ 0x9792, 0xF7B3,
+ 0x9794, 0xF7B4,
+ 0x9798, 0xC7CA,
+ 0x97A0, 0xBECF,
+ 0x97A3, 0xF7B7,
+ 0x97AB, 0xF7B6,
+ 0x97AD, 0xB1DE,
+ 0x97AF, 0xF7B5,
+ 0x97B2, 0xF7B8,
+ 0x97B4, 0xF7B9,
+ 0x97E6, 0xCEA4,
+ 0x97E7, 0xC8CD,
+ 0x97E9, 0xBAAB,
+ 0x97EA, 0xE8B8,
+ 0x97EB, 0xE8B9,
+ 0x97EC, 0xE8BA,
+ 0x97ED, 0xBEC2,
+ 0x97F3, 0xD2F4,
+ 0x97F5, 0xD4CF,
+ 0x97F6, 0xC9D8,
+ 0x9875, 0xD2B3,
+ 0x9876, 0xB6A5,
+ 0x9877, 0xC7EA,
+ 0x9878, 0xF1FC,
+ 0x9879, 0xCFEE,
+ 0x987A, 0xCBB3,
+ 0x987B, 0xD0EB,
+ 0x987C, 0xE7EF,
+ 0x987D, 0xCDE7,
+ 0x987E, 0xB9CB,
+ 0x987F, 0xB6D9,
+ 0x9880, 0xF1FD,
+ 0x9881, 0xB0E4,
+ 0x9882, 0xCBCC,
+ 0x9883, 0xF1FE,
+ 0x9884, 0xD4A4,
+ 0x9885, 0xC2AD,
+ 0x9886, 0xC1EC,
+ 0x9887, 0xC6C4,
+ 0x9888, 0xBEB1,
+ 0x9889, 0xF2A1,
+ 0x988A, 0xBCD5,
+ 0x988C, 0xF2A2,
+ 0x988D, 0xF2A3,
+ 0x988F, 0xF2A4,
+ 0x9890, 0xD2C3,
+ 0x9891, 0xC6B5,
+ 0x9893, 0xCDC7,
+ 0x9894, 0xF2A5,
+ 0x9896, 0xD3B1,
+ 0x9897, 0xBFC5,
+ 0x9898, 0xCCE2,
+ 0x989A, 0xF2A6,
+ 0x989B, 0xF2A7,
+ 0x989C, 0xD1D5,
+ 0x989D, 0xB6EE,
+ 0x989E, 0xF2A8,
+ 0x989F, 0xF2A9,
+ 0x98A0, 0xB5DF,
+ 0x98A1, 0xF2AA,
+ 0x98A2, 0xF2AB,
+ 0x98A4, 0xB2FC,
+ 0x98A5, 0xF2AC,
+ 0x98A6, 0xF2AD,
+ 0x98A7, 0xC8A7,
+ 0x98CE, 0xB7E7,
+ 0x98D1, 0xECA9,
+ 0x98D2, 0xECAA,
+ 0x98D3, 0xECAB,
+ 0x98D5, 0xECAC,
+ 0x98D8, 0xC6AE,
+ 0x98D9, 0xECAD,
+ 0x98DA, 0xECAE,
+ 0x98DE, 0xB7C9,
+ 0x98DF, 0xCAB3,
+ 0x98E7, 0xE2B8,
+ 0x98E8, 0xF7CF,
+ 0x990D, 0xF7D0,
+ 0x9910, 0xB2CD,
+ 0x992E, 0xF7D1,
+ 0x9954, 0xF7D3,
+ 0x9955, 0xF7D2,
+ 0x9963, 0xE2BB,
+ 0x9965, 0xBCA2,
+ 0x9967, 0xE2BC,
+ 0x9968, 0xE2BD,
+ 0x9969, 0xE2BE,
+ 0x996A, 0xE2BF,
+ 0x996B, 0xE2C0,
+ 0x996C, 0xE2C1,
+ 0x996D, 0xB7B9,
+ 0x996E, 0xD2FB,
+ 0x996F, 0xBDA4,
+ 0x9970, 0xCACE,
+ 0x9971, 0xB1A5,
+ 0x9972, 0xCBC7,
+ 0x9974, 0xE2C2,
+ 0x9975, 0xB6FC,
+ 0x9976, 0xC8C4,
+ 0x9977, 0xE2C3,
+ 0x997A, 0xBDC8,
+ 0x997C, 0xB1FD,
+ 0x997D, 0xE2C4,
+ 0x997F, 0xB6F6,
+ 0x9980, 0xE2C5,
+ 0x9981, 0xC4D9,
+ 0x9984, 0xE2C6,
+ 0x9985, 0xCFDA,
+ 0x9986, 0xB9DD,
+ 0x9987, 0xE2C7,
+ 0x9988, 0xC0A1,
+ 0x998A, 0xE2C8,
+ 0x998B, 0xB2F6,
+ 0x998D, 0xE2C9,
+ 0x998F, 0xC1F3,
+ 0x9990, 0xE2CA,
+ 0x9991, 0xE2CB,
+ 0x9992, 0xC2F8,
+ 0x9993, 0xE2CC,
+ 0x9994, 0xE2CD,
+ 0x9995, 0xE2CE,
+ 0x9996, 0xCAD7,
+ 0x9997, 0xD8B8,
+ 0x9998, 0xD9E5,
+ 0x9999, 0xCFE3,
+ 0x99A5, 0xF0A5,
+ 0x99A8, 0xDCB0,
+ 0x9A6C, 0xC2ED,
+ 0x9A6D, 0xD4A6,
+ 0x9A6E, 0xCDD4,
+ 0x9A6F, 0xD1B1,
+ 0x9A70, 0xB3DB,
+ 0x9A71, 0xC7FD,
+ 0x9A73, 0xB2B5,
+ 0x9A74, 0xC2BF,
+ 0x9A75, 0xE6E0,
+ 0x9A76, 0xCABB,
+ 0x9A77, 0xE6E1,
+ 0x9A78, 0xE6E2,
+ 0x9A79, 0xBED4,
+ 0x9A7A, 0xE6E3,
+ 0x9A7B, 0xD7A4,
+ 0x9A7C, 0xCDD5,
+ 0x9A7D, 0xE6E5,
+ 0x9A7E, 0xBCDD,
+ 0x9A7F, 0xE6E4,
+ 0x9A80, 0xE6E6,
+ 0x9A81, 0xE6E7,
+ 0x9A82, 0xC2EE,
+ 0x9A84, 0xBDBE,
+ 0x9A85, 0xE6E8,
+ 0x9A86, 0xC2E6,
+ 0x9A87, 0xBAA7,
+ 0x9A88, 0xE6E9,
+ 0x9A8A, 0xE6EA,
+ 0x9A8B, 0xB3D2,
+ 0x9A8C, 0xD1E9,
+ 0x9A8F, 0xBFA5,
+ 0x9A90, 0xE6EB,
+ 0x9A91, 0xC6EF,
+ 0x9A92, 0xE6EC,
+ 0x9A93, 0xE6ED,
+ 0x9A96, 0xE6EE,
+ 0x9A97, 0xC6AD,
+ 0x9A98, 0xE6EF,
+ 0x9A9A, 0xC9A7,
+ 0x9A9B, 0xE6F0,
+ 0x9A9C, 0xE6F1,
+ 0x9A9D, 0xE6F2,
+ 0x9A9E, 0xE5B9,
+ 0x9A9F, 0xE6F3,
+ 0x9AA0, 0xE6F4,
+ 0x9AA1, 0xC2E2,
+ 0x9AA2, 0xE6F5,
+ 0x9AA3, 0xE6F6,
+ 0x9AA4, 0xD6E8,
+ 0x9AA5, 0xE6F7,
+ 0x9AA7, 0xE6F8,
+ 0x9AA8, 0xB9C7,
+ 0x9AB0, 0xF7BB,
+ 0x9AB1, 0xF7BA,
+ 0x9AB6, 0xF7BE,
+ 0x9AB7, 0xF7BC,
+ 0x9AB8, 0xBAA1,
+ 0x9ABA, 0xF7BF,
+ 0x9ABC, 0xF7C0,
+ 0x9AC0, 0xF7C2,
+ 0x9AC1, 0xF7C1,
+ 0x9AC2, 0xF7C4,
+ 0x9AC5, 0xF7C3,
+ 0x9ACB, 0xF7C5,
+ 0x9ACC, 0xF7C6,
+ 0x9AD1, 0xF7C7,
+ 0x9AD3, 0xCBE8,
+ 0x9AD8, 0xB8DF,
+ 0x9ADF, 0xF7D4,
+ 0x9AE1, 0xF7D5,
+ 0x9AE6, 0xF7D6,
+ 0x9AEB, 0xF7D8,
+ 0x9AED, 0xF7DA,
+ 0x9AEF, 0xF7D7,
+ 0x9AF9, 0xF7DB,
+ 0x9AFB, 0xF7D9,
+ 0x9B03, 0xD7D7,
+ 0x9B08, 0xF7DC,
+ 0x9B0F, 0xF7DD,
+ 0x9B13, 0xF7DE,
+ 0x9B1F, 0xF7DF,
+ 0x9B23, 0xF7E0,
+ 0x9B2F, 0xDBCB,
+ 0x9B32, 0xD8AA,
+ 0x9B3B, 0xE5F7,
+ 0x9B3C, 0xB9ED,
+ 0x9B41, 0xBFFD,
+ 0x9B42, 0xBBEA,
+ 0x9B43, 0xF7C9,
+ 0x9B44, 0xC6C7,
+ 0x9B45, 0xF7C8,
+ 0x9B47, 0xF7CA,
+ 0x9B48, 0xF7CC,
+ 0x9B49, 0xF7CB,
+ 0x9B4D, 0xF7CD,
+ 0x9B4F, 0xCEBA,
+ 0x9B51, 0xF7CE,
+ 0x9B54, 0xC4A7,
+ 0x9C7C, 0xD3E3,
+ 0x9C7F, 0xF6CF,
+ 0x9C81, 0xC2B3,
+ 0x9C82, 0xF6D0,
+ 0x9C85, 0xF6D1,
+ 0x9C86, 0xF6D2,
+ 0x9C87, 0xF6D3,
+ 0x9C88, 0xF6D4,
+ 0x9C8B, 0xF6D6,
+ 0x9C8D, 0xB1AB,
+ 0x9C8E, 0xF6D7,
+ 0x9C90, 0xF6D8,
+ 0x9C91, 0xF6D9,
+ 0x9C92, 0xF6DA,
+ 0x9C94, 0xF6DB,
+ 0x9C95, 0xF6DC,
+ 0x9C9A, 0xF6DD,
+ 0x9C9B, 0xF6DE,
+ 0x9C9C, 0xCFCA,
+ 0x9C9E, 0xF6DF,
+ 0x9C9F, 0xF6E0,
+ 0x9CA0, 0xF6E1,
+ 0x9CA1, 0xF6E2,
+ 0x9CA2, 0xF6E3,
+ 0x9CA3, 0xF6E4,
+ 0x9CA4, 0xC0F0,
+ 0x9CA5, 0xF6E5,
+ 0x9CA6, 0xF6E6,
+ 0x9CA7, 0xF6E7,
+ 0x9CA8, 0xF6E8,
+ 0x9CA9, 0xF6E9,
+ 0x9CAB, 0xF6EA,
+ 0x9CAD, 0xF6EB,
+ 0x9CAE, 0xF6EC,
+ 0x9CB0, 0xF6ED,
+ 0x9CB1, 0xF6EE,
+ 0x9CB2, 0xF6EF,
+ 0x9CB3, 0xF6F0,
+ 0x9CB4, 0xF6F1,
+ 0x9CB5, 0xF6F2,
+ 0x9CB6, 0xF6F3,
+ 0x9CB7, 0xF6F4,
+ 0x9CB8, 0xBEA8,
+ 0x9CBA, 0xF6F5,
+ 0x9CBB, 0xF6F6,
+ 0x9CBC, 0xF6F7,
+ 0x9CBD, 0xF6F8,
+ 0x9CC3, 0xC8FA,
+ 0x9CC4, 0xF6F9,
+ 0x9CC5, 0xF6FA,
+ 0x9CC6, 0xF6FB,
+ 0x9CC7, 0xF6FC,
+ 0x9CCA, 0xF6FD,
+ 0x9CCB, 0xF6FE,
+ 0x9CCC, 0xF7A1,
+ 0x9CCD, 0xF7A2,
+ 0x9CCE, 0xF7A3,
+ 0x9CCF, 0xF7A4,
+ 0x9CD0, 0xF7A5,
+ 0x9CD3, 0xF7A6,
+ 0x9CD4, 0xF7A7,
+ 0x9CD5, 0xF7A8,
+ 0x9CD6, 0xB1EE,
+ 0x9CD7, 0xF7A9,
+ 0x9CD8, 0xF7AA,
+ 0x9CD9, 0xF7AB,
+ 0x9CDC, 0xF7AC,
+ 0x9CDD, 0xF7AD,
+ 0x9CDE, 0xC1DB,
+ 0x9CDF, 0xF7AE,
+ 0x9CE2, 0xF7AF,
+ 0x9E1F, 0xC4F1,
+ 0x9E20, 0xF0AF,
+ 0x9E21, 0xBCA6,
+ 0x9E22, 0xF0B0,
+ 0x9E23, 0xC3F9,
+ 0x9E25, 0xC5B8,
+ 0x9E26, 0xD1BB,
+ 0x9E28, 0xF0B1,
+ 0x9E29, 0xF0B2,
+ 0x9E2A, 0xF0B3,
+ 0x9E2B, 0xF0B4,
+ 0x9E2C, 0xF0B5,
+ 0x9E2D, 0xD1BC,
+ 0x9E2F, 0xD1EC,
+ 0x9E31, 0xF0B7,
+ 0x9E32, 0xF0B6,
+ 0x9E33, 0xD4A7,
+ 0x9E35, 0xCDD2,
+ 0x9E36, 0xF0B8,
+ 0x9E37, 0xF0BA,
+ 0x9E38, 0xF0B9,
+ 0x9E39, 0xF0BB,
+ 0x9E3A, 0xF0BC,
+ 0x9E3D, 0xB8EB,
+ 0x9E3E, 0xF0BD,
+ 0x9E3F, 0xBAE8,
+ 0x9E41, 0xF0BE,
+ 0x9E42, 0xF0BF,
+ 0x9E43, 0xBEE9,
+ 0x9E44, 0xF0C0,
+ 0x9E45, 0xB6EC,
+ 0x9E46, 0xF0C1,
+ 0x9E47, 0xF0C2,
+ 0x9E48, 0xF0C3,
+ 0x9E49, 0xF0C4,
+ 0x9E4A, 0xC8B5,
+ 0x9E4B, 0xF0C5,
+ 0x9E4C, 0xF0C6,
+ 0x9E4E, 0xF0C7,
+ 0x9E4F, 0xC5F4,
+ 0x9E51, 0xF0C8,
+ 0x9E55, 0xF0C9,
+ 0x9E57, 0xF0CA,
+ 0x9E58, 0xF7BD,
+ 0x9E5A, 0xF0CB,
+ 0x9E5B, 0xF0CC,
+ 0x9E5C, 0xF0CD,
+ 0x9E5E, 0xF0CE,
+ 0x9E63, 0xF0CF,
+ 0x9E64, 0xBAD7,
+ 0x9E66, 0xF0D0,
+ 0x9E67, 0xF0D1,
+ 0x9E68, 0xF0D2,
+ 0x9E69, 0xF0D3,
+ 0x9E6A, 0xF0D4,
+ 0x9E6B, 0xF0D5,
+ 0x9E6C, 0xF0D6,
+ 0x9E6D, 0xF0D8,
+ 0x9E70, 0xD3A5,
+ 0x9E71, 0xF0D7,
+ 0x9E73, 0xF0D9,
+ 0x9E7E, 0xF5BA,
+ 0x9E7F, 0xC2B9,
+ 0x9E82, 0xF7E4,
+ 0x9E87, 0xF7E5,
+ 0x9E88, 0xF7E6,
+ 0x9E8B, 0xF7E7,
+ 0x9E92, 0xF7E8,
+ 0x9E93, 0xC2B4,
+ 0x9E9D, 0xF7EA,
+ 0x9E9F, 0xF7EB,
+ 0x9EA6, 0xC2F3,
+ 0x9EB4, 0xF4F0,
+ 0x9EB8, 0xF4EF,
+ 0x9EBB, 0xC2E9,
+ 0x9EBD, 0xF7E1,
+ 0x9EBE, 0xF7E2,
+ 0x9EC4, 0xBBC6,
+ 0x9EC9, 0xD9E4,
+ 0x9ECD, 0xCAF2,
+ 0x9ECE, 0xC0E8,
+ 0x9ECF, 0xF0A4,
+ 0x9ED1, 0xBADA,
+ 0x9ED4, 0xC7AD,
+ 0x9ED8, 0xC4AC,
+ 0x9EDB, 0xF7EC,
+ 0x9EDC, 0xF7ED,
+ 0x9EDD, 0xF7EE,
+ 0x9EDF, 0xF7F0,
+ 0x9EE0, 0xF7EF,
+ 0x9EE2, 0xF7F1,
+ 0x9EE5, 0xF7F4,
+ 0x9EE7, 0xF7F3,
+ 0x9EE9, 0xF7F2,
+ 0x9EEA, 0xF7F5,
+ 0x9EEF, 0xF7F6,
+ 0x9EF9, 0xEDE9,
+ 0x9EFB, 0xEDEA,
+ 0x9EFC, 0xEDEB,
+ 0x9EFE, 0xF6BC,
+ 0x9F0B, 0xF6BD,
+ 0x9F0D, 0xF6BE,
+ 0x9F0E, 0xB6A6,
+ 0x9F10, 0xD8BE,
+ 0x9F13, 0xB9C4,
+ 0x9F17, 0xD8BB,
+ 0x9F19, 0xDCB1,
+ 0x9F20, 0xCAF3,
+ 0x9F22, 0xF7F7,
+ 0x9F2C, 0xF7F8,
+ 0x9F2F, 0xF7F9,
+ 0x9F37, 0xF7FB,
+ 0x9F39, 0xF7FA,
+ 0x9F3B, 0xB1C7,
+ 0x9F3D, 0xF7FC,
+ 0x9F3E, 0xF7FD,
+ 0x9F44, 0xF7FE,
+ 0x9F50, 0xC6EB,
+ 0x9F51, 0xECB4,
+ 0x9F7F, 0xB3DD,
+ 0x9F80, 0xF6B3,
+ 0x9F83, 0xF6B4,
+ 0x9F84, 0xC1E4,
+ 0x9F85, 0xF6B5,
+ 0x9F86, 0xF6B6,
+ 0x9F87, 0xF6B7,
+ 0x9F88, 0xF6B8,
+ 0x9F89, 0xF6B9,
+ 0x9F8A, 0xF6BA,
+ 0x9F8B, 0xC8A3,
+ 0x9F8C, 0xF6BB,
+ 0x9F99, 0xC1FA,
+ 0x9F9A, 0xB9A8,
+ 0x9F9B, 0xEDE8,
+ 0x9F9F, 0xB9EA,
+ 0x9FA0, 0xD9DF,
+ 0xFF01, 0xA3A1,
+ 0xFF02, 0xA3A2,
+ 0xFF03, 0xA3A3,
+ 0xFF04, 0xA1E7,
+ 0xFF05, 0xA3A5,
+ 0xFF06, 0xA3A6,
+ 0xFF07, 0xA3A7,
+ 0xFF08, 0xA3A8,
+ 0xFF09, 0xA3A9,
+ 0xFF0A, 0xA3AA,
+ 0xFF0B, 0xA3AB,
+ 0xFF0C, 0xA3AC,
+ 0xFF0D, 0xA3AD,
+ 0xFF0E, 0xA3AE,
+ 0xFF0F, 0xA3AF,
+ 0xFF10, 0xA3B0,
+ 0xFF11, 0xA3B1,
+ 0xFF12, 0xA3B2,
+ 0xFF13, 0xA3B3,
+ 0xFF14, 0xA3B4,
+ 0xFF15, 0xA3B5,
+ 0xFF16, 0xA3B6,
+ 0xFF17, 0xA3B7,
+ 0xFF18, 0xA3B8,
+ 0xFF19, 0xA3B9,
+ 0xFF1A, 0xA3BA,
+ 0xFF1B, 0xA3BB,
+ 0xFF1C, 0xA3BC,
+ 0xFF1D, 0xA3BD,
+ 0xFF1E, 0xA3BE,
+ 0xFF1F, 0xA3BF,
+ 0xFF20, 0xA3C0,
+ 0xFF21, 0xA3C1,
+ 0xFF22, 0xA3C2,
+ 0xFF23, 0xA3C3,
+ 0xFF24, 0xA3C4,
+ 0xFF25, 0xA3C5,
+ 0xFF26, 0xA3C6,
+ 0xFF27, 0xA3C7,
+ 0xFF28, 0xA3C8,
+ 0xFF29, 0xA3C9,
+ 0xFF2A, 0xA3CA,
+ 0xFF2B, 0xA3CB,
+ 0xFF2C, 0xA3CC,
+ 0xFF2D, 0xA3CD,
+ 0xFF2E, 0xA3CE,
+ 0xFF2F, 0xA3CF,
+ 0xFF30, 0xA3D0,
+ 0xFF31, 0xA3D1,
+ 0xFF32, 0xA3D2,
+ 0xFF33, 0xA3D3,
+ 0xFF34, 0xA3D4,
+ 0xFF35, 0xA3D5,
+ 0xFF36, 0xA3D6,
+ 0xFF37, 0xA3D7,
+ 0xFF38, 0xA3D8,
+ 0xFF39, 0xA3D9,
+ 0xFF3A, 0xA3DA,
+ 0xFF3B, 0xA3DB,
+ 0xFF3C, 0xA3DC,
+ 0xFF3D, 0xA3DD,
+ 0xFF3E, 0xA3DE,
+ 0xFF3F, 0xA3DF,
+ 0xFF40, 0xA3E0,
+ 0xFF41, 0xA3E1,
+ 0xFF42, 0xA3E2,
+ 0xFF43, 0xA3E3,
+ 0xFF44, 0xA3E4,
+ 0xFF45, 0xA3E5,
+ 0xFF46, 0xA3E6,
+ 0xFF47, 0xA3E7,
+ 0xFF48, 0xA3E8,
+ 0xFF49, 0xA3E9,
+ 0xFF4A, 0xA3EA,
+ 0xFF4B, 0xA3EB,
+ 0xFF4C, 0xA3EC,
+ 0xFF4D, 0xA3ED,
+ 0xFF4E, 0xA3EE,
+ 0xFF4F, 0xA3EF,
+ 0xFF50, 0xA3F0,
+ 0xFF51, 0xA3F1,
+ 0xFF52, 0xA3F2,
+ 0xFF53, 0xA3F3,
+ 0xFF54, 0xA3F4,
+ 0xFF55, 0xA3F5,
+ 0xFF56, 0xA3F6,
+ 0xFF57, 0xA3F7,
+ 0xFF58, 0xA3F8,
+ 0xFF59, 0xA3F9,
+ 0xFF5A, 0xA3FA,
+ 0xFF5B, 0xA3FB,
+ 0xFF5C, 0xA3FC,
+ 0xFF5D, 0xA3FD,
+ 0xFF5E, 0xA1AB,
+ 0xFFE0, 0xA1E9,
+ 0xFFE1, 0xA1EA,
+ 0xFFE3, 0xA3FE,
+ 0xFFE5, 0xA3A4
+};
diff --git a/3rdparty/zint-2.6.1/backend/gif.c b/3rdparty/zint-2.6.1/backend/gif.c
new file mode 100644
index 0000000..99aabf9
--- /dev/null
+++ b/3rdparty/zint-2.6.1/backend/gif.c
@@ -0,0 +1,402 @@
+/* gif.c - Handles output to gif file */
+
+/*
+ libzint - the open source barcode library
+ Copyright (C) 2009-2017 Robin Stuart
+
+ Redistribution and use in source and binary forms, with or without
+ modification, are permitted provided that the following conditions
+ are met:
+
+ 1. Redistributions of source code must retain the above copyright
+ notice, this list of conditions and the following disclaimer.
+ 2. Redistributions in binary form must reproduce the above copyright
+ notice, this list of conditions and the following disclaimer in the
+ documentation and/or other materials provided with the distribution.
+ 3. Neither the name of the project nor the names of its contributors
+ may be used to endorse or promote products derived from this software
+ without specific prior written permission.
+
+ THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND
+ ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+ ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE
+ FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+ DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
+ OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
+ HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
+ LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
+ OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+ SUCH DAMAGE.
+ */
+
+#include
+#include
+#include
+#include "common.h"
+#include
+#ifdef _MSC_VER
+#include
+#include
+#include
+#endif
+
+#define SSET "0123456789ABCDEF"
+
+/* Index of transparent color, -1 for no transparent color
+ * This might be set into a variable if transparency is activated as an option
+ */
+#define TRANSPARENT_INDEX (-1)
+
+/* Used bit depth, may be changed for bigger pallet in future */
+#define DESTINATION_IMAGE_BITS 1
+#include
+
+typedef struct s_statestruct {
+ unsigned char * pOut;
+ unsigned char *pIn;
+ unsigned int InLen;
+ unsigned int OutLength;
+ unsigned int OutPosCur;
+ unsigned int OutByteCountPos;
+ unsigned short ClearCode;
+ unsigned short FreeCode;
+ char fByteCountByteSet;
+ unsigned char OutBitsFree;
+ unsigned short NodeAxon[4096];
+ unsigned short NodeNext[4096];
+ unsigned char NodePix[4096];
+} statestruct;
+
+static char BufferNextByte(statestruct *pState) {
+ (pState->OutPosCur)++;
+ /* Check if this position is a byte count position
+ * fg_f_bytecountbyte_set indicates, if byte count position bytes should be
+ * inserted in general.
+ * If this is true, and the distance to the last byte count position is 256
+ * (e.g. 255 bytes in between), a byte count byte is inserted, and the value
+ * of the last one is set to 255.
+ * */
+ if (pState->fByteCountByteSet && (pState->OutByteCountPos + 256 == pState->OutPosCur)) {
+ (pState->pOut)[pState->OutByteCountPos] = 255;
+ pState->OutByteCountPos = pState->OutPosCur;
+ (pState->OutPosCur)++;
+ }
+ if (pState->OutPosCur >= pState->OutLength)
+ return 1;
+ (pState->pOut)[pState->OutPosCur] = 0x00;
+ return 0;
+}
+
+static char AddCodeToBuffer(statestruct *pState, unsigned short CodeIn, unsigned char CodeBits) {
+ /* Check, if we may fill up the current byte completely */
+ if (CodeBits >= pState->OutBitsFree) {
+ (pState->pOut)[pState->OutPosCur] |= (unsigned char)
+ (CodeIn << (8 - pState->OutBitsFree));
+ if (BufferNextByte(pState))
+ return -1;
+ CodeIn = (unsigned short) (CodeIn >> pState->OutBitsFree);
+ CodeBits -= pState->OutBitsFree;
+ pState->OutBitsFree = 8;
+ /* Write a full byte if there are at least 8 code bits left */
+ if (CodeBits >= pState->OutBitsFree) {
+ (pState->pOut)[pState->OutPosCur] = (unsigned char) CodeIn;
+ if (BufferNextByte(pState))
+ return -1;
+ CodeIn = (unsigned short) (CodeIn >> 8);
+ CodeBits -= 8;
+ }
+ }
+ /* The remaining bits of CodeIn fit in the current byte. */
+ if (CodeBits > 0) {
+ (pState->pOut)[pState->OutPosCur] |= (unsigned char)
+ (CodeIn << (8 - pState->OutBitsFree));
+ pState->OutBitsFree -= CodeBits;
+ }
+ return 0;
+}
+
+static void FlushStringTable(statestruct *pState) {
+ unsigned short Pos;
+ for (Pos = 0; Pos < pState->ClearCode; Pos++) {
+ (pState->NodeAxon)[Pos] = 0;
+ }
+}
+
+unsigned short FindPixelOutlet(statestruct *pState, unsigned short HeadNode, unsigned char Byte) {
+ unsigned short Outlet;
+
+ Outlet = (pState->NodeAxon)[HeadNode];
+ while (Outlet) {
+ if ((pState->NodePix)[Outlet] == Byte)
+ return Outlet;
+ Outlet = (pState->NodeNext)[Outlet];
+ }
+ return 0;
+}
+
+static char NextCode(statestruct *pState, unsigned char * pPixelValueCur, unsigned char CodeBits) {
+ unsigned short UpNode;
+ unsigned short DownNode;
+ /* start with the root node for last pixel chain */
+ UpNode = *pPixelValueCur;
+ if ((pState->InLen) == 0)
+ return AddCodeToBuffer(pState, UpNode, CodeBits);
+
+ *pPixelValueCur = (*(pState->pIn)) - '0';
+ (pState->pIn)++;
+ (pState->InLen)--;
+ /* Follow the string table and the data stream to the end of the longest string that has a code */
+ while (0 != (DownNode = FindPixelOutlet(pState, UpNode, *pPixelValueCur))) {
+ UpNode = DownNode;
+ if ((pState->InLen) == 0)
+ return AddCodeToBuffer(pState, UpNode, CodeBits);
+
+ *pPixelValueCur = (*(pState->pIn)) - '0';
+ (pState->pIn)++;
+ (pState->InLen)--;
+ }
+ /* Submit 'UpNode' which is the code of the longest string */
+ if (AddCodeToBuffer(pState, UpNode, CodeBits))
+ return -1;
+ /* ... and extend the string by appending 'PixelValueCur' */
+ /* Create a successor node for 'PixelValueCur' whose code is 'freecode' */
+ (pState->NodePix)[pState->FreeCode] = *pPixelValueCur;
+ (pState->NodeAxon)[pState->FreeCode] = (pState->NodeNext)[pState->FreeCode] = 0;
+ /* ...and link it to the end of the chain emanating from fg_axon[UpNode]. */
+ DownNode = (pState->NodeAxon)[UpNode];
+ if (!DownNode) {
+ (pState->NodeAxon)[UpNode] = pState->FreeCode;
+ } else {
+ while ((pState->NodeNext)[DownNode]) {
+ DownNode = (pState->NodeNext)[DownNode];
+ }
+ (pState->NodeNext)[DownNode] = pState->FreeCode;
+ }
+ return 1;
+}
+
+int gif_lzw(unsigned char *pOut, int OutLength, unsigned char *pIn, int InLen) {
+ unsigned char PixelValueCur;
+ unsigned char CodeBits;
+ unsigned short Pos;
+ statestruct State;
+
+ State.pIn = pIn;
+ State.InLen = InLen;
+ State.pOut = pOut;
+ State.OutLength = OutLength;
+ // > Get first data byte
+ if (State.InLen == 0)
+ return 0;
+
+ PixelValueCur = (unsigned char) ((*(State.pIn)) - '0');
+ (State.pIn)++;
+ (State.InLen)--;
+ CodeBits = 3;
+ State.ClearCode = 4;
+ State.FreeCode = 6;
+ State.OutBitsFree = 8;
+ State.OutPosCur = -1;
+ State.fByteCountByteSet = 0;
+
+ if (BufferNextByte(&State))
+ return 0;
+
+ for (Pos = 0; Pos < State.ClearCode; Pos++)
+ State.NodePix[Pos] = (unsigned char) Pos;
+
+ FlushStringTable(&State);
+
+ /* Write what the GIF specification calls the "code size". */
+ (State.pOut)[State.OutPosCur] = 2;
+ /* Reserve first bytecount byte */
+ if (BufferNextByte(&State))
+ return 0;
+ State.OutByteCountPos = State.OutPosCur;
+ if (BufferNextByte(&State))
+ return 0;
+ State.fByteCountByteSet = 1;
+ /* Submit one 'ClearCode' as the first code */
+ if (AddCodeToBuffer(&State, State.ClearCode, CodeBits))
+ return 0;
+
+ for (;;) {
+ char Res;
+ /* generate and save the next code, which may consist of multiple input pixels. */
+ Res = NextCode(&State, &PixelValueCur, CodeBits);
+ if (Res < 0)
+ return 0;
+ //* Check for end of data stream */
+ if (!Res) {
+ /* submit 'eoi' as the last item of the code stream */
+ if (AddCodeToBuffer(&State, (unsigned short) (State.ClearCode + 1), CodeBits))
+ return 0;
+ State.fByteCountByteSet = 0;
+ if (State.OutBitsFree < 8) {
+ if (BufferNextByte(&State))
+ return 0;
+ }
+ // > Update last bytecount byte;
+ if (State.OutByteCountPos < State.OutPosCur) {
+ (State.pOut)[State.OutByteCountPos] = (unsigned char) (State.OutPosCur - State.OutByteCountPos - 1);
+ }
+ State.OutPosCur++;
+ return State.OutPosCur;
+ }
+ /* Check for currently last code */
+ if (State.FreeCode == (1U << CodeBits))
+ CodeBits++;
+ State.FreeCode++;
+ /* Check for full stringtable */
+ if (State.FreeCode == 0xfff) {
+ FlushStringTable(&State);
+ if (AddCodeToBuffer(&State, State.ClearCode, CodeBits))
+ return 0;
+
+ CodeBits = (unsigned char) (1 + 2);
+ State.FreeCode = (unsigned short) (State.ClearCode + 2);
+ }
+ }
+}
+
+int gif_pixel_plot(struct zint_symbol *symbol, char *pixelbuf) {
+ char outbuf[10];
+ FILE *gif_file;
+ unsigned short usTemp;
+ int byte_out;
+#ifdef _MSC_VER
+ char * lzwoutbuf;
+#endif
+
+#ifndef _MSC_VER
+ char lzwoutbuf[symbol->bitmap_height * symbol->bitmap_width];
+#else
+ lzwoutbuf = (char *) _alloca((symbol->bitmap_height * symbol->bitmap_width) * sizeof (char));
+#endif /* _MSC_VER */
+
+ /* Open output file in binary mode */
+ if ((symbol->output_options & BARCODE_STDOUT) != 0) {
+#ifdef _MSC_VER
+ if (-1 == _setmode(_fileno(stdout), _O_BINARY)) {
+ strcpy(symbol->errtxt, "610: Can't open output file");
+ return ZINT_ERROR_FILE_ACCESS;
+ }
+#endif
+ gif_file = stdout;
+ } else {
+ if (!(gif_file = fopen(symbol->outfile, "wb"))) {
+ strcpy(symbol->errtxt, "611: Can't open output file");
+ return ZINT_ERROR_FILE_ACCESS;
+ }
+ }
+ /*ImageWidth = 2;
+ ImageHeight = 2;
+ rotated_bitmap[0] = 1;
+ rotated_bitmap[1] = 1;
+ rotated_bitmap[2] = 0;
+ rotated_bitmap[3] = 0;
+ */
+
+ /* GIF signature (6) */
+ memcpy(outbuf, "GIF87a", 6);
+ if (TRANSPARENT_INDEX != -1)
+ outbuf[4] = '9';
+ fwrite(outbuf, 6, 1, gif_file);
+ /* Screen Descriptor (7) */
+ /* Screen Width */
+ usTemp = (unsigned short) symbol->bitmap_width;
+ outbuf[0] = (unsigned char) (0xff & usTemp);
+ outbuf[1] = (unsigned char) ((0xff00 & usTemp) / 0x100);
+ /* Screen Height */
+ usTemp = (unsigned short) symbol->bitmap_height;
+ outbuf[2] = (unsigned char) (0xff & usTemp);
+ outbuf[3] = (unsigned char) ((0xff00 & usTemp) / 0x100);
+ /* write ImageBits-1 to the three least significant bits of byte 5 of
+ * the Screen Descriptor
+ */
+ outbuf[4] = (unsigned char) (0xf0 | (0x7 & (DESTINATION_IMAGE_BITS - 1)));
+ /* Background color = colortable index 0 */
+ outbuf[5] = 0x00;
+ /* Byte 7 must be 0x00 */
+ outbuf[6] = 0x00;
+ fwrite(outbuf, 7, 1, gif_file);
+ /* Global Color Table (6) */
+ /* RGB 0 color */
+ outbuf[0] = (unsigned char) (16 * ctoi(symbol->bgcolour[0])) + ctoi(symbol->bgcolour[1]);
+ outbuf[1] = (unsigned char) (16 * ctoi(symbol->bgcolour[2])) + ctoi(symbol->bgcolour[3]);
+ outbuf[2] = (unsigned char) (16 * ctoi(symbol->bgcolour[4])) + ctoi(symbol->bgcolour[5]);
+ /* RGB 1 color */
+ outbuf[3] = (unsigned char) (16 * ctoi(symbol->fgcolour[0])) + ctoi(symbol->fgcolour[1]);
+ outbuf[4] = (unsigned char) (16 * ctoi(symbol->fgcolour[2])) + ctoi(symbol->fgcolour[3]);
+ outbuf[5] = (unsigned char) (16 * ctoi(symbol->fgcolour[4])) + ctoi(symbol->fgcolour[5]);
+ fwrite(outbuf, 6, 1, gif_file);
+
+ /* Graphic control extension (8) */
+ /* A graphic control extension block is used for overlay gifs.
+ * This is necessary to define a transparent color.
+ */
+ if (TRANSPARENT_INDEX != -1) {
+ /* Extension Introducer = '!' */
+ outbuf[0] = '\x21';
+ /* Graphic Control Label */
+ outbuf[1] = '\xf9';
+ /* Block Size */
+ outbuf[2] = 4;
+ /* Packet fields:
+ * 3 Reserved
+ * 3 Disposal Method: 0 No Action, 1 No Dispose, 2: Background, 3: Prev.
+ * 1 User Input Flag: 0: no user input, 1: user input
+ * 1 Transparent Color Flag: 0: No Transparency, 1: Transparency index
+ */
+ outbuf[3] = 1;
+ /* Delay Time */
+ outbuf[4] = 0;
+ outbuf[5] = 0;
+ /* Transparent Color Index */
+ outbuf[6] = (unsigned char) TRANSPARENT_INDEX;
+ /* Block Terminator */
+ outbuf[7] = 0;
+ fwrite(outbuf, 8, 1, gif_file);
+ }
+ /* Image Descriptor */
+ /* Image separator character = ',' */
+ outbuf[0] = 0x2c;
+ /* "Image Left" */
+ outbuf[1] = 0x00;
+ outbuf[2] = 0x00;
+ /* "Image Top" */
+ outbuf[3] = 0x00;
+ outbuf[4] = 0x00;
+ /* Image Width (low byte first) */
+ outbuf[5] = (unsigned char) (0xff & symbol->bitmap_width);
+ outbuf[6] = (unsigned char) ((0xff00 & symbol->bitmap_width) / 0x100);
+ /* Image Height */
+ outbuf[7] = (unsigned char) (0xff & symbol->bitmap_height);
+ outbuf[8] = (unsigned char) ((0xff00 & symbol->bitmap_height) / 0x100);
+
+ /* Byte 10 contains the interlaced flag and
+ * information on the local color table.
+ * There is no local color table if its most significant bit is reset.
+ */
+ outbuf[9] = (unsigned char) (0 | (0x7 & (DESTINATION_IMAGE_BITS - 1)));
+ fwrite(outbuf, 10, 1, gif_file);
+
+ /* call lzw encoding */
+ byte_out = gif_lzw(
+ (unsigned char *) lzwoutbuf,
+ symbol->bitmap_height * symbol->bitmap_width,
+ (unsigned char *) pixelbuf,
+ symbol->bitmap_height * symbol->bitmap_width);
+ if (byte_out <= 0) {
+ fclose(gif_file);
+ return ZINT_ERROR_MEMORY;
+ }
+ fwrite(lzwoutbuf, byte_out, 1, gif_file);
+
+ /* GIF terminator */
+ fputc('\x3b', gif_file);
+ fclose(gif_file);
+
+ return 0;
+}
\ No newline at end of file
diff --git a/3rdparty/zint-2.6.1/backend/gridmtx.c b/3rdparty/zint-2.6.1/backend/gridmtx.c
new file mode 100644
index 0000000..b77a05b
--- /dev/null
+++ b/3rdparty/zint-2.6.1/backend/gridmtx.c
@@ -0,0 +1,1208 @@
+/* gridmtx.c - Grid Matrix
+
+ libzint - the open source barcode library
+ Copyright (C) 2009-2017 Robin Stuart
+
+ Redistribution and use in source and binary forms, with or without
+ modification, are permitted provided that the following conditions
+ are met:
+
+ 1. Redistributions of source code must retain the above copyright
+ notice, this list of conditions and the following disclaimer.
+ 2. Redistributions in binary form must reproduce the above copyright
+ notice, this list of conditions and the following disclaimer in the
+ documentation and/or other materials provided with the distribution.
+ 3. Neither the name of the project nor the names of its contributors
+ may be used to endorse or promote products derived from this software
+ without specific prior written permission.
+
+ THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND
+ ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+ ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE
+ FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+ DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
+ OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
+ HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
+ LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
+ OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+ SUCH DAMAGE.
+ */
+
+/* This file impliments Grid Matrix as specified in
+ AIM Global Document Number AIMD014 Rev. 1.63 Revised 9 Dec 2008 */
+
+#include
+#include
+#include
+#ifdef _MSC_VER
+#include
+#endif
+#include "common.h"
+#include "reedsol.h"
+#include "gridmtx.h"
+#include "gb2312.h"
+
+int number_lat(int gbdata[], const size_t length, const size_t position) {
+ /* Attempt to calculate the 'cost' of using numeric mode from a given position in number of bits */
+ /* Also ensures that numeric mode is not selected when it cannot be used: for example in
+ a string which has "2.2.0" (cannot have more than one non-numeric character for each
+ block of three numeric characters) */
+ size_t sp;
+ int numb = 0, nonum = 0, done;
+ int tally = 0;
+
+ sp = position;
+
+ do {
+ done = 0;
+
+ if ((gbdata[sp] >= '0') && (gbdata[sp] <= '9')) {
+ numb++;
+ done = 1;
+ }
+ switch (gbdata[sp]) {
+ case ' ':
+ case '+':
+ case '-':
+ case '.':
+ case ',':
+ nonum++;
+ done = 1;
+ }
+ if ((sp + 1) < length) {
+ if ((gbdata[sp] == 0x13) && (gbdata[sp + 1] == 0x10)) {
+ nonum++;
+ done = 1;
+ sp++;
+ }
+ }
+
+ if (done == 0) {
+ tally += 80;
+ } else {
+ if (numb == 3) {
+ if (nonum == 0) {
+ tally += 10;
+ }
+ if (nonum == 1) {
+ tally += 20;
+ }
+ if (nonum > 1) {
+ tally += 80;
+ }
+ numb = 0;
+ nonum = 0;
+ }
+ }
+
+ sp++;
+ } while ((sp < length) && (sp <= (position + 8)));
+
+ if (numb == 0) {
+ tally += 80;
+ }
+
+ if (numb > 1) {
+ if (nonum == 0) {
+ tally += 10;
+ }
+ if (nonum == 1) {
+ tally += 20;
+ }
+ if (nonum > 1) {
+ tally += 80;
+ }
+ }
+
+ return tally;
+}
+
+static int seek_forward(int gbdata[], const size_t length, const size_t position, int current_mode) {
+ /* In complete contrast to the method recommended in Annex D of the ANSI standard this
+ code uses a look-ahead test in the same manner as Data Matrix. This decision was made
+ because the "official" algorithm does not provide clear methods for dealing with all
+ possible combinations of input data */
+
+ int number_count, byte_count, mixed_count, upper_count, lower_count, chinese_count;
+ int best_mode, done;
+ size_t sp;
+ int best_count, last = -1;
+ int debug = 0;
+
+ if (gbdata[position] > 0xff) {
+ return GM_CHINESE;
+ }
+
+ switch (current_mode) {
+ case GM_CHINESE:
+ number_count = 13;
+ byte_count = 13;
+ mixed_count = 13;
+ upper_count = 13;
+ lower_count = 13;
+ chinese_count = 0;
+ break;
+ case GM_NUMBER:
+ number_count = 0;
+ byte_count = 10;
+ mixed_count = 10;
+ upper_count = 10;
+ lower_count = 10;
+ chinese_count = 10;
+ break;
+ case GM_LOWER:
+ number_count = 5;
+ byte_count = 7;
+ mixed_count = 7;
+ upper_count = 5;
+ lower_count = 0;
+ chinese_count = 5;
+ break;
+ case GM_UPPER:
+ number_count = 5;
+ byte_count = 7;
+ mixed_count = 7;
+ upper_count = 0;
+ lower_count = 5;
+ chinese_count = 5;
+ break;
+ case GM_MIXED:
+ number_count = 10;
+ byte_count = 10;
+ mixed_count = 0;
+ upper_count = 10;
+ lower_count = 10;
+ chinese_count = 10;
+ break;
+ case GM_BYTE:
+ number_count = 4;
+ byte_count = 0;
+ mixed_count = 4;
+ upper_count = 4;
+ lower_count = 4;
+ chinese_count = 4;
+ break;
+ default: /* Start of symbol */
+ number_count = 4;
+ byte_count = 4;
+ mixed_count = 4;
+ upper_count = 4;
+ lower_count = 4;
+ chinese_count = 4;
+ }
+
+ for (sp = position; (sp < length) && (sp <= (position + 8)); sp++) {
+
+ done = 0;
+
+ if (gbdata[sp] >= 0xff) {
+ byte_count += 17;
+ mixed_count += 23;
+ upper_count += 18;
+ lower_count += 18;
+ chinese_count += 13;
+ done = 1;
+ }
+
+ if ((gbdata[sp] >= 'a') && (gbdata[sp] <= 'z')) {
+ byte_count += 8;
+ mixed_count += 6;
+ upper_count += 10;
+ lower_count += 5;
+ chinese_count += 13;
+ done = 1;
+ }
+
+ if ((gbdata[sp] >= 'A') && (gbdata[sp] <= 'Z')) {
+ byte_count += 8;
+ mixed_count += 6;
+ upper_count += 5;
+ lower_count += 10;
+ chinese_count += 13;
+ done = 1;
+ }
+
+ if ((gbdata[sp] >= '0') && (gbdata[sp] <= '9')) {
+ byte_count += 8;
+ mixed_count += 6;
+ upper_count += 8;
+ lower_count += 8;
+ chinese_count += 13;
+ done = 1;
+ }
+
+ if (gbdata[sp] == ' ') {
+ byte_count += 8;
+ mixed_count += 6;
+ upper_count += 5;
+ lower_count += 5;
+ chinese_count += 13;
+ done = 1;
+ }
+
+ if (done == 0) {
+ /* Control character */
+ byte_count += 8;
+ mixed_count += 16;
+ upper_count += 13;
+ lower_count += 13;
+ chinese_count += 13;
+ }
+
+ if (gbdata[sp] >= 0x7f) {
+ mixed_count += 20;
+ upper_count += 20;
+ lower_count += 20;
+ }
+ }
+
+ /* Adjust for */
+ for (sp = position; (sp < (length - 1)) && (sp <= (position + 7)); sp++) {
+ if ((gbdata[sp] == 0x13) && (gbdata[sp + 1] == 0x10)) {
+ chinese_count -= 13;
+ }
+ }
+
+ /* Adjust for double digits */
+ for (sp = position; (sp < (length - 1)) && (sp <= (position + 7)); sp++) {
+ if (sp != last) {
+ if (((gbdata[sp] >= '0') && (gbdata[sp] <= '9')) && ((gbdata[sp + 1] >= '0') && (gbdata[sp + 1] <= '9'))) {
+ chinese_count -= 13;
+ last = (int)(sp + 1);
+ }
+ }
+ }
+
+ /* Numeric mode is more complex */
+ number_count += number_lat(gbdata, length, position);
+
+ if (debug) {
+ printf("C %d / B %d / M %d / U %d / L %d / N %d\n", chinese_count, byte_count, mixed_count, upper_count, lower_count, number_count);
+ }
+
+ best_count = chinese_count;
+ best_mode = GM_CHINESE;
+
+ if (byte_count <= best_count) {
+ best_count = byte_count;
+ best_mode = GM_BYTE;
+ }
+
+ if (mixed_count <= best_count) {
+ best_count = mixed_count;
+ best_mode = GM_MIXED;
+ }
+
+ if (upper_count <= best_count) {
+ best_count = upper_count;
+ best_mode = GM_UPPER;
+ }
+
+ if (lower_count <= best_count) {
+ best_count = lower_count;
+ best_mode = GM_LOWER;
+ }
+
+ if (number_count <= best_count) {
+ best_count = number_count;
+ best_mode = GM_NUMBER;
+ }
+
+ return best_mode;
+}
+
+/* Add the length indicator for byte encoded blocks */
+static void add_byte_count(char binary[], const size_t byte_count_posn, const int byte_count) {
+ int p;
+
+ for (p = 0; p < 8; p++) {
+ if (byte_count & (0x100 >> p)) {
+ binary[byte_count_posn + p] = '0';
+ } else {
+ binary[byte_count_posn + p] = '1';
+ }
+ }
+}
+
+/* Add a control character to the data stream */
+void add_shift_char(char binary[], int shifty) {
+ int i, debug = 0;
+ int glyph = 0;
+
+ for (i = 0; i < 64; i++) {
+ if (shift_set[i] == shifty) {
+ glyph = i;
+ }
+ }
+
+ if (debug) {
+ printf("SHIFT [%d] ", glyph);
+ }
+
+ bin_append(glyph, 6, binary);
+}
+
+static int gm_encode(int gbdata[], const size_t length, char binary[],const int reader,const int eci, int debug) {
+ /* Create a binary stream representation of the input data.
+ 7 sets are defined - Chinese characters, Numerals, Lower case letters, Upper case letters,
+ Mixed numerals and latters, Control characters and 8-bit binary data */
+ int sp, current_mode, next_mode, last_mode, glyph = 0;
+ int c1, c2, done;
+ int p = 0, ppos;
+ int numbuf[3], punt = 0;
+ size_t number_pad_posn, byte_count_posn = 0;
+ int byte_count = 0;
+ int shift;
+
+ strcpy(binary, "");
+
+ sp = 0;
+ current_mode = 0;
+ last_mode = 0;
+ number_pad_posn = 0;
+
+ if (reader) {
+ bin_append(10, 4, binary); /* FNC3 - Reader Initialisation */
+ }
+
+ if (eci != 3) {
+ /* ECI assignment according to Table 8 */
+ bin_append(12, 4, binary); /* ECI */
+ if (eci <= 1023) {
+ bin_append(eci, 11, binary);
+ }
+ if ((eci >= 1024) && (eci <= 32767)) {
+ strcat(binary, "10");
+ bin_append(eci, 15, binary);
+ }
+ if (eci >= 32768) {
+ strcat(binary, "11");
+ bin_append(eci, 20, binary);
+ }
+ }
+
+ do {
+ next_mode = seek_forward(gbdata, length, sp, current_mode);
+
+ if (next_mode != current_mode) {
+ switch (current_mode) {
+ case 0:
+ switch (next_mode) {
+ case GM_CHINESE: bin_append(1, 4, binary);
+ break;
+ case GM_NUMBER: bin_append(2, 4, binary);
+ break;
+ case GM_LOWER: bin_append(3, 4, binary);
+ break;
+ case GM_UPPER: bin_append(4, 4, binary);
+ break;
+ case GM_MIXED: bin_append(5, 4, binary);
+ break;
+ case GM_BYTE: bin_append(6, 4, binary);
+ break;
+ }
+ break;
+ case GM_CHINESE:
+ switch (next_mode) {
+ case GM_NUMBER: bin_append(8161, 13, binary);
+ break;
+ case GM_LOWER: bin_append(8162, 13, binary);
+ break;
+ case GM_UPPER: bin_append(8163, 13, binary);
+ break;
+ case GM_MIXED: bin_append(8164, 13, binary);
+ break;
+ case GM_BYTE: bin_append(8165, 13, binary);
+ break;
+ }
+ break;
+ case GM_NUMBER:
+ /* add numeric block padding value */
+ switch (p) {
+ case 1: binary[number_pad_posn] = '1';
+ binary[number_pad_posn + 1] = '0';
+ break; // 2 pad digits
+ case 2: binary[number_pad_posn] = '0';
+ binary[number_pad_posn + 1] = '1';
+ break; // 1 pad digits
+ case 3: binary[number_pad_posn] = '0';
+ binary[number_pad_posn + 1] = '0';
+ break; // 0 pad digits
+ }
+ switch (next_mode) {
+ case GM_CHINESE: bin_append(1019, 10, binary);
+ break;
+ case GM_LOWER: bin_append(1020, 10, binary);
+ break;
+ case GM_UPPER: bin_append(1021, 10, binary);
+ break;
+ case GM_MIXED: bin_append(1022, 10, binary);
+ break;
+ case GM_BYTE: bin_append(1023, 10, binary);
+ break;
+ }
+ break;
+ case GM_LOWER:
+ case GM_UPPER:
+ switch (next_mode) {
+ case GM_CHINESE: bin_append(28, 5, binary);
+ break;
+ case GM_NUMBER: bin_append(29, 5, binary);
+ break;
+ case GM_LOWER:
+ case GM_UPPER: bin_append(30, 5, binary);
+ break;
+ case GM_MIXED: bin_append(124, 7, binary);
+ break;
+ case GM_BYTE: bin_append(126, 7, binary);
+ break;
+ }
+ break;
+ case GM_MIXED:
+ switch (next_mode) {
+ case GM_CHINESE: bin_append(1009, 10, binary);
+ break;
+ case GM_NUMBER: bin_append(1010, 10, binary);
+ break;
+ case GM_LOWER: bin_append(1011, 10, binary);
+ break;
+ case GM_UPPER: bin_append(1012, 10, binary);
+ break;
+ case GM_BYTE: bin_append(1015, 10, binary);
+ break;
+ }
+ break;
+ case GM_BYTE:
+ /* add byte block length indicator */
+ add_byte_count(binary, byte_count_posn, byte_count);
+ byte_count = 0;
+ switch (next_mode) {
+ case GM_CHINESE: bin_append(1, 4, binary);
+ break;
+ case GM_NUMBER: bin_append(2, 4, binary);
+ break;
+ case GM_LOWER: bin_append(3, 4, binary);
+ break;
+ case GM_UPPER: bin_append(4, 4, binary);
+ break;
+ case GM_MIXED: bin_append(5, 4, binary);
+ break;
+ }
+ break;
+ }
+ if (debug) {
+ switch (next_mode) {
+ case GM_CHINESE: printf("CHIN ");
+ break;
+ case GM_NUMBER: printf("NUMB ");
+ break;
+ case GM_LOWER: printf("LOWR ");
+ break;
+ case GM_UPPER: printf("UPPR ");
+ break;
+ case GM_MIXED: printf("MIXD ");
+ break;
+ case GM_BYTE: printf("BYTE ");
+ break;
+ }
+ }
+ }
+ last_mode = current_mode;
+ current_mode = next_mode;
+
+ switch (current_mode) {
+ case GM_CHINESE:
+ done = 0;
+ if (gbdata[sp] > 0xff) {
+ /* GB2312 character */
+ c1 = (gbdata[sp] & 0xff00) >> 8;
+ c2 = gbdata[sp] & 0xff;
+
+ if ((c1 >= 0xa0) && (c1 <= 0xa9)) {
+ glyph = (0x60 * (c1 - 0xa1)) + (c2 - 0xa0);
+ }
+ if ((c1 >= 0xb0) && (c1 <= 0xf7)) {
+ glyph = (0x60 * (c1 - 0xb0 + 9)) + (c2 - 0xa0);
+ }
+ done = 1;
+ }
+ if (!(done)) {
+ if (sp != (length - 1)) {
+ if ((gbdata[sp] == 0x13) && (gbdata[sp + 1] == 0x10)) {
+ /* End of Line */
+ glyph = 7776;
+ sp++;
+ }
+ done = 1;
+ }
+ }
+ if (!(done)) {
+ if (sp != (length - 1)) {
+ if (((gbdata[sp] >= '0') && (gbdata[sp] <= '9')) &&
+ ((gbdata[sp + 1] >= '0') && (gbdata[sp + 1] <= '9'))) {
+ /* Two digits */
+ glyph = 8033 + (10 * (gbdata[sp] - '0')) + (gbdata[sp + 1] - '0');
+ sp++;
+ }
+ }
+ }
+ if (!(done)) {
+ /* Byte value */
+ glyph = 7777 + gbdata[sp];
+ }
+
+ if (debug) {
+ printf("[%d] ", glyph);
+ }
+
+ bin_append(glyph, 13, binary);
+ sp++;
+ break;
+
+ case GM_NUMBER:
+ if (last_mode != current_mode) {
+ /* Reserve a space for numeric digit padding value (2 bits) */
+ number_pad_posn = strlen(binary);
+ strcat(binary, "XX");
+ }
+ p = 0;
+ ppos = -1;
+
+ /* Numeric compression can also include certain combinations of
+ non-numeric character */
+
+ numbuf[0] = '0';
+ numbuf[1] = '0';
+ numbuf[2] = '0';
+ do {
+ if ((gbdata[sp] >= '0') && (gbdata[sp] <= '9')) {
+ numbuf[p] = gbdata[sp];
+ sp++;
+ p++;
+ }
+ switch (gbdata[sp]) {
+ case ' ':
+ case '+':
+ case '-':
+ case '.':
+ case ',':
+ punt = gbdata[sp];
+ sp++;
+ ppos = p;
+ break;
+ }
+ if (sp < (length - 1)) {
+ if ((gbdata[sp] == 0x13) && (gbdata[sp + 1] == 0x10)) {
+ /* */
+ punt = gbdata[sp];
+ sp += 2;
+ ppos = p;
+ }
+ }
+ } while ((p < 3) && (sp < length));
+
+ if (ppos != -1) {
+ switch (punt) {
+ case ' ': glyph = 0;
+ break;
+ case '+': glyph = 3;
+ break;
+ case '-': glyph = 6;
+ break;
+ case '.': glyph = 9;
+ break;
+ case ',': glyph = 12;
+ break;
+ case 0x13: glyph = 15;
+ break;
+ }
+ glyph += ppos;
+ glyph += 1000;
+
+ if (debug) {
+ printf("[%d] ", glyph);
+ }
+
+ bin_append(glyph, 10, binary);
+ }
+
+ glyph = (100 * (numbuf[0] - '0')) + (10 * (numbuf[1] - '0')) + (numbuf[2] - '0');
+ if (debug) {
+ printf("[%d] ", glyph);
+ }
+
+ bin_append(glyph, 10, binary);
+ break;
+
+ case GM_BYTE:
+ if (last_mode != current_mode) {
+ /* Reserve space for byte block length indicator (9 bits) */
+ byte_count_posn = strlen(binary);
+ strcat(binary, "LLLLLLLLL");
+ }
+ if (byte_count == 512) {
+ /* Maximum byte block size is 512 bytes. If longer is needed then start a new block */
+ add_byte_count(binary, byte_count_posn, byte_count);
+ bin_append(7, 4, binary);
+ byte_count_posn = strlen(binary);
+ strcat(binary, "LLLLLLLLL");
+ byte_count = 0;
+ }
+
+ glyph = gbdata[sp];
+ if (debug) {
+ printf("[%d] ", glyph);
+ }
+ bin_append(glyph, 8, binary);
+ sp++;
+ byte_count++;
+ break;
+
+ case GM_MIXED:
+ shift = 1;
+ if ((gbdata[sp] >= '0') && (gbdata[sp] <= '9')) {
+ shift = 0;
+ }
+ if ((gbdata[sp] >= 'A') && (gbdata[sp] <= 'Z')) {
+ shift = 0;
+ }
+ if ((gbdata[sp] >= 'a') && (gbdata[sp] <= 'z')) {
+ shift = 0;
+ }
+ if (gbdata[sp] == ' ') {
+ shift = 0;
+ }
+
+ if (shift == 0) {
+ /* Mixed Mode character */
+ glyph = posn(EUROPIUM, gbdata[sp]);
+ if (debug) {
+ printf("[%d] ", glyph);
+ }
+
+ bin_append(glyph, 6, binary);
+ } else {
+ /* Shift Mode character */
+ bin_append(1014, 10, binary); /* shift indicator */
+ add_shift_char(binary, gbdata[sp]);
+ }
+
+ sp++;
+ break;
+
+ case GM_UPPER:
+ shift = 1;
+ if ((gbdata[sp] >= 'A') && (gbdata[sp] <= 'Z')) {
+ shift = 0;
+ }
+ if (gbdata[sp] == ' ') {
+ shift = 0;
+ }
+
+ if (shift == 0) {
+ /* Upper Case character */
+ glyph = posn("ABCDEFGHIJKLMNOPQRSTUVWXYZ ", gbdata[sp]);
+ if (debug) {
+ printf("[%d] ", glyph);
+ }
+
+ bin_append(glyph, 5, binary);
+ } else {
+ /* Shift Mode character */
+ bin_append(125, 7, binary); /* shift indicator */
+ add_shift_char(binary, gbdata[sp]);
+ }
+
+ sp++;
+ break;
+
+ case GM_LOWER:
+ shift = 1;
+ if ((gbdata[sp] >= 'a') && (gbdata[sp] <= 'z')) {
+ shift = 0;
+ }
+ if (gbdata[sp] == ' ') {
+ shift = 0;
+ }
+
+ if (shift == 0) {
+ /* Lower Case character */
+ glyph = posn("abcdefghijklmnopqrstuvwxyz ", gbdata[sp]);
+ if (debug) {
+ printf("[%d] ", glyph);
+ }
+
+ bin_append(glyph, 5, binary);
+ } else {
+ /* Shift Mode character */
+ bin_append(125, 7, binary); /* shift indicator */
+ add_shift_char(binary, gbdata[sp]);
+ }
+
+ sp++;
+ break;
+ }
+ if (strlen(binary) > 9191) {
+ return ZINT_ERROR_TOO_LONG;
+ }
+
+ } while (sp < length);
+
+ if (current_mode == GM_NUMBER) {
+ /* add numeric block padding value */
+ switch (p) {
+ case 1: binary[number_pad_posn] = '1';
+ binary[number_pad_posn + 1] = '0';
+ break; // 2 pad digits
+ case 2: binary[number_pad_posn] = '0';
+ binary[number_pad_posn + 1] = '1';
+ break; // 1 pad digit
+ case 3: binary[number_pad_posn] = '0';
+ binary[number_pad_posn + 1] = '0';
+ break; // 0 pad digits
+ }
+ }
+
+ if (current_mode == GM_BYTE) {
+ /* Add byte block length indicator */
+ add_byte_count(binary, byte_count_posn, byte_count);
+ }
+
+ /* Add "end of data" character */
+ switch (current_mode) {
+ case GM_CHINESE: bin_append(8160, 13, binary);
+ break;
+ case GM_NUMBER: bin_append(1018, 10, binary);
+ break;
+ case GM_LOWER:
+ case GM_UPPER: bin_append(27, 5, binary);
+ break;
+ case GM_MIXED: bin_append(1008, 10, binary);
+ break;
+ case GM_BYTE: bin_append(0, 4, binary);
+ break;
+ }
+
+ /* Add padding bits if required */
+ p = 7 - (strlen(binary) % 7);
+ if (p == 7) {
+ p = 0;
+ }
+ bin_append(0, p, binary);
+
+ if (strlen(binary) > 9191) {
+ return ZINT_ERROR_TOO_LONG;
+ }
+ return 0;
+}
+
+static void gm_add_ecc(const char binary[], const size_t data_posn, const int layers, const int ecc_level, int word[]) {
+ int data_cw, i, j, wp, p;
+ int n1, b1, n2, b2, e1, b3, e2;
+ int block_size, data_size, ecc_size;
+ int data[1320], block[130];
+ unsigned char data_block[115], ecc_block[70];
+
+ data_cw = gm_data_codewords[((layers - 1) * 5) + (ecc_level - 1)];
+
+ for (i = 0; i < 1320; i++) {
+ data[i] = 0;
+ }
+
+ /* Convert from binary sream to 7-bit codewords */
+ for (i = 0; i < data_posn; i++) {
+ for (p = 0; p < 7; p++) {
+ if (binary[i * 7 + p] == '1') {
+ data[i] += (0x40 >> p);
+ }
+ }
+ }
+
+ /* Add padding codewords */
+ data[data_posn] = 0x00;
+ for (i = (int) (data_posn + 1); i < data_cw; i++) {
+ if (i & 1) {
+ data[i] = 0x7e;
+ } else {
+ data[i] = 0x00;
+ }
+ }
+
+ /* Get block sizes */
+ n1 = gm_n1[(layers - 1)];
+ b1 = gm_b1[(layers - 1)];
+ n2 = n1 - 1;
+ b2 = gm_b2[(layers - 1)];
+ e1 = gm_ebeb[((layers - 1) * 20) + ((ecc_level - 1) * 4)];
+ b3 = gm_ebeb[((layers - 1) * 20) + ((ecc_level - 1) * 4) + 1];
+ e2 = gm_ebeb[((layers - 1) * 20) + ((ecc_level - 1) * 4) + 2];
+
+ /* Split the data into blocks */
+ wp = 0;
+ for (i = 0; i < (b1 + b2); i++) {
+ if (i < b1) {
+ block_size = n1;
+ } else {
+ block_size = n2;
+ }
+ if (i < b3) {
+ ecc_size = e1;
+ } else {
+ ecc_size = e2;
+ }
+ data_size = block_size - ecc_size;
+
+ /* printf("block %d/%d: data %d / ecc %d\n", i + 1, (b1 + b2), data_size, ecc_size);*/
+
+ for (j = 0; j < data_size; j++) {
+ data_block[j] = data[wp];
+ wp++;
+ }
+
+ /* Calculate ECC data for this block */
+ rs_init_gf(0x89);
+ rs_init_code(ecc_size, 1);
+ rs_encode(data_size, data_block, ecc_block);
+ rs_free();
+
+ /* Correct error correction data but in reverse order */
+ for (j = 0; j < data_size; j++) {
+ block[j] = data_block[j];
+ }
+ for (j = 0; j < ecc_size; j++) {
+ block[(j + data_size)] = ecc_block[ecc_size - j - 1];
+ }
+
+ for (j = 0; j < n2; j++) {
+ word[((b1 + b2) * j) + i] = block[j];
+ }
+ if (block_size == n1) {
+ word[((b1 + b2) * (n1 - 1)) + i] = block[(n1 - 1)];
+ }
+ }
+}
+
+void place_macromodule(char grid[], int x, int y, int word1, int word2, int size) {
+ int i, j;
+
+ i = (x * 6) + 1;
+ j = (y * 6) + 1;
+
+ if (word2 & 0x40) {
+ grid[(j * size) + i + 2] = '1';
+ }
+ if (word2 & 0x20) {
+ grid[(j * size) + i + 3] = '1';
+ }
+ if (word2 & 0x10) {
+ grid[((j + 1) * size) + i] = '1';
+ }
+ if (word2 & 0x08) {
+ grid[((j + 1) * size) + i + 1] = '1';
+ }
+ if (word2 & 0x04) {
+ grid[((j + 1) * size) + i + 2] = '1';
+ }
+ if (word2 & 0x02) {
+ grid[((j + 1) * size) + i + 3] = '1';
+ }
+ if (word2 & 0x01) {
+ grid[((j + 2) * size) + i] = '1';
+ }
+ if (word1 & 0x40) {
+ grid[((j + 2) * size) + i + 1] = '1';
+ }
+ if (word1 & 0x20) {
+ grid[((j + 2) * size) + i + 2] = '1';
+ }
+ if (word1 & 0x10) {
+ grid[((j + 2) * size) + i + 3] = '1';
+ }
+ if (word1 & 0x08) {
+ grid[((j + 3) * size) + i] = '1';
+ }
+ if (word1 & 0x04) {
+ grid[((j + 3) * size) + i + 1] = '1';
+ }
+ if (word1 & 0x02) {
+ grid[((j + 3) * size) + i + 2] = '1';
+ }
+ if (word1 & 0x01) {
+ grid[((j + 3) * size) + i + 3] = '1';
+ }
+}
+
+void place_data_in_grid(int word[], char grid[], int modules, int size) {
+ int x, y, macromodule, offset;
+
+ offset = 13 - ((modules - 1) / 2);
+ for (y = 0; y < modules; y++) {
+ for (x = 0; x < modules; x++) {
+ macromodule = gm_macro_matrix[((y + offset) * 27) + (x + offset)];
+ place_macromodule(grid, x, y, word[macromodule * 2], word[(macromodule * 2) + 1], size);
+ }
+ }
+}
+
+/* Place the layer ID into each macromodule */
+void place_layer_id(char* grid, int size, int layers, int modules, int ecc_level) {
+ int i, j, layer, start, stop;
+
+#ifndef _MSC_VER
+ int layerid[layers + 1];
+ int id[modules * modules];
+#else
+ int* layerid = (int *) _alloca((layers + 1) * sizeof (int));
+ int* id = (int *) _alloca((modules * modules) * sizeof (int));
+#endif
+
+ /* Calculate Layer IDs */
+ for (i = 0; i <= layers; i++) {
+ if (ecc_level == 1) {
+ layerid[i] = 3 - (i % 4);
+ } else {
+ layerid[i] = (i + 5 - ecc_level) % 4;
+ }
+ }
+
+ for (i = 0; i < modules; i++) {
+ for (j = 0; j < modules; j++) {
+ id[(i * modules) + j] = 0;
+ }
+ }
+
+ /* Calculate which value goes in each macromodule */
+ start = modules / 2;
+ stop = modules / 2;
+ for (layer = 0; layer <= layers; layer++) {
+ for (i = start; i <= stop; i++) {
+ id[(start * modules) + i] = layerid[layer];
+ id[(i * modules) + start] = layerid[layer];
+ id[((modules - start - 1) * modules) + i] = layerid[layer];
+ id[(i * modules) + (modules - start - 1)] = layerid[layer];
+ }
+ start--;
+ stop++;
+ }
+
+ /* Place the data in the grid */
+ for (i = 0; i < modules; i++) {
+ for (j = 0; j < modules; j++) {
+ if (id[(i * modules) + j] & 0x02) {
+ grid[(((i * 6) + 1) * size) + (j * 6) + 1] = '1';
+ }
+ if (id[(i * modules) + j] & 0x01) {
+ grid[(((i * 6) + 1) * size) + (j * 6) + 2] = '1';
+ }
+ }
+ }
+}
+
+int grid_matrix(struct zint_symbol *symbol, const unsigned char source[], size_t length) {
+ int size, modules, dark, error_number;
+ int auto_layers, min_layers, layers, auto_ecc_level, min_ecc_level, ecc_level;
+ int x, y, i, j, glyph;
+ char binary[9300];
+ int data_cw, input_latch = 0;
+ int word[1460], data_max, reader = 0;
+
+#ifndef _MSC_VER
+ int utfdata[length + 1];
+ int gbdata[length + 1];
+#else
+ char* grid;
+ int* utfdata = (int *) _alloca((length + 1) * sizeof (int));
+ int* gbdata = (int *) _alloca((length + 1) * sizeof (int));
+#endif
+
+ for (i = 0; i < 1460; i++) {
+ word[i] = 0;
+ }
+
+ if ((symbol->input_mode == DATA_MODE) || (symbol->eci != 3)) {
+ for (i = 0; i < length; i++) {
+ gbdata[i] = (int) source[i];
+ }
+ } else {
+ /* Convert Unicode input to GB-2312 */
+ error_number = utf8toutf16(symbol, source, utfdata, &length);
+ if (error_number != 0) {
+ return error_number;
+ }
+
+ for (i = 0; i < length; i++) {
+ if (utfdata[i] <= 0xff) {
+ gbdata[i] = utfdata[i];
+ } else {
+ j = 0;
+ glyph = 0;
+ do {
+ if (gb2312_lookup[j * 2] == utfdata[i]) {
+ glyph = gb2312_lookup[(j * 2) + 1];
+ }
+ j++;
+ } while ((j < 7445) && (glyph == 0));
+ if (glyph == 0) {
+ strcpy(symbol->errtxt, "530: Invalid character in input data");
+ return ZINT_ERROR_INVALID_DATA;
+ }
+ gbdata[i] = glyph;
+ }
+ }
+ }
+
+ if (symbol->output_options & READER_INIT) reader = 1;
+
+ if (symbol->eci > 811799) {
+ strcpy(symbol->errtxt, "533: Invalid ECI");
+ return ZINT_ERROR_INVALID_OPTION;
+ }
+
+ error_number = gm_encode(gbdata, length, binary, reader, symbol->eci, symbol->debug);
+ if (error_number != 0) {
+ strcpy(symbol->errtxt, "531: Input data too long");
+ return error_number;
+ }
+
+ /* Determine the size of the symbol */
+ data_cw = (int)strlen(binary) / 7;
+
+ auto_layers = 13;
+ for (i = 12; i > 0; i--) {
+ if (gm_recommend_cw[(i - 1)] >= data_cw) {
+ auto_layers = i;
+ }
+ }
+ min_layers = 13;
+ for (i = 12; i > 0; i--) {
+ if (gm_max_cw[(i - 1)] >= data_cw) {
+ min_layers = i;
+ }
+ }
+ layers = auto_layers;
+ auto_ecc_level = 3;
+ if (layers == 1) {
+ auto_ecc_level = 5;
+ }
+ if ((layers == 2) || (layers == 3)) {
+ auto_ecc_level = 4;
+ }
+ min_ecc_level = 1;
+ if (layers == 1) {
+ min_ecc_level = 4;
+ }
+ if ((layers == 2) || (layers == 3)) {
+ min_ecc_level = 2;
+ }
+ ecc_level = auto_ecc_level;
+
+ if ((symbol->option_2 >= 1) && (symbol->option_2 <= 13)) {
+ input_latch = 1;
+ if (symbol->option_2 > min_layers) {
+ layers = symbol->option_2;
+ } else {
+ strcpy(symbol->errtxt, "534: Input data too long for selected symbol size");
+ return ZINT_ERROR_TOO_LONG;
+ }
+ }
+
+ if (input_latch == 1) {
+ auto_ecc_level = 3;
+ if (layers == 1) {
+ auto_ecc_level = 5;
+ }
+ if ((layers == 2) || (layers == 3)) {
+ auto_ecc_level = 4;
+ }
+ ecc_level = auto_ecc_level;
+ if (data_cw > gm_data_codewords[(5 * (layers - 1)) + (ecc_level - 1)]) {
+ layers++;
+ }
+ }
+
+ if (input_latch == 0) {
+ if ((symbol->option_1 >= 1) && (symbol->option_1 <= 5)) {
+ if (symbol->option_1 > min_ecc_level) {
+ ecc_level = symbol->option_1;
+ } else {
+ ecc_level = min_ecc_level;
+ }
+ }
+ if (data_cw > gm_data_codewords[(5 * (layers - 1)) + (ecc_level - 1)]) {
+ do {
+ layers++;
+ } while ((data_cw > gm_data_codewords[(5 * (layers - 1)) + (ecc_level - 1)]) && (layers <= 13));
+ }
+ }
+
+ data_max = 1313;
+ switch (ecc_level) {
+ case 2: data_max = 1167;
+ break;
+ case 3: data_max = 1021;
+ break;
+ case 4: data_max = 875;
+ break;
+ case 5: data_max = 729;
+ break;
+ }
+
+ if (data_cw > data_max) {
+ strcpy(symbol->errtxt, "532: Input data too long");
+ return ZINT_ERROR_TOO_LONG;
+ }
+
+ gm_add_ecc(binary, data_cw, layers, ecc_level, word);
+ size = 6 + (layers * 12);
+ modules = 1 + (layers * 2);
+
+#ifndef _MSC_VER
+ char grid[size * size];
+#else
+ grid = (char *) _alloca((size * size) * sizeof (char));
+#endif
+
+ for (x = 0; x < size; x++) {
+ for (y = 0; y < size; y++) {
+ grid[(y * size) + x] = '0';
+ }
+ }
+
+ place_data_in_grid(word, grid, modules, size);
+ place_layer_id(grid, size, layers, modules, ecc_level);
+
+ /* Add macromodule frames */
+ for (x = 0; x < modules; x++) {
+ dark = 1 - (x & 1);
+ for (y = 0; y < modules; y++) {
+ if (dark == 1) {
+ for (i = 0; i < 5; i++) {
+ grid[((y * 6) * size) + (x * 6) + i] = '1';
+ grid[(((y * 6) + 5) * size) + (x * 6) + i] = '1';
+ grid[(((y * 6) + i) * size) + (x * 6)] = '1';
+ grid[(((y * 6) + i) * size) + (x * 6) + 5] = '1';
+ }
+ grid[(((y * 6) + 5) * size) + (x * 6) + 5] = '1';
+ dark = 0;
+ } else {
+ dark = 1;
+ }
+ }
+ }
+
+ /* Copy values to symbol */
+ symbol->width = size;
+ symbol->rows = size;
+
+ for (x = 0; x < size; x++) {
+ for (y = 0; y < size; y++) {
+ if (grid[(y * size) + x] == '1') {
+ set_module(symbol, y, x);
+ }
+ }
+ symbol->row_height[x] = 1;
+ }
+
+ return 0;
+}
diff --git a/3rdparty/zint-2.6.1/backend/gridmtx.h b/3rdparty/zint-2.6.1/backend/gridmtx.h
new file mode 100644
index 0000000..5153488
--- /dev/null
+++ b/3rdparty/zint-2.6.1/backend/gridmtx.h
@@ -0,0 +1,184 @@
+/* gridmtx.h - definitions for Grid Matrix
+
+ libzint - the open source barcode library
+ Copyright (C) 2009-2017 Robin Stuart
+
+ Redistribution and use in source and binary forms, with or without
+ modification, are permitted provided that the following conditions
+ are met:
+
+ 1. Redistributions of source code must retain the above copyright
+ notice, this list of conditions and the following disclaimer.
+ 2. Redistributions in binary form must reproduce the above copyright
+ notice, this list of conditions and the following disclaimer in the
+ documentation and/or other materials provided with the distribution.
+ 3. Neither the name of the project nor the names of its contributors
+ may be used to endorse or promote products derived from this software
+ without specific prior written permission.
+
+ THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND
+ ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+ ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE
+ FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+ DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
+ OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
+ HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
+ LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
+ OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+ SUCH DAMAGE.
+ */
+
+#define GM_NUMBER 1
+#define GM_LOWER 2
+#define GM_UPPER 3
+#define GM_MIXED 4
+#define GM_CONTROL 5
+#define GM_BYTE 6
+#define GM_CHINESE 7
+
+#define EUROPIUM "0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz "
+
+static const char shift_set[] = {
+ /* From Table 7 - Encoding of control characters */
+ 0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08, 0x09, 0x0a, 0x0b, 0x0c, 0x0d, 0x0e, 0x0f, /* NULL -> SI */
+ 0x10, 0x11, 0x12, 0x13, 0x14, 0x15, 0x16, 0x17, 0x18, 0x19, 0x1a, 0x1b, 0x1c, 0x1d, 0x1e, 0x1f, /* DLE -> US */
+ '!', '"', '#', '$', '%', '&', '\'', '(', ')', '*', '+', ',', '-', '.', '/', ':',
+ ';', '<', '=', '>', '?', '@', '[', '\\', ']', '^', '_', '`', '{', '|', '}', '~'
+};
+
+static const unsigned short int gm_recommend_cw[] = {
+ 9, 30, 59, 114, 170, 237, 315, 405, 506, 618, 741, 875, 1021
+};
+
+static const unsigned short int gm_max_cw[] = {
+ 11, 40, 79, 146, 218, 305, 405, 521, 650, 794, 953, 1125, 1313
+};
+
+static const unsigned short int gm_data_codewords[] = {
+ 0, 15, 13, 11, 9,
+ 45, 40, 35, 30, 25,
+ 89, 79, 69, 59, 49,
+ 146, 130, 114, 98, 81,
+ 218, 194, 170, 146, 121,
+ 305, 271, 237, 203, 169,
+ 405, 360, 315, 270, 225,
+ 521, 463, 405, 347, 289,
+ 650, 578, 506, 434, 361,
+ 794, 706, 618, 530, 441,
+ 953, 847, 741, 635, 529,
+ 1125, 1000, 875, 750, 625,
+ 1313, 1167, 1021, 875, 729
+};
+
+static const char gm_n1[] = {
+ 18, 50, 98, 81, 121, 113, 113, 116, 121, 126, 118, 125, 122
+};
+
+static const char gm_b1[] = {
+ 1, 1, 1, 2, 2, 2, 2, 3, 2, 7, 5, 10, 6
+};
+
+static const char gm_b2[] = {
+ 0, 0, 0, 0, 0, 1, 2, 2, 4, 0, 4, 0, 6
+};
+
+/* Values from table A.1 */
+static const char gm_ebeb[] = {
+ /* E1 B3 E2 B4 */
+ 0, 0, 0, 0, // version 1
+ 3, 1, 0, 0,
+ 5, 1, 0, 0,
+ 7, 1, 0, 0,
+ 9, 1, 0, 0,
+ 5, 1, 0, 0, // version 2
+ 10, 1, 0, 0,
+ 15, 1, 0, 0,
+ 20, 1, 0, 0,
+ 25, 1, 0, 0,
+ 9, 1, 0, 0, // version 3
+ 19, 1, 0, 0,
+ 29, 1, 0, 0,
+ 39, 1, 0, 0,
+ 49, 1, 0, 0,
+ 8, 2, 0, 0, // version 4
+ 16, 2, 0, 0,
+ 24, 2, 0, 0,
+ 32, 2, 0, 0,
+ 41, 1, 40, 1,
+ 12, 2, 0, 0, // version 5
+ 24, 2, 0, 0,
+ 36, 2, 0, 0,
+ 48, 2, 0, 0,
+ 61, 1, 60, 1,
+ 11, 3, 0, 0, // version 6
+ 23, 1, 22, 2,
+ 34, 2, 33, 1,
+ 45, 3, 0, 0,
+ 57, 1, 56, 2,
+ 12, 1, 11, 3, // version 7
+ 23, 2, 22, 2,
+ 34, 3, 33, 1,
+ 45, 4, 0, 0,
+ 57, 1, 56, 3,
+ 12, 2, 11, 3, // version 8
+ 23, 5, 0, 0,
+ 35, 3, 34, 2,
+ 47, 1, 46, 4,
+ 58, 4, 57, 1,
+ 12, 6, 0, 0, // version 9
+ 24, 6, 0, 0,
+ 36, 6, 0, 0,
+ 48, 6, 0, 0,
+ 61, 1, 60, 5,
+ 13, 4, 12, 3, // version 10
+ 26, 1, 25, 6,
+ 38, 5, 37, 2,
+ 51, 2, 50, 5,
+ 63, 7, 0, 0,
+ 12, 6, 11, 3, // version 11
+ 24, 4, 23, 5,
+ 36, 2, 35, 7,
+ 47, 9, 0, 0,
+ 59, 7, 58, 2,
+ 13, 5, 12, 5, // version 12
+ 25, 10, 0, 0,
+ 38, 5, 37, 5,
+ 50, 10, 0, 0,
+ 63, 5, 62, 5,
+ 13, 1, 12, 11, //version 13
+ 25, 3, 24, 9,
+ 37, 5, 36, 7,
+ 49, 7, 48, 5,
+ 61, 9, 60, 3
+};
+
+static const unsigned short int gm_macro_matrix[] = {
+ 728, 625, 626, 627, 628, 629, 630, 631, 632, 633, 634, 635, 636, 637, 638, 639, 640, 641, 642, 643, 644, 645, 646, 647, 648, 649, 650,
+ 727, 624, 529, 530, 531, 532, 533, 534, 535, 536, 537, 538, 539, 540, 541, 542, 543, 544, 545, 546, 547, 548, 549, 550, 551, 552, 651,
+ 726, 623, 528, 441, 442, 443, 444, 445, 446, 447, 448, 449, 450, 451, 452, 453, 454, 455, 456, 457, 458, 459, 460, 461, 462, 553, 652,
+ 725, 622, 527, 440, 361, 362, 363, 364, 365, 366, 367, 368, 369, 370, 371, 372, 373, 374, 375, 376, 377, 378, 379, 380, 463, 554, 653,
+ 724, 621, 526, 439, 360, 289, 290, 291, 292, 293, 294, 295, 296, 297, 298, 299, 300, 301, 302, 303, 304, 305, 306, 381, 464, 555, 654,
+ 723, 620, 525, 438, 359, 288, 225, 226, 227, 228, 229, 230, 231, 232, 233, 234, 235, 236, 237, 238, 239, 240, 307, 382, 465, 556, 655,
+ 722, 619, 524, 437, 358, 287, 224, 169, 170, 171, 172, 173, 174, 175, 176, 177, 178, 179, 180, 181, 182, 241, 308, 383, 466, 557, 656,
+ 721, 618, 523, 436, 357, 286, 223, 168, 121, 122, 123, 124, 125, 126, 127, 128, 129, 130, 131, 132, 183, 242, 309, 384, 467, 558, 657,
+ 720, 617, 522, 435, 356, 285, 222, 167, 120, 81, 82, 83, 84, 85, 86, 87, 88, 89, 90, 133, 184, 243, 310, 385, 468, 559, 658,
+ 719, 616, 521, 434, 355, 284, 221, 166, 119, 80, 49, 50, 51, 52, 53, 54, 55, 56, 91, 134, 185, 244, 311, 386, 469, 560, 659,
+ 718, 615, 520, 433, 354, 283, 220, 165, 118, 79, 48, 25, 26, 27, 28, 29, 30, 57, 92, 135, 186, 245, 312, 387, 470, 561, 660,
+ 717, 614, 519, 432, 353, 282, 219, 164, 117, 78, 47, 24, 9, 10, 11, 12, 31, 58, 93, 136, 187, 246, 313, 388, 471, 562, 661,
+ 716, 613, 518, 431, 352, 281, 218, 163, 116, 77, 46, 23, 8, 1, 2, 13, 32, 59, 94, 137, 188, 247, 314, 389, 472, 563, 662,
+ 715, 612, 517, 430, 351, 280, 217, 162, 115, 76, 45, 22, 7, 0, 3, 14, 33, 60, 95, 138, 189, 248, 315, 390, 473, 564, 663,
+ 714, 611, 516, 429, 350, 279, 216, 161, 114, 75, 44, 21, 6, 5, 4, 15, 34, 61, 96, 139, 190, 249, 316, 391, 474, 565, 664,
+ 713, 610, 515, 428, 349, 278, 215, 160, 113, 74, 43, 20, 19, 18, 17, 16, 35, 62, 97, 140, 191, 250, 317, 392, 475, 566, 665,
+ 712, 609, 514, 427, 348, 277, 214, 159, 112, 73, 42, 41, 40, 39, 38, 37, 36, 63, 98, 141, 192, 251, 318, 393, 476, 567, 666,
+ 711, 608, 513, 426, 347, 276, 213, 158, 111, 72, 71, 70, 69, 68, 67, 66, 65, 64, 99, 142, 193, 252, 319, 394, 477, 568, 667,
+ 710, 607, 512, 425, 346, 275, 212, 157, 110, 109, 108, 107, 106, 105, 104, 103, 102, 101, 100, 143, 194, 253, 320, 395, 478, 569, 668,
+ 709, 606, 511, 424, 345, 274, 211, 156, 155, 154, 153, 152, 151, 150, 149, 148, 147, 146, 145, 144, 195, 254, 321, 396, 479, 570, 669,
+ 708, 605, 510, 423, 344, 273, 210, 209, 208, 207, 206, 205, 204, 203, 202, 201, 200, 199, 198, 197, 196, 255, 322, 397, 480, 571, 670,
+ 707, 604, 509, 422, 343, 272, 271, 270, 269, 268, 267, 266, 265, 264, 263, 262, 261, 260, 259, 258, 257, 256, 323, 398, 481, 572, 671,
+ 706, 603, 508, 421, 342, 341, 340, 339, 338, 337, 336, 335, 334, 333, 332, 331, 330, 329, 328, 327, 326, 325, 324, 399, 482, 573, 672,
+ 705, 602, 507, 420, 419, 418, 417, 416, 415, 414, 413, 412, 411, 410, 409, 408, 407, 406, 405, 404, 403, 402, 401, 400, 483, 574, 673,
+ 704, 601, 506, 505, 504, 503, 502, 501, 500, 499, 498, 497, 496, 495, 494, 493, 492, 491, 490, 489, 488, 487, 486, 485, 484, 575, 674,
+ 703, 600, 599, 598, 597, 596, 595, 594, 593, 592, 591, 590, 589, 588, 587, 586, 585, 584, 583, 582, 581, 580, 579, 578, 577, 576, 675,
+ 702, 701, 700, 699, 698, 697, 696, 695, 694, 693, 692, 691, 690, 689, 688, 687, 686, 685, 684, 683, 682, 681, 680, 679, 678, 677, 676,
+};
diff --git a/3rdparty/zint-2.6.1/backend/gs1.c b/3rdparty/zint-2.6.1/backend/gs1.c
new file mode 100644
index 0000000..547fba4
--- /dev/null
+++ b/3rdparty/zint-2.6.1/backend/gs1.c
@@ -0,0 +1,358 @@
+/* gs1.c - Verifies GS1 data */
+
+/*
+ libzint - the open source barcode library
+ Copyright (C) 2009-2017 Robin Stuart
+
+ Redistribution and use in source and binary forms, with or without
+ modification, are permitted provided that the following conditions
+ are met:
+
+ 1. Redistributions of source code must retain the above copyright
+ notice, this list of conditions and the following disclaimer.
+ 2. Redistributions in binary form must reproduce the above copyright
+ notice, this list of conditions and the following disclaimer in the
+ documentation and/or other materials provided with the distribution.
+ 3. Neither the name of the project nor the names of its contributors
+ may be used to endorse or promote products derived from this software
+ without specific prior written permission.
+
+ THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND
+ ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+ ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE
+ FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+ DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
+ OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
+ HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
+ LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
+ OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+ SUCH DAMAGE.
+ */
+
+#include
+#include
+#include
+#ifdef _MSC_VER
+#include
+#endif
+#include "common.h"
+#include "gs1.h"
+
+/* This code does some checks on the integrity of GS1 data. It is not intended
+ to be bulletproof, nor does it report very accurately what problem was found
+ or where, but should prevent some of the more common encoding errors */
+
+void itostr(char ai_string[], int ai_value) {
+ int thou, hund, ten, unit;
+ char temp[2];
+
+ strcpy(ai_string, "(");
+ thou = ai_value / 1000;
+ hund = (ai_value - (1000 * thou)) / 100;
+ ten = (ai_value - ((1000 * thou) + (100 * hund))) / 10;
+ unit = ai_value - ((1000 * thou) + (100 * hund) + (10 * ten));
+
+ temp[1] = '\0';
+ if (ai_value >= 1000) {
+ temp[0] = itoc(thou);
+ strcat(ai_string, temp);
+ }
+ if (ai_value >= 100) {
+ temp[0] = itoc(hund);
+ strcat(ai_string, temp);
+ }
+ temp[0] = itoc(ten);
+ strcat(ai_string, temp);
+ temp[0] = itoc(unit);
+ strcat(ai_string, temp);
+ strcat(ai_string, ")");
+}
+
+int gs1_verify(struct zint_symbol *symbol, const unsigned char source[], const size_t src_len, char reduced[]) {
+ int i, j, last_ai, ai_latch;
+ char ai_string[6];
+ int bracket_level, max_bracket_level, ai_length, max_ai_length, min_ai_length;
+ int ai_value[100], ai_location[100], ai_count, data_location[100], data_length[100];
+ int error_latch;
+
+ /* Detect extended ASCII characters */
+ for (i = 0; i < src_len; i++) {
+ if (source[i] >= 128) {
+ strcpy(symbol->errtxt, "250: Extended ASCII characters are not supported by GS1");
+ return ZINT_ERROR_INVALID_DATA;
+ }
+ if (source[i] < 32) {
+ strcpy(symbol->errtxt, "251: Control characters are not supported by GS1 ");
+ return ZINT_ERROR_INVALID_DATA;
+ }
+ }
+
+ if (source[0] != '[') {
+ strcpy(symbol->errtxt, "252: Data does not start with an AI");
+ return ZINT_ERROR_INVALID_DATA;
+ }
+
+ /* Check the position of the brackets */
+ bracket_level = 0;
+ max_bracket_level = 0;
+ ai_length = 0;
+ max_ai_length = 0;
+ min_ai_length = 5;
+ j = 0;
+ ai_latch = 0;
+ for (i = 0; i < src_len; i++) {
+ ai_length += j;
+ if (((j == 1) && (source[i] != ']')) && ((source[i] < '0') || (source[i] > '9'))) {
+ ai_latch = 1;
+ }
+ if (source[i] == '[') {
+ bracket_level++;
+ j = 1;
+ }
+ if (source[i] == ']') {
+ bracket_level--;
+ if (ai_length < min_ai_length) {
+ min_ai_length = ai_length;
+ }
+ j = 0;
+ ai_length = 0;
+ }
+ if (bracket_level > max_bracket_level) {
+ max_bracket_level = bracket_level;
+ }
+ if (ai_length > max_ai_length) {
+ max_ai_length = ai_length;
+ }
+ }
+ min_ai_length--;
+
+ if (bracket_level != 0) {
+ /* Not all brackets are closed */
+ strcpy(symbol->errtxt, "253: Malformed AI in input data (brackets don\'t match)");
+ return ZINT_ERROR_INVALID_DATA;
+ }
+
+ if (max_bracket_level > 1) {
+ /* Nested brackets */
+ strcpy(symbol->errtxt, "254: Found nested brackets in input data");
+ return ZINT_ERROR_INVALID_DATA;
+ }
+
+ if (max_ai_length > 4) {
+ /* AI is too long */
+ strcpy(symbol->errtxt, "255: Invalid AI in input data (AI too long)");
+ return ZINT_ERROR_INVALID_DATA;
+ }
+
+ if (min_ai_length <= 1) {
+ /* AI is too short */
+ strcpy(symbol->errtxt, "256: Invalid AI in input data (AI too short)");
+ return ZINT_ERROR_INVALID_DATA;
+ }
+
+ if (ai_latch == 1) {
+ /* Non-numeric data in AI */
+ strcpy(symbol->errtxt, "257: Invalid AI in input data (non-numeric characters in AI)");
+ return ZINT_ERROR_INVALID_DATA;
+ }
+
+ ai_count = 0;
+ for (i = 1; i < src_len; i++) {
+ if (source[i - 1] == '[') {
+ ai_location[ai_count] = i;
+ j = 0;
+ do {
+ ai_string[j] = source[i + j];
+ j++;
+ } while (ai_string[j - 1] != ']');
+ ai_string[j - 1] = '\0';
+ ai_value[ai_count] = atoi(ai_string);
+ ai_count++;
+ }
+ }
+
+ for (i = 0; i < ai_count; i++) {
+ data_location[i] = ai_location[i] + 3;
+ if (ai_value[i] >= 100) {
+ data_location[i]++;
+ }
+ if (ai_value[i] >= 1000) {
+ data_location[i]++;
+ }
+ data_length[i] = 0;
+ do {
+ data_length[i]++;
+ } while ((source[data_location[i] + data_length[i] - 1] != '[') && (data_location[i] + data_length[i] <= src_len));
+ data_length[i]--;
+ }
+
+ for (i = 0; i < ai_count; i++) {
+ if (data_length[i] == 0) {
+ /* No data for given AI */
+ strcpy(symbol->errtxt, "258: Empty data field in input data");
+ return ZINT_ERROR_INVALID_DATA;
+ }
+ }
+
+ error_latch = 0;
+ strcpy(ai_string, "");
+ for (i = 0; i < ai_count; i++) {
+ switch (ai_value[i]) {
+ case 0: if (data_length[i] != 18) {
+ error_latch = 1;
+ }
+ break;
+ case 1:
+ case 2:
+ case 3: if (data_length[i] != 14) {
+ error_latch = 1;
+ }
+ break;
+ case 4: if (data_length[i] != 16) {
+ error_latch = 1;
+ }
+ break;
+ case 11:
+ case 12:
+ case 13:
+ case 14:
+ case 15:
+ case 16:
+ case 17:
+ case 18:
+ case 19: if (data_length[i] != 6) {
+ error_latch = 1;
+ }
+ break;
+ case 20: if (data_length[i] != 2) {
+ error_latch = 1;
+ }
+ break;
+ case 23:
+ case 24:
+ case 25:
+ case 39:
+ case 40:
+ case 41:
+ case 42:
+ case 70:
+ case 80:
+ case 81: error_latch = 2;
+ break;
+ }
+ if (
+ ((ai_value[i] >= 100) && (ai_value[i] <= 179))
+ || ((ai_value[i] >= 1000) && (ai_value[i] <= 1799))
+ || ((ai_value[i] >= 200) && (ai_value[i] <= 229))
+ || ((ai_value[i] >= 2000) && (ai_value[i] <= 2299))
+ || ((ai_value[i] >= 300) && (ai_value[i] <= 309))
+ || ((ai_value[i] >= 3000) && (ai_value[i] <= 3099))
+ || ((ai_value[i] >= 31) && (ai_value[i] <= 36))
+ || ((ai_value[i] >= 310) && (ai_value[i] <= 369))
+ ) {
+ error_latch = 2;
+ }
+ if ((ai_value[i] >= 3100) && (ai_value[i] <= 3699)) {
+ if (data_length[i] != 6) {
+ error_latch = 1;
+ }
+ }
+ if (
+ ((ai_value[i] >= 370) && (ai_value[i] <= 379))
+ || ((ai_value[i] >= 3700) && (ai_value[i] <= 3799))
+ ) {
+ error_latch = 2;
+ }
+ if ((ai_value[i] >= 410) && (ai_value[i] <= 415)) {
+ if (data_length[i] != 13) {
+ error_latch = 1;
+ }
+ }
+ if (
+ ((ai_value[i] >= 4100) && (ai_value[i] <= 4199))
+ || ((ai_value[i] >= 700) && (ai_value[i] <= 703))
+ || ((ai_value[i] >= 800) && (ai_value[i] <= 810))
+ || ((ai_value[i] >= 900) && (ai_value[i] <= 999))
+ || ((ai_value[i] >= 9000) && (ai_value[i] <= 9999))
+ ) {
+ error_latch = 2;
+ }
+ if ((error_latch < 4) && (error_latch > 0)) {
+ /* error has just been detected: capture AI */
+ itostr(ai_string, ai_value[i]);
+ error_latch += 4;
+ }
+ }
+
+ if (error_latch == 5) {
+ strcpy(symbol->errtxt, "259: Invalid data length for AI ");
+ strcat(symbol->errtxt, ai_string);
+ return ZINT_ERROR_INVALID_DATA;
+ }
+
+ if (error_latch == 6) {
+ strcpy(symbol->errtxt, "260: Invalid AI value");
+ strcat(symbol->errtxt, ai_string);
+ return ZINT_ERROR_INVALID_DATA;
+ }
+
+ /* Resolve AI data - put resulting string in 'reduced' */
+ j = 0;
+ last_ai = 0;
+ ai_latch = 1;
+ for (i = 0; i < src_len; i++) {
+ if ((source[i] != '[') && (source[i] != ']')) {
+ reduced[j++] = source[i];
+ }
+ if (source[i] == '[') {
+ /* Start of an AI string */
+ if (ai_latch == 0) {
+ reduced[j++] = '[';
+ }
+ ai_string[0] = source[i + 1];
+ ai_string[1] = source[i + 2];
+ ai_string[2] = '\0';
+ last_ai = atoi(ai_string);
+ ai_latch = 0;
+ /* The following values from "GS-1 General Specification version 8.0 issue 2, May 2008"
+ figure 5.4.8.2.1 - 1 "Element Strings with Pre-Defined Length Using Application Identifiers" */
+ if (
+ ((last_ai >= 0) && (last_ai <= 4))
+ || ((last_ai >= 11) && (last_ai <= 20))
+ || (last_ai == 23) /* legacy support - see 5.3.8.2.2 */
+ || ((last_ai >= 31) && (last_ai <= 36))
+ || (last_ai == 41)
+ ) {
+ ai_latch = 1;
+ }
+ }
+ /* The ']' character is simply dropped from the input */
+ }
+ reduced[j] = '\0';
+
+ /* the character '[' in the reduced string refers to the FNC1 character */
+ return 0;
+}
+
+int ugs1_verify(struct zint_symbol *symbol, const unsigned char source[], const unsigned int src_len, unsigned char reduced[]) {
+ /* Only to keep the compiler happy */
+#ifndef _MSC_VER
+ char temp[src_len + 5];
+#else
+ char* temp = (char*) _alloca(src_len + 5);
+#endif
+ int error_number;
+
+ error_number = gs1_verify(symbol, source, src_len, temp);
+ if (error_number != 0) {
+ return error_number;
+ }
+
+ if (strlen(temp) < src_len + 5) {
+ ustrcpy(reduced, (unsigned char*) temp);
+ return 0;
+ }
+ strcpy(symbol->errtxt, "261: ugs1_verify overflow");
+ return ZINT_ERROR_INVALID_DATA;
+}
diff --git a/3rdparty/zint-2.6.1/backend/gs1.h b/3rdparty/zint-2.6.1/backend/gs1.h
new file mode 100644
index 0000000..0dba084
--- /dev/null
+++ b/3rdparty/zint-2.6.1/backend/gs1.h
@@ -0,0 +1,46 @@
+/* gs1.h - Verifies GS1 data */
+
+/*
+ libzint - the open source barcode library
+ Copyright (C) 2009-2017 Robin Stuart
+
+ Redistribution and use in source and binary forms, with or without
+ modification, are permitted provided that the following conditions
+ are met:
+
+ 1. Redistributions of source code must retain the above copyright
+ notice, this list of conditions and the following disclaimer.
+ 2. Redistributions in binary form must reproduce the above copyright
+ notice, this list of conditions and the following disclaimer in the
+ documentation and/or other materials provided with the distribution.
+ 3. Neither the name of the project nor the names of its contributors
+ may be used to endorse or promote products derived from this software
+ without specific prior written permission.
+
+ THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND
+ ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+ ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE
+ FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+ DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
+ OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
+ HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
+ LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
+ OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+ SUCH DAMAGE.
+ */
+#ifndef __GS1_H
+#define __GS1_H
+
+#ifdef __cplusplus
+extern "C" {
+#endif /* __cplusplus */
+
+ extern int gs1_verify(struct zint_symbol *symbol, const unsigned char source[], const size_t src_len, char reduced[]);
+ extern int ugs1_verify(struct zint_symbol *symbol, const unsigned char source[], const unsigned int src_len, unsigned char reduced[]);
+
+#ifdef __cplusplus
+}
+#endif /* __cplusplus */
+
+#endif /* __GS1_H */
\ No newline at end of file
diff --git a/3rdparty/zint-2.6.1/backend/hanxin.c b/3rdparty/zint-2.6.1/backend/hanxin.c
new file mode 100644
index 0000000..2b99650
--- /dev/null
+++ b/3rdparty/zint-2.6.1/backend/hanxin.c
@@ -0,0 +1,1576 @@
+/* hanxin.c - Han Xin Code
+
+ libzint - the open source barcode library
+ Copyright (C) 2009-2017 Robin Stuart
+
+ Redistribution and use in source and binary forms, with or without
+ modification, are permitted provided that the following conditions
+ are met:
+
+ 1. Redistributions of source code must retain the above copyright
+ notice, this list of conditions and the following disclaimer.
+ 2. Redistributions in binary form must reproduce the above copyright
+ notice, this list of conditions and the following disclaimer in the
+ documentation and/or other materials provided with the distribution.
+ 3. Neither the name of the project nor the names of its contributors
+ may be used to endorse or promote products derived from this software
+ without specific prior written permission.
+
+ THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND
+ ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+ ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE
+ FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+ DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
+ OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
+ HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
+ LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
+ OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+ SUCH DAMAGE.
+ */
+
+/* This code attempts to implement Han Xin Code according to AIMD-015:2010 (Rev 0.8) */
+
+#include
+#include
+#include
+#ifdef _MSC_VER
+#include
+#endif
+#include "common.h"
+#include "reedsol.h"
+#include "hanxin.h"
+#include "gb2312.h"
+#include "gb18030.h"
+#include "assert.h"
+
+/* Find which submode to use for a text character */
+int getsubmode(char input) {
+ int submode = 2;
+
+ if ((input >= '0') && (input <= '9')) {
+ submode = 1;
+ }
+
+ if ((input >= 'A') && (input <= 'Z')) {
+ submode = 1;
+ }
+
+ if ((input >= 'a') && (input <= 'z')) {
+ submode = 1;
+ }
+
+ return submode;
+}
+
+/* Calculate the approximate length of the binary string */
+static int calculate_binlength(char mode[], int source[], const size_t length, int eci) {
+ size_t i;
+ char lastmode = 't';
+ int est_binlen = 0;
+ int submode = 1;
+
+ if (eci != 3) {
+ est_binlen += 12;
+ }
+
+ i = 0;
+ do {
+ switch (mode[i]) {
+ case 'n':
+ if (lastmode != 'n') {
+ est_binlen += 14;
+ lastmode = 'n';
+ }
+ est_binlen += 4;
+ break;
+ case 't':
+ if (lastmode != 't') {
+ est_binlen += 10;
+ lastmode = 't';
+ submode = 1;
+ }
+ if (getsubmode((char) source[i]) != submode) {
+ est_binlen += 6;
+ submode = getsubmode((char) source[i]);
+ }
+ est_binlen += 6;
+ break;
+ case 'b':
+ if (lastmode != 'b') {
+ est_binlen += 17;
+ lastmode = 'b';
+ }
+ est_binlen += 8;
+ break;
+ case '1':
+ if (lastmode != '1') {
+ est_binlen += 16;
+ lastmode = '1';
+ }
+ est_binlen += 12;
+ break;
+ case '2':
+ if (lastmode != '2') {
+ est_binlen += 16;
+ lastmode = '2';
+ }
+ est_binlen += 12;
+ break;
+ case 'd':
+ if (lastmode != 'd') {
+ est_binlen += 16;
+ lastmode = 'd';
+ }
+ est_binlen += 15;
+ break;
+ case 'f':
+ if (lastmode != 'f') {
+ est_binlen += 4;
+ lastmode = 'f';
+ }
+ est_binlen += 21;
+ i++;
+ break;
+ }
+ i++;
+ } while (i < length);
+
+ return est_binlen;
+}
+
+int isRegion1(int glyph) {
+ int first_byte, second_byte;
+ int valid = 0;
+
+ first_byte = (glyph & 0xff00) >> 8;
+ second_byte = glyph & 0xff;
+
+ if ((first_byte >= 0xb0) && (first_byte <= 0xd7)) {
+ if ((second_byte >= 0xa1) && (second_byte <= 0xfe)) {
+ valid = 1;
+ }
+ }
+
+ if ((first_byte >= 0xa1) && (first_byte <= 0xa3)) {
+ if ((second_byte >= 0xa1) && (second_byte <= 0xfe)) {
+ valid = 1;
+ }
+ }
+
+ if ((glyph >= 0xa8a1) && (glyph <= 0xa8c0)) {
+ valid = 1;
+ }
+
+ return valid;
+}
+
+int isRegion2(int glyph) {
+ int first_byte, second_byte;
+ int valid = 0;
+
+ first_byte = (glyph & 0xff00) >> 8;
+ second_byte = glyph & 0xff;
+
+ if ((first_byte >= 0xd8) && (first_byte <= 0xf7)) {
+ if ((second_byte >= 0xa1) && (second_byte <= 0xfe)) {
+ valid = 1;
+ }
+ }
+
+ return valid;
+}
+
+int isDoubleByte(int glyph) {
+ int first_byte, second_byte;
+ int valid = 0;
+
+ first_byte = (glyph & 0xff00) >> 8;
+ second_byte = glyph & 0xff;
+
+ if ((first_byte >= 0x81) && (first_byte <= 0xfe)) {
+ if ((second_byte >= 0x40) && (second_byte <= 0x7e)) {
+ valid = 1;
+ }
+
+ if ((second_byte >= 0x80) && (second_byte <= 0xfe)) {
+ valid = 1;
+ }
+ }
+
+ return valid;
+}
+
+int isFourByte(int glyph, int glyph2) {
+ int first_byte, second_byte;
+ int third_byte, fourth_byte;
+ int valid = 0;
+
+ first_byte = (glyph & 0xff00) >> 8;
+ second_byte = glyph & 0xff;
+ third_byte = (glyph2 & 0xff00) >> 8;
+ fourth_byte = glyph2 & 0xff;
+
+ if ((first_byte >= 0x81) && (first_byte <= 0xfe)) {
+ if ((second_byte >= 0x30) && (second_byte <= 0x39)) {
+ if ((third_byte >= 0x81) && (third_byte <= 0xfe)) {
+ if ((fourth_byte >= 0x30) && (fourth_byte <= 0x39)) {
+ valid = 1;
+ }
+ }
+ }
+ }
+
+ return valid;
+}
+
+/* Calculate mode switching */
+static void hx_define_mode(char mode[], int source[], const size_t length) {
+ size_t i;
+ char lastmode = 't';
+ int done;
+
+ i = 0;
+ do {
+ done = 0;
+
+ if (isRegion1(source[i])) {
+ mode[i] = '1';
+ done = 1;
+ i++;
+ }
+
+ if ((done == 0) && (isRegion2(source[i]))) {
+ mode[i] = '2';
+ done = 1;
+ i++;
+ }
+
+ if ((done == 0) && (isDoubleByte(source[i]))) {
+ mode[i] = 'd';
+ done = 1;
+ i++;
+ }
+
+ if ((done == 0) && (i < length - 1)) {
+ if (isFourByte(source[i], source[i + 1])) {
+ mode[i] = 'f';
+ mode[i + 1] = 'f';
+ done = 1;
+ i += 2;
+ }
+ }
+
+ if (done == 0) {
+ if ((source[i] >= '0') && (source[i] <= '9')) {
+ mode[i] = 'n';
+ if (lastmode != 'n') {
+ lastmode = 'n';
+ }
+ } else {
+ if ((source[i] <= 127) && ((source[i] <= 27) || (source[i] >= 32))) {
+ mode[i] = 't';
+ if (lastmode != 't') {
+ lastmode = 't';
+ }
+ } else {
+ mode[i] = 'b';
+ if (lastmode != 'b') {
+ lastmode = 'b';
+ }
+ }
+ }
+ i++;
+ }
+ } while (i < length);
+ mode[length] = '\0';
+}
+
+/* Convert Text 1 sub-mode character to encoding value, as given in table 3 */
+int lookup_text1(char input) {
+ int encoding_value = 0;
+
+ if ((input >= '0') && (input <= '9')) {
+ encoding_value = input - '0';
+ }
+
+ if ((input >= 'A') && (input <= 'Z')) {
+ encoding_value = input - 'A' + 10;
+ }
+
+ if ((input >= 'a') && (input <= 'z')) {
+ encoding_value = input - 'a' + 36;
+ }
+
+ return encoding_value;
+}
+
+/* Convert Text 2 sub-mode character to encoding value, as given in table 4 */
+int lookup_text2(char input) {
+ int encoding_value = 0;
+
+ if ((input >= 0) && (input <= 27)) {
+ encoding_value = input;
+ }
+
+ if ((input >= ' ') && (input <= '/')) {
+ encoding_value = input - ' ' + 28;
+ }
+
+ if ((input >= '[') && (input <= 96)) {
+ encoding_value = input - '[' + 51;
+ }
+
+ if ((input >= '{') && (input <= 127)) {
+ encoding_value = input - '{' + 57;
+ }
+
+ return encoding_value;
+}
+
+/* Convert input data to binary stream */
+static void calculate_binary(char binary[], char mode[], int source[], const size_t length, const int eci, int debug) {
+ int block_length;
+ int position = 0;
+ int i, count, encoding_value;
+ int first_byte, second_byte;
+ int third_byte, fourth_byte;
+ int glyph;
+ int submode;
+
+ if (eci != 3) {
+ /* Encoding ECI assignment number, according to Table 5 */
+ bin_append(8, 4, binary); // ECI
+ if (eci <= 127) {
+ bin_append(eci, 8, binary);
+ }
+ if ((eci >= 128) && (eci <= 16383)) {
+ strcat(binary, "10");
+ bin_append(eci, 14, binary);
+ }
+ if (eci >= 16384) {
+ strcat(binary, "110");
+ bin_append(eci, 21, binary);
+ }
+ }
+
+ do {
+ block_length = 0;
+ do {
+ block_length++;
+ } while (mode[position + block_length] == mode[position]);
+
+ switch (mode[position]) {
+ case 'n':
+ /* Numeric mode */
+ /* Mode indicator */
+ bin_append(1, 4, binary);
+
+ if (debug) {
+ printf("Numeric\n");
+ }
+
+ i = 0;
+
+ while (i < block_length) {
+ int first = 0, second = 0, third = 0;
+
+ first = posn(NEON, (char) source[position + i]);
+ count = 1;
+ encoding_value = first;
+
+ if (i + 1 < block_length && mode[position + i + 1] == 'n') {
+ second = posn(NEON, (char) source[position + i + 1]);
+ count = 2;
+ encoding_value = (encoding_value * 10) + second;
+
+ if (i + 2 < block_length && mode[position + i + 2] == 'n') {
+ third = posn(NEON, (char) source[position + i + 2]);
+ count = 3;
+ encoding_value = (encoding_value * 10) + third;
+ }
+ }
+
+ bin_append(encoding_value, 10, binary);
+
+ if (debug) {
+ printf("0x%4x (%d)", encoding_value, encoding_value);
+ }
+
+ i += count;
+ }
+
+ /* Mode terminator depends on number of characters in last group (Table 2) */
+ switch (count) {
+ case 1:
+ bin_append(1021, 10, binary);
+ break;
+ case 2:
+ bin_append(1022, 10, binary);
+ break;
+ case 3:
+ bin_append(1023, 10, binary);
+ break;
+ }
+
+ if (debug) {
+ printf(" (TERM %d)\n", count);
+ }
+
+ break;
+ case 't':
+ /* Text mode */
+ if (position != 0) {
+ /* Mode indicator */
+ bin_append(2, 4, binary);
+
+ if (debug) {
+ printf("Text\n");
+ }
+ }
+
+ submode = 1;
+
+ i = 0;
+
+ while (i < block_length) {
+
+ if (getsubmode((char) source[i + position]) != submode) {
+ /* Change submode */
+ bin_append(62, 6, binary);
+ submode = getsubmode((char) source[i + position]);
+ if (debug) {
+ printf("SWITCH ");
+ }
+ }
+
+ if (submode == 1) {
+ encoding_value = lookup_text1((char) source[i + position]);
+ } else {
+ encoding_value = lookup_text2((char) source[i + position]);
+ }
+
+ bin_append(encoding_value, 6, binary);
+
+ if (debug) {
+ printf("%c (%d) ", (char) source[i], encoding_value);
+ }
+ i++;
+ }
+
+ /* Terminator */
+ bin_append(63, 6, binary);
+
+ if (debug) {
+ printf("\n");
+ }
+ break;
+ case 'b':
+ /* Binary Mode */
+ /* Mode indicator */
+ bin_append(3, 4, binary);
+
+ /* Count indicator */
+ bin_append(block_length, 13, binary);
+
+ if (debug) {
+ printf("Binary (length %d)\n", block_length);
+ }
+
+ i = 0;
+
+ while (i < block_length) {
+
+ /* 8-bit bytes with no conversion */
+ bin_append(source[i + position], 8, binary);
+
+ if (debug) {
+ printf("%d ", source[i + position]);
+ }
+
+ i++;
+ }
+
+ if (debug) {
+ printf("\n");
+ }
+ break;
+ case '1':
+ /* Region 1 encoding */
+ /* Mode indicator */
+ bin_append(4, 4, binary);
+
+ if (debug) {
+ printf("Region 1\n");
+ }
+
+ i = 0;
+
+ while (i < block_length) {
+ first_byte = (source[i + position] & 0xff00) >> 8;
+ second_byte = source[i + position] & 0xff;
+
+ /* Subset 1 */
+ glyph = (0x5e * (first_byte - 0xb0)) + (second_byte - 0xa1);
+
+ /* Subset 2 */
+ if ((first_byte >= 0xa1) && (first_byte <= 0xa3)) {
+ if ((second_byte >= 0xa1) && (second_byte <= 0xfe)) {
+ glyph = (0x5e * first_byte - 0xa1) + (second_byte - 0xa1) + 0xeb0;
+ }
+ }
+
+ /* Subset 3 */
+ if ((source[i + position] >= 0xa8a1) && (source[i + position] <= 0xa8c0)) {
+ glyph = (second_byte - 0xa1) + 0xfca;
+ }
+
+ if (debug) {
+ printf("%d ", glyph);
+ }
+
+ bin_append(glyph, 12, binary);
+ i++;
+ }
+
+ /* Terminator */
+ bin_append(4095, 12, binary);
+
+ if (debug) {
+ printf("\n");
+ }
+
+ break;
+ case '2':
+ /* Region 2 encoding */
+ /* Mode indicator */
+ bin_append(5, 4, binary);
+
+ if (debug) {
+ printf("Region 2\n");
+ }
+
+ i = 0;
+
+ while (i < block_length) {
+ first_byte = (source[i + position] & 0xff00) >> 8;
+ second_byte = source[i + position] & 0xff;
+
+ glyph = (0x5e * (first_byte - 0xd8)) + (second_byte - 0xa1);
+
+ if (debug) {
+ printf("%d ", glyph);
+ }
+
+ bin_append(glyph, 12, binary);
+ i++;
+ }
+
+ /* Terminator */
+ bin_append(4095, 12, binary);
+
+ if (debug) {
+ printf("\n");
+ }
+ break;
+ case 'd':
+ /* Double byte encoding */
+ /* Mode indicator */
+ bin_append(6, 4, binary);
+
+ if (debug) {
+ printf("Double byte\n");
+ }
+
+ i = 0;
+
+ while (i < block_length) {
+ first_byte = (source[i + position] & 0xff00) >> 8;
+ second_byte = source[i + position] & 0xff;
+
+ if (second_byte <= 0x7e) {
+ glyph = (0xbe * (first_byte - 0x81)) + (second_byte - 0x40);
+ } else {
+ glyph = (0xbe * (first_byte - 0x81)) + (second_byte - 0x41);
+ }
+
+ if (debug) {
+ printf("%d ", glyph);
+ }
+
+ bin_append(glyph, 15, binary);
+ i++;
+ }
+
+ /* Terminator */
+ bin_append(32767, 15, binary);
+ /* Terminator sequence of length 12 is a mistake
+ - confirmed by Wang Yi */
+
+ if (debug) {
+ printf("\n");
+ }
+ break;
+ case 'f':
+ /* Four-byte encoding */
+ if (debug) {
+ printf("Four byte\n");
+ }
+
+ i = 0;
+
+ while (i < block_length) {
+
+ /* Mode indicator */
+ bin_append(7, 4, binary);
+
+ first_byte = (source[i + position] & 0xff00) >> 8;
+ second_byte = source[i + position] & 0xff;
+ third_byte = (source[i + position + 1] & 0xff00) >> 8;
+ fourth_byte = source[i + position + 1] & 0xff;
+
+ glyph = (0x3138 * (first_byte - 0x81)) + (0x04ec * (second_byte - 0x30)) +
+ (0x0a * (third_byte - 0x81)) + (fourth_byte - 0x30);
+
+ if (debug) {
+ printf("%d ", glyph);
+ }
+
+ bin_append(glyph, 15, binary);
+ i += 2;
+ }
+
+ /* No terminator */
+
+ if (debug) {
+ printf("\n");
+ }
+ break;
+
+ }
+
+ position += block_length;
+
+ } while (position < length);
+}
+
+/* Finder pattern for top left of symbol */
+void hx_place_finder_top_left(unsigned char* grid, int size) {
+ int xp, yp;
+ int x = 0, y = 0;
+ char finder[] = {0x7F, 0x40, 0x5F, 0x50, 0x57, 0x57, 0x57};
+
+ for (xp = 0; xp < 7; xp++) {
+ for (yp = 0; yp < 7; yp++) {
+ if (finder[yp] & 0x40 >> xp) {
+ grid[((yp + y) * size) + (xp + x)] = 0x11;
+ } else {
+ grid[((yp + y) * size) + (xp + x)] = 0x10;
+ }
+ }
+ }
+}
+
+/* Finder pattern for top right and bottom left of symbol */
+void hx_place_finder(unsigned char* grid, int size, int x, int y) {
+ int xp, yp;
+ char finder[] = {0x7F, 0x01, 0x7D, 0x05, 0x75, 0x75, 0x75};
+
+ for (xp = 0; xp < 7; xp++) {
+ for (yp = 0; yp < 7; yp++) {
+ if (finder[yp] & 0x40 >> xp) {
+ grid[((yp + y) * size) + (xp + x)] = 0x11;
+ } else {
+ grid[((yp + y) * size) + (xp + x)] = 0x10;
+ }
+ }
+ }
+}
+
+/* Finder pattern for bottom right of symbol */
+void hx_place_finder_bottom_right(unsigned char* grid, int size) {
+ int xp, yp;
+ int x = size - 7, y = size - 7;
+ char finder[] = {0x75, 0x75, 0x75, 0x05, 0x7D, 0x01, 0x7F};
+
+ for (xp = 0; xp < 7; xp++) {
+ for (yp = 0; yp < 7; yp++) {
+ if (finder[yp] & 0x40 >> xp) {
+ grid[((yp + y) * size) + (xp + x)] = 0x11;
+ } else {
+ grid[((yp + y) * size) + (xp + x)] = 0x10;
+ }
+ }
+ }
+}
+
+/* Avoid plotting outside symbol or over finder patterns */
+void hx_safe_plot(unsigned char *grid, int size, int x, int y, int value) {
+ if ((x >= 0) && (x < size)) {
+ if ((y >= 0) && (y < size)) {
+ if (grid[(y * size) + x] == 0) {
+ grid[(y * size) + x] = value;
+ }
+ }
+ }
+}
+
+/* Plot an alignment pattern around top and right of a module */
+void hx_plot_alignment(unsigned char *grid, int size, int x, int y, int w, int h) {
+ int i;
+ hx_safe_plot(grid, size, x, y, 0x11);
+ hx_safe_plot(grid, size, x - 1, y + 1, 0x10);
+
+ for (i = 1; i <= w; i++) {
+ /* Top */
+ hx_safe_plot(grid, size, x - i, y, 0x11);
+ hx_safe_plot(grid, size, x - i - 1, y + 1, 0x10);
+ }
+
+ for (i = 1; i < h; i++) {
+ /* Right */
+ hx_safe_plot(grid, size, x, y + i, 0x11);
+ hx_safe_plot(grid, size, x - 1, y + i + 1, 0x10);
+ }
+}
+
+/* Plot assistant alignment patterns */
+void hx_plot_assistant(unsigned char *grid, int size, int x, int y) {
+ hx_safe_plot(grid, size, x - 1, y - 1, 0x10);
+ hx_safe_plot(grid, size, x, y - 1, 0x10);
+ hx_safe_plot(grid, size, x + 1, y - 1, 0x10);
+ hx_safe_plot(grid, size, x - 1, y, 0x10);
+ hx_safe_plot(grid, size, x, y, 0x11);
+ hx_safe_plot(grid, size, x + 1, y, 0x10);
+ hx_safe_plot(grid, size, x - 1, y + 1, 0x10);
+ hx_safe_plot(grid, size, x, y + 1, 0x10);
+ hx_safe_plot(grid, size, x + 1, y + 1, 0x10);
+}
+
+/* Put static elements in the grid */
+void hx_setup_grid(unsigned char* grid, int size, int version) {
+ int i, j;
+
+ for (i = 0; i < size; i++) {
+ for (j = 0; j < size; j++) {
+ grid[(i * size) + j] = 0;
+ }
+ }
+
+ /* Add finder patterns */
+ hx_place_finder_top_left(grid, size);
+ hx_place_finder(grid, size, 0, size - 7);
+ hx_place_finder(grid, size, size - 7, 0);
+ hx_place_finder_bottom_right(grid, size);
+
+ /* Add finder pattern separator region */
+ for (i = 0; i < 8; i++) {
+ /* Top left */
+ grid[(7 * size) + i] = 0x10;
+ grid[(i * size) + 7] = 0x10;
+
+ /* Top right */
+ grid[(7 * size) + (size - i - 1)] = 0x10;
+ grid[((size - i - 1) * size) + 7] = 0x10;
+
+ /* Bottom left */
+ grid[(i * size) + (size - 8)] = 0x10;
+ grid[((size - 8) * size) + i] = 0x10;
+
+ /* Bottom right */
+ grid[((size - 8) * size) + (size - i - 1)] = 0x10;
+ grid[((size - i - 1) * size) + (size - 8)] = 0x10;
+ }
+
+ /* Reserve function information region */
+ for (i = 0; i < 9; i++) {
+ /* Top left */
+ grid[(8 * size) + i] = 0x10;
+ grid[(i * size) + 8] = 0x10;
+
+ /* Top right */
+ grid[(8 * size) + (size - i - 1)] = 0x10;
+ grid[((size - i - 1) * size) + 8] = 0x10;
+
+ /* Bottom left */
+ grid[(i * size) + (size - 9)] = 0x10;
+ grid[((size - 9) * size) + i] = 0x10;
+
+ /* Bottom right */
+ grid[((size - 9) * size) + (size - i - 1)] = 0x10;
+ grid[((size - i - 1) * size) + (size - 9)] = 0x10;
+ }
+
+ if (version > 3) {
+ int k = hx_module_k[version - 1];
+ int r = hx_module_r[version - 1];
+ int m = hx_module_m[version - 1];
+ int x, y, row_switch, column_switch;
+ int module_height, module_width;
+ int mod_x, mod_y;
+
+ /* Add assistant alignment patterns to left and right */
+ y = 0;
+ mod_y = 0;
+ do {
+ if (mod_y < m) {
+ module_height = k;
+ } else {
+ module_height = r - 1;
+ }
+
+ if ((mod_y % 2) == 0) {
+ if ((m % 2) == 1) {
+ hx_plot_assistant(grid, size, 0, y);
+ }
+ } else {
+ if ((m % 2) == 0) {
+ hx_plot_assistant(grid, size, 0, y);
+ }
+ hx_plot_assistant(grid, size, size - 1, y);
+ }
+
+ mod_y++;
+ y += module_height;
+ } while (y < size);
+
+ /* Add assistant alignment patterns to top and bottom */
+ x = (size - 1);
+ mod_x = 0;
+ do {
+ if (mod_x < m) {
+ module_width = k;
+ } else {
+ module_width = r - 1;
+ }
+
+ if ((mod_x % 2) == 0) {
+ if ((m % 2) == 1) {
+ hx_plot_assistant(grid, size, x, (size - 1));
+ }
+ } else {
+ if ((m % 2) == 0) {
+ hx_plot_assistant(grid, size, x, (size - 1));
+ }
+ hx_plot_assistant(grid, size, x, 0);
+ }
+
+ mod_x++;
+ x -= module_width;
+ } while (x >= 0);
+
+ /* Add alignment pattern */
+ column_switch = 1;
+ y = 0;
+ mod_y = 0;
+ do {
+ if (mod_y < m) {
+ module_height = k;
+ } else {
+ module_height = r - 1;
+ }
+
+ if (column_switch == 1) {
+ row_switch = 1;
+ column_switch = 0;
+ } else {
+ row_switch = 0;
+ column_switch = 1;
+ }
+
+ x = (size - 1);
+ mod_x = 0;
+ do {
+ if (mod_x < m) {
+ module_width = k;
+ } else {
+ module_width = r - 1;
+ }
+
+ if (row_switch == 1) {
+ if (!(y == 0 && x == (size - 1))) {
+ hx_plot_alignment(grid, size, x, y, module_width, module_height);
+ }
+ row_switch = 0;
+ } else {
+ row_switch = 1;
+ }
+ mod_x++;
+ x -= module_width;
+ } while (x >= 0);
+
+ mod_y++;
+ y += module_height;
+ } while (y < size);
+ }
+}
+
+/* Calculate error correction codes */
+void hx_add_ecc(unsigned char fullstream[], unsigned char datastream[], int version, int ecc_level) {
+ unsigned char data_block[180];
+ unsigned char ecc_block[36];
+ int i, j, block;
+ int batch_size, data_length, ecc_length;
+ int input_position = -1;
+ int output_position = -1;
+ int table_d1_pos = ((version - 1) * 36) + ((ecc_level - 1) * 9);
+
+ for (i = 0; i < 3; i++) {
+ batch_size = hx_table_d1[table_d1_pos + (3 * i)];
+ data_length = hx_table_d1[table_d1_pos + (3 * i) + 1];
+ ecc_length = hx_table_d1[table_d1_pos + (3 * i) + 2];
+
+ for (block = 0; block < batch_size; block++) {
+ for (j = 0; j < data_length; j++) {
+ input_position++;
+ output_position++;
+ data_block[j] = datastream[input_position];
+ fullstream[output_position] = datastream[input_position];
+ }
+
+ rs_init_gf(0x163); // x^8 + x^6 + x^5 + x + 1 = 0
+ rs_init_code(ecc_length, 1);
+ rs_encode(data_length, data_block, ecc_block);
+ rs_free();
+
+ for (j = 0; j < ecc_length; j++) {
+ output_position++;
+ fullstream[output_position] = ecc_block[ecc_length - j - 1];
+ }
+ }
+ }
+}
+
+/* Rearrange data in batches of 13 codewords (section 5.8.2) */
+void make_picket_fence(unsigned char fullstream[], unsigned char picket_fence[], int streamsize) {
+ int i, start;
+ int output_position = 0;
+
+ for (start = 0; start < 13; start++) {
+ for (i = start; i < streamsize; i += 13) {
+ if (i < streamsize) {
+ picket_fence[output_position] = fullstream[i];
+ output_position++;
+ }
+ }
+ }
+}
+
+/* Evaluate a bitmask according to table 9 */
+int hx_evaluate(unsigned char *eval, int size, int pattern) {
+ int x, y, block, weight;
+ int result = 0;
+ char state;
+ int p;
+ int a, b, afterCount, beforeCount;
+#ifndef _MSC_VER
+ char local[size * size];
+#else
+ char* local = (char *) _alloca((size * size) * sizeof (char));
+#endif
+
+ /* all four bitmask variants have been encoded in the 4 bits of the bytes
+ * that make up the grid array. select them for evaluation according to the
+ * desired pattern.*/
+ for (x = 0; x < size; x++) {
+ for (y = 0; y < size; y++) {
+ if ((eval[(y * size) + x] & (0x01 << pattern)) != 0) {
+ local[(y * size) + x] = '1';
+ } else {
+ local[(y * size) + x] = '0';
+ }
+ }
+ }
+
+ /* Test 1: 1:1:1:1:3 or 3:1:1:1:1 ratio pattern in row/column */
+ /* Vertical */
+ for (x = 0; x < size; x++) {
+ for (y = 0; y < (size - 7); y++) {
+ p = 0;
+ for (weight = 0; weight < 7; weight++) {
+ if (local[((y + weight) * size) + x] == '1') {
+ p += (0x40 >> weight);
+ }
+ }
+ if ((p == 0x57) || (p == 0x75)) {
+ /* Pattern found, check before and after */
+ beforeCount = 0;
+ for (b = (y - 3); b < y; b++) {
+ if (b < 0) {
+ beforeCount++;
+ } else {
+ if (local[(b * size) + x] == '0') {
+ beforeCount++;
+ } else {
+ beforeCount = 0;
+ }
+ }
+ }
+
+ afterCount = 0;
+ for (a = (y + 7); a <= (y + 9); a++) {
+ if (a >= size) {
+ afterCount++;
+ } else {
+ if (local[(a * size) + x] == '0') {
+ afterCount++;
+ } else {
+ afterCount = 0;
+ }
+ }
+ }
+
+ if ((beforeCount == 3) || (afterCount == 3)) {
+ /* Pattern is preceeded or followed by light area
+ 3 modules wide */
+ result += 50;
+ }
+ }
+ }
+ }
+
+ /* Horizontal */
+ for (y = 0; y < size; y++) {
+ for (x = 0; x < (size - 7); x++) {
+ p = 0;
+ for (weight = 0; weight < 7; weight++) {
+ if (local[(y * size) + x + weight] == '1') {
+ p += (0x40 >> weight);
+ }
+ }
+ if ((p == 0x57) || (p == 0x75)) {
+ /* Pattern found, check before and after */
+ beforeCount = 0;
+ for (b = (x - 3); b < x; b++) {
+ if (b < 0) {
+ beforeCount++;
+ } else {
+ if (local[(y * size) + b] == '0') {
+ beforeCount++;
+ } else {
+ beforeCount = 0;
+ }
+ }
+ }
+
+ afterCount = 0;
+ for (a = (x + 7); a <= (x + 9); a++) {
+ if (a >= size) {
+ afterCount++;
+ } else {
+ if (local[(y * size) + a] == '0') {
+ afterCount++;
+ } else {
+ afterCount = 0;
+ }
+ }
+ }
+
+ if ((beforeCount == 3) || (afterCount == 3)) {
+ /* Pattern is preceeded or followed by light area
+ 3 modules wide */
+ result += 50;
+ }
+ }
+ }
+ }
+
+ /* Test 2: Adjacent modules in row/column in same colour */
+ /* In AIMD-15 section 5.8.3.2 it is stated... “In Table 9 below, i refers to the row
+ * position of the module.†- however i being the length of the run of the
+ * same colour (i.e. "block" below) in the same fashion as ISO/IEC 18004
+ * makes more sense. -- Confirmed by Wang Yi */
+
+ /* Vertical */
+ for (x = 0; x < size; x++) {
+ state = local[x];
+ block = 0;
+ for (y = 0; y < size; y++) {
+ if (local[(y * size) + x] == state) {
+ block++;
+ } else {
+ if (block > 3) {
+ result += (3 + block) * 4;
+ }
+ block = 0;
+ state = local[(y * size) + x];
+ }
+ }
+ if (block > 3) {
+ result += (3 + block) * 4;
+ }
+ }
+
+ /* Horizontal */
+ for (y = 0; y < size; y++) {
+ state = local[y * size];
+ block = 0;
+ for (x = 0; x < size; x++) {
+ if (local[(y * size) + x] == state) {
+ block++;
+ } else {
+ if (block > 3) {
+ result += (3 + block) * 4;
+ }
+ block = 0;
+ state = local[(y * size) + x];
+ }
+ }
+ if (block > 3) {
+ result += (3 + block) * 4;
+ }
+ }
+
+ return result;
+}
+
+/* Apply the four possible bitmasks for evaluation */
+int hx_apply_bitmask(unsigned char *grid, int size) {
+ int x, y;
+ int i, j;
+ int pattern, penalty[4];
+ int best_pattern, best_val;
+ int bit;
+ unsigned char p;
+
+#ifndef _MSC_VER
+ unsigned char mask[size * size];
+ unsigned char eval[size * size];
+#else
+ unsigned char* mask = (unsigned char *) _alloca((size * size) * sizeof (unsigned char));
+ unsigned char* eval = (unsigned char *) _alloca((size * size) * sizeof (unsigned char));
+#endif
+
+ /* Perform data masking */
+ for (x = 0; x < size; x++) {
+ for (y = 0; y < size; y++) {
+ mask[(y * size) + x] = 0x00;
+ j = x + 1;
+ i = y + 1;
+
+ if (!(grid[(y * size) + x] & 0xf0)) {
+ if ((i + j) % 2 == 0) {
+ mask[(y * size) + x] += 0x02;
+ }
+ if ((((i + j) % 3) + (j % 3)) % 2 == 0) {
+ mask[(y * size) + x] += 0x04;
+ }
+ if (((i % j) + (j % i) + (i % 3) + (j % 3)) % 2 == 0) {
+ mask[(y * size) + x] += 0x08;
+ }
+ }
+ }
+ }
+
+ // apply data masks to grid, result in eval
+ for (x = 0; x < size; x++) {
+ for (y = 0; y < size; y++) {
+ if (grid[(y * size) + x] & 0x01) {
+ p = 0xff;
+ } else {
+ p = 0x00;
+ }
+
+ eval[(y * size) + x] = mask[(y * size) + x] ^ p;
+ }
+ }
+
+ /* Evaluate result */
+ for (pattern = 0; pattern < 4; pattern++) {
+ penalty[pattern] = hx_evaluate(eval, size, pattern);
+ }
+
+ best_pattern = 0;
+ best_val = penalty[0];
+ for (pattern = 1; pattern < 4; pattern++) {
+ if (penalty[pattern] < best_val) {
+ best_pattern = pattern;
+ best_val = penalty[pattern];
+ }
+ }
+
+ /* Apply mask */
+ for (x = 0; x < size; x++) {
+ for (y = 0; y < size; y++) {
+ bit = 0;
+ switch (best_pattern) {
+ case 0: if (mask[(y * size) + x] & 0x01) {
+ bit = 1;
+ }
+ break;
+ case 1: if (mask[(y * size) + x] & 0x02) {
+ bit = 1;
+ }
+ break;
+ case 2: if (mask[(y * size) + x] & 0x04) {
+ bit = 1;
+ }
+ break;
+ case 3: if (mask[(y * size) + x] & 0x08) {
+ bit = 1;
+ }
+ break;
+ }
+ if (bit == 1) {
+ if (grid[(y * size) + x] & 0x01) {
+ grid[(y * size) + x] = 0x00;
+ } else {
+ grid[(y * size) + x] = 0x01;
+ }
+ }
+ }
+ }
+
+ return best_pattern;
+}
+
+/* Han Xin Code - main */
+int han_xin(struct zint_symbol *symbol, const unsigned char source[], size_t length) {
+ int est_binlen;
+ int ecc_level = symbol->option_1;
+ int i, j, version, posn = 0;
+ int data_codewords = 0, size;
+ int codewords;
+ int bitmask;
+ int error_number;
+ int bin_len;
+ int done;
+ char function_information[36];
+ unsigned char fi_cw[3] = {0, 0, 0};
+ unsigned char fi_ecc[4];
+
+#ifndef _MSC_VER
+ int utfdata[length + 1];
+ int gbdata[(length + 1) * 2];
+ char mode[length + 1];
+#else
+ int* utfdata = (int *) _alloca((length + 1) * sizeof (int));
+ int* gbdata = (int *) _alloca(((length + 1) * 2) * sizeof (int));
+ char* mode = (char *) _alloca((length + 1) * sizeof (char));
+ char* binary;
+ unsigned char *datastream;
+ unsigned char *fullstream;
+ unsigned char *picket_fence;
+ unsigned char *grid;
+#endif
+
+ if ((symbol->input_mode == DATA_MODE) || (symbol->eci != 3)) {
+ for (i = 0; i < length; i++) {
+ gbdata[i] = (int) source[i];
+ }
+ } else {
+ /* Convert Unicode input to GB-18030 */
+ error_number = utf8toutf16(symbol, source, utfdata, &length);
+ if (error_number != 0) {
+ return error_number;
+ }
+
+ posn = 0;
+ for (i = 0; i < length; i++) {
+ done = 0;
+ gbdata[posn] = 0;
+
+ /* Single byte characters in range U+0000 -> U+007F */
+ if (utfdata[i] <= 0x7f) {
+ gbdata[posn] = utfdata[i];
+ posn++;
+ done = 1;
+ }
+
+ /* Two bytes characters in GB-2312 */
+ if (done == 0) {
+ j = 0;
+ do {
+ if (gb2312_lookup[j * 2] == utfdata[i]) {
+ gbdata[posn] = gb2312_lookup[(j * 2) + 1];
+ posn++;
+ done = 1;
+ }
+ j++;
+ } while ((j < 7445) && (done == 0));
+ }
+
+ /* Two byte characters in GB-18030 */
+ if (done == 0) {
+ j = 0;
+ do {
+ if (gb18030_twobyte_lookup[j * 2] == utfdata[i]) {
+ gbdata[posn] = gb18030_twobyte_lookup[(j * 2) + 1];
+ posn++;
+ done = 1;
+ }
+ j++;
+ } while ((j < 16495) && (done == 0));
+ }
+
+ /* Four byte characters in range U+0080 -> U+FFFF */
+ if (done == 0) {
+ j = 0;
+ do {
+ if (gb18030_fourbyte_lookup[j * 3] == utfdata[i]) {
+ gbdata[posn] = gb18030_fourbyte_lookup[(j * 3) + 1];
+ gbdata[posn + 1] = gb18030_fourbyte_lookup[(j * 3) + 2];
+ posn += 2;
+ done = 1;
+ }
+ j++;
+ } while ((j < 6793) && (done == 0));
+ }
+
+ /* Supplementary planes U+10000 -> U+1FFFF */
+ if (done == 0) {
+ if (utfdata[i] >= 0x10000 && utfdata[i] < 0x110000) {
+ /* algorithm from libiconv-1.15\lib\gb18030.h */
+ int j, r3, r2, r1, r0;
+
+ j = utfdata[i] - 0x10000;
+ r3 = (j % 10) + 0x30; j = j / 10;
+ r2 = (j % 126) + 0x81; j = j / 126;
+ r1 = (j % 10) + 0x30; j = j / 10;
+ r0 = j + 0x90;
+ gbdata[posn] = (r0 << 8) + r1;
+ gbdata[posn + 1] = (r2 << 8) + r3;
+ posn += 2;
+ done = 1;
+ }
+ }
+
+ /* Character not found */
+ if (done == 0) {
+ strcpy(symbol->errtxt, "540: Unknown character in input data");
+ return ZINT_ERROR_INVALID_DATA;
+ }
+ }
+ length = posn;
+ }
+
+ hx_define_mode(mode, gbdata, length);
+
+ est_binlen = calculate_binlength(mode, gbdata, length, symbol->eci);
+
+#ifndef _MSC_VER
+ char binary[est_binlen + 10];
+#else
+ binary = (char *) _alloca((est_binlen + 10) * sizeof (char));
+#endif
+ memset(binary, 0, (est_binlen + 1) * sizeof (char));
+
+ if ((ecc_level <= 0) || (ecc_level >= 5)) {
+ ecc_level = 1;
+ }
+
+ calculate_binary(binary, mode, gbdata, length, symbol->eci, symbol->debug);
+ bin_len = strlen(binary);
+ codewords = bin_len / 8;
+ if (bin_len % 8 != 0) {
+ codewords++;
+ }
+
+ version = 85;
+ for (i = 84; i > 0; i--) {
+ switch (ecc_level) {
+ case 1:
+ if (hx_data_codewords_L1[i - 1] > codewords) {
+ version = i;
+ data_codewords = hx_data_codewords_L1[i - 1];
+ }
+ break;
+ case 2:
+ if (hx_data_codewords_L2[i - 1] > codewords) {
+ version = i;
+ data_codewords = hx_data_codewords_L2[i - 1];
+ }
+ break;
+ case 3:
+ if (hx_data_codewords_L3[i - 1] > codewords) {
+ version = i;
+ data_codewords = hx_data_codewords_L3[i - 1];
+ }
+ break;
+ case 4:
+ if (hx_data_codewords_L4[i - 1] > codewords) {
+ version = i;
+ data_codewords = hx_data_codewords_L4[i - 1];
+ }
+ break;
+ default:
+ assert(0);
+ break;
+ }
+ }
+
+ if (version == 85) {
+ strcpy(symbol->errtxt, "541: Input too long for selected error correction level");
+ return ZINT_ERROR_TOO_LONG;
+ }
+
+ if ((symbol->option_2 < 0) || (symbol->option_2 > 84)) {
+ symbol->option_2 = 0;
+ }
+
+ if (symbol->option_2 > version) {
+ version = symbol->option_2;
+ }
+
+ if ((symbol->option_2 != 0) && (symbol->option_2 < version)) {
+ strcpy(symbol->errtxt, "542: Input too long for selected symbol size");
+ return ZINT_ERROR_TOO_LONG;
+ }
+
+ /* If there is spare capacity, increase the level of ECC */
+
+ if ((ecc_level == 1) && (codewords < hx_data_codewords_L2[version - 1])) {
+ ecc_level = 2;
+ data_codewords = hx_data_codewords_L2[version - 1];
+ }
+
+ if ((ecc_level == 2) && (codewords < hx_data_codewords_L3[version - 1])) {
+ ecc_level = 3;
+ data_codewords = hx_data_codewords_L3[version - 1];
+ }
+
+ if ((ecc_level == 3) && (codewords < hx_data_codewords_L4[version - 1])) {
+ ecc_level = 4;
+ data_codewords = hx_data_codewords_L4[version - 1];
+ }
+
+ //printf("Version %d, ECC %d\n", version, ecc_level);
+
+ size = (version * 2) + 21;
+
+#ifndef _MSC_VER
+ unsigned char datastream[data_codewords];
+ unsigned char fullstream[hx_total_codewords[version - 1]];
+ unsigned char picket_fence[hx_total_codewords[version - 1]];
+ unsigned char grid[size * size];
+#else
+ datastream = (unsigned char *) _alloca((data_codewords) * sizeof (unsigned char));
+ fullstream = (unsigned char *) _alloca((hx_total_codewords[version - 1]) * sizeof (unsigned char));
+ picket_fence = (unsigned char *) _alloca((hx_total_codewords[version - 1]) * sizeof (unsigned char));
+ grid = (unsigned char *) _alloca((size * size) * sizeof (unsigned char));
+#endif
+
+ for (i = 0; i < data_codewords; i++) {
+ datastream[i] = 0;
+ }
+
+ for (i = 0; i < bin_len; i++) {
+ if (binary[i] == '1') {
+ datastream[i / 8] += 0x80 >> (i % 8);
+ }
+ }
+
+ hx_setup_grid(grid, size, version);
+
+ hx_add_ecc(fullstream, datastream, version, ecc_level);
+
+ make_picket_fence(fullstream, picket_fence, hx_total_codewords[version - 1]);
+
+ /* Populate grid */
+ j = 0;
+ for (i = 0; i < (size * size); i++) {
+ if (grid[i] == 0x00) {
+ if (j < (hx_total_codewords[version - 1] * 8)) {
+ if (picket_fence[(j / 8)] & (0x80 >> (j % 8))) {
+ grid[i] = 0x01;
+ }
+ j++;
+ }
+ }
+ }
+
+ bitmask = hx_apply_bitmask(grid, size);
+
+ /* Form function information string */
+ for (i = 0; i < 34; i++) {
+ if (i % 2) {
+ function_information[i] = '1';
+ } else {
+ function_information[i] = '0';
+ }
+ }
+ function_information[34] = '\0';
+
+ for (i = 0; i < 8; i++) {
+ if ((version + 20) & (0x80 >> i)) {
+ function_information[i] = '1';
+ } else {
+ function_information[i] = '0';
+ }
+ }
+
+ for (i = 0; i < 2; i++) {
+ if ((ecc_level - 1) & (0x02 >> i)) {
+ function_information[i + 8] = '1';
+ } else {
+ function_information[i + 8] = '0';
+ }
+ }
+
+ for (i = 0; i < 2; i++) {
+ if (bitmask & (0x02 >> i)) {
+ function_information[i + 10] = '1';
+ } else {
+ function_information[i + 10] = '0';
+ }
+ }
+
+
+
+ for (i = 0; i < 3; i++) {
+ for (j = 0; j < 4; j++) {
+ if (function_information[(i * 4) + j] == '1') {
+ fi_cw[i] += (0x08 >> j);
+ }
+ }
+ }
+
+ rs_init_gf(0x13);
+ rs_init_code(4, 1);
+ rs_encode(3, fi_cw, fi_ecc);
+ rs_free();
+
+ for (i = 0; i < 4; i++) {
+ for (j = 0; j < 4; j++) {
+ if (fi_ecc[3 - i] & (0x08 >> j)) {
+ function_information[(i * 4) + j + 12] = '1';
+ } else {
+ function_information[(i * 4) + j + 12] = '0';
+ }
+ }
+ }
+
+ /* Add function information to symbol */
+ for (i = 0; i < 9; i++) {
+ if (function_information[i] == '1') {
+ grid[(8 * size) + i] = 0x01;
+ grid[((size - 8 - 1) * size) + (size - i - 1)] = 0x01;
+ }
+ if (function_information[i + 8] == '1') {
+ grid[((8 - i) * size) + 8] = 0x01;
+ grid[((size - 8 - 1 + i) * size) + (size - 8 - 1)] = 0x01;
+ }
+ if (function_information[i + 17] == '1') {
+ grid[(i * size) + (size - 1 - 8)] = 0x01;
+ grid[((size - 1 - i) * size) + 8] = 0x01;
+ }
+ if (function_information[i + 25] == '1') {
+ grid[(8 * size) + (size - 1 - 8 + i)] = 0x01;
+ grid[((size - 1 - 8) * size) + (8 - i)] = 0x01;
+ }
+ }
+
+ symbol->width = size;
+ symbol->rows = size;
+
+ for (i = 0; i < size; i++) {
+ for (j = 0; j < size; j++) {
+ if (grid[(i * size) + j] & 0x01) {
+ set_module(symbol, i, j);
+ }
+ }
+ symbol->row_height[i] = 1;
+ }
+
+ return 0;
+}
diff --git a/3rdparty/zint-2.6.1/backend/hanxin.h b/3rdparty/zint-2.6.1/backend/hanxin.h
new file mode 100644
index 0000000..1ad4685
--- /dev/null
+++ b/3rdparty/zint-2.6.1/backend/hanxin.h
@@ -0,0 +1,460 @@
+/* hanxin.h - definitions for Han Xin code
+
+ libzint - the open source barcode library
+ Copyright (C) 2009-2017 Robin Stuart
+ Copyright (C) 2016 Zoe Stuart
+
+ Redistribution and use in source and binary forms, with or without
+ modification, are permitted provided that the following conditions
+ are met:
+
+ 1. Redistributions of source code must retain the above copyright
+ notice, this list of conditions and the following disclaimer.
+ 2. Redistributions in binary form must reproduce the above copyright
+ notice, this list of conditions and the following disclaimer in the
+ documentation and/or other materials provided with the distribution.
+ 3. Neither the name of the project nor the names of its contributors
+ may be used to endorse or promote products derived from this software
+ without specific prior written permission.
+
+ THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND
+ ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+ ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE
+ FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+ DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
+ OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
+ HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
+ LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
+ OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+ SUCH DAMAGE.
+ */
+
+/* Data from table B1: Data capacity of Han Xin Code */
+static const unsigned short int hx_total_codewords[] = {
+ 25, 37, 50, 54, 69, 84, 100, 117, 136, 155, 161, 181, 203, 225, 249,
+ 273, 299, 325, 353, 381, 411, 422, 453, 485, 518, 552, 587, 623, 660,
+ 698, 737, 754, 794, 836, 878, 922, 966, 1011, 1058, 1105, 1126, 1175,
+ 1224, 1275, 1327, 1380, 1434, 1489, 1513, 1569, 1628, 1686, 1745, 1805,
+ 1867, 1929, 1992, 2021, 2086, 2151, 2218, 2286, 2355, 2425, 2496, 2528,
+ 2600, 2673, 2749, 2824, 2900, 2977, 3056, 3135, 3171, 3252, 3334, 3416,
+ 3500, 3585, 3671, 3758, 3798, 3886
+};
+
+static const unsigned short int hx_data_codewords_L1[] = {
+ 21, 31, 42, 46, 57, 70, 84, 99, 114, 131, 135, 153, 171, 189, 209, 229,
+ 251, 273, 297, 321, 345, 354, 381, 407, 436, 464, 493, 523, 554, 586, 619,
+ 634, 666, 702, 738, 774, 812, 849, 888, 929, 946, 987, 1028, 1071, 1115,
+ 1160, 1204, 1251, 1271, 1317, 1368, 1416, 1465, 1517, 1569, 1621, 1674,
+ 1697, 1752, 1807, 1864, 1920, 1979, 2037, 2096, 2124, 2184, 2245, 2309,
+ 2372, 2436, 2501, 2568, 2633, 2663, 2732, 2800, 2870, 2940, 3011,
+ 3083, 3156, 3190, 3264
+};
+
+static const unsigned short int hx_data_codewords_L2[] = {
+ 17, 25, 34, 38, 49, 58, 70, 81, 96, 109, 113, 127, 143, 157, 175, 191, 209,
+ 227, 247, 267, 287, 296, 317, 339, 362, 386, 411, 437, 462, 488, 515, 528,
+ 556, 586, 614, 646, 676, 707, 740, 773, 788, 823, 856, 893, 929, 966, 1004,
+ 1043, 1059, 1099, 1140, 1180, 1221, 1263, 1307, 1351, 1394, 1415, 1460,
+ 1505, 1552, 1600, 1649, 1697, 1748, 1770, 1820, 1871, 1925, 1976, 2030,
+ 2083, 2140, 2195, 2219, 2276, 2334, 2392, 2450, 2509, 2569, 2630, 2658,
+ 2720
+};
+
+static const unsigned short int hx_data_codewords_L3[] = {
+ 13, 19, 26, 30, 37, 46, 54, 63, 74, 83, 87, 97, 109, 121, 135, 147, 161,
+ 175, 191, 205, 221, 228, 245, 261, 280, 298, 317, 337, 358, 376, 397, 408,
+ 428, 452, 474, 498, 522, 545, 572, 597, 608, 635, 660, 689, 717, 746, 774,
+ 805, 817, 847, 880, 910, 943, 975, 1009, 1041, 1076, 1091, 1126, 1161, 1198,
+ 1234, 1271, 1309, 1348, 1366, 1404, 1443, 1485, 1524, 1566, 1607, 1650, 1693,
+ 1713, 1756, 1800, 1844, 1890, 1935, 1983, 2030, 2050, 2098
+};
+
+static const unsigned short int hx_data_codewords_L4[] = {
+ 9, 15, 20, 22, 27, 34, 40, 47, 54, 61, 65, 73, 81, 89, 99, 109, 119, 129,
+ 141, 153, 165, 168, 181, 195, 208, 220, 235, 251, 264, 280, 295, 302, 318,
+ 334, 352, 368, 386, 405, 424, 441, 450, 469, 490, 509, 531, 552, 574, 595, 605,
+ 627, 652, 674, 697, 721, 747, 771, 796, 809, 834, 861, 892, 914, 941, 969, 998,
+ 1012, 1040, 1069, 1099, 1130, 1160, 1191, 1222, 1253, 1269, 1300, 1334,
+ 1366, 1400, 1433, 1469, 1504, 1520, 1554
+};
+
+/* Value 'k' from Annex A */
+static const char hx_module_k[] = {
+ 0, 0, 0, 14, 16, 16, 17, 18, 19, 20,
+ 14, 15, 16, 16, 17, 17, 18, 19, 20, 20,
+ 21, 16, 17, 17, 18, 18, 19, 19, 20, 20,
+ 21, 17, 17, 18, 18, 19, 19, 19, 20, 20,
+ 17, 17, 18, 18, 18, 19, 19, 19, 17, 17,
+ 18, 18, 18, 18, 19, 19, 19, 17, 17, 18,
+ 18, 18, 18, 19, 19, 17, 17, 17, 18, 18,
+ 18, 18, 19, 19, 17, 17, 17, 18, 18, 18,
+ 18, 18, 17, 17
+};
+
+/* Value 'r' from Annex A */
+static const char hx_module_r[] = {
+ 0, 0, 0, 15, 15, 17, 18, 19, 20, 21,
+ 15, 15, 15, 17, 17, 19, 19, 19, 19, 21,
+ 21, 17, 16, 18, 17, 19, 18, 20, 19, 21,
+ 20, 17, 19, 17, 19, 17, 19, 21, 19, 21,
+ 18, 20, 17, 19, 21, 18, 20, 22, 17, 19,
+ 15, 17, 19, 21, 17, 19, 21, 18, 20, 15,
+ 17, 19, 21, 16, 18, 17, 19, 21, 15, 17,
+ 19, 21, 15, 17, 18, 20, 22, 15, 17, 19,
+ 21, 23, 17, 19
+};
+
+/* Value of 'm' from Annex A */
+static const char hx_module_m[] = {
+ 0, 0, 0, 1, 1, 1, 1, 1, 1, 1,
+ 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
+ 2, 3, 3, 3, 3, 3, 3, 3, 3, 3,
+ 3, 4, 4, 4, 4, 4, 4, 4, 4, 4,
+ 5, 5, 5, 5, 5, 5, 5, 5, 6, 6,
+ 6, 6, 6, 6, 6, 6, 6, 7, 7, 7,
+ 7, 7, 7, 7, 7, 8, 8, 8, 8, 8,
+ 8, 8, 8, 8, 9, 9, 9, 9, 9, 9,
+ 9, 9, 10, 10
+};
+
+/* Error correction block sizes from Table D1 */
+static const unsigned short int hx_table_d1[] = {
+ /* #blocks, k, 2t, #blocks, k, 2t, #blocks, k, 2t */
+ 1, 21, 4, 0, 0, 0, 0, 0, 0, // version 1
+ 1, 17, 8, 0, 0, 0, 0, 0, 0,
+ 1, 13, 12, 0, 0, 0, 0, 0, 0,
+ 1, 9, 16, 0, 0, 0, 0, 0, 0,
+ 1, 31, 6, 0, 0, 0, 0, 0, 0, // version 2
+ 1, 25, 12, 0, 0, 0, 0, 0, 0,
+ 1, 19, 18, 0, 0, 0, 0, 0, 0,
+ 1, 15, 22, 0, 0, 0, 0, 0, 0,
+ 1, 42, 8, 0, 0, 0, 0, 0, 0, // version 3
+ 1, 34, 16, 0, 0, 0, 0, 0, 0,
+ 1, 26, 24, 0, 0, 0, 0, 0, 0,
+ 1, 20, 30, 0, 0, 0, 0, 0, 0,
+ 1, 46, 8, 0, 0, 0, 0, 0, 0, // version 4
+ 1, 38, 16, 0, 0, 0, 0, 0, 0,
+ 1, 30, 24, 0, 0, 0, 0, 0, 0,
+ 1, 22, 32, 0, 0, 0, 0, 0, 0,
+ 1, 57, 12, 0, 0, 0, 0, 0, 0, // version 5
+ 1, 49, 20, 0, 0, 0, 0, 0, 0,
+ 1, 37, 32, 0, 0, 0, 0, 0, 0,
+ 1, 14, 20, 1, 13, 22, 0, 0, 0,
+ 1, 70, 14, 0, 0, 0, 0, 0, 0, // version 6
+ 1, 58, 26, 0, 0, 0, 0, 0, 0,
+ 1, 24, 20, 1, 22, 18, 0, 0, 0,
+ 1, 16, 24, 1, 18, 26, 0, 0, 0,
+ 1, 84, 16, 0, 0, 0, 0, 0, 0, // version 7
+ 1, 70, 30, 0, 0, 0, 0, 0, 0,
+ 1, 26, 22, 1, 28, 24, 0, 0, 0,
+ 2, 14, 20, 1, 12, 20, 0, 0, 0,
+ 1, 99, 18, 0, 0, 0, 0, 0, 0, // version 8
+ 1, 40, 18, 1, 41, 18, 0, 0, 0,
+ 1, 31, 26, 1, 32, 28, 0, 0, 0,
+ 2, 16, 24, 1, 15, 22, 0, 0, 0,
+ 1, 114, 22, 0, 0, 0, 0, 0, 0, // version 9
+ 2, 48, 20, 0, 0, 0, 0, 0, 0,
+ 2, 24, 20, 1, 26, 22, 0, 0, 0,
+ 2, 18, 28, 1, 18, 26, 0, 0, 0,
+ 1, 131, 24, 0, 0, 0, 0, 0, 0, // version 10
+ 1, 52, 22, 1, 57, 24, 0, 0, 0,
+ 2, 27, 24, 1, 29, 24, 0, 0, 0,
+ 2, 21, 32, 1, 19, 30, 0, 0, 0,
+ 1, 135, 26, 0, 0, 0, 0, 0, 0, // version 11
+ 1, 56, 24, 1, 57, 24, 0, 0, 0,
+ 2, 28, 24, 1, 31, 26, 0, 0, 0,
+ 2, 22, 32, 1, 21, 32, 0, 0, 0,
+ 1, 153, 28, 0, 0, 0, 0, 0, 0, // version 12
+ 1, 62, 26, 1, 65, 28, 0, 0, 0,
+ 2, 32, 28, 1, 33, 28, 0, 0, 0,
+ 3, 17, 26, 1, 22, 30, 0, 0, 0,
+ 1, 86, 16, 1, 85, 16, 0, 0, 0, // version 13
+ 1, 71, 30, 1, 72, 30, 0, 0, 0,
+ 2, 37, 32, 1, 35, 30, 0, 0, 0,
+ 3, 20, 30, 1, 21, 32, 0, 0, 0,
+ 1, 94, 18, 1, 95, 18, 0, 0, 0, // version 14
+ 2, 51, 22, 1, 55, 24, 0, 0, 0,
+ 3, 30, 26, 1, 31, 26, 0, 0, 0,
+ 4, 18, 28, 1, 17, 24, 0, 0, 0,
+ 1, 104, 20, 1, 105, 20, 0, 0, 0, // version 15
+ 2, 57, 24, 1, 61, 26, 0, 0, 0,
+ 3, 33, 28, 1, 36, 30, 0, 0, 0,
+ 4, 20, 30, 1, 19, 30, 0, 0, 0,
+ 1, 115, 22, 1, 114, 22, 0, 0, 0, // version 16
+ 2, 65, 28, 1, 61, 26, 0, 0, 0,
+ 3, 38, 32, 1, 33, 30, 0, 0, 0,
+ 5, 19, 28, 1, 14, 24, 0, 0, 0,
+ 1, 126, 24, 1, 125, 24, 0, 0, 0, // version 17
+ 2, 70, 30, 1, 69, 30, 0, 0, 0,
+ 4, 33, 28, 1, 29, 26, 0, 0, 0,
+ 5, 20, 30, 1, 19, 30, 0, 0, 0,
+ 1, 136, 26, 1, 137, 26, 0, 0, 0, //version 18
+ 3, 56, 24, 1, 59, 26, 0, 0, 0,
+ 5, 35, 30, 0, 0, 0, 0, 0, 0,
+ 6, 18, 28, 1, 21, 28, 0, 0, 0,
+ 1, 148, 28, 1, 149, 28, 0, 0, 0, // version 19
+ 3, 61, 26, 1, 64, 28, 0, 0, 0,
+ 7, 24, 20, 1, 23, 22, 0, 0, 0,
+ 6, 20, 30, 1, 21, 32, 0, 0, 0,
+ 3, 107, 20, 0, 0, 0, 0, 0, 0, // version 20
+ 3, 65, 28, 1, 72, 30, 0, 0, 0,
+ 7, 26, 22, 1, 23, 22, 0, 0, 0,
+ 7, 19, 28, 1, 20, 32, 0, 0, 0,
+ 3, 115, 22, 0, 0, 0, 0, 0, 0, // version 21
+ 4, 56, 24, 1, 63, 28, 0, 0, 0,
+ 7, 28, 24, 1, 25, 22, 0, 0, 0,
+ 8, 18, 28, 1, 21, 22, 0, 0, 0,
+ 2, 116, 22, 1, 122, 24, 0, 0, 0, // version 22
+ 4, 56, 24, 1, 72, 30, 0, 0, 0,
+ 7, 28, 24, 1, 32, 26, 0, 0, 0,
+ 8, 18, 28, 1, 24, 30, 0, 0, 0,
+ 3, 127, 24, 0, 0, 0, 0, 0, 0, // version 23
+ 5, 51, 22, 1, 62, 26, 0, 0, 0,
+ 7, 30, 26, 1, 35, 26, 0, 0, 0,
+ 8, 20, 30, 1, 21, 32, 0, 0, 0,
+ 2, 135, 26, 1, 137, 26, 0, 0, 0, // version 24
+ 5, 56, 24, 1, 59, 26, 0, 0, 0,
+ 7, 33, 28, 1, 30, 28, 0, 0, 0,
+ 11, 16, 24, 1, 19, 26, 0, 0, 0,
+ 3, 105, 20, 1, 121, 22, 0, 0, 0, // version 25
+ 5, 61, 26, 1, 57, 26, 0, 0, 0,
+ 9, 28, 24, 1, 28, 22, 0, 0, 0,
+ 10, 19, 28, 1, 18, 30, 0, 0, 0,
+ 2, 157, 30, 1, 150, 28, 0, 0, 0, // version 26
+ 5, 65, 28, 1, 61, 26, 0, 0, 0,
+ 8, 33, 28, 1, 34, 30, 0, 0, 0,
+ 10, 19, 28, 2, 15, 26, 0, 0, 0,
+ 3, 126, 24, 1, 115, 22, 0, 0, 0, // version 27
+ 7, 51, 22, 1, 54, 22, 0, 0, 0,
+ 8, 35, 30, 1, 37, 30, 0, 0, 0,
+ 15, 15, 22, 1, 10, 22, 0, 0, 0,
+ 4, 105, 20, 1, 103, 20, 0, 0, 0, // version 28
+ 7, 56, 24, 1, 45, 18, 0, 0, 0,
+ 10, 31, 26, 1, 27, 26, 0, 0, 0,
+ 10, 17, 26, 3, 20, 28, 1, 21, 28,
+ 3, 139, 26, 1, 137, 28, 0, 0, 0, // version 29
+ 6, 66, 28, 1, 66, 30, 0, 0, 0,
+ 9, 36, 30, 1, 34, 32, 0, 0, 0,
+ 13, 19, 28, 1, 17, 32, 0, 0, 0,
+ 6, 84, 16, 1, 82, 16, 0, 0, 0, // version 30
+ 6, 70, 30, 1, 68, 30, 0, 0, 0,
+ 7, 35, 30, 3, 33, 28, 1, 32, 28,
+ 13, 20, 30, 1, 20, 28, 0, 0, 0,
+ 5, 105, 20, 1, 94, 18, 0, 0, 0, // version 31
+ 6, 74, 32, 1, 71, 30, 0, 0, 0,
+ 11, 33, 28, 1, 34, 32, 0, 0, 0,
+ 13, 19, 28, 3, 16, 26, 0, 0, 0,
+ 4, 127, 24, 1, 126, 24, 0, 0, 0, // version 32
+ 7, 66, 28, 1, 66, 30, 0, 0, 0,
+ 12, 30, 24, 1, 24, 28, 1, 24, 30,
+ 15, 19, 28, 1, 17, 32, 0, 0, 0,
+ 7, 84, 16, 1, 78, 16, 0, 0, 0, // version 33
+ 7, 70, 30, 1, 66, 28, 0, 0, 0,
+ 12, 33, 28, 1, 32, 30, 0, 0, 0,
+ 14, 21, 32, 1, 24, 28, 0, 0, 0,
+ 5, 117, 22, 1, 117, 24, 0, 0, 0, // version 34
+ 8, 66, 28, 1, 58, 26, 0, 0, 0,
+ 11, 38, 32, 1, 34, 32, 0, 0, 0,
+ 15, 20, 30, 2, 17, 26, 0, 0, 0,
+ 4, 148, 28, 1, 146, 28, 0, 0, 0, // version 35
+ 8, 68, 30, 1, 70, 24, 0, 0, 0,
+ 10, 36, 32, 3, 38, 28, 0, 0, 0,
+ 16, 19, 28, 3, 16, 26, 0, 0, 0,
+ 4, 126, 24, 2, 135, 26, 0, 0, 0, // version 36
+ 8, 70, 28, 2, 43, 26, 0, 0, 0,
+ 13, 32, 28, 2, 41, 30, 0, 0, 0,
+ 17, 19, 28, 3, 15, 26, 0, 0, 0,
+ 5, 136, 26, 1, 132, 24, 0, 0, 0, // version 37
+ 5, 67, 30, 4, 68, 28, 1, 69, 28,
+ 14, 35, 30, 1, 32, 24, 0, 0, 0,
+ 18, 18, 26, 3, 16, 28, 1, 14, 28,
+ 3, 142, 26, 3, 141, 28, 0, 0, 0, // version 38
+ 8, 70, 30, 1, 73, 32, 1, 74, 32,
+ 12, 34, 30, 3, 34, 26, 1, 35, 28,
+ 18, 21, 32, 1, 27, 30, 0, 0, 0,
+ 5, 116, 22, 2, 103, 20, 1, 102, 20, // version 39
+ 9, 74, 32, 1, 74, 30, 0, 0, 0,
+ 14, 34, 28, 2, 32, 32, 1, 32, 30,
+ 19, 21, 32, 1, 25, 26, 0, 0, 0,
+ 7, 116, 22, 1, 117, 22, 0, 0, 0, // version 40
+ 11, 65, 28, 1, 58, 24, 0, 0, 0,
+ 15, 38, 32, 1, 27, 28, 0, 0, 0,
+ 20, 20, 30, 1, 20, 32, 1, 21, 32,
+ 6, 136, 26, 1, 130, 24, 0, 0, 0, // version 41
+ 11, 66, 28, 1, 62, 30, 0, 0, 0,
+ 14, 34, 28, 3, 34, 32, 1, 30, 30,
+ 18, 20, 30, 3, 20, 28, 2, 15, 26,
+ 5, 105, 20, 2, 115, 22, 2, 116, 22, // version 42
+ 10, 75, 32, 1, 73, 32, 0, 0, 0,
+ 16, 38, 32, 1, 27, 28, 0, 0, 0,
+ 22, 19, 28, 2, 16, 30, 1, 19, 30,
+ 6, 147, 28, 1, 146, 28, 0, 0, 0, // version 43
+ 11, 66, 28, 2, 65, 30, 0, 0, 0,
+ 18, 33, 28, 2, 33, 30, 0, 0, 0,
+ 22, 21, 32, 1, 28, 30, 0, 0, 0,
+ 6, 116, 22, 3, 125, 24, 0, 0, 0, // version 44
+ 11, 75, 32, 1, 68, 30, 0, 0, 0,
+ 13, 35, 28, 6, 34, 32, 1, 30, 30,
+ 23, 21, 32, 1, 26, 30, 0, 0, 0,
+ 7, 105, 20, 4, 95, 18, 0, 0, 0, // version 45
+ 12, 67, 28, 1, 63, 30, 1, 62, 32,
+ 21, 31, 26, 2, 33, 32, 0, 0, 0,
+ 23, 21, 32, 2, 24, 30, 0, 0, 0,
+ 10, 116, 22, 0, 0, 0, 0, 0, 0, // version 46
+ 12, 74, 32, 1, 78, 30, 0, 0, 0,
+ 18, 37, 32, 1, 39, 30, 1, 41, 28,
+ 25, 21, 32, 1, 27, 28, 0, 0, 0,
+ 5, 126, 24, 4, 115, 22, 1, 114, 22, // version 47
+ 12, 67, 28, 2, 66, 32, 1, 68, 30,
+ 21, 35, 30, 1, 39, 30, 0, 0, 0,
+ 26, 21, 32, 1, 28, 28, 0, 0, 0,
+ 9, 126, 24, 1, 117, 22, 0, 0, 0, // version 48
+ 13, 75, 32, 1, 68, 30, 0, 0, 0,
+ 20, 35, 30, 3, 35, 28, 0, 0, 0,
+ 27, 21, 32, 1, 28, 30, 0, 0, 0,
+ 9, 126, 24, 1, 137, 26, 0, 0, 0, // version 49
+ 13, 71, 30, 2, 68, 32, 0, 0, 0,
+ 20, 37, 32, 1, 39, 28, 1, 38, 28,
+ 24, 20, 32, 5, 25, 28, 0, 0, 0,
+ 8, 147, 28, 1, 141, 28, 0, 0, 0, // version 50
+ 10, 73, 32, 4, 74, 30, 1, 73, 30,
+ 16, 36, 32, 6, 39, 30, 1, 37, 30,
+ 27, 21, 32, 3, 20, 26, 0, 0, 0,
+ 9, 137, 26, 1, 135, 26, 0, 0, 0, // version 51
+ 12, 70, 30, 4, 75, 32, 0, 0, 0,
+ 24, 35, 30, 1, 40, 28, 0, 0, 0,
+ 23, 20, 32, 8, 24, 30, 0, 0, 0,
+ 14, 95, 18, 1, 86, 18, 0, 0, 0, // version 52
+ 13, 73, 32, 3, 77, 30, 0, 0, 0,
+ 24, 35, 30, 2, 35, 28, 0, 0, 0,
+ 26, 21, 32, 5, 21, 30, 1, 23, 30,
+ 9, 147, 28, 1, 142, 28, 0, 0, 0, // version 53
+ 10, 73, 30, 6, 70, 32, 1, 71, 32,
+ 25, 35, 30, 2, 34, 26, 0, 0, 0,
+ 29, 21, 32, 4, 22, 30, 0, 0, 0,
+ 11, 126, 24, 1, 131, 24, 0, 0, 0, // version 54
+ 16, 74, 32, 1, 79, 30, 0, 0, 0,
+ 25, 38, 32, 1, 25, 30, 0, 0, 0,
+ 33, 21, 32, 1, 28, 28, 0, 0, 0,
+ 14, 105, 20, 1, 99, 18, 0, 0, 0, // version 55
+ 19, 65, 28, 1, 72, 28, 0, 0, 0,
+ 24, 37, 32, 2, 40, 30, 1, 41, 30,
+ 31, 21, 32, 4, 24, 32, 0, 0, 0,
+ 10, 147, 28, 1, 151, 28, 0, 0, 0, // version 56
+ 15, 71, 30, 3, 71, 32, 1, 73, 32,
+ 24, 37, 32, 3, 38, 30, 1, 39, 30,
+ 36, 19, 30, 3, 29, 26, 0, 0, 0,
+ 15, 105, 20, 1, 99, 18, 0, 0, 0, // version 57
+ 19, 70, 30, 1, 64, 28, 0, 0, 0,
+ 27, 38, 32, 2, 25, 26, 0, 0, 0,
+ 38, 20, 30, 2, 18, 28, 0, 0, 0,
+ 14, 105, 20, 1, 113, 22, 1, 114, 22, // version 58
+ 17, 67, 30, 3, 92, 32, 0, 0, 0,
+ 30, 35, 30, 1, 41, 30, 0, 0, 0,
+ 36, 21, 32, 1, 26, 30, 1, 27, 30,
+ 11, 146, 28, 1, 146, 26, 0, 0, 0, // version 59
+ 20, 70, 30, 1, 60, 26, 0, 0, 0,
+ 29, 38, 32, 1, 24, 32, 0, 0, 0,
+ 40, 20, 30, 2, 17, 26, 0, 0, 0,
+ 3, 137, 26, 1, 136, 26, 10, 126, 24, // version 60
+ 22, 65, 28, 1, 75, 30, 0, 0, 0,
+ 30, 37, 32, 1, 51, 30, 0, 0, 0,
+ 42, 20, 30, 1, 21, 30, 0, 0, 0,
+ 12, 126, 24, 2, 118, 22, 1, 116, 22, // version 61
+ 19, 74, 32, 1, 74, 30, 1, 72, 28,
+ 30, 38, 32, 2, 29, 30, 0, 0, 0,
+ 39, 20, 32, 2, 37, 26, 1, 38, 26,
+ 12, 126, 24, 3, 136, 26, 0, 0, 0, // version 62
+ 21, 70, 30, 2, 65, 28, 0, 0, 0,
+ 34, 35, 30, 1, 44, 32, 0, 0, 0,
+ 42, 20, 30, 2, 19, 28, 2, 18, 28,
+ 12, 126, 24, 3, 117, 22, 1, 116, 22, // version 63
+ 25, 61, 26, 2, 62, 28, 0, 0, 0,
+ 34, 35, 30, 1, 40, 32, 1, 41, 32,
+ 45, 20, 30, 1, 20, 32, 1, 21, 32,
+ 15, 105, 20, 2, 115, 22, 2, 116, 22, // version 64
+ 25, 65, 28, 1, 72, 28, 0, 0, 0,
+ 18, 35, 30, 17, 37, 32, 1, 50, 32,
+ 42, 20, 30, 6, 19, 28, 1, 15, 28,
+ 19, 105, 20, 1, 101, 20, 0, 0, 0, // version 65
+ 33, 51, 22, 1, 65, 22, 0, 0, 0,
+ 40, 33, 28, 1, 28, 28, 0, 0, 0,
+ 49, 20, 30, 1, 18, 28, 0, 0, 0,
+ 18, 105, 20, 2, 117, 22, 0, 0, 0, // version 66
+ 26, 65, 28, 1, 80, 30, 0, 0, 0,
+ 35, 35, 30, 3, 35, 28, 1, 36, 28,
+ 52, 18, 28, 2, 38, 30, 0, 0, 0,
+ 26, 84, 16, 0, 0, 0, 0, 0, 0, // version 67
+ 26, 70, 30, 0, 0, 0, 0, 0, 0,
+ 45, 31, 26, 1, 9, 26, 0, 0, 0,
+ 52, 20, 30, 0, 0, 0, 0, 0, 0,
+ 16, 126, 24, 1, 114, 22, 1, 115, 22, // version 68
+ 23, 70, 30, 3, 65, 28, 1, 66, 28,
+ 40, 35, 30, 1, 43, 30, 0, 0, 0,
+ 46, 20, 30, 7, 19, 28, 1, 16, 28,
+ 19, 116, 22, 1, 105, 22, 0, 0, 0, // version 69
+ 20, 70, 30, 7, 66, 28, 1, 63, 28,
+ 40, 35, 30, 1, 42, 32, 1, 43, 32,
+ 54, 20, 30, 1, 19, 30, 0, 0, 0,
+ 17, 126, 24, 2, 115, 22, 0, 0, 0, // version 70
+ 24, 70, 30, 4, 74, 32, 0, 0, 0,
+ 48, 31, 26, 2, 18, 26, 0, 0, 0,
+ 54, 19, 28, 6, 15, 26, 1, 14, 26,
+ 29, 84, 16, 0, 0, 0, 0, 0, 0, // version 71
+ 29, 70, 30, 0, 0, 0, 0, 0, 0,
+ 6, 34, 30, 3, 36, 30, 38, 33, 28,
+ 58, 20, 30, 0, 0, 0, 0, 0, 0,
+ 16, 147, 28, 1, 149, 28, 0, 0, 0, // version 72
+ 31, 66, 28, 1, 37, 26, 0, 0, 0,
+ 48, 33, 28, 1, 23, 26, 0, 0, 0,
+ 53, 20, 30, 6, 19, 28, 1, 17, 28,
+ 20, 115, 22, 2, 134, 24, 0, 0, 0, // verdion 73
+ 29, 66, 28, 2, 56, 26, 2, 57, 26,
+ 45, 36, 30, 2, 15, 28, 0, 0, 0,
+ 59, 20, 30, 2, 21, 32, 0, 0, 0,
+ 17, 147, 28, 1, 134, 26, 0, 0, 0, // version 74
+ 26, 70, 30, 5, 75, 32, 0, 0, 0,
+ 47, 35, 30, 1, 48, 32, 0, 0, 0,
+ 64, 18, 28, 2, 33, 30, 1, 35, 30,
+ 22, 115, 22, 1, 133, 24, 0, 0, 0, // version 75
+ 33, 65, 28, 1, 74, 28, 0, 0, 0,
+ 43, 36, 30, 5, 27, 28, 1, 30, 28,
+ 57, 20, 30, 5, 21, 32, 1, 24, 32,
+ 18, 136, 26, 2, 142, 26, 0, 0, 0, // version 76
+ 33, 66, 28, 2, 49, 26, 0, 0, 0,
+ 48, 35, 30, 2, 38, 28, 0, 0, 0,
+ 64, 20, 30, 1, 20, 32, 0, 0, 0,
+ 19, 126, 24, 2, 135, 26, 1, 136, 26, // version 77
+ 32, 66, 28, 2, 55, 26, 2, 56, 26,
+ 49, 36, 30, 2, 18, 32, 0, 0, 0,
+ 65, 18, 28, 5, 27, 30, 1, 29, 30,
+ 20, 137, 26, 1, 130, 26, 0, 0, 0, // version 78
+ 30, 75, 32, 2, 71, 32, 0, 0, 0,
+ 46, 35, 30, 6, 39, 32, 0, 0, 0,
+ 3, 12, 30, 70, 19, 28, 0, 0, 0,
+ 20, 147, 28, 0, 0, 0, 0, 0, 0, // version 79
+ 35, 70, 30, 0, 0, 0, 0, 0, 0,
+ 49, 35, 30, 5, 35, 28, 0, 0, 0,
+ 70, 20, 30, 0, 0, 0, 0, 0, 0,
+ 21, 136, 26, 1, 155, 28, 0, 0, 0, // version 80
+ 34, 70, 30, 1, 64, 28, 1, 65, 28,
+ 54, 35, 30, 1, 45, 30, 0, 0, 0,
+ 68, 20, 30, 3, 18, 28, 1, 19, 28,
+ 19, 126, 24, 5, 115, 22, 1, 114, 22, // version 81
+ 33, 70, 30, 3, 65, 28, 1, 64, 28,
+ 52, 35, 30, 3, 41, 32, 1, 40, 32,
+ 67, 20, 30, 5, 21, 32, 1, 24, 32,
+ 2, 150, 28, 21, 136, 26, 0, 0, 0, // version 82
+ 32, 70, 30, 6, 65, 28, 0, 0, 0,
+ 52, 38, 32, 2, 27, 32, 0, 0, 0,
+ 73, 20, 30, 2, 22, 32, 0, 0, 0,
+ 21, 126, 24, 4, 136, 26, 0, 0, 0, // version 83
+ 30, 74, 32, 6, 73, 30, 0, 0, 0,
+ 54, 35, 30, 4, 40, 32, 0, 0, 0,
+ 75, 20, 30, 1, 20, 28, 0, 0, 0,
+ 30, 105, 20, 1, 114, 22, 0, 0, 0, // version 84
+ 3, 45, 22, 55, 47, 20, 0, 0, 0,
+ 2, 26, 26, 62, 33, 28, 0, 0, 0,
+ 79, 18, 28, 4, 33, 30, 0, 0, 0
+};
\ No newline at end of file
diff --git a/3rdparty/zint-2.6.1/backend/imail.c b/3rdparty/zint-2.6.1/backend/imail.c
new file mode 100644
index 0000000..5489282
--- /dev/null
+++ b/3rdparty/zint-2.6.1/backend/imail.c
@@ -0,0 +1,605 @@
+/* imail.c - Handles Intelligent Mail (aka OneCode) for USPS */
+
+/*
+ libzint - the open source barcode library
+ Copyright (C) 2008-2017 Robin Stuart
+
+ Redistribution and use in source and binary forms, with or without
+ modification, are permitted provided that the following conditions
+ are met:
+
+ 1. Redistributions of source code must retain the above copyright
+ notice, this list of conditions and the following disclaimer.
+ 2. Redistributions in binary form must reproduce the above copyright
+ notice, this list of conditions and the following disclaimer in the
+ documentation and/or other materials provided with the distribution.
+ 3. Neither the name of the project nor the names of its contributors
+ may be used to endorse or promote products derived from this software
+ without specific prior written permission.
+
+ THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND
+ ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+ ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE
+ FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+ DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
+ OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
+ HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
+ LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
+ OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+ SUCH DAMAGE.
+ */
+
+/* The function "USPS_MSB_Math_CRC11GenerateFrameCheckSequence"
+ is Copyright (C) 2006 United States Postal Service */
+
+#include
+#include
+#include
+#include "common.h"
+#include "large.h"
+
+#define SODIUM "0123456789-"
+
+/* The following lookup tables were generated using the code in Appendix C */
+
+static const unsigned short AppxD_I[1287] = {
+ /* Appendix D Table 1 - 5 of 13 characters */
+ 0x001F, 0x1F00, 0x002F, 0x1E80, 0x0037, 0x1D80, 0x003B, 0x1B80, 0x003D, 0x1780,
+ 0x003E, 0x0F80, 0x004F, 0x1E40, 0x0057, 0x1D40, 0x005B, 0x1B40, 0x005D, 0x1740,
+ 0x005E, 0x0F40, 0x0067, 0x1CC0, 0x006B, 0x1AC0, 0x006D, 0x16C0, 0x006E, 0x0EC0,
+ 0x0073, 0x19C0, 0x0075, 0x15C0, 0x0076, 0x0DC0, 0x0079, 0x13C0, 0x007A, 0x0BC0,
+ 0x007C, 0x07C0, 0x008F, 0x1E20, 0x0097, 0x1D20, 0x009B, 0x1B20, 0x009D, 0x1720,
+ 0x009E, 0x0F20, 0x00A7, 0x1CA0, 0x00AB, 0x1AA0, 0x00AD, 0x16A0, 0x00AE, 0x0EA0,
+ 0x00B3, 0x19A0, 0x00B5, 0x15A0, 0x00B6, 0x0DA0, 0x00B9, 0x13A0, 0x00BA, 0x0BA0,
+ 0x00BC, 0x07A0, 0x00C7, 0x1C60, 0x00CB, 0x1A60, 0x00CD, 0x1660, 0x00CE, 0x0E60,
+ 0x00D3, 0x1960, 0x00D5, 0x1560, 0x00D6, 0x0D60, 0x00D9, 0x1360, 0x00DA, 0x0B60,
+ 0x00DC, 0x0760, 0x00E3, 0x18E0, 0x00E5, 0x14E0, 0x00E6, 0x0CE0, 0x00E9, 0x12E0,
+ 0x00EA, 0x0AE0, 0x00EC, 0x06E0, 0x00F1, 0x11E0, 0x00F2, 0x09E0, 0x00F4, 0x05E0,
+ 0x00F8, 0x03E0, 0x010F, 0x1E10, 0x0117, 0x1D10, 0x011B, 0x1B10, 0x011D, 0x1710,
+ 0x011E, 0x0F10, 0x0127, 0x1C90, 0x012B, 0x1A90, 0x012D, 0x1690, 0x012E, 0x0E90,
+ 0x0133, 0x1990, 0x0135, 0x1590, 0x0136, 0x0D90, 0x0139, 0x1390, 0x013A, 0x0B90,
+ 0x013C, 0x0790, 0x0147, 0x1C50, 0x014B, 0x1A50, 0x014D, 0x1650, 0x014E, 0x0E50,
+ 0x0153, 0x1950, 0x0155, 0x1550, 0x0156, 0x0D50, 0x0159, 0x1350, 0x015A, 0x0B50,
+ 0x015C, 0x0750, 0x0163, 0x18D0, 0x0165, 0x14D0, 0x0166, 0x0CD0, 0x0169, 0x12D0,
+ 0x016A, 0x0AD0, 0x016C, 0x06D0, 0x0171, 0x11D0, 0x0172, 0x09D0, 0x0174, 0x05D0,
+ 0x0178, 0x03D0, 0x0187, 0x1C30, 0x018B, 0x1A30, 0x018D, 0x1630, 0x018E, 0x0E30,
+ 0x0193, 0x1930, 0x0195, 0x1530, 0x0196, 0x0D30, 0x0199, 0x1330, 0x019A, 0x0B30,
+ 0x019C, 0x0730, 0x01A3, 0x18B0, 0x01A5, 0x14B0, 0x01A6, 0x0CB0, 0x01A9, 0x12B0,
+ 0x01AA, 0x0AB0, 0x01AC, 0x06B0, 0x01B1, 0x11B0, 0x01B2, 0x09B0, 0x01B4, 0x05B0,
+ 0x01B8, 0x03B0, 0x01C3, 0x1870, 0x01C5, 0x1470, 0x01C6, 0x0C70, 0x01C9, 0x1270,
+ 0x01CA, 0x0A70, 0x01CC, 0x0670, 0x01D1, 0x1170, 0x01D2, 0x0970, 0x01D4, 0x0570,
+ 0x01D8, 0x0370, 0x01E1, 0x10F0, 0x01E2, 0x08F0, 0x01E4, 0x04F0, 0x01E8, 0x02F0,
+ 0x020F, 0x1E08, 0x0217, 0x1D08, 0x021B, 0x1B08, 0x021D, 0x1708, 0x021E, 0x0F08,
+ 0x0227, 0x1C88, 0x022B, 0x1A88, 0x022D, 0x1688, 0x022E, 0x0E88, 0x0233, 0x1988,
+ 0x0235, 0x1588, 0x0236, 0x0D88, 0x0239, 0x1388, 0x023A, 0x0B88, 0x023C, 0x0788,
+ 0x0247, 0x1C48, 0x024B, 0x1A48, 0x024D, 0x1648, 0x024E, 0x0E48, 0x0253, 0x1948,
+ 0x0255, 0x1548, 0x0256, 0x0D48, 0x0259, 0x1348, 0x025A, 0x0B48, 0x025C, 0x0748,
+ 0x0263, 0x18C8, 0x0265, 0x14C8, 0x0266, 0x0CC8, 0x0269, 0x12C8, 0x026A, 0x0AC8,
+ 0x026C, 0x06C8, 0x0271, 0x11C8, 0x0272, 0x09C8, 0x0274, 0x05C8, 0x0278, 0x03C8,
+ 0x0287, 0x1C28, 0x028B, 0x1A28, 0x028D, 0x1628, 0x028E, 0x0E28, 0x0293, 0x1928,
+ 0x0295, 0x1528, 0x0296, 0x0D28, 0x0299, 0x1328, 0x029A, 0x0B28, 0x029C, 0x0728,
+ 0x02A3, 0x18A8, 0x02A5, 0x14A8, 0x02A6, 0x0CA8, 0x02A9, 0x12A8, 0x02AA, 0x0AA8,
+ 0x02AC, 0x06A8, 0x02B1, 0x11A8, 0x02B2, 0x09A8, 0x02B4, 0x05A8, 0x02B8, 0x03A8,
+ 0x02C3, 0x1868, 0x02C5, 0x1468, 0x02C6, 0x0C68, 0x02C9, 0x1268, 0x02CA, 0x0A68,
+ 0x02CC, 0x0668, 0x02D1, 0x1168, 0x02D2, 0x0968, 0x02D4, 0x0568, 0x02D8, 0x0368,
+ 0x02E1, 0x10E8, 0x02E2, 0x08E8, 0x02E4, 0x04E8, 0x0307, 0x1C18, 0x030B, 0x1A18,
+ 0x030D, 0x1618, 0x030E, 0x0E18, 0x0313, 0x1918, 0x0315, 0x1518, 0x0316, 0x0D18,
+ 0x0319, 0x1318, 0x031A, 0x0B18, 0x031C, 0x0718, 0x0323, 0x1898, 0x0325, 0x1498,
+ 0x0326, 0x0C98, 0x0329, 0x1298, 0x032A, 0x0A98, 0x032C, 0x0698, 0x0331, 0x1198,
+ 0x0332, 0x0998, 0x0334, 0x0598, 0x0338, 0x0398, 0x0343, 0x1858, 0x0345, 0x1458,
+ 0x0346, 0x0C58, 0x0349, 0x1258, 0x034A, 0x0A58, 0x034C, 0x0658, 0x0351, 0x1158,
+ 0x0352, 0x0958, 0x0354, 0x0558, 0x0361, 0x10D8, 0x0362, 0x08D8, 0x0364, 0x04D8,
+ 0x0383, 0x1838, 0x0385, 0x1438, 0x0386, 0x0C38, 0x0389, 0x1238, 0x038A, 0x0A38,
+ 0x038C, 0x0638, 0x0391, 0x1138, 0x0392, 0x0938, 0x0394, 0x0538, 0x03A1, 0x10B8,
+ 0x03A2, 0x08B8, 0x03A4, 0x04B8, 0x03C1, 0x1078, 0x03C2, 0x0878, 0x03C4, 0x0478,
+ 0x040F, 0x1E04, 0x0417, 0x1D04, 0x041B, 0x1B04, 0x041D, 0x1704, 0x041E, 0x0F04,
+ 0x0427, 0x1C84, 0x042B, 0x1A84, 0x042D, 0x1684, 0x042E, 0x0E84, 0x0433, 0x1984,
+ 0x0435, 0x1584, 0x0436, 0x0D84, 0x0439, 0x1384, 0x043A, 0x0B84, 0x043C, 0x0784,
+ 0x0447, 0x1C44, 0x044B, 0x1A44, 0x044D, 0x1644, 0x044E, 0x0E44, 0x0453, 0x1944,
+ 0x0455, 0x1544, 0x0456, 0x0D44, 0x0459, 0x1344, 0x045A, 0x0B44, 0x045C, 0x0744,
+ 0x0463, 0x18C4, 0x0465, 0x14C4, 0x0466, 0x0CC4, 0x0469, 0x12C4, 0x046A, 0x0AC4,
+ 0x046C, 0x06C4, 0x0471, 0x11C4, 0x0472, 0x09C4, 0x0474, 0x05C4, 0x0487, 0x1C24,
+ 0x048B, 0x1A24, 0x048D, 0x1624, 0x048E, 0x0E24, 0x0493, 0x1924, 0x0495, 0x1524,
+ 0x0496, 0x0D24, 0x0499, 0x1324, 0x049A, 0x0B24, 0x049C, 0x0724, 0x04A3, 0x18A4,
+ 0x04A5, 0x14A4, 0x04A6, 0x0CA4, 0x04A9, 0x12A4, 0x04AA, 0x0AA4, 0x04AC, 0x06A4,
+ 0x04B1, 0x11A4, 0x04B2, 0x09A4, 0x04B4, 0x05A4, 0x04C3, 0x1864, 0x04C5, 0x1464,
+ 0x04C6, 0x0C64, 0x04C9, 0x1264, 0x04CA, 0x0A64, 0x04CC, 0x0664, 0x04D1, 0x1164,
+ 0x04D2, 0x0964, 0x04D4, 0x0564, 0x04E1, 0x10E4, 0x04E2, 0x08E4, 0x0507, 0x1C14,
+ 0x050B, 0x1A14, 0x050D, 0x1614, 0x050E, 0x0E14, 0x0513, 0x1914, 0x0515, 0x1514,
+ 0x0516, 0x0D14, 0x0519, 0x1314, 0x051A, 0x0B14, 0x051C, 0x0714, 0x0523, 0x1894,
+ 0x0525, 0x1494, 0x0526, 0x0C94, 0x0529, 0x1294, 0x052A, 0x0A94, 0x052C, 0x0694,
+ 0x0531, 0x1194, 0x0532, 0x0994, 0x0534, 0x0594, 0x0543, 0x1854, 0x0545, 0x1454,
+ 0x0546, 0x0C54, 0x0549, 0x1254, 0x054A, 0x0A54, 0x054C, 0x0654, 0x0551, 0x1154,
+ 0x0552, 0x0954, 0x0561, 0x10D4, 0x0562, 0x08D4, 0x0583, 0x1834, 0x0585, 0x1434,
+ 0x0586, 0x0C34, 0x0589, 0x1234, 0x058A, 0x0A34, 0x058C, 0x0634, 0x0591, 0x1134,
+ 0x0592, 0x0934, 0x05A1, 0x10B4, 0x05A2, 0x08B4, 0x05C1, 0x1074, 0x05C2, 0x0874,
+ 0x0607, 0x1C0C, 0x060B, 0x1A0C, 0x060D, 0x160C, 0x060E, 0x0E0C, 0x0613, 0x190C,
+ 0x0615, 0x150C, 0x0616, 0x0D0C, 0x0619, 0x130C, 0x061A, 0x0B0C, 0x061C, 0x070C,
+ 0x0623, 0x188C, 0x0625, 0x148C, 0x0626, 0x0C8C, 0x0629, 0x128C, 0x062A, 0x0A8C,
+ 0x062C, 0x068C, 0x0631, 0x118C, 0x0632, 0x098C, 0x0643, 0x184C, 0x0645, 0x144C,
+ 0x0646, 0x0C4C, 0x0649, 0x124C, 0x064A, 0x0A4C, 0x0651, 0x114C, 0x0652, 0x094C,
+ 0x0661, 0x10CC, 0x0662, 0x08CC, 0x0683, 0x182C, 0x0685, 0x142C, 0x0686, 0x0C2C,
+ 0x0689, 0x122C, 0x068A, 0x0A2C, 0x0691, 0x112C, 0x0692, 0x092C, 0x06A1, 0x10AC,
+ 0x06A2, 0x08AC, 0x06C1, 0x106C, 0x06C2, 0x086C, 0x0703, 0x181C, 0x0705, 0x141C,
+ 0x0706, 0x0C1C, 0x0709, 0x121C, 0x070A, 0x0A1C, 0x0711, 0x111C, 0x0712, 0x091C,
+ 0x0721, 0x109C, 0x0722, 0x089C, 0x0741, 0x105C, 0x0742, 0x085C, 0x0781, 0x103C,
+ 0x0782, 0x083C, 0x080F, 0x1E02, 0x0817, 0x1D02, 0x081B, 0x1B02, 0x081D, 0x1702,
+ 0x081E, 0x0F02, 0x0827, 0x1C82, 0x082B, 0x1A82, 0x082D, 0x1682, 0x082E, 0x0E82,
+ 0x0833, 0x1982, 0x0835, 0x1582, 0x0836, 0x0D82, 0x0839, 0x1382, 0x083A, 0x0B82,
+ 0x0847, 0x1C42, 0x084B, 0x1A42, 0x084D, 0x1642, 0x084E, 0x0E42, 0x0853, 0x1942,
+ 0x0855, 0x1542, 0x0856, 0x0D42, 0x0859, 0x1342, 0x085A, 0x0B42, 0x0863, 0x18C2,
+ 0x0865, 0x14C2, 0x0866, 0x0CC2, 0x0869, 0x12C2, 0x086A, 0x0AC2, 0x0871, 0x11C2,
+ 0x0872, 0x09C2, 0x0887, 0x1C22, 0x088B, 0x1A22, 0x088D, 0x1622, 0x088E, 0x0E22,
+ 0x0893, 0x1922, 0x0895, 0x1522, 0x0896, 0x0D22, 0x0899, 0x1322, 0x089A, 0x0B22,
+ 0x08A3, 0x18A2, 0x08A5, 0x14A2, 0x08A6, 0x0CA2, 0x08A9, 0x12A2, 0x08AA, 0x0AA2,
+ 0x08B1, 0x11A2, 0x08B2, 0x09A2, 0x08C3, 0x1862, 0x08C5, 0x1462, 0x08C6, 0x0C62,
+ 0x08C9, 0x1262, 0x08CA, 0x0A62, 0x08D1, 0x1162, 0x08D2, 0x0962, 0x08E1, 0x10E2,
+ 0x0907, 0x1C12, 0x090B, 0x1A12, 0x090D, 0x1612, 0x090E, 0x0E12, 0x0913, 0x1912,
+ 0x0915, 0x1512, 0x0916, 0x0D12, 0x0919, 0x1312, 0x091A, 0x0B12, 0x0923, 0x1892,
+ 0x0925, 0x1492, 0x0926, 0x0C92, 0x0929, 0x1292, 0x092A, 0x0A92, 0x0931, 0x1192,
+ 0x0932, 0x0992, 0x0943, 0x1852, 0x0945, 0x1452, 0x0946, 0x0C52, 0x0949, 0x1252,
+ 0x094A, 0x0A52, 0x0951, 0x1152, 0x0961, 0x10D2, 0x0983, 0x1832, 0x0985, 0x1432,
+ 0x0986, 0x0C32, 0x0989, 0x1232, 0x098A, 0x0A32, 0x0991, 0x1132, 0x09A1, 0x10B2,
+ 0x09C1, 0x1072, 0x0A07, 0x1C0A, 0x0A0B, 0x1A0A, 0x0A0D, 0x160A, 0x0A0E, 0x0E0A,
+ 0x0A13, 0x190A, 0x0A15, 0x150A, 0x0A16, 0x0D0A, 0x0A19, 0x130A, 0x0A1A, 0x0B0A,
+ 0x0A23, 0x188A, 0x0A25, 0x148A, 0x0A26, 0x0C8A, 0x0A29, 0x128A, 0x0A2A, 0x0A8A,
+ 0x0A31, 0x118A, 0x0A43, 0x184A, 0x0A45, 0x144A, 0x0A46, 0x0C4A, 0x0A49, 0x124A,
+ 0x0A51, 0x114A, 0x0A61, 0x10CA, 0x0A83, 0x182A, 0x0A85, 0x142A, 0x0A86, 0x0C2A,
+ 0x0A89, 0x122A, 0x0A91, 0x112A, 0x0AA1, 0x10AA, 0x0AC1, 0x106A, 0x0B03, 0x181A,
+ 0x0B05, 0x141A, 0x0B06, 0x0C1A, 0x0B09, 0x121A, 0x0B11, 0x111A, 0x0B21, 0x109A,
+ 0x0B41, 0x105A, 0x0B81, 0x103A, 0x0C07, 0x1C06, 0x0C0B, 0x1A06, 0x0C0D, 0x1606,
+ 0x0C0E, 0x0E06, 0x0C13, 0x1906, 0x0C15, 0x1506, 0x0C16, 0x0D06, 0x0C19, 0x1306,
+ 0x0C23, 0x1886, 0x0C25, 0x1486, 0x0C26, 0x0C86, 0x0C29, 0x1286, 0x0C31, 0x1186,
+ 0x0C43, 0x1846, 0x0C45, 0x1446, 0x0C49, 0x1246, 0x0C51, 0x1146, 0x0C61, 0x10C6,
+ 0x0C83, 0x1826, 0x0C85, 0x1426, 0x0C89, 0x1226, 0x0C91, 0x1126, 0x0CA1, 0x10A6,
+ 0x0CC1, 0x1066, 0x0D03, 0x1816, 0x0D05, 0x1416, 0x0D09, 0x1216, 0x0D11, 0x1116,
+ 0x0D21, 0x1096, 0x0D41, 0x1056, 0x0D81, 0x1036, 0x0E03, 0x180E, 0x0E05, 0x140E,
+ 0x0E09, 0x120E, 0x0E11, 0x110E, 0x0E21, 0x108E, 0x0E41, 0x104E, 0x0E81, 0x102E,
+ 0x0F01, 0x101E, 0x100F, 0x1E01, 0x1017, 0x1D01, 0x101B, 0x1B01, 0x101D, 0x1701,
+ 0x1027, 0x1C81, 0x102B, 0x1A81, 0x102D, 0x1681, 0x1033, 0x1981, 0x1035, 0x1581,
+ 0x1039, 0x1381, 0x1047, 0x1C41, 0x104B, 0x1A41, 0x104D, 0x1641, 0x1053, 0x1941,
+ 0x1055, 0x1541, 0x1059, 0x1341, 0x1063, 0x18C1, 0x1065, 0x14C1, 0x1069, 0x12C1,
+ 0x1071, 0x11C1, 0x1087, 0x1C21, 0x108B, 0x1A21, 0x108D, 0x1621, 0x1093, 0x1921,
+ 0x1095, 0x1521, 0x1099, 0x1321, 0x10A3, 0x18A1, 0x10A5, 0x14A1, 0x10A9, 0x12A1,
+ 0x10B1, 0x11A1, 0x10C3, 0x1861, 0x10C5, 0x1461, 0x10C9, 0x1261, 0x10D1, 0x1161,
+ 0x1107, 0x1C11, 0x110B, 0x1A11, 0x110D, 0x1611, 0x1113, 0x1911, 0x1115, 0x1511,
+ 0x1119, 0x1311, 0x1123, 0x1891, 0x1125, 0x1491, 0x1129, 0x1291, 0x1131, 0x1191,
+ 0x1143, 0x1851, 0x1145, 0x1451, 0x1149, 0x1251, 0x1183, 0x1831, 0x1185, 0x1431,
+ 0x1189, 0x1231, 0x1207, 0x1C09, 0x120B, 0x1A09, 0x120D, 0x1609, 0x1213, 0x1909,
+ 0x1215, 0x1509, 0x1219, 0x1309, 0x1223, 0x1889, 0x1225, 0x1489, 0x1229, 0x1289,
+ 0x1243, 0x1849, 0x1245, 0x1449, 0x1283, 0x1829, 0x1285, 0x1429, 0x1303, 0x1819,
+ 0x1305, 0x1419, 0x1407, 0x1C05, 0x140B, 0x1A05, 0x140D, 0x1605, 0x1413, 0x1905,
+ 0x1415, 0x1505, 0x1423, 0x1885, 0x1425, 0x1485, 0x1443, 0x1845, 0x1483, 0x1825,
+ 0x1503, 0x1815, 0x1603, 0x180D, 0x1807, 0x1C03, 0x180B, 0x1A03, 0x1813, 0x1903,
+ 0x1823, 0x1883, 0x1843, 0x1445, 0x1249, 0x1151, 0x10E1, 0x0C46, 0x0A4A, 0x0952,
+ 0x08E2, 0x064C, 0x0554, 0x04E4, 0x0358, 0x02E8, 0x01F0
+};
+
+static const unsigned short AppxD_II[78] = {
+ /* Appendix D Table II - 2 of 13 characters */
+ 0x0003, 0x1800, 0x0005, 0x1400, 0x0006, 0x0C00, 0x0009, 0x1200, 0x000A, 0x0A00,
+ 0x000C, 0x0600, 0x0011, 0x1100, 0x0012, 0x0900, 0x0014, 0x0500, 0x0018, 0x0300,
+ 0x0021, 0x1080, 0x0022, 0x0880, 0x0024, 0x0480, 0x0028, 0x0280, 0x0030, 0x0180,
+ 0x0041, 0x1040, 0x0042, 0x0840, 0x0044, 0x0440, 0x0048, 0x0240, 0x0050, 0x0140,
+ 0x0060, 0x00C0, 0x0081, 0x1020, 0x0082, 0x0820, 0x0084, 0x0420, 0x0088, 0x0220,
+ 0x0090, 0x0120, 0x0101, 0x1010, 0x0102, 0x0810, 0x0104, 0x0410, 0x0108, 0x0210,
+ 0x0201, 0x1008, 0x0202, 0x0808, 0x0204, 0x0408, 0x0401, 0x1004, 0x0402, 0x0804,
+ 0x0801, 0x1002, 0x1001, 0x0802, 0x0404, 0x0208, 0x0110, 0x00A0
+};
+
+static const unsigned short int AppxD_IV[130] = {
+ /* Appendix D Table IV - Bar-to-Character Mapping (reverse lookup) */
+ 67, 6, 78, 16, 86, 95, 34, 40, 45, 113, 117, 121, 62, 87, 18, 104, 41, 76, 57, 119, 115, 72, 97,
+ 2, 127, 26, 105, 35, 122, 52, 114, 7, 24, 82, 68, 63, 94, 44, 77, 112, 70, 100, 39, 30, 107,
+ 15, 125, 85, 10, 65, 54, 88, 20, 106, 46, 66, 8, 116, 29, 61, 99, 80, 90, 37, 123, 51, 25, 84,
+ 129, 56, 4, 109, 96, 28, 36, 47, 11, 71, 33, 102, 21, 9, 17, 49, 124, 79, 64, 91, 42, 69, 53,
+ 60, 14, 1, 27, 103, 126, 75, 89, 50, 120, 19, 32, 110, 92, 111, 130, 59, 31, 12, 81, 43, 55,
+ 5, 74, 22, 101, 128, 58, 118, 48, 108, 38, 98, 93, 23, 83, 13, 73, 3
+};
+
+/***************************************************************************
+ ** USPS_MSB_Math_CRC11GenerateFrameCheckSequence
+ **
+ ** Inputs:
+ ** ByteAttayPtr is the address of a 13 byte array holding 102 bytes which
+ ** are right justified - ie: the leftmost 2 bits of the first byte do not
+ ** hold data and must be set to zero.
+ **
+ ** Outputs:
+ ** return unsigned short - 11 bit Frame Check Sequence (right justified)
+ ***************************************************************************/
+extern unsigned short USPS_MSB_Math_CRC11GenerateFrameCheckSequence(unsigned char *ByteArrayPtr) {
+ unsigned short GeneratorPolynomial = 0x0F35;
+ unsigned short FrameCheckSequence = 0x07FF;
+ unsigned short Data;
+ int ByteIndex, Bit;
+
+ /* Do most significant byte skipping the 2 most significant bits */
+ Data = *ByteArrayPtr << 5;
+ ByteArrayPtr++;
+ for (Bit = 2; Bit < 8; Bit++) {
+ if ((FrameCheckSequence ^ Data) & 0x400)
+ FrameCheckSequence = (FrameCheckSequence << 1) ^ GeneratorPolynomial;
+ else
+ FrameCheckSequence = (FrameCheckSequence << 1);
+ FrameCheckSequence &= 0x7FF;
+ Data <<= 1;
+ }
+ /* Do rest of the bytes */
+ for (ByteIndex = 1; ByteIndex < 13; ByteIndex++) {
+ Data = *ByteArrayPtr << 3;
+ ByteArrayPtr++;
+ for (Bit = 0; Bit < 8; Bit++) {
+ if ((FrameCheckSequence ^ Data) & 0x0400) {
+ FrameCheckSequence = (FrameCheckSequence << 1) ^ GeneratorPolynomial;
+ } else {
+ FrameCheckSequence = (FrameCheckSequence << 1);
+ }
+ FrameCheckSequence &= 0x7FF;
+ Data <<= 1;
+ }
+ }
+ return FrameCheckSequence;
+}
+
+int imail(struct zint_symbol *symbol, unsigned char source[], int length) {
+ char data_pattern[200];
+ int error_number;
+ int i, j, read;
+ char zip[35], tracker[35], zip_adder[11], temp[2];
+ short int accum[112], x_reg[112], y_reg[112];
+ unsigned char byte_array[13];
+ unsigned short usps_crc;
+ int codeword[10];
+ unsigned short characters[10];
+ short int bar_map[130];
+
+ error_number = 0;
+
+ if (length > 32) {
+ strcpy(symbol->errtxt, "450: Input too long");
+ return ZINT_ERROR_TOO_LONG;
+ }
+ error_number = is_sane(SODIUM, source, length);
+ if (error_number == ZINT_ERROR_INVALID_DATA) {
+ strcpy(symbol->errtxt, "451: Invalid characters in data");
+ return error_number;
+ }
+
+ strcpy(zip, "");
+ strcpy(tracker, "");
+
+ /* separate the tracking code from the routing code */
+
+ read = 0;
+ j = 0;
+ for (i = 0; i < length; i++) {
+ if (source[i] == '-') {
+ tracker[read] = '\0';
+ j = 1;
+ read = 0;
+ } else {
+ if (j == 0) {
+ /* reading tracker */
+ tracker[read] = source[i];
+ read++;
+ } else {
+ /* reading zip code */
+ zip[read] = source[i];
+ read++;
+ }
+ }
+ }
+ if (j == 0) {
+ tracker[read] = '\0';
+ } else {
+ zip[read] = '\0';
+ }
+
+ if (strlen(tracker) != 20) {
+ strcpy(symbol->errtxt, "452: Invalid length tracking code");
+ return ZINT_ERROR_INVALID_DATA;
+ }
+ if (strlen(zip) > 11) {
+ strcpy(symbol->errtxt, "453: Invalid ZIP code");
+ return ZINT_ERROR_INVALID_DATA;
+ }
+
+ /* *** Step 1 - Conversion of Data Fields into Binary Data *** */
+
+ /* Routing code first */
+
+ for (i = 0; i < 112; i++) {
+ accum[i] = 0;
+ }
+
+ for (read = 0; read < strlen(zip); read++) {
+
+ for (i = 0; i < 112; i++) {
+ x_reg[i] = accum[i];
+ }
+
+ for (i = 0; i < 9; i++) {
+ binary_add(accum, x_reg);
+ }
+
+ for (i = 0; i < 112; i++) {
+ x_reg[i] = 0;
+ }
+
+ for (i = 0; i < 4; i++) {
+ if (ctoi(zip[read]) & (0x01 << i)) x_reg[i] = 1;
+ }
+
+ binary_add(accum, x_reg);
+ }
+
+ /* add weight to routing code */
+
+ for (i = 0; i < 112; i++) {
+ x_reg[i] = accum[i];
+ }
+
+ if (strlen(zip) > 9) {
+ strcpy(zip_adder, "1000100001");
+ } else {
+ if (strlen(zip) > 5) {
+ strcpy(zip_adder, "100001");
+ } else {
+ if (strlen(zip) > 0) {
+ strcpy(zip_adder, "1");
+ } else {
+ strcpy(zip_adder, "0");
+ }
+ }
+ }
+
+ for (i = 0; i < 112; i++) {
+ accum[i] = 0;
+ }
+
+ for (read = 0; read < strlen(zip_adder); read++) {
+
+ for (i = 0; i < 112; i++) {
+ y_reg[i] = accum[i];
+ }
+
+ for (i = 0; i < 9; i++) {
+ binary_add(accum, y_reg);
+ }
+
+ for (i = 0; i < 112; i++) {
+ y_reg[i] = 0;
+ }
+
+ for (i = 0; i < 4; i++) {
+ if (ctoi(zip_adder[read]) & (0x01 << i)) y_reg[i] = 1;
+ }
+
+ binary_add(accum, y_reg);
+ }
+
+ binary_add(accum, x_reg);
+
+ /* tracking code */
+
+ /* multiply by 10 */
+ for (i = 0; i < 112; i++) {
+ y_reg[i] = accum[i];
+ }
+
+ for (i = 0; i < 9; i++) {
+ binary_add(accum, y_reg);
+ }
+
+ for (i = 0; i < 112; i++) {
+ y_reg[i] = 0;
+ }
+
+ /* add first digit of tracker */
+ for (i = 0; i < 4; i++) {
+ if (ctoi(tracker[0]) & (0x01 << i)) y_reg[i] = 1;
+ }
+
+ binary_add(accum, y_reg);
+
+ /* multiply by 5 */
+ for (i = 0; i < 112; i++) {
+ y_reg[i] = accum[i];
+ }
+
+ for (i = 0; i < 4; i++) {
+ binary_add(accum, y_reg);
+ }
+
+ for (i = 0; i < 112; i++) {
+ y_reg[i] = 0;
+ }
+
+ /* add second digit */
+ for (i = 0; i < 4; i++) {
+ if (ctoi(tracker[1]) & (0x01 << i)) y_reg[i] = 1;
+ }
+
+ binary_add(accum, y_reg);
+
+ /* and then the rest */
+
+ for (read = 2; read < strlen(tracker); read++) {
+
+ for (i = 0; i < 112; i++) {
+ y_reg[i] = accum[i];
+ }
+
+ for (i = 0; i < 9; i++) {
+ binary_add(accum, y_reg);
+ }
+
+ for (i = 0; i < 112; i++) {
+ y_reg[i] = 0;
+ }
+
+ for (i = 0; i < 4; i++) {
+ if (ctoi(tracker[read]) & (0x01 << i)) y_reg[i] = 1;
+ }
+
+ binary_add(accum, y_reg);
+ }
+
+ /* *** Step 2 - Generation of 11-bit CRC on Binary Data *** */
+
+ accum[103] = 0;
+ accum[102] = 0;
+
+ memset(byte_array, 0, 13);
+ for (j = 0; j < 13; j++) {
+ i = 96 - (8 * j);
+ byte_array[j] = 0;
+ byte_array[j] += accum[i];
+ byte_array[j] += 2 * accum[i + 1];
+ byte_array[j] += 4 * accum[i + 2];
+ byte_array[j] += 8 * accum[i + 3];
+ byte_array[j] += 16 * accum[i + 4];
+ byte_array[j] += 32 * accum[i + 5];
+ byte_array[j] += 64 * accum[i + 6];
+ byte_array[j] += 128 * accum[i + 7];
+ }
+
+ usps_crc = USPS_MSB_Math_CRC11GenerateFrameCheckSequence(byte_array);
+
+ /* *** Step 3 - Conversion from Binary Data to Codewords *** */
+
+ /* start with codeword J which is base 636 */
+ for (i = 0; i < 112; i++) {
+ x_reg[i] = 0;
+ y_reg[i] = 0;
+ }
+
+ x_reg[101] = 1;
+ x_reg[98] = 1;
+ x_reg[97] = 1;
+ x_reg[96] = 1;
+ x_reg[95] = 1;
+ x_reg[94] = 1;
+
+ for (i = 92; i >= 0; i--) {
+ y_reg[i] = islarger(accum, x_reg);
+ if (y_reg[i] == 1) {
+ binary_subtract(accum, x_reg);
+ }
+ shiftdown(x_reg);
+ }
+
+ codeword[9] = (accum[9] * 512) + (accum[8] * 256) + (accum[7] * 128) + (accum[6] * 64) +
+ (accum[5] * 32) + (accum[4] * 16) + (accum[3] * 8) + (accum[2] * 4) +
+ (accum[1] * 2) + accum[0];
+
+ /* then codewords I to B with base 1365 */
+
+ for (j = 8; j > 0; j--) {
+ for (i = 0; i < 112; i++) {
+ accum[i] = y_reg[i];
+ y_reg[i] = 0;
+ x_reg[i] = 0;
+ }
+ x_reg[101] = 1;
+ x_reg[99] = 1;
+ x_reg[97] = 1;
+ x_reg[95] = 1;
+ x_reg[93] = 1;
+ x_reg[91] = 1;
+ for (i = 91; i >= 0; i--) {
+ y_reg[i] = islarger(accum, x_reg);
+ if (y_reg[i] == 1) {
+ binary_subtract(accum, x_reg);
+ }
+ shiftdown(x_reg);
+ }
+
+ codeword[j] = (accum[10] * 1024) + (accum[9] * 512) + (accum[8] * 256) +
+ (accum[7] * 128) + (accum[6] * 64) + (accum[5] * 32) +
+ (accum[4] * 16) + (accum[3] * 8) + (accum[2] * 4) +
+ (accum[1] * 2) + accum[0];
+ }
+
+ codeword[0] = (y_reg[10] * 1024) + (y_reg[9] * 512) + (y_reg[8] * 256) +
+ (y_reg[7] * 128) + (y_reg[6] * 64) + (y_reg[5] * 32) +
+ (y_reg[4] * 16) + (y_reg[3] * 8) + (y_reg[2] * 4) +
+ (y_reg[1] * 2) + y_reg[0];
+
+ for (i = 0; i < 8; i++) {
+ if (codeword[i] == 1365) {
+ codeword[i] = 0;
+ codeword[i + 1]++;
+ }
+ }
+
+ /* *** Step 4 - Inserting Additional Information into Codewords *** */
+
+ codeword[9] = codeword[9] * 2;
+
+ if (usps_crc >= 1024) {
+ codeword[0] += 659;
+ }
+
+ /* *** Step 5 - Conversion from Codewords to Characters *** */
+
+ for (i = 0; i < 10; i++) {
+ if (codeword[i] < 1287) {
+ characters[i] = AppxD_I[codeword[i]];
+ } else {
+ characters[i] = AppxD_II[codeword[i] - 1287];
+ }
+ }
+
+ for (i = 0; i < 10; i++) {
+ if (usps_crc & (1 << i)) {
+ characters[i] = 0x1FFF - characters[i];
+ }
+ }
+
+ /* *** Step 6 - Conversion from Characters to the Intelligent Mail Barcode *** */
+ for (i = 0; i < 10; i++) {
+ for (j = 0; j < 13; j++) {
+ if (characters[i] & (1 << j)) {
+ bar_map[AppxD_IV[(13 * i) + j] - 1] = 1;
+ } else {
+ bar_map[AppxD_IV[(13 * i) + j] - 1] = 0;
+ }
+ }
+ }
+
+ strcpy(data_pattern, "");
+ temp[1] = '\0';
+ for (i = 0; i < 65; i++) {
+ j = 0;
+ if (bar_map[i] == 0)
+ j += 1;
+ if (bar_map[i + 65] == 0)
+ j += 2;
+ temp[0] = itoc(j);
+ strcat(data_pattern, temp);
+ }
+
+ /* Translate 4-state data pattern to symbol */
+ read = 0;
+ for (i = 0; i < strlen(data_pattern); i++) {
+ if ((data_pattern[i] == '1') || (data_pattern[i] == '0')) {
+ set_module(symbol, 0, read);
+ }
+ set_module(symbol, 1, read);
+ if ((data_pattern[i] == '2') || (data_pattern[i] == '0')) {
+ set_module(symbol, 2, read);
+ }
+ read += 2;
+ }
+
+ symbol->row_height[0] = 3;
+ symbol->row_height[1] = 2;
+ symbol->row_height[2] = 3;
+
+ symbol->rows = 3;
+ symbol->width = read - 1;
+ return error_number;
+}
diff --git a/3rdparty/zint-2.6.1/backend/large.c b/3rdparty/zint-2.6.1/backend/large.c
new file mode 100644
index 0000000..dda4d5f
--- /dev/null
+++ b/3rdparty/zint-2.6.1/backend/large.c
@@ -0,0 +1,191 @@
+/* large.c - Handles binary manipulation of large numbers */
+
+/*
+ libzint - the open source barcode library
+ Copyright (C) 2008-2017 Robin Stuart
+
+ Redistribution and use in source and binary forms, with or without
+ modification, are permitted provided that the following conditions
+ are met:
+
+ 1. Redistributions of source code must retain the above copyright
+ notice, this list of conditions and the following disclaimer.
+ 2. Redistributions in binary form must reproduce the above copyright
+ notice, this list of conditions and the following disclaimer in the
+ documentation and/or other materials provided with the distribution.
+ 3. Neither the name of the project nor the names of its contributors
+ may be used to endorse or promote products derived from this software
+ without specific prior written permission.
+
+ THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND
+ ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+ ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE
+ FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+ DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
+ OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
+ HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
+ LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
+ OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+ SUCH DAMAGE.
+ */
+
+#include
+#include
+#include "common.h"
+#include "large.h"
+
+void binary_add(short int accumulator[], short int input_buffer[]) { /* Binary addition */
+ int i, carry, done;
+ carry = 0;
+
+ for (i = 0; i < 112; i++) {
+ done = 0;
+ if (((input_buffer[i] == 0) && (accumulator[i] == 0))
+ && ((carry == 0) && (done == 0))) {
+ accumulator[i] = 0;
+ carry = 0;
+ done = 1;
+ }
+ if (((input_buffer[i] == 0) && (accumulator[i] == 0))
+ && ((carry == 1) && (done == 0))) {
+ accumulator[i] = 1;
+ carry = 0;
+ done = 1;
+ }
+ if (((input_buffer[i] == 0) && (accumulator[i] == 1))
+ && ((carry == 0) && (done == 0))) {
+ accumulator[i] = 1;
+ carry = 0;
+ done = 1;
+ }
+ if (((input_buffer[i] == 0) && (accumulator[i] == 1))
+ && ((carry == 1) && (done == 0))) {
+ accumulator[i] = 0;
+ carry = 1;
+ done = 1;
+ }
+ if (((input_buffer[i] == 1) && (accumulator[i] == 0))
+ && ((carry == 0) && (done == 0))) {
+ accumulator[i] = 1;
+ carry = 0;
+ done = 1;
+ }
+ if (((input_buffer[i] == 1) && (accumulator[i] == 0))
+ && ((carry == 1) && (done == 0))) {
+ accumulator[i] = 0;
+ carry = 1;
+ done = 1;
+ }
+ if (((input_buffer[i] == 1) && (accumulator[i] == 1))
+ && ((carry == 0) && (done == 0))) {
+ accumulator[i] = 0;
+ carry = 1;
+ done = 1;
+ }
+ if (((input_buffer[i] == 1) && (accumulator[i] == 1))
+ && ((carry == 1) && (done == 0))) {
+ accumulator[i] = 1;
+ carry = 1;
+ done = 1;
+ }
+ }
+}
+
+void binary_subtract(short int accumulator[], short int input_buffer[]) {
+ /* 2's compliment subtraction */
+ /* take input_buffer from accumulator and put answer in accumulator */
+ int i;
+ short int sub_buffer[112];
+
+ for (i = 0; i < 112; i++) {
+ if (input_buffer[i] == 0) {
+ sub_buffer[i] = 1;
+ } else {
+ sub_buffer[i] = 0;
+ }
+ }
+ binary_add(accumulator, sub_buffer);
+
+ sub_buffer[0] = 1;
+
+ for (i = 1; i < 112; i++) {
+ sub_buffer[i] = 0;
+ }
+ binary_add(accumulator, sub_buffer);
+}
+
+void shiftdown(short int buffer[]) {
+ int i;
+
+ buffer[102] = 0;
+ buffer[103] = 0;
+
+ for (i = 0; i < 102; i++) {
+ buffer[i] = buffer[i + 1];
+ }
+}
+
+void shiftup(short int buffer[]) {
+ int i;
+
+ for (i = 102; i > 0; i--) {
+ buffer[i] = buffer[i - 1];
+ }
+
+ buffer[0] = 0;
+}
+
+short int islarger(short int accum[], short int reg[]) {
+ /* Returns 1 if accum[] is larger than reg[], else 0 */
+ int i, latch, larger;
+ latch = 0;
+ i = 103;
+ larger = 0;
+
+
+ do {
+ if ((accum[i] == 1) && (reg[i] == 0)) {
+ latch = 1;
+ larger = 1;
+ }
+ if ((accum[i] == 0) && (reg[i] == 1)) {
+ latch = 1;
+ }
+ i--;
+ } while ((latch == 0) && (i >= -1));
+
+ return larger;
+}
+
+void binary_load(short int reg[], char data[], const size_t src_len) {
+ size_t read;
+ int i;
+ short int temp[112] = {0};
+
+ for (i = 0; i < 112; i++) {
+ reg[i] = 0;
+ }
+
+ for (read = 0; read < src_len; read++) {
+
+ for (i = 0; i < 112; i++) {
+ temp[i] = reg[i];
+ }
+
+ for (i = 0; i < 9; i++) {
+ binary_add(reg, temp);
+ }
+
+ for (i = 0; i < 112; i++) {
+ temp[i] = 0;
+ }
+
+ for (i = 0; i < 4; i++) {
+ if (ctoi(data[read]) & (0x01 << i)) temp[i] = 1;
+ }
+
+ binary_add(reg, temp);
+ }
+}
+
diff --git a/3rdparty/zint-2.6.1/backend/large.h b/3rdparty/zint-2.6.1/backend/large.h
new file mode 100644
index 0000000..c8b6e14
--- /dev/null
+++ b/3rdparty/zint-2.6.1/backend/large.h
@@ -0,0 +1,50 @@
+/* large.h - Handles binary manipulation of large numbers */
+
+/*
+ libzint - the open source barcode library
+ Copyright (C) 2008-2017 Robin Stuart
+
+ Redistribution and use in source and binary forms, with or without
+ modification, are permitted provided that the following conditions
+ are met:
+
+ 1. Redistributions of source code must retain the above copyright
+ notice, this list of conditions and the following disclaimer.
+ 2. Redistributions in binary form must reproduce the above copyright
+ notice, this list of conditions and the following disclaimer in the
+ documentation and/or other materials provided with the distribution.
+ 3. Neither the name of the project nor the names of its contributors
+ may be used to endorse or promote products derived from this software
+ without specific prior written permission.
+
+ THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND
+ ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+ ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE
+ FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+ DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
+ OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
+ HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
+ LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
+ OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+ SUCH DAMAGE.
+*/
+#ifndef __LARGE_H
+#define __LARGE_H
+
+#ifdef __cplusplus
+extern "C" {
+#endif /* __cplusplus */
+
+extern void binary_load(short int reg[], char data[], const size_t src_len);
+extern void binary_add(short int accumulator[], short int input_buffer[]);
+extern void binary_subtract(short int accumulator[], short int input_buffer[]);
+extern void shiftdown(short int buffer[]);
+extern void shiftup(short int buffer[]);
+extern short int islarger(short int accum[], short int reg[]);
+
+#ifdef __cplusplus
+}
+#endif /* __cplusplus */
+
+#endif /* __LARGE_H */
diff --git a/3rdparty/zint-2.6.1/backend/library.c b/3rdparty/zint-2.6.1/backend/library.c
new file mode 100644
index 0000000..9c2eb6e
--- /dev/null
+++ b/3rdparty/zint-2.6.1/backend/library.c
@@ -0,0 +1,1312 @@
+/* library.c - external functions of libzint
+
+ libzint - the open source barcode library
+ Copyright (C) 2009-2017 Robin Stuart
+
+ Redistribution and use in source and binary forms, with or without
+ modification, are permitted provided that the following conditions
+ are met:
+
+ 1. Redistributions of source code must retain the above copyright
+ notice, this list of conditions and the following disclaimer.
+ 2. Redistributions in binary form must reproduce the above copyright
+ notice, this list of conditions and the following disclaimer in the
+ documentation and/or other materials provided with the distribution.
+ 3. Neither the name of the project nor the names of its contributors
+ may be used to endorse or promote products derived from this software
+ without specific prior written permission.
+
+ THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND
+ ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+ ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE
+ FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+ DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
+ OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
+ HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
+ LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
+ OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+ SUCH DAMAGE.
+ */
+
+#include
+#include
+#include
+#include
+#ifdef _MSC_VER
+#include
+#endif
+#include "common.h"
+#include "gs1.h"
+
+#define TECHNETIUM "0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ-. $/+%"
+
+struct zint_symbol *ZBarcode_Create() {
+ struct zint_symbol *symbol;
+
+ symbol = (struct zint_symbol*) malloc(sizeof (*symbol));
+ if (!symbol) return NULL;
+
+ memset(symbol, 0, sizeof (*symbol));
+ symbol->symbology = BARCODE_CODE128;
+ symbol->height = 50;
+ symbol->whitespace_width = 0;
+ symbol->border_width = 0;
+ symbol->output_options = 0;
+ symbol->rows = 0;
+ symbol->width = 0;
+ strcpy(symbol->fgcolour, "000000");
+ strcpy(symbol->bgcolour, "ffffff");
+ strcpy(symbol->outfile, "");
+ symbol->scale = 1.0;
+ symbol->option_1 = -1;
+ symbol->option_2 = 0;
+ symbol->option_3 = 928; // PDF_MAX
+ symbol->show_hrt = 1; // Show human readable text
+ symbol->input_mode = DATA_MODE;
+ strcpy(symbol->primary, "");
+ memset(&(symbol->encoded_data[0][0]), 0, sizeof (symbol->encoded_data));
+ memset(&(symbol->row_height[0]), 0, sizeof (symbol->row_height));
+ symbol->bitmap = NULL;
+ symbol->bitmap_width = 0;
+ symbol->bitmap_height = 0;
+ symbol->eci = 3;
+ symbol->dot_size = 4.0 / 5.0;
+ symbol->debug = 0;
+ return symbol;
+}
+
+void ZBarcode_Clear(struct zint_symbol *symbol) {
+ int i, j;
+
+ for (i = 0; i < symbol->rows; i++) {
+ for (j = 0; j < symbol->width; j++) {
+ unset_module(symbol, i, j);
+ }
+ }
+ symbol->rows = 0;
+ symbol->width = 0;
+ memset(symbol->text, 0, sizeof(symbol->text));
+ symbol->errtxt[0] = '\0';
+ if (symbol->bitmap != NULL) {
+ free(symbol->bitmap);
+ symbol->bitmap = NULL;
+ }
+ symbol->bitmap_width = 0;
+ symbol->bitmap_height = 0;
+}
+
+void ZBarcode_Delete(struct zint_symbol *symbol) {
+ if (symbol->bitmap != NULL)
+ free(symbol->bitmap);
+
+ // If there is a rendered version, ensure its memory is released
+ if (symbol->rendered != NULL) {
+ struct zint_render_line *line, *l;
+ struct zint_render_string *string, *s;
+ struct zint_render_ring *ring, *r;
+ struct zint_render_hexagon *hexagon, *h;
+
+ // Free lines
+ line = symbol->rendered->lines;
+ while (line) {
+ l = line;
+ line = line->next;
+ free(l);
+ }
+ // Free Strings
+ string = symbol->rendered->strings;
+ while (string) {
+ s = string;
+ string = string->next;
+ free(s->text);
+ free(s);
+ }
+
+ // Free Rings
+ ring = symbol->rendered->rings;
+ while (ring) {
+ r = ring;
+ ring = ring->next;
+ free(r);
+ }
+
+ // Free Hexagons
+ hexagon = symbol->rendered->hexagons;
+ while (hexagon) {
+ h = hexagon;
+ hexagon = hexagon->next;
+ free(h);
+ }
+
+ // Free Render
+ free(symbol->rendered);
+ }
+ free(symbol);
+}
+
+extern int get_best_eci(unsigned char source[], size_t length); /* Calculate suitable ECI mode */
+extern int utf_to_eci(const int eci, const unsigned char source[], unsigned char dest[], size_t *length); /* Convert Unicode to other encodings */
+
+
+extern int eanx(struct zint_symbol *symbol, unsigned char source[], int length); /* EAN system barcodes */
+extern int c39(struct zint_symbol *symbol, unsigned char source[], const size_t length); /* Code 3 from 9 (or Code 39) */
+extern int pharmazentral(struct zint_symbol *symbol, unsigned char source[], int length); /* Pharmazentral Nummer (PZN) */
+extern int ec39(struct zint_symbol *symbol, unsigned char source[], int length); /* Extended Code 3 from 9 (or Code 39+) */
+extern int codabar(struct zint_symbol *symbol, unsigned char source[], int length); /* Codabar - a simple substitution cipher */
+extern int matrix_two_of_five(struct zint_symbol *symbol, unsigned char source[], int length); /* Code 2 of 5 Standard (& Matrix) */
+extern int industrial_two_of_five(struct zint_symbol *symbol, unsigned char source[], int length); /* Code 2 of 5 Industrial */
+extern int iata_two_of_five(struct zint_symbol *symbol, unsigned char source[], int length); /* Code 2 of 5 IATA */
+extern int interleaved_two_of_five(struct zint_symbol *symbol, const unsigned char source[], size_t length); /* Code 2 of 5 Interleaved */
+extern int logic_two_of_five(struct zint_symbol *symbol, unsigned char source[], int length); /* Code 2 of 5 Data Logic */
+extern int itf14(struct zint_symbol *symbol, unsigned char source[], int length); /* ITF-14 */
+extern int dpleit(struct zint_symbol *symbol, unsigned char source[], int length); /* Deutsche Post Leitcode */
+extern int dpident(struct zint_symbol *symbol, unsigned char source[], int length); /* Deutsche Post Identcode */
+extern int c93(struct zint_symbol *symbol, unsigned char source[], int length); /* Code 93 - a re-working of Code 39+, generates 2 check digits */
+extern int code_128(struct zint_symbol *symbol, unsigned char source[], const size_t length); /* Code 128 and NVE-18 */
+extern int ean_128(struct zint_symbol *symbol, unsigned char source[], const size_t length); /* EAN-128 (GS1-128) */
+extern int code_11(struct zint_symbol *symbol, unsigned char source[], int length); /* Code 11 */
+extern int msi_handle(struct zint_symbol *symbol, unsigned char source[], int length); /* MSI Plessey */
+extern int telepen(struct zint_symbol *symbol, unsigned char source[], const size_t length); /* Telepen ASCII */
+extern int telepen_num(struct zint_symbol *symbol, unsigned char source[], const size_t length); /* Telepen Numeric */
+extern int plessey(struct zint_symbol *symbol, unsigned char source[], const size_t length); /* Plessey Code */
+extern int pharma_one(struct zint_symbol *symbol, unsigned char source[], int length); /* Pharmacode One Track */
+extern int flattermarken(struct zint_symbol *symbol, unsigned char source[], int length); /* Flattermarken */
+extern int fim(struct zint_symbol *symbol, unsigned char source[], int length); /* Facing Identification Mark */
+extern int pharma_two(struct zint_symbol *symbol, unsigned char source[], int length); /* Pharmacode Two Track */
+extern int post_plot(struct zint_symbol *symbol, unsigned char source[], int length); /* Postnet */
+extern int planet_plot(struct zint_symbol *symbol, unsigned char source[], int length); /* PLANET */
+extern int imail(struct zint_symbol *symbol, unsigned char source[], int length); /* Intelligent Mail (aka USPS OneCode) */
+extern int royal_plot(struct zint_symbol *symbol, unsigned char source[], int length); /* RM4SCC */
+extern int australia_post(struct zint_symbol *symbol, unsigned char source[], int length); /* Australia Post 4-state */
+extern int code16k(struct zint_symbol *symbol, unsigned char source[],const size_t length); /* Code 16k */
+extern int pdf417enc(struct zint_symbol *symbol, unsigned char source[], const size_t length); /* PDF417 */
+extern int micro_pdf417(struct zint_symbol *symbol, unsigned char chaine[], const size_t length); /* Micro PDF417 */
+extern int maxicode(struct zint_symbol *symbol, unsigned char source[], int length); /* Maxicode */
+extern int rss14(struct zint_symbol *symbol, unsigned char source[], int length); /* RSS-14 */
+extern int rsslimited(struct zint_symbol *symbol, unsigned char source[], int length); /* RSS Limited */
+extern int rssexpanded(struct zint_symbol *symbol, unsigned char source[], int length); /* RSS Expanded */
+extern int composite(struct zint_symbol *symbol, unsigned char source[], int length); /* Composite Symbology */
+extern int kix_code(struct zint_symbol *symbol, unsigned char source[], int length); /* TNT KIX Code */
+extern int aztec(struct zint_symbol *symbol, unsigned char source[], const size_t length); /* Aztec Code */
+extern int code32(struct zint_symbol *symbol, unsigned char source[], int length); /* Italian Pharmacode */
+extern int daft_code(struct zint_symbol *symbol, unsigned char source[], int length); /* DAFT Code */
+extern int ean_14(struct zint_symbol *symbol, unsigned char source[], int length); /* EAN-14 */
+extern int nve_18(struct zint_symbol *symbol, unsigned char source[], int length); /* NVE-18 */
+extern int microqr(struct zint_symbol *symbol, const unsigned char source[], size_t length); /* Micro QR Code */
+extern int aztec_runes(struct zint_symbol *symbol, unsigned char source[], int length); /* Aztec Runes */
+extern int korea_post(struct zint_symbol *symbol, unsigned char source[], int length); /* Korea Post */
+extern int japan_post(struct zint_symbol *symbol, unsigned char source[], int length); /* Japanese Post */
+extern int code_49(struct zint_symbol *symbol, unsigned char source[], const int length); /* Code 49 */
+extern int channel_code(struct zint_symbol *symbol, unsigned char source[], int length); /* Channel Code */
+extern int code_one(struct zint_symbol *symbol, unsigned char source[], int length); /* Code One */
+extern int grid_matrix(struct zint_symbol *symbol, const unsigned char source[], size_t length); /* Grid Matrix */
+extern int han_xin(struct zint_symbol * symbol, const unsigned char source[], size_t length); /* Han Xin */
+extern int dotcode(struct zint_symbol * symbol, const unsigned char source[], int length); /* DotCode */
+extern int codablock(struct zint_symbol * symbol, const unsigned char source[], const size_t length); /* Codablock */
+extern int upnqr(struct zint_symbol *symbol, const unsigned char source[], size_t length); /* UPNQR */
+extern int qr_code(struct zint_symbol *symbol, const unsigned char source[], size_t length); /* Data Matrix (IEC16022) */
+extern int dmatrix(struct zint_symbol *symbol, const unsigned char source[], const size_t in_length); /* QR Code */
+
+extern int plot_raster(struct zint_symbol *symbol, int rotate_angle, int file_type); /* Plot to PNG/BMP/PCX */
+extern int render_plot(struct zint_symbol *symbol, float width, float height); /* Plot to gLabels */
+extern int ps_plot(struct zint_symbol *symbol); /* Plot to EPS */
+extern int svg_plot(struct zint_symbol *symbol); /* Plot to SVG */
+extern int emf_plot(struct zint_symbol *symbol); /* Plot to Metafile */
+
+void error_tag(char error_string[], int error_number) {
+ char error_buffer[100];
+
+ if (error_number != 0) {
+ strcpy(error_buffer, error_string);
+
+ if (error_number > 4) {
+ strcpy(error_string, "Error ");
+ } else {
+ strcpy(error_string, "Warning ");
+ }
+
+ strcat(error_string, error_buffer);
+ }
+}
+
+/* Output a hexadecimal representation of the rendered symbol */
+int dump_plot(struct zint_symbol *symbol) {
+ FILE *f;
+ int i, r;
+ int byt;
+ char hex[] = {'0', '1', '2', '3', '4', '5', '6', '7', '8',
+ '9', 'A', 'B', 'C', 'D', 'E', 'F'};
+ int space = 0;
+
+ if (symbol->output_options & BARCODE_STDOUT) {
+ f = stdout;
+ } else {
+ f = fopen(symbol->outfile, "w");
+ if (!f) {
+ strcpy(symbol->errtxt, "201: Could not open output file");
+ return ZINT_ERROR_FILE_ACCESS;
+ }
+ }
+
+ for (r = 0; r < symbol->rows; r++) {
+ byt = 0;
+ for (i = 0; i < symbol->width; i++) {
+ byt = byt << 1;
+ if (module_is_set(symbol, r, i)) {
+ byt += 1;
+ }
+ if (((i + 1) % 4) == 0) {
+ fputc(hex[byt], f);
+ space++;
+ byt = 0;
+ }
+ if (space == 2) {
+ fputc(' ', f);
+ space = 0;
+ }
+ }
+
+ if ((symbol->width % 4) != 0) {
+ byt = byt << (4 - (symbol->width % 4));
+ fputc(hex[byt], f);
+ }
+ fputs("\n", f);
+ space = 0;
+ }
+
+ if (symbol->output_options & BARCODE_STDOUT) {
+ fflush(f);
+ } else {
+ fclose(f);
+ }
+
+ return 0;
+}
+
+/* Process health industry bar code data */
+static int hibc(struct zint_symbol *symbol, unsigned char source[], size_t length) {
+ size_t i;
+ int counter, error_number;
+ char to_process[113], temp[2], check_digit;
+
+ /* without "+" and check: max 110 characters in HIBC 2.6 */
+ if (length > 110) {
+ strcpy(symbol->errtxt, "202: Data too long for HIBC LIC");
+ return ZINT_ERROR_TOO_LONG;
+ }
+ to_upper(source);
+ error_number = is_sane(TECHNETIUM, source, length);
+ if (error_number == ZINT_ERROR_INVALID_DATA) {
+ strcpy(symbol->errtxt, "203: Invalid characters in data");
+ return error_number;
+ }
+
+ strcpy(to_process, "+");
+ counter = 41;
+ for (i = 0; i < length; i++) {
+ counter += posn(TECHNETIUM, source[i]);
+ }
+ counter = counter % 43;
+
+ if (counter < 10) {
+ check_digit = itoc(counter);
+ } else {
+ if (counter < 36) {
+ check_digit = (counter - 10) + 'A';
+ } else {
+ switch (counter) {
+ case 36: check_digit = '-';
+ break;
+ case 37: check_digit = '.';
+ break;
+ case 38: check_digit = ' ';
+ break;
+ case 39: check_digit = '$';
+ break;
+ case 40: check_digit = '/';
+ break;
+ case 41: check_digit = '+';
+ break;
+ case 42: check_digit = '%';
+ break;
+ default: check_digit = ' ';
+ break; /* Keep compiler happy */
+ }
+ }
+ }
+
+ temp[0] = check_digit;
+ temp[1] = '\0';
+
+ strcat(to_process, (char *) source);
+ strcat(to_process, temp);
+ length = strlen(to_process);
+
+ switch (symbol->symbology) {
+ case BARCODE_HIBC_128:
+ error_number = code_128(symbol, (unsigned char *) to_process, length);
+ ustrcpy(symbol->text, (unsigned char*) "*");
+ strcat((char*) symbol->text, to_process);
+ strcat((char*) symbol->text, "*");
+ break;
+ case BARCODE_HIBC_39:
+ symbol->option_2 = 0;
+ error_number = c39(symbol, (unsigned char *) to_process, length);
+ ustrcpy(symbol->text, (unsigned char*) "*");
+ strcat((char*) symbol->text, to_process);
+ strcat((char*) symbol->text, "*");
+ break;
+ case BARCODE_HIBC_DM:
+ error_number = dmatrix(symbol, (unsigned char *) to_process, length);
+ break;
+ case BARCODE_HIBC_QR:
+ error_number = qr_code(symbol, (unsigned char *) to_process, length);
+ break;
+ case BARCODE_HIBC_PDF:
+ error_number = pdf417enc(symbol, (unsigned char *) to_process, length);
+ break;
+ case BARCODE_HIBC_MICPDF:
+ error_number = micro_pdf417(symbol, (unsigned char *) to_process, length);
+ break;
+ case BARCODE_HIBC_AZTEC:
+ error_number = aztec(symbol, (unsigned char *) to_process, length);
+ break;
+ case BARCODE_HIBC_BLOCKF:
+ error_number = codablock(symbol, (unsigned char *) to_process, length);
+ break;
+ }
+
+ return error_number;
+}
+
+static void check_row_heights(struct zint_symbol *symbol) {
+ /* Check that rows with undefined heights are never less than 5x */
+ int large_bar_count = 0;
+ int i;
+ int preset_height = 0;
+ int large_bar_height = 0;
+
+ for (i = 0; i < symbol->rows; i++) {
+ preset_height += symbol->row_height[i];
+ if (symbol->row_height[i] == 0) {
+ large_bar_count++;
+ }
+ }
+
+ if (large_bar_count == 0) {
+ symbol->height = preset_height;
+ } else {
+ large_bar_height = (symbol->height - preset_height) / large_bar_count;
+ }
+
+ if (large_bar_height < 5) {
+ for (i = 0; i < symbol->rows; i++) {
+ if (symbol->row_height[i] == 0) {
+ symbol->row_height[i] = 5;
+ preset_height += 5;
+ }
+ }
+ symbol->height = preset_height;
+ }
+}
+
+static int gs1_compliant(const int symbology) {
+ /* Returns 1 if symbology supports GS1 data */
+
+ int result = 0;
+
+ switch (symbology) {
+ case BARCODE_EAN128:
+ case BARCODE_RSS_EXP:
+ case BARCODE_RSS_EXPSTACK:
+ case BARCODE_EANX_CC:
+ case BARCODE_EAN128_CC:
+ case BARCODE_RSS14_CC:
+ case BARCODE_RSS_LTD_CC:
+ case BARCODE_RSS_EXP_CC:
+ case BARCODE_UPCA_CC:
+ case BARCODE_UPCE_CC:
+ case BARCODE_RSS14STACK_CC:
+ case BARCODE_RSS14_OMNI_CC:
+ case BARCODE_RSS_EXPSTACK_CC:
+ case BARCODE_CODE16K:
+ case BARCODE_AZTEC:
+ case BARCODE_DATAMATRIX:
+ case BARCODE_CODEONE:
+ case BARCODE_CODE49:
+ case BARCODE_QRCODE:
+ case BARCODE_DOTCODE:
+ result = 1;
+ break;
+ }
+
+ return result;
+}
+
+static int is_matrix(const int symbology) {
+ /* Returns 1 if symbology is a matrix design */
+
+ int result = 0;
+
+ switch (symbology) {
+ case BARCODE_QRCODE:
+ case BARCODE_DATAMATRIX:
+ case BARCODE_MICROQR:
+ case BARCODE_HIBC_DM:
+ case BARCODE_AZTEC:
+ case BARCODE_HIBC_QR:
+ case BARCODE_HIBC_AZTEC:
+ case BARCODE_AZRUNE:
+ case BARCODE_CODEONE:
+ case BARCODE_GRIDMATRIX:
+ case BARCODE_HANXIN:
+ case BARCODE_DOTCODE:
+ case BARCODE_UPNQR:
+ result = 1;
+ break;
+ }
+
+ return result;
+}
+
+static int supports_eci(const int symbology) {
+ /* Returns 1 if symbology can encode the ECI character */
+
+ int result = 0;
+
+ switch (symbology) {
+ case BARCODE_AZTEC:
+ case BARCODE_DATAMATRIX:
+ case BARCODE_MAXICODE:
+ case BARCODE_MICROPDF417:
+ case BARCODE_PDF417:
+ case BARCODE_PDF417TRUNC:
+ case BARCODE_QRCODE:
+ case BARCODE_DOTCODE:
+ case BARCODE_GRIDMATRIX:
+ case BARCODE_HANXIN:
+ result = 1;
+ break;
+ }
+
+ return result;
+}
+
+int ZBarcode_ValidID(int symbol_id) {
+ /* Checks whether a symbology is supported */
+
+ int result = 0;
+
+ switch (symbol_id) {
+ case BARCODE_CODE11:
+ case BARCODE_C25MATRIX:
+ case BARCODE_C25INTER:
+ case BARCODE_C25IATA:
+ case BARCODE_C25LOGIC:
+ case BARCODE_C25IND:
+ case BARCODE_CODE39:
+ case BARCODE_EXCODE39:
+ case BARCODE_EANX:
+ case BARCODE_EANX_CHK:
+ case BARCODE_EAN128:
+ case BARCODE_CODABAR:
+ case BARCODE_CODE128:
+ case BARCODE_DPLEIT:
+ case BARCODE_DPIDENT:
+ case BARCODE_CODE16K:
+ case BARCODE_CODE49:
+ case BARCODE_CODE93:
+ case BARCODE_FLAT:
+ case BARCODE_RSS14:
+ case BARCODE_RSS_LTD:
+ case BARCODE_RSS_EXP:
+ case BARCODE_TELEPEN:
+ case BARCODE_UPCA:
+ case BARCODE_UPCA_CHK:
+ case BARCODE_UPCE:
+ case BARCODE_UPCE_CHK:
+ case BARCODE_POSTNET:
+ case BARCODE_MSI_PLESSEY:
+ case BARCODE_FIM:
+ case BARCODE_LOGMARS:
+ case BARCODE_PHARMA:
+ case BARCODE_PZN:
+ case BARCODE_PHARMA_TWO:
+ case BARCODE_PDF417:
+ case BARCODE_PDF417TRUNC:
+ case BARCODE_MAXICODE:
+ case BARCODE_QRCODE:
+ case BARCODE_CODE128B:
+ case BARCODE_AUSPOST:
+ case BARCODE_AUSREPLY:
+ case BARCODE_AUSROUTE:
+ case BARCODE_AUSREDIRECT:
+ case BARCODE_ISBNX:
+ case BARCODE_RM4SCC:
+ case BARCODE_DATAMATRIX:
+ case BARCODE_EAN14:
+ case BARCODE_NVE18:
+ case BARCODE_JAPANPOST:
+ case BARCODE_KOREAPOST:
+ case BARCODE_RSS14STACK:
+ case BARCODE_RSS14STACK_OMNI:
+ case BARCODE_RSS_EXPSTACK:
+ case BARCODE_PLANET:
+ case BARCODE_MICROPDF417:
+ case BARCODE_ONECODE:
+ case BARCODE_PLESSEY:
+ case BARCODE_TELEPEN_NUM:
+ case BARCODE_ITF14:
+ case BARCODE_KIX:
+ case BARCODE_AZTEC:
+ case BARCODE_DAFT:
+ case BARCODE_MICROQR:
+ case BARCODE_HIBC_128:
+ case BARCODE_HIBC_39:
+ case BARCODE_HIBC_DM:
+ case BARCODE_HIBC_QR:
+ case BARCODE_HIBC_PDF:
+ case BARCODE_HIBC_MICPDF:
+ case BARCODE_HIBC_AZTEC:
+ case BARCODE_HIBC_BLOCKF:
+ case BARCODE_AZRUNE:
+ case BARCODE_CODE32:
+ case BARCODE_EANX_CC:
+ case BARCODE_EAN128_CC:
+ case BARCODE_RSS14_CC:
+ case BARCODE_RSS_LTD_CC:
+ case BARCODE_RSS_EXP_CC:
+ case BARCODE_UPCA_CC:
+ case BARCODE_UPCE_CC:
+ case BARCODE_RSS14STACK_CC:
+ case BARCODE_RSS14_OMNI_CC:
+ case BARCODE_RSS_EXPSTACK_CC:
+ case BARCODE_CHANNEL:
+ case BARCODE_CODEONE:
+ case BARCODE_GRIDMATRIX:
+ case BARCODE_HANXIN:
+ case BARCODE_DOTCODE:
+ case BARCODE_CODABLOCKF:
+ case BARCODE_UPNQR:
+ result = 1;
+ break;
+ }
+
+ return result;
+}
+
+static int extended_charset(struct zint_symbol *symbol, const unsigned char *source, const int length) {
+ int error_number = 0;
+
+ /* These are the "elite" standards which can support multiple character sets */
+ switch (symbol->symbology) {
+ case BARCODE_QRCODE: error_number = qr_code(symbol, source, length);
+ break;
+ case BARCODE_MICROQR: error_number = microqr(symbol, source, length);
+ break;
+ case BARCODE_GRIDMATRIX: error_number = grid_matrix(symbol, source, length);
+ break;
+ case BARCODE_HANXIN: error_number = han_xin(symbol, source, length);
+ break;
+ case BARCODE_UPNQR: error_number = upnqr(symbol, source, length);
+ break;
+ }
+
+ return error_number;
+}
+
+static int reduced_charset(struct zint_symbol *symbol, const unsigned char *source, size_t in_length) {
+ /* These are the "norm" standards which only support Latin-1 at most */
+ int error_number = 0;
+
+#ifndef _MSC_VER
+ unsigned char preprocessed[in_length + 1];
+#else
+ unsigned char* preprocessed = (unsigned char*) _alloca(in_length + 1);
+#endif
+
+ if (symbol->symbology == BARCODE_CODE16K) {
+ symbol->whitespace_width = 16;
+ symbol->border_width = 2;
+ if (!(symbol->output_options & BARCODE_BIND)) {
+ symbol->output_options += BARCODE_BIND;
+ }
+ }
+ else
+ if (symbol->symbology == BARCODE_ITF14) {
+ symbol->whitespace_width = 20;
+ symbol->border_width = 8;
+ if (!(symbol->output_options & BARCODE_BOX)) {
+ symbol->output_options += BARCODE_BOX;
+ }
+ }
+
+ switch (symbol->input_mode) {
+ case DATA_MODE:
+ case GS1_MODE:
+ memcpy(preprocessed, source, in_length);
+ preprocessed[in_length] = '\0';
+ break;
+ case UNICODE_MODE:
+ error_number = utf_to_eci(symbol->eci, source, preprocessed, &in_length);
+ if (error_number != 0) {
+ strcpy(symbol->errtxt, "204: Invalid characters in input data");
+ return error_number;
+ }
+ break;
+ }
+
+ switch (symbol->symbology) {
+ case BARCODE_C25MATRIX: error_number = matrix_two_of_five(symbol, preprocessed, in_length);
+ break;
+ case BARCODE_C25IND: error_number = industrial_two_of_five(symbol, preprocessed, in_length);
+ break;
+ case BARCODE_C25INTER: error_number = interleaved_two_of_five(symbol, preprocessed, in_length);
+ break;
+ case BARCODE_C25IATA: error_number = iata_two_of_five(symbol, preprocessed, in_length);
+ break;
+ case BARCODE_C25LOGIC: error_number = logic_two_of_five(symbol, preprocessed, in_length);
+ break;
+ case BARCODE_DPLEIT: error_number = dpleit(symbol, preprocessed, in_length);
+ break;
+ case BARCODE_DPIDENT: error_number = dpident(symbol, preprocessed, in_length);
+ break;
+ case BARCODE_UPCA:
+ case BARCODE_UPCA_CHK:
+ case BARCODE_UPCE:
+ case BARCODE_UPCE_CHK:
+ case BARCODE_EANX:
+ case BARCODE_EANX_CHK:
+ error_number = eanx(symbol, preprocessed, in_length);
+ break;
+ case BARCODE_EAN128: error_number = ean_128(symbol, preprocessed, in_length);
+ break;
+ case BARCODE_CODE39: error_number = c39(symbol, preprocessed, in_length);
+ break;
+ case BARCODE_PZN: error_number = pharmazentral(symbol, preprocessed, in_length);
+ break;
+ case BARCODE_EXCODE39: error_number = ec39(symbol, preprocessed, in_length);
+ break;
+ case BARCODE_CODABAR: error_number = codabar(symbol, preprocessed, in_length);
+ break;
+ case BARCODE_CODE93: error_number = c93(symbol, preprocessed, in_length);
+ break;
+ case BARCODE_LOGMARS: error_number = c39(symbol, preprocessed, in_length);
+ break;
+ case BARCODE_CODE128:
+ case BARCODE_CODE128B:
+ error_number = code_128(symbol, preprocessed, in_length);
+ break;
+ case BARCODE_NVE18: error_number = nve_18(symbol, preprocessed, in_length);
+ break;
+ case BARCODE_CODE11: error_number = code_11(symbol, preprocessed, in_length);
+ break;
+ case BARCODE_MSI_PLESSEY: error_number = msi_handle(symbol, preprocessed, in_length);
+ break;
+ case BARCODE_TELEPEN: error_number = telepen(symbol, preprocessed, in_length);
+ break;
+ case BARCODE_TELEPEN_NUM: error_number = telepen_num(symbol, preprocessed, in_length);
+ break;
+ case BARCODE_PHARMA: error_number = pharma_one(symbol, preprocessed, in_length);
+ break;
+ case BARCODE_PLESSEY: error_number = plessey(symbol, preprocessed, in_length);
+ break;
+ case BARCODE_ITF14: error_number = itf14(symbol, preprocessed, in_length);
+ break;
+ case BARCODE_FLAT: error_number = flattermarken(symbol, preprocessed, in_length);
+ break;
+ case BARCODE_FIM: error_number = fim(symbol, preprocessed, in_length);
+ break;
+ case BARCODE_POSTNET: error_number = post_plot(symbol, preprocessed, in_length);
+ break;
+ case BARCODE_PLANET: error_number = planet_plot(symbol, preprocessed, in_length);
+ break;
+ case BARCODE_RM4SCC: error_number = royal_plot(symbol, preprocessed, in_length);
+ break;
+ case BARCODE_AUSPOST:
+ case BARCODE_AUSREPLY:
+ case BARCODE_AUSROUTE:
+ case BARCODE_AUSREDIRECT:
+ error_number = australia_post(symbol, preprocessed, in_length);
+ break;
+ case BARCODE_CODE16K: error_number = code16k(symbol, preprocessed, in_length);
+ break;
+ case BARCODE_PHARMA_TWO: error_number = pharma_two(symbol, preprocessed, in_length);
+ break;
+ case BARCODE_ONECODE: error_number = imail(symbol, preprocessed, in_length);
+ break;
+ case BARCODE_ISBNX: error_number = eanx(symbol, preprocessed, in_length);
+ break;
+ case BARCODE_RSS14:
+ case BARCODE_RSS14STACK:
+ case BARCODE_RSS14STACK_OMNI:
+ error_number = rss14(symbol, preprocessed, in_length);
+ break;
+ case BARCODE_RSS_LTD: error_number = rsslimited(symbol, preprocessed, in_length);
+ break;
+ case BARCODE_RSS_EXP:
+ case BARCODE_RSS_EXPSTACK:
+ error_number = rssexpanded(symbol, preprocessed, in_length);
+ break;
+ case BARCODE_EANX_CC:
+ case BARCODE_EAN128_CC:
+ case BARCODE_RSS14_CC:
+ case BARCODE_RSS_LTD_CC:
+ case BARCODE_RSS_EXP_CC:
+ case BARCODE_UPCA_CC:
+ case BARCODE_UPCE_CC:
+ case BARCODE_RSS14STACK_CC:
+ case BARCODE_RSS14_OMNI_CC:
+ case BARCODE_RSS_EXPSTACK_CC:
+ error_number = composite(symbol, preprocessed, in_length);
+ break;
+ case BARCODE_KIX: error_number = kix_code(symbol, preprocessed, in_length);
+ break;
+ case BARCODE_CODE32: error_number = code32(symbol, preprocessed, in_length);
+ break;
+ case BARCODE_DAFT: error_number = daft_code(symbol, preprocessed, in_length);
+ break;
+ case BARCODE_EAN14:
+ error_number = ean_14(symbol, preprocessed, in_length);
+ break;
+ case BARCODE_AZRUNE: error_number = aztec_runes(symbol, preprocessed, in_length);
+ break;
+ case BARCODE_KOREAPOST: error_number = korea_post(symbol, preprocessed, in_length);
+ break;
+ case BARCODE_HIBC_128:
+ case BARCODE_HIBC_39:
+ case BARCODE_HIBC_DM:
+ case BARCODE_HIBC_QR:
+ case BARCODE_HIBC_PDF:
+ case BARCODE_HIBC_MICPDF:
+ case BARCODE_HIBC_AZTEC:
+ case BARCODE_HIBC_BLOCKF:
+ error_number = hibc(symbol, preprocessed, in_length);
+ break;
+ case BARCODE_JAPANPOST: error_number = japan_post(symbol, preprocessed, in_length);
+ break;
+ case BARCODE_CODE49: error_number = code_49(symbol, preprocessed, in_length);
+ break;
+ case BARCODE_CHANNEL: error_number = channel_code(symbol, preprocessed, in_length);
+ break;
+ case BARCODE_CODEONE: error_number = code_one(symbol, preprocessed, in_length);
+ break;
+ case BARCODE_DATAMATRIX: error_number = dmatrix(symbol, preprocessed, in_length);
+ break;
+ case BARCODE_PDF417:
+ case BARCODE_PDF417TRUNC:
+ error_number = pdf417enc(symbol, preprocessed, in_length);
+ break;
+ case BARCODE_MICROPDF417: error_number = micro_pdf417(symbol, preprocessed, in_length);
+ break;
+ case BARCODE_MAXICODE: error_number = maxicode(symbol, preprocessed, in_length);
+ break;
+ case BARCODE_AZTEC: error_number = aztec(symbol, preprocessed, in_length);
+ break;
+ case BARCODE_DOTCODE: error_number = dotcode(symbol, preprocessed, in_length);
+ break;
+ case BARCODE_CODABLOCKF: error_number = codablock(symbol, preprocessed, in_length);
+ break;
+ }
+
+ return error_number;
+}
+
+int ZBarcode_Encode(struct zint_symbol *symbol, const unsigned char *source,int in_length) {
+ int error_number, error_buffer, i;
+#ifdef _MSC_VER
+ unsigned char* local_source;
+#endif
+ error_number = 0;
+
+ if (in_length == 0) {
+ in_length = (int)ustrlen(source);
+ }
+ if (in_length == 0) {
+ strcpy(symbol->errtxt, "205: No input data");
+ error_tag(symbol->errtxt, ZINT_ERROR_INVALID_DATA);
+ return ZINT_ERROR_INVALID_DATA;
+ }
+
+ if (strcmp(symbol->outfile, "") == 0) {
+#ifdef NO_PNG
+ strcpy(symbol->outfile, "out.gif");
+#else
+ strcpy(symbol->outfile, "out.png");
+#endif
+ }
+#ifndef _MSC_VER
+ unsigned char local_source[in_length + 1];
+#else
+ local_source = (unsigned char*) _alloca(in_length + 1);
+#endif
+
+ /* First check the symbology field */
+ if (symbol->symbology < 1) {
+ strcpy(symbol->errtxt, "206: Symbology out of range, using Code 128");
+ symbol->symbology = BARCODE_CODE128;
+ error_number = ZINT_WARN_INVALID_OPTION;
+ }
+
+ /* symbol->symbologys 1 to 86 are defined by tbarcode */
+ if (symbol->symbology == 5) {
+ symbol->symbology = BARCODE_C25MATRIX;
+ }
+ if ((symbol->symbology >= 10) && (symbol->symbology <= 12)) {
+ symbol->symbology = BARCODE_EANX;
+ }
+ if (symbol->symbology == 15) {
+ symbol->symbology = BARCODE_EANX;
+ }
+ if (symbol->symbology == 17) {
+ symbol->symbology = BARCODE_UPCA;
+ }
+ if (symbol->symbology == 19) {
+ strcpy(symbol->errtxt, "207: Codabar 18 not supported, using Codabar");
+ symbol->symbology = BARCODE_CODABAR;
+ error_number = ZINT_WARN_INVALID_OPTION;
+ }
+ if (symbol->symbology == 26) {
+ symbol->symbology = BARCODE_UPCA;
+ }
+ if (symbol->symbology == 27) {
+ strcpy(symbol->errtxt, "208: UPCD1 not supported");
+ error_number = ZINT_ERROR_INVALID_OPTION;
+ }
+ if (symbol->symbology == 33) {
+ symbol->symbology = BARCODE_EAN128;
+ }
+ if (symbol->symbology == 36) {
+ symbol->symbology = BARCODE_UPCA;
+ }
+ if (symbol->symbology == 38) {
+ symbol->symbology = BARCODE_UPCE;
+ }
+ if ((symbol->symbology >= 41) && (symbol->symbology <= 45)) {
+ symbol->symbology = BARCODE_POSTNET;
+ }
+ if (symbol->symbology == 46) {
+ symbol->symbology = BARCODE_PLESSEY;
+ }
+ if (symbol->symbology == 48) {
+ symbol->symbology = BARCODE_NVE18;
+ }
+ if (symbol->symbology == 54) {
+ strcpy(symbol->errtxt, "210: General Parcel Code not supported, using Code 128");
+ symbol->symbology = BARCODE_CODE128;
+ error_number = ZINT_WARN_INVALID_OPTION;
+ }
+ if ((symbol->symbology == 59) || (symbol->symbology == 61)) {
+ symbol->symbology = BARCODE_CODE128;
+ }
+ if (symbol->symbology == 62) {
+ symbol->symbology = BARCODE_CODE93;
+ }
+ if ((symbol->symbology == 64) || (symbol->symbology == 65)) {
+ symbol->symbology = BARCODE_AUSPOST;
+ }
+ if (symbol->symbology == 73) {
+ strcpy(symbol->errtxt, "211: Symbology out of range, using Code 128");
+ symbol->symbology = BARCODE_CODE128;
+ error_number = ZINT_WARN_INVALID_OPTION;
+ }
+ if (symbol->symbology == 78) {
+ symbol->symbology = BARCODE_RSS14;
+ }
+ if (symbol->symbology == 83) {
+ symbol->symbology = BARCODE_PLANET;
+ }
+ if (symbol->symbology == 88) {
+ symbol->symbology = BARCODE_EAN128;
+ }
+ if (symbol->symbology == 91) {
+ strcpy(symbol->errtxt, "212: Symbology out of range, using Code 128");
+ symbol->symbology = BARCODE_CODE128;
+ error_number = ZINT_WARN_INVALID_OPTION;
+ }
+ if ((symbol->symbology >= 94) && (symbol->symbology <= 96)) {
+ strcpy(symbol->errtxt, "213: Symbology out of range, using Code 128");
+ symbol->symbology = BARCODE_CODE128;
+ error_number = ZINT_WARN_INVALID_OPTION;
+ }
+ if (symbol->symbology == 100) {
+ symbol->symbology = BARCODE_HIBC_128;
+ }
+ if (symbol->symbology == 101) {
+ symbol->symbology = BARCODE_HIBC_39;
+ }
+ if (symbol->symbology == 103) {
+ symbol->symbology = BARCODE_HIBC_DM;
+ }
+ if (symbol->symbology == 105) {
+ symbol->symbology = BARCODE_HIBC_QR;
+ }
+ if (symbol->symbology == 107) {
+ symbol->symbology = BARCODE_HIBC_PDF;
+ }
+ if (symbol->symbology == 109) {
+ symbol->symbology = BARCODE_HIBC_MICPDF;
+ }
+ if (symbol->symbology == 111) {
+ symbol->symbology = BARCODE_HIBC_BLOCKF;
+ }
+ if ((symbol->symbology == 113) || (symbol->symbology == 114)) {
+ strcpy(symbol->errtxt, "214: Symbology out of range, using Code 128");
+ symbol->symbology = BARCODE_CODE128;
+ error_number = ZINT_WARN_INVALID_OPTION;
+ }
+ if (symbol->symbology == 115) {
+ symbol->symbology = BARCODE_DOTCODE;
+ }
+ if ((symbol->symbology >= 117) && (symbol->symbology <= 127)) {
+ strcpy(symbol->errtxt, "215: Symbology out of range, using Code 128");
+ symbol->symbology = BARCODE_CODE128;
+ error_number = ZINT_WARN_INVALID_OPTION;
+ }
+ /* Everything from 128 up is Zint-specific */
+ if (symbol->symbology >= 144) {
+ strcpy(symbol->errtxt, "216: Symbology out of range, using Code 128");
+ symbol->symbology = BARCODE_CODE128;
+ error_number = ZINT_WARN_INVALID_OPTION;
+ }
+
+ if (error_number > 4) {
+ error_tag(symbol->errtxt, error_number);
+ return error_number;
+ } else {
+ error_buffer = error_number;
+ }
+
+ if ((!(supports_eci(symbol->symbology))) && (symbol->eci != 3)) {
+ strcpy(symbol->errtxt, "217: Symbology does not support ECI switching");
+ error_number = ZINT_ERROR_INVALID_OPTION;
+ }
+
+ if ((symbol->eci < 3) || (symbol->eci > 999999)) {
+ strcpy(symbol->errtxt, "218: Invalid ECI mode");
+ error_number = ZINT_ERROR_INVALID_OPTION;
+ }
+
+ if ((symbol->input_mode < 0) || (symbol->input_mode > 2)) {
+ symbol->input_mode = DATA_MODE;
+ }
+
+ if ((symbol->eci != 3) && (symbol->eci != 26)) {
+ symbol->input_mode = DATA_MODE;
+ }
+
+ if (symbol->input_mode == GS1_MODE) {
+ for (i = 0; i < in_length; i++) {
+ if (source[i] == '\0') {
+ strcpy(symbol->errtxt, "219: NULL characters not permitted in GS1 mode");
+ return ZINT_ERROR_INVALID_DATA;
+ }
+ }
+ if (gs1_compliant(symbol->symbology) == 1) {
+ error_number = ugs1_verify(symbol, source, in_length, local_source);
+ if (error_number != 0) {
+ return error_number;
+ }
+ in_length =(int)ustrlen(local_source);
+ } else {
+ strcpy(symbol->errtxt, "220: Selected symbology does not support GS1 mode");
+ return ZINT_ERROR_INVALID_OPTION;
+ }
+ } else {
+ memcpy(local_source, source, in_length);
+ local_source[in_length] = '\0';
+ }
+
+ if ((symbol->dot_size < 0.01) || (symbol->dot_size > 20.0)) {
+ strcpy(symbol->errtxt, "221: Invalid dot size");
+ return ZINT_ERROR_INVALID_OPTION;
+ }
+
+ switch (symbol->symbology) {
+ case BARCODE_QRCODE:
+ case BARCODE_MICROQR:
+ case BARCODE_GRIDMATRIX:
+ case BARCODE_HANXIN:
+ case BARCODE_UPNQR:
+ error_number = extended_charset(symbol, local_source, in_length);
+ break;
+ default:
+ error_number = reduced_charset(symbol, local_source, in_length);
+ break;
+ }
+
+ if ((error_number == ZINT_ERROR_INVALID_DATA) && (supports_eci(symbol->symbology)
+ && (symbol->input_mode == UNICODE_MODE))) {
+ /* Try another ECI mode */
+ symbol->eci = get_best_eci(local_source, in_length);
+
+ error_number = ZINT_WARN_USES_ECI;
+ strcpy(symbol->errtxt, "222: Encoded data includes ECI codes");
+ //printf("Data will encode with ECI %d\n", symbol->eci);
+
+ switch (symbol->symbology) {
+ case BARCODE_QRCODE:
+ case BARCODE_MICROQR:
+ case BARCODE_GRIDMATRIX:
+ case BARCODE_HANXIN:
+ error_number = utf_to_eci(symbol->eci, source, local_source, (size_t*)&in_length);
+ error_number = extended_charset(symbol, local_source, in_length);
+ break;
+ default:
+ error_number = reduced_charset(symbol, local_source, in_length);
+ break;
+ }
+
+ }
+
+ if (error_number == 0) {
+ if ((symbol->symbology == BARCODE_CODE128) || (symbol->symbology == BARCODE_CODE128B)) {
+ for (i = 0; i < in_length; i++) {
+ if (local_source[i] == '\0') {
+ symbol->text[i] = ' ';
+ } else {
+ symbol->text[i] = local_source[i];
+ }
+ }
+ }
+ error_number = error_buffer;
+ }
+ error_tag(symbol->errtxt, error_number);
+
+ if (error_number <= 5) {
+ check_row_heights(symbol);
+ }
+
+ return error_number;
+}
+
+int ZBarcode_Print(struct zint_symbol *symbol, int rotate_angle) {
+ int error_number;
+ char output[4];
+
+ switch (rotate_angle) {
+ case 0:
+ case 90:
+ case 180:
+ case 270:
+ break;
+ default:
+ strcpy(symbol->errtxt, "223: Invalid rotation angle");
+ return ZINT_ERROR_INVALID_OPTION;
+ }
+
+ if (symbol->output_options & BARCODE_DOTTY_MODE) {
+ if (!(is_matrix(symbol->symbology))) {
+ strcpy(symbol->errtxt, "224: Selected symbology cannot be rendered as dots");
+ return ZINT_ERROR_INVALID_OPTION;
+ }
+ }
+
+ if (strlen(symbol->outfile) > 3) {
+ output[0] = symbol->outfile[strlen(symbol->outfile) - 3];
+ output[1] = symbol->outfile[strlen(symbol->outfile) - 2];
+ output[2] = symbol->outfile[strlen(symbol->outfile) - 1];
+ output[3] = '\0';
+ to_upper((unsigned char*) output);
+
+ if (!(strcmp(output, "PNG"))) {
+ if (symbol->scale < 1.0) {
+ symbol->text[0] = '\0';
+ }
+ error_number = plot_raster(symbol, rotate_angle, OUT_PNG_FILE);
+ } else
+ if (!(strcmp(output, "BMP"))) {
+ if (symbol->scale < 1.0) {
+ symbol->text[0] = '\0';
+ }
+ error_number = plot_raster(symbol, rotate_angle, OUT_BMP_FILE);
+ } else
+ if (!(strcmp(output, "PCX"))) {
+ if (symbol->scale < 1.0) {
+ symbol->text[0] = '\0';
+ }
+ error_number = plot_raster(symbol, rotate_angle, OUT_PCX_FILE);
+ } else
+ if (!(strcmp(output, "GIF"))) {
+ if (symbol->scale < 1.0) {
+ symbol->text[0] = '\0';
+ }
+ error_number = plot_raster(symbol, rotate_angle, OUT_GIF_FILE);
+ } else
+ if (!(strcmp(output, "TIF"))) {
+ if (symbol->scale < 1.0) {
+ symbol->text[0] = '\0';
+ }
+ error_number = plot_raster(symbol, rotate_angle, OUT_TIF_FILE);
+ } else
+ if (!(strcmp(output, "TXT"))) {
+ error_number = dump_plot(symbol);
+ } else
+ if (!(strcmp(output, "EPS"))) {
+ error_number = ps_plot(symbol);
+ } else
+ if (!(strcmp(output, "SVG"))) {
+ error_number = svg_plot(symbol);
+ } else
+ if (!(strcmp(output, "EMF"))) {
+ error_number = emf_plot(symbol);
+ } else {
+ strcpy(symbol->errtxt, "225: Unknown output format");
+ error_tag(symbol->errtxt, ZINT_ERROR_INVALID_OPTION);
+ return ZINT_ERROR_INVALID_OPTION;
+ }
+ } else {
+ strcpy(symbol->errtxt, "226: Unknown output format");
+ error_tag(symbol->errtxt, ZINT_ERROR_INVALID_OPTION);
+ return ZINT_ERROR_INVALID_OPTION;
+ }
+
+ if (error_number == ZINT_ERROR_INVALID_OPTION) {
+ /* If libpng is not installed */
+ strcpy(symbol->errtxt, "227: Unknown output format");
+ }
+
+ error_tag(symbol->errtxt, error_number);
+ return error_number;
+}
+
+int ZBarcode_Buffer(struct zint_symbol *symbol, int rotate_angle) {
+ int error_number;
+
+ switch (rotate_angle) {
+ case 0:
+ case 90:
+ case 180:
+ case 270:
+ break;
+ default:
+ strcpy(symbol->errtxt, "228: Invalid rotation angle");
+ return ZINT_ERROR_INVALID_OPTION;
+ }
+
+ error_number = plot_raster(symbol, rotate_angle, OUT_BUFFER);
+ error_tag(symbol->errtxt, error_number);
+ return error_number;
+}
+
+int ZBarcode_Encode_and_Print(struct zint_symbol *symbol, unsigned char *input, int length, int rotate_angle) {
+ int error_number;
+
+ error_number = ZBarcode_Encode(symbol, input, length);
+ if (error_number != 0) {
+ return error_number;
+ }
+
+ error_number = ZBarcode_Print(symbol, rotate_angle);
+ return error_number;
+}
+
+int ZBarcode_Encode_and_Buffer(struct zint_symbol *symbol, unsigned char *input, int length, int rotate_angle) {
+ int error_number;
+
+ error_number = ZBarcode_Encode(symbol, input, length);
+ if (error_number != 0) {
+ return error_number;
+ }
+
+ error_number = ZBarcode_Buffer(symbol, rotate_angle);
+ return error_number;
+}
+
+int ZBarcode_Encode_File(struct zint_symbol *symbol, char *filename) {
+ FILE *file;
+ unsigned char *buffer;
+ unsigned long fileLen;
+ unsigned int nRead = 0, n = 0;
+ int ret;
+
+ if (!strcmp(filename, "-")) {
+ file = stdin;
+ fileLen = 7100;
+ } else {
+ file = fopen(filename, "rb");
+ if (!file) {
+ strcpy(symbol->errtxt, "229: Unable to read input file");
+ return ZINT_ERROR_INVALID_DATA;
+ }
+
+ /* Get file length */
+ fseek(file, 0, SEEK_END);
+ fileLen = ftell(file);
+ fseek(file, 0, SEEK_SET);
+
+ if (fileLen > 7100) {
+ /* The largest amount of data that can be encoded is 7089 numeric digits in QR Code */
+ strcpy(symbol->errtxt, "230: Input file too long");
+ fclose(file);
+ return ZINT_ERROR_INVALID_DATA;
+ }
+ }
+
+ /* Allocate memory */
+ buffer = (unsigned char *) malloc(fileLen * sizeof (unsigned char));
+ if (!buffer) {
+ strcpy(symbol->errtxt, "231: Internal memory error");
+ if (strcmp(filename, "-"))
+ fclose(file);
+ return ZINT_ERROR_MEMORY;
+ }
+
+ /* Read file contents into buffer */
+
+ do {
+ n = fread(buffer + nRead, 1, fileLen - nRead, file);
+ if (ferror(file)) {
+ strcpy(symbol->errtxt, strerror(errno));
+ return ZINT_ERROR_INVALID_DATA;
+ }
+ nRead += n;
+ } while (!feof(file) && (0 < n) && (nRead < fileLen));
+
+ fclose(file);
+ ret = ZBarcode_Encode(symbol, buffer, nRead);
+ free(buffer);
+ return ret;
+}
+
+int ZBarcode_Encode_File_and_Print(struct zint_symbol *symbol, char *filename, int rotate_angle) {
+ int error_number;
+
+ error_number = ZBarcode_Encode_File(symbol, filename);
+ if (error_number != 0) {
+ return error_number;
+ }
+
+ return ZBarcode_Print(symbol, rotate_angle);
+}
+
+int ZBarcode_Encode_File_and_Buffer(struct zint_symbol *symbol, char *filename, int rotate_angle) {
+ int error_number;
+
+ error_number = ZBarcode_Encode_File(symbol, filename);
+ if (error_number != 0) {
+ return error_number;
+ }
+
+ return ZBarcode_Buffer(symbol, rotate_angle);
+}
+
+/*
+ * Rendering support, initially added by Sam Lown.
+ *
+ * Converts encoded data into an intermediate format to be interpreted
+ * in other applications using this library.
+ *
+ * If the width and height are not set to zero, the barcode will be resized to those
+ * dimensions. The symbol->scale and symbol->height values are totally ignored in this case.
+ *
+ */
+int ZBarcode_Render(struct zint_symbol *symbol, const float width, const float height) {
+ // Send the request to the render_plot method
+ return render_plot(symbol, width, height);
+}
+
+int ZBarcode_Version() {
+ return (ZINT_VERSION_MAJOR * 10000) + (ZINT_VERSION_MINOR * 100) + ZINT_VERSION_RELEASE;
+}
diff --git a/3rdparty/zint-2.6.1/backend/libzint.rc b/3rdparty/zint-2.6.1/backend/libzint.rc
new file mode 100644
index 0000000..8e3b780
--- /dev/null
+++ b/3rdparty/zint-2.6.1/backend/libzint.rc
@@ -0,0 +1,42 @@
+#define WIN32_LEAN_AND_MEAN
+#include
+#include
+
+#ifdef GCC_WINDRES
+VS_VERSION_INFO VERSIONINFO
+#else
+VS_VERSION_INFO VERSIONINFO
+#endif
+ FILEVERSION 2,6,0,0
+ PRODUCTVERSION 2,6,0,0
+ FILEFLAGSMASK VS_FFI_FILEFLAGSMASK
+#ifdef _DEBUG
+ FILEFLAGS VS_FF_DEBUG
+#else
+ FILEFLAGS 0
+#endif
+ FILEOS VOS_NT_WINDOWS32
+ FILETYPE VFT_DLL
+ FILESUBTYPE VFT2_UNKNOWN
+BEGIN
+ BLOCK "StringFileInfo"
+ BEGIN
+ BLOCK "040904E4"
+ //language ID = U.S. English, char set = Windows, Multilingual
+ BEGIN
+ VALUE "FileDescription", "libzint barcode library\0"
+ VALUE "FileVersion", "2.6.0.0\0"
+ VALUE "InternalName", "zint.dll\0"
+ VALUE "LegalCopyright", "Copyright © 2017 Robin Stuart & BogDan Vatra\0"
+ VALUE "OriginalFilename", "zint.dll\0"
+ VALUE "ProductName", "libzint\0"
+ VALUE "ProductVersion", "2.6.0.0\0"
+ VALUE "License", "BSD License version 3\0"
+ VALUE "WWW", "http://www.sourceforge.net/projects/zint"
+ END
+ END
+ BLOCK "VarFileInfo"
+ BEGIN
+ VALUE "Translation", 0x0409, 1250
+ END
+END
diff --git a/3rdparty/zint-2.6.1/backend/maxicode.c b/3rdparty/zint-2.6.1/backend/maxicode.c
new file mode 100644
index 0000000..a012367
--- /dev/null
+++ b/3rdparty/zint-2.6.1/backend/maxicode.c
@@ -0,0 +1,733 @@
+/* maxicode.c - Handles Maxicode */
+
+/*
+ libzint - the open source barcode library
+ Copyright (C) 2010-2017 Robin Stuart
+
+ Redistribution and use in source and binary forms, with or without
+ modification, are permitted provided that the following conditions
+ are met:
+
+ 1. Redistributions of source code must retain the above copyright
+ notice, this list of conditions and the following disclaimer.
+ 2. Redistributions in binary form must reproduce the above copyright
+ notice, this list of conditions and the following disclaimer in the
+ documentation and/or other materials provided with the distribution.
+ 3. Neither the name of the project nor the names of its contributors
+ may be used to endorse or promote products derived from this software
+ without specific prior written permission.
+
+ THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND
+ ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+ ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE
+ FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+ DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
+ OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
+ HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
+ LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
+ OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+ SUCH DAMAGE.
+ */
+
+/* Includes corrections thanks to Monica Swanson @ Source Technologies */
+
+#include "common.h"
+#include "maxicode.h"
+#include "reedsol.h"
+#include
+#include
+
+int maxi_codeword[144];
+
+/* Handles error correction of primary message */
+void maxi_do_primary_check() {
+ unsigned char data[15];
+ unsigned char results[15];
+ int j;
+ int datalen = 10;
+ int ecclen = 10;
+
+ rs_init_gf(0x43);
+ rs_init_code(ecclen, 1);
+
+ for (j = 0; j < datalen; j += 1)
+ data[j] = maxi_codeword[j];
+
+ rs_encode(datalen, data, results);
+
+ for (j = 0; j < ecclen; j += 1)
+ maxi_codeword[ datalen + j] = results[ecclen - 1 - j];
+ rs_free();
+}
+
+/* Handles error correction of odd characters in secondary */
+void maxi_do_secondary_chk_odd(int ecclen) {
+ unsigned char data[100];
+ unsigned char results[30];
+ int j;
+ int datalen = 68;
+
+ rs_init_gf(0x43);
+ rs_init_code(ecclen, 1);
+
+ if (ecclen == 20)
+ datalen = 84;
+
+ for (j = 0; j < datalen; j += 1)
+ if (j & 1) // odd
+ data[(j - 1) / 2] = maxi_codeword[j + 20];
+
+ rs_encode(datalen / 2, data, results);
+
+ for (j = 0; j < (ecclen); j += 1)
+ maxi_codeword[ datalen + (2 * j) + 1 + 20 ] = results[ecclen - 1 - j];
+ rs_free();
+}
+
+/* Handles error correction of even characters in secondary */
+void maxi_do_secondary_chk_even(int ecclen) {
+ unsigned char data[100];
+ unsigned char results[30];
+ int j;
+ int datalen = 68;
+
+ if (ecclen == 20)
+ datalen = 84;
+
+ rs_init_gf(0x43);
+ rs_init_code(ecclen, 1);
+
+ for (j = 0; j < datalen + 1; j += 1)
+ if (!(j & 1)) // even
+ data[j / 2] = maxi_codeword[j + 20];
+
+ rs_encode(datalen / 2, data, results);
+
+ for (j = 0; j < (ecclen); j += 1)
+ maxi_codeword[ datalen + (2 * j) + 20] = results[ecclen - 1 - j];
+ rs_free();
+}
+
+/* Moves everything up so that a shift or latch can be inserted */
+void maxi_bump(int set[], int character[], int bump_posn) {
+ int i;
+
+ for (i = 143; i > bump_posn; i--) {
+ set[i] = set[i - 1];
+ character[i] = character[i - 1];
+ }
+}
+
+/* Format text according to Appendix A */
+int maxi_text_process(int mode, unsigned char source[], int length, int eci) {
+ /* This code doesn't make use of [Lock in C], [Lock in D]
+ and [Lock in E] and so is not always the most efficient at
+ compressing data, but should suffice for most applications */
+
+ int set[144], character[144], i, j, done, count, current_set;
+
+ if (length > 138) {
+ return ZINT_ERROR_TOO_LONG;
+ }
+
+ for (i = 0; i < 144; i++) {
+ set[i] = -1;
+ character[i] = 0;
+ }
+
+ for (i = 0; i < length; i++) {
+ /* Look up characters in table from Appendix A - this gives
+ value and code set for most characters */
+ set[i] = maxiCodeSet[source[i]];
+ character[i] = maxiSymbolChar[source[i]];
+ }
+
+ /* If a character can be represented in more than one code set,
+ pick which version to use */
+ if (set[0] == 0) {
+ if (character[0] == 13) {
+ character[0] = 0;
+ }
+ set[0] = 1;
+ }
+
+ for (i = 1; i < length; i++) {
+ if (set[i] == 0) {
+ done = 0;
+ /* Special character */
+ if (character[i] == 13) {
+ /* Carriage Return */
+ if (set[i - 1] == 5) {
+ character[i] = 13;
+ set[i] = 5;
+ } else {
+ if ((i != length - 1) && (set[i + 1] == 5)) {
+ character[i] = 13;
+ set[i] = 5;
+ } else {
+ character[i] = 0;
+ set[i] = 1;
+ }
+ }
+ done = 1;
+ }
+
+ if ((character[i] == 28) && (done == 0)) {
+ /* FS */
+ if (set[i - 1] == 5) {
+ character[i] = 32;
+ set[i] = 5;
+ } else {
+ set[i] = set[i - 1];
+ }
+ done = 1;
+ }
+
+ if ((character[i] == 29) && (done == 0)) {
+ /* GS */
+ if (set[i - 1] == 5) {
+ character[i] = 33;
+ set[i] = 5;
+ } else {
+ set[i] = set[i - 1];
+ }
+ done = 1;
+ }
+
+ if ((character[i] == 30) && (done == 0)) {
+ /* RS */
+ if (set[i - 1] == 5) {
+ character[i] = 34;
+ set[i] = 5;
+ } else {
+ set[i] = set[i - 1];
+ }
+ done = 1;
+ }
+
+ if ((character[i] == 32) && (done == 0)) {
+ /* Space */
+ if (set[i - 1] == 1) {
+ character[i] = 32;
+ set[i] = 1;
+ }
+ if (set[i - 1] == 2) {
+ character[i] = 47;
+ set[i] = 2;
+ }
+ if (set[i - 1] >= 3) {
+ if (i != length - 1) {
+ if (set[i + 1] == 1) {
+ character[i] = 32;
+ set[i] = 1;
+ }
+ if (set[i + 1] == 2) {
+ character[i] = 47;
+ set[i] = 2;
+ }
+ if (set[i + 1] >= 3) {
+ character[i] = 59;
+ set[i] = set[i - 1];
+ }
+ } else {
+ character[i] = 59;
+ set[i] = set[i - 1];
+ }
+ }
+ done = 1;
+ }
+
+ if ((character[i] == 44) && (done == 0)) {
+ /* Comma */
+ if (set[i - 1] == 2) {
+ character[i] = 48;
+ set[i] = 2;
+ } else {
+ if ((i != length - 1) && (set[i + 1] == 2)) {
+ character[i] = 48;
+ set[i] = 2;
+ } else {
+ set[i] = 1;
+ }
+ }
+ done = 1;
+ }
+
+ if ((character[i] == 46) && (done == 0)) {
+ /* Full Stop */
+ if (set[i - 1] == 2) {
+ character[i] = 49;
+ set[i] = 2;
+ } else {
+ if ((i != length - 1) && (set[i + 1] == 2)) {
+ character[i] = 49;
+ set[i] = 2;
+ } else {
+ set[i] = 1;
+ }
+ }
+ done = 1;
+ }
+
+ if ((character[i] == 47) && (done == 0)) {
+ /* Slash */
+ if (set[i - 1] == 2) {
+ character[i] = 50;
+ set[i] = 2;
+ } else {
+ if ((i != length - 1) && (set[i + 1] == 2)) {
+ character[i] = 50;
+ set[i] = 2;
+ } else {
+ set[i] = 1;
+ }
+ }
+ done = 1;
+ }
+
+ if ((character[i] == 58) && (done == 0)) {
+ /* Colon */
+ if (set[i - 1] == 2) {
+ character[i] = 51;
+ set[i] = 2;
+ } else {
+ if ((i != length - 1) && (set[i + 1] == 2)) {
+ character[i] = 51;
+ set[i] = 2;
+ } else {
+ set[i] = 1;
+ }
+ }
+ done = 1;
+ }
+ }
+ }
+
+ for (i = length; i < 144; i++) {
+ /* Add the padding */
+ if (set[length - 1] == 2) {
+ set[i] = 2;
+ } else {
+ set[i] = 1;
+ }
+ character[i] = 33;
+ }
+
+ /* Find candidates for number compression */
+ if ((mode == 2) || (mode == 3)) {
+ j = 0;
+ } else {
+ j = 9;
+ }
+ /* Number compression not allowed in primary message */
+ count = 0;
+ for (i = j; i < 143; i++) {
+ if ((set[i] == 1) && ((character[i] >= 48) && (character[i] <= 57))) {
+ /* Character is a number */
+ count++;
+ } else {
+ count = 0;
+ }
+ if (count == 9) {
+ /* Nine digits in a row can be compressed */
+ set[i] = 6;
+ set[i - 1] = 6;
+ set[i - 2] = 6;
+ set[i - 3] = 6;
+ set[i - 4] = 6;
+ set[i - 5] = 6;
+ set[i - 6] = 6;
+ set[i - 7] = 6;
+ set[i - 8] = 6;
+ count = 0;
+ }
+ }
+
+ /* Add shift and latch characters */
+ current_set = 1;
+ i = 0;
+ do {
+
+ if ((set[i] != current_set) && (set[i] != 6)) {
+ switch (set[i]) {
+ case 1:
+ if (set[i + 1] == 1) {
+ if (set[i + 2] == 1) {
+ if (set[i + 3] == 1) {
+ /* Latch A */
+ maxi_bump(set, character, i);
+ character[i] = 63;
+ current_set = 1;
+ length++;
+ } else {
+ /* 3 Shift A */
+ maxi_bump(set, character, i);
+ character[i] = 57;
+ length++;
+ i += 2;
+ }
+ } else {
+ /* 2 Shift A */
+ maxi_bump(set, character, i);
+ character[i] = 56;
+ length++;
+ i++;
+ }
+ } else {
+ /* Shift A */
+ maxi_bump(set, character, i);
+ character[i] = 59;
+ length++;
+ }
+ break;
+ case 2:
+ if (set[i + 1] == 2) {
+ /* Latch B */
+ maxi_bump(set, character, i);
+ character[i] = 63;
+ current_set = 2;
+ length++;
+ } else {
+ /* Shift B */
+ maxi_bump(set, character, i);
+ character[i] = 59;
+ length++;
+ }
+ break;
+ case 3:
+ /* Shift C */
+ maxi_bump(set, character, i);
+ character[i] = 60;
+ length++;
+ break;
+ case 4:
+ /* Shift D */
+ maxi_bump(set, character, i);
+ character[i] = 61;
+ length++;
+ break;
+ case 5:
+ /* Shift E */
+ maxi_bump(set, character, i);
+ character[i] = 62;
+ length++;
+ break;
+ }
+ i++;
+ }
+ i++;
+ } while (i < 144);
+
+ /* Number compression has not been forgotten! - It's handled below */
+ i = 0;
+ do {
+ if (set[i] == 6) {
+ /* Number compression */
+ char substring[11];
+ int value;
+
+ for (j = 0; j < 9; j++) {
+ substring[j] = character[i + j];
+ }
+ substring[9] = '\0';
+ value = atoi(substring);
+
+ character[i] = 31; /* NS */
+ character[i + 1] = (value & 0x3f000000) >> 24;
+ character[i + 2] = (value & 0xfc0000) >> 18;
+ character[i + 3] = (value & 0x3f000) >> 12;
+ character[i + 4] = (value & 0xfc0) >> 6;
+ character[i + 5] = (value & 0x3f);
+
+ i += 6;
+ for (j = i; j < 140; j++) {
+ set[j] = set[j + 3];
+ character[j] = character[j + 3];
+ }
+ length -= 3;
+ } else {
+ i++;
+ }
+ } while (i <= 143);
+
+ /* Insert ECI at the beginning of message if needed */
+ /* Encode ECI assignment numbers according to table 3 */
+ if (eci != 3) {
+ maxi_bump(set, character, 0);
+ character[0] = 27; // ECI
+ if (eci <= 31) {
+ maxi_bump(set, character, 1);
+ character[1] = eci;
+ length += 2;
+ }
+ if ((eci >= 32) && (eci <= 1023)) {
+ maxi_bump(set, character, 1);
+ maxi_bump(set, character, 1);
+ character[1] = 0x20 + ((eci >> 6) & 0x0F);
+ character[2] = eci & 0x3F;
+ length += 3;
+ }
+ if ((eci >= 1024) && (eci <= 32767)) {
+ maxi_bump(set, character, 1);
+ maxi_bump(set, character, 1);
+ maxi_bump(set, character, 1);
+ character[1] = 0x30 + ((eci >> 12) & 0x03);
+ character[2] = (eci >> 6) & 0x3F;
+ character[3] = eci & 0x3F;
+ length += 4;
+ }
+ if (eci >= 32768) {
+ maxi_bump(set, character, 1);
+ maxi_bump(set, character, 1);
+ maxi_bump(set, character, 1);
+ maxi_bump(set, character, 1);
+ character[1] = 0x38 + ((eci >> 18) & 0x02);
+ character[2] = (eci >> 12) & 0x3F;
+ character[3] = (eci >> 6) & 0x3F;
+ character[4] = eci & 0x3F;
+ length += 5;
+ }
+ }
+
+ if (((mode == 2) || (mode == 3)) && (length > 84)) {
+ return ZINT_ERROR_TOO_LONG;
+ }
+
+ if (((mode == 4) || (mode == 6)) && (length > 93)) {
+ return ZINT_ERROR_TOO_LONG;
+ }
+
+ if ((mode == 5) && (length > 77)) {
+ return ZINT_ERROR_TOO_LONG;
+ }
+
+
+ /* Copy the encoded text into the codeword array */
+ if ((mode == 2) || (mode == 3)) {
+ for (i = 0; i < 84; i++) { /* secondary only */
+ maxi_codeword[i + 20] = character[i];
+ }
+ }
+
+ if ((mode == 4) || (mode == 6)) {
+ for (i = 0; i < 9; i++) { /* primary */
+ maxi_codeword[i + 1] = character[i];
+ }
+ for (i = 0; i < 84; i++) { /* secondary */
+ maxi_codeword[i + 20] = character[i + 9];
+ }
+ }
+
+ if (mode == 5) {
+ for (i = 0; i < 9; i++) { /* primary */
+ maxi_codeword[i + 1] = character[i];
+ }
+ for (i = 0; i < 68; i++) { /* secondary */
+ maxi_codeword[i + 20] = character[i + 9];
+ }
+ }
+
+ return 0;
+}
+
+/* Format structured primary for Mode 2 */
+void maxi_do_primary_2(char postcode[], int country, int service) {
+ size_t postcode_length;
+ int postcode_num, i;
+
+ for (i = 0; i < 10; i++) {
+ if ((postcode[i] < '0') || (postcode[i] > '9')) {
+ postcode[i] = '\0';
+ }
+ }
+
+ postcode_length = strlen(postcode);
+ postcode_num = atoi(postcode);
+
+ maxi_codeword[0] = ((postcode_num & 0x03) << 4) | 2;
+ maxi_codeword[1] = ((postcode_num & 0xfc) >> 2);
+ maxi_codeword[2] = ((postcode_num & 0x3f00) >> 8);
+ maxi_codeword[3] = ((postcode_num & 0xfc000) >> 14);
+ maxi_codeword[4] = ((postcode_num & 0x3f00000) >> 20);
+ maxi_codeword[5] = ((postcode_num & 0x3c000000) >> 26) | ((postcode_length & 0x3) << 4);
+ maxi_codeword[6] = ((postcode_length & 0x3c) >> 2) | ((country & 0x3) << 4);
+ maxi_codeword[7] = (country & 0xfc) >> 2;
+ maxi_codeword[8] = ((country & 0x300) >> 8) | ((service & 0xf) << 2);
+ maxi_codeword[9] = ((service & 0x3f0) >> 4);
+}
+
+/* Format structured primary for Mode 3 */
+void maxi_do_primary_3(char postcode[], int country, int service) {
+ int i, h;
+
+ h = strlen(postcode);
+ to_upper((unsigned char*) postcode);
+ for (i = 0; i < h; i++) {
+ if ((postcode[i] >= 'A') && (postcode[i] <= 'Z')) {
+ /* (Capital) letters shifted to Code Set A values */
+ postcode[i] -= 64;
+ }
+ if (((postcode[i] == 27) || (postcode[i] == 31)) || ((postcode[i] == 33) || (postcode[i] >= 59))) {
+ /* Not a valid postcode character */
+ postcode[i] = ' ';
+ }
+ /* Input characters lower than 27 (NUL - SUB) in postcode are
+ interpreted as capital letters in Code Set A (e.g. LF becomes 'J') */
+ }
+
+ maxi_codeword[0] = ((postcode[5] & 0x03) << 4) | 3;
+ maxi_codeword[1] = ((postcode[4] & 0x03) << 4) | ((postcode[5] & 0x3c) >> 2);
+ maxi_codeword[2] = ((postcode[3] & 0x03) << 4) | ((postcode[4] & 0x3c) >> 2);
+ maxi_codeword[3] = ((postcode[2] & 0x03) << 4) | ((postcode[3] & 0x3c) >> 2);
+ maxi_codeword[4] = ((postcode[1] & 0x03) << 4) | ((postcode[2] & 0x3c) >> 2);
+ maxi_codeword[5] = ((postcode[0] & 0x03) << 4) | ((postcode[1] & 0x3c) >> 2);
+ maxi_codeword[6] = ((postcode[0] & 0x3c) >> 2) | ((country & 0x3) << 4);
+ maxi_codeword[7] = (country & 0xfc) >> 2;
+ maxi_codeword[8] = ((country & 0x300) >> 8) | ((service & 0xf) << 2);
+ maxi_codeword[9] = ((service & 0x3f0) >> 4);
+}
+
+int maxicode(struct zint_symbol *symbol, unsigned char local_source[], int length) {
+ int i, j, block, bit, mode, countrycode = 0, service = 0, lp = 0;
+ int bit_pattern[7], internal_error = 0, eclen;
+ char postcode[12], countrystr[4], servicestr[4];
+
+ mode = symbol->option_1;
+ strcpy(postcode, "");
+ strcpy(countrystr, "");
+ strcpy(servicestr, "");
+
+ memset(maxi_codeword, 0, sizeof (maxi_codeword));
+
+ if (mode == -1) { /* If mode is unspecified */
+ lp = strlen(symbol->primary);
+ if (lp == 0) {
+ mode = 4;
+ } else {
+ mode = 2;
+ for (i = 0; i < 10 && i < lp; i++) {
+ if ((symbol->primary[i] < 48) || (symbol->primary[i] > 57)) {
+ mode = 3;
+ break;
+ }
+ }
+ }
+ }
+
+ if ((mode < 2) || (mode > 6)) { /* Only codes 2 to 6 supported */
+ strcpy(symbol->errtxt, "550: Invalid Maxicode Mode");
+ return ZINT_ERROR_INVALID_OPTION;
+ }
+
+ if ((mode == 2) || (mode == 3)) { /* Modes 2 and 3 need data in symbol->primary */
+ if (lp == 0) { /* Mode set manually means lp doesn't get set */
+ lp = strlen(symbol->primary);
+ }
+ if (lp != 15) {
+ strcpy(symbol->errtxt, "551: Invalid Primary String");
+ return ZINT_ERROR_INVALID_DATA;
+ }
+
+ for (i = 9; i < 15; i++) { /* check that country code and service are numeric */
+ if ((symbol->primary[i] < '0') || (symbol->primary[i] > '9')) {
+ strcpy(symbol->errtxt, "552: Invalid Primary String");
+ return ZINT_ERROR_INVALID_DATA;
+ }
+ }
+
+ memcpy(postcode, symbol->primary, 9);
+ postcode[9] = '\0';
+
+ if (mode == 2) {
+ for (i = 0; i < 10; i++) {
+ if (postcode[i] == ' ') {
+ postcode[i] = '\0';
+ }
+ }
+ } else if (mode == 3) {
+ postcode[6] = '\0';
+ }
+
+ countrystr[0] = symbol->primary[9];
+ countrystr[1] = symbol->primary[10];
+ countrystr[2] = symbol->primary[11];
+ countrystr[3] = '\0';
+
+ servicestr[0] = symbol->primary[12];
+ servicestr[1] = symbol->primary[13];
+ servicestr[2] = symbol->primary[14];
+ servicestr[3] = '\0';
+
+ countrycode = atoi(countrystr);
+ service = atoi(servicestr);
+
+ if (mode == 2) {
+ maxi_do_primary_2(postcode, countrycode, service);
+ }
+ if (mode == 3) {
+ maxi_do_primary_3(postcode, countrycode, service);
+ }
+ } else {
+ maxi_codeword[0] = mode;
+ }
+
+ i = maxi_text_process(mode, local_source, length, symbol->eci);
+ if (i == ZINT_ERROR_TOO_LONG) {
+ strcpy(symbol->errtxt, "553: Input data too long");
+ return i;
+ }
+
+ /* All the data is sorted - now do error correction */
+ maxi_do_primary_check(); /* always EEC */
+
+ if (mode == 5)
+ eclen = 56; // 68 data codewords , 56 error corrections
+ else
+ eclen = 40; // 84 data codewords, 40 error corrections
+
+ maxi_do_secondary_chk_even(eclen / 2); // do error correction of even
+ maxi_do_secondary_chk_odd(eclen / 2); // do error correction of odd
+
+ /* Copy data into symbol grid */
+ for (i = 0; i < 33; i++) {
+ for (j = 0; j < 30; j++) {
+ block = (MaxiGrid[(i * 30) + j] + 5) / 6;
+ bit = (MaxiGrid[(i * 30) + j] + 5) % 6;
+
+ if (block != 0) {
+
+ bit_pattern[0] = (maxi_codeword[block - 1] & 0x20) >> 5;
+ bit_pattern[1] = (maxi_codeword[block - 1] & 0x10) >> 4;
+ bit_pattern[2] = (maxi_codeword[block - 1] & 0x8) >> 3;
+ bit_pattern[3] = (maxi_codeword[block - 1] & 0x4) >> 2;
+ bit_pattern[4] = (maxi_codeword[block - 1] & 0x2) >> 1;
+ bit_pattern[5] = (maxi_codeword[block - 1] & 0x1);
+
+ if (bit_pattern[bit] != 0) {
+ set_module(symbol, i, j);
+ }
+ }
+ }
+ }
+
+ /* Add orientation markings */
+ set_module(symbol, 0, 28); // Top right filler
+ set_module(symbol, 0, 29);
+ set_module(symbol, 9, 10); // Top left marker
+ set_module(symbol, 9, 11);
+ set_module(symbol, 10, 11);
+ set_module(symbol, 15, 7); // Left hand marker
+ set_module(symbol, 16, 8);
+ set_module(symbol, 16, 20); // Right hand marker
+ set_module(symbol, 17, 20);
+ set_module(symbol, 22, 10); // Bottom left marker
+ set_module(symbol, 23, 10);
+ set_module(symbol, 22, 17); // Bottom right marker
+ set_module(symbol, 23, 17);
+
+ symbol->width = 30;
+ symbol->rows = 33;
+
+ return internal_error;
+}
diff --git a/3rdparty/zint-2.6.1/backend/maxicode.h b/3rdparty/zint-2.6.1/backend/maxicode.h
new file mode 100644
index 0000000..2d22459
--- /dev/null
+++ b/3rdparty/zint-2.6.1/backend/maxicode.h
@@ -0,0 +1,104 @@
+/* maxicode.h - Handles Maxicode */
+
+/*
+ libzint - the open source barcode library
+ Copyright (C) 2008-2017 Robin Stuart
+
+ Redistribution and use in source and binary forms, with or without
+ modification, are permitted provided that the following conditions
+ are met:
+
+ 1. Redistributions of source code must retain the above copyright
+ notice, this list of conditions and the following disclaimer.
+ 2. Redistributions in binary form must reproduce the above copyright
+ notice, this list of conditions and the following disclaimer in the
+ documentation and/or other materials provided with the distribution.
+ 3. Neither the name of the project nor the names of its contributors
+ may be used to endorse or promote products derived from this software
+ without specific prior written permission.
+
+ THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND
+ ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+ ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE
+ FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+ DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
+ OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
+ HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
+ LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
+ OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+ SUCH DAMAGE.
+ */
+
+static const unsigned short int MaxiGrid[] = {
+ /* ISO/IEC 16023 Figure 5 - MaxiCode Module Sequence */ /* 30 x 33 data grid */
+ 122, 121, 128, 127, 134, 133, 140, 139, 146, 145, 152, 151, 158, 157, 164, 163, 170, 169, 176, 175, 182, 181, 188, 187, 194, 193, 200, 199, 0, 0,
+ 124, 123, 130, 129, 136, 135, 142, 141, 148, 147, 154, 153, 160, 159, 166, 165, 172, 171, 178, 177, 184, 183, 190, 189, 196, 195, 202, 201, 817, 0,
+ 126, 125, 132, 131, 138, 137, 144, 143, 150, 149, 156, 155, 162, 161, 168, 167, 174, 173, 180, 179, 186, 185, 192, 191, 198, 197, 204, 203, 819, 818,
+ 284, 283, 278, 277, 272, 271, 266, 265, 260, 259, 254, 253, 248, 247, 242, 241, 236, 235, 230, 229, 224, 223, 218, 217, 212, 211, 206, 205, 820, 0,
+ 286, 285, 280, 279, 274, 273, 268, 267, 262, 261, 256, 255, 250, 249, 244, 243, 238, 237, 232, 231, 226, 225, 220, 219, 214, 213, 208, 207, 822, 821,
+ 288, 287, 282, 281, 276, 275, 270, 269, 264, 263, 258, 257, 252, 251, 246, 245, 240, 239, 234, 233, 228, 227, 222, 221, 216, 215, 210, 209, 823, 0,
+ 290, 289, 296, 295, 302, 301, 308, 307, 314, 313, 320, 319, 326, 325, 332, 331, 338, 337, 344, 343, 350, 349, 356, 355, 362, 361, 368, 367, 825, 824,
+ 292, 291, 298, 297, 304, 303, 310, 309, 316, 315, 322, 321, 328, 327, 334, 333, 340, 339, 346, 345, 352, 351, 358, 357, 364, 363, 370, 369, 826, 0,
+ 294, 293, 300, 299, 306, 305, 312, 311, 318, 317, 324, 323, 330, 329, 336, 335, 342, 341, 348, 347, 354, 353, 360, 359, 366, 365, 372, 371, 828, 827,
+ 410, 409, 404, 403, 398, 397, 392, 391, 80, 79, 0, 0, 14, 13, 38, 37, 3, 0, 45, 44, 110, 109, 386, 385, 380, 379, 374, 373, 829, 0,
+ 412, 411, 406, 405, 400, 399, 394, 393, 82, 81, 41, 0, 16, 15, 40, 39, 4, 0, 0, 46, 112, 111, 388, 387, 382, 381, 376, 375, 831, 830,
+ 414, 413, 408, 407, 402, 401, 396, 395, 84, 83, 42, 0, 0, 0, 0, 0, 6, 5, 48, 47, 114, 113, 390, 389, 384, 383, 378, 377, 832, 0,
+ 416, 415, 422, 421, 428, 427, 104, 103, 56, 55, 17, 0, 0, 0, 0, 0, 0, 0, 21, 20, 86, 85, 434, 433, 440, 439, 446, 445, 834, 833,
+ 418, 417, 424, 423, 430, 429, 106, 105, 58, 57, 0, 0, 0, 0, 0, 0, 0, 0, 23, 22, 88, 87, 436, 435, 442, 441, 448, 447, 835, 0,
+ 420, 419, 426, 425, 432, 431, 108, 107, 60, 59, 0, 0, 0, 0, 0, 0, 0, 0, 0, 24, 90, 89, 438, 437, 444, 443, 450, 449, 837, 836,
+ 482, 481, 476, 475, 470, 469, 49, 0, 31, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 54, 53, 464, 463, 458, 457, 452, 451, 838, 0,
+ 484, 483, 478, 477, 472, 471, 50, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 466, 465, 460, 459, 454, 453, 840, 839,
+ 486, 485, 480, 479, 474, 473, 52, 51, 32, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2, 0, 43, 468, 467, 462, 461, 456, 455, 841, 0,
+ 488, 487, 494, 493, 500, 499, 98, 97, 62, 61, 0, 0, 0, 0, 0, 0, 0, 0, 0, 27, 92, 91, 506, 505, 512, 511, 518, 517, 843, 842,
+ 490, 489, 496, 495, 502, 501, 100, 99, 64, 63, 0, 0, 0, 0, 0, 0, 0, 0, 29, 28, 94, 93, 508, 507, 514, 513, 520, 519, 844, 0,
+ 492, 491, 498, 497, 504, 503, 102, 101, 66, 65, 18, 0, 0, 0, 0, 0, 0, 0, 19, 30, 96, 95, 510, 509, 516, 515, 522, 521, 846, 845,
+ 560, 559, 554, 553, 548, 547, 542, 541, 74, 73, 33, 0, 0, 0, 0, 0, 0, 11, 68, 67, 116, 115, 536, 535, 530, 529, 524, 523, 847, 0,
+ 562, 561, 556, 555, 550, 549, 544, 543, 76, 75, 0, 0, 8, 7, 36, 35, 12, 0, 70, 69, 118, 117, 538, 537, 532, 531, 526, 525, 849, 848,
+ 564, 563, 558, 557, 552, 551, 546, 545, 78, 77, 0, 34, 10, 9, 26, 25, 0, 0, 72, 71, 120, 119, 540, 539, 534, 533, 528, 527, 850, 0,
+ 566, 565, 572, 571, 578, 577, 584, 583, 590, 589, 596, 595, 602, 601, 608, 607, 614, 613, 620, 619, 626, 625, 632, 631, 638, 637, 644, 643, 852, 851,
+ 568, 567, 574, 573, 580, 579, 586, 585, 592, 591, 598, 597, 604, 603, 610, 609, 616, 615, 622, 621, 628, 627, 634, 633, 640, 639, 646, 645, 853, 0,
+ 570, 569, 576, 575, 582, 581, 588, 587, 594, 593, 600, 599, 606, 605, 612, 611, 618, 617, 624, 623, 630, 629, 636, 635, 642, 641, 648, 647, 855, 854,
+ 728, 727, 722, 721, 716, 715, 710, 709, 704, 703, 698, 697, 692, 691, 686, 685, 680, 679, 674, 673, 668, 667, 662, 661, 656, 655, 650, 649, 856, 0,
+ 730, 729, 724, 723, 718, 717, 712, 711, 706, 705, 700, 699, 694, 693, 688, 687, 682, 681, 676, 675, 670, 669, 664, 663, 658, 657, 652, 651, 858, 857,
+ 732, 731, 726, 725, 720, 719, 714, 713, 708, 707, 702, 701, 696, 695, 690, 689, 684, 683, 678, 677, 672, 671, 666, 665, 660, 659, 654, 653, 859, 0,
+ 734, 733, 740, 739, 746, 745, 752, 751, 758, 757, 764, 763, 770, 769, 776, 775, 782, 781, 788, 787, 794, 793, 800, 799, 806, 805, 812, 811, 861, 860,
+ 736, 735, 742, 741, 748, 747, 754, 753, 760, 759, 766, 765, 772, 771, 778, 777, 784, 783, 790, 789, 796, 795, 802, 801, 808, 807, 814, 813, 862, 0,
+ 738, 737, 744, 743, 750, 749, 756, 755, 762, 761, 768, 767, 774, 773, 780, 779, 786, 785, 792, 791, 798, 797, 804, 803, 810, 809, 816, 815, 864, 863
+};
+
+static const char maxiCodeSet[256] = {
+ /* from Appendix A - ASCII character to Code Set (e.g. 2 = Set B) */
+ /* set 0 refers to special characters that fit into more than one set (e.g. GS) */
+ 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 0, 5, 5, 5, 5, 5, 5,
+ 5, 5, 5, 5, 5, 5, 5, 5, 0, 0, 0, 5, 0, 2, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 0, 1, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 2,
+ 2, 2, 2, 2, 2, 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, 2, 2, 2, 2, 2, 2, 2, 2, 2,
+ 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
+ 2, 2, 2, 2, 2, 2, 2, 2, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 4, 4,
+ 4, 4, 4, 4, 4, 4, 4, 4, 4, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5,
+ 5, 4, 5, 5, 5, 5, 5, 5, 4, 5, 3, 4, 3, 5, 5, 4, 4, 3, 3, 3,
+ 4, 3, 5, 4, 4, 3, 3, 4, 3, 3, 3, 4, 3, 3, 3, 3, 3, 3, 3, 3,
+ 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3,
+ 3, 3, 3, 3, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,
+ 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4
+};
+
+static const char maxiSymbolChar[256] = {
+ /* from Appendix A - ASCII character to symbol value */
+ 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19,
+ 20, 21, 22, 23, 24, 25, 26, 30, 28, 29, 30, 35, 32, 53, 34, 35, 36, 37, 38, 39,
+ 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 58, 37,
+ 38, 39, 40, 41, 52, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15,
+ 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 42, 43, 44, 45, 46, 0, 1, 2, 3,
+ 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23,
+ 24, 25, 26, 32, 54, 34, 35, 36, 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 47, 48,
+ 49, 50, 51, 52, 53, 54, 55, 56, 57, 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 36,
+ 37, 37, 38, 39, 40, 41, 42, 43, 38, 44, 37, 39, 38, 45, 46, 40, 41, 39, 40, 41,
+ 42, 42, 47, 43, 44, 43, 44, 45, 45, 46, 47, 46, 0, 1, 2, 3, 4, 5, 6, 7,
+ 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 32,
+ 33, 34, 35, 36, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15,
+ 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 32, 33, 34, 35, 36
+};
+
diff --git a/3rdparty/zint-2.6.1/backend/medical.c b/3rdparty/zint-2.6.1/backend/medical.c
new file mode 100644
index 0000000..94bd72a
--- /dev/null
+++ b/3rdparty/zint-2.6.1/backend/medical.c
@@ -0,0 +1,306 @@
+/* medical.c - Handles 1 track and 2 track pharmacode and Codabar */
+
+/*
+ libzint - the open source barcode library
+ Copyright (C) 2008-2017 Robin Stuart
+
+ Redistribution and use in source and binary forms, with or without
+ modification, are permitted provided that the following conditions
+ are met:
+
+ 1. Redistributions of source code must retain the above copyright
+ notice, this list of conditions and the following disclaimer.
+ 2. Redistributions in binary form must reproduce the above copyright
+ notice, this list of conditions and the following disclaimer in the
+ documentation and/or other materials provided with the distribution.
+ 3. Neither the name of the project nor the names of its contributors
+ may be used to endorse or promote products derived from this software
+ without specific prior written permission.
+
+ THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND
+ ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+ ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE
+ FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+ DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
+ OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
+ HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
+ LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
+ OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+ SUCH DAMAGE.
+ */
+
+#include
+#include
+#include
+#include "common.h"
+
+extern int c39(struct zint_symbol *symbol, unsigned char source[], const size_t length);
+/* Codabar table checked against EN 798:1995 */
+
+#define CALCIUM "0123456789-$:/.+ABCD"
+
+static const char *CodaTable[20] = {
+ "11111221", "11112211", "11121121", "22111111", "11211211", "21111211",
+ "12111121", "12112111", "12211111", "21121111", "11122111", "11221111", "21112121", "21211121",
+ "21212111", "11212121", "11221211", "12121121", "11121221", "11122211"
+};
+
+int pharma_one(struct zint_symbol *symbol, unsigned char source[], int length) {
+ /* "Pharmacode can represent only a single integer from 3 to 131070. Unlike other
+ commonly used one-dimensional barcode schemes, pharmacode does not store the data in a
+ form corresponding to the human-readable digits; the number is encoded in binary, rather
+ than decimal. Pharmacode is read from right to left: with n as the bar position starting
+ at 0 on the right, each narrow bar adds 2n to the value and each wide bar adds 2(2^n).
+ The minimum barcode is 2 bars and the maximum 16, so the smallest number that could
+ be encoded is 3 (2 narrow bars) and the biggest is 131070 (16 wide bars)."
+ - http://en.wikipedia.org/wiki/Pharmacode */
+
+ /* This code uses the One Track Pharamacode calculating algorithm as recommended by
+ the specification at http://www.laetus.com/laetus.php?request=file&id=69 */
+
+ unsigned long int tester;
+ int counter, error_number, h;
+ char inter[18] = {0}; /* 131070 -> 17 bits */
+ char dest[64]; /* 17 * 2 + 1 */
+
+ if (length > 6) {
+ strcpy(symbol->errtxt, "350: Input too long");
+ return ZINT_ERROR_TOO_LONG;
+ }
+ error_number = is_sane(NEON, source, length);
+ if (error_number == ZINT_ERROR_INVALID_DATA) {
+ strcpy(symbol->errtxt, "351: Invalid characters in data");
+ return error_number;
+ }
+
+ tester = atoi((char*) source);
+
+ if ((tester < 3) || (tester > 131070)) {
+ strcpy(symbol->errtxt, "352: Data out of range");
+ return ZINT_ERROR_INVALID_DATA;
+ }
+
+ do {
+ if (!(tester & 1)) {
+ strcat(inter, "W");
+ tester = (tester - 2) / 2;
+ } else {
+ strcat(inter, "N");
+ tester = (tester - 1) / 2;
+ }
+ } while (tester != 0);
+
+ h = strlen(inter) - 1;
+ *dest = '\0';
+ for (counter = h; counter >= 0; counter--) {
+ if (inter[counter] == 'W') {
+ strcat(dest, "32");
+ } else {
+ strcat(dest, "12");
+ }
+ }
+
+ expand(symbol, dest);
+
+ return error_number;
+}
+
+int pharma_two_calc(struct zint_symbol *symbol, unsigned char source[], char dest[]) {
+ /* This code uses the Two Track Pharamacode defined in the document at
+ http://www.laetus.com/laetus.php?request=file&id=69 and using a modified
+ algorithm from the One Track system. This standard accepts integet values
+ from 4 to 64570080. */
+
+ unsigned long int tester;
+ int counter, h;
+ char inter[17];
+ int error_number;
+
+ tester = atoi((char*) source);
+
+ if ((tester < 4) || (tester > 64570080)) {
+ strcpy(symbol->errtxt, "353: Data out of range");
+ return ZINT_ERROR_INVALID_DATA;
+ }
+ error_number = 0;
+ strcpy(inter, "");
+ do {
+ switch (tester % 3) {
+ case 0:
+ strcat(inter, "3");
+ tester = (tester - 3) / 3;
+ break;
+ case 1:
+ strcat(inter, "1");
+ tester = (tester - 1) / 3;
+ break;
+ case 2:
+ strcat(inter, "2");
+ tester = (tester - 2) / 3;
+ break;
+ }
+ } while (tester != 0);
+
+ h = strlen(inter) - 1;
+ for (counter = h; counter >= 0; counter--) {
+ dest[h - counter] = inter[counter];
+ }
+ dest[h + 1] = '\0';
+
+ return error_number;
+}
+
+int pharma_two(struct zint_symbol *symbol, unsigned char source[], int length) {
+ /* Draws the patterns for two track pharmacode */
+ char height_pattern[200];
+ unsigned int loopey, h;
+ int writer;
+ int error_number = 0;
+ strcpy(height_pattern, "");
+
+ if (length > 8) {
+ strcpy(symbol->errtxt, "354: Input too long");
+ return ZINT_ERROR_TOO_LONG;
+ }
+ error_number = is_sane(NEON, source, length);
+ if (error_number == ZINT_ERROR_INVALID_DATA) {
+ strcpy(symbol->errtxt, "355: Invalid characters in data");
+ return error_number;
+ }
+ error_number = pharma_two_calc(symbol, source, height_pattern);
+ if (error_number != 0) {
+ return error_number;
+ }
+
+ writer = 0;
+ h = strlen(height_pattern);
+ for (loopey = 0; loopey < h; loopey++) {
+ if ((height_pattern[loopey] == '2') || (height_pattern[loopey] == '3')) {
+ set_module(symbol, 0, writer);
+ }
+ if ((height_pattern[loopey] == '1') || (height_pattern[loopey] == '3')) {
+ set_module(symbol, 1, writer);
+ }
+ writer += 2;
+ }
+ symbol->rows = 2;
+ symbol->width = writer - 1;
+
+
+ return error_number;
+}
+
+/* The Codabar system consisting of simple substitution */
+int codabar(struct zint_symbol *symbol, unsigned char source[], int length) {
+
+ int i, error_number;
+ char dest[512];
+
+ strcpy(dest, "");
+
+ if (length > 60) { /* No stack smashing please */
+ strcpy(symbol->errtxt, "356: Input too long");
+ return ZINT_ERROR_TOO_LONG;
+ }
+ to_upper(source);
+ error_number = is_sane(CALCIUM, source, length);
+ if (error_number == ZINT_ERROR_INVALID_DATA) {
+ strcpy(symbol->errtxt, "357: Invalid characters in data");
+ return error_number;
+ }
+ /* Codabar must begin and end with the characters A, B, C or D */
+ if ((source[0] != 'A') && (source[0] != 'B') && (source[0] != 'C')
+ && (source[0] != 'D')) {
+ strcpy(symbol->errtxt, "358: Invalid characters in data");
+ return ZINT_ERROR_INVALID_DATA;
+ }
+
+ if ((source[length - 1] != 'A') && (source[length - 1] != 'B') &&
+ (source[length - 1] != 'C') && (source[length - 1] != 'D')) {
+ strcpy(symbol->errtxt, "359: Invalid characters in data");
+ return ZINT_ERROR_INVALID_DATA;
+ }
+
+ for (i = 0; i < length; i++) {
+ lookup(CALCIUM, CodaTable, source[i], dest);
+ }
+
+ expand(symbol, dest);
+ ustrcpy(symbol->text, source);
+ return error_number;
+}
+
+/* Italian Pharmacode */
+int code32(struct zint_symbol *symbol, unsigned char source[], int length) {
+ int i, zeroes, error_number, checksum, checkpart, checkdigit;
+ char localstr[10], risultante[7];
+ long int pharmacode, remainder, devisor;
+ int codeword[6];
+ char tabella[34];
+
+ /* Validate the input */
+ if (length > 8) {
+ strcpy(symbol->errtxt, "360: Input too long");
+ return ZINT_ERROR_TOO_LONG;
+ }
+ error_number = is_sane(NEON, source, length);
+ if (error_number == ZINT_ERROR_INVALID_DATA) {
+ strcpy(symbol->errtxt, "361: Invalid characters in data");
+ return error_number;
+ }
+
+ /* Add leading zeros as required */
+ zeroes = 8 - length;
+ memset(localstr, '0', zeroes);
+ strcpy(localstr + zeroes, (char*) source);
+
+ /* Calculate the check digit */
+ checksum = 0;
+ checkpart = 0;
+ for (i = 0; i < 4; i++) {
+ checkpart = ctoi(localstr[i * 2]);
+ checksum += checkpart;
+ checkpart = 2 * (ctoi(localstr[(i * 2) + 1]));
+ if (checkpart >= 10) {
+ checksum += (checkpart - 10) + 1;
+ } else {
+ checksum += checkpart;
+ }
+ }
+
+ /* Add check digit to data string */
+ checkdigit = checksum % 10;
+ localstr[8] = itoc(checkdigit);
+ localstr[9] = '\0';
+
+ /* Convert string into an integer value */
+ pharmacode = atoi(localstr);
+
+ /* Convert from decimal to base-32 */
+ devisor = 33554432;
+ for (i = 5; i >= 0; i--) {
+ codeword[i] = pharmacode / devisor;
+ remainder = pharmacode % devisor;
+ pharmacode = remainder;
+ devisor /= 32;
+ }
+
+ /* Look up values in 'Tabella di conversione' */
+ strcpy(tabella, "0123456789BCDFGHJKLMNPQRSTUVWXYZ");
+ for (i = 5; i >= 0; i--) {
+ risultante[5 - i] = tabella[codeword[i]];
+ }
+ risultante[6] = '\0';
+ /* Plot the barcode using Code 39 */
+ error_number = c39(symbol, (unsigned char*) risultante, strlen(risultante));
+ if (error_number != 0) {
+ return error_number;
+ }
+
+ /* Override the normal text output with the Pharmacode number */
+ strcpy((char*) symbol->text, "A");
+ strcat((char*) symbol->text, (char*) localstr);
+
+ return error_number;
+}
diff --git a/3rdparty/zint-2.6.1/backend/ms_stdint.h b/3rdparty/zint-2.6.1/backend/ms_stdint.h
new file mode 100644
index 0000000..76987ab
--- /dev/null
+++ b/3rdparty/zint-2.6.1/backend/ms_stdint.h
@@ -0,0 +1,234 @@
+// ISO C9x compliant stdint.h for Microsoft Visual Studio
+// Based on ISO/IEC 9899:TC2 Committee draft (May 6, 2005) WG14/N1124
+//
+// Copyright (c) 2006-2008 Alexander Chemeris
+//
+// Redistribution and use in source and binary forms, with or without
+// modification, are permitted provided that the following conditions are met:
+//
+// 1. Redistributions of source code must retain the above copyright notice,
+// this list of conditions and the following disclaimer.
+//
+// 2. Redistributions in binary form must reproduce the above copyright
+// notice, this list of conditions and the following disclaimer in the
+// documentation and/or other materials provided with the distribution.
+//
+// 3. The name of the author may be used to endorse or promote products
+// derived from this software without specific prior written permission.
+//
+// THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR IMPLIED
+// WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
+// MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO
+// EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
+// PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS;
+// OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
+// WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR
+// OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF
+// ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+//
+///////////////////////////////////////////////////////////////////////////////
+
+/* @(#) $Id: ms_stdint.h,v 1.1 2009/09/19 08:16:21 hooper114 Exp $ */
+
+#ifndef _MSC_VER // [
+#error "Use this header only with Microsoft Visual C++ compilers!"
+#endif // _MSC_VER ]
+
+#ifndef _MSC_STDINT_H_ // [
+#define _MSC_STDINT_H_
+
+#if _MSC_VER > 1000
+#pragma once
+#endif
+
+#include
+
+// For Visual Studio 6 in C++ mode wrap include with 'extern "C++" {}'
+// or compiler give many errors like this:
+// error C2733: second C linkage of overloaded function 'wmemchr' not allowed
+#if (_MSC_VER < 1300) && defined(__cplusplus)
+ extern "C++" {
+#endif
+# include
+#if (_MSC_VER < 1300) && defined(__cplusplus)
+ }
+#endif
+
+// Define _W64 macros to mark types changing their size, like intptr_t.
+#ifndef _W64
+# if !defined(__midl) && (defined(_X86_) || defined(_M_IX86)) && _MSC_VER >= 1300
+# define _W64 __w64
+# else
+# define _W64
+# endif
+#endif
+
+
+// 7.18.1 Integer types
+
+// 7.18.1.1 Exact-width integer types
+typedef __int8 int8_t;
+typedef __int16 int16_t;
+typedef __int32 int32_t;
+typedef __int64 int64_t;
+typedef unsigned __int8 uint8_t;
+typedef unsigned __int16 uint16_t;
+typedef unsigned __int32 uint32_t;
+typedef unsigned __int64 uint64_t;
+
+// 7.18.1.2 Minimum-width integer types
+typedef int8_t int_least8_t;
+typedef int16_t int_least16_t;
+typedef int32_t int_least32_t;
+typedef int64_t int_least64_t;
+typedef uint8_t uint_least8_t;
+typedef uint16_t uint_least16_t;
+typedef uint32_t uint_least32_t;
+typedef uint64_t uint_least64_t;
+
+// 7.18.1.3 Fastest minimum-width integer types
+typedef int8_t int_fast8_t;
+typedef int16_t int_fast16_t;
+typedef int32_t int_fast32_t;
+typedef int64_t int_fast64_t;
+typedef uint8_t uint_fast8_t;
+typedef uint16_t uint_fast16_t;
+typedef uint32_t uint_fast32_t;
+typedef uint64_t uint_fast64_t;
+
+// 7.18.1.4 Integer types capable of holding object pointers
+#ifdef _WIN64 // [
+ typedef __int64 intptr_t;
+ typedef unsigned __int64 uintptr_t;
+#else // _WIN64 ][
+ typedef _W64 int intptr_t;
+ typedef _W64 unsigned int uintptr_t;
+#endif // _WIN64 ]
+
+// 7.18.1.5 Greatest-width integer types
+typedef int64_t intmax_t;
+typedef uint64_t uintmax_t;
+
+
+// 7.18.2 Limits of specified-width integer types
+
+#if !defined(__cplusplus) || defined(__STDC_LIMIT_MACROS) // [ See footnote 220 at page 257 and footnote 221 at page 259
+
+// 7.18.2.1 Limits of exact-width integer types
+#define INT8_MIN ((int8_t)_I8_MIN)
+#define INT8_MAX _I8_MAX
+#define INT16_MIN ((int16_t)_I16_MIN)
+#define INT16_MAX _I16_MAX
+#define INT32_MIN ((int32_t)_I32_MIN)
+#define INT32_MAX _I32_MAX
+#define INT64_MIN ((int64_t)_I64_MIN)
+#define INT64_MAX _I64_MAX
+#define UINT8_MAX _UI8_MAX
+#define UINT16_MAX _UI16_MAX
+#define UINT32_MAX _UI32_MAX
+#define UINT64_MAX _UI64_MAX
+
+// 7.18.2.2 Limits of minimum-width integer types
+#define INT_LEAST8_MIN INT8_MIN
+#define INT_LEAST8_MAX INT8_MAX
+#define INT_LEAST16_MIN INT16_MIN
+#define INT_LEAST16_MAX INT16_MAX
+#define INT_LEAST32_MIN INT32_MIN
+#define INT_LEAST32_MAX INT32_MAX
+#define INT_LEAST64_MIN INT64_MIN
+#define INT_LEAST64_MAX INT64_MAX
+#define UINT_LEAST8_MAX UINT8_MAX
+#define UINT_LEAST16_MAX UINT16_MAX
+#define UINT_LEAST32_MAX UINT32_MAX
+#define UINT_LEAST64_MAX UINT64_MAX
+
+// 7.18.2.3 Limits of fastest minimum-width integer types
+#define INT_FAST8_MIN INT8_MIN
+#define INT_FAST8_MAX INT8_MAX
+#define INT_FAST16_MIN INT16_MIN
+#define INT_FAST16_MAX INT16_MAX
+#define INT_FAST32_MIN INT32_MIN
+#define INT_FAST32_MAX INT32_MAX
+#define INT_FAST64_MIN INT64_MIN
+#define INT_FAST64_MAX INT64_MAX
+#define UINT_FAST8_MAX UINT8_MAX
+#define UINT_FAST16_MAX UINT16_MAX
+#define UINT_FAST32_MAX UINT32_MAX
+#define UINT_FAST64_MAX UINT64_MAX
+
+// 7.18.2.4 Limits of integer types capable of holding object pointers
+#ifdef _WIN64 // [
+# define INTPTR_MIN INT64_MIN
+# define INTPTR_MAX INT64_MAX
+# define UINTPTR_MAX UINT64_MAX
+#else // _WIN64 ][
+# define INTPTR_MIN INT32_MIN
+# define INTPTR_MAX INT32_MAX
+# define UINTPTR_MAX UINT32_MAX
+#endif // _WIN64 ]
+
+// 7.18.2.5 Limits of greatest-width integer types
+#define INTMAX_MIN INT64_MIN
+#define INTMAX_MAX INT64_MAX
+#define UINTMAX_MAX UINT64_MAX
+
+// 7.18.3 Limits of other integer types
+
+#ifdef _WIN64 // [
+# define PTRDIFF_MIN _I64_MIN
+# define PTRDIFF_MAX _I64_MAX
+#else // _WIN64 ][
+# define PTRDIFF_MIN _I32_MIN
+# define PTRDIFF_MAX _I32_MAX
+#endif // _WIN64 ]
+
+#define SIG_ATOMIC_MIN INT_MIN
+#define SIG_ATOMIC_MAX INT_MAX
+
+#ifndef SIZE_MAX // [
+# ifdef _WIN64 // [
+# define SIZE_MAX _UI64_MAX
+# else // _WIN64 ][
+# define SIZE_MAX _UI32_MAX
+# endif // _WIN64 ]
+#endif // SIZE_MAX ]
+
+// WCHAR_MIN and WCHAR_MAX are also defined in
+#ifndef WCHAR_MIN // [
+# define WCHAR_MIN 0
+#endif // WCHAR_MIN ]
+#ifndef WCHAR_MAX // [
+# define WCHAR_MAX _UI16_MAX
+#endif // WCHAR_MAX ]
+
+#define WINT_MIN 0
+#define WINT_MAX _UI16_MAX
+
+#endif // __STDC_LIMIT_MACROS ]
+
+
+// 7.18.4 Limits of other integer types
+
+#if !defined(__cplusplus) || defined(__STDC_CONSTANT_MACROS) // [ See footnote 224 at page 260
+
+// 7.18.4.1 Macros for minimum-width integer constants
+
+#define INT8_C(val) val##i8
+#define INT16_C(val) val##i16
+#define INT32_C(val) val##i32
+#define INT64_C(val) val##i64
+
+#define UINT8_C(val) val##ui8
+#define UINT16_C(val) val##ui16
+#define UINT32_C(val) val##ui32
+#define UINT64_C(val) val##ui64
+
+// 7.18.4.2 Macros for greatest-width integer constants
+#define INTMAX_C INT64_C
+#define UINTMAX_C UINT64_C
+
+#endif // __STDC_CONSTANT_MACROS ]
+
+
+#endif // _MSC_STDINT_H_ ]
diff --git a/3rdparty/zint-2.6.1/backend/pcx.c b/3rdparty/zint-2.6.1/backend/pcx.c
new file mode 100644
index 0000000..0a77ffa
--- /dev/null
+++ b/3rdparty/zint-2.6.1/backend/pcx.c
@@ -0,0 +1,172 @@
+/* pcx.c - Handles output to ZSoft PCX file */
+
+/*
+ libzint - the open source barcode library
+ Copyright (C) 2009-2017 Robin Stuart
+
+ Redistribution and use in source and binary forms, with or without
+ modification, are permitted provided that the following conditions
+ are met:
+
+ 1. Redistributions of source code must retain the above copyright
+ notice, this list of conditions and the following disclaimer.
+ 2. Redistributions in binary form must reproduce the above copyright
+ notice, this list of conditions and the following disclaimer in the
+ documentation and/or other materials provided with the distribution.
+ 3. Neither the name of the project nor the names of its contributors
+ may be used to endorse or promote products derived from this software
+ without specific prior written permission.
+
+ THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND
+ ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+ ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE
+ FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+ DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
+ OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
+ HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
+ LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
+ OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+ SUCH DAMAGE.
+ */
+
+#include
+#include
+#include
+#include "common.h"
+#include "pcx.h" /* PCX header structure */
+#include
+#ifdef _MSC_VER
+#include
+#include
+#include
+#endif
+
+#define SSET "0123456789ABCDEF"
+
+int pcx_pixel_plot(struct zint_symbol *symbol, char *pixelbuf) {
+ int fgred, fggrn, fgblu, bgred, bggrn, bgblu;
+ int row, column, i, colour;
+ int run_count;
+ FILE *pcx_file;
+ pcx_header_t header;
+#ifdef _MSC_VER
+ unsigned char* rle_row;
+#endif
+
+#ifndef _MSC_VER
+ unsigned char rle_row[symbol->bitmap_width];
+#else
+ rle_row = (unsigned char *) _alloca((symbol->bitmap_width * 6) * sizeof (unsigned char));
+#endif /* _MSC_VER */
+
+ fgred = (16 * ctoi(symbol->fgcolour[0])) + ctoi(symbol->fgcolour[1]);
+ fggrn = (16 * ctoi(symbol->fgcolour[2])) + ctoi(symbol->fgcolour[3]);
+ fgblu = (16 * ctoi(symbol->fgcolour[4])) + ctoi(symbol->fgcolour[5]);
+ bgred = (16 * ctoi(symbol->bgcolour[0])) + ctoi(symbol->bgcolour[1]);
+ bggrn = (16 * ctoi(symbol->bgcolour[2])) + ctoi(symbol->bgcolour[3]);
+ bgblu = (16 * ctoi(symbol->bgcolour[4])) + ctoi(symbol->bgcolour[5]);
+
+
+ header.manufacturer = 10; // ZSoft
+ header.version = 5; // Version 3.0
+ header.encoding = 1; // Run length encoding
+ header.bits_per_pixel = 8;
+ header.window_xmin = 0;
+ header.window_ymin = 0;
+ header.window_xmax = symbol->bitmap_width - 1;
+ header.window_ymax = symbol->bitmap_height - 1;
+ header.horiz_dpi = 300;
+ header.vert_dpi = 300;
+
+ for (i = 0; i < 48; i++) {
+ header.colourmap[i] = 0x00;
+ }
+
+ header.reserved = 0;
+ header.number_of_planes = 3;
+
+ if (symbol->bitmap_width % 2) {
+ header.bytes_per_line = symbol->bitmap_width + 1;
+ } else {
+ header.bytes_per_line = symbol->bitmap_width;
+ }
+
+ header.palette_info = 1; // Colour
+ header.horiz_screen_size = 0;
+ header.vert_screen_size = 0;
+
+ for (i = 0; i < 54; i++) {
+ header.filler[i] = 0x00;
+ }
+
+ /* Open output file in binary mode */
+ if (symbol->output_options & BARCODE_STDOUT) {
+#ifdef _MSC_VER
+ if (-1 == _setmode(_fileno(stdout), _O_BINARY)) {
+ strcpy(symbol->errtxt, "620: Can't open output file");
+ return ZINT_ERROR_FILE_ACCESS;
+ }
+#endif
+ pcx_file = stdout;
+ } else {
+ if (!(pcx_file = fopen(symbol->outfile, "wb"))) {
+ strcpy(symbol->errtxt, "621: Can't open output file");
+ return ZINT_ERROR_FILE_ACCESS;
+ }
+ }
+
+ fwrite(&header, sizeof (pcx_header_t), 1, pcx_file);
+
+ for (row = 0; row < symbol->bitmap_height; row++) {
+ for (colour = 0; colour < 3; colour++) {
+ for (column = 0; column < symbol->bitmap_width; column++) {
+ switch (colour) {
+ case 0:
+ if (pixelbuf[(row * symbol->bitmap_width) + column] == '1') {
+ rle_row[column] = fgred;
+ } else {
+ rle_row[column] = bgred;
+ }
+ break;
+ case 1:
+ if (pixelbuf[(row * symbol->bitmap_width) + column] == '1') {
+ rle_row[column] = fggrn;
+ } else {
+ rle_row[column] = bggrn;
+ }
+ break;
+ case 2:
+ if (pixelbuf[(row * symbol->bitmap_width) + column] == '1') {
+ rle_row[column] = fgblu;
+ } else {
+ rle_row[column] = bgblu;
+ }
+ break;
+ }
+ }
+
+ run_count = 1;
+ for (column = 1; column < symbol->bitmap_width; column++) {
+ if ((rle_row[column - 1] == rle_row[column]) && (run_count < 63)) {
+ run_count++;
+ } else {
+ run_count += 0xc0;
+ fputc(run_count, pcx_file);
+ fputc(rle_row[column - 1], pcx_file);
+ run_count = 1;
+ }
+ }
+
+ if (run_count > 1) {
+ run_count += 0xc0;
+ fputc(run_count, pcx_file);
+ fputc(rle_row[column - 1], pcx_file);
+ }
+ }
+ }
+
+ fclose(pcx_file);
+
+ return 0;
+}
\ No newline at end of file
diff --git a/3rdparty/zint-2.6.1/backend/pcx.h b/3rdparty/zint-2.6.1/backend/pcx.h
new file mode 100644
index 0000000..4497cc2
--- /dev/null
+++ b/3rdparty/zint-2.6.1/backend/pcx.h
@@ -0,0 +1,76 @@
+/* pcx.h - header structure for ZSoft PCX files
+
+ libzint - the open source barcode library
+ Copyright (C) 2016-2017 Robin Stuart
+
+ Redistribution and use in source and binary forms, with or without
+ modification, are permitted provided that the following conditions
+ are met:
+
+ 1. Redistributions of source code must retain the above copyright
+ notice, this list of conditions and the following disclaimer.
+ 2. Redistributions in binary form must reproduce the above copyright
+ notice, this list of conditions and the following disclaimer in the
+ documentation and/or other materials provided with the distribution.
+ 3. Neither the name of the project nor the names of its contributors
+ may be used to endorse or promote products derived from this software
+ without specific prior written permission.
+
+ THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND
+ ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+ ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE
+ FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+ DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
+ OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
+ HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
+ LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
+ OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+ SUCH DAMAGE.
+ */
+
+#ifndef PCX_H
+#define PCX_H
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+#ifdef _MSC_VER
+#include
+#include "stdint_msvc.h"
+#else
+#include
+#endif
+
+#pragma pack (1)
+
+ typedef struct pcx_header {
+ uint8_t manufacturer;
+ uint8_t version;
+ uint8_t encoding;
+ uint8_t bits_per_pixel;
+ uint16_t window_xmin;
+ uint16_t window_ymin;
+ uint16_t window_xmax;
+ uint16_t window_ymax;
+ uint16_t horiz_dpi;
+ uint16_t vert_dpi;
+ uint8_t colourmap[48];
+ uint8_t reserved;
+ uint8_t number_of_planes;
+ uint16_t bytes_per_line;
+ uint16_t palette_info;
+ uint16_t horiz_screen_size;
+ uint16_t vert_screen_size;
+ uint8_t filler[54];
+ } pcx_header_t;
+
+#pragma pack ()
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif /* PCX_H */
+
diff --git a/3rdparty/zint-2.6.1/backend/pdf417.c b/3rdparty/zint-2.6.1/backend/pdf417.c
new file mode 100644
index 0000000..ca64578
--- /dev/null
+++ b/3rdparty/zint-2.6.1/backend/pdf417.c
@@ -0,0 +1,1296 @@
+/* pdf417.c - Handles PDF417 stacked symbology */
+
+/* Zint - A barcode generating program using libpng
+ Copyright (C) 2008-2017 Robin Stuart
+ Portions Copyright (C) 2004 Grandzebu
+ Bug Fixes thanks to KL Chin
+
+ Redistribution and use in source and binary forms, with or without
+ modification, are permitted provided that the following conditions
+ are met:
+
+ 1. Redistributions of source code must retain the above copyright
+ notice, this list of conditions and the following disclaimer.
+ 2. Redistributions in binary form must reproduce the above copyright
+ notice, this list of conditions and the following disclaimer in the
+ documentation and/or other materials provided with the distribution.
+ 3. Neither the name of the project nor the names of its contributors
+ may be used to endorse or promote products derived from this software
+ without specific prior written permission.
+
+ THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND
+ ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+ ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE
+ FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+ DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
+ OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
+ HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
+ LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
+ OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+ SUCH DAMAGE.
+ */
+
+/* This code is adapted from "Code barre PDF 417 / PDF 417 barcode" v2.5.0
+ which is Copyright (C) 2004 (Grandzebu).
+ The original code can be downloaded from http://grandzebu.net/index.php */
+
+/* NOTE: symbol->option_1 is used to specify the security level (i.e. control the
+ number of check codewords)
+
+ symbol->option_2 is used to adjust the width of the resulting symbol (i.e. the
+ number of codeword columns not including row start and end data) */
+
+#include
+#include
+#include
+#include
+#ifndef _MSC_VER
+#include
+#else
+#include
+#include "ms_stdint.h"
+#endif
+#include "pdf417.h"
+#include "common.h"
+#include "large.h"
+
+/*
+ Three figure numbers in comments give the location of command equivalents in the
+ original Visual Basic source code file pdf417.frm
+ this code retains some original (French) procedure and variable names to ease conversion */
+
+/* text mode processing tables */
+
+static const char asciix[95] = {
+ 7, 8, 8, 4, 12, 4, 4, 8, 8, 8, 12, 4, 12, 12, 12, 12, 4, 4, 4, 4, 4, 4, 4, 4,
+ 4, 4, 12, 8, 8, 4, 8, 8, 8, 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, 8, 8, 8, 4, 8, 8, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
+ 2, 2, 2, 2, 8, 8, 8, 8
+};
+
+static const char asciiy[95] = {
+ 26, 10, 20, 15, 18, 21, 10, 28, 23, 24, 22, 20, 13, 16, 17, 19, 0, 1, 2, 3,
+ 4, 5, 6, 7, 8, 9, 14, 0, 1, 23, 2, 25, 3, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15,
+ 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 4, 5, 6, 24, 7, 8, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10,
+ 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 21, 27, 9
+};
+
+/* Automatic sizing table */
+
+static const char MicroAutosize[56] = {
+ 4, 6, 7, 8, 10, 12, 13, 14, 16, 18, 19, 20, 24, 29, 30, 33, 34, 37, 39, 46, 54, 58, 70, 72, 82, 90, 108, 126,
+ 1, 14, 2, 7, 3, 25, 8, 16, 5, 17, 9, 6, 10, 11, 28, 12, 19, 13, 29, 20, 30, 21, 22, 31, 23, 32, 33, 34
+};
+
+int liste[2][1000]; /* global */
+
+/* 866 */
+
+int quelmode(char codeascii) {
+ int mode = BYT;
+ if ((codeascii == '\t') || (codeascii == '\n') || (codeascii == '\r') || ((codeascii >= ' ') && (codeascii <= '~'))) {
+ mode = TEX;
+ } else if ((codeascii >= '0') && (codeascii <= '9')) {
+ mode = NUM;
+ }
+ /* 876 */
+
+ return mode;
+}
+
+/* 844 */
+void regroupe(int *indexliste) {
+ int i, j;
+
+ /* bring together same type blocks */
+ if (*(indexliste) > 1) {
+ i = 1;
+ while (i < *(indexliste)) {
+ if (liste[1][i - 1] == liste[1][i]) {
+ /* bring together */
+ liste[0][i - 1] = liste[0][i - 1] + liste[0][i];
+ j = i + 1;
+
+ /* decreace the list */
+ while (j < *(indexliste)) {
+ liste[0][j - 1] = liste[0][j];
+ liste[1][j - 1] = liste[1][j];
+ j++;
+ }
+ *(indexliste) = *(indexliste) - 1;
+ i--;
+ }
+ i++;
+ }
+ }
+ /* 865 */
+}
+
+/* 478 */
+void pdfsmooth(int *indexliste) {
+ int i, crnt, last, next, length;
+
+ for (i = 0; i < *(indexliste); i++) {
+ crnt = liste[1][i];
+ length = liste[0][i];
+ if (i != 0) {
+ last = liste[1][i - 1];
+ } else {
+ last = FALSE;
+ }
+ if (i != *(indexliste) - 1) {
+ next = liste[1][i + 1];
+ } else {
+ next = FALSE;
+ }
+
+ if (crnt == NUM) {
+ if (i == 0) {
+ /* first block */
+ if (*(indexliste) > 1) {
+ /* and there are others */
+ if ((next == TEX) && (length < 8)) {
+ liste[1][i] = TEX;
+ }
+ if ((next == BYT) && (length == 1)) {
+ liste[1][i] = BYT;
+ }
+ }
+ } else {
+ if (i == *(indexliste) - 1) {
+ /* last block */
+ if ((last == TEX) && (length < 7)) {
+ liste[1][i] = TEX;
+ }
+ if ((last == BYT) && (length == 1)) {
+ liste[1][i] = BYT;
+ }
+ } else {
+ /* not first or last block */
+ if (((last == BYT) && (next == BYT)) && (length < 4)) {
+ liste[1][i] = BYT;
+ }
+ if (((last == BYT) && (next == TEX)) && (length < 4)) {
+ liste[1][i] = TEX;
+ }
+ if (((last == TEX) && (next == BYT)) && (length < 5)) {
+ liste[1][i] = TEX;
+ }
+ if (((last == TEX) && (next == TEX)) && (length < 8)) {
+ liste[1][i] = TEX;
+ }
+ }
+ }
+ }
+ }
+ regroupe(indexliste);
+ /* 520 */
+ for (i = 0; i < *(indexliste); i++) {
+ crnt = liste[1][i];
+ length = liste[0][i];
+ if (i != 0) {
+ last = liste[1][i - 1];
+ } else {
+ last = FALSE;
+ }
+ if (i != *(indexliste) - 1) {
+ next = liste[1][i + 1];
+ } else {
+ next = FALSE;
+ }
+
+ if ((crnt == TEX) && (i > 0)) {
+ /* not the first */
+ if (i == *(indexliste) - 1) {
+ /* the last one */
+ if ((last == BYT) && (length == 1)) {
+ liste[1][i] = BYT;
+ }
+ } else {
+ /* not the last one */
+ if (((last == BYT) && (next == BYT)) && (length < 5)) {
+ liste[1][i] = BYT;
+ }
+ if ((((last == BYT) && (next != BYT)) || ((last != BYT)
+ && (next == BYT))) && (length < 3)) {
+ liste[1][i] = BYT;
+ }
+ }
+ }
+ }
+ /* 540 */
+ regroupe(indexliste);
+}
+
+/* 547 */
+void textprocess(int *chainemc, int *mclength, char chaine[], int start, int length, int block) {
+ int j, indexlistet, curtable, listet[2][5000], chainet[5000], wnet;
+ char codeascii;
+
+ codeascii = 0;
+ wnet = 0;
+
+ for (j = 0; j < 1000; j++) {
+ listet[0][j] = 0;
+ }
+ /* listet will contain the table numbers and the value of each characters */
+ for (indexlistet = 0; indexlistet < length; indexlistet++) {
+ codeascii = chaine[start + indexlistet];
+ switch (codeascii) {
+ case '\t': listet[0][indexlistet] = 12;
+ listet[1][indexlistet] = 12;
+ break;
+ case '\n': listet[0][indexlistet] = 8;
+ listet[1][indexlistet] = 15;
+ break;
+ case 13: listet[0][indexlistet] = 12;
+ listet[1][indexlistet] = 11;
+ break;
+ default: listet[0][indexlistet] = asciix[codeascii - 32];
+ listet[1][indexlistet] = asciiy[codeascii - 32];
+ break;
+ }
+ }
+
+ /* 570 */
+ curtable = 1; /* default table */
+ for (j = 0; j < length; j++) {
+ if (listet[0][j] & curtable) {
+ /* The character is in the current table */
+ chainet[wnet] = listet[1][j];
+ wnet++;
+ } else {
+ /* Obliged to change table */
+ int flag = FALSE; /* True if we change table for only one character */
+ if (j == (length - 1)) {
+ flag = TRUE;
+ } else {
+ if (!(listet[0][j] & listet[0][j + 1])) {
+ flag = TRUE;
+ }
+ }
+
+ if (flag) {
+ /* we change only one character - look for temporary switch */
+ if ((listet[0][j] & 1) && (curtable == 2)) { /* T_UPP */
+ chainet[wnet] = 27;
+ chainet[wnet + 1] = listet[1][j];
+ wnet += 2;
+ }
+ if (listet[0][j] & 8) { /* T_PUN */
+ chainet[wnet] = 29;
+ chainet[wnet + 1] = listet[1][j];
+ wnet += 2;
+ }
+ if (!(((listet[0][j] & 1) && (curtable == 2)) || (listet[0][j] & 8))) {
+ /* No temporary switch available */
+ flag = FALSE;
+ }
+ }
+
+ /* 599 */
+ if (!(flag)) {
+ int newtable;
+
+ if (j == (length - 1)) {
+ newtable = listet[0][j];
+ } else {
+ if (!(listet[0][j] & listet[0][j + 1])) {
+ newtable = listet[0][j];
+ } else {
+ newtable = listet[0][j] & listet[0][j + 1];
+ }
+ }
+
+ /* Maintain the first if several tables are possible */
+ switch (newtable) {
+ case 3:
+ case 5:
+ case 7:
+ case 9:
+ case 11:
+ case 13:
+ case 15:
+ newtable = 1;
+ break;
+ case 6:
+ case 10:
+ case 14:
+ newtable = 2;
+ break;
+ case 12:
+ newtable = 4;
+ break;
+ }
+
+ /* 619 - select the switch */
+ switch (curtable) {
+ case 1:
+ switch (newtable) {
+ case 2: chainet[wnet] = 27;
+ wnet++;
+ break;
+ case 4: chainet[wnet] = 28;
+ wnet++;
+ break;
+ case 8: chainet[wnet] = 28;
+ wnet++;
+ chainet[wnet] = 25;
+ wnet++;
+ break;
+ }
+ break;
+ case 2:
+ switch (newtable) {
+ case 1: chainet[wnet] = 28;
+ wnet++;
+ chainet[wnet] = 28;
+ wnet++;
+ break;
+ case 4: chainet[wnet] = 28;
+ wnet++;
+ break;
+ case 8: chainet[wnet] = 28;
+ wnet++;
+ chainet[wnet] = 25;
+ wnet++;
+ break;
+ }
+ break;
+ case 4:
+ switch (newtable) {
+ case 1: chainet[wnet] = 28;
+ wnet++;
+ break;
+ case 2: chainet[wnet] = 27;
+ wnet++;
+ break;
+ case 8: chainet[wnet] = 25;
+ wnet++;
+ break;
+ }
+ break;
+ case 8:
+ switch (newtable) {
+ case 1: chainet[wnet] = 29;
+ wnet++;
+ break;
+ case 2: chainet[wnet] = 29;
+ wnet++;
+ chainet[wnet] = 27;
+ wnet++;
+ break;
+ case 4: chainet[wnet] = 29;
+ wnet++;
+ chainet[wnet] = 28;
+ wnet++;
+ break;
+ }
+ break;
+ }
+ curtable = newtable;
+ /* 659 - at last we add the character */
+ chainet[wnet] = listet[1][j];
+ wnet++;
+ }
+ }
+ }
+
+ /* 663 */
+ if (wnet & 1) {
+ chainet[wnet] = 29;
+ wnet++;
+ }
+ /* Now translate the string chainet into codewords */
+ chainemc[*(mclength)] = 900;
+ *(mclength) = *(mclength) + 1;
+
+ for (j = 0; j < wnet; j += 2) {
+ int cw_number;
+
+ cw_number = (30 * chainet[j]) + chainet[j + 1];
+ chainemc[*(mclength)] = cw_number;
+ *(mclength) = *(mclength) + 1;
+
+ }
+}
+
+/* 671 */
+void byteprocess(int *chainemc, int *mclength, unsigned char chaine[], int start, int length, int block) {
+ int debug = 0;
+ int len = 0;
+ unsigned int chunkLen = 0;
+#if defined(_MSC_VER) && _MSC_VER == 1200
+ uint64_t mantisa = 0;
+ uint64_t total = 0;
+#else
+ uint64_t mantisa = 0ULL;
+ uint64_t total = 0ULL;
+#endif
+
+ if (debug) printf("\nEntering byte mode at position %d\n", start);
+
+ if (length == 1) {
+ chainemc[(*mclength)++] = 913;
+ chainemc[(*mclength)++] = chaine[start];
+ if (debug) {
+ printf("913 %d\n", chainemc[*mclength - 1]);
+ }
+ } else {
+ /* select the switch for multiple of 6 bytes */
+ if (length % 6 == 0) {
+ chainemc[(*mclength)++] = 924;
+ if (debug) printf("924 ");
+ } else {
+ chainemc[(*mclength)++] = 901;
+ if (debug) printf("901 ");
+ }
+
+ while (len < length) {
+ chunkLen = length - len;
+ if (6 <= chunkLen) /* Take groups of 6 */ {
+ chunkLen = 6;
+ len += chunkLen;
+#if defined(_MSC_VER) && _MSC_VER == 1200
+ total = 0;
+#else
+ total = 0ULL;
+#endif
+
+ while (chunkLen--) {
+ mantisa = chaine[start++];
+#if defined(_MSC_VER) && _MSC_VER == 1200
+ total |= mantisa << (uint64_t) (chunkLen * 8);
+#else
+ total |= mantisa << (uint64_t) (chunkLen * 8ULL);
+#endif
+ }
+
+ chunkLen = 5;
+
+ while (chunkLen--) {
+#if defined(_MSC_VER) && _MSC_VER == 1200
+ chainemc[*mclength + chunkLen] = (int) (total % 900);
+ total /= 900;
+#else
+ chainemc[*mclength + chunkLen] = (int) (total % 900ULL);
+ total /= 900ULL;
+#endif
+ }
+ *mclength += 5;
+ } else /* If it remain a group of less than 6 bytes */ {
+ len += chunkLen;
+ while (chunkLen--) {
+ chainemc[(*mclength)++] = chaine[start++];
+ }
+ }
+ }
+ }
+}
+
+/* 712 */
+void numbprocess(int *chainemc, int *mclength, char chaine[], int start, int length, int block) {
+ int j, loop, longueur, dummy[100], dumlength, diviseur, nombre;
+ char chainemod[50], chainemult[100], temp;
+
+ strcpy(chainemod, "");
+ for (loop = 0; loop <= 50; loop++) {
+ dummy[loop] = 0;
+ }
+
+ chainemc[*(mclength)] = 902;
+ *(mclength) = *(mclength) + 1;
+
+ j = 0;
+ while (j < length) {
+ dumlength = 0;
+ strcpy(chainemod, "");
+ longueur = length - j;
+ if (longueur > 44) {
+ longueur = 44;
+ }
+ strcat(chainemod, "1");
+ for (loop = 1; loop <= longueur; loop++) {
+ chainemod[loop] = chaine[start + loop + j - 1];
+ }
+ chainemod[longueur + 1] = '\0';
+ do {
+ diviseur = 900;
+
+ /* 877 - gosub Modulo */
+ strcpy(chainemult, "");
+ nombre = 0;
+ while (strlen(chainemod) != 0) {
+ nombre *= 10;
+ nombre += ctoi(chainemod[0]);
+ for (loop = 0; loop < strlen(chainemod); loop++) {
+ chainemod[loop] = chainemod[loop + 1];
+ }
+ if (nombre < diviseur) {
+ if (strlen(chainemult) != 0) {
+ strcat(chainemult, "0");
+ }
+ } else {
+ temp = (nombre / diviseur) + '0';
+ chainemult[strlen(chainemult) + 1] = '\0';
+ chainemult[strlen(chainemult)] = temp;
+ }
+ nombre = nombre % diviseur;
+ }
+ diviseur = nombre;
+ /* return to 723 */
+
+ for (loop = dumlength; loop > 0; loop--) {
+ dummy[loop] = dummy[loop - 1];
+ }
+ dummy[0] = diviseur;
+ dumlength++;
+ strcpy(chainemod, chainemult);
+ } while (strlen(chainemult) != 0);
+ for (loop = 0; loop < dumlength; loop++) {
+ chainemc[*(mclength)] = dummy[loop];
+ *(mclength) = *(mclength) + 1;
+ }
+ j += longueur;
+ }
+}
+
+/* 366 */
+static int pdf417(struct zint_symbol *symbol, unsigned char chaine[], const size_t length) {
+ int i, k, j, indexchaine, indexliste, mode, longueur, loop, mccorrection[520], offset;
+ int total, chainemc[2700], mclength, c1, c2, c3, dummy[35];
+ char pattern[580];
+ int debug = symbol->debug;
+
+ /* 456 */
+ indexliste = 0;
+ indexchaine = 0;
+
+ mode = quelmode(chaine[indexchaine]);
+
+ for (i = 0; i < 1000; i++) {
+ liste[0][i] = 0;
+ }
+
+ /* 463 */
+ do {
+ liste[1][indexliste] = mode;
+ while ((liste[1][indexliste] == mode) && (indexchaine < length)) {
+ liste[0][indexliste]++;
+ indexchaine++;
+ mode = quelmode(chaine[indexchaine]);
+ }
+ indexliste++;
+ } while (indexchaine < length);
+
+ /* 474 */
+ pdfsmooth(&indexliste);
+
+ if (debug) {
+ printf("Initial block pattern:\n");
+ for (i = 0; i < indexliste; i++) {
+ printf("Len: %d Type: ", liste[0][i]);
+ switch (liste[1][i]) {
+ case TEX: printf("Text\n");
+ break;
+ case BYT: printf("Byte\n");
+ break;
+ case NUM: printf("Number\n");
+ break;
+ default: printf("ERROR\n");
+ break;
+ }
+ }
+ }
+
+ /* 541 - now compress the data */
+ indexchaine = 0;
+ mclength = 0;
+
+ if (symbol->output_options & READER_INIT) {
+ chainemc[mclength] = 921; /* Reader Initialisation */
+ mclength++;
+ }
+
+ if (symbol->eci != 3) {
+ /* Encoding ECI assignment number, according to Table 8 */
+ if (symbol->eci <= 899) {
+ chainemc[mclength] = 927; /* ECI */
+ mclength++;
+ chainemc[mclength] = symbol->eci;
+ mclength++;
+ }
+ if ((symbol->eci >= 900) && (symbol->eci <= 810899)) {
+ chainemc[mclength] = 926; /* ECI */
+ mclength++;
+ chainemc[mclength] = (symbol->eci / 900) - 1;
+ mclength++;
+ chainemc[mclength] = symbol->eci % 900;
+ mclength++;
+ }
+ if (symbol->eci >= 810900) {
+ chainemc[mclength] = 925; /* ECI */
+ mclength++;
+ chainemc[mclength] = symbol->eci - 810900;
+ mclength++;
+ }
+ }
+
+ if (symbol->eci > 811799) {
+ strcpy(symbol->errtxt, "472: Invalid ECI");
+ return ZINT_ERROR_INVALID_OPTION;
+ }
+
+ for (i = 0; i < indexliste; i++) {
+ switch (liste[1][i]) {
+ case TEX: /* 547 - text mode */
+ textprocess(chainemc, &mclength, (char*) chaine, indexchaine, liste[0][i], i);
+ break;
+ case BYT: /* 670 - octet stream mode */
+ byteprocess(chainemc, &mclength, chaine, indexchaine, liste[0][i], i);
+ break;
+ case NUM: /* 712 - numeric mode */
+ numbprocess(chainemc, &mclength, (char*) chaine, indexchaine, liste[0][i], i);
+ break;
+ }
+ indexchaine = indexchaine + liste[0][i];
+ }
+
+ if (debug) {
+ printf("\nCompressed data stream:\n");
+ for (i = 0; i < mclength; i++) {
+ printf("%d ", chainemc[i]);
+ }
+ printf("\n\n");
+ }
+
+ /* 752 - Now take care of the number of CWs per row */
+ if (symbol->option_1 < 0) {
+ symbol->option_1 = 6;
+ if (mclength <= 863) {
+ symbol->option_1 = 5;
+ }
+ if (mclength <= 320) {
+ symbol->option_1 = 4;
+ }
+ if (mclength <= 160) {
+ symbol->option_1 = 3;
+ }
+ if (mclength <= 40) {
+ symbol->option_1 = 2;
+ }
+ }
+ k = 1;
+ for (loop = 1; loop <= (symbol->option_1 + 1); loop++) {
+ k *= 2;
+ }
+ longueur = mclength;
+ if (symbol->option_2 > 30) {
+ symbol->option_2 = 30;
+ }
+ if (symbol->option_2 < 1) {
+ symbol->option_2 =(int)(0.5 + sqrt((longueur + k) / 3.0));
+ }
+ if (((longueur + k) / symbol->option_2) > 90) {
+ /* stop the symbol from becoming too high */
+ symbol->option_2 = symbol->option_2 + 1;
+ }
+
+ if (longueur + k > 928) {
+ /* Enforce maximum codeword limit */
+ return 2;
+ }
+
+ if (((longueur + k) / symbol->option_2) > 90) {
+ return 4;
+ }
+
+ /* 781 - Padding calculation */
+ longueur = mclength + 1 + k;
+ i = 0;
+ if ((longueur / symbol->option_2) < 3) {
+ i = (symbol->option_2 * 3) - longueur; /* A bar code must have at least three rows */
+ } else {
+ if ((longueur % symbol->option_2) > 0) {
+ i = symbol->option_2 - (longueur % symbol->option_2);
+ }
+ }
+ /* We add the padding */
+ while (i > 0) {
+ chainemc[mclength] = 900;
+ mclength++;
+ i--;
+ }
+ /* we add the length descriptor */
+ for (i = mclength; i > 0; i--) {
+ chainemc[i] = chainemc[i - 1];
+ }
+ chainemc[0] = mclength + 1;
+ mclength++;
+
+ /* 796 - we now take care of the Reed Solomon codes */
+ switch (symbol->option_1) {
+ case 1: offset = 2;
+ break;
+ case 2: offset = 6;
+ break;
+ case 3: offset = 14;
+ break;
+ case 4: offset = 30;
+ break;
+ case 5: offset = 62;
+ break;
+ case 6: offset = 126;
+ break;
+ case 7: offset = 254;
+ break;
+ case 8: offset = 510;
+ break;
+ default: offset = 0;
+ break;
+ }
+
+ longueur = mclength;
+ for (loop = 0; loop < 520; loop++) {
+ mccorrection[loop] = 0;
+ }
+ total = 0;
+ for (i = 0; i < longueur; i++) {
+ total = (chainemc[i] + mccorrection[k - 1]) % 929;
+ for (j = k - 1; j > 0; j--) {
+ mccorrection[j] = (mccorrection[j - 1] + 929 - (total * coefrs[offset + j]) % 929) % 929;
+ }
+ mccorrection[0] = (929 - (total * coefrs[offset + j]) % 929) % 929;
+ }
+
+ /* we add these codes to the string */
+ for (i = k - 1; i >= 0; i--) {
+ chainemc[mclength++] = mccorrection[i] ? 929 - mccorrection[i] : 0;
+ }
+
+ /* 818 - The CW string is finished */
+ c1 = (mclength / symbol->option_2 - 1) / 3;
+ c2 = symbol->option_1 * 3 + (mclength / symbol->option_2 - 1) % 3;
+ c3 = symbol->option_2 - 1;
+
+ /* we now encode each row */
+ for (i = 0; i <= (mclength / symbol->option_2) - 1; i++) {
+ for (j = 0; j < symbol->option_2; j++) {
+ dummy[j + 1] = chainemc[i * symbol->option_2 + j];
+ }
+ k = (i / 3) * 30;
+ switch (i % 3) {
+ case 0:
+ dummy[0] = k + c1;
+ dummy[symbol->option_2 + 1] = k + c3;
+ offset = 0; /* cluster(0) */
+ break;
+ case 1:
+ dummy[0] = k + c2;
+ dummy[symbol->option_2 + 1] = k + c1;
+ offset = 929; /* cluster(3) */
+ break;
+ case 2:
+ dummy[0] = k + c3;
+ dummy[symbol->option_2 + 1] = k + c2;
+ offset = 1858; /* cluster(6) */
+ break;
+ }
+ strcpy(pattern, "");
+ bin_append(0x1FEA8, 17, pattern); /* Row start */
+
+ for (j = 0; j <= symbol->option_2; j++) {
+ bin_append(pdf_bitpattern[offset + dummy[j]], 16, pattern);
+ strcat(pattern, "0");
+ }
+
+ if (symbol->symbology != BARCODE_PDF417TRUNC) {
+ bin_append(pdf_bitpattern[offset + dummy[j]], 16, pattern);
+ strcat(pattern, "0");
+ bin_append(0x3FA29, 18, pattern); /* Row Stop */
+ }
+
+ for (loop = 0; loop < strlen(pattern); loop++) {
+ if (pattern[loop] == '1') {
+ set_module(symbol, i, loop);
+ }
+ }
+
+ symbol->row_height[i] = 3;
+
+ }
+ symbol->rows = (mclength / symbol->option_2);
+ symbol->width =(int)strlen(pattern);
+
+ /* 843 */
+ return 0;
+}
+
+/* 345 */
+int pdf417enc(struct zint_symbol *symbol, unsigned char source[], const size_t length) {
+ int codeerr, error_number;
+
+ error_number = 0;
+
+ if ((symbol->option_1 < -1) || (symbol->option_1 > 8)) {
+ strcpy(symbol->errtxt, "460: Security value out of range");
+ symbol->option_1 = -1;
+ error_number = ZINT_WARN_INVALID_OPTION;
+ }
+ if ((symbol->option_2 < 0) || (symbol->option_2 > 30)) {
+ strcpy(symbol->errtxt, "461: Number of columns out of range");
+ symbol->option_2 = 0;
+ error_number = ZINT_WARN_INVALID_OPTION;
+ }
+
+ /* 349 */
+ codeerr = pdf417(symbol, source, length);
+
+ /* 352 */
+ if (codeerr != 0) {
+ switch (codeerr) {
+ case 1:
+ strcpy(symbol->errtxt, "462: No such file or file unreadable");
+ error_number = ZINT_ERROR_INVALID_OPTION;
+ break;
+ case 2:
+ strcpy(symbol->errtxt, "463: Input string too long");
+ error_number = ZINT_ERROR_TOO_LONG;
+ break;
+ case 3:
+ strcpy(symbol->errtxt, "464: Number of codewords per row too small");
+ error_number = ZINT_WARN_INVALID_OPTION;
+ break;
+ case 4:
+ strcpy(symbol->errtxt, "465: Data too long for specified number of columns");
+ error_number = ZINT_ERROR_TOO_LONG;
+ break;
+ case ZINT_ERROR_INVALID_OPTION:
+ error_number = codeerr;
+ break;
+ default:
+ strcpy(symbol->errtxt, "466: Something strange happened");
+ error_number = ZINT_ERROR_ENCODING_PROBLEM;
+ break;
+ }
+ }
+
+ /* 364 */
+ return error_number;
+}
+
+/* like PDF417 only much smaller! */
+int micro_pdf417(struct zint_symbol *symbol, unsigned char chaine[], const size_t length) {
+ int i, k, j, indexchaine, indexliste, mode, longueur, mccorrection[50], offset;
+ int total, chainemc[2700], mclength, dummy[5], codeerr;
+ char pattern[580];
+ int variant, LeftRAPStart, CentreRAPStart, RightRAPStart, StartCluster;
+ int LeftRAP, CentreRAP, RightRAP, Cluster, loop;
+ int debug = 0;
+
+ /* Encoding starts out the same as PDF417, so use the same code */
+ codeerr = 0;
+
+ /* 456 */
+ indexliste = 0;
+ indexchaine = 0;
+
+ mode = quelmode(chaine[indexchaine]);
+
+ for (i = 0; i < 1000; i++) {
+ liste[0][i] = 0;
+ }
+
+ /* 463 */
+ do {
+ liste[1][indexliste] = mode;
+ while ((liste[1][indexliste] == mode) && (indexchaine < length)) {
+ liste[0][indexliste]++;
+ indexchaine++;
+ mode = quelmode(chaine[indexchaine]);
+ }
+ indexliste++;
+ } while (indexchaine < length);
+
+ /* 474 */
+ pdfsmooth(&indexliste);
+
+ if (debug) {
+ printf("Initial mapping:\n");
+ for (i = 0; i < indexliste; i++) {
+ printf("len: %d type: ", liste[0][i]);
+ switch (liste[1][i]) {
+ case TEX: printf("TEXT\n");
+ break;
+ case BYT: printf("BYTE\n");
+ break;
+ case NUM: printf("NUMBER\n");
+ break;
+ default: printf("*ERROR*\n");
+ break;
+ }
+ }
+ }
+
+ /* 541 - now compress the data */
+ indexchaine = 0;
+ mclength = 0;
+
+ if (symbol->output_options & READER_INIT) {
+ chainemc[mclength] = 921; /* Reader Initialisation */
+ mclength++;
+ }
+
+ if (symbol->eci > 811799) {
+ strcpy(symbol->errtxt, "473: Invalid ECI");
+ return ZINT_ERROR_INVALID_OPTION;
+ }
+
+ if (symbol->eci != 3) {
+ /* Encoding ECI assignment number, according to Table 8 */
+ if (symbol->eci <= 899) {
+ chainemc[mclength] = 927; /* ECI */
+ mclength++;
+ chainemc[mclength] = symbol->eci;
+ mclength++;
+ }
+ if ((symbol->eci >= 900) && (symbol->eci <= 810899)) {
+ chainemc[mclength] = 926; /* ECI */
+ mclength++;
+ chainemc[mclength] = (symbol->eci / 900) - 1;
+ mclength++;
+ chainemc[mclength] = symbol->eci % 900;
+ mclength++;
+ }
+ if (symbol->eci >= 810900) {
+ chainemc[mclength] = 925; /* ECI */
+ mclength++;
+ chainemc[mclength] = symbol->eci - 810900;
+ mclength++;
+ }
+ }
+
+ for (i = 0; i < indexliste; i++) {
+ switch (liste[1][i]) {
+ case TEX: /* 547 - text mode */
+ textprocess(chainemc, &mclength, (char*) chaine, indexchaine, liste[0][i], i);
+ break;
+ case BYT: /* 670 - octet stream mode */
+ byteprocess(chainemc, &mclength, chaine, indexchaine, liste[0][i], i);
+ break;
+ case NUM: /* 712 - numeric mode */
+ numbprocess(chainemc, &mclength, (char*) chaine, indexchaine, liste[0][i], i);
+ break;
+ }
+ indexchaine = indexchaine + liste[0][i];
+ }
+
+ /* This is where it all changes! */
+
+ if (mclength > 126) {
+ strcpy(symbol->errtxt, "467: Input data too long");
+ return ZINT_ERROR_TOO_LONG;
+ }
+ if (symbol->option_2 > 4) {
+ strcpy(symbol->errtxt, "468: Specified width out of range");
+ symbol->option_2 = 0;
+ codeerr = ZINT_WARN_INVALID_OPTION;
+ }
+
+ if (debug) {
+ printf("\nEncoded Data Stream:\n");
+ for (i = 0; i < mclength; i++) {
+ printf("0x%02X ", chainemc[i]);
+ }
+ printf("\n");
+ }
+
+ /* Now figure out which variant of the symbol to use and load values accordingly */
+
+ variant = 0;
+
+ if ((symbol->option_2 == 1) && (mclength > 20)) {
+ /* the user specified 1 column but the data doesn't fit - go to automatic */
+ symbol->option_2 = 0;
+ strcpy(symbol->errtxt, "469: Specified symbol size too small for data");
+ codeerr = ZINT_WARN_INVALID_OPTION;
+ }
+
+ if ((symbol->option_2 == 2) && (mclength > 37)) {
+ /* the user specified 2 columns but the data doesn't fit - go to automatic */
+ symbol->option_2 = 0;
+ strcpy(symbol->errtxt, "470: Specified symbol size too small for data");
+ codeerr = ZINT_WARN_INVALID_OPTION;
+ }
+
+ if ((symbol->option_2 == 3) && (mclength > 82)) {
+ /* the user specified 3 columns but the data doesn't fit - go to automatic */
+ symbol->option_2 = 0;
+ strcpy(symbol->errtxt, "471: Specified symbol size too small for data");
+ codeerr = ZINT_WARN_INVALID_OPTION;
+ }
+
+ if (symbol->option_2 == 1) {
+ /* the user specified 1 column and the data does fit */
+ variant = 6;
+ if (mclength <= 16) {
+ variant = 5;
+ }
+ if (mclength <= 12) {
+ variant = 4;
+ }
+ if (mclength <= 10) {
+ variant = 3;
+ }
+ if (mclength <= 7) {
+ variant = 2;
+ }
+ if (mclength <= 4) {
+ variant = 1;
+ }
+ }
+
+ if (symbol->option_2 == 2) {
+ /* the user specified 2 columns and the data does fit */
+ variant = 13;
+ if (mclength <= 33) {
+ variant = 12;
+ }
+ if (mclength <= 29) {
+ variant = 11;
+ }
+ if (mclength <= 24) {
+ variant = 10;
+ }
+ if (mclength <= 19) {
+ variant = 9;
+ }
+ if (mclength <= 13) {
+ variant = 8;
+ }
+ if (mclength <= 8) {
+ variant = 7;
+ }
+ }
+
+ if (symbol->option_2 == 3) {
+ /* the user specified 3 columns and the data does fit */
+ variant = 23;
+ if (mclength <= 70) {
+ variant = 22;
+ }
+ if (mclength <= 58) {
+ variant = 21;
+ }
+ if (mclength <= 46) {
+ variant = 20;
+ }
+ if (mclength <= 34) {
+ variant = 19;
+ }
+ if (mclength <= 24) {
+ variant = 18;
+ }
+ if (mclength <= 18) {
+ variant = 17;
+ }
+ if (mclength <= 14) {
+ variant = 16;
+ }
+ if (mclength <= 10) {
+ variant = 15;
+ }
+ if (mclength <= 6) {
+ variant = 14;
+ }
+ }
+
+ if (symbol->option_2 == 4) {
+ /* the user specified 4 columns and the data does fit */
+ variant = 34;
+ if (mclength <= 108) {
+ variant = 33;
+ }
+ if (mclength <= 90) {
+ variant = 32;
+ }
+ if (mclength <= 72) {
+ variant = 31;
+ }
+ if (mclength <= 54) {
+ variant = 30;
+ }
+ if (mclength <= 39) {
+ variant = 29;
+ }
+ if (mclength <= 30) {
+ variant = 28;
+ }
+ if (mclength <= 24) {
+ variant = 27;
+ }
+ if (mclength <= 18) {
+ variant = 26;
+ }
+ if (mclength <= 12) {
+ variant = 25;
+ }
+ if (mclength <= 8) {
+ variant = 24;
+ }
+ }
+
+ if (variant == 0) {
+ /* Zint can choose automatically from all available variations */
+ for (i = 27; i >= 0; i--) {
+
+ if (MicroAutosize[i] >= mclength) {
+ variant = MicroAutosize[i + 28];
+ }
+ }
+ }
+
+ /* Now we have the variant we can load the data */
+ variant--;
+ symbol->option_2 = MicroVariants[variant]; /* columns */
+ symbol->rows = MicroVariants[variant + 34]; /* rows */
+ k = MicroVariants[variant + 68]; /* number of EC CWs */
+ longueur = (symbol->option_2 * symbol->rows) - k; /* number of non-EC CWs */
+ i = longueur - mclength; /* amount of padding required */
+ offset = MicroVariants[variant + 102]; /* coefficient offset */
+
+ if (debug) {
+ printf("\nChoose symbol size:\n");
+ printf("%d columns x %d rows\n", symbol->option_2, symbol->rows);
+ printf("%d data codewords (including %d pads), %d ecc codewords\n", longueur, i, k);
+ printf("\n");
+ }
+
+ /* We add the padding */
+ while (i > 0) {
+ chainemc[mclength] = 900;
+ mclength++;
+ i--;
+ }
+
+ /* Reed-Solomon error correction */
+ longueur = mclength;
+ for (loop = 0; loop < 50; loop++) {
+ mccorrection[loop] = 0;
+ }
+ total = 0;
+ for (i = 0; i < longueur; i++) {
+ total = (chainemc[i] + mccorrection[k - 1]) % 929;
+ for (j = k - 1; j >= 0; j--) {
+ if (j == 0) {
+ mccorrection[j] = (929 - (total * Microcoeffs[offset + j]) % 929) % 929;
+ } else {
+ mccorrection[j] = (mccorrection[j - 1] + 929 - (total * Microcoeffs[offset + j]) % 929) % 929;
+ }
+ }
+ }
+
+ for (j = 0; j < k; j++) {
+ if (mccorrection[j] != 0) {
+ mccorrection[j] = 929 - mccorrection[j];
+ }
+ }
+ /* we add these codes to the string */
+ for (i = k - 1; i >= 0; i--) {
+ chainemc[mclength] = mccorrection[i];
+ mclength++;
+ }
+
+ if (debug) {
+ printf("Encoded Data Stream with ECC:\n");
+ for (i = 0; i < mclength; i++) {
+ printf("0x%02X ", chainemc[i]);
+ }
+ printf("\n");
+ }
+
+ /* Now get the RAP (Row Address Pattern) start values */
+ LeftRAPStart = RAPTable[variant];
+ CentreRAPStart = RAPTable[variant + 34];
+ RightRAPStart = RAPTable[variant + 68];
+ StartCluster = RAPTable[variant + 102] / 3;
+
+ /* That's all values loaded, get on with the encoding */
+
+ LeftRAP = LeftRAPStart;
+ CentreRAP = CentreRAPStart;
+ RightRAP = RightRAPStart;
+ Cluster = StartCluster;
+ /* Cluster can be 0, 1 or 2 for Cluster(0), Cluster(3) and Cluster(6) */
+
+ if (debug) printf("\nInternal row representation:\n");
+ for (i = 0; i < symbol->rows; i++) {
+ if (debug) printf("row %d: ", i);
+ strcpy(pattern, "");
+ offset = 929 * Cluster;
+ for (j = 0; j < 5; j++) {
+ dummy[j] = 0;
+ }
+ for (j = 0; j < symbol->option_2; j++) {
+ dummy[j + 1] = chainemc[i * symbol->option_2 + j];
+ if (debug) printf("[%d] ", dummy[j + 1]);
+ }
+
+ /* Copy the data into codebarre */
+ bin_append(rap_side[LeftRAP - 1], 10, pattern);
+ bin_append(pdf_bitpattern[offset + dummy[1]], 16, pattern);
+ strcat(pattern, "0");
+ if (symbol->option_2 == 3) {
+ bin_append(rap_centre[CentreRAP - 1], 10, pattern);
+ }
+ if (symbol->option_2 >= 2) {
+ bin_append(pdf_bitpattern[offset + dummy[2]], 16, pattern);
+ strcat(pattern, "0");
+ }
+ if (symbol->option_2 == 4) {
+ bin_append(rap_centre[CentreRAP - 1], 10, pattern);
+ }
+ if (symbol->option_2 >= 3) {
+ bin_append(pdf_bitpattern[offset + dummy[3]], 16, pattern);
+ strcat(pattern, "0");
+ }
+ if (symbol->option_2 == 4) {
+ bin_append(pdf_bitpattern[offset + dummy[4]], 16, pattern);
+ strcat(pattern, "0");
+ }
+ bin_append(rap_side[RightRAP - 1], 10, pattern);
+ strcat(pattern, "1"); /* stop */
+ if (debug) printf("%s\n", pattern);
+
+ /* so now pattern[] holds the string of '1's and '0's. - copy this to the symbol */
+ for (loop = 0; loop < strlen(pattern); loop++) {
+ if (pattern[loop] == '1') {
+ set_module(symbol, i, loop);
+ }
+ }
+ symbol->row_height[i] = 2;
+ symbol->width = strlen(pattern);
+
+ /* Set up RAPs and Cluster for next row */
+ LeftRAP++;
+ CentreRAP++;
+ RightRAP++;
+ Cluster++;
+
+ if (LeftRAP == 53) {
+ LeftRAP = 1;
+ }
+ if (CentreRAP == 53) {
+ CentreRAP = 1;
+ }
+ if (RightRAP == 53) {
+ RightRAP = 1;
+ }
+ if (Cluster == 3) {
+ Cluster = 0;
+ }
+ }
+
+ return codeerr;
+}
diff --git a/3rdparty/zint-2.6.1/backend/pdf417.h b/3rdparty/zint-2.6.1/backend/pdf417.h
new file mode 100644
index 0000000..2c2f551
--- /dev/null
+++ b/3rdparty/zint-2.6.1/backend/pdf417.h
@@ -0,0 +1,514 @@
+/* pdf417.h - PDF417 tables and coefficients */
+
+/*
+ libzint - the open source barcode library
+ Copyright (C) 2008-2017 Robin Stuart
+ Portions Copyright (C) 2004 Grandzebu
+
+ Redistribution and use in source and binary forms, with or without
+ modification, are permitted provided that the following conditions
+ are met:
+
+ 1. Redistributions of source code must retain the above copyright
+ notice, this list of conditions and the following disclaimer.
+ 2. Redistributions in binary form must reproduce the above copyright
+ notice, this list of conditions and the following disclaimer in the
+ documentation and/or other materials provided with the distribution.
+ 3. Neither the name of the project nor the names of its contributors
+ may be used to endorse or promote products derived from this software
+ without specific prior written permission.
+
+ THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND
+ ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+ ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE
+ FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+ DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
+ OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
+ HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
+ LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
+ OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+ SUCH DAMAGE.
+ */
+
+/* this file contains the character table, the pre-calculated coefficients and the
+ codeword patterns taken from lines 416 to 454 of pdf417.frm */
+
+#define TRUE 1
+#define FALSE 0
+#define TEX 900
+#define BYT 901
+#define NUM 902
+
+/* PDF417 error correction coefficients from Grand Zebu */
+static const unsigned short int coefrs[1022] = {
+ /* k = 2 */
+ 27, 917,
+
+ /* k = 4 */
+ 522, 568, 723, 809,
+
+ /* k = 8 */
+ 237, 308, 436, 284, 646, 653, 428, 379,
+
+ /* k = 16 */
+ 274, 562, 232, 755, 599, 524, 801, 132, 295, 116, 442, 428, 295, 42, 176, 65,
+
+ /* k = 32 */
+ 361, 575, 922, 525, 176, 586, 640, 321, 536, 742, 677, 742, 687, 284, 193, 517,
+ 273, 494, 263, 147, 593, 800, 571, 320, 803, 133, 231, 390, 685, 330, 63, 410,
+
+ /* k = 64 */
+ 539, 422, 6, 93, 862, 771, 453, 106, 610, 287, 107, 505, 733, 877, 381, 612,
+ 723, 476, 462, 172, 430, 609, 858, 822, 543, 376, 511, 400, 672, 762, 283, 184,
+ 440, 35, 519, 31, 460, 594, 225, 535, 517, 352, 605, 158, 651, 201, 488, 502,
+ 648, 733, 717, 83, 404, 97, 280, 771, 840, 629, 4, 381, 843, 623, 264, 543,
+
+ /* k = 128 */
+ 521, 310, 864, 547, 858, 580, 296, 379, 53, 779, 897, 444, 400, 925, 749, 415,
+ 822, 93, 217, 208, 928, 244, 583, 620, 246, 148, 447, 631, 292, 908, 490, 704,
+ 516, 258, 457, 907, 594, 723, 674, 292, 272, 96, 684, 432, 686, 606, 860, 569,
+ 193, 219, 129, 186, 236, 287, 192, 775, 278, 173, 40, 379, 712, 463, 646, 776,
+ 171, 491, 297, 763, 156, 732, 95, 270, 447, 90, 507, 48, 228, 821, 808, 898,
+ 784, 663, 627, 378, 382, 262, 380, 602, 754, 336, 89, 614, 87, 432, 670, 616,
+ 157, 374, 242, 726, 600, 269, 375, 898, 845, 454, 354, 130, 814, 587, 804, 34,
+ 211, 330, 539, 297, 827, 865, 37, 517, 834, 315, 550, 86, 801, 4, 108, 539,
+
+ /* k = 256 */
+ 524, 894, 75, 766, 882, 857, 74, 204, 82, 586, 708, 250, 905, 786, 138, 720,
+ 858, 194, 311, 913, 275, 190, 375, 850, 438, 733, 194, 280, 201, 280, 828, 757,
+ 710, 814, 919, 89, 68, 569, 11, 204, 796, 605, 540, 913, 801, 700, 799, 137,
+ 439, 418, 592, 668, 353, 859, 370, 694, 325, 240, 216, 257, 284, 549, 209, 884,
+ 315, 70, 329, 793, 490, 274, 877, 162, 749, 812, 684, 461, 334, 376, 849, 521,
+ 307, 291, 803, 712, 19, 358, 399, 908, 103, 511, 51, 8, 517, 225, 289, 470,
+ 637, 731, 66, 255, 917, 269, 463, 830, 730, 433, 848, 585, 136, 538, 906, 90,
+ 2, 290, 743, 199, 655, 903, 329, 49, 802, 580, 355, 588, 188, 462, 10, 134,
+ 628, 320, 479, 130, 739, 71, 263, 318, 374, 601, 192, 605, 142, 673, 687, 234,
+ 722, 384, 177, 752, 607, 640, 455, 193, 689, 707, 805, 641, 48, 60, 732, 621,
+ 895, 544, 261, 852, 655, 309, 697, 755, 756, 60, 231, 773, 434, 421, 726, 528,
+ 503, 118, 49, 795, 32, 144, 500, 238, 836, 394, 280, 566, 319, 9, 647, 550,
+ 73, 914, 342, 126, 32, 681, 331, 792, 620, 60, 609, 441, 180, 791, 893, 754,
+ 605, 383, 228, 749, 760, 213, 54, 297, 134, 54, 834, 299, 922, 191, 910, 532,
+ 609, 829, 189, 20, 167, 29, 872, 449, 83, 402, 41, 656, 505, 579, 481, 173,
+ 404, 251, 688, 95, 497, 555, 642, 543, 307, 159, 924, 558, 648, 55, 497, 10,
+
+ /* k = 512 */
+ 352, 77, 373, 504, 35, 599, 428, 207, 409, 574, 118, 498, 285, 380, 350, 492,
+ 197, 265, 920, 155, 914, 299, 229, 643, 294, 871, 306, 88, 87, 193, 352, 781,
+ 846, 75, 327, 520, 435, 543, 203, 666, 249, 346, 781, 621, 640, 268, 794, 534,
+ 539, 781, 408, 390, 644, 102, 476, 499, 290, 632, 545, 37, 858, 916, 552, 41,
+ 542, 289, 122, 272, 383, 800, 485, 98, 752, 472, 761, 107, 784, 860, 658, 741,
+ 290, 204, 681, 407, 855, 85, 99, 62, 482, 180, 20, 297, 451, 593, 913, 142,
+ 808, 684, 287, 536, 561, 76, 653, 899, 729, 567, 744, 390, 513, 192, 516, 258,
+ 240, 518, 794, 395, 768, 848, 51, 610, 384, 168, 190, 826, 328, 596, 786, 303,
+ 570, 381, 415, 641, 156, 237, 151, 429, 531, 207, 676, 710, 89, 168, 304, 402,
+ 40, 708, 575, 162, 864, 229, 65, 861, 841, 512, 164, 477, 221, 92, 358, 785,
+ 288, 357, 850, 836, 827, 736, 707, 94, 8, 494, 114, 521, 2, 499, 851, 543,
+ 152, 729, 771, 95, 248, 361, 578, 323, 856, 797, 289, 51, 684, 466, 533, 820,
+ 669, 45, 902, 452, 167, 342, 244, 173, 35, 463, 651, 51, 699, 591, 452, 578,
+ 37, 124, 298, 332, 552, 43, 427, 119, 662, 777, 475, 850, 764, 364, 578, 911,
+ 283, 711, 472, 420, 245, 288, 594, 394, 511, 327, 589, 777, 699, 688, 43, 408,
+ 842, 383, 721, 521, 560, 644, 714, 559, 62, 145, 873, 663, 713, 159, 672, 729,
+ 624, 59, 193, 417, 158, 209, 563, 564, 343, 693, 109, 608, 563, 365, 181, 772,
+ 677, 310, 248, 353, 708, 410, 579, 870, 617, 841, 632, 860, 289, 536, 35, 777,
+ 618, 586, 424, 833, 77, 597, 346, 269, 757, 632, 695, 751, 331, 247, 184, 45,
+ 787, 680, 18, 66, 407, 369, 54, 492, 228, 613, 830, 922, 437, 519, 644, 905,
+ 789, 420, 305, 441, 207, 300, 892, 827, 141, 537, 381, 662, 513, 56, 252, 341,
+ 242, 797, 838, 837, 720, 224, 307, 631, 61, 87, 560, 310, 756, 665, 397, 808,
+ 851, 309, 473, 795, 378, 31, 647, 915, 459, 806, 590, 731, 425, 216, 548, 249,
+ 321, 881, 699, 535, 673, 782, 210, 815, 905, 303, 843, 922, 281, 73, 469, 791,
+ 660, 162, 498, 308, 155, 422, 907, 817, 187, 62, 16, 425, 535, 336, 286, 437,
+ 375, 273, 610, 296, 183, 923, 116, 667, 751, 353, 62, 366, 691, 379, 687, 842,
+ 37, 357, 720, 742, 330, 5, 39, 923, 311, 424, 242, 749, 321, 54, 669, 316,
+ 342, 299, 534, 105, 667, 488, 640, 672, 576, 540, 316, 486, 721, 610, 46, 656,
+ 447, 171, 616, 464, 190, 531, 297, 321, 762, 752, 533, 175, 134, 14, 381, 433,
+ 717, 45, 111, 20, 596, 284, 736, 138, 646, 411, 877, 669, 141, 919, 45, 780,
+ 407, 164, 332, 899, 165, 726, 600, 325, 498, 655, 357, 752, 768, 223, 849, 647,
+ 63, 310, 863, 251, 366, 304, 282, 738, 675, 410, 389, 244, 31, 121, 303, 263
+};
+
+static const unsigned short int pdf_bitpattern[2787] = {
+ 0xEAE0, 0xF578, 0xFABE, 0xEA70, 0xF53C, 0xFA9F, 0xD460, 0xEA38, 0xD430, 0xA820,
+ 0xD418, 0xA810, 0xD6E0, 0xEB78, 0xF5BE, 0xD670, 0xEB3C, 0xF59F, 0xAC60, 0xD638,
+ 0xAC30, 0xAEE0, 0xD778, 0xEBBE, 0xAE70, 0xD73C, 0xEB9F, 0xAE38, 0xD71E, 0xAF78,
+ 0xD7BE, 0xAF3C, 0xD79F, 0xAFBE, 0xFAFD, 0xE970, 0xF4BC, 0xFA5F, 0xD260, 0xE938,
+ 0xF49E, 0xD230, 0xE91C, 0xA420, 0xD218, 0xE90E, 0xA410, 0xD20C, 0xA408, 0xD370,
+ 0xE9BC, 0xF4DF, 0xA660, 0xD338, 0xE99E, 0xA630, 0xD31C, 0xE98F, 0xA618, 0xD30E,
+ 0xA770, 0xD3BC, 0xE9DF, 0xA738, 0xD39E, 0xA71C, 0xD38F, 0xA7BC, 0xD3DF, 0xA79E,
+ 0xA78F, 0xD160, 0xE8B8, 0xF45E, 0xD130, 0xE89C, 0xF44F, 0xA220, 0xD118, 0xE88E,
+ 0xA210, 0xD10C, 0xA208, 0xA204, 0xA360, 0xD1B8, 0xE8DE, 0xA330, 0xD19C, 0xE8CF,
+ 0xA318, 0xD18E, 0xA30C, 0xA306, 0xA3B8, 0xD1DE, 0xA39C, 0xD1CF, 0xA38E, 0xA3DE,
+ 0xD0B0, 0xE85C, 0xF42F, 0xA120, 0xD098, 0xE84E, 0xA110, 0xD08C, 0xE847, 0xA108,
+ 0xD086, 0xA104, 0xD083, 0xA1B0, 0xD0DC, 0xE86F, 0xA198, 0xD0CE, 0xA18C, 0xD0C7,
+ 0xA186, 0xA183, 0xD0EF, 0xA1C7, 0xA0A0, 0xD058, 0xE82E, 0xA090, 0xD04C, 0xE827,
+ 0xA088, 0xD046, 0xA084, 0xD043, 0xA082, 0xA0D8, 0xA0CC, 0xA0C6, 0xA050, 0xE817,
+ 0xD026, 0xD023, 0xA041, 0xE570, 0xF2BC, 0xF95F, 0xCA60, 0xE538, 0xF29E, 0xCA30,
+ 0xE51C, 0xF28F, 0x9420, 0xCA18, 0x9410, 0xCB70, 0xE5BC, 0xF2DF, 0x9660, 0xCB38,
+ 0xE59E, 0x9630, 0xCB1C, 0x9618, 0x960C, 0x9770, 0xCBBC, 0xE5DF, 0x9738, 0xCB9E,
+ 0x971C, 0x970E, 0x97BC, 0xCBDF, 0x979E, 0x97DF, 0xED60, 0xF6B8, 0xFB5E, 0xED30,
+ 0xF69C, 0xFB4F, 0xDA20, 0xED18, 0xF68E, 0xDA10, 0xED0C, 0xF687, 0xDA08, 0xED06,
+ 0xC960, 0xE4B8, 0xF25E, 0xDB60, 0xC930, 0xE49C, 0xF24F, 0xDB30, 0xED9C, 0xF6CF,
+ 0xB620, 0x9210, 0xC90C, 0xE487, 0xB610, 0xDB0C, 0xB608, 0x9360, 0xC9B8, 0xE4DE,
+ 0xB760, 0x9330, 0xC99C, 0xE4CF, 0xB730, 0xDB9C, 0xEDCF, 0xB718, 0x930C, 0xB70C,
+ 0x93B8, 0xC9DE, 0xB7B8, 0x939C, 0xC9CF, 0xB79C, 0xDBCF, 0xB78E, 0x93DE, 0xB7DE,
+ 0x93CF, 0xB7CF, 0xECB0, 0xF65C, 0xFB2F, 0xD920, 0xEC98, 0xF64E, 0xD910, 0xEC8C,
+ 0xF647, 0xD908, 0xEC86, 0xD904, 0xD902, 0xC8B0, 0xE45C, 0xF22F, 0xD9B0, 0xC898,
+ 0xE44E, 0xB320, 0x9110, 0xECCE, 0xE447, 0xB310, 0x9108, 0xC886, 0xB308, 0xD986,
+ 0xC883, 0x9102, 0x91B0, 0xC8DC, 0xE46F, 0xB3B0, 0x9198, 0xC8CE, 0xB398, 0xD9CE,
+ 0xC8C7, 0xB38C, 0x9186, 0x9183, 0x91DC, 0xC8EF, 0xB3DC, 0x91CE, 0xB3CE, 0x91C7,
+ 0xB3C7, 0xB3EF, 0xD8A0, 0xEC58, 0xF62E, 0xD890, 0xEC4C, 0xF627, 0xD888, 0xEC46,
+ 0xD884, 0xEC43, 0xD882, 0xD881, 0x90A0, 0xC858, 0xE42E, 0xB1A0, 0x9090, 0xC84C,
+ 0xE427, 0xB190, 0xD8CC, 0xEC67, 0xB188, 0x9084, 0xC843, 0xB184, 0xD8C3, 0xB182,
+ 0x90D8, 0xC86E, 0xB1D8, 0x90CC, 0xC867, 0xB1CC, 0xD8E7, 0xB1C6, 0x90C3, 0xB1C3,
+ 0xB1EE, 0xB1E7, 0xD850, 0xEC2C, 0xF617, 0xD848, 0xEC26, 0xD844, 0xEC23, 0xD842,
+ 0xD841, 0x9050, 0xC82C, 0xE417, 0xB0D0, 0x9048, 0xC826, 0xB0C8, 0xD866, 0xC823,
+ 0xB0C4, 0x9042, 0xB0C2, 0x9041, 0x906C, 0xB0EC, 0xB0E6, 0xB0E3, 0xEC16, 0xEC13,
+ 0xD821, 0xC816, 0x9024, 0xB064, 0xB062, 0xB061, 0xC560, 0xE2B8, 0xF15E, 0xC530,
+ 0xE29C, 0x8A20, 0xC518, 0xE28E, 0x8A10, 0xC50C, 0x8A08, 0x8A04, 0x8B60, 0xC5B8,
+ 0xE2DE, 0x8B30, 0xC59C, 0xE2CF, 0x8B18, 0xC58E, 0x8B0C, 0x8B06, 0x8BB8, 0xC5DE,
+ 0x8B9C, 0xC5CF, 0x8B8E, 0x8BDE, 0x8BCF, 0xE6B0, 0xF35C, 0xF9AF, 0xCD20, 0xE698,
+ 0xF34E, 0xCD10, 0xE68C, 0xF347, 0xCD08, 0xE686, 0xCD04, 0xE683, 0xC4B0, 0xE25C,
+ 0xF12F, 0xCDB0, 0xC498, 0xE24E, 0x9B20, 0x8910, 0xE6CE, 0xE247, 0x9B10, 0xCD8C,
+ 0xC486, 0x9B08, 0x8904, 0x9B04, 0x89B0, 0xC4DC, 0xE26F, 0x9BB0, 0x8998, 0xE6EF,
+ 0x9B98, 0xCDCE, 0xC4C7, 0x9B8C, 0x8986, 0x9B86, 0x89DC, 0xC4EF, 0x9BDC, 0x89CE,
+ 0x9BCE, 0x89C7, 0x89EF, 0x9BEF, 0xEEA0, 0xF758, 0xFBAE, 0xEE90, 0xF74C, 0xFBA7,
+ 0xEE88, 0xF746, 0xEE84, 0xF743, 0xEE82, 0xCCA0, 0xE658, 0xF32E, 0xDDA0, 0xCC90,
+ 0xF76E, 0xF327, 0xDD90, 0xEECC, 0xF767, 0xDD88, 0xCC84, 0xE643, 0xDD84, 0xEEC3,
+ 0xCC81, 0x88A0, 0xC458, 0xE22E, 0x99A0, 0x8890, 0xC44C, 0xE227, 0xBBA0, 0x9990,
+ 0xCCCC, 0xE667, 0xBB90, 0xDDCC, 0xEEE7, 0xC443, 0xBB88, 0x9984, 0xCCC3, 0xBB84,
+ 0x8881, 0x88D8, 0xC46E, 0x99D8, 0x88CC, 0xC467, 0xBBD8, 0x99CC, 0xCCE7, 0xBBCC,
+ 0xDDE7, 0x88C3, 0x99C3, 0x88EE, 0x99EE, 0x88E7, 0xBBEE, 0x99E7, 0xEE50, 0xF72C,
+ 0xFB97, 0xEE48, 0xF726, 0xEE44, 0xF723, 0xEE42, 0xEE41, 0xCC50, 0xE62C, 0xF317,
+ 0xDCD0, 0xCC48, 0xF737, 0xDCC8, 0xEE66, 0xE623, 0xDCC4, 0xCC42, 0xDCC2, 0xCC41,
+ 0xDCC1, 0x8850, 0xC42C, 0xE217, 0x98D0, 0x8848, 0xC426, 0xB9D0, 0x98C8, 0xCC66,
+ 0xC423, 0xB9C8, 0xDCE6, 0x8842, 0xB9C4, 0x98C2, 0x8841, 0x98C1, 0x886C, 0xC437,
+ 0x98EC, 0x8866, 0xB9EC, 0x98E6, 0x8863, 0xB9E6, 0x98E3, 0x8877, 0xB9F7, 0xEE28,
+ 0xF716, 0xEE24, 0xF713, 0xEE22, 0xEE21, 0xCC28, 0xE616, 0xDC68, 0xCC24, 0xE613,
+ 0xDC64, 0xEE33, 0xDC62, 0xCC21, 0xDC61, 0x8828, 0xC416, 0x9868, 0x8824, 0xC413,
+ 0xB8E8, 0x9864, 0xCC33, 0xB8E4, 0xDC73, 0x8821, 0xB8E2, 0x9861, 0xB8E1, 0x9876,
+ 0xB8F6, 0xB8F3, 0xF70B, 0xEE11, 0xE60B, 0xCC12, 0xCC11, 0x8814, 0x9834, 0xB874,
+ 0x8811, 0x9831, 0xC2B0, 0x8520, 0xC298, 0x8510, 0xC28C, 0xE147, 0x8508, 0xC286,
+ 0x8504, 0xC283, 0x85B0, 0xC2DC, 0xE16F, 0x8598, 0xC2CE, 0x858C, 0xC2C7, 0x8586,
+ 0x8583, 0x85DC, 0xC2EF, 0x85CE, 0x85C7, 0x85EF, 0xC6A0, 0xE358, 0xF1AE, 0xC690,
+ 0xE34C, 0xC688, 0xE346, 0xC684, 0xE343, 0xC682, 0x84A0, 0xC258, 0xE12E, 0x8DA0,
+ 0x8490, 0xE36E, 0xE127, 0x8D90, 0xC6CC, 0xE367, 0x8D88, 0x8484, 0xC243, 0x8D84,
+ 0xC6C3, 0x8481, 0x84D8, 0xC26E, 0x8DD8, 0x84CC, 0xC267, 0x8DCC, 0xC6E7, 0x8DC6,
+ 0x84C3, 0x84EE, 0x8DEE, 0x84E7, 0x8DE7, 0xE750, 0xF3AC, 0xF9D7, 0xE748, 0xF3A6,
+ 0xE744, 0xF3A3, 0xE742, 0xE741, 0xC650, 0xE32C, 0xCED0, 0xC648, 0xE326, 0xCEC8,
+ 0xE766, 0xE323, 0xCEC4, 0xC642, 0xCEC2, 0xC641, 0xCEC1, 0x8450, 0xC22C, 0x8CD0,
+ 0x8448, 0xE337, 0x9DD0, 0x8CC8, 0xC666, 0xC223, 0x9DC8, 0xCEE6, 0x8442, 0x9DC4,
+ 0x8CC2, 0x8441, 0x8CC1, 0x846C, 0xC237, 0x8CEC, 0x8466, 0x9DEC, 0x8CE6, 0x8463,
+ 0x9DE6, 0x8CE3, 0x8477, 0x8CF7, 0x9DF7, 0xF7A8, 0xFBD6, 0xF7A4, 0xFBD3, 0xF7A2,
+ 0xF7A1, 0xE728, 0xF396, 0xEF68, 0xF7B6, 0xF393, 0xEF64, 0xF7B3, 0xEF62, 0xE721,
+ 0xEF61, 0xC628, 0xE316, 0xCE68, 0xC624, 0xE313, 0xDEE8, 0xCE64, 0xE733, 0xDEE4,
+ 0xEF73, 0xC621, 0xDEE2, 0xCE61, 0xDEE1, 0x8428, 0xC216, 0x8C68, 0x8424, 0xC213,
+ 0x9CE8, 0x8C64, 0xC633, 0xBDE8, 0x9CE4, 0xCE73, 0x8421, 0xBDE4, 0xDEF3, 0x8C61,
+ 0xBDE2, 0x8436, 0x8C76, 0x8433, 0x9CF6, 0x8C73, 0xBDF6, 0x9CF3, 0xBDF3, 0xF794,
+ 0xFBCB, 0xF792, 0xF791, 0xE714, 0xF38B, 0xEF34, 0xF79B, 0xEF32, 0xE711, 0xEF31,
+ 0xC614, 0xE30B, 0xCE34, 0xC612, 0xDE74, 0xCE32, 0xC611, 0xDE72, 0xCE31, 0xDE71,
+ 0x8414, 0xC20B, 0x8C34, 0xC61B, 0x9C74, 0x8C32, 0x8411, 0xBCF4, 0x9C72, 0x8C31,
+ 0xBCF2, 0x9C71, 0xBCF1, 0x8C3B, 0xBCFB, 0xF789, 0xEF1A, 0xEF19, 0xCE1A, 0xDE3A,
+ 0xDE39, 0x8C1A, 0x9C3A, 0xBC7A, 0xBC79, 0x82A0, 0x8290, 0xC14C, 0x8288, 0x8284,
+ 0x8282, 0x82D8, 0x82CC, 0x82C6, 0x82C3, 0x82EE, 0x82E7, 0xC350, 0xC348, 0xE1A6,
+ 0xC344, 0xE1A3, 0xC342, 0xC341, 0x8250, 0xC12C, 0x86D0, 0xC36C, 0xC126, 0x86C8,
+ 0xC366, 0x86C4, 0xC363, 0x86C2, 0x8241, 0x86C1, 0x826C, 0xC137, 0x86EC, 0xC377,
+ 0x86E6, 0x8263, 0x86E3, 0x8277, 0x86F7, 0xE3A8, 0xE3A4, 0xE3A2, 0xE3A1, 0xC328,
+ 0xC768, 0xE3B6, 0xE193, 0xC764, 0xE3B3, 0xC762, 0xC321, 0xC761, 0x8228, 0x8668,
+ 0x8224, 0xC113, 0x8EE8, 0x8664, 0x8222, 0x8EE4, 0x8662, 0x8221, 0x8EE2, 0x8661,
+ 0x8236, 0x8676, 0x8233, 0x8EF6, 0x8673, 0x8EF3, 0xF3D4, 0xF3D2, 0xF3D1, 0xE394,
+ 0xE7B4, 0xF3DB, 0xE7B2, 0xE391, 0xE7B1, 0xC314, 0xE18B, 0xC734, 0xE39B, 0xCF74,
+ 0xC732, 0xC311, 0xCF72, 0xC731, 0xCF71, 0x8214, 0xC10B, 0x8634, 0xC31B, 0x8E74,
+ 0x8632, 0x8211, 0x9EF4, 0x8E72, 0x8631, 0x9EF2, 0x8E71, 0x821B, 0x863B, 0x8E7B,
+ 0x9EFB, 0xFBEA, 0xFBE9, 0xF3CA, 0xF7DA, 0xF3C9, 0xF7D9, 0xE38A, 0xE79A, 0xE389,
+ 0xEFBA, 0xE799, 0xEFB9, 0xC30A, 0xC71A, 0xC309, 0xCF3A, 0xC719, 0xDF7A, 0xFAB0,
+ 0xFD5C, 0xF520, 0xFA98, 0xFD4E, 0xF510, 0xFA8C, 0xFD47, 0xF508, 0xFA86, 0xF504,
+ 0xFA83, 0xF502, 0xF5B0, 0xFADC, 0xFD6F, 0xEB20, 0xF598, 0xFACE, 0xEB10, 0xF58C,
+ 0xFAC7, 0xEB08, 0xF586, 0xEB04, 0xF583, 0xEB02, 0xEBB0, 0xF5DC, 0xFAEF, 0xD720,
+ 0xEB98, 0xF5CE, 0xD710, 0xEB8C, 0xF5C7, 0xD708, 0xEB86, 0xD704, 0xEB83, 0xD702,
+ 0xD7B0, 0xEBDC, 0xF5EF, 0xAF20, 0xD798, 0xEBCE, 0xAF10, 0xD78C, 0xEBC7, 0xAF08,
+ 0xD786, 0xAF04, 0xD783, 0xAFB0, 0xD7DC, 0xEBEF, 0xAF98, 0xD7CE, 0xAF8C, 0xD7C7,
+ 0xAF86, 0xAFDC, 0xD7EF, 0xAFCE, 0xAFC7, 0xF4A0, 0xFA58, 0xFD2E, 0xF490, 0xFA4C,
+ 0xFD27, 0xF488, 0xFA46, 0xF484, 0xFA43, 0xF482, 0xF481, 0xE9A0, 0xF4D8, 0xFA6E,
+ 0xE990, 0xF4CC, 0xFA67, 0xE988, 0xF4C6, 0xE984, 0xF4C3, 0xE982, 0xE981, 0xD3A0,
+ 0xE9D8, 0xF4EE, 0xD390, 0xE9CC, 0xF4E7, 0xD388, 0xE9C6, 0xD384, 0xE9C3, 0xD382,
+ 0xD381, 0xA7A0, 0xD3D8, 0xE9EE, 0xA790, 0xD3CC, 0xE9E7, 0xA788, 0xD3C6, 0xA784,
+ 0xD3C3, 0xA782, 0xA7D8, 0xD3EE, 0xA7CC, 0xD3E7, 0xA7C6, 0xA7C3, 0xA7EE, 0xA7E7,
+ 0xF450, 0xFA2C, 0xFD17, 0xF448, 0xFA26, 0xF444, 0xFA23, 0xF442, 0xF441, 0xE8D0,
+ 0xF46C, 0xFA37, 0xE8C8, 0xF466, 0xE8C4, 0xF463, 0xE8C2, 0xE8C1, 0xD1D0, 0xE8EC,
+ 0xF477, 0xD1C8, 0xE8E6, 0xD1C4, 0xE8E3, 0xD1C2, 0xD1C1, 0xA3D0, 0xD1EC, 0xE8F7,
+ 0xA3C8, 0xD1E6, 0xA3C4, 0xD1E3, 0xA3C2, 0xA3C1, 0xA3EC, 0xD1F7, 0xA3E6, 0xA3E3,
+ 0xA3F7, 0xF428, 0xFA16, 0xF424, 0xFA13, 0xF422, 0xF421, 0xE868, 0xF436, 0xE864,
+ 0xF433, 0xE862, 0xE861, 0xD0E8, 0xE876, 0xD0E4, 0xE873, 0xD0E2, 0xD0E1, 0xA1E8,
+ 0xD0F6, 0xA1E4, 0xD0F3, 0xA1E2, 0xA1E1, 0xA1F6, 0xA1F3, 0xF414, 0xFA0B, 0xF412,
+ 0xF411, 0xE834, 0xF41B, 0xE832, 0xE831, 0xD074, 0xE83B, 0xD072, 0xD071, 0xA0F4,
+ 0xD07B, 0xA0F2, 0xA0F1, 0xF40A, 0xF409, 0xE81A, 0xE819, 0xD03A, 0xD039, 0xF2A0,
+ 0xF958, 0xFCAE, 0xF290, 0xF94C, 0xFCA7, 0xF288, 0xF946, 0xF284, 0xF943, 0xF282,
+ 0xF281, 0xE5A0, 0xF2D8, 0xF96E, 0xE590, 0xF2CC, 0xF967, 0xE588, 0xF2C6, 0xE584,
+ 0xF2C3, 0xE582, 0xE581, 0xCBA0, 0xE5D8, 0xF2EE, 0xCB90, 0xE5CC, 0xF2E7, 0xCB88,
+ 0xE5C6, 0xCB84, 0xE5C3, 0xCB82, 0xCB81, 0x97A0, 0xCBD8, 0xE5EE, 0x9790, 0xCBCC,
+ 0xE5E7, 0x9788, 0xCBC6, 0x9784, 0xCBC3, 0x9782, 0x97D8, 0xCBEE, 0x97CC, 0xCBE7,
+ 0x97C6, 0x97C3, 0x97EE, 0x97E7, 0xFB50, 0xFDAC, 0xB5F8, 0xFB48, 0xFDA6, 0xB4FC,
+ 0xFB44, 0xFDA3, 0xB47E, 0xFB42, 0xFB41, 0xF250, 0xF92C, 0xFC97, 0xF6D0, 0xF248,
+ 0xFDB7, 0xF6C8, 0xFB66, 0xF923, 0xF6C4, 0xF242, 0xF6C2, 0xF241, 0xF6C1, 0xE4D0,
+ 0xF26C, 0xF937, 0xEDD0, 0xE4C8, 0xF266, 0xEDC8, 0xF6E6, 0xF263, 0xEDC4, 0xE4C2,
+ 0xEDC2, 0xE4C1, 0xEDC1, 0xC9D0, 0xE4EC, 0xF277, 0xDBD0, 0xC9C8, 0xE4E6, 0xDBC8,
+ 0xEDE6, 0xE4E3, 0xDBC4, 0xC9C2, 0xDBC2, 0xC9C1, 0xDBC1, 0x93D0, 0xC9EC, 0xE4F7,
+ 0xB7D0, 0x93C8, 0xC9E6, 0xB7C8, 0xDBE6, 0xC9E3, 0xB7C4, 0x93C2, 0xB7C2, 0x93C1,
+ 0x93EC, 0xC9F7, 0xB7EC, 0x93E6, 0xB7E6, 0x93E3, 0xB7E3, 0x93F7, 0xFB28, 0xFD96,
+ 0xB2FC, 0xFB24, 0xFD93, 0xB27E, 0xFB22, 0xB23F, 0xFB21, 0xF228, 0xF916, 0xF668,
+ 0xF224, 0xF913, 0xF664, 0xFB33, 0xF662, 0xF221, 0xF661, 0xE468, 0xF236, 0xECE8,
+ 0xE464, 0xF233, 0xECE4, 0xF673, 0xECE2, 0xE461, 0xECE1, 0xC8E8, 0xE476, 0xD9E8,
+ 0xC8E4, 0xE473, 0xD9E4, 0xECF3, 0xD9E2, 0xC8E1, 0xD9E1, 0x91E8, 0xC8F6, 0xB3E8,
+ 0x91E4, 0xC8F3, 0xB3E4, 0xD9F3, 0xB3E2, 0x91E1, 0xB3E1, 0x91F6, 0xB3F6, 0x91F3,
+ 0xB3F3, 0xFB14, 0xFD8B, 0xB17E, 0xFB12, 0xB13F, 0xFB11, 0xF214, 0xF90B, 0xF634,
+ 0xFB1B, 0xF632, 0xF211, 0xF631, 0xE434, 0xF21B, 0xEC74, 0xE432, 0xEC72, 0xE431,
+ 0xEC71, 0xC874, 0xE43B, 0xD8F4, 0xEC7B, 0xD8F2, 0xC871, 0xD8F1, 0x90F4, 0xC87B,
+ 0xB1F4, 0x90F2, 0xB1F2, 0x90F1, 0xB1F1, 0x90FB, 0xB1FB, 0xFB0A, 0xB0BF, 0xFB09,
+ 0xF20A, 0xF61A, 0xF209, 0xF619, 0xE41A, 0xEC3A, 0xE419, 0xEC39, 0xC83A, 0xD87A,
+ 0xC839, 0xD879, 0x907A, 0xB0FA, 0x9079, 0xB0F9, 0xFB05, 0xF205, 0xF60D, 0xE40D,
+ 0xEC1D, 0xC81D, 0xD83D, 0xF150, 0xF8AC, 0xFC57, 0xF148, 0xF8A6, 0xF144, 0xF8A3,
+ 0xF142, 0xF141, 0xE2D0, 0xF16C, 0xF8B7, 0xE2C8, 0xF166, 0xE2C4, 0xF163, 0xE2C2,
+ 0xE2C1, 0xC5D0, 0xE2EC, 0xF177, 0xC5C8, 0xE2E6, 0xC5C4, 0xE2E3, 0xC5C2, 0xC5C1,
+ 0x8BD0, 0xC5EC, 0xE2F7, 0x8BC8, 0xC5E6, 0x8BC4, 0xC5E3, 0x8BC2, 0x8BC1, 0x8BEC,
+ 0xC5F7, 0x8BE6, 0x8BE3, 0x8BF7, 0xF9A8, 0xFCD6, 0x9AFC, 0xF9A4, 0xFCD3, 0x9A7E,
+ 0xF9A2, 0x9A3F, 0xF9A1, 0xF128, 0xF896, 0xF368, 0xF124, 0xF893, 0xF364, 0xF9B3,
+ 0xF362, 0xF121, 0xF361, 0xE268, 0xF136, 0xE6E8, 0xE264, 0xF133, 0xE6E4, 0xF373,
+ 0xE6E2, 0xE261, 0xE6E1, 0xC4E8, 0xE276, 0xCDE8, 0xC4E4, 0xE273, 0xCDE4, 0xE6F3,
+ 0xCDE2, 0xC4E1, 0xCDE1, 0x89E8, 0xC4F6, 0x9BE8, 0x89E4, 0xC4F3, 0x9BE4, 0xCDF3,
+ 0x9BE2, 0x89E1, 0x9BE1, 0x89F6, 0x9BF6, 0x89F3, 0x9BF3, 0xFDD4, 0xBAF8, 0xDD7E,
+ 0xFDD2, 0xBA7C, 0xDD3F, 0xFDD1, 0xBA3E, 0xBA1F, 0xF994, 0xFCCB, 0x997E, 0xFBB4,
+ 0xFDDB, 0xBB7E, 0x993F, 0xFBB2, 0xF991, 0xBB3F, 0xFBB1, 0xF114, 0xF88B, 0xF334,
+ 0xF112, 0xF774, 0xFBBB, 0xF111, 0xF772, 0xF331, 0xF771, 0xE234, 0xF11B, 0xE674,
+ 0xE232, 0xEEF4, 0xE672, 0xE231, 0xEEF2, 0xE671, 0xEEF1, 0xC474, 0xE23B, 0xCCF4,
+ 0xC472, 0xDDF4, 0xCCF2, 0xC471, 0xDDF2, 0xCCF1, 0xDDF1, 0x88F4, 0xC47B, 0x99F4,
+ 0x88F2, 0xBBF4, 0x99F2, 0x88F1, 0xBBF2, 0x99F1, 0xBBF1, 0x88FB, 0x99FB, 0xFDCA,
+ 0xB97C, 0xDCBF, 0xFDC9, 0xB93E, 0xB91F, 0xF98A, 0x98BF, 0xFB9A, 0xF989, 0xB9BF,
+ 0xFB99, 0xF10A, 0xF31A, 0xF109, 0xF73A, 0xF319, 0xF739, 0xE21A, 0xE63A, 0xE219,
+ 0xEE7A, 0xE639, 0xEE79, 0xC43A, 0xCC7A, 0xC439, 0xDCFA, 0xCC79, 0xDCF9, 0x887A,
+ 0x98FA, 0x8879, 0xB9FA, 0x98F9, 0xB9F9, 0xFDC5, 0xB8BE, 0xB89F, 0xF985, 0xFB8D,
+ 0xF105, 0xF30D, 0xF71D, 0xE20D, 0xE61D, 0xEE3D, 0xC41D, 0xCC3D, 0xDC7D, 0x883D,
+ 0x987D, 0xB8FD, 0xB85F, 0xF0A8, 0xF856, 0xF0A4, 0xF853, 0xF0A2, 0xF0A1, 0xE168,
+ 0xF0B6, 0xE164, 0xF0B3, 0xE162, 0xE161, 0xC2E8, 0xE176, 0xC2E4, 0xE173, 0xC2E2,
+ 0xC2E1, 0x85E8, 0xC2F6, 0x85E4, 0xC2F3, 0x85E2, 0x85E1, 0x85F6, 0x85F3, 0xF8D4,
+ 0xFC6B, 0x8D7E, 0xF8D2, 0x8D3F, 0xF8D1, 0xF094, 0xF84B, 0xF1B4, 0xF092, 0xF1B2,
+ 0xF091, 0xF1B1, 0xE134, 0xF09B, 0xE374, 0xE132, 0xE372, 0xE131, 0xE371, 0xC274,
+ 0xE13B, 0xC6F4, 0xC272, 0xC6F2, 0xC271, 0xC6F1, 0x84F4, 0xC27B, 0x8DF4, 0x84F2,
+ 0x8DF2, 0x84F1, 0x8DF1, 0x84FB, 0x8DFB, 0xFCEA, 0x9D7C, 0xCEBF, 0xFCE9, 0x9D3E,
+ 0x9D1F, 0xF8CA, 0x8CBF, 0xF9DA, 0xF8C9, 0x9DBF, 0xF9D9, 0xF08A, 0xF19A, 0xF089,
+ 0xF3BA, 0xF199, 0xF3B9, 0xE11A, 0xE33A, 0xE119, 0xE77A, 0xE339, 0xE779, 0xC23A,
+ 0xC67A, 0xC239, 0xCEFA, 0xC679, 0xCEF9, 0x847A, 0x8CFA, 0x8479, 0x9DFA, 0x8CF9,
+ 0x9DF9, 0xBD78, 0xDEBE, 0xBD3C, 0xDE9F, 0xBD1E, 0xBD0F, 0xFCE5, 0x9CBE, 0xFDED,
+ 0xBDBE, 0x9C9F, 0xBD9F, 0xF8C5, 0xF9CD, 0xFBDD, 0xF085, 0xF18D, 0xF39D, 0xF7BD,
+ 0xE10D, 0xE31D, 0xE73D, 0xEF7D, 0xC21D, 0xC63D, 0xCE7D, 0xDEFD, 0x843D, 0x8C7D,
+ 0x9CFD, 0xBCBC, 0xDE5F, 0xBC9E, 0xBC8F, 0x9C5F, 0xBCDF, 0xBC5E, 0xBC4F, 0xBC2F,
+ 0xF054, 0xF052, 0xF051, 0xE0B4, 0xF05B, 0xE0B2, 0xE0B1, 0xC174, 0xE0BB, 0xC172,
+ 0xC171, 0x82F4, 0xC17B, 0x82F2, 0x82F1, 0x82FB, 0xF86A, 0x86BF, 0xF869, 0xF04A,
+ 0xF0DA, 0xF049, 0xF0D9, 0xE09A, 0xE1BA, 0xE099, 0xE1B9, 0xC13A, 0xC37A, 0xC139,
+ 0xC379, 0x827A, 0x86FA, 0x8279, 0x86F9, 0xFC75, 0x8EBE, 0x8E9F, 0xF865, 0xF8ED,
+ 0xF045, 0xF0CD, 0xF1DD, 0xE08D, 0xE19D, 0xE3BD, 0xC11D, 0xC33D, 0xC77D, 0x823D,
+ 0x867D, 0x8EFD, 0x9EBC, 0xCF5F, 0x9E9E, 0x9E8F, 0x8E5F, 0x9EDF, 0xBEB8, 0xDF5E,
+ 0xBE9C, 0xDF4F, 0xBE8E, 0xBE87, 0x9E5E, 0xBEDE, 0x9E4F, 0xBECF, 0xBE5C, 0xDF2F,
+ 0xBE4E, 0xBE47, 0x9E2F, 0xBE6F, 0xBE2E, 0xBE27, 0xBE17, 0xE05A, 0xE059, 0xC0BA,
+ 0xC0B9, 0x817A, 0x8179, 0xF06D, 0xE04D, 0xE0DD, 0xC09D, 0xC1BD, 0x813D, 0x837D,
+ 0x875F, 0x8F5E, 0x8F4F, 0x9F5C, 0xCFAF, 0x9F4E, 0x9F47, 0x8F2F, 0x9F6F, 0xBF58,
+ 0xDFAE, 0xBF4C, 0xDFA7, 0xBF46, 0xBF43, 0x9F2E, 0xBF6E, 0x9F27, 0xBF67, 0xBF2C,
+ 0xDF97, 0xBF26, 0xBF23, 0x9F17, 0xBF37, 0xBF16, 0xBF13, 0x87AF, 0x8FAE, 0x8FA7,
+ 0x9FAC, 0xCFD7, 0x9FA6, 0x9FA3, 0x8F97, 0x9FB7, 0x9F96, 0x9F93, 0xD5F0, 0xEAFC,
+ 0xA9E0, 0xD4F8, 0xEA7E, 0xA8F0, 0xD47C, 0xEA3F, 0xA878, 0xD43E, 0xA83C, 0xFD68,
+ 0xADF0, 0xD6FC, 0xFD64, 0xACF8, 0xD67E, 0xFD62, 0xAC7C, 0xD63F, 0xFD61, 0xAC3E,
+ 0xFAE8, 0xFD76, 0xAEFC, 0xFAE4, 0xFD73, 0xAE7E, 0xFAE2, 0xAE3F, 0xFAE1, 0xF5E8,
+ 0xFAF6, 0xF5E4, 0xFAF3, 0xF5E2, 0xF5E1, 0xEBE8, 0xF5F6, 0xEBE4, 0xF5F3, 0xEBE2,
+ 0xEBE1, 0xD7E8, 0xEBF6, 0xD7E4, 0xEBF3, 0xD7E2, 0xA5E0, 0xD2F8, 0xE97E, 0xA4F0,
+ 0xD27C, 0xE93F, 0xA478, 0xD23E, 0xA43C, 0xD21F, 0xA41E, 0xFD34, 0xA6F8, 0xD37E,
+ 0xFD32, 0xA67C, 0xD33F, 0xFD31, 0xA63E, 0xA61F, 0xFA74, 0xFD3B, 0xA77E, 0xFA72,
+ 0xA73F, 0xFA71, 0xF4F4, 0xFA7B, 0xF4F2, 0xF4F1, 0xE9F4, 0xF4FB, 0xE9F2, 0xE9F1,
+ 0xD3F4, 0xE9FB, 0xD3F2, 0xD3F1, 0xA2F0, 0xD17C, 0xE8BF, 0xA278, 0xD13E, 0xA23C,
+ 0xD11F, 0xA21E, 0xA20F, 0xFD1A, 0xA37C, 0xD1BF, 0xFD19, 0xA33E, 0xA31F, 0xFA3A,
+ 0xA3BF, 0xFA39, 0xF47A, 0xF479, 0xE8FA, 0xE8F9, 0xD1FA, 0xD1F9, 0xA178, 0xD0BE,
+ 0xA13C, 0xD09F, 0xA11E, 0xA10F, 0xFD0D, 0xA1BE, 0xA19F, 0xFA1D, 0xF43D, 0xE87D,
+ 0xA0BC, 0xD05F, 0xA09E, 0xA08F, 0xA0DF, 0xA05E, 0xA04F, 0x95E0, 0xCAF8, 0xE57E,
+ 0x94F0, 0xCA7C, 0xE53F, 0x9478, 0xCA3E, 0x943C, 0xCA1F, 0x941E, 0xFCB4, 0x96F8,
+ 0xCB7E, 0xFCB2, 0x967C, 0xCB3F, 0xFCB1, 0x963E, 0x961F, 0xF974, 0xFCBB, 0x977E,
+ 0xF972, 0x973F, 0xF971, 0xF2F4, 0xF97B, 0xF2F2, 0xF2F1, 0xE5F4, 0xF2FB, 0xE5F2,
+ 0xE5F1, 0xCBF4, 0xE5FB, 0xCBF2, 0xCBF1, 0xDAF0, 0xED7C, 0xF6BF, 0xB4E0, 0xDA78,
+ 0xED3E, 0xB470, 0xDA3C, 0xED1F, 0xB438, 0xDA1E, 0xB41C, 0xDA0F, 0xB40E, 0x92F0,
+ 0xC97C, 0xE4BF, 0xB6F0, 0x9278, 0xC93E, 0xB678, 0xDB3E, 0xC91F, 0xB63C, 0x921E,
+ 0xB61E, 0x920F, 0xB60F, 0xFC9A, 0x937C, 0xC9BF, 0xFDBA, 0xFC99, 0xB77C, 0x933E,
+ 0xFDB9, 0xB73E, 0x931F, 0xB71F, 0xF93A, 0x93BF, 0xFB7A, 0xF939, 0xB7BF, 0xFB79,
+ 0xF27A, 0xF6FA, 0xF279, 0xF6F9, 0xE4FA, 0xEDFA, 0xE4F9, 0xEDF9, 0xC9FA, 0xC9F9,
+ 0xB2E0, 0xD978, 0xECBE, 0xB270, 0xD93C, 0xEC9F, 0xB238, 0xD91E, 0xB21C, 0xD90F,
+ 0xB20E, 0xB207, 0x9178, 0xC8BE, 0xB378, 0x913C, 0xC89F, 0xB33C, 0xD99F, 0xB31E,
+ 0x910F, 0xB30F, 0xFC8D, 0x91BE, 0xFD9D, 0xB3BE, 0x919F, 0xB39F, 0xF91D, 0xFB3D,
+ 0xF23D, 0xF67D, 0xE47D, 0xECFD, 0xC8FD, 0xB170, 0xD8BC, 0xEC5F, 0xB138, 0xD89E,
+ 0xB11C, 0xD88F, 0xB10E, 0xB107, 0x90BC, 0xC85F, 0xB1BC, 0x909E, 0xB19E, 0x908F,
+ 0xB18F, 0x90DF, 0xB1DF, 0xB0B8, 0xD85E, 0xB09C, 0xD84F, 0xB08E, 0xB087, 0x905E,
+ 0xB0DE, 0x904F, 0xB0CF, 0xB05C, 0xD82F, 0xB04E, 0xB047, 0x902F, 0xB06F, 0xB02E,
+ 0xB027, 0x8AF0, 0xC57C, 0xE2BF, 0x8A78, 0xC53E, 0x8A3C, 0xC51F, 0x8A1E, 0x8A0F,
+ 0xFC5A, 0x8B7C, 0xC5BF, 0xFC59, 0x8B3E, 0x8B1F, 0xF8BA, 0x8BBF, 0xF8B9, 0xF17A,
+ 0xF179, 0xE2FA, 0xE2F9, 0xC5FA, 0xC5F9, 0x9AE0, 0xCD78, 0xE6BE, 0x9A70, 0xCD3C,
+ 0xE69F, 0x9A38, 0xCD1E, 0x9A1C, 0xCD0F, 0x9A0E, 0x9A07, 0x8978, 0xC4BE, 0x9B78,
+ 0x893C, 0xC49F, 0x9B3C, 0xCD9F, 0x9B1E, 0x890F, 0x9B0F, 0xFC4D, 0x89BE, 0xFCDD,
+ 0x9BBE, 0x899F, 0x9B9F, 0xF89D, 0xF9BD, 0xF13D, 0xF37D, 0xE27D, 0xE6FD, 0xC4FD,
+ 0xDD70, 0xEEBC, 0xF75F, 0xBA60, 0xDD38, 0xEE9E, 0xBA30, 0xDD1C, 0xEE8F, 0xBA18,
+ 0xDD0E, 0xBA0C, 0xDD07, 0xBA06, 0x9970, 0xCCBC, 0xE65F, 0xBB70, 0x9938, 0xCC9E,
+ 0xBB38, 0xDD9E, 0xCC8F, 0xBB1C, 0x990E, 0xBB0E, 0x9907, 0xBB07, 0x88BC, 0xC45F,
+ 0x99BC, 0x889E, 0xBBBC, 0x999E, 0x888F, 0xBB9E, 0x998F, 0xBB8F, 0x88DF, 0x99DF,
+ 0xBBDF, 0xB960, 0xDCB8, 0xEE5E, 0xB930, 0xDC9C, 0xEE4F, 0xB918, 0xDC8E, 0xB90C,
+ 0xDC87, 0xB906, 0xB903, 0x98B8, 0xCC5E, 0xB9B8, 0x989C, 0xCC4F, 0xB99C, 0xDCCF,
+ 0xB98E, 0x9887, 0xB987, 0x885E, 0x98DE, 0x884F, 0xB9DE, 0x98CF, 0xB9CF, 0xB8B0,
+ 0xDC5C, 0xEE2F, 0xB898, 0xDC4E, 0xB88C, 0xDC47, 0xB886, 0xB883, 0x985C, 0xCC2F,
+ 0xB8DC, 0x984E, 0xB8CE, 0x9847, 0xB8C7, 0x882F, 0x986F, 0xB8EF, 0xB858, 0xDC2E,
+ 0xB84C, 0xDC27, 0xB846, 0xB843, 0x982E, 0xB86E, 0x9827, 0xB867, 0xB82C, 0xDC17,
+ 0xB826, 0xB823, 0x9817, 0xB837, 0xB816, 0xB813, 0x8578, 0xC2BE, 0x853C, 0xC29F,
+ 0x851E, 0x850F, 0x85BE, 0x859F, 0xF85D, 0xF0BD, 0xE17D, 0xC2FD, 0x8D70, 0xC6BC,
+ 0xE35F, 0x8D38, 0xC69E, 0x8D1C, 0xC68F, 0x8D0E, 0x8D07, 0x84BC, 0xC25F, 0x8DBC,
+ 0x849E, 0x8D9E, 0x848F, 0x8D8F, 0x84DF, 0x8DDF, 0x9D60, 0xCEB8, 0xE75E, 0x9D30,
+ 0xCE9C, 0xE74F, 0x9D18, 0xCE8E, 0x9D0C, 0xCE87, 0x9D06, 0x9D03, 0x8CB8, 0xC65E,
+ 0x9DB8, 0x8C9C, 0xC64F, 0x9D9C, 0x8C8E, 0x9D8E, 0x8C87, 0x9D87, 0x845E, 0x8CDE,
+ 0x844F, 0x9DDE, 0x8CCF, 0x9DCF, 0xDEB0, 0xEF5C, 0xF7AF, 0xBD20, 0xDE98, 0xEF4E,
+ 0xBD10, 0xDE8C, 0xEF47, 0xBD08, 0xDE86, 0xBD04, 0xDE83, 0xBD02, 0x9CB0, 0xCE5C,
+ 0xE72F, 0xBDB0, 0x9C98, 0xCE4E, 0xBD98, 0xDECE, 0xCE47, 0xBD8C, 0x9C86, 0xBD86,
+ 0x9C83, 0xBD83, 0x8C5C, 0xC62F, 0x9CDC, 0x8C4E, 0xBDDC, 0x9CCE, 0x8C47, 0xBDCE,
+ 0x9CC7, 0xBDC7, 0x842F, 0x8C6F, 0x9CEF, 0xBDEF, 0xBCA0, 0xDE58, 0xEF2E, 0xBC90,
+ 0xDE4C, 0xEF27, 0xBC88, 0xDE46, 0xBC84, 0xDE43, 0xBC82, 0xBC81, 0x9C58, 0xCE2E,
+ 0xBCD8, 0x9C4C, 0xCE27, 0xBCCC, 0xDE67, 0xBCC6, 0x9C43, 0xBCC3, 0x8C2E, 0x9C6E,
+ 0x8C27, 0xBCEE, 0x9C67, 0xBCE7, 0xBC50, 0xDE2C, 0xEF17, 0xBC48, 0xDE26, 0xBC44,
+ 0xDE23, 0xBC42, 0xBC41, 0x9C2C, 0xCE17, 0xBC6C, 0x9C26, 0xBC66, 0x9C23, 0xBC63,
+ 0x8C17, 0x9C37, 0xBC77, 0xBC28, 0xDE16, 0xBC24, 0xDE13, 0xBC22, 0xBC21, 0x9C16,
+ 0xBC36, 0x9C13, 0xBC33, 0xBC14, 0xDE0B, 0xBC12, 0xBC11, 0x9C0B, 0xBC1B, 0x82BC,
+ 0xC15F, 0x829E, 0x828F, 0x82DF, 0x86B8, 0xC35E, 0x869C, 0xC34F, 0x868E, 0x8687,
+ 0x825E, 0x86DE, 0x824F, 0x86CF, 0x8EB0, 0xC75C, 0xE3AF, 0x8E98, 0xC74E, 0x8E8C,
+ 0xC747, 0x8E86, 0x8E83, 0x865C, 0xC32F, 0x8EDC, 0x864E, 0x8ECE, 0x8647, 0x8EC7,
+ 0x822F, 0x866F, 0x8EEF, 0x9EA0, 0xCF58, 0xE7AE, 0x9E90, 0xCF4C, 0xE7A7, 0x9E88,
+ 0xCF46, 0x9E84, 0xCF43, 0x9E82, 0x9E81, 0x8E58, 0xC72E, 0x9ED8, 0x8E4C, 0xC727,
+ 0x9ECC, 0xCF67, 0x9EC6, 0x8E43, 0x9EC3, 0x862E, 0x8E6E, 0x8627, 0x9EEE, 0x8E67,
+ 0x9EE7, 0xDF50, 0xEFAC, 0xF7D7, 0xDF48, 0xEFA6, 0xDF44, 0xEFA3, 0xDF42, 0xDF41,
+ 0x9E50, 0xCF2C, 0xE797, 0xBED0, 0x9E48, 0xCF26, 0xBEC8, 0xDF66, 0xCF23, 0xBEC4,
+ 0x9E42, 0xBEC2, 0x9E41, 0xBEC1, 0x8E2C, 0xC717, 0x9E6C, 0x8E26, 0xBEEC, 0x9E66,
+ 0x8E23, 0xBEE6, 0x9E63, 0xBEE3, 0x8617, 0x8E37, 0x9E77, 0xBEF7, 0xDF28, 0xEF96,
+ 0xDF24, 0xEF93, 0xDF22, 0xDF21, 0x9E28, 0xCF16, 0xBE68, 0x9E24, 0xCF13, 0xBE64,
+ 0xDF33, 0xBE62, 0x9E21, 0xBE61, 0x8E16, 0x9E36, 0x8E13, 0xBE76, 0x9E33, 0xBE73,
+ 0xDF14, 0xEF8B, 0xDF12, 0xDF11, 0x9E14, 0xCF0B, 0xBE34, 0x9E12, 0xBE32, 0x9E11,
+ 0xBE31, 0x8E0B, 0x9E1B, 0xBE3B, 0xDF0A, 0xDF09, 0x9E0A, 0xBE1A, 0x9E09, 0xBE19,
+ 0x815E, 0x814F, 0x835C, 0xC1AF, 0x834E, 0x8347, 0x812F, 0x836F, 0x8758, 0xC3AE,
+ 0x874C, 0xC3A7, 0x8746, 0x8743, 0x832E, 0x876E, 0x8327, 0x8767, 0x8F50, 0xC7AC,
+ 0xE3D7, 0x8F48, 0xC7A6, 0x8F44, 0xC7A3, 0x8F42, 0x8F41, 0x872C, 0xC397, 0x8F6C,
+ 0xC7B7, 0x8F66, 0x8723, 0x8F63, 0x8317, 0x8737, 0x8F77, 0xCFA8, 0xE7D6, 0xCFA4,
+ 0xE7D3, 0xCFA2, 0xCFA1, 0x8F28, 0xC796, 0x9F68, 0xCFB6, 0xC793, 0x9F64, 0x8F22,
+ 0x9F62, 0x8F21, 0x9F61, 0x8716, 0x8F36, 0x8713, 0x9F76, 0x8F33, 0x9F73, 0xEFD4,
+ 0xF7EB, 0xEFD2, 0xEFD1, 0xCF94, 0xE7CB, 0xDFB4, 0xCF92, 0xDFB2, 0xCF91, 0xDFB1,
+ 0x8F14, 0xC78B, 0x9F34, 0x8F12, 0xBF74, 0x9F32, 0x8F11, 0xBF72, 0x9F31, 0xBF71,
+ 0x870B, 0x8F1B, 0x9F3B, 0xBF7B, 0xEFCA, 0xEFC9, 0xCF8A, 0xDF9A, 0xCF89, 0xDF99,
+ 0x8F0A, 0x9F1A, 0x8F09, 0xBF3A, 0x9F19, 0xBF39, 0xEFC5, 0xCF85, 0xDF8D, 0x8F05,
+ 0x9F0D, 0xBF1D, 0x81AE, 0x81A7, 0x83AC, 0xC1D7, 0x83A6, 0x83A3, 0x8197, 0x83B7,
+ 0x87A8, 0xC3D6, 0x87A4, 0xC3D3, 0x87A2, 0x87A1, 0x8396, 0x87B6, 0x8393, 0x87B3,
+ 0xC7D4, 0xE3EB, 0xC7D2, 0xC7D1, 0x8794, 0xC3CB, 0x8FB4, 0xC7DB, 0x8FB2, 0x8791,
+ 0x8FB1, 0x838B, 0x879B, 0x8FBB, 0xE7EA, 0xE7E9, 0xC7CA, 0xCFDA, 0xC7C9, 0xCFD9,
+ 0x878A, 0x8F9A, 0x8789, 0x9FBA, 0x8F99, 0x9FB9, 0xE7E5, 0xC7C5, 0xCFCD, 0x8785,
+ 0x8F8D, 0x9F9D, 0x81D6, 0x81D3, 0x83D4, 0xC1EB, 0x83D2, 0x83D1, 0x81CB, 0x83DB,
+ 0xC3EA, 0xC3E9, 0x83CA, 0x87DA, 0x83C9, 0x87D9, 0xE3F5
+};
+
+/* MicroPDF417 coefficients from ISO/IEC 24728:2006 Annex F */
+static const unsigned short int Microcoeffs[344] = {
+ /* k = 7 */
+ 76, 925, 537, 597, 784, 691, 437,
+
+ /* k = 8 */
+ 237, 308, 436, 284, 646, 653, 428, 379,
+
+ /* k = 9 */
+ 567, 527, 622, 257, 289, 362, 501, 441, 205,
+
+ /* k = 10 */
+ 377, 457, 64, 244, 826, 841, 818, 691, 266, 612,
+
+ /* k = 11 */
+ 462, 45, 565, 708, 825, 213, 15, 68, 327, 602, 904,
+
+ /* k = 12 */
+ 597, 864, 757, 201, 646, 684, 347, 127, 388, 7, 69, 851,
+
+ /* k = 13 */
+ 764, 713, 342, 384, 606, 583, 322, 592, 678, 204, 184, 394, 692,
+
+ /* k = 14 */
+ 669, 677, 154, 187, 241, 286, 274, 354, 478, 915, 691, 833, 105, 215,
+
+ /* k = 15 */
+ 460, 829, 476, 109, 904, 664, 230, 5, 80, 74, 550, 575, 147, 868, 642,
+
+ /* k = 16 */
+ 274, 562, 232, 755, 599, 524, 801, 132, 295, 116, 442, 428, 295, 42, 176, 65,
+
+ /* k = 18 */
+ 279, 577, 315, 624, 37, 855, 275, 739, 120, 297, 312, 202, 560, 321, 233, 756,
+ 760, 573,
+
+ /* k = 21 */
+ 108, 519, 781, 534, 129, 425, 681, 553, 422, 716, 763, 693, 624, 610, 310, 691,
+ 347, 165, 193, 259, 568,
+
+ /* k = 26 */
+ 443, 284, 887, 544, 788, 93, 477, 760, 331, 608, 269, 121, 159, 830, 446, 893,
+ 699, 245, 441, 454, 325, 858, 131, 847, 764, 169,
+
+ /* k = 32 */
+ 361, 575, 922, 525, 176, 586, 640, 321, 536, 742, 677, 742, 687, 284, 193, 517,
+ 273, 494, 263, 147, 593, 800, 571, 320, 803, 133, 231, 390, 685, 330, 63, 410,
+
+ /* k = 38 */
+ 234, 228, 438, 848, 133, 703, 529, 721, 788, 322, 280, 159, 738, 586, 388, 684,
+ 445, 680, 245, 595, 614, 233, 812, 32, 284, 658, 745, 229, 95, 689, 920, 771,
+ 554, 289, 231, 125, 117, 518,
+
+ /* k = 44 */
+ 476, 36, 659, 848, 678, 64, 764, 840, 157, 915, 470, 876, 109, 25, 632, 405,
+ 417, 436, 714, 60, 376, 97, 413, 706, 446, 21, 3, 773, 569, 267, 272, 213,
+ 31, 560, 231, 758, 103, 271, 572, 436, 339, 730, 82, 285,
+
+ /* k = 50 */
+ 923, 797, 576, 875, 156, 706, 63, 81, 257, 874, 411, 416, 778, 50, 205, 303,
+ 188, 535, 909, 155, 637, 230, 534, 96, 575, 102, 264, 233, 919, 593, 865, 26,
+ 579, 623, 766, 146, 10, 739, 246, 127, 71, 244, 211, 477, 920, 876, 427, 820,
+ 718, 435
+};
+
+/* rows, columns, error codewords, k-offset of valid MicroPDF417 sizes from ISO/IEC 24728:2006 */
+static const unsigned short int MicroVariants[170] ={
+ 1, 1, 1, 1, 1, 1, 2, 2, 2, 2, 2, 2, 2, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,
+ 11, 14, 17, 20, 24, 28, 8, 11, 14, 17, 20, 23, 26, 6, 8, 10, 12, 15, 20, 26, 32, 38, 44, 4, 6, 8, 10, 12, 15, 20, 26, 32, 38, 44,
+ 7, 7, 7, 8, 8, 8, 8, 9, 9, 10, 11, 13, 15, 12, 14, 16, 18, 21, 26, 32, 38, 44, 50, 8, 12, 14, 16, 18, 21, 26, 32, 38, 44, 50,
+ 0, 0, 0, 7, 7, 7, 7, 15, 15, 24, 34, 57, 84, 45, 70, 99, 115, 133, 154, 180, 212, 250, 294, 7, 45, 70, 99, 115, 133, 154, 180, 212, 250, 294
+};
+/* rows, columns, error codewords, k-offset */
+
+/* following is Left RAP, Centre RAP, Right RAP and Start Cluster from ISO/IEC 24728:2006 tables 10, 11 and 12 */
+static const char RAPTable[136] ={
+ 1, 8, 36, 19, 9, 25, 1, 1, 8, 36, 19, 9, 27, 1, 7, 15, 25, 37, 1, 1, 21, 15, 1, 47, 1, 7, 15, 25, 37, 1, 1, 21, 15, 1,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 7, 15, 25, 37, 17, 9, 29, 31, 25, 19, 1, 7, 15, 25, 37, 17, 9, 29, 31, 25,
+ 9, 8, 36, 19, 17, 33, 1, 9, 8, 36, 19, 17, 35, 1, 7, 15, 25, 37, 33, 17, 37, 47, 49, 43, 1, 7, 15, 25, 37, 33, 17, 37, 47, 49,
+ 0, 3, 6, 0, 6, 0, 0, 0, 3, 6, 0, 6, 6, 0, 0, 6, 0, 0, 0, 0, 6, 6, 0, 3, 0, 0, 6, 0, 0, 0, 0, 6, 6, 0
+};
+
+/* Left and Right Row Address Pattern from Table 2 */
+static const unsigned short int rap_side[52] = {
+ 0x322, 0x3A2, 0x3B2, 0x332, 0x372, 0x37A, 0x33A, 0x3BA, 0x39A, 0x3DA,
+ 0x3CA, 0x38A, 0x30A, 0x31A, 0x312, 0x392, 0x3D2, 0x3D6, 0x3D4, 0x394,
+ 0x3B4, 0x3A4, 0x3A6, 0x3AE, 0x3AC, 0x3A8, 0x328, 0x32C, 0x32E, 0x326,
+ 0x336, 0x3B6, 0x396, 0x316, 0x314, 0x334, 0x374, 0x364, 0x366, 0x36E,
+ 0x36C, 0x368, 0x348, 0x358, 0x35C, 0x35E, 0x34E, 0x34C, 0x344, 0x346,
+ 0x342, 0x362
+};
+
+/* Centre Row Address Pattern from Table 2 */
+static const unsigned short int rap_centre[52] = {
+ 0x2CE, 0x24E, 0x26E, 0x22E, 0x226, 0x236, 0x216, 0x212, 0x21A, 0x23A,
+ 0x232, 0x222, 0x262, 0x272, 0x27A, 0x2FA, 0x2F2, 0x2F6, 0x276, 0x274,
+ 0x264, 0x266, 0x246, 0x242, 0x2C2, 0x2E2, 0x2E6, 0x2E4, 0x2EC, 0x26C,
+ 0x22C, 0x228, 0x268, 0x2E8, 0x2C8, 0x2CC, 0x2C4, 0x2C6, 0x286, 0x28E,
+ 0x28C, 0x29C, 0x298, 0x2B8, 0x2B0, 0x290, 0x2D0, 0x250, 0x258, 0x25C,
+ 0x2DC, 0x2DE
+};
+
+void byteprocess(int *chainemc, int *mclength, unsigned char chaine[], int start, int length, int block);
\ No newline at end of file
diff --git a/3rdparty/zint-2.6.1/backend/plessey.c b/3rdparty/zint-2.6.1/backend/plessey.c
new file mode 100644
index 0000000..1154845
--- /dev/null
+++ b/3rdparty/zint-2.6.1/backend/plessey.c
@@ -0,0 +1,492 @@
+/* plessey.c - Handles Plessey and MSI Plessey */
+
+/*
+ libzint - the open source barcode library
+ Copyright (C) 2008-2017 Robin Stuart
+
+ Redistribution and use in source and binary forms, with or without
+ modification, are permitted provided that the following conditions
+ are met:
+
+ 1. Redistributions of source code must retain the above copyright
+ notice, this list of conditions and the following disclaimer.
+ 2. Redistributions in binary form must reproduce the above copyright
+ notice, this list of conditions and the following disclaimer in the
+ documentation and/or other materials provided with the distribution.
+ 3. Neither the name of the project nor the names of its contributors
+ may be used to endorse or promote products derived from this software
+ without specific prior written permission.
+
+ THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND
+ ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+ ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE
+ FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+ DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
+ OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
+ HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
+ LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
+ OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+ SUCH DAMAGE.
+ */
+
+#include
+#include
+#include
+#include "common.h"
+
+
+#define SSET "0123456789ABCDEF"
+static const char *PlessTable[16] = {
+ "13131313", "31131313", "13311313", "31311313", "13133113", "31133113",
+ "13313113", "31313113", "13131331", "31131331", "13311331", "31311331", "13133131",
+ "31133131", "13313131", "31313131"
+};
+
+static const char *MSITable[10] = {
+ "12121212", "12121221", "12122112", "12122121", "12211212", "12211221",
+ "12212112", "12212121", "21121212", "21121221"
+};
+
+/* Not MSI/Plessey but the older Plessey standard */
+int plessey(struct zint_symbol *symbol, unsigned char source[], const size_t length) {
+
+ unsigned int i, check;
+ unsigned char *checkptr;
+ static const char grid[9] = {1, 1, 1, 1, 0, 1, 0, 0, 1};
+ char dest[1024]; /* 8 + 65 * 8 + 8 * 2 + 9 + 1 ~ 1024 */
+ int error_number;
+
+ if (length > 65) {
+ strcpy(symbol->errtxt, "370: Input too long");
+ return ZINT_ERROR_TOO_LONG;
+ }
+ error_number = is_sane(SSET, source, length);
+ if (error_number == ZINT_ERROR_INVALID_DATA) {
+ strcpy(symbol->errtxt, "371: Invalid characters in data");
+ return error_number;
+ }
+ checkptr = (unsigned char *) calloc(1, length * 4 + 8);
+
+ /* Start character */
+ strcpy(dest, "31311331");
+
+ /* Data area */
+ for (i = 0; i < length; i++) {
+ check = posn(SSET, source[i]);
+ lookup(SSET, PlessTable, source[i], dest);
+ checkptr[4 * i] = check & 1;
+ checkptr[4 * i + 1] = (check >> 1) & 1;
+ checkptr[4 * i + 2] = (check >> 2) & 1;
+ checkptr[4 * i + 3] = (check >> 3) & 1;
+ }
+
+ /* CRC check digit code adapted from code by Leonid A. Broukhis
+ used in GNU Barcode */
+
+ for (i = 0; i < (4 * length); i++) {
+ int j;
+ if (checkptr[i])
+ for (j = 0; j < 9; j++)
+ checkptr[i + j] ^= grid[j];
+ }
+
+ for (i = 0; i < 8; i++) {
+ switch (checkptr[length * 4 + i]) {
+ case 0: strcat(dest, "13");
+ break;
+ case 1: strcat(dest, "31");
+ break;
+ }
+ }
+
+ /* Stop character */
+ strcat(dest, "331311313");
+
+ expand(symbol, dest);
+ ustrcpy(symbol->text, source);
+ free(checkptr);
+ return error_number;
+}
+
+/* Plain MSI Plessey - does not calculate any check character */
+int msi_plessey(struct zint_symbol *symbol, unsigned char source[], const size_t length) {
+
+ size_t i;
+ char dest[512]; /* 2 + 55 * 8 + 3 + 1 ~ 512 */
+
+ if (length > 55) {
+ strcpy(symbol->errtxt, "372: Input too long");
+ return ZINT_ERROR_TOO_LONG;
+ }
+
+ /* start character */
+ strcpy(dest, "21");
+
+ for (i = 0; i < length; i++) {
+ lookup(NEON, MSITable, source[i], dest);
+ }
+
+ /* Stop character */
+ strcat(dest, "121");
+
+ expand(symbol, dest);
+ ustrcpy(symbol->text, source);
+ return 0;
+}
+
+/* MSI Plessey with Modulo 10 check digit - algorithm from Barcode Island
+ * http://www.barcodeisland.com/ */
+int msi_plessey_mod10(struct zint_symbol *symbol, unsigned char source[], int length) {
+
+
+ unsigned long i, wright, dau, pedwar, pump, n;
+ char un[200], tri[32];
+ int error_number, h;
+ char dest[1000];
+
+ error_number = 0;
+
+ if (length > 18) {
+ strcpy(symbol->errtxt, "373: Input too long");
+ return ZINT_ERROR_TOO_LONG;
+ }
+
+ /* start character */
+ strcpy(dest, "21");
+
+ /* draw data section */
+ for (i = 0; i < length; i++) {
+ lookup(NEON, MSITable, source[i], dest);
+ }
+
+ /* calculate check digit */
+ wright = 0;
+ n = !(length & 1);
+ for (i = n; i < length; i += 2) {
+ un[wright++] = source[i];
+ }
+ un[wright] = '\0';
+
+ dau = strtoul(un, NULL, 10);
+ dau *= 2;
+
+ sprintf(tri, "%ld", dau);
+
+ pedwar = 0;
+ h = strlen(tri);
+ for (i = 0; i < h; i++) {
+ pedwar += ctoi(tri[i]);
+ }
+
+ n = length & 1;
+ for (i = n; i < length; i += 2) {
+ pedwar += ctoi(source[i]);
+ }
+
+ pump = (10 - pedwar % 10);
+ if (pump == 10) {
+ pump = 0;
+ }
+
+ /* draw check digit */
+ lookup(NEON, MSITable, itoc(pump), dest);
+
+ /* Stop character */
+ strcat(dest, "121");
+ expand(symbol, dest);
+
+ ustrcpy(symbol->text, source);
+ symbol->text[length] = itoc(pump);
+ symbol->text[length + 1] = '\0';
+ return error_number;
+}
+
+/* MSI Plessey with two Modulo 10 check digits - algorithm from
+ * Barcode Island http://www.barcodeisland.com/ */
+int msi_plessey_mod1010(struct zint_symbol *symbol, unsigned char source[], const unsigned int src_len) {
+
+
+ unsigned long i, n, wright, dau, pedwar, pump, chwech;
+ char un[16], tri[32];
+ int error_number, h;
+ char dest[1000];
+
+ error_number = 0;
+
+ if (src_len > 18) {
+ /* No Entry Stack Smashers! limit because of str->number conversion*/
+ strcpy(symbol->errtxt, "374: Input too long");
+ return ZINT_ERROR_TOO_LONG;
+ }
+
+ /* start character */
+ strcpy(dest, "21");
+
+ /* draw data section */
+ for (i = 0; i < src_len; i++) {
+ lookup(NEON, MSITable, source[i], dest);
+ }
+
+ /* calculate first check digit */
+ wright = 0;
+
+ n = !(src_len & 1);
+ for (i = n; i < src_len; i += 2) {
+ un[wright++] = source[i];
+ }
+ un[wright] = '\0';
+
+ dau = strtoul(un, NULL, 10);
+ dau *= 2;
+
+ sprintf(tri, "%ld", dau);
+
+ pedwar = 0;
+ h = strlen(tri);
+ for (i = 0; i < h; i++) {
+ pedwar += ctoi(tri[i]);
+ }
+
+ n = src_len & 1;
+ for (i = n; i < src_len; i += 2) {
+ pedwar += ctoi(source[i]);
+ }
+
+ pump = 10 - pedwar % 10;
+ if (pump == 10) {
+ pump = 0;
+ }
+
+ /* calculate second check digit */
+ wright = 0;
+ n = src_len & 1;
+ for (i = n; i < src_len; i += 2) {
+ un[wright++] = source[i];
+ }
+ un[wright++] = itoc(pump);
+ un[wright] = '\0';
+
+ dau = strtoul(un, NULL, 10);
+ dau *= 2;
+
+ sprintf(tri, "%ld", dau);
+
+ pedwar = 0;
+ h = strlen(tri);
+ for (i = 0; i < h; i++) {
+ pedwar += ctoi(tri[i]);
+ }
+
+
+ i = !(src_len & 1);
+ for (; i < src_len; i += 2) {
+ pedwar += ctoi(source[i]);
+ }
+
+ chwech = 10 - pedwar % 10;
+ if (chwech == 10) {
+ chwech = 0;
+ }
+
+ /* Draw check digits */
+ lookup(NEON, MSITable, itoc(pump), dest);
+ lookup(NEON, MSITable, itoc(chwech), dest);
+
+ /* Stop character */
+ strcat(dest, "121");
+
+ expand(symbol, dest);
+
+ ustrcpy(symbol->text, source);
+ symbol->text[src_len] = itoc(pump);
+ symbol->text[src_len + 1] = itoc(chwech);
+ symbol->text[src_len + 2] = '\0';
+
+ return error_number;
+}
+
+/* Calculate a Modulo 11 check digit using the system discussed on Wikipedia -
+ see http://en.wikipedia.org/wiki/Talk:MSI_Barcode */
+int msi_plessey_mod11(struct zint_symbol *symbol, unsigned char source[], const unsigned int src_len) {
+ /* uses the IBM weight system */
+ int i, weight, x, check;
+ int error_number;
+ char dest[1000];
+
+ error_number = 0;
+
+ if (src_len > 55) {
+ strcpy(symbol->errtxt, "375: Input too long");
+ return ZINT_ERROR_TOO_LONG;
+ }
+
+ /* start character */
+ strcpy(dest, "21");
+
+ /* draw data section */
+ for (i = 0; i < src_len; i++) {
+ lookup(NEON, MSITable, source[i], dest);
+ }
+
+ /* calculate check digit */
+ x = 0;
+ weight = 2;
+ for (i = src_len - 1; i >= 0; i--) {
+ x += weight * ctoi(source[i]);
+ weight++;
+ if (weight > 7) {
+ weight = 2;
+ }
+ }
+
+ check = (11 - (x % 11)) % 11;
+ if (check == 10) {
+ lookup(NEON, MSITable, '1', dest);
+ lookup(NEON, MSITable, '0', dest);
+ } else {
+ lookup(NEON, MSITable, itoc(check), dest);
+ }
+
+ /* stop character */
+ strcat(dest, "121");
+
+ expand(symbol, dest);
+
+ ustrcpy(symbol->text, source);
+ if (check == 10) {
+ strcat((char*) symbol->text, "10");
+ } else {
+ symbol->text[src_len] = itoc(check);
+ symbol->text[src_len + 1] = '\0';
+ }
+
+ return error_number;
+}
+
+/* Combining the Barcode Island and Wikipedia code
+ * Verified against http://www.bokai.com/BarcodeJSP/applet/BarcodeSampleApplet.htm */
+int msi_plessey_mod1110(struct zint_symbol *symbol, unsigned char source[], const unsigned int src_len) {
+ /* Weighted using the IBM system */
+ unsigned long i, weight, x, check, wright, dau, pedwar, pump;
+ size_t h;
+ long si;
+ char un[16], tri[16];
+ int error_number;
+ char dest[1000];
+ unsigned char temp[32];
+ unsigned int temp_len;
+
+ error_number = 0;
+
+ if (src_len > 18) {
+ strcpy(symbol->errtxt, "376: Input too long");
+ return ZINT_ERROR_TOO_LONG;
+ }
+
+ /* start character */
+ strcpy(dest, "21");
+
+ /* draw data section */
+ for (i = 0; i < src_len; i++) {
+ lookup(NEON, MSITable, source[i], dest);
+ }
+
+ /* calculate first (mod 11) digit */
+ x = 0;
+ weight = 2;
+ for (si = src_len - 1; si >= 0; si--) {
+ x += weight * ctoi(source[si]);
+ weight++;
+ if (weight > 7) {
+ weight = 2;
+ }
+ }
+
+ check = (11 - (x % 11)) % 11;
+ ustrcpy(temp, source);
+ temp_len = src_len;
+ if (check == 10) {
+ lookup(NEON, MSITable, '1', dest);
+ lookup(NEON, MSITable, '0', dest);
+ strcat((char*) temp, "10");
+ temp_len += 2;
+ } else {
+ lookup(NEON, MSITable, itoc(check), dest);
+ temp[temp_len++] = itoc(check);
+ temp[temp_len] = '\0';
+ }
+
+ /* calculate second (mod 10) check digit */
+ wright = 0;
+ i = !(temp_len & 1);
+ for (; i < temp_len; i += 2) {
+ un[wright++] = temp[i];
+ }
+ un[wright] = '\0';
+
+ dau = strtoul(un, NULL, 10);
+ dau *= 2;
+
+ sprintf(tri, "%ld", dau);
+
+ pedwar = 0;
+ h = strlen(tri);
+ for (i = 0; i < h; i++) {
+ pedwar += ctoi(tri[i]);
+ }
+
+ i = temp_len & 1;
+ for (; i < temp_len; i += 2) {
+ pedwar += ctoi(temp[i]);
+ }
+
+ pump = 10 - pedwar % 10;
+ if (pump == 10) {
+ pump = 0;
+ }
+
+ /* draw check digit */
+ lookup(NEON, MSITable, itoc(pump), dest);
+
+ /* stop character */
+ strcat(dest, "121");
+ expand(symbol, dest);
+
+ temp[temp_len++] = itoc(pump);
+ temp[temp_len] = '\0';
+
+
+ ustrcpy(symbol->text, temp);
+ return error_number;
+}
+
+int msi_handle(struct zint_symbol *symbol, unsigned char source[], int length) {
+ int error_number;
+
+ error_number = is_sane(NEON, source, length);
+ if (error_number != 0) {
+ strcpy(symbol->errtxt, "377: Invalid characters in input data");
+ return ZINT_ERROR_INVALID_DATA;
+ }
+
+
+ if ((symbol->option_2 < 0) || (symbol->option_2 > 4)) {
+ symbol->option_2 = 0;
+ }
+
+ switch (symbol->option_2) {
+ case 0: error_number = msi_plessey(symbol, source, length);
+ break;
+ case 1: error_number = msi_plessey_mod10(symbol, source, length);
+ break;
+ case 2: error_number = msi_plessey_mod1010(symbol, source, length);
+ break;
+ case 3: error_number = msi_plessey_mod11(symbol, source, length);
+ break;
+ case 4: error_number = msi_plessey_mod1110(symbol, source, length);
+ break;
+ }
+
+ return error_number;
+}
diff --git a/3rdparty/zint-2.6.1/backend/png.c b/3rdparty/zint-2.6.1/backend/png.c
new file mode 100644
index 0000000..a726d51
--- /dev/null
+++ b/3rdparty/zint-2.6.1/backend/png.c
@@ -0,0 +1,191 @@
+/* png.c - Handles output to PNG file */
+
+/*
+ libzint - the open source barcode library
+ Copyright (C) 2009-2017 Robin Stuart
+
+ Redistribution and use in source and binary forms, with or without
+ modification, are permitted provided that the following conditions
+ are met:
+
+ 1. Redistributions of source code must retain the above copyright
+ notice, this list of conditions and the following disclaimer.
+ 2. Redistributions in binary form must reproduce the above copyright
+ notice, this list of conditions and the following disclaimer in the
+ documentation and/or other materials provided with the distribution.
+ 3. Neither the name of the project nor the names of its contributors
+ may be used to endorse or promote products derived from this software
+ without specific prior written permission.
+
+ THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND
+ ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+ ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE
+ FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+ DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
+ OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
+ HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
+ LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
+ OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+ SUCH DAMAGE.
+ */
+
+#include
+#ifdef _MSC_VER
+#include
+#include
+#include
+#endif
+#include
+#include
+#include "common.h"
+
+#ifndef NO_PNG
+#include
+#include
+#include
+
+#define SSET "0123456789ABCDEF"
+
+struct mainprog_info_type {
+ long width;
+ long height;
+ FILE *outfile;
+ jmp_buf jmpbuf;
+};
+
+static void writepng_error_handler(png_structp png_ptr, png_const_charp msg) {
+ struct mainprog_info_type *graphic;
+
+ fprintf(stderr, "writepng libpng error: %s (F30)\n", msg);
+ fflush(stderr);
+
+ graphic = (struct mainprog_info_type*) png_get_error_ptr(png_ptr);
+ if (graphic == NULL) {
+ /* we are completely hosed now */
+ fprintf(stderr,
+ "writepng severe error: jmpbuf not recoverable; terminating. (F31)\n");
+ fflush(stderr);
+ return;
+ }
+ longjmp(graphic->jmpbuf, 1);
+}
+
+int png_pixel_plot(struct zint_symbol *symbol, char *pixelbuf) {
+ struct mainprog_info_type wpng_info;
+ struct mainprog_info_type *graphic;
+ png_structp png_ptr;
+ png_infop info_ptr;
+ unsigned char *image_data;
+ int i, row, column;
+ int fgred, fggrn, fgblu, bgred, bggrn, bgblu;
+
+#ifndef _MSC_VER
+ unsigned char outdata[symbol->bitmap_width * 3];
+#else
+ unsigned char* outdata = (unsigned char*) _alloca(symbol->bitmap_width * 3);
+#endif
+
+ graphic = &wpng_info;
+
+ graphic->width = symbol->bitmap_width;
+ graphic->height = symbol->bitmap_height;
+
+ fgred = (16 * ctoi(symbol->fgcolour[0])) + ctoi(symbol->fgcolour[1]);
+ fggrn = (16 * ctoi(symbol->fgcolour[2])) + ctoi(symbol->fgcolour[3]);
+ fgblu = (16 * ctoi(symbol->fgcolour[4])) + ctoi(symbol->fgcolour[5]);
+ bgred = (16 * ctoi(symbol->bgcolour[0])) + ctoi(symbol->bgcolour[1]);
+ bggrn = (16 * ctoi(symbol->bgcolour[2])) + ctoi(symbol->bgcolour[3]);
+ bgblu = (16 * ctoi(symbol->bgcolour[4])) + ctoi(symbol->bgcolour[5]);
+
+ /* Open output file in binary mode */
+ if (symbol->output_options & BARCODE_STDOUT) {
+#ifdef _MSC_VER
+ if (-1 == _setmode(_fileno(stdout), _O_BINARY)) {
+ strcpy(symbol->errtxt, "631: Can't open output file");
+ return ZINT_ERROR_FILE_ACCESS;
+ }
+#endif
+ graphic->outfile = stdout;
+ } else {
+ if (!(graphic->outfile = fopen(symbol->outfile, "wb"))) {
+ strcpy(symbol->errtxt, "632: Can't open output file");
+ return ZINT_ERROR_FILE_ACCESS;
+ }
+ }
+
+ /* Set up error handling routine as proc() above */
+ png_ptr = png_create_write_struct(PNG_LIBPNG_VER_STRING, graphic, writepng_error_handler, NULL);
+ if (!png_ptr) {
+ strcpy(symbol->errtxt, "633: Out of memory");
+ return ZINT_ERROR_MEMORY;
+ }
+
+ info_ptr = png_create_info_struct(png_ptr);
+ if (!info_ptr) {
+ png_destroy_write_struct(&png_ptr, NULL);
+ strcpy(symbol->errtxt, "634: Out of memory");
+ return ZINT_ERROR_MEMORY;
+ }
+
+ /* catch jumping here */
+ if (setjmp(graphic->jmpbuf)) {
+ png_destroy_write_struct(&png_ptr, &info_ptr);
+ strcpy(symbol->errtxt, "635: libpng error occurred");
+ return ZINT_ERROR_MEMORY;
+ }
+
+ /* open output file with libpng */
+ png_init_io(png_ptr, graphic->outfile);
+
+ /* set compression */
+ png_set_compression_level(png_ptr, 9);
+
+ /* set Header block */
+ png_set_IHDR(png_ptr, info_ptr, graphic->width, graphic->height,
+ 8, PNG_COLOR_TYPE_RGB, PNG_INTERLACE_NONE,
+ PNG_COMPRESSION_TYPE_DEFAULT, PNG_FILTER_TYPE_DEFAULT);
+
+ /* write all chunks up to (but not including) first IDAT */
+ png_write_info(png_ptr, info_ptr);
+
+ /* set up the transformations: for now, just pack low-bit-depth pixels
+ into bytes (one, two or four pixels per byte) */
+ png_set_packing(png_ptr);
+
+ /* Pixel Plotting */
+ for (row = 0; row < symbol->bitmap_height; row++) {
+ for (column = 0; column < symbol->bitmap_width; column++) {
+ i = column * 3;
+ switch (*(pixelbuf + (symbol->bitmap_width * row) + column)) {
+ case '1':
+ outdata[i] = fgred;
+ outdata[i + 1] = fggrn;
+ outdata[i + 2] = fgblu;
+ break;
+ default:
+ outdata[i] = bgred;
+ outdata[i + 1] = bggrn;
+ outdata[i + 2] = bgblu;
+ break;
+
+ }
+ }
+ /* write row contents to file */
+ image_data = outdata;
+ png_write_row(png_ptr, image_data);
+ }
+
+ /* End the file */
+ png_write_end(png_ptr, NULL);
+
+ /* make sure we have disengaged */
+ if (png_ptr && info_ptr) png_destroy_write_struct(&png_ptr, &info_ptr);
+ if (symbol->output_options & BARCODE_STDOUT) {
+ fflush(wpng_info.outfile);
+ } else {
+ fclose(wpng_info.outfile);
+ }
+ return 0;
+}
+#endif /* NO_PNG */
diff --git a/3rdparty/zint-2.6.1/backend/postal.c b/3rdparty/zint-2.6.1/backend/postal.c
new file mode 100644
index 0000000..1a8844b
--- /dev/null
+++ b/3rdparty/zint-2.6.1/backend/postal.c
@@ -0,0 +1,621 @@
+/* postal.c - Handles PostNet, PLANET, FIM. RM4SCC and Flattermarken */
+
+/*
+ libzint - the open source barcode library
+ Copyright (C) 2008-2017 Robin Stuart
+ Including bug fixes by Bryan Hatton
+
+ Redistribution and use in source and binary forms, with or without
+ modification, are permitted provided that the following conditions
+ are met:
+
+ 1. Redistributions of source code must retain the above copyright
+ notice, this list of conditions and the following disclaimer.
+ 2. Redistributions in binary form must reproduce the above copyright
+ notice, this list of conditions and the following disclaimer in the
+ documentation and/or other materials provided with the distribution.
+ 3. Neither the name of the project nor the names of its contributors
+ may be used to endorse or promote products derived from this software
+ without specific prior written permission.
+
+ THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND
+ ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+ ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE
+ FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+ DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
+ OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
+ HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
+ LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
+ OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+ SUCH DAMAGE.
+ */
+
+#include
+#include
+#include
+#ifdef _MSC_VER
+#include
+#endif
+#include "common.h"
+
+#define DAFTSET "DAFT"
+#define KRSET "0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ"
+#define KASUTSET "1234567890-abcdefgh"
+#define CHKASUTSET "0123456789-abcdefgh"
+#define SHKASUTSET "1234567890-ABCDEFGHIJKLMNOPQRSTUVWXYZ"
+
+/* PostNet number encoding table - In this table L is long as S is short */
+static const char *PNTable[10] = {
+ "LLSSS", "SSSLL", "SSLSL", "SSLLS", "SLSSL", "SLSLS", "SLLSS", "LSSSL",
+ "LSSLS", "LSLSS"
+};
+
+static const char *PLTable[10] = {
+ "SSLLL", "LLLSS", "LLSLS", "LLSSL", "LSLLS", "LSLSL", "LSSLL", "SLLLS",
+ "SLLSL", "SLSLL"
+};
+
+static const char *RoyalValues[36] = {
+ "11", "12", "13", "14", "15", "10", "21", "22", "23", "24", "25",
+ "20", "31", "32", "33", "34", "35", "30", "41", "42", "43", "44", "45", "40", "51", "52",
+ "53", "54", "55", "50", "01", "02", "03", "04", "05", "00"
+};
+
+/* 0 = Full, 1 = Ascender, 2 = Descender, 3 = Tracker */
+static const char *RoyalTable[36] = {
+ "3300", "3210", "3201", "2310", "2301", "2211", "3120", "3030", "3021",
+ "2130", "2121", "2031", "3102", "3012", "3003", "2112", "2103", "2013", "1320", "1230",
+ "1221", "0330", "0321", "0231", "1302", "1212", "1203", "0312", "0303", "0213", "1122",
+ "1032", "1023", "0132", "0123", "0033"
+};
+
+static const char *FlatTable[10] = {
+ "0504", "18", "0117", "0216", "0315", "0414", "0513", "0612", "0711", "0810"
+};
+
+static const char *KoreaTable[10] = {
+ "1313150613", "0713131313", "0417131313", "1506131313",
+ "0413171313", "17171313", "1315061313", "0413131713", "17131713", "13171713"
+};
+
+static const char *JapanTable[19] = {
+ "114", "132", "312", "123", "141", "321", "213", "231", "411", "144",
+ "414", "324", "342", "234", "432", "243", "423", "441", "111"
+};
+
+/* Handles the PostNet system used for Zip codes in the US */
+int postnet(struct zint_symbol *symbol, unsigned char source[], char dest[], int length) {
+ unsigned int i, sum, check_digit;
+ int error_number;
+
+ error_number = 0;
+
+ if (length > 38) {
+ strcpy(symbol->errtxt, "480: Input too long");
+ return ZINT_ERROR_TOO_LONG;
+ }
+ error_number = is_sane(NEON, source, length);
+ if (error_number == ZINT_ERROR_INVALID_DATA) {
+ strcpy(symbol->errtxt, "481: Invalid characters in data");
+ return error_number;
+ }
+ sum = 0;
+
+ /* start character */
+ strcpy(dest, "L");
+
+ for (i = 0; i < length; i++) {
+ lookup(NEON, PNTable, source[i], dest);
+ sum += ctoi(source[i]);
+ }
+
+ check_digit = (10 - (sum % 10)) % 10;
+ strcat(dest, PNTable[check_digit]);
+
+ /* stop character */
+ strcat(dest, "L");
+
+ return error_number;
+}
+
+/* Puts PostNet barcodes into the pattern matrix */
+int post_plot(struct zint_symbol *symbol, unsigned char source[], int length) {
+ char height_pattern[256]; /* 5 + 38 * 5 + 5 + 5 + 1 ~ 256 */
+ unsigned int loopey, h;
+ int writer;
+ int error_number;
+
+ error_number = 0;
+
+ error_number = postnet(symbol, source, height_pattern, length);
+ if (error_number != 0) {
+ return error_number;
+ }
+
+ writer = 0;
+ h = strlen(height_pattern);
+ for (loopey = 0; loopey < h; loopey++) {
+ if (height_pattern[loopey] == 'L') {
+ set_module(symbol, 0, writer);
+ }
+ set_module(symbol, 1, writer);
+ writer += 3;
+ }
+ symbol->row_height[0] = 6;
+ symbol->row_height[1] = 6;
+ symbol->rows = 2;
+ symbol->width = writer - 1;
+
+ return error_number;
+}
+
+/* Handles the PLANET system used for item tracking in the US */
+int planet(struct zint_symbol *symbol, unsigned char source[], char dest[], int length) {
+ unsigned int i, sum, check_digit;
+ int error_number;
+
+ error_number = 0;
+
+ if (length > 38) {
+ strcpy(symbol->errtxt, "482: Input too long");
+ return ZINT_ERROR_TOO_LONG;
+ }
+ error_number = is_sane(NEON, source, length);
+ if (error_number == ZINT_ERROR_INVALID_DATA) {
+ strcpy(symbol->errtxt, "483: Invalid characters in data");
+ return error_number;
+ }
+ sum = 0;
+
+ /* start character */
+ strcpy(dest, "L");
+
+ for (i = 0; i < length; i++) {
+ lookup(NEON, PLTable, source[i], dest);
+ sum += ctoi(source[i]);
+ }
+
+ check_digit = (10 - (sum % 10)) % 10;
+ strcat(dest, PLTable[check_digit]);
+
+ /* stop character */
+ strcat(dest, "L");
+
+ return error_number;
+}
+
+/* Puts PLANET barcodes into the pattern matrix */
+int planet_plot(struct zint_symbol *symbol, unsigned char source[], int length) {
+ char height_pattern[256]; /* 5 + 38 * 5 + 5 + 5 + 1 ~ 256 */
+ unsigned int loopey, h;
+ int writer;
+ int error_number;
+
+ error_number = 0;
+
+ error_number = planet(symbol, source, height_pattern, length);
+ if (error_number != 0) {
+ return error_number;
+ }
+
+ writer = 0;
+ h = strlen(height_pattern);
+ for (loopey = 0; loopey < h; loopey++) {
+ if (height_pattern[loopey] == 'L') {
+ set_module(symbol, 0, writer);
+ }
+ set_module(symbol, 1, writer);
+ writer += 3;
+ }
+ symbol->row_height[0] = 6;
+ symbol->row_height[1] = 6;
+ symbol->rows = 2;
+ symbol->width = writer - 1;
+ return error_number;
+}
+
+/* Korean Postal Authority */
+int korea_post(struct zint_symbol *symbol, unsigned char source[], int length) {
+ int total, loop, check, zeroes, error_number;
+ char localstr[8], dest[80];
+
+ error_number = 0;
+ if (length > 6) {
+ strcpy(symbol->errtxt, "484: Input too long");
+ return ZINT_ERROR_TOO_LONG;
+ }
+ error_number = is_sane(NEON, source, length);
+ if (error_number == ZINT_ERROR_INVALID_DATA) {
+ strcpy(symbol->errtxt, "485: Invalid characters in data");
+ return error_number;
+ }
+ zeroes = 6 - length;
+ memset(localstr, '0', zeroes);
+ strcpy(localstr + zeroes, (char *) source);
+
+ total = 0;
+ for (loop = 0; loop < 6; loop++) {
+ total += ctoi(localstr[loop]);
+ }
+ check = 10 - (total % 10);
+ if (check == 10) {
+ check = 0;
+ }
+ localstr[6] = itoc(check);
+ localstr[7] = '\0';
+ *dest = '\0';
+ for (loop = 5; loop >= 0; loop--) {
+ lookup(NEON, KoreaTable, localstr[loop], dest);
+ }
+ lookup(NEON, KoreaTable, localstr[6], dest);
+ expand(symbol, dest);
+ ustrcpy(symbol->text, (unsigned char*) localstr);
+ return error_number;
+}
+
+/* The simplest barcode symbology ever! Supported by MS Word, so here it is!
+ glyphs from http://en.wikipedia.org/wiki/Facing_Identification_Mark */
+int fim(struct zint_symbol *symbol, unsigned char source[], int length) {
+
+
+ char dest[16] = {0};
+
+ if (length > 1) {
+ strcpy(symbol->errtxt, "486: Input too long");
+ return ZINT_ERROR_TOO_LONG;
+ }
+
+ switch ((char) source[0]) {
+ case 'a':
+ case 'A':
+ strcpy(dest, "111515111");
+ break;
+ case 'b':
+ case 'B':
+ strcpy(dest, "13111311131");
+ break;
+ case 'c':
+ case 'C':
+ strcpy(dest, "11131313111");
+ break;
+ case 'd':
+ case 'D':
+ strcpy(dest, "1111131311111");
+ break;
+ default:
+ strcpy(symbol->errtxt, "487: Invalid characters in data");
+ return ZINT_ERROR_INVALID_DATA;
+ break;
+ }
+
+ expand(symbol, dest);
+ return 0;
+}
+
+/* Handles the 4 State barcodes used in the UK by Royal Mail */
+char rm4scc(char source[], unsigned char dest[], int length) {
+ unsigned int i;
+ int top, bottom, row, column, check_digit;
+ char values[3], set_copy[] = KRSET;
+
+ top = 0;
+ bottom = 0;
+
+ /* start character */
+ strcpy((char*) dest, "1");
+
+ for (i = 0; i < length; i++) {
+ lookup(KRSET, RoyalTable, source[i], (char*) dest);
+ strcpy(values, RoyalValues[posn(KRSET, source[i])]);
+ top += ctoi(values[0]);
+ bottom += ctoi(values[1]);
+ }
+
+ /* Calculate the check digit */
+ row = (top % 6) - 1;
+ column = (bottom % 6) - 1;
+ if (row == -1) {
+ row = 5;
+ }
+ if (column == -1) {
+ column = 5;
+ }
+ check_digit = (6 * row) + column;
+ strcat((char*) dest, RoyalTable[check_digit]);
+
+ /* stop character */
+ strcat((char*) dest, "0");
+
+ return set_copy[check_digit];
+}
+
+/* Puts RM4SCC into the data matrix */
+int royal_plot(struct zint_symbol *symbol, unsigned char source[], int length) {
+ char height_pattern[210];
+ unsigned int loopey, h;
+ int writer;
+ int error_number;
+ strcpy(height_pattern, "");
+
+ error_number = 0;
+
+ if (length > 50) {
+ strcpy(symbol->errtxt, "488: Input too long");
+ return ZINT_ERROR_TOO_LONG;
+ }
+ to_upper(source);
+ error_number = is_sane(KRSET, source, length);
+ if (error_number == ZINT_ERROR_INVALID_DATA) {
+ strcpy(symbol->errtxt, "489: Invalid characters in data");
+ return error_number;
+ }
+ /*check = */rm4scc((char*) source, (unsigned char*) height_pattern, length);
+
+ writer = 0;
+ h = strlen(height_pattern);
+ for (loopey = 0; loopey < h; loopey++) {
+ if ((height_pattern[loopey] == '1') || (height_pattern[loopey] == '0')) {
+ set_module(symbol, 0, writer);
+ }
+ set_module(symbol, 1, writer);
+ if ((height_pattern[loopey] == '2') || (height_pattern[loopey] == '0')) {
+ set_module(symbol, 2, writer);
+ }
+ writer += 2;
+ }
+
+ symbol->row_height[0] = 3;
+ symbol->row_height[1] = 2;
+ symbol->row_height[2] = 3;
+ symbol->rows = 3;
+ symbol->width = writer - 1;
+
+ return error_number;
+}
+
+/* Handles Dutch Post TNT KIX symbols
+ The same as RM4SCC but without check digit
+ Specification at http://www.tntpost.nl/zakelijk/klantenservice/downloads/kIX_code/download.aspx */
+int kix_code(struct zint_symbol *symbol, unsigned char source[], int length) {
+ char height_pattern[75], localstr[20];
+ unsigned int loopey;
+ int writer, i, h;
+ int error_number; /* zeroes; */
+ strcpy(height_pattern, "");
+
+ error_number = 0;
+
+ if (length > 18) {
+ strcpy(symbol->errtxt, "490: Input too long");
+ return ZINT_ERROR_TOO_LONG;
+ }
+ to_upper(source);
+ error_number = is_sane(KRSET, source, length);
+ if (error_number == ZINT_ERROR_INVALID_DATA) {
+ strcpy(symbol->errtxt, "491: Invalid characters in data");
+ return error_number;
+ }
+
+ strcpy(localstr, (char *) source);
+
+ /* Encode data */
+ for (i = 0; i < length; i++) {
+ lookup(KRSET, RoyalTable, localstr[i], height_pattern);
+ }
+
+ writer = 0;
+ h = strlen(height_pattern);
+ for (loopey = 0; loopey < h; loopey++) {
+ if ((height_pattern[loopey] == '1') || (height_pattern[loopey] == '0')) {
+ set_module(symbol, 0, writer);
+ }
+ set_module(symbol, 1, writer);
+ if ((height_pattern[loopey] == '2') || (height_pattern[loopey] == '0')) {
+ set_module(symbol, 2, writer);
+ }
+ writer += 2;
+ }
+
+ symbol->row_height[0] = 3;
+ symbol->row_height[1] = 2;
+ symbol->row_height[2] = 3;
+ symbol->rows = 3;
+ symbol->width = writer - 1;
+
+ return error_number;
+}
+
+/* Handles DAFT Code symbols */
+int daft_code(struct zint_symbol *symbol, unsigned char source[], int length) {
+ char height_pattern[100];
+ unsigned int loopey, h;
+ int writer, i, error_number;
+ strcpy(height_pattern, "");
+
+ error_number = 0;
+ if (length > 50) {
+ strcpy(symbol->errtxt, "492: Input too long");
+ return ZINT_ERROR_TOO_LONG;
+ }
+ to_upper((unsigned char*) source);
+ error_number = is_sane(DAFTSET, (unsigned char*) source, length);
+
+ if (error_number == ZINT_ERROR_INVALID_DATA) {
+ strcpy(symbol->errtxt, "493: Invalid characters in data");
+ return error_number;
+ }
+
+ for (i = 0; i < length; i++) {
+ if (source[i] == 'D') {
+ strcat(height_pattern, "2");
+ }
+ if (source[i] == 'A') {
+ strcat(height_pattern, "1");
+ }
+ if (source[i] == 'F') {
+ strcat(height_pattern, "0");
+ }
+ if (source[i] == 'T') {
+ strcat(height_pattern, "3");
+ }
+ }
+
+ writer = 0;
+ h = strlen(height_pattern);
+ for (loopey = 0; loopey < h; loopey++) {
+ if ((height_pattern[loopey] == '1') || (height_pattern[loopey] == '0')) {
+ set_module(symbol, 0, writer);
+ }
+ set_module(symbol, 1, writer);
+ if ((height_pattern[loopey] == '2') || (height_pattern[loopey] == '0')) {
+ set_module(symbol, 2, writer);
+ }
+ writer += 2;
+ }
+
+ symbol->row_height[0] = 3;
+ symbol->row_height[1] = 2;
+ symbol->row_height[2] = 3;
+ symbol->rows = 3;
+ symbol->width = writer - 1;
+
+ return error_number;
+}
+
+/* Flattermarken - Not really a barcode symbology! */
+int flattermarken(struct zint_symbol *symbol, unsigned char source[], int length) {
+ int loop, error_number;
+ char dest[512]; /* 90 * 4 + 1 ~ */
+
+ error_number = 0;
+
+ if (length > 90) {
+ strcpy(symbol->errtxt, "494: Input too long");
+ return ZINT_ERROR_TOO_LONG;
+ }
+ error_number = is_sane(NEON, source, length);
+ if (error_number == ZINT_ERROR_INVALID_DATA) {
+ strcpy(symbol->errtxt, "495: Invalid characters in data");
+ return error_number;
+ }
+ *dest = '\0';
+ for (loop = 0; loop < length; loop++) {
+ lookup(NEON, FlatTable, source[loop], dest);
+ }
+
+ expand(symbol, dest);
+ return error_number;
+}
+
+/* Japanese Postal Code (Kasutama Barcode) */
+int japan_post(struct zint_symbol *symbol, unsigned char source[], int length) {
+ int error_number, h;
+ char pattern[69];
+ int writer, loopey, inter_posn, i, sum, check;
+ char check_char;
+ char inter[23];
+
+#ifndef _MSC_VER
+ char local_source[length + 1];
+#else
+ char* local_source = (char*) _alloca(length + 1);
+#endif
+
+ if (length > 20) {
+ strcpy(symbol->errtxt, "496: Input too long");
+ return ZINT_ERROR_TOO_LONG;
+ }
+
+ inter_posn = 0;
+ error_number = 0;
+
+ strcpy(local_source, (char*) source);
+ for (i = 0; i < length; i++) {
+ local_source[i] = source[i];
+ }
+ to_upper((unsigned char*) local_source);
+ error_number = is_sane(SHKASUTSET, (unsigned char*) local_source, length);
+
+ if (error_number == ZINT_ERROR_INVALID_DATA) {
+ strcpy(symbol->errtxt, "497: Invalid characters in data");
+ return error_number;
+ }
+ memset(inter, 'd', 20); /* Pad character CC4 */
+ inter[20] = '\0';
+
+ i = 0;
+ inter_posn = 0;
+ do {
+ if (((local_source[i] >= '0') && (local_source[i] <= '9')) || (local_source[i] == '-')) {
+ inter[inter_posn] = local_source[i];
+ inter_posn++;
+ } else {
+ if ((local_source[i] >= 'A') && (local_source[i] <= 'J')) {
+ inter[inter_posn] = 'a';
+ inter[inter_posn + 1] = local_source[i] - 'A' + '0';
+ inter_posn += 2;
+ }
+ if ((local_source[i] >= 'K') && (local_source[i] <= 'T')) {
+ inter[inter_posn] = 'b';
+ inter[inter_posn + 1] = local_source[i] - 'K' + '0';
+ inter_posn += 2;
+ }
+ if ((local_source[i] >= 'U') && (local_source[i] <= 'Z')) {
+ inter[inter_posn] = 'c';
+ inter[inter_posn + 1] = local_source[i] - 'U' + '0';
+ inter_posn += 2;
+ }
+ }
+ i++;
+ } while ((i < length) && (inter_posn < 20));
+ inter[20] = '\0';
+
+ strcpy(pattern, "13"); /* Start */
+
+ sum = 0;
+ for (i = 0; i < 20; i++) {
+ strcat(pattern, JapanTable[posn(KASUTSET, inter[i])]);
+ sum += posn(CHKASUTSET, inter[i]);
+ }
+
+ /* Calculate check digit */
+ check = 19 - (sum % 19);
+ if (check == 19) {
+ check = 0;
+ }
+ if (check <= 9) {
+ check_char = check + '0';
+ }
+ if (check == 10) {
+ check_char = '-';
+ }
+ if (check >= 11) {
+ check_char = (check - 11) + 'a';
+ }
+ strcat(pattern, JapanTable[posn(KASUTSET, check_char)]);
+
+ strcat(pattern, "31"); /* Stop */
+
+ /* Resolve pattern to 4-state symbols */
+ writer = 0;
+ h = strlen(pattern);
+ for (loopey = 0; loopey < h; loopey++) {
+ if ((pattern[loopey] == '2') || (pattern[loopey] == '1')) {
+ set_module(symbol, 0, writer);
+ }
+ set_module(symbol, 1, writer);
+ if ((pattern[loopey] == '3') || (pattern[loopey] == '1')) {
+ set_module(symbol, 2, writer);
+ }
+ writer += 2;
+ }
+
+ symbol->row_height[0] = 3;
+ symbol->row_height[1] = 2;
+ symbol->row_height[2] = 3;
+ symbol->rows = 3;
+ symbol->width = writer - 1;
+
+ return error_number;
+}
diff --git a/3rdparty/zint-2.6.1/backend/ps.c b/3rdparty/zint-2.6.1/backend/ps.c
new file mode 100644
index 0000000..60b05a4
--- /dev/null
+++ b/3rdparty/zint-2.6.1/backend/ps.c
@@ -0,0 +1,974 @@
+/* ps.c - Post Script output */
+
+/*
+ libzint - the open source barcode library
+ Copyright (C) 2009-2017 Robin Stuart
+
+ Redistribution and use in source and binary forms, with or without
+ modification, are permitted provided that the following conditions
+ are met:
+
+ 1. Redistributions of source code must retain the above copyright
+ notice, this list of conditions and the following disclaimer.
+ 2. Redistributions in binary form must reproduce the above copyright
+ notice, this list of conditions and the following disclaimer in the
+ documentation and/or other materials provided with the distribution.
+ 3. Neither the name of the project nor the names of its contributors
+ may be used to endorse or promote products derived from this software
+ without specific prior written permission.
+
+ THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND
+ ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+ ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE
+ FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+ DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
+ OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
+ HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
+ LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
+ OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+ SUCH DAMAGE.
+ */
+
+#include
+#include
+#include
+#include
+#include
+#include "common.h"
+
+#define SSET "0123456789ABCDEF"
+
+int ps_plot(struct zint_symbol *symbol) {
+ int i, block_width, latch, r, this_row;
+ float textpos, large_bar_height, preset_height, row_height, row_posn;
+ FILE *feps;
+ int fgred, fggrn, fgblu, bgred, bggrn, bgblu;
+ float red_ink, green_ink, blue_ink, red_paper, green_paper, blue_paper;
+ float cyan_ink, magenta_ink, yellow_ink, black_ink;
+ float cyan_paper, magenta_paper, yellow_paper, black_paper;
+ int error_number = 0;
+ int textoffset, xoffset, yoffset, textdone, main_width;
+ char textpart[10], addon[6];
+ int large_bar_count, comp_offset;
+ float addon_text_posn;
+ float scaler = symbol->scale;
+ float default_text_posn;
+ const char *locale = NULL;
+#ifndef _MSC_VER
+ unsigned char local_text[ustrlen(symbol->text) + 1];
+#else
+ unsigned char* local_text = (unsigned char*) malloc(ustrlen(symbol->text) + 1);
+#endif
+
+ row_height = 0;
+ textdone = 0;
+ main_width = symbol->width;
+ strcpy(addon, "");
+ comp_offset = 0;
+ addon_text_posn = 0.0;
+
+ if (symbol->show_hrt != 0) {
+ /* Copy text from symbol */
+ ustrcpy(local_text, symbol->text);
+ } else {
+ /* No text needed */
+ switch (symbol->symbology) {
+ case BARCODE_EANX:
+ case BARCODE_EANX_CC:
+ case BARCODE_ISBNX:
+ case BARCODE_UPCA:
+ case BARCODE_UPCE:
+ case BARCODE_UPCA_CC:
+ case BARCODE_UPCE_CC:
+ /* For these symbols use dummy text to ensure formatting is done
+ * properly even if no text is required */
+ for (i = 0; i < ustrlen(symbol->text); i++) {
+ if (symbol->text[i] == '+') {
+ local_text[i] = '+';
+ } else {
+ local_text[i] = ' ';
+ }
+ local_text[ustrlen(symbol->text)] = '\0';
+ }
+ break;
+ default:
+ /* For everything else, just remove the text */
+ local_text[0] = '\0';
+ break;
+ }
+ }
+
+ if (symbol->output_options & BARCODE_STDOUT) {
+ feps = stdout;
+ } else {
+ feps = fopen(symbol->outfile, "w");
+ }
+ if (feps == NULL) {
+ strcpy(symbol->errtxt, "645: Could not open output file");
+#ifdef _MSC_VER
+ free(local_text);
+#endif
+ return ZINT_ERROR_FILE_ACCESS;
+ }
+
+ /* sort out colour options */
+ to_upper((unsigned char*) symbol->fgcolour);
+ to_upper((unsigned char*) symbol->bgcolour);
+
+ if (strlen(symbol->fgcolour) != 6) {
+ strcpy(symbol->errtxt, "646: Malformed foreground colour target");
+ fclose(feps);
+#ifdef _MSC_VER
+ free(local_text);
+#endif
+ return ZINT_ERROR_INVALID_OPTION;
+ }
+ if (strlen(symbol->bgcolour) != 6) {
+ strcpy(symbol->errtxt, "647: Malformed background colour target");
+ fclose(feps);
+#ifdef _MSC_VER
+ free(local_text);
+#endif
+ return ZINT_ERROR_INVALID_OPTION;
+ }
+ error_number = is_sane(SSET, (unsigned char*) symbol->fgcolour, strlen(symbol->fgcolour));
+ if (error_number == ZINT_ERROR_INVALID_DATA) {
+ strcpy(symbol->errtxt, "648: Malformed foreground colour target");
+ fclose(feps);
+#ifdef _MSC_VER
+ free(local_text);
+#endif
+ return ZINT_ERROR_INVALID_OPTION;
+ }
+ error_number = is_sane(SSET, (unsigned char*) symbol->bgcolour, strlen(symbol->bgcolour));
+ if (error_number == ZINT_ERROR_INVALID_DATA) {
+ strcpy(symbol->errtxt, "649: Malformed background colour target");
+ fclose(feps);
+#ifdef _MSC_VER
+ free(local_text);
+#endif
+ return ZINT_ERROR_INVALID_OPTION;
+ }
+ locale = setlocale(LC_ALL, "C");
+
+ fgred = (16 * ctoi(symbol->fgcolour[0])) + ctoi(symbol->fgcolour[1]);
+ fggrn = (16 * ctoi(symbol->fgcolour[2])) + ctoi(symbol->fgcolour[3]);
+ fgblu = (16 * ctoi(symbol->fgcolour[4])) + ctoi(symbol->fgcolour[5]);
+ bgred = (16 * ctoi(symbol->bgcolour[0])) + ctoi(symbol->bgcolour[1]);
+ bggrn = (16 * ctoi(symbol->bgcolour[2])) + ctoi(symbol->bgcolour[3]);
+ bgblu = (16 * ctoi(symbol->bgcolour[4])) + ctoi(symbol->bgcolour[5]);
+ red_ink = fgred / 256.0;
+ green_ink = fggrn / 256.0;
+ blue_ink = fgblu / 256.0;
+ red_paper = bgred / 256.0;
+ green_paper = bggrn / 256.0;
+ blue_paper = bgblu / 256.0;
+
+ /* Convert RGB to CMYK */
+ if (red_ink > green_ink) {
+ if (blue_ink > red_ink) {
+ black_ink = 1 - blue_ink;
+ } else {
+ black_ink = 1 - red_ink;
+ }
+ } else {
+ if (blue_ink > red_ink) {
+ black_ink = 1 - blue_ink;
+ } else {
+ black_ink = 1 - green_ink;
+ }
+ }
+ if (black_ink < 1.0) {
+ cyan_ink = (1 - red_ink - black_ink) / (1 - black_ink);
+ magenta_ink = (1 - green_ink - black_ink) / (1 - black_ink);
+ yellow_ink = (1 - blue_ink - black_ink) / (1 - black_ink);
+ } else {
+ cyan_ink = 0.0;
+ magenta_ink = 0.0;
+ yellow_ink = 0.0;
+ }
+
+ if (red_paper > green_paper) {
+ if (blue_paper > red_paper) {
+ black_paper = 1 - blue_paper;
+ } else {
+ black_paper = 1 - red_paper;
+ }
+ } else {
+ if (blue_paper > red_paper) {
+ black_paper = 1 - blue_paper;
+ } else {
+ black_paper = 1 - green_paper;
+ }
+ }
+ if (black_paper < 1.0) {
+ cyan_paper = (1 - red_paper - black_paper) / (1 - black_paper);
+ magenta_paper = (1 - green_paper - black_paper) / (1 - black_paper);
+ yellow_paper = (1 - blue_paper - black_paper) / (1 - black_paper);
+ } else {
+ cyan_paper = 0.0;
+ magenta_paper = 0.0;
+ yellow_paper = 0.0;
+ }
+
+ if (symbol->height == 0) {
+ symbol->height = 50;
+ }
+
+ large_bar_count = 0;
+ preset_height = 0.0;
+ for (i = 0; i < symbol->rows; i++) {
+ preset_height += symbol->row_height[i];
+ if (symbol->row_height[i] == 0) {
+ large_bar_count++;
+ }
+ }
+ large_bar_height = (symbol->height - preset_height) / large_bar_count;
+
+ if (large_bar_count == 0) {
+ symbol->height = preset_height;
+ }
+
+ while (!(module_is_set(symbol, symbol->rows - 1, comp_offset))) {
+ comp_offset++;
+ }
+
+ /* Certain symbols need whitespace otherwise characters get chopped off the sides */
+ if ((((symbol->symbology == BARCODE_EANX) && (symbol->rows == 1)) || (symbol->symbology == BARCODE_EANX_CC))
+ || (symbol->symbology == BARCODE_ISBNX)) {
+ switch (ustrlen(local_text)) {
+ case 13: /* EAN 13 */
+ case 16:
+ case 19:
+ if (symbol->whitespace_width == 0) {
+ symbol->whitespace_width = 10;
+ }
+ main_width = 96 + comp_offset;
+ break;
+ default:
+ main_width = 68 + comp_offset;
+ }
+ }
+
+ if (((symbol->symbology == BARCODE_UPCA) && (symbol->rows == 1)) || (symbol->symbology == BARCODE_UPCA_CC)) {
+ if (symbol->whitespace_width == 0) {
+ symbol->whitespace_width = 10;
+ main_width = 96 + comp_offset;
+ }
+ }
+
+ if (((symbol->symbology == BARCODE_UPCE) && (symbol->rows == 1)) || (symbol->symbology == BARCODE_UPCE_CC)) {
+ if (symbol->whitespace_width == 0) {
+ symbol->whitespace_width = 10;
+ main_width = 51 + comp_offset;
+ }
+ }
+
+ latch = 0;
+ r = 0;
+ /* Isolate add-on text */
+ if (is_extendable(symbol->symbology)) {
+ for (i = 0; i < ustrlen(local_text); i++) {
+ if (latch == 1) {
+ addon[r] = local_text[i];
+ r++;
+ }
+ if (local_text[i] == '+') {
+ latch = 1;
+ }
+ }
+ }
+ addon[r] = '\0';
+
+ if (ustrlen(local_text) != 0) {
+ textoffset = 9;
+ } else {
+ textoffset = 0;
+ }
+ xoffset = symbol->border_width + symbol->whitespace_width;
+ yoffset = symbol->border_width;
+
+ /* Start writing the header */
+ fprintf(feps, "%%!PS-Adobe-3.0 EPSF-3.0\n");
+ fprintf(feps, "%%%%Creator: Zint %d.%d.%d\n", ZINT_VERSION_MAJOR, ZINT_VERSION_MINOR, ZINT_VERSION_RELEASE);
+ if ((ustrlen(local_text) != 0) && (symbol->show_hrt != 0)) {
+ fprintf(feps, "%%%%Title: %s\n", local_text);
+ } else {
+ fprintf(feps, "%%%%Title: Zint Generated Symbol\n");
+ }
+ fprintf(feps, "%%%%Pages: 0\n");
+ if (symbol->symbology != BARCODE_MAXICODE) {
+ fprintf(feps, "%%%%BoundingBox: 0 0 %d %d\n", (int) ceil((symbol->width + xoffset + xoffset) * scaler), (int) ceil((symbol->height + textoffset + yoffset + yoffset) * scaler));
+ } else {
+ fprintf(feps, "%%%%BoundingBox: 0 0 %d %d\n", (int) ceil((74.0F + xoffset + xoffset) * scaler), (int) ceil((72.0F + yoffset + yoffset) * scaler));
+ }
+ fprintf(feps, "%%%%EndComments\n");
+
+ /* Definitions */
+ fprintf(feps, "/TL { setlinewidth moveto lineto stroke } bind def\n");
+ fprintf(feps, "/TC { moveto 0 360 arc 360 0 arcn fill } bind def\n");
+ fprintf(feps, "/TD { newpath 0 360 arc fill } bind def\n");
+ fprintf(feps, "/TH { 0 setlinewidth moveto lineto lineto lineto lineto lineto closepath fill } bind def\n");
+ fprintf(feps, "/TB { 2 copy } bind def\n");
+ fprintf(feps, "/TR { newpath 4 1 roll exch moveto 1 index 0 rlineto 0 exch rlineto neg 0 rlineto closepath fill } bind def\n");
+ fprintf(feps, "/TE { pop pop } bind def\n");
+
+ fprintf(feps, "newpath\n");
+
+ /* Now the actual representation */
+ if ((symbol->output_options & CMYK_COLOUR) == 0) {
+ fprintf(feps, "%.2f %.2f %.2f setrgbcolor\n", red_ink, green_ink, blue_ink);
+ fprintf(feps, "%.2f %.2f %.2f setrgbcolor\n", red_paper, green_paper, blue_paper);
+ } else {
+ fprintf(feps, "%.2f %.2f %.2f %.2f setcmykcolor\n", cyan_ink, magenta_ink, yellow_ink, black_ink);
+ fprintf(feps, "%.2f %.2f %.2f %.2f setcmykcolor\n", cyan_paper, magenta_paper, yellow_paper, black_paper);
+ }
+ fprintf(feps, "%.2f 0.00 TB 0.00 %.2f TR\n", (symbol->height + textoffset + yoffset + yoffset) * scaler, (symbol->width + xoffset + xoffset) * scaler);
+
+ if (((symbol->output_options & BARCODE_BOX) != 0) || ((symbol->output_options & BARCODE_BIND) != 0)) {
+ default_text_posn = 0.5 * scaler;
+ } else {
+ default_text_posn = (symbol->border_width + 0.5) * scaler;
+ }
+
+ if (symbol->symbology == BARCODE_MAXICODE) {
+ /* Maxicode uses hexagons */
+ float ax, ay, bx, by, cx, cy, dx, dy, ex, ey, fx, fy, mx, my;
+
+
+ textoffset = 0.0;
+ if (((symbol->output_options & BARCODE_BOX) != 0) || ((symbol->output_options & BARCODE_BIND) != 0)) {
+ fprintf(feps, "TE\n");
+ if ((symbol->output_options & CMYK_COLOUR) == 0) {
+ fprintf(feps, "%.2f %.2f %.2f setrgbcolor\n", red_ink, green_ink, blue_ink);
+ } else {
+ fprintf(feps, "%.2f %.2f %.2f %.2f setcmykcolor\n", cyan_ink, magenta_ink, yellow_ink, black_ink);
+ }
+ fprintf(feps, "%.2f %.2f TB %.2f %.2f TR\n", symbol->border_width * scaler, textoffset * scaler, 0.0, (74.0 + xoffset + xoffset) * scaler);
+ fprintf(feps, "%.2f %.2f TB %.2f %.2f TR\n", symbol->border_width * scaler, (textoffset + 72.0 + symbol->border_width) * scaler, 0.0, (74.0 + xoffset + xoffset) * scaler);
+ }
+ if ((symbol->output_options & BARCODE_BOX) != 0) {
+ /* side bars */
+ fprintf(feps, "TE\n");
+ if ((symbol->output_options & CMYK_COLOUR) == 0) {
+ fprintf(feps, "%.2f %.2f %.2f setrgbcolor\n", red_ink, green_ink, blue_ink);
+ } else {
+ fprintf(feps, "%.2f %.2f %.2f %.2f setcmykcolor\n", cyan_ink, magenta_ink, yellow_ink, black_ink);
+ }
+ fprintf(feps, "%.2f %.2f TB %.2f %.2f TR\n", (72.0 + (2 * symbol->border_width)) * scaler, textoffset * scaler, 0.0, symbol->border_width * scaler);
+ fprintf(feps, "%.2f %.2f TB %.2f %.2f TR\n", (72.0 + (2 * symbol->border_width)) * scaler, textoffset * scaler, (74.0 + xoffset + xoffset - symbol->border_width) * scaler, symbol->border_width * scaler);
+ }
+
+ fprintf(feps, "TE\n");
+ if ((symbol->output_options & CMYK_COLOUR) == 0) {
+ fprintf(feps, "%.2f %.2f %.2f setrgbcolor\n", red_ink, green_ink, blue_ink);
+ fprintf(feps, "%.2f %.2f %.2f setrgbcolor\n", red_ink, green_ink, blue_ink);
+ } else {
+ fprintf(feps, "%.2f %.2f %.2f %.2f setcmykcolor\n", cyan_ink, magenta_ink, yellow_ink, black_ink);
+ fprintf(feps, "%.2f %.2f %.2f %.2f setcmykcolor\n", cyan_ink, magenta_ink, yellow_ink, black_ink);
+ }
+ fprintf(feps, "%.2f %.2f %.2f %.2f %.2f %.2f %.2f %.2f TC\n", (35.76 + xoffset) * scaler, (35.60 + yoffset) * scaler, 10.85 * scaler, (35.76 + xoffset) * scaler, (35.60 + yoffset) * scaler, 8.97 * scaler, (44.73 + xoffset) * scaler, (35.60 + yoffset) * scaler);
+ fprintf(feps, "%.2f %.2f %.2f %.2f %.2f %.2f %.2f %.2f TC\n", (35.76 + xoffset) * scaler, (35.60 + yoffset) * scaler, 7.10 * scaler, (35.76 + xoffset) * scaler, (35.60 + yoffset) * scaler, 5.22 * scaler, (40.98 + xoffset) * scaler, (35.60 + yoffset) * scaler);
+ fprintf(feps, "%.2f %.2f %.2f %.2f %.2f %.2f %.2f %.2f TC\n", (35.76 + xoffset) * scaler, (35.60 + yoffset) * scaler, 3.31 * scaler, (35.76 + xoffset) * scaler, (35.60 + yoffset) * scaler, 1.43 * scaler, (37.19 + xoffset) * scaler, (35.60 + yoffset) * scaler);
+ for (r = 0; r < symbol->rows; r++) {
+ for (i = 0; i < symbol->width; i++) {
+ if (module_is_set(symbol, r, i)) {
+ /* Dump a hexagon */
+ my = ((symbol->rows - r - 1)) * 2.135 + 1.43;
+ ay = my + 1.0 + yoffset;
+ by = my + 0.5 + yoffset;
+ cy = my - 0.5 + yoffset;
+ dy = my - 1.0 + yoffset;
+ ey = my - 0.5 + yoffset;
+ fy = my + 0.5 + yoffset;
+
+ mx = 2.46 * i + 1.23 + (r & 1 ? 1.23 : 0);
+
+ ax = mx + xoffset;
+ bx = mx + 0.86 + xoffset;
+ cx = mx + 0.86 + xoffset;
+ dx = mx + xoffset;
+ ex = mx - 0.86 + xoffset;
+ fx = mx - 0.86 + xoffset;
+ fprintf(feps, "%.2f %.2f %.2f %.2f %.2f %.2f %.2f %.2f %.2f %.2f %.2f %.2f TH\n", ax * scaler, ay * scaler, bx * scaler, by * scaler, cx * scaler, cy * scaler, dx * scaler, dy * scaler, ex * scaler, ey * scaler, fx * scaler, fy * scaler);
+ }
+ }
+ }
+ }
+
+ if (symbol->symbology != BARCODE_MAXICODE) {
+ /* everything else uses rectangles (or squares) */
+ /* Works from the bottom of the symbol up */
+
+ int addon_latch = 0;
+
+ for (r = 0; r < symbol->rows; r++) {
+ this_row = symbol->rows - r - 1; /* invert r otherwise plots upside down */
+ if (symbol->row_height[this_row] == 0) {
+ row_height = large_bar_height;
+ } else {
+ row_height = symbol->row_height[this_row];
+ }
+ row_posn = 0;
+ for (i = 0; i < r; i++) {
+ if (symbol->row_height[symbol->rows - i - 1] == 0) {
+ row_posn += large_bar_height;
+ } else {
+ row_posn += symbol->row_height[symbol->rows - i - 1];
+ }
+ }
+ row_posn += (textoffset + yoffset);
+
+ if ((symbol->output_options & BARCODE_DOTTY_MODE) != 0) {
+ if ((symbol->output_options & CMYK_COLOUR) == 0) {
+ fprintf(feps, "%.2f %.2f %.2f setrgbcolor\n", red_ink, green_ink, blue_ink);
+ } else {
+ fprintf(feps, "%.2f %.2f %.2f %.2f setcmykcolor\n", cyan_ink, magenta_ink, yellow_ink, black_ink);
+ }
+
+ /* Use dots instead of squares */
+ for (i = 0; i < symbol->width; i++) {
+ if (module_is_set(symbol, this_row, i)) {
+ fprintf(feps, "%.2f %.2f %.2f TD\n", ((i + xoffset) * scaler) + (scaler / 2.0), (row_posn * scaler) + (scaler / 2.0), (symbol->dot_size / 2.0) * scaler);
+ }
+ }
+ } else {
+ /* Normal mode, with rectangles */
+
+ fprintf(feps, "TE\n");
+ if ((symbol->output_options & CMYK_COLOUR) == 0) {
+ fprintf(feps, "%.2f %.2f %.2f setrgbcolor\n", red_ink, green_ink, blue_ink);
+ } else {
+ fprintf(feps, "%.2f %.2f %.2f %.2f setcmykcolor\n", cyan_ink, magenta_ink, yellow_ink, black_ink);
+ }
+
+ fprintf(feps, "%.2f %.2f ", row_height * scaler, row_posn * scaler);
+ i = 0;
+ if (module_is_set(symbol, this_row, 0)) {
+ latch = 1;
+ } else {
+ latch = 0;
+ }
+
+ do {
+ block_width = 0;
+ do {
+ block_width++;
+ } while (module_is_set(symbol, this_row, i + block_width) == module_is_set(symbol, this_row, i));
+ if ((addon_latch == 0) && (r == 0) && (i > main_width)) {
+ fprintf(feps, "TE\n");
+ if ((symbol->output_options & CMYK_COLOUR) == 0) {
+ fprintf(feps, "%.2f %.2f %.2f setrgbcolor\n", red_ink, green_ink, blue_ink);
+ } else {
+ fprintf(feps, "%.2f %.2f %.2f %.2f setcmykcolor\n", cyan_ink, magenta_ink, yellow_ink, black_ink);
+ }
+ fprintf(feps, "%.2f %.2f ", (row_height - 5.0) * scaler, (row_posn - 5.0) * scaler);
+ addon_text_posn = row_posn + row_height - 8.0;
+ addon_latch = 1;
+ }
+ if (latch == 1) {
+ /* a bar */
+ fprintf(feps, "TB %.2f %.2f TR\n", (i + xoffset) * scaler, block_width * scaler);
+ latch = 0;
+ } else {
+ /* a space */
+ latch = 1;
+ }
+ i += block_width;
+
+ } while (i < symbol->width);
+ }
+ }
+ }
+ /* That's done the actual data area, everything else is human-friendly */
+
+ xoffset += comp_offset;
+
+ if ((((symbol->symbology == BARCODE_EANX) && (symbol->rows == 1)) || (symbol->symbology == BARCODE_EANX_CC)) ||
+ (symbol->symbology == BARCODE_ISBNX)) {
+ /* guard bar extensions and text formatting for EAN8 and EAN13 */
+ switch (ustrlen(local_text)) {
+ case 8: /* EAN-8 */
+ case 11:
+ case 14:
+ fprintf(feps, "TE\n");
+ if ((symbol->output_options & CMYK_COLOUR) == 0) {
+ fprintf(feps, "%.2f %.2f %.2f setrgbcolor\n", red_ink, green_ink, blue_ink);
+ } else {
+ fprintf(feps, "%.2f %.2f %.2f %.2f setcmykcolor\n", cyan_ink, magenta_ink, yellow_ink, black_ink);
+ }
+ fprintf(feps, "%.2f %.2f ", 5.0 * scaler, (4.0 + yoffset) * scaler);
+ fprintf(feps, "TB %.2f %.2f TR\n", (0 + xoffset) * scaler, 1 * scaler);
+ fprintf(feps, "TB %.2f %.2f TR\n", (2 + xoffset) * scaler, 1 * scaler);
+ fprintf(feps, "TB %.2f %.2f TR\n", (32 + xoffset) * scaler, 1 * scaler);
+ fprintf(feps, "TB %.2f %.2f TR\n", (34 + xoffset) * scaler, 1 * scaler);
+ fprintf(feps, "TB %.2f %.2f TR\n", (64 + xoffset) * scaler, 1 * scaler);
+ fprintf(feps, "TB %.2f %.2f TR\n", (66 + xoffset) * scaler, 1 * scaler);
+ for (i = 0; i < 4; i++) {
+ textpart[i] = local_text[i];
+ }
+ textpart[4] = '\0';
+ fprintf(feps, "TE\n");
+ if ((symbol->output_options & CMYK_COLOUR) == 0) {
+ fprintf(feps, "%.2f %.2f %.2f setrgbcolor\n", red_ink, green_ink, blue_ink);
+ } else {
+ fprintf(feps, "%.2f %.2f %.2f %.2f setcmykcolor\n", cyan_ink, magenta_ink, yellow_ink, black_ink);
+ }
+ fprintf(feps, "matrix currentmatrix\n");
+ fprintf(feps, "/Helvetica findfont\n");
+ fprintf(feps, "%.2f scalefont setfont\n", 11.0 * scaler);
+ textpos = 17;
+ fprintf(feps, " 0 0 moveto %.2f %.2f translate 0.00 rotate 0 0 moveto\n", (textpos + xoffset) * scaler, default_text_posn);
+ fprintf(feps, " (%s) stringwidth\n", textpart);
+ fprintf(feps, "pop\n");
+ fprintf(feps, "-2 div 0 rmoveto\n");
+ fprintf(feps, " (%s) show\n", textpart);
+ fprintf(feps, "setmatrix\n");
+ for (i = 0; i < 4; i++) {
+ textpart[i] = local_text[i + 4];
+ }
+ textpart[4] = '\0';
+ fprintf(feps, "matrix currentmatrix\n");
+ fprintf(feps, "/Helvetica findfont\n");
+ fprintf(feps, "%.2f scalefont setfont\n", 11.0 * scaler);
+ textpos = 50;
+ fprintf(feps, " 0 0 moveto %.2f %.2f translate 0.00 rotate 0 0 moveto\n", (textpos + xoffset) * scaler, default_text_posn);
+ fprintf(feps, " (%s) stringwidth\n", textpart);
+ fprintf(feps, "pop\n");
+ fprintf(feps, "-2 div 0 rmoveto\n");
+ fprintf(feps, " (%s) show\n", textpart);
+ fprintf(feps, "setmatrix\n");
+ textdone = 1;
+ switch (strlen(addon)) {
+ case 2:
+ fprintf(feps, "matrix currentmatrix\n");
+ fprintf(feps, "/Helvetica findfont\n");
+ fprintf(feps, "%.2f scalefont setfont\n", 11.0 * scaler);
+ textpos = xoffset + 86;
+ fprintf(feps, " 0 0 moveto %.2f %.2f translate 0.00 rotate 0 0 moveto\n", textpos * scaler, addon_text_posn * scaler);
+ fprintf(feps, " (%s) stringwidth\n", addon);
+ fprintf(feps, "pop\n");
+ fprintf(feps, "-2 div 0 rmoveto\n");
+ fprintf(feps, " (%s) show\n", addon);
+ fprintf(feps, "setmatrix\n");
+ break;
+ case 5:
+ fprintf(feps, "matrix currentmatrix\n");
+ fprintf(feps, "/Helvetica findfont\n");
+ fprintf(feps, "%.2f scalefont setfont\n", 11.0 * scaler);
+ textpos = xoffset + 100;
+ fprintf(feps, " 0 0 moveto %.2f %.2f translate 0.00 rotate 0 0 moveto\n", textpos * scaler, addon_text_posn * scaler);
+ fprintf(feps, " (%s) stringwidth\n", addon);
+ fprintf(feps, "pop\n");
+ fprintf(feps, "-2 div 0 rmoveto\n");
+ fprintf(feps, " (%s) show\n", addon);
+ fprintf(feps, "setmatrix\n");
+ break;
+ }
+
+ break;
+ case 13: /* EAN 13 */
+ case 16:
+ case 19:
+ fprintf(feps, "TE\n");
+ if ((symbol->output_options & CMYK_COLOUR) == 0) {
+ fprintf(feps, "%.2f %.2f %.2f setrgbcolor\n", red_ink, green_ink, blue_ink);
+ } else {
+ fprintf(feps, "%.2f %.2f %.2f %.2f setcmykcolor\n", cyan_ink, magenta_ink, yellow_ink, black_ink);
+ }
+ fprintf(feps, "%.2f %.2f ", 5.0 * scaler, (4.0 + yoffset) * scaler);
+ fprintf(feps, "TB %.2f %.2f TR\n", (0 + xoffset) * scaler, 1 * scaler);
+ fprintf(feps, "TB %.2f %.2f TR\n", (2 + xoffset) * scaler, 1 * scaler);
+ fprintf(feps, "TB %.2f %.2f TR\n", (46 + xoffset) * scaler, 1 * scaler);
+ fprintf(feps, "TB %.2f %.2f TR\n", (48 + xoffset) * scaler, 1 * scaler);
+ fprintf(feps, "TB %.2f %.2f TR\n", (92 + xoffset) * scaler, 1 * scaler);
+ fprintf(feps, "TB %.2f %.2f TR\n", (94 + xoffset) * scaler, 1 * scaler);
+ textpart[0] = local_text[0];
+ textpart[1] = '\0';
+ fprintf(feps, "TE\n");
+ if ((symbol->output_options & CMYK_COLOUR) == 0) {
+ fprintf(feps, "%.2f %.2f %.2f setrgbcolor\n", red_ink, green_ink, blue_ink);
+ } else {
+ fprintf(feps, "%.2f %.2f %.2f %.2f setcmykcolor\n", cyan_ink, magenta_ink, yellow_ink, black_ink);
+ }
+ fprintf(feps, "matrix currentmatrix\n");
+ fprintf(feps, "/Helvetica findfont\n");
+ fprintf(feps, "%.2f scalefont setfont\n", 11.0 * scaler);
+ textpos = -7;
+ fprintf(feps, " 0 0 moveto %.2f %.2f translate 0.00 rotate 0 0 moveto\n", (textpos + xoffset) * scaler, default_text_posn);
+ fprintf(feps, " (%s) stringwidth\n", textpart);
+ fprintf(feps, "pop\n");
+ fprintf(feps, "-2 div 0 rmoveto\n");
+ fprintf(feps, " (%s) show\n", textpart);
+ fprintf(feps, "setmatrix\n");
+ for (i = 0; i < 6; i++) {
+ textpart[i] = local_text[i + 1];
+ }
+ textpart[6] = '\0';
+ fprintf(feps, "matrix currentmatrix\n");
+ fprintf(feps, "/Helvetica findfont\n");
+ fprintf(feps, "%.2f scalefont setfont\n", 11.0 * scaler);
+ textpos = 24;
+ fprintf(feps, " 0 0 moveto %.2f %.2f translate 0.00 rotate 0 0 moveto\n", (textpos + xoffset) * scaler, default_text_posn);
+ fprintf(feps, " (%s) stringwidth\n", textpart);
+ fprintf(feps, "pop\n");
+ fprintf(feps, "-2 div 0 rmoveto\n");
+ fprintf(feps, " (%s) show\n", textpart);
+ fprintf(feps, "setmatrix\n");
+ for (i = 0; i < 6; i++) {
+ textpart[i] = local_text[i + 7];
+ }
+ textpart[6] = '\0';
+ fprintf(feps, "matrix currentmatrix\n");
+ fprintf(feps, "/Helvetica findfont\n");
+ fprintf(feps, "%.2f scalefont setfont\n", 11.0 * scaler);
+ textpos = 71;
+ fprintf(feps, " 0 0 moveto %.2f %.2f translate 0.00 rotate 0 0 moveto\n", (textpos + xoffset) * scaler, default_text_posn);
+ fprintf(feps, " (%s) stringwidth\n", textpart);
+ fprintf(feps, "pop\n");
+ fprintf(feps, "-2 div 0 rmoveto\n");
+ fprintf(feps, " (%s) show\n", textpart);
+ fprintf(feps, "setmatrix\n");
+ textdone = 1;
+ switch (strlen(addon)) {
+ case 2:
+ fprintf(feps, "matrix currentmatrix\n");
+ fprintf(feps, "/Helvetica findfont\n");
+ fprintf(feps, "%.2f scalefont setfont\n", 11.0 * scaler);
+ textpos = xoffset + 114;
+ fprintf(feps, " 0 0 moveto %.2f %.2f translate 0.00 rotate 0 0 moveto\n", textpos * scaler, addon_text_posn * scaler);
+ fprintf(feps, " (%s) stringwidth\n", addon);
+ fprintf(feps, "pop\n");
+ fprintf(feps, "-2 div 0 rmoveto\n");
+ fprintf(feps, " (%s) show\n", addon);
+ fprintf(feps, "setmatrix\n");
+ break;
+ case 5:
+ fprintf(feps, "matrix currentmatrix\n");
+ fprintf(feps, "/Helvetica findfont\n");
+ fprintf(feps, "%.2f scalefont setfont\n", 11.0 * scaler);
+ textpos = xoffset + 128;
+ fprintf(feps, " 0 0 moveto %.2f %.2f translate 0.00 rotate 0 0 moveto\n", textpos * scaler, addon_text_posn * scaler);
+ fprintf(feps, " (%s) stringwidth\n", addon);
+ fprintf(feps, "pop\n");
+ fprintf(feps, "-2 div 0 rmoveto\n");
+ fprintf(feps, " (%s) show\n", addon);
+ fprintf(feps, "setmatrix\n");
+ break;
+ }
+ break;
+
+ }
+ }
+
+ if (((symbol->symbology == BARCODE_UPCA) && (symbol->rows == 1)) || (symbol->symbology == BARCODE_UPCA_CC)) {
+ /* guard bar extensions and text formatting for UPCA */
+ fprintf(feps, "TE\n");
+ if ((symbol->output_options & CMYK_COLOUR) == 0) {
+ fprintf(feps, "%.2f %.2f %.2f setrgbcolor\n", red_ink, green_ink, blue_ink);
+ } else {
+ fprintf(feps, "%.2f %.2f %.2f %.2f setcmykcolor\n", cyan_ink, magenta_ink, yellow_ink, black_ink);
+ }
+ fprintf(feps, "%.2f %.2f ", 5.0 * scaler, (4.0 + yoffset) * scaler);
+ latch = 1;
+
+ i = 0 + comp_offset;
+ do {
+ block_width = 0;
+ do {
+ block_width++;
+ } while (module_is_set(symbol, symbol->rows - 1, i + block_width) == module_is_set(symbol, symbol->rows - 1, i));
+ if (latch == 1) {
+ /* a bar */
+ fprintf(feps, "TB %.2f %.2f TR\n", (i + xoffset - comp_offset) * scaler, block_width * scaler);
+ latch = 0;
+ } else {
+ /* a space */
+ latch = 1;
+ }
+ i += block_width;
+ } while (i < 11 + comp_offset);
+ fprintf(feps, "TB %.2f %.2f TR\n", (46 + xoffset) * scaler, 1 * scaler);
+ fprintf(feps, "TB %.2f %.2f TR\n", (48 + xoffset) * scaler, 1 * scaler);
+ latch = 1;
+ i = 85 + comp_offset;
+ do {
+ block_width = 0;
+ do {
+ block_width++;
+ } while (module_is_set(symbol, symbol->rows - 1, i + block_width) == module_is_set(symbol, symbol->rows - 1, i));
+ if (latch == 1) {
+ /* a bar */
+ fprintf(feps, "TB %.2f %.2f TR\n", (i + xoffset - comp_offset) * scaler, block_width * scaler);
+ latch = 0;
+ } else {
+ /* a space */
+ latch = 1;
+ }
+ i += block_width;
+ } while (i < 96 + comp_offset);
+ textpart[0] = local_text[0];
+ textpart[1] = '\0';
+ fprintf(feps, "TE\n");
+ if ((symbol->output_options & CMYK_COLOUR) == 0) {
+ fprintf(feps, "%.2f %.2f %.2f setrgbcolor\n", red_ink, green_ink, blue_ink);
+ } else {
+ fprintf(feps, "%.2f %.2f %.2f %.2f setcmykcolor\n", cyan_ink, magenta_ink, yellow_ink, black_ink);
+ }
+ fprintf(feps, "matrix currentmatrix\n");
+ fprintf(feps, "/Helvetica findfont\n");
+ fprintf(feps, "%.2f scalefont setfont\n", 8.0 * scaler);
+ textpos = -5;
+ fprintf(feps, " 0 0 moveto %.2f %.2f translate 0.00 rotate 0 0 moveto\n", (textpos + xoffset) * scaler, default_text_posn);
+ fprintf(feps, " (%s) stringwidth\n", textpart);
+ fprintf(feps, "pop\n");
+ fprintf(feps, "-2 div 0 rmoveto\n");
+ fprintf(feps, " (%s) show\n", textpart);
+ fprintf(feps, "setmatrix\n");
+ for (i = 0; i < 5; i++) {
+ textpart[i] = local_text[i + 1];
+ }
+ textpart[5] = '\0';
+ fprintf(feps, "matrix currentmatrix\n");
+ fprintf(feps, "/Helvetica findfont\n");
+ fprintf(feps, "%.2f scalefont setfont\n", 11.0 * scaler);
+ textpos = 27;
+ fprintf(feps, " 0 0 moveto %.2f %.2f translate 0.00 rotate 0 0 moveto\n", (textpos + xoffset) * scaler, default_text_posn);
+ fprintf(feps, " (%s) stringwidth\n", textpart);
+ fprintf(feps, "pop\n");
+ fprintf(feps, "-2 div 0 rmoveto\n");
+ fprintf(feps, " (%s) show\n", textpart);
+ fprintf(feps, "setmatrix\n");
+ for (i = 0; i < 5; i++) {
+ textpart[i] = local_text[i + 6];
+ }
+ textpart[6] = '\0';
+ fprintf(feps, "matrix currentmatrix\n");
+ fprintf(feps, "/Helvetica findfont\n");
+ fprintf(feps, "%.2f scalefont setfont\n", 11.0 * scaler);
+ textpos = 68;
+ fprintf(feps, " 0 0 moveto %.2f %.2f translate 0.00 rotate 0 0 moveto\n", (textpos + xoffset) * scaler, default_text_posn);
+ fprintf(feps, " (%s) stringwidth\n", textpart);
+ fprintf(feps, "pop\n");
+ fprintf(feps, "-2 div 0 rmoveto\n");
+ fprintf(feps, " (%s) show\n", textpart);
+ fprintf(feps, "setmatrix\n");
+ textpart[0] = local_text[11];
+ textpart[1] = '\0';
+ fprintf(feps, "matrix currentmatrix\n");
+ fprintf(feps, "/Helvetica findfont\n");
+ fprintf(feps, "%.2f scalefont setfont\n", 8.0 * scaler);
+ textpos = 100;
+ fprintf(feps, " 0 0 moveto %.2f %.2f translate 0.00 rotate 0 0 moveto\n", (textpos + xoffset) * scaler, default_text_posn);
+ fprintf(feps, " (%s) stringwidth\n", textpart);
+ fprintf(feps, "pop\n");
+ fprintf(feps, "-2 div 0 rmoveto\n");
+ fprintf(feps, " (%s) show\n", textpart);
+ fprintf(feps, "setmatrix\n");
+ textdone = 1;
+ switch (strlen(addon)) {
+ case 2:
+ fprintf(feps, "matrix currentmatrix\n");
+ fprintf(feps, "/Helvetica findfont\n");
+ fprintf(feps, "%.2f scalefont setfont\n", 11.0 * scaler);
+ textpos = xoffset + 116;
+ fprintf(feps, " 0 0 moveto %.2f %.2f translate 0.00 rotate 0 0 moveto\n", textpos * scaler, addon_text_posn * scaler);
+ fprintf(feps, " (%s) stringwidth\n", addon);
+ fprintf(feps, "pop\n");
+ fprintf(feps, "-2 div 0 rmoveto\n");
+ fprintf(feps, " (%s) show\n", addon);
+ fprintf(feps, "setmatrix\n");
+ break;
+ case 5:
+ fprintf(feps, "matrix currentmatrix\n");
+ fprintf(feps, "/Helvetica findfont\n");
+ fprintf(feps, "%.2f scalefont setfont\n", 11.0 * scaler);
+ textpos = xoffset + 130;
+ fprintf(feps, " 0 0 moveto %.2f %.2f translate 0.00 rotate 0 0 moveto\n", textpos * scaler, addon_text_posn * scaler);
+ fprintf(feps, " (%s) stringwidth\n", addon);
+ fprintf(feps, "pop\n");
+ fprintf(feps, "-2 div 0 rmoveto\n");
+ fprintf(feps, " (%s) show\n", addon);
+ fprintf(feps, "setmatrix\n");
+ break;
+ }
+
+ }
+
+ if (((symbol->symbology == BARCODE_UPCE) && (symbol->rows == 1)) || (symbol->symbology == BARCODE_UPCE_CC)) {
+ /* guard bar extensions and text formatting for UPCE */
+ fprintf(feps, "TE\n");
+ if ((symbol->output_options & CMYK_COLOUR) == 0) {
+ fprintf(feps, "%.2f %.2f %.2f setrgbcolor\n", red_ink, green_ink, blue_ink);
+ } else {
+ fprintf(feps, "%.2f %.2f %.2f %.2f setcmykcolor\n", cyan_ink, magenta_ink, yellow_ink, black_ink);
+ }
+ fprintf(feps, "%.2f %.2f ", 5.0 * scaler, (4.0 + yoffset) * scaler);
+ fprintf(feps, "TB %.2f %.2f TR\n", (0 + xoffset) * scaler, 1 * scaler);
+ fprintf(feps, "TB %.2f %.2f TR\n", (2 + xoffset) * scaler, 1 * scaler);
+ fprintf(feps, "TB %.2f %.2f TR\n", (46 + xoffset) * scaler, 1 * scaler);
+ fprintf(feps, "TB %.2f %.2f TR\n", (48 + xoffset) * scaler, 1 * scaler);
+ fprintf(feps, "TB %.2f %.2f TR\n", (50 + xoffset) * scaler, 1 * scaler);
+ textpart[0] = local_text[0];
+ textpart[1] = '\0';
+ fprintf(feps, "TE\n");
+ fprintf(feps, "%.2f %.2f %.2f setrgbcolor\n", red_ink, green_ink, blue_ink);
+ fprintf(feps, "matrix currentmatrix\n");
+ fprintf(feps, "/Helvetica findfont\n");
+ fprintf(feps, "%.2f scalefont setfont\n", 8.0 * scaler);
+ textpos = -5;
+ fprintf(feps, " 0 0 moveto %.2f %.2f translate 0.00 rotate 0 0 moveto\n", (textpos + xoffset) * scaler, default_text_posn);
+ fprintf(feps, " (%s) stringwidth\n", textpart);
+ fprintf(feps, "pop\n");
+ fprintf(feps, "-2 div 0 rmoveto\n");
+ fprintf(feps, " (%s) show\n", textpart);
+ fprintf(feps, "setmatrix\n");
+ for (i = 0; i < 6; i++) {
+ textpart[i] = local_text[i + 1];
+ }
+ textpart[6] = '\0';
+ fprintf(feps, "matrix currentmatrix\n");
+ fprintf(feps, "/Helvetica findfont\n");
+ fprintf(feps, "%.2f scalefont setfont\n", 11.0 * scaler);
+ textpos = 24;
+ fprintf(feps, " 0 0 moveto %.2f %.2f translate 0.00 rotate 0 0 moveto\n", (textpos + xoffset) * scaler, default_text_posn);
+ fprintf(feps, " (%s) stringwidth\n", textpart);
+ fprintf(feps, "pop\n");
+ fprintf(feps, "-2 div 0 rmoveto\n");
+ fprintf(feps, " (%s) show\n", textpart);
+ fprintf(feps, "setmatrix\n");
+ textpart[0] = local_text[7];
+ textpart[1] = '\0';
+ fprintf(feps, "matrix currentmatrix\n");
+ fprintf(feps, "/Helvetica findfont\n");
+ fprintf(feps, "%.2f scalefont setfont\n", 8.0 * scaler);
+ textpos = 55;
+ fprintf(feps, " 0 0 moveto %.2f %.2f translate 0.00 rotate 0 0 moveto\n", (textpos + xoffset) * scaler, default_text_posn);
+ fprintf(feps, " (%s) stringwidth\n", textpart);
+ fprintf(feps, "pop\n");
+ fprintf(feps, "-2 div 0 rmoveto\n");
+ fprintf(feps, " (%s) show\n", textpart);
+ fprintf(feps, "setmatrix\n");
+ textdone = 1;
+ switch (strlen(addon)) {
+ case 2:
+ fprintf(feps, "matrix currentmatrix\n");
+ fprintf(feps, "/Helvetica findfont\n");
+ fprintf(feps, "%.2f scalefont setfont\n", 11.0 * scaler);
+ textpos = xoffset + 70;
+ fprintf(feps, " 0 0 moveto %.2f %.2f translate 0.00 rotate 0 0 moveto\n", textpos * scaler, addon_text_posn * scaler);
+ fprintf(feps, " (%s) stringwidth\n", addon);
+ fprintf(feps, "pop\n");
+ fprintf(feps, "-2 div 0 rmoveto\n");
+ fprintf(feps, " (%s) show\n", addon);
+ fprintf(feps, "setmatrix\n");
+ break;
+ case 5:
+ fprintf(feps, "matrix currentmatrix\n");
+ fprintf(feps, "/Helvetica findfont\n");
+ fprintf(feps, "%.2f scalefont setfont\n", 11.0 * scaler);
+ textpos = xoffset + 84;
+ fprintf(feps, " 0 0 moveto %.2f %.2f translate 0.00 rotate 0 0 moveto\n", textpos * scaler, addon_text_posn * scaler);
+ fprintf(feps, " (%s) stringwidth\n", addon);
+ fprintf(feps, "pop\n");
+ fprintf(feps, "-2 div 0 rmoveto\n");
+ fprintf(feps, " (%s) show\n", addon);
+ fprintf(feps, "setmatrix\n");
+ break;
+ }
+
+ }
+
+ xoffset -= comp_offset;
+
+ switch (symbol->symbology) {
+ case BARCODE_MAXICODE:
+ /* Do nothing! (It's already been done) */
+ break;
+ default:
+ if (symbol->output_options & BARCODE_BIND) {
+ if ((symbol->rows > 1) && (is_stackable(symbol->symbology) == 1)) {
+ /* row binding */
+ fprintf(feps, "TE\n");
+ if ((symbol->output_options & CMYK_COLOUR) == 0) {
+ fprintf(feps, "%.2f %.2f %.2f setrgbcolor\n", red_ink, green_ink, blue_ink);
+ } else {
+ fprintf(feps, "%.2f %.2f %.2f %.2f setcmykcolor\n", cyan_ink, magenta_ink, yellow_ink, black_ink);
+ }
+ if (symbol->symbology != BARCODE_CODABLOCKF) {
+ for (r = 1; r < symbol->rows; r++) {
+ fprintf(feps, "%.2f %.2f TB %.2f %.2f TR\n", 2.0 * scaler, ((r * row_height) + textoffset + yoffset - 1) * scaler, xoffset * scaler, symbol->width * scaler);
+ }
+ } else {
+ for (r = 1; r < symbol->rows; r++) {
+ fprintf(feps, "%.2f %.2f TB %.2f %.2f TR\n", 2.0 * scaler, ((r * row_height) + textoffset + yoffset - 1) * scaler, (xoffset + 11) * scaler, (symbol->width - 25) * scaler);
+ }
+ }
+ }
+ }
+ if ((symbol->output_options & BARCODE_BOX) || (symbol->output_options & BARCODE_BIND)) {
+ fprintf(feps, "TE\n");
+ if ((symbol->output_options & CMYK_COLOUR) == 0) {
+ fprintf(feps, "%.2f %.2f %.2f setrgbcolor\n", red_ink, green_ink, blue_ink);
+ } else {
+ fprintf(feps, "%.2f %.2f %.2f %.2f setcmykcolor\n", cyan_ink, magenta_ink, yellow_ink, black_ink);
+ }
+ if (symbol->symbology != BARCODE_CODABLOCKF) {
+ fprintf(feps, "%.2f %.2f TB %.2f %.2f TR\n", symbol->border_width * scaler, textoffset * scaler, 0.0, (symbol->width + xoffset + xoffset) * scaler);
+ fprintf(feps, "%.2f %.2f TB %.2f %.2f TR\n", symbol->border_width * scaler, (textoffset + symbol->height + symbol->border_width) * scaler, 0.0, (symbol->width + xoffset + xoffset) * scaler);
+ } else {
+ fprintf(feps, "%.2f %.2f TB %.2f %.2f TR\n", symbol->border_width * scaler, textoffset * scaler, xoffset * scaler, symbol->width * scaler);
+ fprintf(feps, "%.2f %.2f TB %.2f %.2f TR\n", symbol->border_width * scaler, (textoffset + symbol->height + symbol->border_width) * scaler, xoffset * scaler, symbol->width * scaler);
+ }
+ }
+ if (symbol->output_options & BARCODE_BOX) {
+ /* side bars */
+ fprintf(feps, "TE\n");
+ if ((symbol->output_options & CMYK_COLOUR) == 0) {
+ fprintf(feps, "%.2f %.2f %.2f setrgbcolor\n", red_ink, green_ink, blue_ink);
+ } else {
+ fprintf(feps, "%.2f %.2f %.2f %.2f setcmykcolor\n", cyan_ink, magenta_ink, yellow_ink, black_ink);
+ }
+ fprintf(feps, "%.2f %.2f TB %.2f %.2f TR\n", (symbol->height + (2 * symbol->border_width)) * scaler, textoffset * scaler, 0.0, symbol->border_width * scaler);
+ fprintf(feps, "%.2f %.2f TB %.2f %.2f TR\n", (symbol->height + (2 * symbol->border_width)) * scaler, textoffset * scaler, (symbol->width + xoffset + xoffset - symbol->border_width) * scaler, symbol->border_width * scaler);
+ }
+ break;
+ }
+
+ /* Put the human readable text at the bottom */
+ if ((textdone == 0) && (ustrlen(local_text))) {
+ fprintf(feps, "TE\n");
+ if ((symbol->output_options & CMYK_COLOUR) == 0) {
+ fprintf(feps, "%.2f %.2f %.2f setrgbcolor\n", red_ink, green_ink, blue_ink);
+ } else {
+ fprintf(feps, "%.2f %.2f %.2f %.2f setcmykcolor\n", cyan_ink, magenta_ink, yellow_ink, black_ink);
+ }
+ fprintf(feps, "matrix currentmatrix\n");
+ fprintf(feps, "/Helvetica findfont\n");
+ fprintf(feps, "%.2f scalefont setfont\n", 8.0 * scaler);
+ textpos = symbol->width / 2.0;
+ fprintf(feps, " 0 0 moveto %.2f %.2f translate 0.00 rotate 0 0 moveto\n", (textpos + xoffset) * scaler, default_text_posn);
+ fprintf(feps, " (%s) stringwidth\n", local_text);
+ fprintf(feps, "pop\n");
+ fprintf(feps, "-2 div 0 rmoveto\n");
+ fprintf(feps, " (%s) show\n", local_text);
+ fprintf(feps, "setmatrix\n");
+ }
+ fprintf(feps, "\nshowpage\n");
+
+ if (symbol->output_options & BARCODE_STDOUT) {
+ fflush(feps);
+ } else {
+ fclose(feps);
+ }
+
+ if (locale)
+ setlocale(LC_ALL, locale);
+
+#ifdef _MSC_VER
+ free(local_text);
+#endif
+
+ return error_number;
+}
diff --git a/3rdparty/zint-2.6.1/backend/qr.c b/3rdparty/zint-2.6.1/backend/qr.c
new file mode 100644
index 0000000..b6aabc4
--- /dev/null
+++ b/3rdparty/zint-2.6.1/backend/qr.c
@@ -0,0 +1,2983 @@
+/* qr.c Handles QR Code */
+
+/*
+ libzint - the open source barcode library
+ Copyright (C) 2009 -2017 Robin Stuart
+
+ Redistribution and use in source and binary forms, with or without
+ modification, are permitted provided that the following conditions
+ are met:
+
+ 1. Redistributions of source code must retain the above copyright
+ notice, this list of conditions and the following disclaimer.
+ 2. Redistributions in binary form must reproduce the above copyright
+ notice, this list of conditions and the following disclaimer in the
+ documentation and/or other materials provided with the distribution.
+ 3. Neither the name of the project nor the names of its contributors
+ may be used to endorse or promote products derived from this software
+ without specific prior written permission.
+
+ THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND
+ ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+ ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE
+ FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+ DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
+ OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
+ HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
+ LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
+ OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+ SUCH DAMAGE.
+ */
+
+#include
+#ifdef _MSC_VER
+#include
+#endif
+#include "common.h"
+#include
+#include "sjis.h"
+#include "qr.h"
+#include "reedsol.h"
+#include /* abs */
+#include
+
+extern int utf_to_eci(const int eci, const unsigned char source[], unsigned char dest[], size_t *length); /* Convert Unicode to other encodings */
+
+/* Returns true if input glyph is in the Alphanumeric set */
+static int in_alpha(const int glyph) {
+ int retval = 0;
+ char cglyph = (char) glyph;
+
+ if ((cglyph >= '0') && (cglyph <= '9')) {
+ retval = 1;
+ }
+ if ((cglyph >= 'A') && (cglyph <= 'Z')) {
+ retval = 1;
+ }
+ switch (cglyph) {
+ case ' ':
+ case '$':
+ case '%':
+ case '*':
+ case '+':
+ case '-':
+ case '.':
+ case '/':
+ case ':':
+ retval = 1;
+ break;
+ }
+
+ return retval;
+}
+
+static void define_mode(char mode[],const int jisdata[], const size_t length,const int gs1) {
+ /* Values placed into mode[] are: K = Kanji, B = Binary, A = Alphanumeric, N = Numeric */
+ size_t i;
+ int mlen, j;
+
+ for (i = 0; i < length; i++) {
+ if (jisdata[i] > 0xff) {
+ mode[i] = 'K';
+ } else {
+ mode[i] = 'B';
+ if (in_alpha(jisdata[i])) {
+ mode[i] = 'A';
+ }
+ if (gs1 && (jisdata[i] == '[')) {
+ mode[i] = 'A';
+ }
+ if ((jisdata[i] >= '0') && (jisdata[i] <= '9')) {
+ mode[i] = 'N';
+ }
+ }
+ }
+
+ /* If less than 6 numeric digits together then don't use numeric mode */
+ for (i = 0; i < length; i++) {
+ if (mode[i] == 'N') {
+ if (((i != 0) && (mode[i - 1] != 'N')) || (i == 0)) {
+ mlen = 0;
+ while (((mlen + i) < length) && (mode[mlen + i] == 'N')) {
+ mlen++;
+ };
+ if (mlen < 6) {
+ for (j = 0; j < mlen; j++) {
+ mode[i + j] = 'A';
+ }
+ }
+ }
+ }
+ }
+
+ /* If less than 4 alphanumeric characters together then don't use alphanumeric mode */
+ for (i = 0; i < length; i++) {
+ if (mode[i] == 'A') {
+ if (((i != 0) && (mode[i - 1] != 'A')) || (i == 0)) {
+ mlen = 0;
+ while (((mlen + i) < length) && (mode[mlen + i] == 'A')) {
+ mlen++;
+ };
+ if (mlen < 6) {
+ for (j = 0; j < mlen; j++) {
+ mode[i + j] = 'B';
+ }
+ }
+ }
+ }
+ }
+}
+
+/* Choose from three numbers based on version */
+static int tribus(const int version,const int a,const int b,const int c) {
+ int RetVal;
+
+ RetVal = c;
+
+ if (version < 10) {
+ RetVal = a;
+ }
+
+ if ((version >= 10) && (version <= 26)) {
+ RetVal = b;
+ }
+
+ return RetVal;
+}
+
+/* Convert input data to a binary stream and add padding */
+static void qr_binary(int datastream[], const int version, const int target_binlen, const char mode[], const int jisdata[], const size_t length, const int gs1, const int eci, const int est_binlen,const int debug) {
+ int position = 0;
+ int short_data_block_length, i;
+ char data_block, padbits;
+ int current_binlen, current_bytes;
+ int toggle, percent;
+
+#ifndef _MSC_VER
+ char binary[est_binlen + 12];
+#else
+ char* binary = (char *) _alloca(est_binlen + 12);
+#endif
+ strcpy(binary, "");
+
+ if (gs1) {
+ strcat(binary, "0101"); /* FNC1 */
+ }
+
+ if (eci != 3) {
+ strcat(binary, "0111"); /* ECI (Table 4) */
+ if (eci <= 127) {
+ bin_append(eci, 8, binary); /* 000000 to 000127 */
+ } else if (eci <= 16383) {
+ bin_append(0x8000 + eci, 16, binary); /* 000000 to 016383 */
+ } else {
+ bin_append(0xC00000 + eci, 24, binary); /* 000000 to 999999 */
+ }
+ }
+
+ if (debug) {
+ for (i = 0; i < length; i++) {
+ printf("%c", mode[i]);
+ }
+ printf("\n");
+ }
+
+ percent = 0;
+
+ do {
+ data_block = mode[position];
+ short_data_block_length = 0;
+ do {
+ short_data_block_length++;
+ } while (((short_data_block_length + position) < length)
+ && (mode[position + short_data_block_length] == data_block));
+
+ switch (data_block) {
+ case 'K':
+ /* Kanji mode */
+ /* Mode indicator */
+ strcat(binary, "1000");
+
+ /* Character count indicator */
+ bin_append(short_data_block_length, tribus(version, 8, 10, 12), binary);
+
+ if (debug) {
+ printf("Kanji block (length %d)\n\t", short_data_block_length);
+ }
+
+ /* Character representation */
+ for (i = 0; i < short_data_block_length; i++) {
+ int jis = jisdata[position + i];
+ int prod;
+
+ if (jis >= 0x8140 && jis <= 0x9ffc)
+ jis -= 0x8140;
+
+ else if (jis >= 0xe040 && jis <= 0xebbf)
+ jis -= 0xc140;
+
+ prod = ((jis >> 8) * 0xc0) + (jis & 0xff);
+
+ bin_append(prod, 13, binary);
+
+ if (debug) {
+ printf("0x%4X ", prod);
+ }
+ }
+
+ if (debug) {
+ printf("\n");
+ }
+
+ break;
+ case 'B':
+ /* Byte mode */
+ /* Mode indicator */
+ strcat(binary, "0100");
+
+ /* Character count indicator */
+ bin_append(short_data_block_length, tribus(version, 8, 16, 16), binary);
+
+ if (debug) {
+ printf("Byte block (length %d)\n\t", short_data_block_length);
+ }
+
+ /* Character representation */
+ for (i = 0; i < short_data_block_length; i++) {
+ int byte = jisdata[position + i];
+
+ if (gs1 && (byte == '[')) {
+ byte = 0x1d; /* FNC1 */
+ }
+
+ bin_append(byte, 8, binary);
+
+ if (debug) {
+ printf("0x%2X(%d) ", byte, byte);
+ }
+ }
+
+ if (debug) {
+ printf("\n");
+ }
+
+ break;
+ case 'A':
+ /* Alphanumeric mode */
+ /* Mode indicator */
+ strcat(binary, "0010");
+
+ /* Character count indicator */
+ bin_append(short_data_block_length, tribus(version, 9, 11, 13), binary);
+
+ if (debug) {
+ printf("Alpha block (length %d)\n\t", short_data_block_length);
+ }
+
+ /* Character representation */
+ i = 0;
+ while (i < short_data_block_length) {
+ int count;
+ int first = 0, second = 0, prod;
+
+ if (percent == 0) {
+ if (gs1 && (jisdata[position + i] == '%')) {
+ first = posn(RHODIUM, '%');
+ second = posn(RHODIUM, '%');
+ count = 2;
+ prod = (first * 45) + second;
+ i++;
+ } else {
+ if (gs1 && (jisdata[position + i] == '[')) {
+ first = posn(RHODIUM, '%'); /* FNC1 */
+ } else {
+ first = posn(RHODIUM, (char) jisdata[position + i]);
+ }
+ count = 1;
+ i++;
+ prod = first;
+
+ if (i < short_data_block_length && mode[position + i] == 'A') {
+ if (gs1 && (jisdata[position + i] == '%')) {
+ second = posn(RHODIUM, '%');
+ count = 2;
+ prod = (first * 45) + second;
+ percent = 1;
+ } else {
+ if (gs1 && (jisdata[position + i] == '[')) {
+ second = posn(RHODIUM, '%'); /* FNC1 */
+ } else {
+ second = posn(RHODIUM, (char) jisdata[position + i]);
+ }
+ count = 2;
+ i++;
+ prod = (first * 45) + second;
+ }
+ }
+ }
+ } else {
+ first = posn(RHODIUM, '%');
+ count = 1;
+ i++;
+ prod = first;
+ percent = 0;
+
+ if (i < short_data_block_length && mode[position + i] == 'A') {
+ if (gs1 && (jisdata[position + i] == '%')) {
+ second = posn(RHODIUM, '%');
+ count = 2;
+ prod = (first * 45) + second;
+ percent = 1;
+ } else {
+ if (gs1 && (jisdata[position + i] == '[')) {
+ second = posn(RHODIUM, '%'); /* FNC1 */
+ } else {
+ second = posn(RHODIUM, (char) jisdata[position + i]);
+ }
+ count = 2;
+ i++;
+ prod = (first * 45) + second;
+ }
+ }
+ }
+
+ bin_append(prod, 1 + (5 * count), binary);
+
+ if (debug) {
+ printf("0x%4X ", prod);
+ }
+ };
+
+ if (debug) {
+ printf("\n");
+ }
+
+ break;
+ case 'N':
+ /* Numeric mode */
+ /* Mode indicator */
+ strcat(binary, "0001");
+
+ /* Character count indicator */
+ bin_append(short_data_block_length, tribus(version, 10, 12, 14), binary);
+
+ if (debug) {
+ printf("Number block (length %d)\n\t", short_data_block_length);
+ }
+
+ /* Character representation */
+ i = 0;
+ while (i < short_data_block_length) {
+ int count;
+ int first = 0, second = 0, third = 0, prod;
+
+ first = posn(NEON, (char) jisdata[position + i]);
+ count = 1;
+ prod = first;
+
+ if (i + 1 < short_data_block_length && mode[position + i + 1] == 'N') {
+ second = posn(NEON, (char) jisdata[position + i + 1]);
+ count = 2;
+ prod = (prod * 10) + second;
+
+ if (i + 2 < short_data_block_length && mode[position + i + 2] == 'N') {
+ third = posn(NEON, (char) jisdata[position + i + 2]);
+ count = 3;
+ prod = (prod * 10) + third;
+ }
+ }
+
+ bin_append(prod, 1 + (3 * count), binary);
+
+ if (debug) {
+ printf("0x%4X (%d)", prod, prod);
+ }
+
+ i += count;
+ };
+
+ if (debug) {
+ printf("\n");
+ }
+
+ break;
+ }
+
+ position += short_data_block_length;
+ } while (position < length);
+
+ /* Terminator */
+ strcat(binary, "0000");
+
+ current_binlen = (int)strlen(binary);
+ padbits = 8 - (current_binlen % 8);
+ if (padbits == 8) {
+ padbits = 0;
+ }
+ current_bytes = (current_binlen + padbits) / 8;
+
+ /* Padding bits */
+ for (i = 0; i < padbits; i++) {
+ strcat(binary, "0");
+ }
+
+ /* Put data into 8-bit codewords */
+ for (i = 0; i < current_bytes; i++) {
+ int p;
+ datastream[i] = 0x00;
+ for (p = 0; p < 8; p++) {
+ if (binary[i * 8 + p] == '1') {
+ datastream[i] += (0x80 >> p);
+ }
+ }
+ }
+
+ /* Add pad codewords */
+ toggle = 0;
+ for (i = current_bytes; i < target_binlen; i++) {
+ if (toggle == 0) {
+ datastream[i] = 0xec;
+ toggle = 1;
+ } else {
+ datastream[i] = 0x11;
+ toggle = 0;
+ }
+ }
+
+ if (debug) {
+ printf("Resulting codewords:\n\t");
+ for (i = 0; i < target_binlen; i++) {
+ printf("0x%2X ", datastream[i]);
+ }
+ printf("\n");
+ }
+}
+
+/* Split data into blocks, add error correction and then interleave the blocks and error correction data */
+static void add_ecc(int fullstream[],const int datastream[],const int version,const int data_cw,const int blocks) {
+ int ecc_cw = qr_total_codewords[version - 1] - data_cw;
+ int short_data_block_length = data_cw / blocks;
+ int qty_long_blocks = data_cw % blocks;
+ int qty_short_blocks = blocks - qty_long_blocks;
+ int ecc_block_length = ecc_cw / blocks;
+ int i, j, length_this_block, posn, debug = 0;
+
+
+#ifndef _MSC_VER
+ unsigned char data_block[short_data_block_length + 2];
+ unsigned char ecc_block[ecc_block_length + 2];
+ int interleaved_data[data_cw + 2];
+ int interleaved_ecc[ecc_cw + 2];
+#else
+ unsigned char* data_block = (unsigned char *) _alloca(short_data_block_length + 2);
+ unsigned char* ecc_block = (unsigned char *) _alloca(ecc_block_length + 2);
+ int* interleaved_data = (int *) _alloca((data_cw + 2) * sizeof (int));
+ int* interleaved_ecc = (int *) _alloca((ecc_cw + 2) * sizeof (int));
+#endif
+
+ posn = 0;
+
+ for (i = 0; i < blocks; i++) {
+ if (i < qty_short_blocks) {
+ length_this_block = short_data_block_length;
+ } else {
+ length_this_block = short_data_block_length + 1;
+ }
+
+ for (j = 0; j < ecc_block_length; j++) {
+ ecc_block[j] = 0;
+ }
+
+ for (j = 0; j < length_this_block; j++) {
+ data_block[j] = (unsigned char) datastream[posn + j];
+ }
+
+ rs_init_gf(0x11d);
+ rs_init_code(ecc_block_length, 0);
+ rs_encode(length_this_block, data_block, ecc_block);
+ rs_free();
+
+ if (debug) {
+ printf("Block %d: ", i + 1);
+ for (j = 0; j < length_this_block; j++) {
+ printf("%2X ", data_block[j]);
+ }
+ if (i < qty_short_blocks) {
+ printf(" ");
+ }
+ printf(" // ");
+ for (j = 0; j < ecc_block_length; j++) {
+ printf("%2X ", ecc_block[ecc_block_length - j - 1]);
+ }
+ printf("\n");
+ }
+
+ for (j = 0; j < short_data_block_length; j++) {
+ interleaved_data[(j * blocks) + i] = (int) data_block[j];
+ }
+
+ if (i >= qty_short_blocks) {
+ interleaved_data[(short_data_block_length * blocks) + (i - qty_short_blocks)] = (int) data_block[short_data_block_length];
+ }
+
+ for (j = 0; j < ecc_block_length; j++) {
+ interleaved_ecc[(j * blocks) + i] = (int) ecc_block[ecc_block_length - j - 1];
+ }
+
+ posn += length_this_block;
+ }
+
+ for (j = 0; j < data_cw; j++) {
+ fullstream[j] = interleaved_data[j];
+ }
+ for (j = 0; j < ecc_cw; j++) {
+ fullstream[j + data_cw] = interleaved_ecc[j];
+ }
+
+ if (debug) {
+ printf("\nData Stream: \n");
+ for (j = 0; j < (data_cw + ecc_cw); j++) {
+ printf("%2X ", fullstream[j]);
+ }
+ printf("\n");
+ }
+}
+
+static void place_finder(unsigned char grid[],const int size,const int x,const int y) {
+ int xp, yp;
+ char finder[] = {0x7F, 0x41, 0x5D, 0x5D, 0x5D, 0x41, 0x7F};
+
+ for (xp = 0; xp < 7; xp++) {
+ for (yp = 0; yp < 7; yp++) {
+ if (finder[yp] & 0x40 >> xp) {
+ grid[((yp + y) * size) + (xp + x)] = 0x11;
+ } else {
+ grid[((yp + y) * size) + (xp + x)] = 0x10;
+ }
+ }
+ }
+}
+
+static void place_align(unsigned char grid[],const int size,int x,int y) {
+ int xp, yp;
+ char alignment[] = {0x1F, 0x11, 0x15, 0x11, 0x1F};
+
+ x -= 2;
+ y -= 2; /* Input values represent centre of pattern */
+
+ for (xp = 0; xp < 5; xp++) {
+ for (yp = 0; yp < 5; yp++) {
+ if (alignment[yp] & 0x10 >> xp) {
+ grid[((yp + y) * size) + (xp + x)] = 0x11;
+ } else {
+ grid[((yp + y) * size) + (xp + x)] = 0x10;
+ }
+ }
+ }
+}
+
+static void setup_grid(unsigned char* grid,const int size,const int version) {
+ int i, toggle = 1;
+ int loopsize, x, y, xcoord, ycoord;
+
+ /* Add timing patterns */
+ for (i = 0; i < size; i++) {
+ if (toggle == 1) {
+ grid[(6 * size) + i] = 0x21;
+ grid[(i * size) + 6] = 0x21;
+ toggle = 0;
+ } else {
+ grid[(6 * size) + i] = 0x20;
+ grid[(i * size) + 6] = 0x20;
+ toggle = 1;
+ }
+ }
+
+ /* Add finder patterns */
+ place_finder(grid, size, 0, 0);
+ place_finder(grid, size, 0, size - 7);
+ place_finder(grid, size, size - 7, 0);
+
+ /* Add separators */
+ for (i = 0; i < 7; i++) {
+ grid[(7 * size) + i] = 0x10;
+ grid[(i * size) + 7] = 0x10;
+ grid[(7 * size) + (size - 1 - i)] = 0x10;
+ grid[(i * size) + (size - 8)] = 0x10;
+ grid[((size - 8) * size) + i] = 0x10;
+ grid[((size - 1 - i) * size) + 7] = 0x10;
+ }
+ grid[(7 * size) + 7] = 0x10;
+ grid[(7 * size) + (size - 8)] = 0x10;
+ grid[((size - 8) * size) + 7] = 0x10;
+
+ /* Add alignment patterns */
+ if (version != 1) {
+ /* Version 1 does not have alignment patterns */
+
+ loopsize = qr_align_loopsize[version - 1];
+ for (x = 0; x < loopsize; x++) {
+ for (y = 0; y < loopsize; y++) {
+ xcoord = qr_table_e1[((version - 2) * 7) + x];
+ ycoord = qr_table_e1[((version - 2) * 7) + y];
+
+ if (!(grid[(ycoord * size) + xcoord] & 0x10)) {
+ place_align(grid, size, xcoord, ycoord);
+ }
+ }
+ }
+ }
+
+ /* Reserve space for format information */
+ for (i = 0; i < 8; i++) {
+ grid[(8 * size) + i] += 0x20;
+ grid[(i * size) + 8] += 0x20;
+ grid[(8 * size) + (size - 1 - i)] = 0x20;
+ grid[((size - 1 - i) * size) + 8] = 0x20;
+ }
+ grid[(8 * size) + 8] += 20;
+ grid[((size - 1 - 7) * size) + 8] = 0x21; /* Dark Module from Figure 25 */
+
+ /* Reserve space for version information */
+ if (version >= 7) {
+ for (i = 0; i < 6; i++) {
+ grid[((size - 9) * size) + i] = 0x20;
+ grid[((size - 10) * size) + i] = 0x20;
+ grid[((size - 11) * size) + i] = 0x20;
+ grid[(i * size) + (size - 9)] = 0x20;
+ grid[(i * size) + (size - 10)] = 0x20;
+ grid[(i * size) + (size - 11)] = 0x20;
+ }
+ }
+}
+
+static int cwbit(const int* datastream,const int i) {
+ int resultant = 0;
+
+ if (datastream[(i / 8)] & (0x80 >> (i % 8))) {
+ resultant = 1;
+ }
+
+ return resultant;
+}
+
+static void populate_grid(unsigned char* grid,const int size,const int* datastream,const int cw) {
+ int direction = 1; /* up */
+ int row = 0; /* right hand side */
+
+ int i, n, x, y;
+
+ n = cw * 8;
+ y = size - 1;
+ i = 0;
+ do {
+ x = (size - 2) - (row * 2);
+ if (x < 6)
+ x--; /* skip over vertical timing pattern */
+
+ if (!(grid[(y * size) + (x + 1)] & 0xf0)) {
+ if (cwbit(datastream, i)) {
+ grid[(y * size) + (x + 1)] = 0x01;
+ } else {
+ grid[(y * size) + (x + 1)] = 0x00;
+ }
+ i++;
+ }
+
+ if (i < n) {
+ if (!(grid[(y * size) + x] & 0xf0)) {
+ if (cwbit(datastream, i)) {
+ grid[(y * size) + x] = 0x01;
+ } else {
+ grid[(y * size) + x] = 0x00;
+ }
+ i++;
+ }
+ }
+
+ if (direction) {
+ y--;
+ } else {
+ y++;
+ }
+ if (y == -1) {
+ /* reached the top */
+ row++;
+ y = 0;
+ direction = 0;
+ }
+ if (y == size) {
+ /* reached the bottom */
+ row++;
+ y = size - 1;
+ direction = 1;
+ }
+ } while (i < n);
+}
+
+#ifdef ZINTLOG
+
+int append_log(char log) {
+ FILE *file;
+
+ file = fopen("zintlog.txt", "a+");
+ fprintf(file, "%c", log);
+ fclose(file);
+ return 0;
+}
+
+int write_log(char log[]) {
+ FILE *file;
+
+ file = fopen("zintlog.txt", "a+");
+ fprintf(file, log); /*writes*/
+ fprintf(file, "\r\n"); /*writes*/
+ fclose(file);
+ return 0;
+}
+#endif
+
+static int evaluate(unsigned char *eval,const int size,const int pattern) {
+ int x, y, block, weight;
+ int result = 0;
+ char state;
+ int p;
+ int dark_mods;
+ int percentage, k;
+ int a, b, afterCount, beforeCount;
+#ifdef ZINTLOG
+ int result_b = 0;
+ char str[15];
+#endif
+
+#ifndef _MSC_VER
+ char local[size * size];
+#else
+ char* local = (char *) _alloca((size * size) * sizeof (char));
+#endif
+
+
+#ifdef ZINTLOG
+ write_log("");
+ sprintf(str, "%d", pattern);
+ write_log(str);
+#endif
+
+ /* all eight bitmask variants have been encoded in the 8 bits of the bytes
+ * that make up the grid array. select them for evaluation according to the
+ * desired pattern.*/
+ for (x = 0; x < size; x++) {
+ for (y = 0; y < size; y++) {
+ if ((eval[(y * size) + x] & (0x01 << pattern)) != 0) {
+ local[(y * size) + x] = '1';
+ } else {
+ local[(y * size) + x] = '0';
+ }
+ }
+ }
+
+#ifdef ZINTLOG
+ //bitmask output
+ for (y = 0; y < size; y++) {
+ strcpy(str, "");
+ for (x = 0; x < size; x++) {
+ state = local[(y * size) + x];
+ append_log(state);
+ }
+ write_log("");
+ }
+ write_log("");
+#endif
+
+ /* Test 1: Adjacent modules in row/column in same colour */
+ /* Vertical */
+ for (x = 0; x < size; x++) {
+ state = local[x];
+ block = 0;
+ for (y = 0; y < size; y++) {
+ if (local[(y * size) + x] == state) {
+ block++;
+ } else {
+ if (block > 5) {
+ result += (3 + (block - 5));
+ }
+ block = 0;
+ state = local[(y * size) + x];
+ }
+ }
+ if (block > 5) {
+ result += (3 + (block - 5));
+ }
+ }
+
+ /* Horizontal */
+ for (y = 0; y < size; y++) {
+ state = local[y * size];
+ block = 0;
+ for (x = 0; x < size; x++) {
+ if (local[(y * size) + x] == state) {
+ block++;
+ } else {
+ if (block > 5) {
+ result += (3 + (block - 5));
+ }
+ block = 0;
+ state = local[(y * size) + x];
+ }
+ }
+ if (block > 5) {
+ result += (3 + (block - 5));
+ }
+ }
+
+#ifdef ZINTLOG
+ /* output Test 1 */
+ sprintf(str, "%d", result);
+ result_b = result;
+ write_log(str);
+#endif
+
+ /* Test 2: Block of modules in same color */
+ for (x = 0; x < size - 1; x++) {
+ for (y = 0; y < size - 1; y++) {
+ if (((local[(y * size) + x] == local[((y + 1) * size) + x]) &&
+ (local[(y * size) + x] == local[(y * size) + (x + 1)])) &&
+ (local[(y * size) + x] == local[((y + 1) * size) + (x + 1)])) {
+ result += 3;
+ }
+ }
+ }
+
+#ifdef ZINTLOG
+ /* output Test 2 */
+ sprintf(str, "%d", result - result_b);
+ result_b = result;
+ write_log(str);
+#endif
+
+ /* Test 3: 1:1:3:1:1 ratio pattern in row/column */
+ /* Vertical */
+ for (x = 0; x < size; x++) {
+ for (y = 0; y < (size - 7); y++) {
+ p = 0;
+ for (weight = 0; weight < 7; weight++) {
+ if (local[((y + weight) * size) + x] == '1') {
+ p += (0x40 >> weight);
+ }
+ }
+ if (p == 0x5d) {
+ /* Pattern found, check before and after */
+ beforeCount = 0;
+ for (b = (y - 4); b < y; b++) {
+ if (b < 0) {
+ beforeCount++;
+ } else {
+ if (local[(b * size) + x] == '0') {
+ beforeCount++;
+ } else {
+ beforeCount = 0;
+ }
+ }
+ }
+
+ afterCount = 0;
+ for (a = (y + 7); a <= (y + 10); a++) {
+ if (a >= size) {
+ afterCount++;
+ } else {
+ if (local[(a * size) + x] == '0') {
+ afterCount++;
+ } else {
+ afterCount = 0;
+ }
+ }
+ }
+
+ if ((beforeCount == 4) || (afterCount == 4)) {
+ /* Pattern is preceeded or followed by light area
+ 4 modules wide */
+ result += 40;
+ }
+ }
+ }
+ }
+
+ /* Horizontal */
+ for (y = 0; y < size; y++) {
+ for (x = 0; x < (size - 7); x++) {
+ p = 0;
+ for (weight = 0; weight < 7; weight++) {
+ if (local[(y * size) + x + weight] == '1') {
+ p += (0x40 >> weight);
+ }
+ }
+ if (p == 0x5d) {
+ /* Pattern found, check before and after */
+ beforeCount = 0;
+ for (b = (x - 4); b < x; b++) {
+ if (b < 0) {
+ beforeCount++;
+ } else {
+ if (local[(y * size) + b] == '0') {
+ beforeCount++;
+ } else {
+ beforeCount = 0;
+ }
+ }
+ }
+
+ afterCount = 0;
+ for (a = (x + 7); a <= (x + 10); a++) {
+ if (a >= size) {
+ afterCount++;
+ } else {
+ if (local[(y * size) + a] == '0') {
+ afterCount++;
+ } else {
+ afterCount = 0;
+ }
+ }
+ }
+
+ if ((beforeCount == 4) || (afterCount == 4)) {
+ /* Pattern is preceeded or followed by light area
+ 4 modules wide */
+ result += 40;
+ }
+ }
+ }
+ }
+
+#ifdef ZINTLOG
+ /* output Test 3 */
+ sprintf(str, "%d", result - result_b);
+ result_b = result;
+ write_log(str);
+#endif
+
+ /* Test 4: Proportion of dark modules in entire symbol */
+ dark_mods = 0;
+ for (x = 0; x < size; x++) {
+ for (y = 0; y < size; y++) {
+ if (local[(y * size) + x] == '1') {
+ dark_mods++;
+ }
+ }
+ }
+ percentage = 100 * (dark_mods / (size * size));
+ if (percentage <= 50) {
+ k = ((100 - percentage) - 50) / 5;
+ } else {
+ k = (percentage - 50) / 5;
+ }
+
+ result += 10 * k;
+
+#ifdef ZINTLOG
+ /* output Test 4+summary */
+ sprintf(str, "%d", result - result_b);
+ write_log(str);
+ write_log("==========");
+ sprintf(str, "%d", result);
+ write_log(str);
+#endif
+
+ return result;
+}
+
+static void add_format_info_eval(unsigned char *eval,const int size,const int ecc_level,const int pattern) {
+ /* Add format information to grid */
+
+ int format = pattern;
+ unsigned int seq;
+ int i;
+
+ switch (ecc_level) {
+ case LEVEL_L: format += 0x08;
+ break;
+ case LEVEL_Q: format += 0x18;
+ break;
+ case LEVEL_H: format += 0x10;
+ break;
+ }
+
+ seq = qr_annex_c[format];
+
+ for (i = 0; i < 6; i++) {
+ eval[(i * size) + 8] = (seq >> i) & 0x01 ? (0x01 >> pattern) : 0x00;
+ }
+
+ for (i = 0; i < 8; i++) {
+ eval[(8 * size) + (size - i - 1)] = (seq >> i) & 0x01 ? (0x01 >> pattern) : 0x00;
+ }
+
+ for (i = 0; i < 6; i++) {
+ eval[(8 * size) + (5 - i)] = (seq >> (i + 9)) & 0x01 ? (0x01 >> pattern) : 0x00;
+ }
+
+ for (i = 0; i < 7; i++) {
+ eval[(((size - 7) + i) * size) + 8] = (seq >> (i + 8)) & 0x01 ? (0x01 >> pattern) : 0x00;
+ }
+
+ eval[(7 * size) + 8] = (seq >> 6) & 0x01 ? (0x01 >> pattern) : 0x00;
+ eval[(8 * size) + 8] = (seq >> 7) & 0x01 ? (0x01 >> pattern) : 0x00;
+ eval[(8 * size) + 7] = (seq >> 8) & 0x01 ? (0x01 >> pattern) : 0x00;
+}
+
+static int apply_bitmask(unsigned char *grid,const int size,const int ecc_level) {
+ int x, y;
+ unsigned char p;
+ int pattern, penalty[8];
+ int best_val, best_pattern;
+
+#ifndef _MSC_VER
+ unsigned char mask[size * size];
+ unsigned char eval[size * size];
+#else
+ unsigned char* mask = (unsigned char *) _alloca((size * size) * sizeof (unsigned char));
+ unsigned char* eval = (unsigned char *) _alloca((size * size) * sizeof (unsigned char));
+#endif
+
+ /* Perform data masking */
+ for (x = 0; x < size; x++) {
+ for (y = 0; y < size; y++) {
+ mask[(y * size) + x] = 0x00;
+
+ // all eight bitmask variants are encoded in the 8 bits of the bytes that make up the mask array.
+ if (!(grid[(y * size) + x] & 0xf0)) { // exclude areas not to be masked.
+ if (((y + x) & 1) == 0) {
+ mask[(y * size) + x] += 0x01;
+ }
+ if ((y & 1) == 0) {
+ mask[(y * size) + x] += 0x02;
+ }
+ if ((x % 3) == 0) {
+ mask[(y * size) + x] += 0x04;
+ }
+ if (((y + x) % 3) == 0) {
+ mask[(y * size) + x] += 0x08;
+ }
+ if ((((y / 2) + (x / 3)) & 1) == 0) {
+ mask[(y * size) + x] += 0x10;
+ }
+ if ((((y * x) & 1) + ((y * x) % 3)) == 0) {
+ mask[(y * size) + x] += 0x20;
+ }
+ if (((((y * x) & 1) + ((y * x) % 3)) & 1) == 0) {
+ mask[(y * size) + x] += 0x40;
+ }
+ if (((((y + x) & 1) + ((y * x) % 3)) & 1) == 0) {
+ mask[(y * size) + x] += 0x80;
+ }
+ }
+ }
+ }
+
+ // apply data masks to grid, result in eval
+ for (x = 0; x < size; x++) {
+ for (y = 0; y < size; y++) {
+ if (grid[(y * size) + x] & 0x01) {
+ p = 0xff;
+ } else {
+ p = 0x00;
+ }
+
+ eval[(y * size) + x] = mask[(y * size) + x] ^ p;
+ }
+ }
+
+
+ /* Evaluate result */
+ for (pattern = 0; pattern < 8; pattern++) {
+
+ add_format_info_eval(eval, size, ecc_level, pattern);
+
+ penalty[pattern] = evaluate(eval, size, pattern);
+ }
+
+ best_pattern = 0;
+ best_val = penalty[0];
+ for (pattern = 1; pattern < 8; pattern++) {
+ if (penalty[pattern] < best_val) {
+ best_pattern = pattern;
+ best_val = penalty[pattern];
+ }
+ }
+
+#ifdef ZINTLOG
+ char str[15];
+ sprintf(str, "%d", best_val);
+ write_log("choosed pattern:");
+ write_log(str);
+#endif
+
+ /* Apply mask */
+ for (x = 0; x < size; x++) {
+ for (y = 0; y < size; y++) {
+ if (mask[(y * size) + x] & (0x01 << best_pattern)) {
+ if (grid[(y * size) + x] & 0x01) {
+ grid[(y * size) + x] = 0x00;
+ } else {
+ grid[(y * size) + x] = 0x01;
+ }
+ }
+ }
+ }
+
+ return best_pattern;
+}
+
+/* Add format information to grid */
+static void add_format_info(unsigned char *grid,const int size,const int ecc_level,const int pattern) {
+ int format = pattern;
+ unsigned int seq;
+ int i;
+
+ switch (ecc_level) {
+ case LEVEL_L: format += 0x08;
+ break;
+ case LEVEL_Q: format += 0x18;
+ break;
+ case LEVEL_H: format += 0x10;
+ break;
+ }
+
+ seq = qr_annex_c[format];
+
+ for (i = 0; i < 6; i++) {
+ grid[(i * size) + 8] += (seq >> i) & 0x01;
+ }
+
+ for (i = 0; i < 8; i++) {
+ grid[(8 * size) + (size - i - 1)] += (seq >> i) & 0x01;
+ }
+
+ for (i = 0; i < 6; i++) {
+ grid[(8 * size) + (5 - i)] += (seq >> (i + 9)) & 0x01;
+ }
+
+ for (i = 0; i < 7; i++) {
+ grid[(((size - 7) + i) * size) + 8] += (seq >> (i + 8)) & 0x01;
+ }
+
+ grid[(7 * size) + 8] += (seq >> 6) & 0x01;
+ grid[(8 * size) + 8] += (seq >> 7) & 0x01;
+ grid[(8 * size) + 7] += (seq >> 8) & 0x01;
+}
+
+/* Add version information */
+static void add_version_info(unsigned char *grid,const int size,const int version) {
+ int i;
+
+ long int version_data = qr_annex_d[version - 7];
+ for (i = 0; i < 6; i++) {
+ grid[((size - 11) * size) + i] += (version_data >> (i * 3)) & 0x41;
+ grid[((size - 10) * size) + i] += (version_data >> ((i * 3) + 1)) & 0x41;
+ grid[((size - 9) * size) + i] += (version_data >> ((i * 3) + 2)) & 0x41;
+ grid[(i * size) + (size - 11)] += (version_data >> (i * 3)) & 0x41;
+ grid[(i * size) + (size - 10)] += (version_data >> ((i * 3) + 1)) & 0x41;
+ grid[(i * size) + (size - 9)] += (version_data >> ((i * 3) + 2)) & 0x41;
+ }
+}
+
+/* Implements a custom optimisation algorithm, more efficient than that
+ given in Annex J. */
+static void applyOptimisation(const int version,char inputMode[], const size_t inputLength) {
+
+
+ int blockCount = 0, block;
+ int i, j;
+ char currentMode = ' '; // Null
+ int *blockLength;
+ char *blockMode;
+
+ for (i = 0; i < inputLength; i++) {
+ if (inputMode[i] != currentMode) {
+ currentMode = inputMode[i];
+ blockCount++;
+ }
+ }
+
+ blockLength = (int*) malloc(sizeof (int)*blockCount);
+ assert(blockLength);
+ if (!blockLength) return;
+ blockMode = (char*) malloc(sizeof (char)*blockCount);
+ assert(blockMode);
+ if (!blockMode) {
+ free(blockLength);
+ return;
+ }
+
+ j = -1;
+ currentMode = ' '; // Null
+ for (i = 0; i < inputLength; i++) {
+ if (inputMode[i] != currentMode) {
+ j++;
+ blockLength[j] = 1;
+ blockMode[j] = inputMode[i];
+ currentMode = inputMode[i];
+ } else {
+ blockLength[j]++;
+ }
+ }
+
+ if (blockCount > 1) {
+ // Search forward
+ for (i = 0; i <= (blockCount - 2); i++) {
+ if (blockMode[i] == 'B') {
+ switch (blockMode[i + 1]) {
+ case 'K':
+ if (blockLength[i + 1] < tribus(version, 4, 5, 6)) {
+ blockMode[i + 1] = 'B';
+ }
+ break;
+ case 'A':
+ if (blockLength[i + 1] < tribus(version, 7, 8, 9)) {
+ blockMode[i + 1] = 'B';
+ }
+ break;
+ case 'N':
+ if (blockLength[i + 1] < tribus(version, 3, 4, 5)) {
+ blockMode[i + 1] = 'B';
+ }
+ break;
+ }
+ }
+
+ if ((blockMode[i] == 'A')
+ && (blockMode[i + 1] == 'N')) {
+ if (blockLength[i + 1] < tribus(version, 6, 8, 10)) {
+ blockMode[i + 1] = 'A';
+ }
+ }
+ }
+
+ // Search backward
+ for (i = blockCount - 1; i > 0; i--) {
+ if (blockMode[i] == 'B') {
+ switch (blockMode[i - 1]) {
+ case 'K':
+ if (blockLength[i - 1] < tribus(version, 4, 5, 6)) {
+ blockMode[i - 1] = 'B';
+ }
+ break;
+ case 'A':
+ if (blockLength[i - 1] < tribus(version, 7, 8, 9)) {
+ blockMode[i - 1] = 'B';
+ }
+ break;
+ case 'N':
+ if (blockLength[i - 1] < tribus(version, 3, 4, 5)) {
+ blockMode[i - 1] = 'B';
+ }
+ break;
+ }
+ }
+
+ if ((blockMode[i] == 'A')
+ && (blockMode[i - 1] == 'N')) {
+ if (blockLength[i - 1] < tribus(version, 6, 8, 10)) {
+ blockMode[i - 1] = 'A';
+ }
+ }
+ }
+ }
+
+ j = 0;
+ for (block = 0; block < blockCount; block++) {
+ currentMode = blockMode[block];
+ for (i = 0; i < blockLength[block]; i++) {
+ inputMode[j] = currentMode;
+ j++;
+ }
+ }
+
+ free(blockLength);
+ free(blockMode);
+}
+
+static size_t blockLength(const size_t start,const char inputMode[],const size_t inputLength) {
+ /* Find the length of the block starting from 'start' */
+ size_t i;
+ int count;
+ char mode = inputMode[start];
+
+ count = 0;
+ i = start;
+
+ do {
+ count++;
+ } while (((i + count) < inputLength) && (inputMode[i + count] == mode));
+
+ return count;
+}
+
+static int getBinaryLength(const int version,char inputMode[],const int inputData[],const size_t inputLength,const int gs1,const int eci) {
+ /* Calculate the actual bitlength of the proposed binary string */
+ size_t i;
+ char currentMode;
+ int j;
+ int count = 0;
+
+ applyOptimisation(version, inputMode, inputLength);
+
+ currentMode = ' '; // Null
+
+ if (gs1 == 1) {
+ count += 4;
+ }
+
+ if (eci != 3) {
+ count += 12;
+ }
+
+ for (i = 0; i < inputLength; i++) {
+ if (inputMode[i] != currentMode) {
+ count += 4;
+ switch (inputMode[i]) {
+ case 'K':
+ count += tribus(version, 8, 10, 12);
+ count += (blockLength(i, inputMode, inputLength) * 13);
+ break;
+ case 'B':
+ count += tribus(version, 8, 16, 16);
+ for (j = i; j < (i + blockLength(i, inputMode, inputLength)); j++) {
+ if (inputData[j] > 0xff) {
+ count += 16;
+ } else {
+ count += 8;
+ }
+ }
+ break;
+ case 'A':
+ count += tribus(version, 9, 11, 13);
+ switch (blockLength(i, inputMode, inputLength) % 2) {
+ case 0:
+ count += (blockLength(i, inputMode, inputLength) / 2) * 11;
+ break;
+ case 1:
+ count += ((blockLength(i, inputMode, inputLength) - 1) / 2) * 11;
+ count += 6;
+ break;
+ }
+ break;
+ case 'N':
+ count += tribus(version, 10, 12, 14);
+ switch (blockLength(i, inputMode, inputLength) % 3) {
+ case 0:
+ count += (blockLength(i, inputMode, inputLength) / 3) * 10;
+ break;
+ case 1:
+ count += ((blockLength(i, inputMode, inputLength) - 1) / 3) * 10;
+ count += 4;
+ break;
+ case 2:
+ count += ((blockLength(i, inputMode, inputLength) - 2) / 3) * 10;
+ count += 7;
+ break;
+ }
+ break;
+ }
+ currentMode = inputMode[i];
+ }
+ }
+
+ return count;
+}
+
+int qr_code(struct zint_symbol *symbol, const unsigned char source[], size_t length) {
+ int i, j, est_binlen;
+ int error_number,glyph;
+ int ecc_level, autosize, version, max_cw, target_binlen, blocks, size;
+ int bitmask, gs1;
+ int canShrink;
+
+#ifndef _MSC_VER
+ int utfdata[length + 1];
+ int jisdata[length + 1];
+ char mode[length + 1];
+#else
+ int* datastream;
+ int* fullstream;
+ unsigned char* grid;
+ int* utfdata = (int *) _alloca((length + 1) * sizeof (int));
+ int* jisdata = (int *) _alloca((length + 1) * sizeof (int));
+ char* mode = (char *) _alloca(length + 1);
+#endif
+
+ gs1 = (symbol->input_mode == GS1_MODE);
+
+ if ((symbol->input_mode == DATA_MODE) || (symbol->eci != 3)) {
+ for (i = 0; i < length; i++) {
+ jisdata[i] = (int) source[i];
+ }
+ } else {
+ /* Convert Unicode input to Shift-JIS */
+ error_number = utf8toutf16(symbol, source, utfdata, &length);
+ if (error_number != 0) {
+ return error_number;
+ }
+
+ for (i = 0; i < length; i++) {
+ if (utfdata[i] <= 0xff) {
+ jisdata[i] = utfdata[i];
+ } else {
+ j = 0;
+ glyph = 0;
+ do {
+ if (sjis_lookup[j * 2] == utfdata[i]) {
+ glyph = sjis_lookup[(j * 2) + 1];
+ }
+ j++;
+ } while ((j < 6843) && (glyph == 0));
+ if (glyph == 0) {
+ strcpy(symbol->errtxt, "560: Invalid character in input data");
+ return ZINT_ERROR_INVALID_DATA;
+ }
+ jisdata[i] = glyph;
+ }
+ }
+ }
+
+ define_mode(mode, jisdata, length, gs1);
+ est_binlen = getBinaryLength(40, mode, jisdata, length, gs1, symbol->eci);
+
+ ecc_level = LEVEL_L;
+ max_cw = 2956;
+ if ((symbol->option_1 >= 1) && (symbol->option_1 <= 4)) {
+ switch (symbol->option_1) {
+ case 1: ecc_level = LEVEL_L;
+ max_cw = 2956;
+ break;
+ case 2: ecc_level = LEVEL_M;
+ max_cw = 2334;
+ break;
+ case 3: ecc_level = LEVEL_Q;
+ max_cw = 1666;
+ break;
+ case 4: ecc_level = LEVEL_H;
+ max_cw = 1276;
+ break;
+ }
+ }
+
+ if (est_binlen > (8 * max_cw)) {
+ strcpy(symbol->errtxt, "561: Input too long for selected error correction level");
+ return ZINT_ERROR_TOO_LONG;
+ }
+
+ autosize = 40;
+ for (i = 39; i >= 0; i--) {
+ switch (ecc_level) {
+ case LEVEL_L:
+ if ((8 * qr_data_codewords_L[i]) >= est_binlen) {
+ autosize = i + 1;
+ }
+ break;
+ case LEVEL_M:
+ if ((8 * qr_data_codewords_M[i]) >= est_binlen) {
+ autosize = i + 1;
+ }
+ break;
+ case LEVEL_Q:
+ if ((8 * qr_data_codewords_Q[i]) >= est_binlen) {
+ autosize = i + 1;
+ }
+ break;
+ case LEVEL_H:
+ if ((8 * qr_data_codewords_H[i]) >= est_binlen) {
+ autosize = i + 1;
+ }
+ break;
+ }
+ }
+
+ // Now see if the optimised binary will fit in a smaller symbol.
+ canShrink = 1;
+
+ do {
+ if (autosize == 1) {
+ canShrink = 0;
+ } else {
+ est_binlen = getBinaryLength(autosize - 1, mode, jisdata, length, gs1, symbol->eci);
+
+ switch (ecc_level) {
+ case LEVEL_L:
+ if ((8 * qr_data_codewords_L[autosize - 2]) < est_binlen) {
+ canShrink = 0;
+ }
+ break;
+ case LEVEL_M:
+ if ((8 * qr_data_codewords_M[autosize - 2]) < est_binlen) {
+ canShrink = 0;
+ }
+ break;
+ case LEVEL_Q:
+ if ((8 * qr_data_codewords_Q[autosize - 2]) < est_binlen) {
+ canShrink = 0;
+ }
+ break;
+ case LEVEL_H:
+ if ((8 * qr_data_codewords_H[autosize - 2]) < est_binlen) {
+ canShrink = 0;
+ }
+ break;
+ }
+
+ if (canShrink == 1) {
+ // Optimisation worked - data will fit in a smaller symbol
+ autosize--;
+ } else {
+ // Data did not fit in the smaller symbol, revert to original size
+ est_binlen = getBinaryLength(autosize, mode, jisdata, length, gs1, symbol->eci);
+ }
+ }
+ } while (canShrink == 1);
+
+ version = autosize;
+
+ if ((symbol->option_2 >= 1) && (symbol->option_2 <= 40)) {
+ /* If the user has selected a larger symbol than the smallest available,
+ then use the size the user has selected, and re-optimise for this
+ symbol size.
+ */
+ if (symbol->option_2 > version) {
+ version = symbol->option_2;
+ est_binlen = getBinaryLength(symbol->option_2, mode, jisdata, length, gs1, symbol->eci);
+ }
+
+ if (symbol->option_2 < version) {
+ strcpy(symbol->errtxt, "569: Input too long for selected symbol size");
+ return ZINT_ERROR_TOO_LONG;
+ }
+ }
+
+ /* Ensure maxium error correction capacity */
+ if (est_binlen <= qr_data_codewords_M[version - 1]) {
+ ecc_level = LEVEL_M;
+ }
+ if (est_binlen <= qr_data_codewords_Q[version - 1]) {
+ ecc_level = LEVEL_Q;
+ }
+ if (est_binlen <= qr_data_codewords_H[version - 1]) {
+ ecc_level = LEVEL_H;
+ }
+
+ target_binlen = qr_data_codewords_L[version - 1];
+ blocks = qr_blocks_L[version - 1];
+ switch (ecc_level) {
+ case LEVEL_M: target_binlen = qr_data_codewords_M[version - 1];
+ blocks = qr_blocks_M[version - 1];
+ break;
+ case LEVEL_Q: target_binlen = qr_data_codewords_Q[version - 1];
+ blocks = qr_blocks_Q[version - 1];
+ break;
+ case LEVEL_H: target_binlen = qr_data_codewords_H[version - 1];
+ blocks = qr_blocks_H[version - 1];
+ break;
+ }
+
+#ifndef _MSC_VER
+ int datastream[target_binlen + 1];
+ int fullstream[qr_total_codewords[version - 1] + 1];
+#else
+ datastream = (int *) _alloca((target_binlen + 1) * sizeof (int));
+ fullstream = (int *) _alloca((qr_total_codewords[version - 1] + 1) * sizeof (int));
+#endif
+
+ qr_binary(datastream, version, target_binlen, mode, jisdata, length, gs1, symbol->eci, est_binlen, symbol->debug);
+ add_ecc(fullstream, datastream, version, target_binlen, blocks);
+
+ size = qr_sizes[version - 1];
+#ifndef _MSC_VER
+ unsigned char grid[size * size];
+#else
+ grid = (unsigned char *) _alloca((size * size) * sizeof (unsigned char));
+#endif
+
+ for (i = 0; i < size; i++) {
+ for (j = 0; j < size; j++) {
+ grid[(i * size) + j] = 0;
+ }
+ }
+
+ setup_grid(grid, size, version);
+ populate_grid(grid, size, fullstream, qr_total_codewords[version - 1]);
+
+ if (version >= 7) {
+ add_version_info(grid, size, version);
+ }
+
+ bitmask = apply_bitmask(grid, size, ecc_level);
+
+ add_format_info(grid, size, ecc_level, bitmask);
+
+
+
+ symbol->width = size;
+ symbol->rows = size;
+
+ for (i = 0; i < size; i++) {
+ for (j = 0; j < size; j++) {
+ if (grid[(i * size) + j] & 0x01) {
+ set_module(symbol, i, j);
+ }
+ }
+ symbol->row_height[i] = 1;
+ }
+
+ return 0;
+}
+
+/* NOTE: From this point forward concerns Micro QR Code only */
+
+static int micro_qr_intermediate(char binary[], const int jisdata[], const char mode[], const size_t length, int *kanji_used, int *alphanum_used, int *byte_used,const int debug) {
+ /* Convert input data to an "intermediate stage" where data is binary encoded but
+ control information is not */
+ int position = 0;
+ int short_data_block_length, i;
+ char data_block;
+ char buffer[2];
+
+ strcpy(binary, "");
+
+ if (debug) {
+ for (i = 0; i < length; i++) {
+ printf("%c", mode[i]);
+ }
+ printf("\n");
+ }
+
+ do {
+ if (strlen(binary) > 128) {
+ return ZINT_ERROR_TOO_LONG;
+ }
+
+ data_block = mode[position];
+ short_data_block_length = 0;
+ do {
+ short_data_block_length++;
+ } while (((short_data_block_length + position) < length) && (mode[position + short_data_block_length] == data_block));
+
+ switch (data_block) {
+ case 'K':
+ /* Kanji mode */
+ /* Mode indicator */
+ strcat(binary, "K");
+ *kanji_used = 1;
+
+ /* Character count indicator */
+ buffer[0] = short_data_block_length;
+ buffer[1] = '\0';
+ strcat(binary, buffer);
+
+ if (debug) {
+ printf("Kanji block (length %d)\n\t", short_data_block_length);
+ }
+
+ /* Character representation */
+ for (i = 0; i < short_data_block_length; i++) {
+ int jis = jisdata[position + i];
+ int prod;
+
+ if (jis >= 0x8140 && jis <= 0x9ffc)
+ jis -= 0x8140;
+
+ else if (jis >= 0xe040 && jis <= 0xebbf)
+ jis -= 0xc140;
+
+ prod = ((jis >> 8) * 0xc0) + (jis & 0xff);
+
+ bin_append(prod, 13, binary);
+
+ if (debug) {
+ printf("0x%4X ", prod);
+ }
+
+ if (strlen(binary) > 128) {
+ return ZINT_ERROR_TOO_LONG;
+ }
+ }
+
+ if (debug) {
+ printf("\n");
+ }
+
+ break;
+ case 'B':
+ /* Byte mode */
+ /* Mode indicator */
+ strcat(binary, "B");
+ *byte_used = 1;
+
+ /* Character count indicator */
+ buffer[0] = short_data_block_length;
+ buffer[1] = '\0';
+ strcat(binary, buffer);
+
+ if (debug) {
+ printf("Byte block (length %d)\n\t", short_data_block_length);
+ }
+
+ /* Character representation */
+ for (i = 0; i < short_data_block_length; i++) {
+ int byte = jisdata[position + i];
+
+ bin_append(byte, 8, binary);
+
+ if (debug) {
+ printf("0x%4X ", byte);
+ }
+
+ if (strlen(binary) > 128) {
+ return ZINT_ERROR_TOO_LONG;
+ }
+ }
+
+ if (debug) {
+ printf("\n");
+ }
+
+ break;
+ case 'A':
+ /* Alphanumeric mode */
+ /* Mode indicator */
+ strcat(binary, "A");
+ *alphanum_used = 1;
+
+ /* Character count indicator */
+ buffer[0] = short_data_block_length;
+ buffer[1] = '\0';
+ strcat(binary, buffer);
+
+ if (debug) {
+ printf("Alpha block (length %d)\n\t", short_data_block_length);
+ }
+
+ /* Character representation */
+ i = 0;
+ while (i < short_data_block_length) {
+ int count;
+ int first = 0, second = 0, prod;
+
+ first = posn(RHODIUM, (char) jisdata[position + i]);
+ count = 1;
+ prod = first;
+
+ if (i + 1 < short_data_block_length && mode[position + i + 1] == 'A') {
+ second = posn(RHODIUM, (char) jisdata[position + i + 1]);
+ count = 2;
+ prod = (first * 45) + second;
+ }
+
+ bin_append(prod, 1 + (5 * count), binary);
+
+ if (debug) {
+ printf("0x%4X ", prod);
+ }
+
+ if (strlen(binary) > 128) {
+ return ZINT_ERROR_TOO_LONG;
+ }
+
+ i += 2;
+ };
+
+ if (debug) {
+ printf("\n");
+ }
+
+ break;
+ case 'N':
+ /* Numeric mode */
+ /* Mode indicator */
+ strcat(binary, "N");
+
+ /* Character count indicator */
+ buffer[0] = short_data_block_length;
+ buffer[1] = '\0';
+ strcat(binary, buffer);
+
+ if (debug) {
+ printf("Number block (length %d)\n\t", short_data_block_length);
+ }
+
+ /* Character representation */
+ i = 0;
+ while (i < short_data_block_length) {
+ int count;
+ int first = 0, second = 0, third = 0, prod;
+
+ first = posn(NEON, (char) jisdata[position + i]);
+ count = 1;
+ prod = first;
+
+ if (i + 1 < short_data_block_length && mode[position + i + 1] == 'N') {
+ second = posn(NEON, (char) jisdata[position + i + 1]);
+ count = 2;
+ prod = (prod * 10) + second;
+ }
+
+ if (i + 2 < short_data_block_length && mode[position + i + 2] == 'N') {
+ third = posn(NEON, (char) jisdata[position + i + 2]);
+ count = 3;
+ prod = (prod * 10) + third;
+ }
+
+ bin_append(prod, 1 + (3 * count), binary);
+
+ if (debug) {
+ printf("0x%4X (%d)", prod, prod);
+ }
+
+ if (strlen(binary) > 128) {
+ return ZINT_ERROR_TOO_LONG;
+ }
+
+ i += 3;
+ };
+
+ if (debug) {
+ printf("\n");
+ }
+
+ break;
+ }
+
+ position += short_data_block_length;
+ } while (position < length - 1);
+
+ return 0;
+}
+
+static void get_bitlength(int count[],const char stream[]) {
+ size_t length;
+ int i;
+
+ length = strlen(stream);
+
+ for (i = 0; i < 4; i++) {
+ count[i] = 0;
+ }
+
+ i = 0;
+ do {
+ if ((stream[i] == '0') || (stream[i] == '1')) {
+ count[0]++;
+ count[1]++;
+ count[2]++;
+ count[3]++;
+ i++;
+ } else {
+ switch (stream[i]) {
+ case 'K':
+ count[2] += 5;
+ count[3] += 7;
+ i += 2;
+ break;
+ case 'B':
+ count[2] += 6;
+ count[3] += 8;
+ i += 2;
+ break;
+ case 'A':
+ count[1] += 4;
+ count[2] += 6;
+ count[3] += 8;
+ i += 2;
+ break;
+ case 'N':
+ count[0] += 3;
+ count[1] += 5;
+ count[2] += 7;
+ count[3] += 9;
+ i += 2;
+ break;
+ }
+ }
+ } while (i < length);
+}
+
+static void microqr_expand_binary(const char binary_stream[], char full_stream[],const int version) {
+ int i;
+ size_t length;
+
+ length = strlen(binary_stream);
+
+ i = 0;
+ do {
+ switch (binary_stream[i]) {
+ case '1': strcat(full_stream, "1");
+ i++;
+ break;
+ case '0': strcat(full_stream, "0");
+ i++;
+ break;
+ case 'N':
+ /* Numeric Mode */
+ /* Mode indicator */
+ switch (version) {
+ case 1: strcat(full_stream, "0");
+ break;
+ case 2: strcat(full_stream, "00");
+ break;
+ case 3: strcat(full_stream, "000");
+ break;
+ }
+
+ /* Character count indicator */
+ bin_append(binary_stream[i + 1], 3 + version, full_stream); /* version = 0..3 */
+
+ i += 2;
+ break;
+ case 'A':
+ /* Alphanumeric Mode */
+ /* Mode indicator */
+ switch (version) {
+ case 1: strcat(full_stream, "1");
+ break;
+ case 2: strcat(full_stream, "01");
+ break;
+ case 3: strcat(full_stream, "001");
+ break;
+ }
+
+ /* Character count indicator */
+ bin_append(binary_stream[i + 1], 2 + version, full_stream); /* version = 1..3 */
+
+ i += 2;
+ break;
+ case 'B':
+ /* Byte Mode */
+ /* Mode indicator */
+ switch (version) {
+ case 2: strcat(full_stream, "10");
+ break;
+ case 3: strcat(full_stream, "010");
+ break;
+ }
+
+ /* Character count indicator */
+ bin_append(binary_stream[i + 1], 2 + version, full_stream); /* version = 2..3 */
+
+ i += 2;
+ break;
+ case 'K':
+ /* Kanji Mode */
+ /* Mode indicator */
+ switch (version) {
+ case 2: strcat(full_stream, "11");
+ break;
+ case 3: strcat(full_stream, "011");
+ break;
+ }
+
+ /* Character count indicator */
+ bin_append(binary_stream[i + 1], 1 + version, full_stream); /* version = 2..3 */
+
+ i += 2;
+ break;
+ }
+
+ } while (i < length);
+}
+
+static void micro_qr_m1(char binary_data[]) {
+ int i, j, latch;
+ int bits_total, bits_left, remainder;
+ int data_codewords, ecc_codewords;
+ unsigned char data_blocks[4], ecc_blocks[3];
+
+ bits_total = 20;
+ latch = 0;
+
+ /* Add terminator */
+ bits_left = bits_total - (int)strlen(binary_data);
+ if (bits_left <= 3) {
+ for (i = 0; i < bits_left; i++) {
+ strcat(binary_data, "0");
+ }
+ latch = 1;
+ } else {
+ strcat(binary_data, "000");
+ }
+
+ if (latch == 0) {
+ /* Manage last (4-bit) block */
+ bits_left = bits_total - (int)strlen(binary_data);
+ if (bits_left <= 4) {
+ for (i = 0; i < bits_left; i++) {
+ strcat(binary_data, "0");
+ }
+ latch = 1;
+ }
+ }
+
+ if (latch == 0) {
+ /* Complete current byte */
+ remainder = 8 - (strlen(binary_data) % 8);
+ if (remainder == 8) {
+ remainder = 0;
+ }
+ for (i = 0; i < remainder; i++) {
+ strcat(binary_data, "0");
+ }
+
+ /* Add padding */
+ bits_left = bits_total - (int)strlen(binary_data);
+ if (bits_left > 4) {
+ remainder = (bits_left - 4) / 8;
+ for (i = 0; i < remainder; i++) {
+ strcat(binary_data, i & 1 ? "00010001" : "11101100");
+ }
+ }
+ bin_append(0, 4, binary_data);
+ }
+
+ data_codewords = 3;
+ ecc_codewords = 2;
+
+ /* Copy data into codewords */
+ for (i = 0; i < (data_codewords - 1); i++) {
+ data_blocks[i] = 0;
+ for (j = 0; j < 8; j++) {
+ if (binary_data[(i * 8) + j] == '1') {
+ data_blocks[i] += 0x80 >> j;
+ }
+ }
+ }
+ data_blocks[2] = 0;
+ for (j = 0; j < 4; j++) {
+ if (binary_data[16 + j] == '1') {
+ data_blocks[2] += 0x80 >> j;
+ }
+ }
+
+ /* Calculate Reed-Solomon error codewords */
+ rs_init_gf(0x11d);
+ rs_init_code(ecc_codewords, 0);
+ rs_encode(data_codewords, data_blocks, ecc_blocks);
+ rs_free();
+
+ /* Add Reed-Solomon codewords to binary data */
+ for (i = 0; i < ecc_codewords; i++) {
+ bin_append(ecc_blocks[ecc_codewords - i - 1], 8, binary_data);
+ }
+}
+
+static void micro_qr_m2(char binary_data[],const int ecc_mode) {
+ int i, j, latch;
+ int bits_total=0, bits_left, remainder;
+ int data_codewords=0, ecc_codewords=0;
+ unsigned char data_blocks[6], ecc_blocks[7];
+
+ latch = 0;
+
+ if (ecc_mode == LEVEL_L) {
+ bits_total = 40;
+ }
+ else if (ecc_mode == LEVEL_M) {
+ bits_total = 32;
+ }
+ else assert(0);
+
+ /* Add terminator */
+ bits_left = bits_total - (int)strlen(binary_data);
+ if (bits_left <= 5) {
+ for (i = 0; i < bits_left; i++) {
+ strcat(binary_data, "0");
+ }
+ latch = 1;
+ } else {
+ bin_append(0, 5, binary_data);
+ }
+
+ if (latch == 0) {
+ /* Complete current byte */
+ remainder = 8 - (strlen(binary_data) % 8);
+ if (remainder == 8) {
+ remainder = 0;
+ }
+ for (i = 0; i < remainder; i++) {
+ strcat(binary_data, "0");
+ }
+
+ /* Add padding */
+ bits_left = bits_total - (int)strlen(binary_data);
+ remainder = bits_left / 8;
+ for (i = 0; i < remainder; i++) {
+ strcat(binary_data, i & 1 ? "00010001" : "11101100");
+ }
+ }
+
+ if (ecc_mode == LEVEL_L) {
+ data_codewords = 5;
+ ecc_codewords = 5;
+ }
+ else if (ecc_mode == LEVEL_M) {
+ data_codewords = 4;
+ ecc_codewords = 6;
+ }
+ else assert(0);
+
+ /* Copy data into codewords */
+ for (i = 0; i < data_codewords; i++) {
+ data_blocks[i] = 0;
+
+ for (j = 0; j < 8; j++) {
+ if (binary_data[(i * 8) + j] == '1') {
+ data_blocks[i] += 0x80 >> j;
+ }
+ }
+ }
+
+ /* Calculate Reed-Solomon error codewords */
+ rs_init_gf(0x11d);
+ rs_init_code(ecc_codewords, 0);
+ rs_encode(data_codewords, data_blocks, ecc_blocks);
+ rs_free();
+
+ /* Add Reed-Solomon codewords to binary data */
+ for (i = 0; i < ecc_codewords; i++) {
+ bin_append(ecc_blocks[ecc_codewords - i - 1], 8, binary_data);
+ }
+
+ return;
+}
+
+static void micro_qr_m3(char binary_data[],const int ecc_mode) {
+ int i, j, latch;
+ int bits_total=0, bits_left, remainder;
+ int data_codewords=0, ecc_codewords=0;
+ unsigned char data_blocks[12], ecc_blocks[9];
+
+ latch = 0;
+
+ if (ecc_mode == LEVEL_L) {
+ bits_total = 84;
+ }
+ else if (ecc_mode == LEVEL_M) {
+ bits_total = 68;
+ }
+ else assert(0);
+
+ /* Add terminator */
+ bits_left = bits_total - (int)strlen(binary_data);
+ if (bits_left <= 7) {
+ for (i = 0; i < bits_left; i++) {
+ strcat(binary_data, "0");
+ }
+ latch = 1;
+ } else {
+ bin_append(0, 7, binary_data);
+ }
+
+ if (latch == 0) {
+ /* Manage last (4-bit) block */
+ bits_left = bits_total - (int)strlen(binary_data);
+ if (bits_left <= 4) {
+ for (i = 0; i < bits_left; i++) {
+ strcat(binary_data, "0");
+ }
+ latch = 1;
+ }
+ }
+
+ if (latch == 0) {
+ /* Complete current byte */
+ remainder = 8 - (strlen(binary_data) % 8);
+ if (remainder == 8) {
+ remainder = 0;
+ }
+ for (i = 0; i < remainder; i++) {
+ strcat(binary_data, "0");
+ }
+
+ /* Add padding */
+ bits_left = bits_total - (int)strlen(binary_data);
+ if (bits_left > 4) {
+ remainder = (bits_left - 4) / 8;
+ for (i = 0; i < remainder; i++) {
+ strcat(binary_data, i & 1 ? "00010001" : "11101100");
+ }
+ }
+ bin_append(0, 4, binary_data);
+ }
+
+ if (ecc_mode == LEVEL_L) {
+ data_codewords = 11;
+ ecc_codewords = 6;
+ }
+ else if (ecc_mode == LEVEL_M) {
+ data_codewords = 9;
+ ecc_codewords = 8;
+ }
+ else assert(0);
+
+ /* Copy data into codewords */
+ for (i = 0; i < (data_codewords - 1); i++) {
+ data_blocks[i] = 0;
+
+ for (j = 0; j < 8; j++) {
+ if (binary_data[(i * 8) + j] == '1') {
+ data_blocks[i] += 0x80 >> j;
+ }
+ }
+ }
+
+ if (ecc_mode == LEVEL_L) {
+ data_blocks[10] = 0;
+ for (j = 0; j < 4; j++) {
+ if (binary_data[80 + j] == '1') {
+ data_blocks[10] += 0x80 >> j;
+ }
+ }
+ }
+
+ if (ecc_mode == LEVEL_M) {
+ data_blocks[8] = 0;
+ for (j = 0; j < 4; j++) {
+ if (binary_data[64 + j] == '1') {
+ data_blocks[8] += 0x80 >> j;
+ }
+ }
+ }
+
+ /* Calculate Reed-Solomon error codewords */
+ rs_init_gf(0x11d);
+ rs_init_code(ecc_codewords, 0);
+ rs_encode(data_codewords, data_blocks, ecc_blocks);
+ rs_free();
+
+ /* Add Reed-Solomon codewords to binary data */
+ for (i = 0; i < ecc_codewords; i++) {
+ bin_append(ecc_blocks[ecc_codewords - i - 1], 8, binary_data);
+ }
+
+ return;
+}
+
+static void micro_qr_m4(char binary_data[],const int ecc_mode) {
+ int i, j, latch;
+ int bits_total=0, bits_left, remainder;
+ int data_codewords=0, ecc_codewords=0;
+ unsigned char data_blocks[17], ecc_blocks[15];
+
+ latch = 0;
+
+ if (ecc_mode == LEVEL_L) {
+ bits_total = 128;
+ }
+ else if (ecc_mode == LEVEL_M) {
+ bits_total = 112;
+ }
+ else if (ecc_mode == LEVEL_Q) {
+ bits_total = 80;
+ }
+ else assert(0);
+
+ /* Add terminator */
+ bits_left = bits_total - (int)strlen(binary_data);
+ if (bits_left <= 9) {
+ for (i = 0; i < bits_left; i++) {
+ strcat(binary_data, "0");
+ }
+ latch = 1;
+ } else {
+ bin_append(0, 9, binary_data);
+ }
+
+ if (latch == 0) {
+ /* Complete current byte */
+ remainder = 8 - (strlen(binary_data) % 8);
+ if (remainder == 8) {
+ remainder = 0;
+ }
+ for (i = 0; i < remainder; i++) {
+ strcat(binary_data, "0");
+ }
+
+ /* Add padding */
+ bits_left = bits_total - (int)strlen(binary_data);
+ remainder = bits_left / 8;
+ for (i = 0; i < remainder; i++) {
+ strcat(binary_data, i & 1 ? "00010001" : "11101100");
+ }
+ }
+
+ if (ecc_mode == LEVEL_L) {
+ data_codewords = 16;
+ ecc_codewords = 8;
+ }
+ else if (ecc_mode == LEVEL_M) {
+ data_codewords = 14;
+ ecc_codewords = 10;
+ }
+ else if (ecc_mode == LEVEL_Q) {
+ data_codewords = 10;
+ ecc_codewords = 14;
+ }
+ else assert(0);
+
+ /* Copy data into codewords */
+ for (i = 0; i < data_codewords; i++) {
+ data_blocks[i] = 0;
+
+ for (j = 0; j < 8; j++) {
+ if (binary_data[(i * 8) + j] == '1') {
+ data_blocks[i] += 0x80 >> j;
+ }
+ }
+ }
+
+ /* Calculate Reed-Solomon error codewords */
+ rs_init_gf(0x11d);
+ rs_init_code(ecc_codewords, 0);
+ rs_encode(data_codewords, data_blocks, ecc_blocks);
+ rs_free();
+
+ /* Add Reed-Solomon codewords to binary data */
+ for (i = 0; i < ecc_codewords; i++) {
+ bin_append(ecc_blocks[ecc_codewords - i - 1], 8, binary_data);
+ }
+}
+
+static void micro_setup_grid(unsigned char* grid,const int size) {
+ int i, toggle = 1;
+
+ /* Add timing patterns */
+ for (i = 0; i < size; i++) {
+ if (toggle == 1) {
+ grid[i] = 0x21;
+ grid[(i * size)] = 0x21;
+ toggle = 0;
+ } else {
+ grid[i] = 0x20;
+ grid[(i * size)] = 0x20;
+ toggle = 1;
+ }
+ }
+
+ /* Add finder patterns */
+ place_finder(grid, size, 0, 0);
+
+ /* Add separators */
+ for (i = 0; i < 7; i++) {
+ grid[(7 * size) + i] = 0x10;
+ grid[(i * size) + 7] = 0x10;
+ }
+ grid[(7 * size) + 7] = 0x10;
+
+
+ /* Reserve space for format information */
+ for (i = 0; i < 8; i++) {
+ grid[(8 * size) + i] += 0x20;
+ grid[(i * size) + 8] += 0x20;
+ }
+ grid[(8 * size) + 8] += 20;
+}
+
+static void micro_populate_grid(unsigned char* grid,const int size,const char full_stream[]) {
+ int direction = 1; /* up */
+ int row = 0; /* right hand side */
+ size_t n;
+ int i,x, y;
+
+ n = strlen(full_stream);
+ y = size - 1;
+ i = 0;
+ do {
+ x = (size - 2) - (row * 2);
+
+ if (!(grid[(y * size) + (x + 1)] & 0xf0)) {
+ if (full_stream[i] == '1') {
+ grid[(y * size) + (x + 1)] = 0x01;
+ } else {
+ grid[(y * size) + (x + 1)] = 0x00;
+ }
+ i++;
+ }
+
+ if (i < n) {
+ if (!(grid[(y * size) + x] & 0xf0)) {
+ if (full_stream[i] == '1') {
+ grid[(y * size) + x] = 0x01;
+ } else {
+ grid[(y * size) + x] = 0x00;
+ }
+ i++;
+ }
+ }
+
+ if (direction) {
+ y--;
+ } else {
+ y++;
+ }
+ if (y == 0) {
+ /* reached the top */
+ row++;
+ y = 1;
+ direction = 0;
+ }
+ if (y == size) {
+ /* reached the bottom */
+ row++;
+ y = size - 1;
+ direction = 1;
+ }
+ } while (i < n);
+}
+
+static int micro_evaluate(const unsigned char *grid,const int size,const int pattern) {
+ int sum1, sum2, i, filter = 0, retval;
+
+ switch (pattern) {
+ case 0: filter = 0x01;
+ break;
+ case 1: filter = 0x02;
+ break;
+ case 2: filter = 0x04;
+ break;
+ case 3: filter = 0x08;
+ break;
+ }
+
+ sum1 = 0;
+ sum2 = 0;
+ for (i = 1; i < size; i++) {
+ if (grid[(i * size) + size - 1] & filter) {
+ sum1++;
+ }
+ if (grid[((size - 1) * size) + i] & filter) {
+ sum2++;
+ }
+ }
+
+ if (sum1 <= sum2) {
+ retval = (sum1 * 16) + sum2;
+ } else {
+ retval = (sum2 * 16) + sum1;
+ }
+
+ return retval;
+}
+
+static int micro_apply_bitmask(unsigned char *grid,const int size) {
+ int x, y;
+ unsigned char p;
+ int pattern, value[8];
+ int best_val, best_pattern;
+
+#ifndef _MSC_VER
+ unsigned char mask[size * size];
+ unsigned char eval[size * size];
+#else
+ unsigned char* mask = (unsigned char *) _alloca((size * size) * sizeof (unsigned char));
+ unsigned char* eval = (unsigned char *) _alloca((size * size) * sizeof (unsigned char));
+#endif
+
+ /* Perform data masking */
+ for (x = 0; x < size; x++) {
+ for (y = 0; y < size; y++) {
+ mask[(y * size) + x] = 0x00;
+
+ if (!(grid[(y * size) + x] & 0xf0)) {
+ if ((y & 1) == 0) {
+ mask[(y * size) + x] += 0x01;
+ }
+
+ if ((((y / 2) + (x / 3)) & 1) == 0) {
+ mask[(y * size) + x] += 0x02;
+ }
+
+ if (((((y * x) & 1) + ((y * x) % 3)) & 1) == 0) {
+ mask[(y * size) + x] += 0x04;
+ }
+
+ if (((((y + x) & 1) + ((y * x) % 3)) & 1) == 0) {
+ mask[(y * size) + x] += 0x08;
+ }
+ }
+ }
+ }
+
+ for (x = 0; x < size; x++) {
+ for (y = 0; y < size; y++) {
+ if (grid[(y * size) + x] & 0x01) {
+ p = 0xff;
+ } else {
+ p = 0x00;
+ }
+
+ eval[(y * size) + x] = mask[(y * size) + x] ^ p;
+ }
+ }
+
+
+ /* Evaluate result */
+ for (pattern = 0; pattern < 8; pattern++) {
+ value[pattern] = micro_evaluate(eval, size, pattern);
+ }
+
+ best_pattern = 0;
+ best_val = value[0];
+ for (pattern = 1; pattern < 4; pattern++) {
+ if (value[pattern] > best_val) {
+ best_pattern = pattern;
+ best_val = value[pattern];
+ }
+ }
+
+ /* Apply mask */
+ for (x = 0; x < size; x++) {
+ for (y = 0; y < size; y++) {
+ if (mask[(y * size) + x] & (0x01 << best_pattern)) {
+ if (grid[(y * size) + x] & 0x01) {
+ grid[(y * size) + x] = 0x00;
+ } else {
+ grid[(y * size) + x] = 0x01;
+ }
+ }
+ }
+ }
+
+ return best_pattern;
+}
+
+int microqr(struct zint_symbol *symbol, const unsigned char source[], size_t length) {
+ size_t i;
+ int j,size;
+ char binary_stream[200];
+ char full_stream[200];
+ int utfdata[40],glyph;
+
+ int jisdata[40];
+ char mode[40];
+ int error_number, kanji_used = 0, alphanum_used = 0, byte_used = 0;
+ int version_valid[4];
+ int binary_count[4];
+ int ecc_level, autoversion, version;
+ int n_count, a_count, bitmask, format, format_full;
+#ifdef _MSC_VER
+ unsigned char* grid;
+#endif
+
+ if (length > 35) {
+ strcpy(symbol->errtxt, "562: Input data too long");
+ return ZINT_ERROR_TOO_LONG;
+ }
+
+ for (i = 0; i < 4; i++) {
+ version_valid[i] = 1;
+ }
+
+ if (symbol->input_mode == DATA_MODE) {
+ for (i = 0; i < length; i++) {
+ jisdata[i] = (int) source[i];
+ }
+ } else {
+ /* Convert Unicode input to Shift-JIS */
+ error_number = utf8toutf16(symbol, source, utfdata, &length);
+ if (error_number != 0) {
+ return error_number;
+ }
+
+ for (i = 0; i < length; i++) {
+ if (utfdata[i] <= 0xff) {
+ jisdata[i] = utfdata[i];
+ } else {
+ j = 0;
+ glyph = 0;
+ do {
+ if (sjis_lookup[j * 2] == utfdata[i]) {
+ glyph = sjis_lookup[(j * 2) + 1];
+ }
+ j++;
+ } while ((j < 6843) && (glyph == 0));
+ if (glyph == 0) {
+ strcpy(symbol->errtxt, "563: Invalid character in input data");
+ return ZINT_ERROR_INVALID_DATA;
+ }
+ jisdata[i] = glyph;
+ }
+ }
+ }
+
+ define_mode(mode, jisdata, length, 0);
+
+ n_count = 0;
+ a_count = 0;
+ for (i = 0; i < length; i++) {
+ if ((jisdata[i] >= '0') && (jisdata[i] <= '9')) {
+ n_count++;
+ }
+ if (in_alpha(jisdata[i])) {
+ a_count++;
+ }
+ }
+
+ if (a_count == length) {
+ /* All data can be encoded in Alphanumeric mode */
+ for (i = 0; i < length; i++) {
+ mode[i] = 'A';
+ }
+ }
+
+ if (n_count == length) {
+ /* All data can be encoded in Numeric mode */
+ for (i = 0; i < length; i++) {
+ mode[i] = 'N';
+ }
+ }
+
+ error_number = micro_qr_intermediate(binary_stream, jisdata, mode, length, &kanji_used, &alphanum_used, &byte_used, symbol->debug);
+ if (error_number != 0) {
+ strcpy(symbol->errtxt, "564: Input data too long");
+ return error_number;
+ }
+
+ get_bitlength(binary_count, binary_stream);
+
+ /* Eliminate possivle versions depending on type of content */
+ if (byte_used) {
+ version_valid[0] = 0;
+ version_valid[1] = 0;
+ }
+
+ if (alphanum_used) {
+ version_valid[0] = 0;
+ }
+
+ if (kanji_used) {
+ version_valid[0] = 0;
+ version_valid[1] = 0;
+ }
+
+ /* Eliminate possible versions depending on length of binary data */
+ if (binary_count[0] > 20) {
+ version_valid[0] = 0;
+ }
+ if (binary_count[1] > 40) {
+ version_valid[1] = 0;
+ }
+ if (binary_count[2] > 84) {
+ version_valid[2] = 0;
+ }
+ if (binary_count[3] > 128) {
+ strcpy(symbol->errtxt, "565: Input data too long");
+ return ZINT_ERROR_TOO_LONG;
+ }
+
+ /* Eliminate possible versions depending on error correction level specified */
+ ecc_level = LEVEL_L;
+ if ((symbol->option_1 >= 1) && (symbol->option_2 <= 4)) {
+ ecc_level = symbol->option_1;
+ }
+
+ if (ecc_level == LEVEL_H) {
+ strcpy(symbol->errtxt, "566: Error correction level H not available");
+ return ZINT_ERROR_INVALID_OPTION;
+ }
+
+ if (ecc_level == LEVEL_Q) {
+ version_valid[0] = 0;
+ version_valid[1] = 0;
+ version_valid[2] = 0;
+ if (binary_count[3] > 80) {
+ strcpy(symbol->errtxt, "567: Input data too long");
+ return ZINT_ERROR_TOO_LONG;
+ }
+ }
+
+ if (ecc_level == LEVEL_M) {
+ version_valid[0] = 0;
+ if (binary_count[1] > 32) {
+ version_valid[1] = 0;
+ }
+ if (binary_count[2] > 68) {
+ version_valid[2] = 0;
+ }
+ if (binary_count[3] > 112) {
+ strcpy(symbol->errtxt, "568: Input data too long");
+ return ZINT_ERROR_TOO_LONG;
+ }
+ }
+
+ autoversion = 3;
+ if (version_valid[2]) {
+ autoversion = 2;
+ }
+ if (version_valid[1]) {
+ autoversion = 1;
+ }
+ if (version_valid[0]) {
+ autoversion = 0;
+ }
+
+ version = autoversion;
+ /* Get version from user */
+ if ((symbol->option_2 >= 1) && (symbol->option_2 <= 4)) {
+ if (symbol->option_2 >= autoversion) {
+ version = symbol->option_2;
+ } else {
+ strcpy(symbol->errtxt, "570: Input too long for selected symbol size");
+ return ZINT_ERROR_TOO_LONG;
+ }
+ }
+
+ /* If there is enough unused space then increase the error correction level */
+ if (version == 3) {
+ if (binary_count[3] <= 112) {
+ ecc_level = LEVEL_M;
+ }
+ if (binary_count[3] <= 80) {
+ ecc_level = LEVEL_Q;
+ }
+ }
+
+ if (version == 2) {
+ if (binary_count[2] <= 68) {
+ ecc_level = LEVEL_M;
+ }
+ }
+
+ if (version == 1) {
+ if (binary_count[1] <= 32) {
+ ecc_level = LEVEL_M;
+ }
+ }
+
+ strcpy(full_stream, "");
+ microqr_expand_binary(binary_stream, full_stream, version);
+
+ switch (version) {
+ case 0: micro_qr_m1(full_stream);
+ break;
+ case 1: micro_qr_m2(full_stream, ecc_level);
+ break;
+ case 2: micro_qr_m3(full_stream, ecc_level);
+ break;
+ case 3: micro_qr_m4(full_stream, ecc_level);
+ break;
+ }
+
+ size = micro_qr_sizes[version];
+#ifndef _MSC_VER
+ unsigned char grid[size * size];
+#else
+ grid = (unsigned char *) _alloca((size * size) * sizeof (unsigned char));
+#endif
+
+ for (i = 0; i < size; i++) {
+ for (j = 0; j < size; j++) {
+ grid[(i * size) + j] = 0;
+ }
+ }
+
+ micro_setup_grid(grid, size);
+ micro_populate_grid(grid, size, full_stream);
+ bitmask = micro_apply_bitmask(grid, size);
+
+ /* Add format data */
+ format = 0;
+ switch (version) {
+ case 1: switch (ecc_level) {
+ case 1: format = 1;
+ break;
+ case 2: format = 2;
+ break;
+ }
+ break;
+ case 2: switch (ecc_level) {
+ case 1: format = 3;
+ break;
+ case 2: format = 4;
+ break;
+ }
+ break;
+ case 3: switch (ecc_level) {
+ case 1: format = 5;
+ break;
+ case 2: format = 6;
+ break;
+ case 3: format = 7;
+ break;
+ }
+ break;
+ }
+
+ format_full = qr_annex_c1[(format << 2) + bitmask];
+
+ if (format_full & 0x4000) {
+ grid[(8 * size) + 1] += 0x01;
+ }
+ if (format_full & 0x2000) {
+ grid[(8 * size) + 2] += 0x01;
+ }
+ if (format_full & 0x1000) {
+ grid[(8 * size) + 3] += 0x01;
+ }
+ if (format_full & 0x800) {
+ grid[(8 * size) + 4] += 0x01;
+ }
+ if (format_full & 0x400) {
+ grid[(8 * size) + 5] += 0x01;
+ }
+ if (format_full & 0x200) {
+ grid[(8 * size) + 6] += 0x01;
+ }
+ if (format_full & 0x100) {
+ grid[(8 * size) + 7] += 0x01;
+ }
+ if (format_full & 0x80) {
+ grid[(8 * size) + 8] += 0x01;
+ }
+ if (format_full & 0x40) {
+ grid[(7 * size) + 8] += 0x01;
+ }
+ if (format_full & 0x20) {
+ grid[(6 * size) + 8] += 0x01;
+ }
+ if (format_full & 0x10) {
+ grid[(5 * size) + 8] += 0x01;
+ }
+ if (format_full & 0x08) {
+ grid[(4 * size) + 8] += 0x01;
+ }
+ if (format_full & 0x04) {
+ grid[(3 * size) + 8] += 0x01;
+ }
+ if (format_full & 0x02) {
+ grid[(2 * size) + 8] += 0x01;
+ }
+ if (format_full & 0x01) {
+ grid[(1 * size) + 8] += 0x01;
+ }
+
+ symbol->width = size;
+ symbol->rows = size;
+
+ for (i = 0; i < size; i++) {
+ for (j = 0; j < size; j++) {
+ if (grid[(i * size) + j] & 0x01) {
+ set_module(symbol, i, j);
+ }
+ }
+ symbol->row_height[i] = 1;
+ }
+
+ return 0;
+}
+
+/* For UPNQR the symbol size and error correction capacity is fixed */
+int upnqr(struct zint_symbol *symbol, const unsigned char source[], size_t length) {
+ int i, j, est_binlen;
+ int ecc_level, version, target_binlen, blocks, size;
+ int bitmask, error_number;
+
+#ifndef _MSC_VER
+ int jisdata[length + 1];
+ char mode[length + 1];
+#else
+ int* datastream;
+ int* fullstream;
+ unsigned char* grid;
+ int* jisdata = (int *) _alloca((length + 1) * sizeof (int));
+ char* mode = (char *) _alloca(length + 1);
+#endif
+
+#ifndef _MSC_VER
+ unsigned char preprocessed[length + 1];
+#else
+ unsigned char* preprocessed = (unsigned char*) _alloca(length + 1);
+#endif
+
+ switch(symbol->input_mode) {
+ case DATA_MODE:
+ /* Input is already in ISO-8859-2 format */
+ for (i = 0; i < length; i++) {
+ jisdata[i] = (int) source[i];
+ mode[i] = 'B';
+ }
+ break;
+ case GS1_MODE:
+ strcpy(symbol->errtxt, "571: UPNQR does not support GS-1 encoding");
+ return ZINT_ERROR_INVALID_OPTION;
+ break;
+ case UNICODE_MODE:
+ error_number = utf_to_eci(4, source, preprocessed, &length);
+ if (error_number != 0) {
+ strcpy(symbol->errtxt, "572: Invalid characters in input data");
+ return error_number;
+ }
+ for (i = 0; i < length; i++) {
+ jisdata[i] = (int) preprocessed[i];
+ mode[i] = 'B';
+ }
+ break;
+ }
+
+ symbol->eci = 4;
+ est_binlen = getBinaryLength(15, mode, jisdata, length, 0, symbol->eci);
+
+ ecc_level = LEVEL_M;
+
+ if (est_binlen > 3320) {
+ strcpy(symbol->errtxt, "573: Input too long for selected symbol");
+ return ZINT_ERROR_TOO_LONG;
+ }
+
+ version = 15; // 77 x 77
+
+ target_binlen = qr_data_codewords_M[version - 1];
+ blocks = qr_blocks_M[version - 1];
+
+#ifndef _MSC_VER
+ int datastream[target_binlen + 1];
+ int fullstream[qr_total_codewords[version - 1] + 1];
+#else
+ datastream = (int *) _alloca((target_binlen + 1) * sizeof (int));
+ fullstream = (int *) _alloca((qr_total_codewords[version - 1] + 1) * sizeof (int));
+#endif
+
+ qr_binary(datastream, version, target_binlen, mode, jisdata, length, 0, symbol->eci, est_binlen, symbol->debug);
+ add_ecc(fullstream, datastream, version, target_binlen, blocks);
+
+ size = qr_sizes[version - 1];
+#ifndef _MSC_VER
+ unsigned char grid[size * size];
+#else
+ grid = (unsigned char *) _alloca((size * size) * sizeof (unsigned char));
+#endif
+
+ for (i = 0; i < size; i++) {
+ for (j = 0; j < size; j++) {
+ grid[(i * size) + j] = 0;
+ }
+ }
+
+ setup_grid(grid, size, version);
+ populate_grid(grid, size, fullstream, qr_total_codewords[version - 1]);
+
+ add_version_info(grid, size, version);
+
+ bitmask = apply_bitmask(grid, size, ecc_level);
+
+ add_format_info(grid, size, ecc_level, bitmask);
+
+ symbol->width = size;
+ symbol->rows = size;
+
+ for (i = 0; i < size; i++) {
+ for (j = 0; j < size; j++) {
+ if (grid[(i * size) + j] & 0x01) {
+ set_module(symbol, i, j);
+ }
+ }
+ symbol->row_height[i] = 1;
+ }
+
+ return 0;
+}
diff --git a/3rdparty/zint-2.6.1/backend/qr.h b/3rdparty/zint-2.6.1/backend/qr.h
new file mode 100644
index 0000000..c5a23c9
--- /dev/null
+++ b/3rdparty/zint-2.6.1/backend/qr.h
@@ -0,0 +1,167 @@
+/* qr.h Data for QR Code */
+
+/*
+ libzint - the open source barcode library
+ Copyright (C) 2008-2017 Robin Stuart
+ Copyright (C) 2006 Kentaro Fukuchi
+
+ Redistribution and use in source and binary forms, with or without
+ modification, are permitted provided that the following conditions
+ are met:
+
+ 1. Redistributions of source code must retain the above copyright
+ notice, this list of conditions and the following disclaimer.
+ 2. Redistributions in binary form must reproduce the above copyright
+ notice, this list of conditions and the following disclaimer in the
+ documentation and/or other materials provided with the distribution.
+ 3. Neither the name of the project nor the names of its contributors
+ may be used to endorse or promote products derived from this software
+ without specific prior written permission.
+
+ THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND
+ ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+ ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE
+ FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+ DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
+ OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
+ HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
+ LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
+ OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+ SUCH DAMAGE.
+ */
+
+#define LEVEL_L 1
+#define LEVEL_M 2
+#define LEVEL_Q 3
+#define LEVEL_H 4
+
+#define RHODIUM "0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ $%*+-./:"
+
+/* From ISO/IEC 18004:2006 Table 7 */
+static const unsigned short int qr_data_codewords_L[] = {
+ 19, 34, 55, 80, 108, 136, 156, 194, 232, 274, 324, 370, 428, 461, 523, 589, 647,
+ 721, 795, 861, 932, 1006, 1094, 1174, 1276, 1370, 1468, 1531, 1631,
+ 1735, 1843, 1955, 2071, 2191, 2306, 2434, 2566, 2702, 2812, 2956
+};
+
+static const unsigned short int qr_data_codewords_M[] = {
+ 16, 28, 44, 64, 86, 108, 124, 154, 182, 216, 254, 290, 334, 365, 415, 453, 507,
+ 563, 627, 669, 714, 782, 860, 914, 1000, 1062, 1128, 1193, 1267,
+ 1373, 1455, 1541, 1631, 1725, 1812, 1914, 1992, 2102, 2216, 2334
+};
+
+static const unsigned short int qr_data_codewords_Q[] = {
+ 13, 22, 34, 48, 62, 76, 88, 110, 132, 154, 180, 206, 244, 261, 295, 325, 367,
+ 397, 445, 485, 512, 568, 614, 664, 718, 754, 808, 871, 911,
+ 985, 1033, 1115, 1171, 1231, 1286, 1354, 1426, 1502, 1582, 1666
+};
+
+static const unsigned short int qr_data_codewords_H[] = {
+ 9, 16, 26, 36, 46, 60, 66, 86, 100, 122, 140, 158, 180, 197, 223, 253, 283,
+ 313, 341, 385, 406, 442, 464, 514, 538, 596, 628, 661, 701,
+ 745, 793, 845, 901, 961, 986, 1054, 1096, 1142, 1222, 1276
+};
+
+static const unsigned short int qr_total_codewords[] = {
+ 26, 44, 70, 100, 134, 172, 196, 242, 292, 346, 404, 466, 532, 581, 655, 733, 815,
+ 901, 991, 1085, 1156, 1258, 1364, 1474, 1588, 1706, 1828, 1921, 2051,
+ 2185, 2323, 2465, 2611, 2761, 2876, 3034, 3196, 3362, 3532, 3706
+};
+
+static const char qr_blocks_L[] = {
+ 1, 1, 1, 1, 1, 2, 2, 2, 2, 4, 4, 4, 4, 4, 6, 6, 6, 6, 7, 8, 8, 9, 9, 10, 12, 12,
+ 12, 13, 14, 15, 16, 17, 18, 19, 19, 20, 21, 22, 24, 25
+};
+
+static const char qr_blocks_M[] = {
+ 1, 1, 1, 2, 2, 4, 4, 4, 5, 5, 5, 8, 9, 9, 10, 10, 11, 13, 14, 16, 17, 17, 18, 20,
+ 21, 23, 25, 26, 28, 29, 31, 33, 35, 37, 38, 40, 43, 45, 47, 49
+};
+
+static const char qr_blocks_Q[] = {
+ 1, 1, 2, 2, 4, 4, 6, 6, 8, 8, 8, 10, 12, 16, 12, 17, 16, 18, 21, 20, 23, 23, 25,
+ 27, 29, 34, 34, 35, 38, 40, 43, 45, 48, 51, 53, 56, 59, 62, 65, 68
+};
+
+static const char qr_blocks_H[] = {
+ 1, 1, 2, 4, 4, 4, 5, 6, 8, 8, 11, 11, 16, 16, 18, 16, 19, 21, 25, 25, 25, 34, 30,
+ 32, 35, 37, 40, 42, 45, 48, 51, 54, 57, 60, 63, 66, 70, 74, 77, 81
+};
+
+static const unsigned short int qr_sizes[] = {
+ 21, 25, 29, 33, 37, 41, 45, 49, 53, 57, 61, 65, 69, 73, 77, 81, 85, 89, 93, 97,
+ 101, 105, 109, 113, 117, 121, 125, 129, 133, 137, 141, 145, 149, 153, 157, 161, 165, 169, 173, 177
+};
+
+static const char micro_qr_sizes[] = {
+ 11, 13, 15, 17
+};
+
+static const char qr_align_loopsize[] = {
+ 0, 2, 2, 2, 2, 2, 3, 3, 3, 3, 3, 3, 3, 4, 4, 4, 4, 4, 4, 4, 5, 5, 5, 5, 5, 5, 5, 6, 6, 6, 6, 6, 6, 6, 7, 7, 7, 7, 7, 7
+};
+
+static const unsigned short int qr_table_e1[] = {
+ 6, 18, 0, 0, 0, 0, 0,
+ 6, 22, 0, 0, 0, 0, 0,
+ 6, 26, 0, 0, 0, 0, 0,
+ 6, 30, 0, 0, 0, 0, 0,
+ 6, 34, 0, 0, 0, 0, 0,
+ 6, 22, 38, 0, 0, 0, 0,
+ 6, 24, 42, 0, 0, 0, 0,
+ 6, 26, 46, 0, 0, 0, 0,
+ 6, 28, 50, 0, 0, 0, 0,
+ 6, 30, 54, 0, 0, 0, 0,
+ 6, 32, 58, 0, 0, 0, 0,
+ 6, 34, 62, 0, 0, 0, 0,
+ 6, 26, 46, 66, 0, 0, 0,
+ 6, 26, 48, 70, 0, 0, 0,
+ 6, 26, 50, 74, 0, 0, 0,
+ 6, 30, 54, 78, 0, 0, 0,
+ 6, 30, 56, 82, 0, 0, 0,
+ 6, 30, 58, 86, 0, 0, 0,
+ 6, 34, 62, 90, 0, 0, 0,
+ 6, 28, 50, 72, 94, 0, 0,
+ 6, 26, 50, 74, 98, 0, 0,
+ 6, 30, 54, 78, 102, 0, 0,
+ 6, 28, 54, 80, 106, 0, 0,
+ 6, 32, 58, 84, 110, 0, 0,
+ 6, 30, 58, 86, 114, 0, 0,
+ 6, 34, 62, 90, 118, 0, 0,
+ 6, 26, 50, 74, 98, 122, 0,
+ 6, 30, 54, 78, 102, 126, 0,
+ 6, 26, 52, 78, 104, 130, 0,
+ 6, 30, 56, 82, 108, 134, 0,
+ 6, 34, 60, 86, 112, 138, 0,
+ 6, 30, 58, 86, 114, 142, 0,
+ 6, 34, 62, 90, 118, 146, 0,
+ 6, 30, 54, 78, 102, 126, 150,
+ 6, 24, 50, 76, 102, 128, 154,
+ 6, 28, 54, 80, 106, 132, 158,
+ 6, 32, 58, 84, 110, 136, 162,
+ 6, 26, 54, 82, 110, 138, 166,
+ 6, 30, 58, 86, 114, 142, 170
+};
+
+static const unsigned int qr_annex_c[] = {
+ /* Format information bit sequences */
+ 0x5412, 0x5125, 0x5e7c, 0x5b4b, 0x45f9, 0x40ce, 0x4f97, 0x4aa0, 0x77c4, 0x72f3, 0x7daa, 0x789d,
+ 0x662f, 0x6318, 0x6c41, 0x6976, 0x1689, 0x13be, 0x1ce7, 0x19d0, 0x0762, 0x0255, 0x0d0c, 0x083b,
+ 0x355f, 0x3068, 0x3f31, 0x3a06, 0x24b4, 0x2183, 0x2eda, 0x2bed
+};
+
+static const unsigned int qr_annex_d[] = {
+ /* Version information bit sequences */
+ 0x07c94, 0x085bc, 0x09a99, 0x0a4d3, 0x0bbf6, 0x0c762, 0x0d847, 0x0e60d, 0x0f928, 0x10b78,
+ 0x1145d, 0x12a17, 0x13532, 0x149a6, 0x15683, 0x168c9, 0x177ec, 0x18ec4, 0x191e1, 0x1afab,
+ 0x1b08e, 0x1cc1a, 0x1d33f, 0x1ed75, 0x1f250, 0x209d5, 0x216f0, 0x228ba, 0x2379f, 0x24b0b,
+ 0x2542e, 0x26a64, 0x27541, 0x28c69
+};
+
+static const unsigned int qr_annex_c1[] = {
+ /* Micro QR Code format information */
+ 0x4445, 0x4172, 0x4e2b, 0x4b1c, 0x55ae, 0x5099, 0x5fc0, 0x5af7, 0x6793, 0x62a4, 0x6dfd, 0x68ca, 0x7678, 0x734f,
+ 0x7c16, 0x7921, 0x06de, 0x03e9, 0x0cb0, 0x0987, 0x1735, 0x1202, 0x1d5b, 0x186c, 0x2508, 0x203f, 0x2f66, 0x2a51, 0x34e3,
+ 0x31d4, 0x3e8d, 0x3bba
+};
diff --git a/3rdparty/zint-2.6.1/backend/raster.c b/3rdparty/zint-2.6.1/backend/raster.c
new file mode 100644
index 0000000..08bf9a7
--- /dev/null
+++ b/3rdparty/zint-2.6.1/backend/raster.c
@@ -0,0 +1,1138 @@
+/* raster.c - Handles output to raster files */
+
+/*
+ libzint - the open source barcode library
+ Copyright (C) 2009-2017 Robin Stuart
+
+ Redistribution and use in source and binary forms, with or without
+ modification, are permitted provided that the following conditions
+ are met:
+
+ 1. Redistributions of source code must retain the above copyright
+ notice, this list of conditions and the following disclaimer.
+ 2. Redistributions in binary form must reproduce the above copyright
+ notice, this list of conditions and the following disclaimer in the
+ documentation and/or other materials provided with the distribution.
+ 3. Neither the name of the project nor the names of its contributors
+ may be used to endorse or promote products derived from this software
+ without specific prior written permission.
+
+ THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND
+ ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+ ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE
+ FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+ DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
+ OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
+ HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
+ LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
+ OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+ SUCH DAMAGE.
+ */
+
+#include
+#ifdef _MSC_VER
+#include
+#include
+#endif
+#include
+#include
+#include "common.h"
+
+#ifdef _MSC_VER
+#include
+#endif /* _MSC_VER */
+
+#include "font.h" /* Font for human readable text */
+
+#define SSET "0123456789ABCDEF"
+
+#ifndef NO_PNG
+extern int png_pixel_plot(struct zint_symbol *symbol, char *pixelbuf);
+#endif /* NO_PNG */
+extern int bmp_pixel_plot(struct zint_symbol *symbol, char *pixelbuf);
+extern int pcx_pixel_plot(struct zint_symbol *symbol, char *pixelbuf);
+extern int gif_pixel_plot(struct zint_symbol *symbol, char *pixelbuf);
+extern int tif_pixel_plot(struct zint_symbol *symbol, char *pixelbuf);
+
+void buffer_plot(struct zint_symbol *symbol, char *pixelbuf) {
+ /* Place pixelbuffer into symbol */
+ int fgred, fggrn, fgblu, bgred, bggrn, bgblu;
+ int row, column, i;
+
+ symbol->bitmap = (char *) malloc(symbol->bitmap_width * symbol->bitmap_height * 3);
+
+ fgred = (16 * ctoi(symbol->fgcolour[0])) + ctoi(symbol->fgcolour[1]);
+ fggrn = (16 * ctoi(symbol->fgcolour[2])) + ctoi(symbol->fgcolour[3]);
+ fgblu = (16 * ctoi(symbol->fgcolour[4])) + ctoi(symbol->fgcolour[5]);
+ bgred = (16 * ctoi(symbol->bgcolour[0])) + ctoi(symbol->bgcolour[1]);
+ bggrn = (16 * ctoi(symbol->bgcolour[2])) + ctoi(symbol->bgcolour[3]);
+ bgblu = (16 * ctoi(symbol->bgcolour[4])) + ctoi(symbol->bgcolour[5]);
+
+ for (row = 0; row < symbol->bitmap_height; row++) {
+ for (column = 0; column < symbol->bitmap_width; column++) {
+ i = ((row * symbol->bitmap_width) + column) * 3;
+ switch (*(pixelbuf + (symbol->bitmap_width * row) + column)) {
+ case '1':
+ symbol->bitmap[i] = fgred;
+ symbol->bitmap[i + 1] = fggrn;
+ symbol->bitmap[i + 2] = fgblu;
+ break;
+ default:
+ symbol->bitmap[i] = bgred;
+ symbol->bitmap[i + 1] = bggrn;
+ symbol->bitmap[i + 2] = bgblu;
+ break;
+
+ }
+ }
+ }
+}
+
+int save_raster_image_to_file(struct zint_symbol *symbol, int image_height, int image_width, char *pixelbuf, int rotate_angle, int image_type) {
+ int error_number;
+ int row, column;
+
+ char *rotated_pixbuf;
+
+ if (!(rotated_pixbuf = (char *) malloc(image_width * image_height))) {
+ strcpy(symbol->errtxt, "650: Insufficient memory for pixel buffer");
+ return ZINT_ERROR_ENCODING_PROBLEM;
+ }
+
+ switch (rotate_angle) {
+ case 0:
+ case 180:
+ symbol->bitmap_width = image_width;
+ symbol->bitmap_height = image_height;
+ break;
+ case 90:
+ case 270:
+ symbol->bitmap_width = image_height;
+ symbol->bitmap_height = image_width;
+ break;
+ }
+
+ /* sort out colour options */
+ to_upper((unsigned char*) symbol->fgcolour);
+ to_upper((unsigned char*) symbol->bgcolour);
+
+ if (strlen(symbol->fgcolour) != 6) {
+ strcpy(symbol->errtxt, "651: Malformed foreground colour target");
+ free(rotated_pixbuf);
+ return ZINT_ERROR_INVALID_OPTION;
+ }
+ if (strlen(symbol->bgcolour) != 6) {
+ strcpy(symbol->errtxt, "652: Malformed background colour target");
+ free(rotated_pixbuf);
+ return ZINT_ERROR_INVALID_OPTION;
+ }
+ error_number = is_sane(SSET, (unsigned char*) symbol->fgcolour, strlen(symbol->fgcolour));
+ if (error_number == ZINT_ERROR_INVALID_DATA) {
+ strcpy(symbol->errtxt, "653: Malformed foreground colour target");
+ free(rotated_pixbuf);
+ return ZINT_ERROR_INVALID_OPTION;
+ }
+ error_number = is_sane(SSET, (unsigned char*) symbol->bgcolour, strlen(symbol->fgcolour));
+ if (error_number == ZINT_ERROR_INVALID_DATA) {
+ strcpy(symbol->errtxt, "654: Malformed background colour target");
+ free(rotated_pixbuf);
+ return ZINT_ERROR_INVALID_OPTION;
+ }
+
+ /* Rotate image before plotting */
+ switch (rotate_angle) {
+ case 0: /* Plot the right way up */
+ for (row = 0; row < image_height; row++) {
+ for (column = 0; column < image_width; column++) {
+ rotated_pixbuf[(row * image_width) + column] =
+ pixelbuf[(image_width * row) + column];
+ }
+ }
+ break;
+ case 90: /* Plot 90 degrees clockwise */
+ for (row = 0; row < image_width; row++) {
+ for (column = 0; column < image_height; column++) {
+ rotated_pixbuf[(row * image_height) + column] =
+ *(pixelbuf + (image_width * (image_height - column - 1)) + row);
+ }
+ }
+ break;
+ case 180: /* Plot upside down */
+ for (row = 0; row < image_height; row++) {
+ for (column = 0; column < image_width; column++) {
+ rotated_pixbuf[(row * image_width) + column] =
+ *(pixelbuf + (image_width * (image_height - row - 1)) + (image_width - column - 1));
+ }
+ }
+ break;
+ case 270: /* Plot 90 degrees anti-clockwise */
+ for (row = 0; row < image_width; row++) {
+ for (column = 0; column < image_height; column++) {
+ rotated_pixbuf[(row * image_height) + column] =
+ *(pixelbuf + (image_width * column) + (image_width - row - 1));
+ }
+ }
+ break;
+ }
+
+ switch (image_type) {
+ case OUT_BUFFER:
+ buffer_plot(symbol, rotated_pixbuf);
+ error_number = 0;
+ break;
+ case OUT_PNG_FILE:
+#ifndef NO_PNG
+ error_number = png_pixel_plot(symbol, rotated_pixbuf);
+#else
+ free(rotated_pixbuf);
+ return ZINT_ERROR_INVALID_OPTION;
+#endif
+ break;
+ case OUT_PCX_FILE:
+ error_number = pcx_pixel_plot(symbol, rotated_pixbuf);
+ break;
+ case OUT_GIF_FILE:
+ error_number = gif_pixel_plot(symbol, rotated_pixbuf);
+ break;
+ case OUT_TIF_FILE:
+ error_number = tif_pixel_plot(symbol, rotated_pixbuf);
+ break;
+ default:
+ error_number = bmp_pixel_plot(symbol, rotated_pixbuf);
+ break;
+ }
+
+ free(rotated_pixbuf);
+ return error_number;
+}
+
+void draw_bar(char *pixelbuf, int xpos, int xlen, int ypos, int ylen, int image_width, int image_height) {
+ /* Draw a rectangle */
+ int i, j, png_ypos;
+
+ png_ypos = image_height - ypos - ylen;
+ /* This fudge is needed because EPS measures height from the bottom up but
+ PNG measures y position from the top down */
+
+ for (i = (xpos); i < (xpos + xlen); i++) {
+ for (j = (png_ypos); j < (png_ypos + ylen); j++) {
+ *(pixelbuf + (image_width * j) + i) = '1';
+ }
+ }
+}
+
+void draw_circle(char *pixelbuf, int image_width, int image_height, int x0, int y0, float radius, char fill) {
+ int x, y;
+ int radius_i = (int) radius;
+
+ for (y = -radius_i; y <= radius_i; y++) {
+ for (x = -radius_i; x <= radius_i; x++) {
+ if ((x * x) + (y * y) <= (radius_i * radius_i)) {
+ if ((y + y0 >= 0) && (y + y0 < image_height)
+ && (x + x0 >= 0) && (x + x0 < image_width)) {
+ *(pixelbuf + ((y + y0) * image_width) + (x + x0)) = fill;
+ }
+ }
+ }
+ }
+}
+
+void draw_bullseye(char *pixelbuf, int image_width, int image_height, int xoffset, int yoffset, int scaler) {
+ /* Central bullseye in Maxicode symbols */
+ draw_circle(pixelbuf, image_width, image_height, (int)(14.5 * scaler) + xoffset, (int)(15 * scaler) + yoffset, (int)(4.571 * scaler) + 1, '1');
+ draw_circle(pixelbuf, image_width, image_height, (int)(14.5 * scaler) + xoffset, (int)(15 * scaler) + yoffset, (int)(3.779 * scaler) + 1, '0');
+ draw_circle(pixelbuf, image_width, image_height, (int)(14.5 * scaler) + xoffset, (int)(15 * scaler) + yoffset, (int)(2.988 * scaler) + 1, '1');
+ draw_circle(pixelbuf, image_width, image_height, (int)(14.5 * scaler) + xoffset, (int)(15 * scaler) + yoffset, (int)(2.196 * scaler) + 1, '0');
+ draw_circle(pixelbuf, image_width, image_height, (int)(14.5 * scaler) + xoffset, (int)(15 * scaler) + yoffset, (int)(1.394 * scaler) + 1, '1');
+ draw_circle(pixelbuf, image_width, image_height, (int)(14.5 * scaler) + xoffset, (int)(15 * scaler) + yoffset, (int)(0.602 * scaler) + 1, '0');
+
+}
+
+void draw_hexagon(char *pixelbuf, int image_width, char *scaled_hexagon, int hexagon_size, int xposn, int yposn) {
+ /* Put a hexagon into the pixel buffer */
+ int i, j;
+
+ for (i = 0; i < hexagon_size; i++) {
+ for (j = 0; j < hexagon_size; j++) {
+ if (scaled_hexagon[(i * hexagon_size) + j] == '1') {
+ *(pixelbuf + (image_width * i) + (image_width * yposn) + xposn + j) = '1';
+ }
+ }
+ }
+}
+
+void draw_letter(char *pixelbuf, unsigned char letter, int xposn, int yposn, int textflags, int image_width, int image_height) {
+ /* Put a letter into a position */
+ int skip, x, y, glyph_no, max_x, max_y;
+
+ skip = 0;
+
+ if (letter < 33) {
+ skip = 1;
+ }
+
+ if ((letter > 127) && (letter < 161)) {
+ skip = 1;
+ }
+
+ if (xposn < 0 || yposn < 0) {
+ skip = 1;
+ }
+
+ if (skip == 0) {
+ if (letter > 128) {
+ glyph_no = letter - 66;
+ } else {
+ glyph_no = letter - 33;
+ }
+
+
+ switch (textflags) {
+ case 1: // small font 5x9
+ max_x = 5;
+ max_y = 9;
+
+ if (xposn + max_x >= image_width) {
+ max_x = image_width - xposn - 1;
+ }
+
+ if (yposn + max_y >= image_height) {
+ max_y = image_height - yposn - 1;
+ }
+
+ for (y = 0; y < max_y; y++) {
+ for (x = 0; x < max_x; x++) {
+ if (small_font[(glyph_no * 9) + y] & (0x10 >> x)) {
+ *(pixelbuf + (y * image_width) + (yposn * image_width) + xposn + x) = '1';
+ }
+ }
+ }
+ break;
+
+ case 2: // bold font -> twice the regular font
+ {
+ char * linePtr;
+ max_x = 7;
+ max_y = 14;
+
+ if (xposn + max_x + 1 >= image_width) {
+ max_x = image_width - xposn - 2;
+ }
+
+ if (yposn + max_y >= image_height) {
+ max_y = image_height - yposn - 1;
+ }
+
+ linePtr = pixelbuf + (yposn * image_width) + xposn + 1;
+ for (y = 0; y < max_y; y++) {
+ char * pixelPtr = linePtr;
+ int extra_dot = 0;
+ for (x = 0; x < 7; x++) {
+ if (ascii_font[(glyph_no * 14) + y] & (0x40 >> x)) {
+ *pixelPtr = '1';
+ extra_dot = 1;
+ } else {
+ if (extra_dot) {
+ *pixelPtr = '1';
+ }
+
+ extra_dot = 0;
+ }
+
+ ++pixelPtr;
+ }
+
+ if (extra_dot) {
+ *pixelPtr = '1';
+ }
+
+ linePtr += image_width;
+ }
+ }
+ break;
+
+ default: // regular font 7x15
+ max_x = 7;
+ max_y = 14;
+
+ if (xposn + max_x >= image_width) {
+ max_x = image_width - xposn - 1;
+ }
+
+ if (yposn + max_y >= image_height) {
+ max_y = image_height - yposn - 1;
+ }
+
+ for (y = 0; y < max_y; y++) {
+ for (x = 0; x < 7; x++) {
+ if (ascii_font[(glyph_no * 14) + y] & (0x40 >> x)) {
+ *(pixelbuf + (y * image_width) + (yposn * image_width) + xposn + x) = '1';
+ }
+ }
+ }
+ break;
+ }
+ }
+}
+
+/* Plot a string into the pixel buffer */
+void draw_string(char *pixbuf, char input_string[], int xposn, int yposn, int textflags, int image_width, int image_height) {
+ int i, string_length, string_left_hand, letter_width = 7;
+
+ switch (textflags) {
+ case 1: // small font 5x9
+ letter_width = 5;
+ break;
+
+ case 2: // bold font -> width of the regular font + 1 extra dot + 1 extra space
+ letter_width = 9;
+ break;
+
+ default: // regular font 7x15
+ letter_width = 7;
+ break;
+ }
+
+ string_length = strlen(input_string);
+ string_left_hand = xposn - ((letter_width * string_length) / 2);
+
+ for (i = 0; i < string_length; i++) {
+ draw_letter(pixbuf, input_string[i], string_left_hand + (i * letter_width), yposn, textflags, image_width, image_height);
+ }
+
+}
+
+void plot_hexline(char *scaled_hexagon, int hexagon_size, float start_x, float start_y, float end_x, float end_y) {
+ /* Draw a straight line from start to end */
+ int i;
+ float inc_x, inc_y;
+ float this_x, this_y;
+
+ inc_x = (end_x - start_x) / hexagon_size;
+ inc_y = (end_y - start_y) / hexagon_size;
+
+ for (i = 0; i < hexagon_size; i++) {
+ this_x = start_x + ((float)i * inc_x);
+ this_y = start_y + ((float)i * inc_y);
+ if (((this_x >= 0) && (this_x < hexagon_size)) && ((this_y >= 0) && (this_y < hexagon_size))) {
+ scaled_hexagon[(hexagon_size * (int)this_y) + (int)this_x] = '1';
+ }
+ }
+}
+
+void plot_hexagon(char *scaled_hexagon, int hexagon_size) {
+ /* Create a hexagon shape and fill it */
+ int line, i;
+ char ink;
+
+ float x_offset[6];
+ float y_offset[6];
+ float start_x, start_y;
+ float end_x, end_y;
+
+ x_offset[0] = 0.0;
+ x_offset[1] = 0.86;
+ x_offset[2] = 0.86;
+ x_offset[3] = 0.0;
+ x_offset[4] = -0.86;
+ x_offset[5] = -0.86;
+
+ y_offset[0] = 1.0;
+ y_offset[1] = 0.5;
+ y_offset[2] = -0.5;
+ y_offset[3] = -1.0;
+ y_offset[4] = -0.5;
+ y_offset[5] = 0.5;
+
+ /* Plot hexagon outline */
+ for (line = 0; line < 5; line++) {
+ start_x = ((float)hexagon_size / 2.0) + (((float)hexagon_size / 2.0) * x_offset[line]);
+ start_y = ((float)hexagon_size / 2.0) + (((float)hexagon_size / 2.0) * y_offset[line]);
+ end_x = ((float)hexagon_size / 2.0) + (((float)hexagon_size / 2.0) * x_offset[line + 1]);
+ end_y = ((float)hexagon_size / 2.0) + (((float)hexagon_size / 2.0) * y_offset[line + 1]);
+ plot_hexline(scaled_hexagon, hexagon_size, start_x, start_y, end_x, end_y);
+ }
+ start_x = ((float)hexagon_size / 2.0) + (((float)hexagon_size / 2.0) * x_offset[line]);
+ start_y = ((float)hexagon_size / 2.0) + (((float)hexagon_size / 2.0) * y_offset[line]);
+ end_x = ((float)hexagon_size / 2.0) + (((float)hexagon_size / 2.0) * x_offset[0]);
+ end_y = ((float)hexagon_size / 2.0) + (((float)hexagon_size / 2.0) * y_offset[0]);
+ plot_hexline(scaled_hexagon, hexagon_size, start_x, start_y, end_x, end_y);
+
+ /* Fill hexagon */
+ for (line = 0; line < hexagon_size; line++) {
+ ink = '0';
+ for (i = 0; i < hexagon_size; i++) {
+ if (scaled_hexagon[(hexagon_size * line) + i] == '1') {
+ if (i < (hexagon_size / 2)) {
+ ink = '1';
+ } else {
+ ink = '0';
+ }
+ }
+
+ if (ink == '1') {
+ scaled_hexagon[(hexagon_size * line) + i] = ink;
+ }
+ }
+ }
+}
+
+int plot_raster_maxicode(struct zint_symbol *symbol, int rotate_angle, int data_type) {
+ /* Plot a MaxiCode symbol with hexagons and bullseye */
+ int i, row, column, xposn, yposn;
+ int image_height, image_width;
+ char *pixelbuf;
+ int error_number;
+ int xoffset, yoffset;
+ float scaler = symbol->scale;
+ char *scaled_hexagon;
+ int hexagon_size;
+
+ xoffset = symbol->border_width + symbol->whitespace_width;
+ yoffset = symbol->border_width;
+ image_width = (300 + (2 * xoffset * 2)) * scaler;
+ image_height = (300 + (2 * yoffset * 2)) * scaler;
+
+ if (!(pixelbuf = (char *) malloc(image_width * image_height))) {
+ strcpy(symbol->errtxt, "655: Insufficient memory for pixel buffer");
+ return ZINT_ERROR_ENCODING_PROBLEM;
+ } else {
+ for (i = 0; i < (image_width * image_height); i++) {
+ *(pixelbuf + i) = '0';
+ }
+ }
+
+ hexagon_size = (int)scaler * 10;
+
+ if (!(scaled_hexagon = (char *) malloc(hexagon_size * hexagon_size))) {
+ strcpy(symbol->errtxt, "656: Insufficient memory for pixel buffer");
+ free(scaled_hexagon);
+ free(pixelbuf);
+ return ZINT_ERROR_ENCODING_PROBLEM;
+ } else {
+ for (i = 0; i < (hexagon_size * hexagon_size); i++) {
+ *(scaled_hexagon + i) = '0';
+ }
+ }
+
+ plot_hexagon(scaled_hexagon, hexagon_size);
+
+ draw_bullseye(pixelbuf, image_width, image_height, (2 * xoffset), (2 * yoffset), scaler * 10);
+
+ for (row = 0; row < symbol->rows; row++) {
+ yposn = row * 9;
+ for (column = 0; column < symbol->width; column++) {
+ xposn = column * 10;
+ if (module_is_set(symbol, row, column)) {
+ if (row & 1) {
+ /* Odd (reduced) row */
+ xposn += 5;
+ draw_hexagon(pixelbuf, image_width, scaled_hexagon, hexagon_size, (xposn + (2 * xoffset)) * scaler, (yposn + (2 * yoffset)) * scaler);
+ } else {
+ /* Even (full) row */
+ draw_hexagon(pixelbuf, image_width, scaled_hexagon, hexagon_size, (xposn + (2 * xoffset)) * scaler, (yposn + (2 * yoffset)) * scaler);
+ }
+ }
+ }
+ }
+
+ if ((symbol->output_options & BARCODE_BOX) || (symbol->output_options & BARCODE_BIND)) {
+ /* boundary bars */
+ draw_bar(pixelbuf, 0, image_width, 0, symbol->border_width * 2, image_width, image_height);
+ draw_bar(pixelbuf, 0, image_width, 300 + (symbol->border_width * 2), symbol->border_width * 2, image_width, image_height);
+ }
+
+ if (symbol->output_options & BARCODE_BOX) {
+ /* side bars */
+ draw_bar(pixelbuf, 0, symbol->border_width * 2, 0, image_height, image_width, image_height);
+ draw_bar(pixelbuf, 300 + ((symbol->border_width + symbol->whitespace_width + symbol->whitespace_width) * 2), symbol->border_width * 2, 0, image_height, image_width, image_height);
+ }
+
+ error_number = save_raster_image_to_file(symbol, image_height, image_width, pixelbuf, rotate_angle, data_type);
+ free(scaled_hexagon);
+ free(pixelbuf);
+ return error_number;
+}
+
+/* Convert UTF-8 to Latin1 Codepage for the interpretation line */
+void to_latin1(unsigned char source[], unsigned char preprocessed[]) {
+ int j, i, input_length;
+
+ input_length = ustrlen(source);
+
+ j = 0;
+ i = 0;
+ while (i < input_length) {
+ switch (source[i]) {
+ case 0xC2:
+ /* UTF-8 C2xxh */
+ /* Character range: C280h (latin: 80h) to C2BFh (latin: BFh) */
+ i++;
+ preprocessed[j] = source[i];
+ j++;
+ break;
+ case 0xC3:
+ /* UTF-8 C3xx */
+ /* Character range: C380h (latin: C0h) to C3BFh (latin: FFh) */
+ i++;
+ preprocessed[j] = source[i] + 64;
+ j++;
+ break;
+ default:
+ /* Process ASCII (< 80h), all other unicode points are ignored */
+ if (source[i] < 128) {
+ preprocessed[j] = source[i];
+ j++;
+ }
+ break;
+ }
+ i++;
+ }
+ preprocessed[j] = '\0';
+
+ return;
+}
+
+int plot_raster_dotty(struct zint_symbol *symbol, int rotate_angle, int data_type) {
+ float scaler = 2 * symbol->scale;
+ char *scaled_pixelbuf;
+ int r, i;
+ int scale_width, scale_height;
+ int error_number = 0;
+ int xoffset, yoffset, image_width, image_height;
+
+ symbol->height = symbol->rows; // This is true because only 2d matrix symbols are processed here
+
+ xoffset = symbol->border_width + symbol->whitespace_width;
+ yoffset = symbol->border_width;
+ image_width = symbol->width + xoffset + xoffset;
+ image_height = symbol->height + yoffset + yoffset;
+
+ if (scaler < 2.0) {
+ scaler = 2.0;
+ }
+ scale_width = (image_width * scaler) + 1;
+ scale_height = (image_height * scaler) + 1;
+
+ /* Apply scale options by creating another pixel buffer */
+ if (!(scaled_pixelbuf = (char *) malloc(scale_width * scale_height))) {
+ strcpy(symbol->errtxt, "657: Insufficient memory for pixel buffer");
+ return ZINT_ERROR_ENCODING_PROBLEM;
+ } else {
+ for (i = 0; i < (scale_width * scale_height); i++) {
+ *(scaled_pixelbuf + i) = '0';
+ }
+ }
+
+ /* Plot the body of the symbol to the pixel buffer */
+ for (r = 0; r < symbol->rows; r++) {
+ for (i = 0; i < symbol->width; i++) {
+ if (module_is_set(symbol, r, i)) {
+ draw_circle(scaled_pixelbuf, scale_width, scale_height,
+ (int) ((i + xoffset) * scaler) + (scaler / 2.0),
+ (int) ((r + yoffset) * scaler) + (scaler / 2.0),
+ (symbol->dot_size / 2.0) * scaler,
+ '1');
+ }
+ }
+ }
+
+ error_number = save_raster_image_to_file(symbol, scale_height, scale_width, scaled_pixelbuf, rotate_angle, data_type);
+ free(scaled_pixelbuf);
+
+ return error_number;
+}
+
+int plot_raster_default(struct zint_symbol *symbol, int rotate_angle, int data_type) {
+ int textdone, main_width, comp_offset, large_bar_count;
+ char textpart[10], addon[6];
+ float addon_text_posn, preset_height, large_bar_height;
+ int i, r, textoffset, yoffset, xoffset, latch, image_width, image_height;
+ char *pixelbuf;
+ int addon_latch = 0, textflags = 0;
+ int this_row, block_width, plot_height, plot_yposn, textpos;
+ float row_height, row_posn;
+ int error_number;
+ int default_text_posn;
+ int next_yposn;
+ float scaler = symbol->scale;
+ char *scaled_pixelbuf;
+ int horiz, vert;
+ int scale_width, scale_height;
+#ifndef _MSC_VER
+ unsigned char local_text[ustrlen(symbol->text) + 1];
+#else
+ unsigned char* local_text = (unsigned char*) _alloca(ustrlen(symbol->text) + 1);
+#endif
+
+ if (symbol->show_hrt != 0) {
+ /* Copy text from symbol */
+ to_latin1(symbol->text, local_text);
+ } else {
+ /* No text needed */
+ switch (symbol->symbology) {
+ case BARCODE_EANX:
+ case BARCODE_EANX_CC:
+ case BARCODE_ISBNX:
+ case BARCODE_UPCA:
+ case BARCODE_UPCE:
+ case BARCODE_UPCA_CC:
+ case BARCODE_UPCE_CC:
+ /* For these symbols use dummy text to ensure formatting is done
+ * properly even if no text is required */
+ for (i = 0; i < ustrlen(symbol->text); i++) {
+ if (symbol->text[i] == '+') {
+ local_text[i] = '+';
+ } else {
+ local_text[i] = ' ';
+ }
+ local_text[ustrlen(symbol->text)] = '\0';
+ }
+ break;
+ default:
+ /* For everything else, just remove the text */
+ local_text[0] = '\0';
+ break;
+ }
+ }
+
+ textdone = 0;
+ main_width = symbol->width;
+ strcpy(addon, "");
+ comp_offset = 0;
+ addon_text_posn = 0.0;
+ row_height = 0;
+ if (symbol->output_options & SMALL_TEXT) {
+ textflags = 1;
+ } else if (symbol->output_options & BOLD_TEXT) {
+ textflags = 2;
+ }
+
+ if (symbol->height == 0) {
+ symbol->height = 50;
+ }
+
+ large_bar_count = 0;
+ preset_height = 0.0;
+ for (i = 0; i < symbol->rows; i++) {
+ preset_height += symbol->row_height[i];
+ if (symbol->row_height[i] == 0) {
+ large_bar_count++;
+ }
+ }
+
+ if (large_bar_count == 0) {
+ symbol->height = preset_height;
+ large_bar_height = 10;
+ } else {
+ large_bar_height = (symbol->height - preset_height) / large_bar_count;
+ }
+
+ while (!(module_is_set(symbol, symbol->rows - 1, comp_offset))) {
+ comp_offset++;
+ }
+
+ /* Certain symbols need whitespace otherwise characters get chopped off the sides */
+ if ((((symbol->symbology == BARCODE_EANX) && (symbol->rows == 1)) || (symbol->symbology == BARCODE_EANX_CC))
+ || (symbol->symbology == BARCODE_ISBNX)) {
+ switch (ustrlen(local_text)) {
+ case 13: /* EAN 13 */
+ case 16:
+ case 19:
+ if (symbol->whitespace_width == 0) {
+ symbol->whitespace_width = 10;
+ }
+ main_width = 96 + comp_offset;
+ break;
+ default:
+ main_width = 68 + comp_offset;
+ }
+ }
+
+ if (((symbol->symbology == BARCODE_UPCA) && (symbol->rows == 1)) || (symbol->symbology == BARCODE_UPCA_CC)) {
+ if (symbol->whitespace_width == 0) {
+ symbol->whitespace_width = 10;
+ main_width = 96 + comp_offset;
+ }
+ }
+
+ if (((symbol->symbology == BARCODE_UPCE) && (symbol->rows == 1)) || (symbol->symbology == BARCODE_UPCE_CC)) {
+ if (symbol->whitespace_width == 0) {
+ symbol->whitespace_width = 10;
+ main_width = 51 + comp_offset;
+ }
+ }
+
+ latch = 0;
+ r = 0;
+ /* Isolate add-on text */
+ if (is_extendable(symbol->symbology)) {
+ for (i = 0; i < ustrlen(local_text); i++) {
+ if (latch == 1) {
+ addon[r] = local_text[i];
+ r++;
+ }
+ if (symbol->text[i] == '+') {
+ latch = 1;
+ }
+ }
+ }
+ addon[r] = '\0';
+
+ if (ustrlen(local_text) != 0) {
+ textoffset = 9;
+ } else {
+ textoffset = 0;
+ }
+
+ xoffset = symbol->border_width + symbol->whitespace_width;
+ yoffset = symbol->border_width;
+ image_width = 2 * (symbol->width + xoffset + xoffset);
+ image_height = 2 * (symbol->height + textoffset + yoffset + yoffset);
+
+ if (!(pixelbuf = (char *) malloc(image_width * image_height))) {
+ strcpy(symbol->errtxt, "658: Insufficient memory for pixel buffer");
+ return ZINT_ERROR_ENCODING_PROBLEM;
+ } else {
+ for (i = 0; i < (image_width * image_height); i++) {
+ *(pixelbuf + i) = '0';
+ }
+ }
+
+ if ((symbol->output_options & BARCODE_BOX) || (symbol->output_options & BARCODE_BIND)) {
+ default_text_posn = image_height - 17;
+ } else {
+ default_text_posn = image_height - 17 - symbol->border_width - symbol->border_width;
+ }
+
+ row_posn = textoffset + yoffset;
+ next_yposn = textoffset + yoffset;
+ row_height = 0;
+
+ /* Plot the body of the symbol to the pixel buffer */
+ for (r = 0; r < symbol->rows; r++) {
+ this_row = symbol->rows - r - 1; /* invert r otherwise plots upside down */
+ row_posn += row_height;
+ plot_yposn = next_yposn;
+ if (symbol->row_height[this_row] == 0) {
+ row_height = large_bar_height;
+ } else {
+ row_height = symbol->row_height[this_row];
+ }
+ next_yposn = (int) (row_posn + row_height);
+ plot_height = next_yposn - plot_yposn;
+
+ i = 0;
+ if (module_is_set(symbol, this_row, 0)) {
+ latch = 1;
+ } else {
+ latch = 0;
+ }
+
+ do {
+ block_width = 0;
+ do {
+ block_width++;
+ } while ((i + block_width < symbol->width )&& module_is_set(symbol, this_row, i + block_width) == module_is_set(symbol, this_row, i));
+ if ((addon_latch == 0) && (r == 0) && (i > main_width)) {
+ plot_height = (int) (row_height - 5.0);
+ plot_yposn = (int) (row_posn - 5.0);
+ addon_text_posn = row_posn + row_height - 8.0;
+ addon_latch = 1;
+ }
+ if (latch == 1) {
+ /* a bar */
+ draw_bar(pixelbuf, (i + xoffset) * 2, block_width * 2, plot_yposn * 2, plot_height * 2, image_width, image_height);
+ latch = 0;
+ } else {
+ /* a space */
+ latch = 1;
+ }
+ i += block_width;
+
+ } while (i < symbol->width);
+ }
+
+ xoffset += comp_offset;
+
+ if ((((symbol->symbology == BARCODE_EANX) && (symbol->rows == 1)) || (symbol->symbology == BARCODE_EANX_CC)) || (symbol->symbology == BARCODE_ISBNX)) {
+ /* guard bar extensions and text formatting for EAN8 and EAN13 */
+ switch (ustrlen(local_text)) {
+ case 8: /* EAN-8 */
+ case 11:
+ case 14:
+ draw_bar(pixelbuf, (0 + xoffset) * 2, 1 * 2, (4 + (int) yoffset) * 2, 5 * 2, image_width, image_height);
+ draw_bar(pixelbuf, (2 + xoffset) * 2, 1 * 2, (4 + (int) yoffset) * 2, 5 * 2, image_width, image_height);
+ draw_bar(pixelbuf, (32 + xoffset) * 2, 1 * 2, (4 + (int) yoffset) * 2, 5 * 2, image_width, image_height);
+ draw_bar(pixelbuf, (34 + xoffset) * 2, 1 * 2, (4 + (int) yoffset) * 2, 5 * 2, image_width, image_height);
+ draw_bar(pixelbuf, (64 + xoffset) * 2, 1 * 2, (4 + (int) yoffset) * 2, 5 * 2, image_width, image_height);
+ draw_bar(pixelbuf, (66 + xoffset) * 2, 1 * 2, (4 + (int) yoffset) * 2, 5 * 2, image_width, image_height);
+ for (i = 0; i < 4; i++) {
+ textpart[i] = local_text[i];
+ }
+ textpart[4] = '\0';
+ textpos = 2 * (17 + xoffset);
+
+ draw_string(pixelbuf, textpart, textpos, default_text_posn, textflags, image_width, image_height);
+ for (i = 0; i < 4; i++) {
+ textpart[i] = local_text[i + 4];
+ }
+ textpart[4] = '\0';
+ textpos = 2 * (50 + xoffset);
+ draw_string(pixelbuf, textpart, textpos, default_text_posn, textflags, image_width, image_height);
+ textdone = 1;
+ switch (strlen(addon)) {
+ case 2:
+ textpos = 2 * (xoffset + 86);
+ draw_string(pixelbuf, addon, textpos, image_height - (addon_text_posn * 2) - 13, textflags, image_width, image_height);
+ break;
+ case 5:
+ textpos = 2 * (xoffset + 100);
+ draw_string(pixelbuf, addon, textpos, image_height - (addon_text_posn * 2) - 13, textflags, image_width, image_height);
+ break;
+ }
+
+ break;
+ case 13: /* EAN 13 */
+ case 16:
+ case 19:
+ draw_bar(pixelbuf, (0 + xoffset) * 2, 1 * 2, (4 + (int) yoffset) * 2, 5 * 2, image_width, image_height);
+ draw_bar(pixelbuf, (2 + xoffset) * 2, 1 * 2, (4 + (int) yoffset) * 2, 5 * 2, image_width, image_height);
+ draw_bar(pixelbuf, (46 + xoffset) * 2, 1 * 2, (4 + (int) yoffset) * 2, 5 * 2, image_width, image_height);
+ draw_bar(pixelbuf, (48 + xoffset) * 2, 1 * 2, (4 + (int) yoffset) * 2, 5 * 2, image_width, image_height);
+ draw_bar(pixelbuf, (92 + xoffset) * 2, 1 * 2, (4 + (int) yoffset) * 2, 5 * 2, image_width, image_height);
+ draw_bar(pixelbuf, (94 + xoffset) * 2, 1 * 2, (4 + (int) yoffset) * 2, 5 * 2, image_width, image_height);
+
+ textpart[0] = local_text[0];
+ textpart[1] = '\0';
+ textpos = 2 * (-7 + xoffset);
+ draw_string(pixelbuf, textpart, textpos, default_text_posn, textflags, image_width, image_height);
+ for (i = 0; i < 6; i++) {
+ textpart[i] = local_text[i + 1];
+ }
+ textpart[6] = '\0';
+ textpos = 2 * (24 + xoffset);
+ draw_string(pixelbuf, textpart, textpos, default_text_posn, textflags, image_width, image_height);
+ for (i = 0; i < 6; i++) {
+ textpart[i] = local_text[i + 7];
+ }
+ textpart[6] = '\0';
+ textpos = 2 * (71 + xoffset);
+ draw_string(pixelbuf, textpart, textpos, default_text_posn, textflags, image_width, image_height);
+ textdone = 1;
+ switch (strlen(addon)) {
+ case 2:
+ textpos = 2 * (xoffset + 114);
+ draw_string(pixelbuf, addon, textpos, image_height - (addon_text_posn * 2) - 13, textflags, image_width, image_height);
+ break;
+ case 5:
+ textpos = 2 * (xoffset + 128);
+ draw_string(pixelbuf, addon, textpos, image_height - (addon_text_posn * 2) - 13, textflags, image_width, image_height);
+ break;
+ }
+ break;
+
+ }
+ }
+
+ if (((symbol->symbology == BARCODE_UPCA) && (symbol->rows == 1)) || (symbol->symbology == BARCODE_UPCA_CC)) {
+ /* guard bar extensions and text formatting for UPCA */
+ latch = 1;
+
+ i = 0 + comp_offset;
+ do {
+ block_width = 0;
+ do {
+ block_width++;
+ } while (module_is_set(symbol, symbol->rows - 1, i + block_width) == module_is_set(symbol, symbol->rows - 1, i));
+ if (latch == 1) {
+ /* a bar */
+ draw_bar(pixelbuf, (i + xoffset - comp_offset) * 2, block_width * 2, (4 + (int) yoffset) * 2, 5 * 2, image_width, image_height);
+ latch = 0;
+ } else {
+ /* a space */
+ latch = 1;
+ }
+ i += block_width;
+ } while (i < 11 + comp_offset);
+ draw_bar(pixelbuf, (46 + xoffset) * 2, 1 * 2, (4 + (int) yoffset) * 2, 5 * 2, image_width, image_height);
+ draw_bar(pixelbuf, (48 + xoffset) * 2, 1 * 2, (4 + (int) yoffset) * 2, 5 * 2, image_width, image_height);
+ latch = 1;
+ i = 85 + comp_offset;
+ do {
+ block_width = 0;
+ do {
+ block_width++;
+ } while (module_is_set(symbol, symbol->rows - 1, i + block_width) == module_is_set(symbol, symbol->rows - 1, i));
+ if (latch == 1) {
+ /* a bar */
+ draw_bar(pixelbuf, (i + xoffset - comp_offset) * 2, block_width * 2, (4 + (int) yoffset) * 2, 5 * 2, image_width, image_height);
+ latch = 0;
+ } else {
+ /* a space */
+ latch = 1;
+ }
+ i += block_width;
+ } while (i < 96 + comp_offset);
+ textpart[0] = local_text[0];
+ textpart[1] = '\0';
+ textpos = 2 * (-5 + xoffset);
+ draw_string(pixelbuf, textpart, textpos, default_text_posn, textflags, image_width, image_height);
+ for (i = 0; i < 5; i++) {
+ textpart[i] = local_text[i + 1];
+ }
+ textpart[5] = '\0';
+ textpos = 2 * (27 + xoffset);
+ draw_string(pixelbuf, textpart, textpos, default_text_posn, textflags, image_width, image_height);
+ for (i = 0; i < 5; i++) {
+ textpart[i] = local_text[i + 6];
+ }
+ textpart[6] = '\0';
+ textpos = 2 * (68 + xoffset);
+ draw_string(pixelbuf, textpart, textpos, default_text_posn, textflags, image_width, image_height);
+ textpart[0] = local_text[11];
+ textpart[1] = '\0';
+ textpos = 2 * (100 + xoffset);
+ draw_string(pixelbuf, textpart, textpos, default_text_posn, textflags, image_width, image_height);
+ textdone = 1;
+ switch (strlen(addon)) {
+ case 2:
+ textpos = 2 * (xoffset + 116);
+ draw_string(pixelbuf, addon, textpos, image_height - (addon_text_posn * 2) - 13, textflags, image_width, image_height);
+ break;
+ case 5:
+ textpos = 2 * (xoffset + 130);
+ draw_string(pixelbuf, addon, textpos, image_height - (addon_text_posn * 2) - 13, textflags, image_width, image_height);
+ break;
+ }
+
+ }
+
+ if (((symbol->symbology == BARCODE_UPCE) && (symbol->rows == 1)) || (symbol->symbology == BARCODE_UPCE_CC)) {
+ /* guard bar extensions and text formatting for UPCE */
+ draw_bar(pixelbuf, (0 + xoffset) * 2, 1 * 2, (4 + (int) yoffset) * 2, 5 * 2, image_width, image_height);
+ draw_bar(pixelbuf, (2 + xoffset) * 2, 1 * 2, (4 + (int) yoffset) * 2, 5 * 2, image_width, image_height);
+ draw_bar(pixelbuf, (46 + xoffset) * 2, 1 * 2, (4 + (int) yoffset) * 2, 5 * 2, image_width, image_height);
+ draw_bar(pixelbuf, (48 + xoffset) * 2, 1 * 2, (4 + (int) yoffset) * 2, 5 * 2, image_width, image_height);
+ draw_bar(pixelbuf, (50 + xoffset) * 2, 1 * 2, (4 + (int) yoffset) * 2, 5 * 2, image_width, image_height);
+
+ textpart[0] = local_text[0];
+ textpart[1] = '\0';
+ textpos = 2 * (-5 + xoffset);
+ draw_string(pixelbuf, textpart, textpos, default_text_posn, textflags, image_width, image_height);
+ for (i = 0; i < 6; i++) {
+ textpart[i] = local_text[i + 1];
+ }
+ textpart[6] = '\0';
+ textpos = 2 * (24 + xoffset);
+ draw_string(pixelbuf, textpart, textpos, default_text_posn, textflags, image_width, image_height);
+ textpart[0] = local_text[7];
+ textpart[1] = '\0';
+ textpos = 2 * (55 + xoffset);
+ draw_string(pixelbuf, textpart, textpos, default_text_posn, textflags, image_width, image_height);
+ textdone = 1;
+ switch (strlen(addon)) {
+ case 2:
+ textpos = 2 * (xoffset + 70);
+ draw_string(pixelbuf, addon, textpos, image_height - (addon_text_posn * 2) - 13, textflags, image_width, image_height);
+ break;
+ case 5:
+ textpos = 2 * (xoffset + 84);
+ draw_string(pixelbuf, addon, textpos, image_height - (addon_text_posn * 2) - 13, textflags, image_width, image_height);
+ break;
+ }
+
+ }
+
+ xoffset -= comp_offset;
+
+ /* Put boundary bars or box around symbol */
+ if ((symbol->output_options & BARCODE_BOX) || (symbol->output_options & BARCODE_BIND)) {
+ /* boundary bars */
+ if (symbol->symbology != BARCODE_CODABLOCKF) {
+ draw_bar(pixelbuf, 0, (symbol->width + xoffset + xoffset) * 2, textoffset * 2, symbol->border_width * 2, image_width, image_height);
+ draw_bar(pixelbuf, 0, (symbol->width + xoffset + xoffset) * 2, (textoffset + symbol->height + symbol->border_width) * 2, symbol->border_width * 2, image_width, image_height);
+ } else {
+ draw_bar(pixelbuf, xoffset * 2, symbol->width * 2, textoffset * 2, symbol->border_width * 2, image_width, image_height);
+ draw_bar(pixelbuf, xoffset * 2, symbol->width * 2, (textoffset + symbol->height + symbol->border_width) * 2, symbol->border_width * 2, image_width, image_height);
+ }
+ if ((symbol->output_options & BARCODE_BIND) != 0) {
+ if ((symbol->rows > 1) && (is_stackable(symbol->symbology) == 1)) {
+ /* row binding */
+ if (symbol->symbology != BARCODE_CODABLOCKF) {
+ for (r = 1; r < symbol->rows; r++) {
+ draw_bar(pixelbuf, xoffset * 2, symbol->width * 2, ((r * row_height) + textoffset + yoffset - 1) * 2, 2 * 2, image_width, image_height);
+ }
+ } else {
+ for (r = 1; r < symbol->rows; r++) {
+ draw_bar(pixelbuf, (xoffset + 11) * 2 , (symbol->width - 25) * 2, ((r * row_height) + textoffset + yoffset - 1) * 2, 2 * 2, image_width, image_height);
+ }
+ }
+ }
+ }
+ }
+
+ if (symbol->output_options & BARCODE_BOX) {
+ /* side bars */
+ draw_bar(pixelbuf, 0, symbol->border_width * 2, textoffset * 2, (symbol->height + (2 * symbol->border_width)) * 2, image_width, image_height);
+ draw_bar(pixelbuf, (symbol->width + xoffset + xoffset - symbol->border_width) * 2, symbol->border_width * 2, textoffset * 2, (symbol->height + (2 * symbol->border_width)) * 2, image_width, image_height);
+ }
+
+ /* Put the human readable text at the bottom */
+ if ((textdone == 0) && (ustrlen(local_text) != 0)) {
+ textpos = (image_width / 2);
+ draw_string(pixelbuf, (char*) local_text, textpos, default_text_posn, textflags, image_width, image_height);
+ }
+
+
+ if (scaler == 0) {
+ scaler = 0.5;
+ }
+ scale_width = image_width * scaler;
+ scale_height = image_height * scaler;
+
+ /* Apply scale options by creating another pixel buffer */
+ if (!(scaled_pixelbuf = (char *) malloc(scale_width * scale_height))) {
+ free(pixelbuf);
+ strcpy(symbol->errtxt, "659: Insufficient memory for pixel buffer");
+ return ZINT_ERROR_ENCODING_PROBLEM;
+ } else {
+ for (i = 0; i < (scale_width * scale_height); i++) {
+ *(scaled_pixelbuf + i) = '0';
+ }
+ }
+
+ for (vert = 0; vert < scale_height; vert++) {
+ for (horiz = 0; horiz < scale_width; horiz++) {
+ *(scaled_pixelbuf + (vert * scale_width) + horiz) = *(pixelbuf + ((int) (vert / scaler) * image_width) + (int) (horiz / scaler));
+ }
+ }
+
+ error_number = save_raster_image_to_file(symbol, scale_height, scale_width, scaled_pixelbuf, rotate_angle, data_type);
+ free(scaled_pixelbuf);
+ free(pixelbuf);
+ return error_number;
+}
+
+int plot_raster(struct zint_symbol *symbol, int rotate_angle, int file_type) {
+ int error;
+
+#ifdef NO_PNG
+ if (file_type == OUT_PNG_FILE) {
+ return ZINT_ERROR_INVALID_OPTION;
+ }
+#endif /* NO_PNG */
+
+ if (symbol->output_options & BARCODE_DOTTY_MODE) {
+ error = plot_raster_dotty(symbol, rotate_angle, file_type);
+ } else {
+ if (symbol->symbology == BARCODE_MAXICODE) {
+ error = plot_raster_maxicode(symbol, rotate_angle, file_type);
+ } else {
+ error = plot_raster_default(symbol, rotate_angle, file_type);
+ }
+ }
+
+ return error;
+}
diff --git a/3rdparty/zint-2.6.1/backend/reedsol.c b/3rdparty/zint-2.6.1/backend/reedsol.c
new file mode 100644
index 0000000..affe150
--- /dev/null
+++ b/3rdparty/zint-2.6.1/backend/reedsol.c
@@ -0,0 +1,164 @@
+/**
+
+ This is a simple Reed-Solomon encoder
+ (C) Cliff Hones 2004
+
+ Redistribution and use in source and binary forms, with or without
+ modification, are permitted provided that the following conditions
+ are met:
+
+ 1. Redistributions of source code must retain the above copyright
+ notice, this list of conditions and the following disclaimer.
+ 2. Redistributions in binary form must reproduce the above copyright
+ notice, this list of conditions and the following disclaimer in the
+ documentation and/or other materials provided with the distribution.
+ 3. Neither the name of the project nor the names of its contributors
+ may be used to endorse or promote products derived from this software
+ without specific prior written permission.
+
+ THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND
+ ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+ ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE
+ FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+ DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
+ OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
+ HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
+ LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
+ OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+ SUCH DAMAGE.
+ */
+
+// It is not written with high efficiency in mind, so is probably
+// not suitable for real-time encoding. The aim was to keep it
+// simple, general and clear.
+//
+//
+
+// Usage:
+// First call rs_init_gf(poly) to set up the Galois Field parameters.
+// Then call rs_init_code(size, index) to set the encoding size
+// Then call rs_encode(datasize, data, out) to encode the data.
+//
+// These can be called repeatedly as required - but note that
+// rs_init_code must be called following any rs_init_gf call.
+//
+// If the parameters are fixed, some of the statics below can be
+// replaced with constants in the obvious way, and additionally
+// malloc/free can be avoided by using static arrays of a suitable
+// size.
+
+#include // only needed for debug (main)
+#include // only needed for malloc/free
+#include "reedsol.h"
+static int logmod; // 2**symsize - 1
+static int rlen;
+
+static int *logt = NULL, *alog = NULL, *rspoly = NULL;
+
+// rs_init_gf(poly) initialises the parameters for the Galois Field.
+// The symbol size is determined from the highest bit set in poly
+// This implementation will support sizes up to 30 bits (though that
+// will result in very large log/antilog tables) - bit sizes of
+// 8 or 4 are typical
+//
+// The poly is the bit pattern representing the GF characteristic
+// polynomial. e.g. for ECC200 (8-bit symbols) the polynomial is
+// a**8 + a**5 + a**3 + a**2 + 1, which translates to 0x12d.
+
+void rs_init_gf(const int poly) {
+ int m, b, p, v;
+
+ // Find the top bit, and hence the symbol size
+ for (b = 1, m = 0; b <= poly; b <<= 1)
+ m++;
+ b >>= 1;
+ m--;
+
+ // Calculate the log/alog tables
+ logmod = (1 << m) - 1;
+ logt = (int *) malloc(sizeof (int) * (logmod + 1));
+ alog = (int *) malloc(sizeof (int) * logmod);
+
+ for (p = 1, v = 0; v < logmod; v++) {
+ alog[v] = p;
+ logt[p] = v;
+ p <<= 1;
+ if (p & b)
+ p ^= poly;
+ }
+}
+
+// rs_init_code(nsym, index) initialises the Reed-Solomon encoder
+// nsym is the number of symbols to be generated (to be appended
+// to the input data). index is usually 1 - it is the index of
+// the constant in the first term (i) of the RS generator polynomial:
+// (x + 2**i)*(x + 2**(i+1))*... [nsym terms]
+// For ECC200, index is 1.
+
+void rs_init_code(const int nsym, int index) {
+ int i, k;
+
+ rspoly = (int *) malloc(sizeof (int) * (nsym + 1));
+
+ rlen = nsym;
+
+ rspoly[0] = 1;
+ for (i = 1; i <= nsym; i++) {
+ rspoly[i] = 1;
+ for (k = i - 1; k > 0; k--) {
+ if (rspoly[k])
+ rspoly[k] = alog[(logt[rspoly[k]] + index) % logmod];
+ rspoly[k] ^= rspoly[k - 1];
+ }
+ rspoly[0] = alog[(logt[rspoly[0]] + index) % logmod];
+ index++;
+ }
+}
+
+void rs_encode(const size_t len,const unsigned char *data, unsigned char *res) {
+ int i, k, m;
+ for (i = 0; i < rlen; i++)
+ res[i] = 0;
+ for (i = 0; i < len; i++) {
+ m = res[rlen - 1] ^ data[i];
+ for (k = rlen - 1; k > 0; k--) {
+ if (m && rspoly[k])
+ res[k] = (unsigned char) (res[k - 1] ^ alog[(logt[m] + logt[rspoly[k]]) % logmod]);
+ else
+ res[k] = res[k - 1];
+ }
+ if (m && rspoly[0])
+ res[0] = (unsigned char) (alog[(logt[m] + logt[rspoly[0]]) % logmod]);
+ else
+ res[0] = 0;
+ }
+}
+
+/* The same as above but for larger bitlengths - Aztec code compatible */
+void rs_encode_long(const int len, const unsigned int *data, unsigned int *res) {
+ int i, k, m;
+ for (i = 0; i < rlen; i++)
+ res[i] = 0;
+ for (i = 0; i < len; i++) {
+ m = res[rlen - 1] ^ data[i];
+ for (k = rlen - 1; k > 0; k--) {
+ if (m && rspoly[k])
+ res[k] = res[k - 1] ^ alog[(logt[m] + logt[rspoly[k]]) % logmod];
+ else
+ res[k] = res[k - 1];
+ }
+ if (m && rspoly[0])
+ res[0] = alog[(logt[m] + logt[rspoly[0]]) % logmod];
+ else
+ res[0] = 0;
+ }
+}
+
+/* Free memory */
+void rs_free(void) {
+ free(logt);
+ free(alog);
+ free(rspoly);
+ rspoly = NULL;
+}
diff --git a/3rdparty/zint-2.6.1/backend/reedsol.h b/3rdparty/zint-2.6.1/backend/reedsol.h
new file mode 100644
index 0000000..24e336e
--- /dev/null
+++ b/3rdparty/zint-2.6.1/backend/reedsol.h
@@ -0,0 +1,50 @@
+/*
+
+ This is a simple Reed-Solomon encoder
+ (C) Cliff Hones 2004
+
+ Redistribution and use in source and binary forms, with or without
+ modification, are permitted provided that the following conditions
+ are met:
+
+ 1. Redistributions of source code must retain the above copyright
+ notice, this list of conditions and the following disclaimer.
+ 2. Redistributions in binary form must reproduce the above copyright
+ notice, this list of conditions and the following disclaimer in the
+ documentation and/or other materials provided with the distribution.
+ 3. Neither the name of the project nor the names of its contributors
+ may be used to endorse or promote products derived from this software
+ without specific prior written permission.
+
+ THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND
+ ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+ ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE
+ FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+ DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
+ OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
+ HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
+ LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
+ OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+ SUCH DAMAGE.
+
+ */
+
+#ifndef __REEDSOL_H
+#define __REEDSOL_H
+
+#ifdef __cplusplus
+extern "C" {
+#endif /* __cplusplus */
+
+extern void rs_init_gf(const int poly);
+extern void rs_init_code(const int nsym,int index);
+extern void rs_encode(const size_t len,const unsigned char *data, unsigned char *res);
+extern void rs_encode_long(const int len,const unsigned int *data, unsigned int *res);
+ extern void rs_free(void);
+
+#ifdef __cplusplus
+}
+#endif /* __cplusplus */
+
+#endif /* __REEDSOL_H */
diff --git a/3rdparty/zint-2.6.1/backend/render.c b/3rdparty/zint-2.6.1/backend/render.c
new file mode 100644
index 0000000..9f56b2a
--- /dev/null
+++ b/3rdparty/zint-2.6.1/backend/render.c
@@ -0,0 +1,778 @@
+/*
+ * render.c - Generic Rendered Format
+ *
+ * Initiall written by Sam Lown for use in gLabels. Converts encoded
+ * data into a generic internal structure of lines and characters
+ * usable in external applications.
+ */
+
+/*
+ libzint - the open source barcode library
+ Copyright (C) 2009-2017 Robin Stuart
+
+ Redistribution and use in source and binary forms, with or without
+ modification, are permitted provided that the following conditions
+ are met:
+
+ 1. Redistributions of source code must retain the above copyright
+ notice, this list of conditions and the following disclaimer.
+ 2. Redistributions in binary form must reproduce the above copyright
+ notice, this list of conditions and the following disclaimer in the
+ documentation and/or other materials provided with the distribution.
+ 3. Neither the name of the project nor the names of its contributors
+ may be used to endorse or promote products derived from this software
+ without specific prior written permission.
+
+ THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND
+ ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+ ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE
+ FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+ DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
+ OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
+ HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
+ LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
+ OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+ SUCH DAMAGE.
+ */
+
+#include
+#include