diff --git a/AUTHORS b/AUTHORS new file mode 100644 index 0000000000000000000000000000000000000000..e69de29bb2d1d6434b8b29ae775ad8c2e48c5391 diff --git a/COPYING b/COPYING new file mode 100644 index 0000000000000000000000000000000000000000..94a9ed024d3859793618152ea559a168bbcbb5e2 --- /dev/null +++ b/COPYING @@ -0,0 +1,674 @@ + GNU GENERAL PUBLIC LICENSE + Version 3, 29 June 2007 + + Copyright (C) 2007 Free Software Foundation, Inc. <http://fsf.org/> + 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. + + <one line to give the program's name and a brief idea of what it does.> + Copyright (C) <year> <name of author> + + This program is free software: you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation, either version 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 <http://www.gnu.org/licenses/>. + +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: + + <program> Copyright (C) <year> <name of author> + 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 +<http://www.gnu.org/licenses/>. + + 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 +<http://www.gnu.org/philosophy/why-not-lgpl.html>. diff --git a/ChangeLog b/ChangeLog new file mode 100644 index 0000000000000000000000000000000000000000..e69de29bb2d1d6434b8b29ae775ad8c2e48c5391 diff --git a/INSTALL b/INSTALL new file mode 100644 index 0000000000000000000000000000000000000000..007e9396d0a2492cd2d6e17d42f359655dfe0b5e --- /dev/null +++ b/INSTALL @@ -0,0 +1,370 @@ +Installation Instructions +************************* + +Copyright (C) 1994-1996, 1999-2002, 2004-2013 Free Software Foundation, +Inc. + + Copying and distribution of this file, with or without modification, +are permitted in any medium without royalty provided the copyright +notice and this notice are preserved. This file is offered as-is, +without warranty of any kind. + +Basic Installation +================== + + Briefly, the shell commands `./configure; make; make install' should +configure, build, and install this package. The following +more-detailed instructions are generic; see the `README' file for +instructions specific to this package. Some packages provide this +`INSTALL' file but do not implement all of the features documented +below. The lack of an optional feature in a given package is not +necessarily a bug. More recommendations for GNU packages can be found +in *note Makefile Conventions: (standards)Makefile Conventions. + + The `configure' shell script attempts to guess correct values for +various system-dependent variables used during compilation. It uses +those values to create a `Makefile' in each directory of the package. +It may also create one or more `.h' files containing system-dependent +definitions. Finally, it creates a shell script `config.status' that +you can run in the future to recreate the current configuration, and a +file `config.log' containing compiler output (useful mainly for +debugging `configure'). + + It can also use an optional file (typically called `config.cache' +and enabled with `--cache-file=config.cache' or simply `-C') that saves +the results of its tests to speed up reconfiguring. Caching is +disabled by default to prevent problems with accidental use of stale +cache files. + + If you need to do unusual things to compile the package, please try +to figure out how `configure' could check whether to do them, and mail +diffs or instructions to the address given in the `README' so they can +be considered for the next release. If you are using the cache, and at +some point `config.cache' contains results you don't want to keep, you +may remove or edit it. + + The file `configure.ac' (or `configure.in') is used to create +`configure' by a program called `autoconf'. You need `configure.ac' if +you want to change it or regenerate `configure' using a newer version +of `autoconf'. + + The simplest way to compile this package is: + + 1. `cd' to the directory containing the package's source code and type + `./configure' to configure the package for your system. + + Running `configure' might take a while. While running, it prints + some messages telling which features it is checking for. + + 2. Type `make' to compile the package. + + 3. Optionally, type `make check' to run any self-tests that come with + the package, generally using the just-built uninstalled binaries. + + 4. Type `make install' to install the programs and any data files and + documentation. When installing into a prefix owned by root, it is + recommended that the package be configured and built as a regular + user, and only the `make install' phase executed with root + privileges. + + 5. Optionally, type `make installcheck' to repeat any self-tests, but + this time using the binaries in their final installed location. + This target does not install anything. Running this target as a + regular user, particularly if the prior `make install' required + root privileges, verifies that the installation completed + correctly. + + 6. You can remove the program binaries and object files from the + source code directory by typing `make clean'. To also remove the + files that `configure' created (so you can compile the package for + a different kind of computer), type `make distclean'. There is + also a `make maintainer-clean' target, but that is intended mainly + for the package's developers. If you use it, you may have to get + all sorts of other programs in order to regenerate files that came + with the distribution. + + 7. Often, you can also type `make uninstall' to remove the installed + files again. In practice, not all packages have tested that + uninstallation works correctly, even though it is required by the + GNU Coding Standards. + + 8. Some packages, particularly those that use Automake, provide `make + distcheck', which can by used by developers to test that all other + targets like `make install' and `make uninstall' work correctly. + This target is generally not run by end users. + +Compilers and Options +===================== + + Some systems require unusual options for compilation or linking that +the `configure' script does not know about. Run `./configure --help' +for details on some of the pertinent environment variables. + + You can give `configure' initial values for configuration parameters +by setting variables in the command line or in the environment. Here +is an example: + + ./configure CC=c99 CFLAGS=-g LIBS=-lposix + + *Note Defining Variables::, for more details. + +Compiling For Multiple Architectures +==================================== + + You can compile the package for more than one kind of computer at the +same time, by placing the object files for each architecture in their +own directory. To do this, you can use GNU `make'. `cd' to the +directory where you want the object files and executables to go and run +the `configure' script. `configure' automatically checks for the +source code in the directory that `configure' is in and in `..'. This +is known as a "VPATH" build. + + With a non-GNU `make', it is safer to compile the package for one +architecture at a time in the source code directory. After you have +installed the package for one architecture, use `make distclean' before +reconfiguring for another architecture. + + On MacOS X 10.5 and later systems, you can create libraries and +executables that work on multiple system types--known as "fat" or +"universal" binaries--by specifying multiple `-arch' options to the +compiler but only a single `-arch' option to the preprocessor. Like +this: + + ./configure CC="gcc -arch i386 -arch x86_64 -arch ppc -arch ppc64" \ + CXX="g++ -arch i386 -arch x86_64 -arch ppc -arch ppc64" \ + CPP="gcc -E" CXXCPP="g++ -E" + + This is not guaranteed to produce working output in all cases, you +may have to build one architecture at a time and combine the results +using the `lipo' tool if you have problems. + +Installation Names +================== + + By default, `make install' installs the package's commands under +`/usr/local/bin', include files under `/usr/local/include', etc. You +can specify an installation prefix other than `/usr/local' by giving +`configure' the option `--prefix=PREFIX', where PREFIX must be an +absolute file name. + + You can specify separate installation prefixes for +architecture-specific files and architecture-independent files. If you +pass the option `--exec-prefix=PREFIX' to `configure', the package uses +PREFIX as the prefix for installing programs and libraries. +Documentation and other data files still use the regular prefix. + + In addition, if you use an unusual directory layout you can give +options like `--bindir=DIR' to specify different values for particular +kinds of files. Run `configure --help' for a list of the directories +you can set and what kinds of files go in them. In general, the +default for these options is expressed in terms of `${prefix}', so that +specifying just `--prefix' will affect all of the other directory +specifications that were not explicitly provided. + + The most portable way to affect installation locations is to pass the +correct locations to `configure'; however, many packages provide one or +both of the following shortcuts of passing variable assignments to the +`make install' command line to change installation locations without +having to reconfigure or recompile. + + The first method involves providing an override variable for each +affected directory. For example, `make install +prefix=/alternate/directory' will choose an alternate location for all +directory configuration variables that were expressed in terms of +`${prefix}'. Any directories that were specified during `configure', +but not in terms of `${prefix}', must each be overridden at install +time for the entire installation to be relocated. The approach of +makefile variable overrides for each directory variable is required by +the GNU Coding Standards, and ideally causes no recompilation. +However, some platforms have known limitations with the semantics of +shared libraries that end up requiring recompilation when using this +method, particularly noticeable in packages that use GNU Libtool. + + The second method involves providing the `DESTDIR' variable. For +example, `make install DESTDIR=/alternate/directory' will prepend +`/alternate/directory' before all installation names. The approach of +`DESTDIR' overrides is not required by the GNU Coding Standards, and +does not work on platforms that have drive letters. On the other hand, +it does better at avoiding recompilation issues, and works well even +when some directory options were not specified in terms of `${prefix}' +at `configure' time. + +Optional Features +================= + + If the package supports it, you can cause programs to be installed +with an extra prefix or suffix on their names by giving `configure' the +option `--program-prefix=PREFIX' or `--program-suffix=SUFFIX'. + + Some packages pay attention to `--enable-FEATURE' options to +`configure', where FEATURE indicates an optional part of the package. +They may also pay attention to `--with-PACKAGE' options, where PACKAGE +is something like `gnu-as' or `x' (for the X Window System). The +`README' should mention any `--enable-' and `--with-' options that the +package recognizes. + + For packages that use the X Window System, `configure' can usually +find the X include and library files automatically, but if it doesn't, +you can use the `configure' options `--x-includes=DIR' and +`--x-libraries=DIR' to specify their locations. + + Some packages offer the ability to configure how verbose the +execution of `make' will be. For these packages, running `./configure +--enable-silent-rules' sets the default to minimal output, which can be +overridden with `make V=1'; while running `./configure +--disable-silent-rules' sets the default to verbose, which can be +overridden with `make V=0'. + +Particular systems +================== + + On HP-UX, the default C compiler is not ANSI C compatible. If GNU +CC is not installed, it is recommended to use the following options in +order to use an ANSI C compiler: + + ./configure CC="cc -Ae -D_XOPEN_SOURCE=500" + +and if that doesn't work, install pre-built binaries of GCC for HP-UX. + + HP-UX `make' updates targets which have the same time stamps as +their prerequisites, which makes it generally unusable when shipped +generated files such as `configure' are involved. Use GNU `make' +instead. + + On OSF/1 a.k.a. Tru64, some versions of the default C compiler cannot +parse its `<wchar.h>' header file. The option `-nodtk' can be used as +a workaround. If GNU CC is not installed, it is therefore recommended +to try + + ./configure CC="cc" + +and if that doesn't work, try + + ./configure CC="cc -nodtk" + + On Solaris, don't put `/usr/ucb' early in your `PATH'. This +directory contains several dysfunctional programs; working variants of +these programs are available in `/usr/bin'. So, if you need `/usr/ucb' +in your `PATH', put it _after_ `/usr/bin'. + + On Haiku, software installed for all users goes in `/boot/common', +not `/usr/local'. It is recommended to use the following options: + + ./configure --prefix=/boot/common + +Specifying the System Type +========================== + + There may be some features `configure' cannot figure out +automatically, but needs to determine by the type of machine the package +will run on. Usually, assuming the package is built to be run on the +_same_ architectures, `configure' can figure that out, but if it prints +a message saying it cannot guess the machine type, give it the +`--build=TYPE' option. TYPE can either be a short name for the system +type, such as `sun4', or a canonical name which has the form: + + CPU-COMPANY-SYSTEM + +where SYSTEM can have one of these forms: + + OS + KERNEL-OS + + See the file `config.sub' for the possible values of each field. If +`config.sub' isn't included in this package, then this package doesn't +need to know the machine type. + + If you are _building_ compiler tools for cross-compiling, you should +use the option `--target=TYPE' to select the type of system they will +produce code for. + + If you want to _use_ a cross compiler, that generates code for a +platform different from the build platform, you should specify the +"host" platform (i.e., that on which the generated programs will +eventually be run) with `--host=TYPE'. + +Sharing Defaults +================ + + If you want to set default values for `configure' scripts to share, +you can create a site shell script called `config.site' that gives +default values for variables like `CC', `cache_file', and `prefix'. +`configure' looks for `PREFIX/share/config.site' if it exists, then +`PREFIX/etc/config.site' if it exists. Or, you can set the +`CONFIG_SITE' environment variable to the location of the site script. +A warning: not all `configure' scripts look for a site script. + +Defining Variables +================== + + Variables not defined in a site shell script can be set in the +environment passed to `configure'. However, some packages may run +configure again during the build, and the customized values of these +variables may be lost. In order to avoid this problem, you should set +them in the `configure' command line, using `VAR=value'. For example: + + ./configure CC=/usr/local2/bin/gcc + +causes the specified `gcc' to be used as the C compiler (unless it is +overridden in the site shell script). + +Unfortunately, this technique does not work for `CONFIG_SHELL' due to +an Autoconf limitation. Until the limitation is lifted, you can use +this workaround: + + CONFIG_SHELL=/bin/bash ./configure CONFIG_SHELL=/bin/bash + +`configure' Invocation +====================== + + `configure' recognizes the following options to control how it +operates. + +`--help' +`-h' + Print a summary of all of the options to `configure', and exit. + +`--help=short' +`--help=recursive' + Print a summary of the options unique to this package's + `configure', and exit. The `short' variant lists options used + only in the top level, while the `recursive' variant lists options + also present in any nested packages. + +`--version' +`-V' + Print the version of Autoconf used to generate the `configure' + script, and exit. + +`--cache-file=FILE' + Enable the cache: use and save the results of the tests in FILE, + traditionally `config.cache'. FILE defaults to `/dev/null' to + disable caching. + +`--config-cache' +`-C' + Alias for `--cache-file=config.cache'. + +`--quiet' +`--silent' +`-q' + Do not print messages saying which checks are being made. To + suppress all normal output, redirect it to `/dev/null' (any error + messages will still be shown). + +`--srcdir=DIR' + Look for the package's source code in directory DIR. Usually + `configure' can determine that directory automatically. + +`--prefix=DIR' + Use DIR as the installation prefix. *note Installation Names:: + for more details, including other options available for fine-tuning + the installation locations. + +`--no-create' +`-n' + Run the configure checks, but stop before creating any output + files. + +`configure' also accepts some other, not widely useful, options. Run +`configure --help' for more details. diff --git a/Makefile.am b/Makefile.am new file mode 100644 index 0000000000000000000000000000000000000000..0182df297514233d3b89aa4a0b660f2b57113018 --- /dev/null +++ b/Makefile.am @@ -0,0 +1,2 @@ +SUBDIRS = src +ACLOCAL_AMFLAGS = -I m4 diff --git a/NEWS b/NEWS new file mode 100644 index 0000000000000000000000000000000000000000..e69de29bb2d1d6434b8b29ae775ad8c2e48c5391 diff --git a/README b/README new file mode 100644 index 0000000000000000000000000000000000000000..e69de29bb2d1d6434b8b29ae775ad8c2e48c5391 diff --git a/configure.ac b/configure.ac new file mode 100644 index 0000000000000000000000000000000000000000..060debc01f6f5129f739333083c7d1ed47a3dbcf --- /dev/null +++ b/configure.ac @@ -0,0 +1,44 @@ +# -*- Autoconf -*- +# Process this file with autoconf to produce a configure script. + +AC_PREREQ([2.69]) +AC_INIT([aribb24], [0.0.1], [nkoriyama@gmail.com]) +AM_INIT_AUTOMAKE +AC_CONFIG_SRCDIR([config.h.in]) +AC_CONFIG_HEADERS([config.h]) +AC_CONFIG_MACRO_DIR([m4]) + +# Checks for programs. +AC_PROG_CXX +AC_PROG_AWK +AC_PROG_CC +AC_PROG_CC_STDC +AC_PROG_CPP +AC_PROG_INSTALL +AC_PROG_LN_S +AC_PROG_MAKE_SET +AC_PROG_LIBTOOL + +# Checks for libraries. + +# Checks for header files. +AC_CHECK_HEADERS([inttypes.h stddef.h stdint.h stdlib.h string.h]) + +# Checks for typedefs, structures, and compiler characteristics. +AC_CHECK_HEADER_STDBOOL +AC_C_INLINE +AC_TYPE_INT16_T +AC_TYPE_INT8_T +AC_TYPE_SIZE_T +AC_TYPE_SSIZE_T +AC_TYPE_UINT16_T +AC_TYPE_UINT32_T +AC_TYPE_UINT64_T +AC_TYPE_UINT8_T + +# Checks for library functions. +AC_CHECK_FUNCS([memset mkdir sqrt strchr strdup strstr strtoul]) + +AC_CONFIG_FILES([Makefile + src/Makefile]) +AC_OUTPUT diff --git a/src/Makefile.am b/src/Makefile.am new file mode 100644 index 0000000000000000000000000000000000000000..1aaa07fe4b0abad84c96fb79c64c2bb7d83558c0 --- /dev/null +++ b/src/Makefile.am @@ -0,0 +1,5 @@ +lib_LTLIBRARIES = libaribb24.la +libaribb24_la_SOURCES = decoder.c parser.c md5.c +libaribb24_la_LIBADD = -lpng +pkginclude_HEADERS = aribb24/decoder.h aribb24/parser.h aribb24/bits.h + diff --git a/src/aribb24/bits.h b/src/aribb24/bits.h new file mode 100644 index 0000000000000000000000000000000000000000..80010dec5f598368ac60b2ceaab6f32ed7a855b0 --- /dev/null +++ b/src/aribb24/bits.h @@ -0,0 +1,197 @@ +/***************************************************************************** + * vlc_bits.h : Bit handling helpers + ***************************************************************************** + * Copyright (C) 2003 VLC authors and VideoLAN + * $Id: 6c2915138c768d9c49b6646dde6c711acf6eabef $ + * + * Authors: Laurent Aimar <fenrir@via.ecp.fr> + * + * This program is free software; you can redistribute it and/or modify it + * under the terms of the GNU Lesser General Public License as published by + * the Free Software Foundation; either version 2.1 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 Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public License + * along with this program; if not, write to the Free Software Foundation, + * Inc., 51 Franklin Street, Fifth Floor, Boston MA 02110-1301, USA. + *****************************************************************************/ + +#ifndef VLC_BITS_H +#define VLC_BITS_H 1 + +/** + * \file + * This file defines functions, structures for handling streams of bits in vlc + */ + +typedef struct bs_s +{ + uint8_t *p_start; + uint8_t *p; + uint8_t *p_end; + + ssize_t i_left; /* i_count number of available bits */ +} bs_t; + +static inline void bs_init( bs_t *s, const void *p_data, size_t i_data ) +{ + s->p_start = (void *)p_data; + s->p = s->p_start; + s->p_end = s->p_start + i_data; + s->i_left = 8; +} + +static inline int bs_pos( const bs_t *s ) +{ + return( 8 * ( s->p - s->p_start ) + 8 - s->i_left ); +} + +static inline int bs_eof( const bs_t *s ) +{ + return( s->p >= s->p_end ? 1: 0 ); +} + +static inline uint32_t bs_read( bs_t *s, int i_count ) +{ + static const uint32_t i_mask[33] = + { 0x00, + 0x01, 0x03, 0x07, 0x0f, + 0x1f, 0x3f, 0x7f, 0xff, + 0x1ff, 0x3ff, 0x7ff, 0xfff, + 0x1fff, 0x3fff, 0x7fff, 0xffff, + 0x1ffff, 0x3ffff, 0x7ffff, 0xfffff, + 0x1fffff, 0x3fffff, 0x7fffff, 0xffffff, + 0x1ffffff, 0x3ffffff, 0x7ffffff, 0xfffffff, + 0x1fffffff,0x3fffffff,0x7fffffff,0xffffffff}; + int i_shr; + uint32_t i_result = 0; + + while( i_count > 0 ) + { + if( s->p >= s->p_end ) + { + break; + } + + if( ( i_shr = s->i_left - i_count ) >= 0 ) + { + /* more in the buffer than requested */ + i_result |= ( *s->p >> i_shr )&i_mask[i_count]; + s->i_left -= i_count; + if( s->i_left == 0 ) + { + s->p++; + s->i_left = 8; + } + return( i_result ); + } + else + { + /* less in the buffer than requested */ + i_result |= (*s->p&i_mask[s->i_left]) << -i_shr; + i_count -= s->i_left; + s->p++; + s->i_left = 8; + } + } + + return( i_result ); +} + +static inline uint32_t bs_read1( bs_t *s ) +{ + if( s->p < s->p_end ) + { + unsigned int i_result; + + s->i_left--; + i_result = ( *s->p >> s->i_left )&0x01; + if( s->i_left == 0 ) + { + s->p++; + s->i_left = 8; + } + return i_result; + } + + return 0; +} + +static inline uint32_t bs_show( bs_t *s, int i_count ) +{ + bs_t s_tmp = *s; + return bs_read( &s_tmp, i_count ); +} + +static inline void bs_skip( bs_t *s, ssize_t i_count ) +{ + s->i_left -= i_count; + + if( s->i_left <= 0 ) + { + const int i_bytes = ( -s->i_left + 8 ) / 8; + + s->p += i_bytes; + s->i_left += 8 * i_bytes; + } +} + +static inline void bs_write( bs_t *s, int i_count, uint32_t i_bits ) +{ + while( i_count > 0 ) + { + if( s->p >= s->p_end ) + { + break; + } + + i_count--; + + if( ( i_bits >> i_count )&0x01 ) + { + *s->p |= 1 << ( s->i_left - 1 ); + } + else + { + *s->p &= ~( 1 << ( s->i_left - 1 ) ); + } + s->i_left--; + if( s->i_left == 0 ) + { + s->p++; + s->i_left = 8; + } + } +} + +static inline void bs_align( bs_t *s ) +{ + if( s->i_left != 8 ) + { + s->i_left = 8; + s->p++; + } +} + +static inline void bs_align_0( bs_t *s ) +{ + if( s->i_left != 8 ) + { + bs_write( s, s->i_left, 0 ); + } +} + +static inline void bs_align_1( bs_t *s ) +{ + while( s->i_left != 8 ) + { + bs_write( s, 1, 1 ); + } +} + +#endif diff --git a/src/aribb24/convtable.h b/src/aribb24/convtable.h new file mode 100644 index 0000000000000000000000000000000000000000..051ad4be9295e12e4cbdcf69b0484a4edd918c4f --- /dev/null +++ b/src/aribb24/convtable.h @@ -0,0 +1,1293 @@ +/***************************************************************************** + * convtable.h : table for converting ARIB STD-B24 JIS 8bit character code + ***************************************************************************** + * Copyright (C) 2014 Naohiro KORIYAMA + * + * Authors: Naohiro KORIYAMA <nkoriyama@gmail.com> + * + * This program is free software; you can redistribute it and/or modify it + * under the terms of the GNU Lesser General Public License as published by + * the Free Software Foundation; either version 2.1 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 Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public License + * along with this program; if not, write to the Free Software Foundation, + * Inc., 51 Franklin Street, Fifth Floor, Boston MA 02110-1301, USA. + *****************************************************************************/ + +#ifndef ARIBB24_CONVTABLE_H +#define ARIBB24_CONVTABLE_H 1 + +const unsigned int decoder_alnum_table[] = { + 0x0021, 0x0022, 0x0023, 0x0024, 0x0025, 0x0026, 0x0027, 0x0028, + 0x0029, 0x002a, 0x002b, 0x002c, 0x002d, 0x002e, 0x002f, 0x0030, + 0x0031, 0x0032, 0x0033, 0x0034, 0x0035, 0x0036, 0x0037, 0x0038, + 0x0039, 0x003a, 0x003b, 0x003c, 0x003d, 0x003e, 0x003f, 0x0040, + 0x0041, 0x0042, 0x0043, 0x0044, 0x0045, 0x0046, 0x0047, 0x0048, + 0x0049, 0x004a, 0x004b, 0x004c, 0x004d, 0x004e, 0x004f, 0x0050, + 0x0051, 0x0052, 0x0053, 0x0054, 0x0055, 0x0056, 0x0057, 0x0058, + 0x0059, 0x005a, 0x005b, 0x00a5, 0x005d, 0x005e, 0x005f, 0x0060, + 0x0061, 0x0062, 0x0063, 0x0064, 0x0065, 0x0066, 0x0067, 0x0068, + 0x0069, 0x006a, 0x006b, 0x006c, 0x006d, 0x006e, 0x006f, 0x0070, + 0x0071, 0x0072, 0x0073, 0x0074, 0x0075, 0x0076, 0x0077, 0x0078, + 0x0079, 0x007a, 0x007b, 0x007c, 0x007d, 0x203e, +}; + +const unsigned int decoder_hiragana_table[] = { + 0x3041, 0x3042, 0x3043, 0x3044, 0x3045, 0x3046, 0x3047, 0x3048, + 0x3049, 0x304a, 0x304b, 0x304c, 0x304d, 0x304e, 0x304f, 0x3050, + 0x3051, 0x3052, 0x3053, 0x3054, 0x3055, 0x3056, 0x3057, 0x3058, + 0x3059, 0x305a, 0x305b, 0x305c, 0x305d, 0x305e, 0x305f, 0x3060, + 0x3061, 0x3062, 0x3063, 0x3064, 0x3065, 0x3066, 0x3067, 0x3068, + 0x3069, 0x306a, 0x306b, 0x306c, 0x306d, 0x306e, 0x306f, 0x3070, + 0x3071, 0x3072, 0x3073, 0x3074, 0x3075, 0x3076, 0x3077, 0x3078, + 0x3079, 0x307a, 0x307b, 0x307c, 0x307d, 0x307e, 0x307f, 0x3080, + 0x3081, 0x3082, 0x3083, 0x3084, 0x3085, 0x3086, 0x3087, 0x3088, + 0x3089, 0x308a, 0x308b, 0x308c, 0x308d, 0x308e, 0x308f, 0x3090, + 0x3091, 0x3092, 0x3093, 0x3000, 0x3000, 0x3000, 0x309d, 0x309e, + 0x30fc, 0x3002, 0x300c, 0x300d, 0x3001, 0x30fb, +}; + +const unsigned int decoder_katakana_table[] = { + 0x30a1, 0x30a2, 0x30a3, 0x30a4, 0x30a5, 0x30a6, 0x30a7, 0x30a8, + 0x30a9, 0x30aa, 0x30ab, 0x30ac, 0x30ad, 0x30ae, 0x30af, 0x30b0, + 0x30b1, 0x30b2, 0x30b3, 0x30b4, 0x30b5, 0x30b6, 0x30b7, 0x30b8, + 0x30b9, 0x30ba, 0x30bb, 0x30bc, 0x30bd, 0x30be, 0x30bf, 0x30c0, + 0x30c1, 0x30c2, 0x30c3, 0x30c4, 0x30c5, 0x30c6, 0x30c7, 0x30c8, + 0x30c9, 0x30ca, 0x30cb, 0x30cc, 0x30cd, 0x30ce, 0x30cf, 0x30d0, + 0x30d1, 0x30d2, 0x30d3, 0x30d4, 0x30d5, 0x30d6, 0x30d7, 0x30d8, + 0x30d9, 0x30da, 0x30db, 0x30dc, 0x30dd, 0x30de, 0x30df, 0x30e0, + 0x30e1, 0x30e2, 0x30e3, 0x30e4, 0x30e5, 0x30e6, 0x30e7, 0x30e8, + 0x30e9, 0x30ea, 0x30eb, 0x30ec, 0x30ed, 0x30ee, 0x30ef, 0x30f0, + 0x30f1, 0x30f2, 0x30f3, 0x30f4, 0x30f5, 0x30f6, 0x30fd, 0x30fe, + 0x30fc, 0x3002, 0x300c, 0x300d, 0x3001, 0x30fb, +}; + +const unsigned int decoder_kanji_table[][94] = { + { + 0x3000, 0x3001, 0x3002, 0xff0c, 0xff0e, 0x30fb, 0xff1a, 0xff1b, + 0xff1f, 0xff01, 0x309b, 0x309c, 0x00b4, 0xff40, 0x00a8, 0xff3e, + 0xffe3, 0xff3f, 0x30fd, 0x30fe, 0x309d, 0x309e, 0x3003, 0x4edd, + 0x3005, 0x3006, 0x3007, 0x30fc, 0x2015, 0x2010, 0xff0f, 0x005c, + 0x301c, 0x2016, 0xff5c, 0x2026, 0x2025, 0x2018, 0x2019, 0x201c, + 0x201d, 0xff08, 0xff09, 0x3014, 0x3015, 0xff3b, 0xff3d, 0xff5b, + 0xff5d, 0x3008, 0x3009, 0x300a, 0x300b, 0x300c, 0x300d, 0x300e, + 0x300f, 0x3010, 0x3011, 0xff0b, 0xff0d, 0x00b1, 0x00d7, 0x00f7, + 0xff1d, 0x2260, 0xff1c, 0xff1e, 0x2266, 0x2267, 0x221e, 0x2234, + 0x2642, 0x2640, 0x00b0, 0x2032, 0x2033, 0x2103, 0xffe5, 0xff04, + 0x00a2, 0x00a3, 0xff05, 0xff03, 0xff06, 0xff0a, 0xff20, 0x00a7, + 0x2606, 0x2605, 0x25cb, 0x25cf, 0x25ce, 0x25c7, + }, + { + 0x25c6, 0x25a1, 0x25a0, 0x25b3, 0x25b2, 0x25bd, 0x25bc, 0x203b, + 0x3012, 0x2192, 0x2190, 0x2191, 0x2193, 0x3013, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x2208, 0x220b, 0x2286, 0x2287, 0x2282, 0x2283, 0x222a, + 0x2229, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x2227, 0x2228, 0x00ac, 0x21d2, 0x21d4, 0x2200, 0x2203, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x2220, 0x22a5, 0x2312, 0x2202, 0x2207, + 0x2261, 0x2252, 0x226a, 0x226b, 0x221a, 0x223d, 0x221d, 0x2235, + 0x222b, 0x222c, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x212b, 0x2030, 0x266f, 0x266d, 0x266a, 0x2020, 0x2021, + 0x00b6, 0x0000, 0x0000, 0x0000, 0x0000, 0x25ef, + }, + { + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xff10, + 0xff11, 0xff12, 0xff13, 0xff14, 0xff15, 0xff16, 0xff17, 0xff18, + 0xff19, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0xff21, 0xff22, 0xff23, 0xff24, 0xff25, 0xff26, 0xff27, 0xff28, + 0xff29, 0xff2a, 0xff2b, 0xff2c, 0xff2d, 0xff2e, 0xff2f, 0xff30, + 0xff31, 0xff32, 0xff33, 0xff34, 0xff35, 0xff36, 0xff37, 0xff38, + 0xff39, 0xff3a, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0xff41, 0xff42, 0xff43, 0xff44, 0xff45, 0xff46, 0xff47, 0xff48, + 0xff49, 0xff4a, 0xff4b, 0xff4c, 0xff4d, 0xff4e, 0xff4f, 0xff50, + 0xff51, 0xff52, 0xff53, 0xff54, 0xff55, 0xff56, 0xff57, 0xff58, + 0xff59, 0xff5a, + }, + { + 0x3041, 0x3042, 0x3043, 0x3044, 0x3045, 0x3046, 0x3047, 0x3048, + 0x3049, 0x304a, 0x304b, 0x304c, 0x304d, 0x304e, 0x304f, 0x3050, + 0x3051, 0x3052, 0x3053, 0x3054, 0x3055, 0x3056, 0x3057, 0x3058, + 0x3059, 0x305a, 0x305b, 0x305c, 0x305d, 0x305e, 0x305f, 0x3060, + 0x3061, 0x3062, 0x3063, 0x3064, 0x3065, 0x3066, 0x3067, 0x3068, + 0x3069, 0x306a, 0x306b, 0x306c, 0x306d, 0x306e, 0x306f, 0x3070, + 0x3071, 0x3072, 0x3073, 0x3074, 0x3075, 0x3076, 0x3077, 0x3078, + 0x3079, 0x307a, 0x307b, 0x307c, 0x307d, 0x307e, 0x307f, 0x3080, + 0x3081, 0x3082, 0x3083, 0x3084, 0x3085, 0x3086, 0x3087, 0x3088, + 0x3089, 0x308a, 0x308b, 0x308c, 0x308d, 0x308e, 0x308f, 0x3090, + 0x3091, 0x3092, 0x3093, + }, + { + 0x30a1, 0x30a2, 0x30a3, 0x30a4, 0x30a5, 0x30a6, 0x30a7, 0x30a8, + 0x30a9, 0x30aa, 0x30ab, 0x30ac, 0x30ad, 0x30ae, 0x30af, 0x30b0, + 0x30b1, 0x30b2, 0x30b3, 0x30b4, 0x30b5, 0x30b6, 0x30b7, 0x30b8, + 0x30b9, 0x30ba, 0x30bb, 0x30bc, 0x30bd, 0x30be, 0x30bf, 0x30c0, + 0x30c1, 0x30c2, 0x30c3, 0x30c4, 0x30c5, 0x30c6, 0x30c7, 0x30c8, + 0x30c9, 0x30ca, 0x30cb, 0x30cc, 0x30cd, 0x30ce, 0x30cf, 0x30d0, + 0x30d1, 0x30d2, 0x30d3, 0x30d4, 0x30d5, 0x30d6, 0x30d7, 0x30d8, + 0x30d9, 0x30da, 0x30db, 0x30dc, 0x30dd, 0x30de, 0x30df, 0x30e0, + 0x30e1, 0x30e2, 0x30e3, 0x30e4, 0x30e5, 0x30e6, 0x30e7, 0x30e8, + 0x30e9, 0x30ea, 0x30eb, 0x30ec, 0x30ed, 0x30ee, 0x30ef, 0x30f0, + 0x30f1, 0x30f2, 0x30f3, 0x30f4, 0x30f5, 0x30f6, + }, + { + 0x0391, 0x0392, 0x0393, 0x0394, 0x0395, 0x0396, 0x0397, 0x0398, + 0x0399, 0x039a, 0x039b, 0x039c, 0x039d, 0x039e, 0x039f, 0x03a0, + 0x03a1, 0x03a3, 0x03a4, 0x03a5, 0x03a6, 0x03a7, 0x03a8, 0x03a9, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x03b1, 0x03b2, 0x03b3, 0x03b4, 0x03b5, 0x03b6, 0x03b7, 0x03b8, + 0x03b9, 0x03ba, 0x03bb, 0x03bc, 0x03bd, 0x03be, 0x03bf, 0x03c0, + 0x03c1, 0x03c3, 0x03c4, 0x03c5, 0x03c6, 0x03c7, 0x03c8, 0x03c9, + }, + { + 0x0410, 0x0411, 0x0412, 0x0413, 0x0414, 0x0415, 0x0401, 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, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0430, 0x0431, 0x0432, 0x0433, 0x0434, 0x0435, 0x0451, 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, + }, + { + 0x2500, 0x2502, 0x250c, 0x2510, 0x2518, 0x2514, 0x251c, 0x252c, + 0x2524, 0x2534, 0x253c, 0x2501, 0x2503, 0x250f, 0x2513, 0x251b, + 0x2517, 0x2523, 0x2533, 0x252b, 0x253b, 0x254b, 0x2520, 0x252f, + 0x2528, 0x2537, 0x253f, 0x251d, 0x2530, 0x2525, 0x2538, 0x2542, + }, + { + }, + { + }, + { + }, + { + }, + { + }, + { + }, + { + }, + { + 0x4e9c, 0x5516, 0x5a03, 0x963f, 0x54c0, 0x611b, 0x6328, 0x59f6, + 0x9022, 0x8475, 0x831c, 0x7a50, 0x60aa, 0x63e1, 0x6e25, 0x65ed, + 0x8466, 0x82a6, 0x9bf5, 0x6893, 0x5727, 0x65a1, 0x6271, 0x5b9b, + 0x59d0, 0x867b, 0x98f4, 0x7d62, 0x7dbe, 0x9b8e, 0x6216, 0x7c9f, + 0x88b7, 0x5b89, 0x5eb5, 0x6309, 0x6697, 0x6848, 0x95c7, 0x978d, + 0x674f, 0x4ee5, 0x4f0a, 0x4f4d, 0x4f9d, 0x5049, 0x56f2, 0x5937, + 0x59d4, 0x5a01, 0x5c09, 0x60df, 0x610f, 0x6170, 0x6613, 0x6905, + 0x70ba, 0x754f, 0x7570, 0x79fb, 0x7dad, 0x7def, 0x80c3, 0x840e, + 0x8863, 0x8b02, 0x9055, 0x907a, 0x533b, 0x4e95, 0x4ea5, 0x57df, + 0x80b2, 0x90c1, 0x78ef, 0x4e00, 0x58f1, 0x6ea2, 0x9038, 0x7a32, + 0x8328, 0x828b, 0x9c2f, 0x5141, 0x5370, 0x54bd, 0x54e1, 0x56e0, + 0x59fb, 0x5f15, 0x98f2, 0x6deb, 0x80e4, 0x852d, + }, + { + 0x9662, 0x9670, 0x96a0, 0x97fb, 0x540b, 0x53f3, 0x5b87, 0x70cf, + 0x7fbd, 0x8fc2, 0x96e8, 0x536f, 0x9d5c, 0x7aba, 0x4e11, 0x7893, + 0x81fc, 0x6e26, 0x5618, 0x5504, 0x6b1d, 0x851a, 0x9c3b, 0x59e5, + 0x53a9, 0x6d66, 0x74dc, 0x958f, 0x5642, 0x4e91, 0x904b, 0x96f2, + 0x834f, 0x990c, 0x53e1, 0x55b6, 0x5b30, 0x5f71, 0x6620, 0x66f3, + 0x6804, 0x6c38, 0x6cf3, 0x6d29, 0x745b, 0x76c8, 0x7a4e, 0x9834, + 0x82f1, 0x885b, 0x8a60, 0x92ed, 0x6db2, 0x75ab, 0x76ca, 0x99c5, + 0x60a6, 0x8b01, 0x8d8a, 0x95b2, 0x698e, 0x53ad, 0x5186, 0x5712, + 0x5830, 0x5944, 0x5bb4, 0x5ef6, 0x6028, 0x63a9, 0x63f4, 0x6cbf, + 0x6f14, 0x708e, 0x7114, 0x7159, 0x71d5, 0x733f, 0x7e01, 0x8276, + 0x82d1, 0x8597, 0x9060, 0x925b, 0x9d1b, 0x5869, 0x65bc, 0x6c5a, + 0x7525, 0x51f9, 0x592e, 0x5965, 0x5f80, 0x5fdc, + }, + { + 0x62bc, 0x65fa, 0x6a2a, 0x6b27, 0x6bb4, 0x738b, 0x7fc1, 0x8956, + 0x9d2c, 0x9d0e, 0x9ec4, 0x5ca1, 0x6c96, 0x837b, 0x5104, 0x5c4b, + 0x61b6, 0x81c6, 0x6876, 0x7261, 0x4e59, 0x4ffa, 0x5378, 0x6069, + 0x6e29, 0x7a4f, 0x97f3, 0x4e0b, 0x5316, 0x4eee, 0x4f55, 0x4f3d, + 0x4fa1, 0x4f73, 0x52a0, 0x53ef, 0x5609, 0x590f, 0x5ac1, 0x5bb6, + 0x5be1, 0x79d1, 0x6687, 0x679c, 0x67b6, 0x6b4c, 0x6cb3, 0x706b, + 0x73c2, 0x798d, 0x79be, 0x7a3c, 0x7b87, 0x82b1, 0x82db, 0x8304, + 0x8377, 0x83ef, 0x83d3, 0x8766, 0x8ab2, 0x5629, 0x8ca8, 0x8fe6, + 0x904e, 0x971e, 0x868a, 0x4fc4, 0x5ce8, 0x6211, 0x7259, 0x753b, + 0x81e5, 0x82bd, 0x86fe, 0x8cc0, 0x96c5, 0x9913, 0x99d5, 0x4ecb, + 0x4f1a, 0x89e3, 0x56de, 0x584a, 0x58ca, 0x5efb, 0x5feb, 0x602a, + 0x6094, 0x6062, 0x61d0, 0x6212, 0x62d0, 0x6539, + }, + { + 0x9b41, 0x6666, 0x68b0, 0x6d77, 0x7070, 0x754c, 0x7686, 0x7d75, + 0x82a5, 0x87f9, 0x958b, 0x968e, 0x8c9d, 0x51f1, 0x52be, 0x5916, + 0x54b3, 0x5bb3, 0x5d16, 0x6168, 0x6982, 0x6daf, 0x788d, 0x84cb, + 0x8857, 0x8a72, 0x93a7, 0x9ab8, 0x6d6c, 0x99a8, 0x86d9, 0x57a3, + 0x67ff, 0x86ce, 0x920e, 0x5283, 0x5687, 0x5404, 0x5ed3, 0x62e1, + 0x64b9, 0x683c, 0x6838, 0x6bbb, 0x7372, 0x78ba, 0x7a6b, 0x899a, + 0x89d2, 0x8d6b, 0x8f03, 0x90ed, 0x95a3, 0x9694, 0x9769, 0x5b66, + 0x5cb3, 0x697d, 0x984d, 0x984e, 0x639b, 0x7b20, 0x6a2b, 0x6a7f, + 0x68b6, 0x9c0d, 0x6f5f, 0x5272, 0x559d, 0x6070, 0x62ec, 0x6d3b, + 0x6e07, 0x6ed1, 0x845b, 0x8910, 0x8f44, 0x4e14, 0x9c39, 0x53f6, + 0x691b, 0x6a3a, 0x9784, 0x682a, 0x515c, 0x7ac3, 0x84b2, 0x91dc, + 0x938c, 0x565b, 0x9d28, 0x6822, 0x8305, 0x8431, + }, + { + 0x7ca5, 0x5208, 0x82c5, 0x74e6, 0x4e7e, 0x4f83, 0x51a0, 0x5bd2, + 0x520a, 0x52d8, 0x52e7, 0x5dfb, 0x559a, 0x582a, 0x59e6, 0x5b8c, + 0x5b98, 0x5bdb, 0x5e72, 0x5e79, 0x60a3, 0x611f, 0x6163, 0x61be, + 0x63db, 0x6562, 0x67d1, 0x6853, 0x68fa, 0x6b3e, 0x6b53, 0x6c57, + 0x6f22, 0x6f97, 0x6f45, 0x74b0, 0x7518, 0x76e3, 0x770b, 0x7aff, + 0x7ba1, 0x7c21, 0x7de9, 0x7f36, 0x7ff0, 0x809d, 0x8266, 0x839e, + 0x89b3, 0x8acc, 0x8cab, 0x9084, 0x9451, 0x9593, 0x9591, 0x95a2, + 0x9665, 0x97d3, 0x9928, 0x8218, 0x4e38, 0x542b, 0x5cb8, 0x5dcc, + 0x73a9, 0x764c, 0x773c, 0x5ca9, 0x7feb, 0x8d0b, 0x96c1, 0x9811, + 0x9854, 0x9858, 0x4f01, 0x4f0e, 0x5371, 0x559c, 0x5668, 0x57fa, + 0x5947, 0x5b09, 0x5bc4, 0x5c90, 0x5e0c, 0x5e7e, 0x5fcc, 0x63ee, + 0x673a, 0x65d7, 0x65e2, 0x671f, 0x68cb, 0x68c4, + }, + { + 0x6a5f, 0x5e30, 0x6bc5, 0x6c17, 0x6c7d, 0x757f, 0x7948, 0x5b63, + 0x7a00, 0x7d00, 0x5fbd, 0x898f, 0x8a18, 0x8cb4, 0x8d77, 0x8ecc, + 0x8f1d, 0x98e2, 0x9a0e, 0x9b3c, 0x4e80, 0x507d, 0x5100, 0x5993, + 0x5b9c, 0x622f, 0x6280, 0x64ec, 0x6b3a, 0x72a0, 0x7591, 0x7947, + 0x7fa9, 0x87fb, 0x8abc, 0x8b70, 0x63ac, 0x83ca, 0x97a0, 0x5409, + 0x5403, 0x55ab, 0x6854, 0x6a58, 0x8a70, 0x7827, 0x6775, 0x9ecd, + 0x5374, 0x5ba2, 0x811a, 0x8650, 0x9006, 0x4e18, 0x4e45, 0x4ec7, + 0x4f11, 0x53ca, 0x5438, 0x5bae, 0x5f13, 0x6025, 0x6551, 0x673d, + 0x6c42, 0x6c72, 0x6ce3, 0x7078, 0x7403, 0x7a76, 0x7aae, 0x7b08, + 0x7d1a, 0x7cfe, 0x7d66, 0x65e7, 0x725b, 0x53bb, 0x5c45, 0x5de8, + 0x62d2, 0x62e0, 0x6319, 0x6e20, 0x865a, 0x8a31, 0x8ddd, 0x92f8, + 0x6f01, 0x79a6, 0x9b5a, 0x4ea8, 0x4eab, 0x4eac, + }, + { + 0x4f9b, 0x4fa0, 0x50d1, 0x5147, 0x7af6, 0x5171, 0x51f6, 0x5354, + 0x5321, 0x537f, 0x53eb, 0x55ac, 0x5883, 0x5ce1, 0x5f37, 0x5f4a, + 0x602f, 0x6050, 0x606d, 0x631f, 0x6559, 0x6a4b, 0x6cc1, 0x72c2, + 0x72ed, 0x77ef, 0x80f8, 0x8105, 0x8208, 0x854e, 0x90f7, 0x93e1, + 0x97ff, 0x9957, 0x9a5a, 0x4ef0, 0x51dd, 0x5c2d, 0x6681, 0x696d, + 0x5c40, 0x66f2, 0x6975, 0x7389, 0x6850, 0x7c81, 0x50c5, 0x52e4, + 0x5747, 0x5dfe, 0x9326, 0x65a4, 0x6b23, 0x6b3d, 0x7434, 0x7981, + 0x79bd, 0x7b4b, 0x7dca, 0x82b9, 0x83cc, 0x887f, 0x895f, 0x8b39, + 0x8fd1, 0x91d1, 0x541f, 0x9280, 0x4e5d, 0x5036, 0x53e5, 0x533a, + 0x72d7, 0x7396, 0x77e9, 0x82e6, 0x8eaf, 0x99c6, 0x99c8, 0x99d2, + 0x5177, 0x611a, 0x865e, 0x55b0, 0x7a7a, 0x5076, 0x5bd3, 0x9047, + 0x9685, 0x4e32, 0x6adb, 0x91e7, 0x5c51, 0x5c48, + }, + { + 0x6398, 0x7a9f, 0x6c93, 0x9774, 0x8f61, 0x7aaa, 0x718a, 0x9688, + 0x7c82, 0x6817, 0x7e70, 0x6851, 0x936c, 0x52f2, 0x541b, 0x85ab, + 0x8a13, 0x7fa4, 0x8ecd, 0x90e1, 0x5366, 0x8888, 0x7941, 0x4fc2, + 0x50be, 0x5211, 0x5144, 0x5553, 0x572d, 0x73ea, 0x578b, 0x5951, + 0x5f62, 0x5f84, 0x6075, 0x6176, 0x6167, 0x61a9, 0x63b2, 0x643a, + 0x656c, 0x666f, 0x6842, 0x6e13, 0x7566, 0x7a3d, 0x7cfb, 0x7d4c, + 0x7d99, 0x7e4b, 0x7f6b, 0x830e, 0x834a, 0x86cd, 0x8a08, 0x8a63, + 0x8b66, 0x8efd, 0x981a, 0x9d8f, 0x82b8, 0x8fce, 0x9be8, 0x5287, + 0x621f, 0x6483, 0x6fc0, 0x9699, 0x6841, 0x5091, 0x6b20, 0x6c7a, + 0x6f54, 0x7a74, 0x7d50, 0x8840, 0x8a23, 0x6708, 0x4ef6, 0x5039, + 0x5026, 0x5065, 0x517c, 0x5238, 0x5263, 0x55a7, 0x570f, 0x5805, + 0x5acc, 0x5efa, 0x61b2, 0x61f8, 0x62f3, 0x6372, + }, + { + 0x691c, 0x6a29, 0x727d, 0x72ac, 0x732e, 0x7814, 0x786f, 0x7d79, + 0x770c, 0x80a9, 0x898b, 0x8b19, 0x8ce2, 0x8ed2, 0x9063, 0x9375, + 0x967a, 0x9855, 0x9a13, 0x9e78, 0x5143, 0x539f, 0x53b3, 0x5e7b, + 0x5f26, 0x6e1b, 0x6e90, 0x7384, 0x73fe, 0x7d43, 0x8237, 0x8a00, + 0x8afa, 0x9650, 0x4e4e, 0x500b, 0x53e4, 0x547c, 0x56fa, 0x59d1, + 0x5b64, 0x5df1, 0x5eab, 0x5f27, 0x6238, 0x6545, 0x67af, 0x6e56, + 0x72d0, 0x7cca, 0x88b4, 0x80a1, 0x80e1, 0x83f0, 0x864e, 0x8a87, + 0x8de8, 0x9237, 0x96c7, 0x9867, 0x9f13, 0x4e94, 0x4e92, 0x4f0d, + 0x5348, 0x5449, 0x543e, 0x5a2f, 0x5f8c, 0x5fa1, 0x609f, 0x68a7, + 0x6a8e, 0x745a, 0x7881, 0x8a9e, 0x8aa4, 0x8b77, 0x9190, 0x4e5e, + 0x9bc9, 0x4ea4, 0x4f7c, 0x4faf, 0x5019, 0x5016, 0x5149, 0x516c, + 0x529f, 0x52b9, 0x52fe, 0x539a, 0x53e3, 0x5411, + }, + { + 0x540e, 0x5589, 0x5751, 0x57a2, 0x597d, 0x5b54, 0x5b5d, 0x5b8f, + 0x5de5, 0x5de7, 0x5df7, 0x5e78, 0x5e83, 0x5e9a, 0x5eb7, 0x5f18, + 0x6052, 0x614c, 0x6297, 0x62d8, 0x63a7, 0x653b, 0x6602, 0x6643, + 0x66f4, 0x676d, 0x6821, 0x6897, 0x69cb, 0x6c5f, 0x6d2a, 0x6d69, + 0x6e2f, 0x6e9d, 0x7532, 0x7687, 0x786c, 0x7a3f, 0x7ce0, 0x7d05, + 0x7d18, 0x7d5e, 0x7db1, 0x8015, 0x8003, 0x80af, 0x80b1, 0x8154, + 0x818f, 0x822a, 0x8352, 0x884c, 0x8861, 0x8b1b, 0x8ca2, 0x8cfc, + 0x90ca, 0x9175, 0x9271, 0x783f, 0x92fc, 0x95a4, 0x964d, 0x9805, + 0x9999, 0x9ad8, 0x9d3b, 0x525b, 0x52ab, 0x53f7, 0x5408, 0x58d5, + 0x62f7, 0x6fe0, 0x8c6a, 0x8f5f, 0x9eb9, 0x514b, 0x523b, 0x544a, + 0x56fd, 0x7a40, 0x9177, 0x9d60, 0x9ed2, 0x7344, 0x6f09, 0x8170, + 0x7511, 0x5ffd, 0x60da, 0x9aa8, 0x72db, 0x8fbc, + }, + { + 0x6b64, 0x9803, 0x4eca, 0x56f0, 0x5764, 0x58be, 0x5a5a, 0x6068, + 0x61c7, 0x660f, 0x6606, 0x6839, 0x68b1, 0x6df7, 0x75d5, 0x7d3a, + 0x826e, 0x9b42, 0x4e9b, 0x4f50, 0x53c9, 0x5506, 0x5d6f, 0x5de6, + 0x5dee, 0x67fb, 0x6c99, 0x7473, 0x7802, 0x8a50, 0x9396, 0x88df, + 0x5750, 0x5ea7, 0x632b, 0x50b5, 0x50ac, 0x518d, 0x6700, 0x54c9, + 0x585e, 0x59bb, 0x5bb0, 0x5f69, 0x624d, 0x63a1, 0x683d, 0x6b73, + 0x6e08, 0x707d, 0x91c7, 0x7280, 0x7815, 0x7826, 0x796d, 0x658e, + 0x7d30, 0x83dc, 0x88c1, 0x8f09, 0x969b, 0x5264, 0x5728, 0x6750, + 0x7f6a, 0x8ca1, 0x51b4, 0x5742, 0x962a, 0x583a, 0x698a, 0x80b4, + 0x54b2, 0x5d0e, 0x57fc, 0x7895, 0x9dfa, 0x4f5c, 0x524a, 0x548b, + 0x643e, 0x6628, 0x6714, 0x67f5, 0x7a84, 0x7b56, 0x7d22, 0x932f, + 0x685c, 0x9bad, 0x7b39, 0x5319, 0x518a, 0x5237, + }, + { + 0x5bdf, 0x62f6, 0x64ae, 0x64e6, 0x672d, 0x6bba, 0x85a9, 0x96d1, + 0x7690, 0x9bd6, 0x634c, 0x9306, 0x9bab, 0x76bf, 0x6652, 0x4e09, + 0x5098, 0x53c2, 0x5c71, 0x60e8, 0x6492, 0x6563, 0x685f, 0x71e6, + 0x73ca, 0x7523, 0x7b97, 0x7e82, 0x8695, 0x8b83, 0x8cdb, 0x9178, + 0x9910, 0x65ac, 0x66ab, 0x6b8b, 0x4ed5, 0x4ed4, 0x4f3a, 0x4f7f, + 0x523a, 0x53f8, 0x53f2, 0x55e3, 0x56db, 0x58eb, 0x59cb, 0x59c9, + 0x59ff, 0x5b50, 0x5c4d, 0x5e02, 0x5e2b, 0x5fd7, 0x601d, 0x6307, + 0x652f, 0x5b5c, 0x65af, 0x65bd, 0x65e8, 0x679d, 0x6b62, 0x6b7b, + 0x6c0f, 0x7345, 0x7949, 0x79c1, 0x7cf8, 0x7d19, 0x7d2b, 0x80a2, + 0x8102, 0x81f3, 0x8996, 0x8a5e, 0x8a69, 0x8a66, 0x8a8c, 0x8aee, + 0x8cc7, 0x8cdc, 0x96cc, 0x98fc, 0x6b6f, 0x4e8b, 0x4f3c, 0x4f8d, + 0x5150, 0x5b57, 0x5bfa, 0x6148, 0x6301, 0x6642, + }, + { + 0x6b21, 0x6ecb, 0x6cbb, 0x723e, 0x74bd, 0x75d4, 0x78c1, 0x793a, + 0x800c, 0x8033, 0x81ea, 0x8494, 0x8f9e, 0x6c50, 0x9e7f, 0x5f0f, + 0x8b58, 0x9d2b, 0x7afa, 0x8ef8, 0x5b8d, 0x96eb, 0x4e03, 0x53f1, + 0x57f7, 0x5931, 0x5ac9, 0x5ba4, 0x6089, 0x6e7f, 0x6f06, 0x75be, + 0x8cea, 0x5b9f, 0x8500, 0x7be0, 0x5072, 0x67f4, 0x829d, 0x5c61, + 0x854a, 0x7e1e, 0x820e, 0x5199, 0x5c04, 0x6368, 0x8d66, 0x659c, + 0x716e, 0x793e, 0x7d17, 0x8005, 0x8b1d, 0x8eca, 0x906e, 0x86c7, + 0x90aa, 0x501f, 0x52fa, 0x5c3a, 0x6753, 0x707c, 0x7235, 0x914c, + 0x91c8, 0x932b, 0x82e5, 0x5bc2, 0x5f31, 0x60f9, 0x4e3b, 0x53d6, + 0x5b88, 0x624b, 0x6731, 0x6b8a, 0x72e9, 0x73e0, 0x7a2e, 0x816b, + 0x8da3, 0x9152, 0x9996, 0x5112, 0x53d7, 0x546a, 0x5bff, 0x6388, + 0x6a39, 0x7dac, 0x9700, 0x56da, 0x53ce, 0x5468, + }, + { + 0x5b97, 0x5c31, 0x5dde, 0x4fee, 0x6101, 0x62fe, 0x6d32, 0x79c0, + 0x79cb, 0x7d42, 0x7e4d, 0x7fd2, 0x81ed, 0x821f, 0x8490, 0x8846, + 0x8972, 0x8b90, 0x8e74, 0x8f2f, 0x9031, 0x914b, 0x916c, 0x96c6, + 0x919c, 0x4ec0, 0x4f4f, 0x5145, 0x5341, 0x5f93, 0x620e, 0x67d4, + 0x6c41, 0x6e0b, 0x7363, 0x7e26, 0x91cd, 0x9283, 0x53d4, 0x5919, + 0x5bbf, 0x6dd1, 0x795d, 0x7e2e, 0x7c9b, 0x587e, 0x719f, 0x51fa, + 0x8853, 0x8ff0, 0x4fca, 0x5cfb, 0x6625, 0x77ac, 0x7ae3, 0x821c, + 0x99ff, 0x51c6, 0x5faa, 0x65ec, 0x696f, 0x6b89, 0x6df3, 0x6e96, + 0x6f64, 0x76fe, 0x7d14, 0x5de1, 0x9075, 0x9187, 0x9806, 0x51e6, + 0x521d, 0x6240, 0x6691, 0x66d9, 0x6e1a, 0x5eb6, 0x7dd2, 0x7f72, + 0x66f8, 0x85af, 0x85f7, 0x8af8, 0x52a9, 0x53d9, 0x5973, 0x5e8f, + 0x5f90, 0x6055, 0x92e4, 0x9664, 0x50b7, 0x511f, + }, + { + 0x52dd, 0x5320, 0x5347, 0x53ec, 0x54e8, 0x5546, 0x5531, 0x5617, + 0x5968, 0x59be, 0x5a3c, 0x5bb5, 0x5c06, 0x5c0f, 0x5c11, 0x5c1a, + 0x5e84, 0x5e8a, 0x5ee0, 0x5f70, 0x627f, 0x6284, 0x62db, 0x638c, + 0x6377, 0x6607, 0x660c, 0x662d, 0x6676, 0x677e, 0x68a2, 0x6a1f, + 0x6a35, 0x6cbc, 0x6d88, 0x6e09, 0x6e58, 0x713c, 0x7126, 0x7167, + 0x75c7, 0x7701, 0x785d, 0x7901, 0x7965, 0x79f0, 0x7ae0, 0x7b11, + 0x7ca7, 0x7d39, 0x8096, 0x83d6, 0x848b, 0x8549, 0x885d, 0x88f3, + 0x8a1f, 0x8a3c, 0x8a54, 0x8a73, 0x8c61, 0x8cde, 0x91a4, 0x9266, + 0x937e, 0x9418, 0x969c, 0x9798, 0x4e0a, 0x4e08, 0x4e1e, 0x4e57, + 0x5197, 0x5270, 0x57ce, 0x5834, 0x58cc, 0x5b22, 0x5e38, 0x60c5, + 0x64fe, 0x6761, 0x6756, 0x6d44, 0x72b6, 0x7573, 0x7a63, 0x84b8, + 0x8b72, 0x91b8, 0x9320, 0x5631, 0x57f4, 0x98fe, + }, + { + 0x62ed, 0x690d, 0x6b96, 0x71ed, 0x7e54, 0x8077, 0x8272, 0x89e6, + 0x98df, 0x8755, 0x8fb1, 0x5c3b, 0x4f38, 0x4fe1, 0x4fb5, 0x5507, + 0x5a20, 0x5bdd, 0x5be9, 0x5fc3, 0x614e, 0x632f, 0x65b0, 0x664b, + 0x68ee, 0x699b, 0x6d78, 0x6df1, 0x7533, 0x75b9, 0x771f, 0x795e, + 0x79e6, 0x7d33, 0x81e3, 0x82af, 0x85aa, 0x89aa, 0x8a3a, 0x8eab, + 0x8f9b, 0x9032, 0x91dd, 0x9707, 0x4eba, 0x4ec1, 0x5203, 0x5875, + 0x58ec, 0x5c0b, 0x751a, 0x5c3d, 0x814e, 0x8a0a, 0x8fc5, 0x9663, + 0x976d, 0x7b25, 0x8acf, 0x9808, 0x9162, 0x56f3, 0x53a8, 0x9017, + 0x5439, 0x5782, 0x5e25, 0x63a8, 0x6c34, 0x708a, 0x7761, 0x7c8b, + 0x7fe0, 0x8870, 0x9042, 0x9154, 0x9310, 0x9318, 0x968f, 0x745e, + 0x9ac4, 0x5d07, 0x5d69, 0x6570, 0x67a2, 0x8da8, 0x96db, 0x636e, + 0x6749, 0x6919, 0x83c5, 0x9817, 0x96c0, 0x88fe, + }, + { + 0x6f84, 0x647a, 0x5bf8, 0x4e16, 0x702c, 0x755d, 0x662f, 0x51c4, + 0x5236, 0x52e2, 0x59d3, 0x5f81, 0x6027, 0x6210, 0x653f, 0x6574, + 0x661f, 0x6674, 0x68f2, 0x6816, 0x6b63, 0x6e05, 0x7272, 0x751f, + 0x76db, 0x7cbe, 0x8056, 0x58f0, 0x88fd, 0x897f, 0x8aa0, 0x8a93, + 0x8acb, 0x901d, 0x9192, 0x9752, 0x9759, 0x6589, 0x7a0e, 0x8106, + 0x96bb, 0x5e2d, 0x60dc, 0x621a, 0x65a5, 0x6614, 0x6790, 0x77f3, + 0x7a4d, 0x7c4d, 0x7e3e, 0x810a, 0x8cac, 0x8d64, 0x8de1, 0x8e5f, + 0x78a9, 0x5207, 0x62d9, 0x63a5, 0x6442, 0x6298, 0x8a2d, 0x7a83, + 0x7bc0, 0x8aac, 0x96ea, 0x7d76, 0x820c, 0x8749, 0x4ed9, 0x5148, + 0x5343, 0x5360, 0x5ba3, 0x5c02, 0x5c16, 0x5ddd, 0x6226, 0x6247, + 0x64b0, 0x6813, 0x6834, 0x6cc9, 0x6d45, 0x6d17, 0x67d3, 0x6f5c, + 0x714e, 0x717d, 0x65cb, 0x7a7f, 0x7bad, 0x7dda, + }, + { + 0x7e4a, 0x7fa8, 0x817a, 0x821b, 0x8239, 0x85a6, 0x8a6e, 0x8cce, + 0x8df5, 0x9078, 0x9077, 0x92ad, 0x9291, 0x9583, 0x9bae, 0x524d, + 0x5584, 0x6f38, 0x7136, 0x5168, 0x7985, 0x7e55, 0x81b3, 0x7cce, + 0x564c, 0x5851, 0x5ca8, 0x63aa, 0x66fe, 0x66fd, 0x695a, 0x72d9, + 0x758f, 0x758e, 0x790e, 0x7956, 0x79df, 0x7c97, 0x7d20, 0x7d44, + 0x8607, 0x8a34, 0x963b, 0x9061, 0x9f20, 0x50e7, 0x5275, 0x53cc, + 0x53e2, 0x5009, 0x55aa, 0x58ee, 0x594f, 0x723d, 0x5b8b, 0x5c64, + 0x531d, 0x60e3, 0x60f3, 0x635c, 0x6383, 0x633f, 0x63bb, 0x64cd, + 0x65e9, 0x66f9, 0x5de3, 0x69cd, 0x69fd, 0x6f15, 0x71e5, 0x4e89, + 0x75e9, 0x76f8, 0x7a93, 0x7cdf, 0x7dcf, 0x7d9c, 0x8061, 0x8349, + 0x8358, 0x846c, 0x84bc, 0x85fb, 0x88c5, 0x8d70, 0x9001, 0x906d, + 0x9397, 0x971c, 0x9a12, 0x50cf, 0x5897, 0x618e, + }, + { + 0x81d3, 0x8535, 0x8d08, 0x9020, 0x4fc3, 0x5074, 0x5247, 0x5373, + 0x606f, 0x6349, 0x675f, 0x6e2c, 0x8db3, 0x901f, 0x4fd7, 0x5c5e, + 0x8cca, 0x65cf, 0x7d9a, 0x5352, 0x8896, 0x5176, 0x63c3, 0x5b58, + 0x5b6b, 0x5c0a, 0x640d, 0x6751, 0x905c, 0x4ed6, 0x591a, 0x592a, + 0x6c70, 0x8a51, 0x553e, 0x5815, 0x59a5, 0x60f0, 0x6253, 0x67c1, + 0x8235, 0x6955, 0x9640, 0x99c4, 0x9a28, 0x4f53, 0x5806, 0x5bfe, + 0x8010, 0x5cb1, 0x5e2f, 0x5f85, 0x6020, 0x614b, 0x6234, 0x66ff, + 0x6cf0, 0x6ede, 0x80ce, 0x817f, 0x82d4, 0x888b, 0x8cb8, 0x9000, + 0x902e, 0x968a, 0x9edb, 0x9bdb, 0x4ee3, 0x53f0, 0x5927, 0x7b2c, + 0x918d, 0x984c, 0x9df9, 0x6edd, 0x7027, 0x5353, 0x5544, 0x5b85, + 0x6258, 0x629e, 0x62d3, 0x6ca2, 0x6fef, 0x7422, 0x8a17, 0x9438, + 0x6fc1, 0x8afe, 0x8338, 0x51e7, 0x86f8, 0x53ea, + }, + { + 0x53e9, 0x4f46, 0x9054, 0x8fb0, 0x596a, 0x8131, 0x5dfd, 0x7aea, + 0x8fbf, 0x68da, 0x8c37, 0x72f8, 0x9c48, 0x6a3d, 0x8ab0, 0x4e39, + 0x5358, 0x5606, 0x5766, 0x62c5, 0x63a2, 0x65e6, 0x6b4e, 0x6de1, + 0x6e5b, 0x70ad, 0x77ed, 0x7aef, 0x7baa, 0x7dbb, 0x803d, 0x80c6, + 0x86cb, 0x8a95, 0x935b, 0x56e3, 0x58c7, 0x5f3e, 0x65ad, 0x6696, + 0x6a80, 0x6bb5, 0x7537, 0x8ac7, 0x5024, 0x77e5, 0x5730, 0x5f1b, + 0x6065, 0x667a, 0x6c60, 0x75f4, 0x7a1a, 0x7f6e, 0x81f4, 0x8718, + 0x9045, 0x99b3, 0x7bc9, 0x755c, 0x7af9, 0x7b51, 0x84c4, 0x9010, + 0x79e9, 0x7a92, 0x8336, 0x5ae1, 0x7740, 0x4e2d, 0x4ef2, 0x5b99, + 0x5fe0, 0x62bd, 0x663c, 0x67f1, 0x6ce8, 0x866b, 0x8877, 0x8a3b, + 0x914e, 0x92f3, 0x99d0, 0x6a17, 0x7026, 0x732a, 0x82e7, 0x8457, + 0x8caf, 0x4e01, 0x5146, 0x51cb, 0x558b, 0x5bf5, + }, + { + 0x5e16, 0x5e33, 0x5e81, 0x5f14, 0x5f35, 0x5f6b, 0x5fb4, 0x61f2, + 0x6311, 0x66a2, 0x671d, 0x6f6e, 0x7252, 0x753a, 0x773a, 0x8074, + 0x8139, 0x8178, 0x8776, 0x8abf, 0x8adc, 0x8d85, 0x8df3, 0x929a, + 0x9577, 0x9802, 0x9ce5, 0x52c5, 0x6357, 0x76f4, 0x6715, 0x6c88, + 0x73cd, 0x8cc3, 0x93ae, 0x9673, 0x6d25, 0x589c, 0x690e, 0x69cc, + 0x8ffd, 0x939a, 0x75db, 0x901a, 0x585a, 0x6802, 0x63b4, 0x69fb, + 0x4f43, 0x6f2c, 0x67d8, 0x8fbb, 0x8526, 0x7db4, 0x9354, 0x693f, + 0x6f70, 0x576a, 0x58f7, 0x5b2c, 0x7d2c, 0x722a, 0x540a, 0x91e3, + 0x9db4, 0x4ead, 0x4f4e, 0x505c, 0x5075, 0x5243, 0x8c9e, 0x5448, + 0x5824, 0x5b9a, 0x5e1d, 0x5e95, 0x5ead, 0x5ef7, 0x5f1f, 0x608c, + 0x62b5, 0x633a, 0x63d0, 0x68af, 0x6c40, 0x7887, 0x798e, 0x7a0b, + 0x7de0, 0x8247, 0x8a02, 0x8ae6, 0x8e44, 0x9013, + }, + { + 0x90b8, 0x912d, 0x91d8, 0x9f0e, 0x6ce5, 0x6458, 0x64e2, 0x6575, + 0x6ef4, 0x7684, 0x7b1b, 0x9069, 0x93d1, 0x6eba, 0x54f2, 0x5fb9, + 0x64a4, 0x8f4d, 0x8fed, 0x9244, 0x5178, 0x586b, 0x5929, 0x5c55, + 0x5e97, 0x6dfb, 0x7e8f, 0x751c, 0x8cbc, 0x8ee2, 0x985b, 0x70b9, + 0x4f1d, 0x6bbf, 0x6fb1, 0x7530, 0x96fb, 0x514e, 0x5410, 0x5835, + 0x5857, 0x59ac, 0x5c60, 0x5f92, 0x6597, 0x675c, 0x6e21, 0x767b, + 0x83df, 0x8ced, 0x9014, 0x90fd, 0x934d, 0x7825, 0x783a, 0x52aa, + 0x5ea6, 0x571f, 0x5974, 0x6012, 0x5012, 0x515a, 0x51ac, 0x51cd, + 0x5200, 0x5510, 0x5854, 0x5858, 0x5957, 0x5b95, 0x5cf6, 0x5d8b, + 0x60bc, 0x6295, 0x642d, 0x6771, 0x6843, 0x68bc, 0x68df, 0x76d7, + 0x6dd8, 0x6e6f, 0x6d9b, 0x706f, 0x71c8, 0x5f53, 0x75d8, 0x7977, + 0x7b49, 0x7b54, 0x7b52, 0x7cd6, 0x7d71, 0x5230, + }, + { + 0x8463, 0x8569, 0x85e4, 0x8a0e, 0x8b04, 0x8c46, 0x8e0f, 0x9003, + 0x900f, 0x9419, 0x9676, 0x982d, 0x9a30, 0x95d8, 0x50cd, 0x52d5, + 0x540c, 0x5802, 0x5c0e, 0x61a7, 0x649e, 0x6d1e, 0x77b3, 0x7ae5, + 0x80f4, 0x8404, 0x9053, 0x9285, 0x5ce0, 0x9d07, 0x533f, 0x5f97, + 0x5fb3, 0x6d9c, 0x7279, 0x7763, 0x79bf, 0x7be4, 0x6bd2, 0x72ec, + 0x8aad, 0x6803, 0x6a61, 0x51f8, 0x7a81, 0x6934, 0x5c4a, 0x9cf6, + 0x82eb, 0x5bc5, 0x9149, 0x701e, 0x5678, 0x5c6f, 0x60c7, 0x6566, + 0x6c8c, 0x8c5a, 0x9041, 0x9813, 0x5451, 0x66c7, 0x920d, 0x5948, + 0x90a3, 0x5185, 0x4e4d, 0x51ea, 0x8599, 0x8b0e, 0x7058, 0x637a, + 0x934b, 0x6962, 0x99b4, 0x7e04, 0x7577, 0x5357, 0x6960, 0x8edf, + 0x96e3, 0x6c5d, 0x4e8c, 0x5c3c, 0x5f10, 0x8fe9, 0x5302, 0x8cd1, + 0x8089, 0x8679, 0x5eff, 0x65e5, 0x4e73, 0x5165, + }, + { + 0x5982, 0x5c3f, 0x97ee, 0x4efb, 0x598a, 0x5fcd, 0x8a8d, 0x6fe1, + 0x79b0, 0x7962, 0x5be7, 0x8471, 0x732b, 0x71b1, 0x5e74, 0x5ff5, + 0x637b, 0x649a, 0x71c3, 0x7c98, 0x4e43, 0x5efc, 0x4e4b, 0x57dc, + 0x56a2, 0x60a9, 0x6fc3, 0x7d0d, 0x80fd, 0x8133, 0x81bf, 0x8fb2, + 0x8997, 0x86a4, 0x5df4, 0x628a, 0x64ad, 0x8987, 0x6777, 0x6ce2, + 0x6d3e, 0x7436, 0x7834, 0x5a46, 0x7f75, 0x82ad, 0x99ac, 0x4ff3, + 0x5ec3, 0x62dd, 0x6392, 0x6557, 0x676f, 0x76c3, 0x724c, 0x80cc, + 0x80ba, 0x8f29, 0x914d, 0x500d, 0x57f9, 0x5a92, 0x6885, 0x6973, + 0x7164, 0x72fd, 0x8cb7, 0x58f2, 0x8ce0, 0x966a, 0x9019, 0x877f, + 0x79e4, 0x77e7, 0x8429, 0x4f2f, 0x5265, 0x535a, 0x62cd, 0x67cf, + 0x6cca, 0x767d, 0x7b94, 0x7c95, 0x8236, 0x8584, 0x8feb, 0x66dd, + 0x6f20, 0x7206, 0x7e1b, 0x83ab, 0x99c1, 0x9ea6, + }, + { + 0x51fd, 0x7bb1, 0x7872, 0x7bb8, 0x8087, 0x7b48, 0x6ae8, 0x5e61, + 0x808c, 0x7551, 0x7560, 0x516b, 0x9262, 0x6e8c, 0x767a, 0x9197, + 0x9aea, 0x4f10, 0x7f70, 0x629c, 0x7b4f, 0x95a5, 0x9ce9, 0x567a, + 0x5859, 0x86e4, 0x96bc, 0x4f34, 0x5224, 0x534a, 0x53cd, 0x53db, + 0x5e06, 0x642c, 0x6591, 0x677f, 0x6c3e, 0x6c4e, 0x7248, 0x72af, + 0x73ed, 0x7554, 0x7e41, 0x822c, 0x85e9, 0x8ca9, 0x7bc4, 0x91c6, + 0x7169, 0x9812, 0x98ef, 0x633d, 0x6669, 0x756a, 0x76e4, 0x78d0, + 0x8543, 0x86ee, 0x532a, 0x5351, 0x5426, 0x5983, 0x5e87, 0x5f7c, + 0x60b2, 0x6249, 0x6279, 0x62ab, 0x6590, 0x6bd4, 0x6ccc, 0x75b2, + 0x76ae, 0x7891, 0x79d8, 0x7dcb, 0x7f77, 0x80a5, 0x88ab, 0x8ab9, + 0x8cbb, 0x907f, 0x975e, 0x98db, 0x6a0b, 0x7c38, 0x5099, 0x5c3e, + 0x5fae, 0x6787, 0x6bd8, 0x7435, 0x7709, 0x7f8e, + }, + { + 0x9f3b, 0x67ca, 0x7a17, 0x5339, 0x758b, 0x9aed, 0x5f66, 0x819d, + 0x83f1, 0x8098, 0x5f3c, 0x5fc5, 0x7562, 0x7b46, 0x903c, 0x6867, + 0x59eb, 0x5a9b, 0x7d10, 0x767e, 0x8b2c, 0x4ff5, 0x5f6a, 0x6a19, + 0x6c37, 0x6f02, 0x74e2, 0x7968, 0x8868, 0x8a55, 0x8c79, 0x5edf, + 0x63cf, 0x75c5, 0x79d2, 0x82d7, 0x9328, 0x92f2, 0x849c, 0x86ed, + 0x9c2d, 0x54c1, 0x5f6c, 0x658c, 0x6d5c, 0x7015, 0x8ca7, 0x8cd3, + 0x983b, 0x654f, 0x74f6, 0x4e0d, 0x4ed8, 0x57e0, 0x592b, 0x5a66, + 0x5bcc, 0x51a8, 0x5e03, 0x5e9c, 0x6016, 0x6276, 0x6577, 0x65a7, + 0x666e, 0x6d6e, 0x7236, 0x7b26, 0x8150, 0x819a, 0x8299, 0x8b5c, + 0x8ca0, 0x8ce6, 0x8d74, 0x961c, 0x9644, 0x4fae, 0x64ab, 0x6b66, + 0x821e, 0x8461, 0x856a, 0x90e8, 0x5c01, 0x6953, 0x98a8, 0x847a, + 0x8557, 0x4f0f, 0x526f, 0x5fa9, 0x5e45, 0x670d, + }, + { + 0x798f, 0x8179, 0x8907, 0x8986, 0x6df5, 0x5f17, 0x6255, 0x6cb8, + 0x4ecf, 0x7269, 0x9b92, 0x5206, 0x543b, 0x5674, 0x58b3, 0x61a4, + 0x626e, 0x711a, 0x596e, 0x7c89, 0x7cde, 0x7d1b, 0x96f0, 0x6587, + 0x805e, 0x4e19, 0x4f75, 0x5175, 0x5840, 0x5e63, 0x5e73, 0x5f0a, + 0x67c4, 0x4e26, 0x853d, 0x9589, 0x965b, 0x7c73, 0x9801, 0x50fb, + 0x58c1, 0x7656, 0x78a7, 0x5225, 0x77a5, 0x8511, 0x7b86, 0x504f, + 0x5909, 0x7247, 0x7bc7, 0x7de8, 0x8fba, 0x8fd4, 0x904d, 0x4fbf, + 0x52c9, 0x5a29, 0x5f01, 0x97ad, 0x4fdd, 0x8217, 0x92ea, 0x5703, + 0x6355, 0x6b69, 0x752b, 0x88dc, 0x8f14, 0x7a42, 0x52df, 0x5893, + 0x6155, 0x620a, 0x66ae, 0x6bcd, 0x7c3f, 0x83e9, 0x5023, 0x4ff8, + 0x5305, 0x5446, 0x5831, 0x5949, 0x5b9d, 0x5cf0, 0x5cef, 0x5d29, + 0x5e96, 0x62b1, 0x6367, 0x653e, 0x65b9, 0x670b, + }, + { + 0x6cd5, 0x6ce1, 0x70f9, 0x7832, 0x7e2b, 0x80de, 0x82b3, 0x840c, + 0x84ec, 0x8702, 0x8912, 0x8a2a, 0x8c4a, 0x90a6, 0x92d2, 0x98fd, + 0x9cf3, 0x9d6c, 0x4e4f, 0x4ea1, 0x508d, 0x5256, 0x574a, 0x59a8, + 0x5e3d, 0x5fd8, 0x5fd9, 0x623f, 0x66b4, 0x671b, 0x67d0, 0x68d2, + 0x5192, 0x7d21, 0x80aa, 0x81a8, 0x8b00, 0x8c8c, 0x8cbf, 0x927e, + 0x9632, 0x5420, 0x982c, 0x5317, 0x50d5, 0x535c, 0x58a8, 0x64b2, + 0x6734, 0x7267, 0x7766, 0x7a46, 0x91e6, 0x52c3, 0x6ca1, 0x6b86, + 0x5800, 0x5e4c, 0x5954, 0x672c, 0x7ffb, 0x51e1, 0x76c6, 0x6469, + 0x78e8, 0x9b54, 0x9ebb, 0x57cb, 0x59b9, 0x6627, 0x679a, 0x6bce, + 0x54e9, 0x69d9, 0x5e55, 0x819c, 0x6795, 0x9baa, 0x67fe, 0x9c52, + 0x685d, 0x4ea6, 0x4fe3, 0x53c8, 0x62b9, 0x672b, 0x6cab, 0x8fc4, + 0x4fad, 0x7e6d, 0x9ebf, 0x4e07, 0x6162, 0x6e80, + }, + { + 0x6f2b, 0x8513, 0x5473, 0x672a, 0x9b45, 0x5df3, 0x7b95, 0x5cac, + 0x5bc6, 0x871c, 0x6e4a, 0x84d1, 0x7a14, 0x8108, 0x5999, 0x7c8d, + 0x6c11, 0x7720, 0x52d9, 0x5922, 0x7121, 0x725f, 0x77db, 0x9727, + 0x9d61, 0x690b, 0x5a7f, 0x5a18, 0x51a5, 0x540d, 0x547d, 0x660e, + 0x76df, 0x8ff7, 0x9298, 0x9cf4, 0x59ea, 0x725d, 0x6ec5, 0x514d, + 0x68c9, 0x7dbf, 0x7dec, 0x9762, 0x9eba, 0x6478, 0x6a21, 0x8302, + 0x5984, 0x5b5f, 0x6bdb, 0x731b, 0x76f2, 0x7db2, 0x8017, 0x8499, + 0x5132, 0x6728, 0x9ed9, 0x76ee, 0x6762, 0x52ff, 0x9905, 0x5c24, + 0x623b, 0x7c7e, 0x8cb0, 0x554f, 0x60b6, 0x7d0b, 0x9580, 0x5301, + 0x4e5f, 0x51b6, 0x591c, 0x723a, 0x8036, 0x91ce, 0x5f25, 0x77e2, + 0x5384, 0x5f79, 0x7d04, 0x85ac, 0x8a33, 0x8e8d, 0x9756, 0x67f3, + 0x85ae, 0x9453, 0x6109, 0x6108, 0x6cb9, 0x7652, + }, + { + 0x8aed, 0x8f38, 0x552f, 0x4f51, 0x512a, 0x52c7, 0x53cb, 0x5ba5, + 0x5e7d, 0x60a0, 0x6182, 0x63d6, 0x6709, 0x67da, 0x6e67, 0x6d8c, + 0x7336, 0x7337, 0x7531, 0x7950, 0x88d5, 0x8a98, 0x904a, 0x9091, + 0x90f5, 0x96c4, 0x878d, 0x5915, 0x4e88, 0x4f59, 0x4e0e, 0x8a89, + 0x8f3f, 0x9810, 0x50ad, 0x5e7c, 0x5996, 0x5bb9, 0x5eb8, 0x63da, + 0x63fa, 0x64c1, 0x66dc, 0x694a, 0x69d8, 0x6d0b, 0x6eb6, 0x7194, + 0x7528, 0x7aaf, 0x7f8a, 0x8000, 0x8449, 0x84c9, 0x8981, 0x8b21, + 0x8e0a, 0x9065, 0x967d, 0x990a, 0x617e, 0x6291, 0x6b32, 0x6c83, + 0x6d74, 0x7fcc, 0x7ffc, 0x6dc0, 0x7f85, 0x87ba, 0x88f8, 0x6765, + 0x83b1, 0x983c, 0x96f7, 0x6d1b, 0x7d61, 0x843d, 0x916a, 0x4e71, + 0x5375, 0x5d50, 0x6b04, 0x6feb, 0x85cd, 0x862d, 0x89a7, 0x5229, + 0x540f, 0x5c65, 0x674e, 0x68a8, 0x7406, 0x7483, + }, + { + 0x75e2, 0x88cf, 0x88e1, 0x91cc, 0x96e2, 0x9678, 0x5f8b, 0x7387, + 0x7acb, 0x844e, 0x63a0, 0x7565, 0x5289, 0x6d41, 0x6e9c, 0x7409, + 0x7559, 0x786b, 0x7c92, 0x9686, 0x7adc, 0x9f8d, 0x4fb6, 0x616e, + 0x65c5, 0x865c, 0x4e86, 0x4eae, 0x50da, 0x4e21, 0x51cc, 0x5bee, + 0x6599, 0x6881, 0x6dbc, 0x731f, 0x7642, 0x77ad, 0x7a1c, 0x7ce7, + 0x826f, 0x8ad2, 0x907c, 0x91cf, 0x9675, 0x9818, 0x529b, 0x7dd1, + 0x502b, 0x5398, 0x6797, 0x6dcb, 0x71d0, 0x7433, 0x81e8, 0x8f2a, + 0x96a3, 0x9c57, 0x9e9f, 0x7460, 0x5841, 0x6d99, 0x7d2f, 0x985e, + 0x4ee4, 0x4f36, 0x4f8b, 0x51b7, 0x52b1, 0x5dba, 0x601c, 0x73b2, + 0x793c, 0x82d3, 0x9234, 0x96b7, 0x96f6, 0x970a, 0x9e97, 0x9f62, + 0x66a6, 0x6b74, 0x5217, 0x52a3, 0x70c8, 0x88c2, 0x5ec9, 0x604b, + 0x6190, 0x6f23, 0x7149, 0x7c3e, 0x7df4, 0x806f, + }, + { + 0x84ee, 0x9023, 0x932c, 0x5442, 0x9b6f, 0x6ad3, 0x7089, 0x8cc2, + 0x8def, 0x9732, 0x52b4, 0x5a41, 0x5eca, 0x5f04, 0x6717, 0x697c, + 0x6994, 0x6d6a, 0x6f0f, 0x7262, 0x72fc, 0x7bed, 0x8001, 0x807e, + 0x874b, 0x90ce, 0x516d, 0x9e93, 0x7984, 0x808b, 0x9332, 0x8ad6, + 0x502d, 0x548c, 0x8a71, 0x6b6a, 0x8cc4, 0x8107, 0x60d1, 0x67a0, + 0x9df2, 0x4e99, 0x4e98, 0x9c10, 0x8a6b, 0x85c1, 0x8568, 0x6900, + 0x6e7e, 0x7897, 0x8155, + }, + { + 0x5f0c, 0x4e10, 0x4e15, 0x4e2a, 0x4e31, 0x4e36, 0x4e3c, 0x4e3f, + 0x4e42, 0x4e56, 0x4e58, 0x4e82, 0x4e85, 0x8c6b, 0x4e8a, 0x8212, + 0x5f0d, 0x4e8e, 0x4e9e, 0x4e9f, 0x4ea0, 0x4ea2, 0x4eb0, 0x4eb3, + 0x4eb6, 0x4ece, 0x4ecd, 0x4ec4, 0x4ec6, 0x4ec2, 0x4ed7, 0x4ede, + 0x4eed, 0x4edf, 0x4ef7, 0x4f09, 0x4f5a, 0x4f30, 0x4f5b, 0x4f5d, + 0x4f57, 0x4f47, 0x4f76, 0x4f88, 0x4f8f, 0x4f98, 0x4f7b, 0x4f69, + 0x4f70, 0x4f91, 0x4f6f, 0x4f86, 0x4f96, 0x5118, 0x4fd4, 0x4fdf, + 0x4fce, 0x4fd8, 0x4fdb, 0x4fd1, 0x4fda, 0x4fd0, 0x4fe4, 0x4fe5, + 0x501a, 0x5028, 0x5014, 0x502a, 0x5025, 0x5005, 0x4f1c, 0x4ff6, + 0x5021, 0x5029, 0x502c, 0x4ffe, 0x4fef, 0x5011, 0x5006, 0x5043, + 0x5047, 0x6703, 0x5055, 0x5050, 0x5048, 0x505a, 0x5056, 0x506c, + 0x5078, 0x5080, 0x509a, 0x5085, 0x50b4, 0x50b2, + }, + { + 0x50c9, 0x50ca, 0x50b3, 0x50c2, 0x50d6, 0x50de, 0x50e5, 0x50ed, + 0x50e3, 0x50ee, 0x50f9, 0x50f5, 0x5109, 0x5101, 0x5102, 0x5116, + 0x5115, 0x5114, 0x511a, 0x5121, 0x513a, 0x5137, 0x513c, 0x513b, + 0x513f, 0x5140, 0x5152, 0x514c, 0x5154, 0x5162, 0x7af8, 0x5169, + 0x516a, 0x516e, 0x5180, 0x5182, 0x56d8, 0x518c, 0x5189, 0x518f, + 0x5191, 0x5193, 0x5195, 0x5196, 0x51a4, 0x51a6, 0x51a2, 0x51a9, + 0x51aa, 0x51ab, 0x51b3, 0x51b1, 0x51b2, 0x51b0, 0x51b5, 0x51bd, + 0x51c5, 0x51c9, 0x51db, 0x51e0, 0x8655, 0x51e9, 0x51ed, 0x51f0, + 0x51f5, 0x51fe, 0x5204, 0x520b, 0x5214, 0x520e, 0x5227, 0x522a, + 0x522e, 0x5233, 0x5239, 0x524f, 0x5244, 0x524b, 0x524c, 0x525e, + 0x5254, 0x526a, 0x5274, 0x5269, 0x5273, 0x527f, 0x527d, 0x528d, + 0x5294, 0x5292, 0x5271, 0x5288, 0x5291, 0x8fa8, + }, + { + 0x8fa7, 0x52ac, 0x52ad, 0x52bc, 0x52b5, 0x52c1, 0x52cd, 0x52d7, + 0x52de, 0x52e3, 0x52e6, 0x98ed, 0x52e0, 0x52f3, 0x52f5, 0x52f8, + 0x52f9, 0x5306, 0x5308, 0x7538, 0x530d, 0x5310, 0x530f, 0x5315, + 0x531a, 0x5323, 0x532f, 0x5331, 0x5333, 0x5338, 0x5340, 0x5346, + 0x5345, 0x4e17, 0x5349, 0x534d, 0x51d6, 0x535e, 0x5369, 0x536e, + 0x5918, 0x537b, 0x5377, 0x5382, 0x5396, 0x53a0, 0x53a6, 0x53a5, + 0x53ae, 0x53b0, 0x53b6, 0x53c3, 0x7c12, 0x96d9, 0x53df, 0x66fc, + 0x71ee, 0x53ee, 0x53e8, 0x53ed, 0x53fa, 0x5401, 0x543d, 0x5440, + 0x542c, 0x542d, 0x543c, 0x542e, 0x5436, 0x5429, 0x541d, 0x544e, + 0x548f, 0x5475, 0x548e, 0x545f, 0x5471, 0x5477, 0x5470, 0x5492, + 0x547b, 0x5480, 0x5476, 0x5484, 0x5490, 0x5486, 0x54c7, 0x54a2, + 0x54b8, 0x54a5, 0x54ac, 0x54c4, 0x54c8, 0x54a8, + }, + { + 0x54ab, 0x54c2, 0x54a4, 0x54be, 0x54bc, 0x54d8, 0x54e5, 0x54e6, + 0x550f, 0x5514, 0x54fd, 0x54ee, 0x54ed, 0x54fa, 0x54e2, 0x5539, + 0x5540, 0x5563, 0x554c, 0x552e, 0x555c, 0x5545, 0x5556, 0x5557, + 0x5538, 0x5533, 0x555d, 0x5599, 0x5580, 0x54af, 0x558a, 0x559f, + 0x557b, 0x557e, 0x5598, 0x559e, 0x55ae, 0x557c, 0x5583, 0x55a9, + 0x5587, 0x55a8, 0x55da, 0x55c5, 0x55df, 0x55c4, 0x55dc, 0x55e4, + 0x55d4, 0x5614, 0x55f7, 0x5616, 0x55fe, 0x55fd, 0x561b, 0x55f9, + 0x564e, 0x5650, 0x71df, 0x5634, 0x5636, 0x5632, 0x5638, 0x566b, + 0x5664, 0x562f, 0x566c, 0x566a, 0x5686, 0x5680, 0x568a, 0x56a0, + 0x5694, 0x568f, 0x56a5, 0x56ae, 0x56b6, 0x56b4, 0x56c2, 0x56bc, + 0x56c1, 0x56c3, 0x56c0, 0x56c8, 0x56ce, 0x56d1, 0x56d3, 0x56d7, + 0x56ee, 0x56f9, 0x5700, 0x56ff, 0x5704, 0x5709, + }, + { + 0x5708, 0x570b, 0x570d, 0x5713, 0x5718, 0x5716, 0x55c7, 0x571c, + 0x5726, 0x5737, 0x5738, 0x574e, 0x573b, 0x5740, 0x574f, 0x5769, + 0x57c0, 0x5788, 0x5761, 0x577f, 0x5789, 0x5793, 0x57a0, 0x57b3, + 0x57a4, 0x57aa, 0x57b0, 0x57c3, 0x57c6, 0x57d4, 0x57d2, 0x57d3, + 0x580a, 0x57d6, 0x57e3, 0x580b, 0x5819, 0x581d, 0x5872, 0x5821, + 0x5862, 0x584b, 0x5870, 0x6bc0, 0x5852, 0x583d, 0x5879, 0x5885, + 0x58b9, 0x589f, 0x58ab, 0x58ba, 0x58de, 0x58bb, 0x58b8, 0x58ae, + 0x58c5, 0x58d3, 0x58d1, 0x58d7, 0x58d9, 0x58d8, 0x58e5, 0x58dc, + 0x58e4, 0x58df, 0x58ef, 0x58fa, 0x58f9, 0x58fb, 0x58fc, 0x58fd, + 0x5902, 0x590a, 0x5910, 0x591b, 0x68a6, 0x5925, 0x592c, 0x592d, + 0x5932, 0x5938, 0x593e, 0x7ad2, 0x5955, 0x5950, 0x594e, 0x595a, + 0x5958, 0x5962, 0x5960, 0x5967, 0x596c, 0x5969, + }, + { + 0x5978, 0x5981, 0x599d, 0x4f5e, 0x4fab, 0x59a3, 0x59b2, 0x59c6, + 0x59e8, 0x59dc, 0x598d, 0x59d9, 0x59da, 0x5a25, 0x5a1f, 0x5a11, + 0x5a1c, 0x5a09, 0x5a1a, 0x5a40, 0x5a6c, 0x5a49, 0x5a35, 0x5a36, + 0x5a62, 0x5a6a, 0x5a9a, 0x5abc, 0x5abe, 0x5acb, 0x5ac2, 0x5abd, + 0x5ae3, 0x5ad7, 0x5ae6, 0x5ae9, 0x5ad6, 0x5afa, 0x5afb, 0x5b0c, + 0x5b0b, 0x5b16, 0x5b32, 0x5ad0, 0x5b2a, 0x5b36, 0x5b3e, 0x5b43, + 0x5b45, 0x5b40, 0x5b51, 0x5b55, 0x5b5a, 0x5b5b, 0x5b65, 0x5b69, + 0x5b70, 0x5b73, 0x5b75, 0x5b78, 0x6588, 0x5b7a, 0x5b80, 0x5b83, + 0x5ba6, 0x5bb8, 0x5bc3, 0x5bc7, 0x5bc9, 0x5bd4, 0x5bd0, 0x5be4, + 0x5be6, 0x5be2, 0x5bde, 0x5be5, 0x5beb, 0x5bf0, 0x5bf6, 0x5bf3, + 0x5c05, 0x5c07, 0x5c08, 0x5c0d, 0x5c13, 0x5c20, 0x5c22, 0x5c28, + 0x5c38, 0x5c39, 0x5c41, 0x5c46, 0x5c4e, 0x5c53, + }, + { + 0x5c50, 0x5c4f, 0x5b71, 0x5c6c, 0x5c6e, 0x4e62, 0x5c76, 0x5c79, + 0x5c8c, 0x5c91, 0x5c94, 0x599b, 0x5cab, 0x5cbb, 0x5cb6, 0x5cbc, + 0x5cb7, 0x5cc5, 0x5cbe, 0x5cc7, 0x5cd9, 0x5ce9, 0x5cfd, 0x5cfa, + 0x5ced, 0x5d8c, 0x5cea, 0x5d0b, 0x5d15, 0x5d17, 0x5d5c, 0x5d1f, + 0x5d1b, 0x5d11, 0x5d14, 0x5d22, 0x5d1a, 0x5d19, 0x5d18, 0x5d4c, + 0x5d52, 0x5d4e, 0x5d4b, 0x5d6c, 0x5d73, 0x5d76, 0x5d87, 0x5d84, + 0x5d82, 0x5da2, 0x5d9d, 0x5dac, 0x5dae, 0x5dbd, 0x5d90, 0x5db7, + 0x5dbc, 0x5dc9, 0x5dcd, 0x5dd3, 0x5dd2, 0x5dd6, 0x5ddb, 0x5deb, + 0x5df2, 0x5df5, 0x5e0b, 0x5e1a, 0x5e19, 0x5e11, 0x5e1b, 0x5e36, + 0x5e37, 0x5e44, 0x5e43, 0x5e40, 0x5e4e, 0x5e57, 0x5e54, 0x5e5f, + 0x5e62, 0x5e64, 0x5e47, 0x5e75, 0x5e76, 0x5e7a, 0x9ebc, 0x5e7f, + 0x5ea0, 0x5ec1, 0x5ec2, 0x5ec8, 0x5ed0, 0x5ecf, + }, + { + 0x5ed6, 0x5ee3, 0x5edd, 0x5eda, 0x5edb, 0x5ee2, 0x5ee1, 0x5ee8, + 0x5ee9, 0x5eec, 0x5ef1, 0x5ef3, 0x5ef0, 0x5ef4, 0x5ef8, 0x5efe, + 0x5f03, 0x5f09, 0x5f5d, 0x5f5c, 0x5f0b, 0x5f11, 0x5f16, 0x5f29, + 0x5f2d, 0x5f38, 0x5f41, 0x5f48, 0x5f4c, 0x5f4e, 0x5f2f, 0x5f51, + 0x5f56, 0x5f57, 0x5f59, 0x5f61, 0x5f6d, 0x5f73, 0x5f77, 0x5f83, + 0x5f82, 0x5f7f, 0x5f8a, 0x5f88, 0x5f91, 0x5f87, 0x5f9e, 0x5f99, + 0x5f98, 0x5fa0, 0x5fa8, 0x5fad, 0x5fbc, 0x5fd6, 0x5ffb, 0x5fe4, + 0x5ff8, 0x5ff1, 0x5fdd, 0x60b3, 0x5fff, 0x6021, 0x6060, 0x6019, + 0x6010, 0x6029, 0x600e, 0x6031, 0x601b, 0x6015, 0x602b, 0x6026, + 0x600f, 0x603a, 0x605a, 0x6041, 0x606a, 0x6077, 0x605f, 0x604a, + 0x6046, 0x604d, 0x6063, 0x6043, 0x6064, 0x6042, 0x606c, 0x606b, + 0x6059, 0x6081, 0x608d, 0x60e7, 0x6083, 0x609a, + }, + { + 0x6084, 0x609b, 0x6096, 0x6097, 0x6092, 0x60a7, 0x608b, 0x60e1, + 0x60b8, 0x60e0, 0x60d3, 0x60b4, 0x5ff0, 0x60bd, 0x60c6, 0x60b5, + 0x60d8, 0x614d, 0x6115, 0x6106, 0x60f6, 0x60f7, 0x6100, 0x60f4, + 0x60fa, 0x6103, 0x6121, 0x60fb, 0x60f1, 0x610d, 0x610e, 0x6147, + 0x613e, 0x6128, 0x6127, 0x614a, 0x613f, 0x613c, 0x612c, 0x6134, + 0x613d, 0x6142, 0x6144, 0x6173, 0x6177, 0x6158, 0x6159, 0x615a, + 0x616b, 0x6174, 0x616f, 0x6165, 0x6171, 0x615f, 0x615d, 0x6153, + 0x6175, 0x6199, 0x6196, 0x6187, 0x61ac, 0x6194, 0x619a, 0x618a, + 0x6191, 0x61ab, 0x61ae, 0x61cc, 0x61ca, 0x61c9, 0x61f7, 0x61c8, + 0x61c3, 0x61c6, 0x61ba, 0x61cb, 0x7f79, 0x61cd, 0x61e6, 0x61e3, + 0x61f6, 0x61fa, 0x61f4, 0x61ff, 0x61fd, 0x61fc, 0x61fe, 0x6200, + 0x6208, 0x6209, 0x620d, 0x620c, 0x6214, 0x621b, + }, + { + 0x621e, 0x6221, 0x622a, 0x622e, 0x6230, 0x6232, 0x6233, 0x6241, + 0x624e, 0x625e, 0x6263, 0x625b, 0x6260, 0x6268, 0x627c, 0x6282, + 0x6289, 0x627e, 0x6292, 0x6293, 0x6296, 0x62d4, 0x6283, 0x6294, + 0x62d7, 0x62d1, 0x62bb, 0x62cf, 0x62ff, 0x62c6, 0x64d4, 0x62c8, + 0x62dc, 0x62cc, 0x62ca, 0x62c2, 0x62c7, 0x629b, 0x62c9, 0x630c, + 0x62ee, 0x62f1, 0x6327, 0x6302, 0x6308, 0x62ef, 0x62f5, 0x6350, + 0x633e, 0x634d, 0x641c, 0x634f, 0x6396, 0x638e, 0x6380, 0x63ab, + 0x6376, 0x63a3, 0x638f, 0x6389, 0x639f, 0x63b5, 0x636b, 0x6369, + 0x63be, 0x63e9, 0x63c0, 0x63c6, 0x63e3, 0x63c9, 0x63d2, 0x63f6, + 0x63c4, 0x6416, 0x6434, 0x6406, 0x6413, 0x6426, 0x6436, 0x651d, + 0x6417, 0x6428, 0x640f, 0x6467, 0x646f, 0x6476, 0x644e, 0x652a, + 0x6495, 0x6493, 0x64a5, 0x64a9, 0x6488, 0x64bc, + }, + { + 0x64da, 0x64d2, 0x64c5, 0x64c7, 0x64bb, 0x64d8, 0x64c2, 0x64f1, + 0x64e7, 0x8209, 0x64e0, 0x64e1, 0x62ac, 0x64e3, 0x64ef, 0x652c, + 0x64f6, 0x64f4, 0x64f2, 0x64fa, 0x6500, 0x64fd, 0x6518, 0x651c, + 0x6505, 0x6524, 0x6523, 0x652b, 0x6534, 0x6535, 0x6537, 0x6536, + 0x6538, 0x754b, 0x6548, 0x6556, 0x6555, 0x654d, 0x6558, 0x655e, + 0x655d, 0x6572, 0x6578, 0x6582, 0x6583, 0x8b8a, 0x659b, 0x659f, + 0x65ab, 0x65b7, 0x65c3, 0x65c6, 0x65c1, 0x65c4, 0x65cc, 0x65d2, + 0x65db, 0x65d9, 0x65e0, 0x65e1, 0x65f1, 0x6772, 0x660a, 0x6603, + 0x65fb, 0x6773, 0x6635, 0x6636, 0x6634, 0x661c, 0x664f, 0x6644, + 0x6649, 0x6641, 0x665e, 0x665d, 0x6664, 0x6667, 0x6668, 0x665f, + 0x6662, 0x6670, 0x6683, 0x6688, 0x668e, 0x6689, 0x6684, 0x6698, + 0x669d, 0x66c1, 0x66b9, 0x66c9, 0x66be, 0x66bc, + }, + { + 0x66c4, 0x66b8, 0x66d6, 0x66da, 0x66e0, 0x663f, 0x66e6, 0x66e9, + 0x66f0, 0x66f5, 0x66f7, 0x670f, 0x6716, 0x671e, 0x6726, 0x6727, + 0x9738, 0x672e, 0x673f, 0x6736, 0x6741, 0x6738, 0x6737, 0x6746, + 0x675e, 0x6760, 0x6759, 0x6763, 0x6764, 0x6789, 0x6770, 0x67a9, + 0x677c, 0x676a, 0x678c, 0x678b, 0x67a6, 0x67a1, 0x6785, 0x67b7, + 0x67ef, 0x67b4, 0x67ec, 0x67b3, 0x67e9, 0x67b8, 0x67e4, 0x67de, + 0x67dd, 0x67e2, 0x67ee, 0x67b9, 0x67ce, 0x67c6, 0x67e7, 0x6a9c, + 0x681e, 0x6846, 0x6829, 0x6840, 0x684d, 0x6832, 0x684e, 0x68b3, + 0x682b, 0x6859, 0x6863, 0x6877, 0x687f, 0x689f, 0x688f, 0x68ad, + 0x6894, 0x689d, 0x689b, 0x6883, 0x6aae, 0x68b9, 0x6874, 0x68b5, + 0x68a0, 0x68ba, 0x690f, 0x688d, 0x687e, 0x6901, 0x68ca, 0x6908, + 0x68d8, 0x6922, 0x6926, 0x68e1, 0x690c, 0x68cd, + }, + { + 0x68d4, 0x68e7, 0x68d5, 0x6936, 0x6912, 0x6904, 0x68d7, 0x68e3, + 0x6925, 0x68f9, 0x68e0, 0x68ef, 0x6928, 0x692a, 0x691a, 0x6923, + 0x6921, 0x68c6, 0x6979, 0x6977, 0x695c, 0x6978, 0x696b, 0x6954, + 0x697e, 0x696e, 0x6939, 0x6974, 0x693d, 0x6959, 0x6930, 0x6961, + 0x695e, 0x695d, 0x6981, 0x696a, 0x69b2, 0x69ae, 0x69d0, 0x69bf, + 0x69c1, 0x69d3, 0x69be, 0x69ce, 0x5be8, 0x69ca, 0x69dd, 0x69bb, + 0x69c3, 0x69a7, 0x6a2e, 0x6991, 0x69a0, 0x699c, 0x6995, 0x69b4, + 0x69de, 0x69e8, 0x6a02, 0x6a1b, 0x69ff, 0x6b0a, 0x69f9, 0x69f2, + 0x69e7, 0x6a05, 0x69b1, 0x6a1e, 0x69ed, 0x6a14, 0x69eb, 0x6a0a, + 0x6a12, 0x6ac1, 0x6a23, 0x6a13, 0x6a44, 0x6a0c, 0x6a72, 0x6a36, + 0x6a78, 0x6a47, 0x6a62, 0x6a59, 0x6a66, 0x6a48, 0x6a38, 0x6a22, + 0x6a90, 0x6a8d, 0x6aa0, 0x6a84, 0x6aa2, 0x6aa3, + }, + { + 0x6a97, 0x8617, 0x6abb, 0x6ac3, 0x6ac2, 0x6ab8, 0x6ab3, 0x6aac, + 0x6ade, 0x6ad1, 0x6adf, 0x6aaa, 0x6ada, 0x6aea, 0x6afb, 0x6b05, + 0x8616, 0x6afa, 0x6b12, 0x6b16, 0x9b31, 0x6b1f, 0x6b38, 0x6b37, + 0x76dc, 0x6b39, 0x98ee, 0x6b47, 0x6b43, 0x6b49, 0x6b50, 0x6b59, + 0x6b54, 0x6b5b, 0x6b5f, 0x6b61, 0x6b78, 0x6b79, 0x6b7f, 0x6b80, + 0x6b84, 0x6b83, 0x6b8d, 0x6b98, 0x6b95, 0x6b9e, 0x6ba4, 0x6baa, + 0x6bab, 0x6baf, 0x6bb2, 0x6bb1, 0x6bb3, 0x6bb7, 0x6bbc, 0x6bc6, + 0x6bcb, 0x6bd3, 0x6bdf, 0x6bec, 0x6beb, 0x6bf3, 0x6bef, 0x9ebe, + 0x6c08, 0x6c13, 0x6c14, 0x6c1b, 0x6c24, 0x6c23, 0x6c5e, 0x6c55, + 0x6c62, 0x6c6a, 0x6c82, 0x6c8d, 0x6c9a, 0x6c81, 0x6c9b, 0x6c7e, + 0x6c68, 0x6c73, 0x6c92, 0x6c90, 0x6cc4, 0x6cf1, 0x6cd3, 0x6cbd, + 0x6cd7, 0x6cc5, 0x6cdd, 0x6cae, 0x6cb1, 0x6cbe, + }, + { + 0x6cba, 0x6cdb, 0x6cef, 0x6cd9, 0x6cea, 0x6d1f, 0x884d, 0x6d36, + 0x6d2b, 0x6d3d, 0x6d38, 0x6d19, 0x6d35, 0x6d33, 0x6d12, 0x6d0c, + 0x6d63, 0x6d93, 0x6d64, 0x6d5a, 0x6d79, 0x6d59, 0x6d8e, 0x6d95, + 0x6fe4, 0x6d85, 0x6df9, 0x6e15, 0x6e0a, 0x6db5, 0x6dc7, 0x6de6, + 0x6db8, 0x6dc6, 0x6dec, 0x6dde, 0x6dcc, 0x6de8, 0x6dd2, 0x6dc5, + 0x6dfa, 0x6dd9, 0x6de4, 0x6dd5, 0x6dea, 0x6dee, 0x6e2d, 0x6e6e, + 0x6e2e, 0x6e19, 0x6e72, 0x6e5f, 0x6e3e, 0x6e23, 0x6e6b, 0x6e2b, + 0x6e76, 0x6e4d, 0x6e1f, 0x6e43, 0x6e3a, 0x6e4e, 0x6e24, 0x6eff, + 0x6e1d, 0x6e38, 0x6e82, 0x6eaa, 0x6e98, 0x6ec9, 0x6eb7, 0x6ed3, + 0x6ebd, 0x6eaf, 0x6ec4, 0x6eb2, 0x6ed4, 0x6ed5, 0x6e8f, 0x6ea5, + 0x6ec2, 0x6e9f, 0x6f41, 0x6f11, 0x704c, 0x6eec, 0x6ef8, 0x6efe, + 0x6f3f, 0x6ef2, 0x6f31, 0x6eef, 0x6f32, 0x6ecc, + }, + { + 0x6f3e, 0x6f13, 0x6ef7, 0x6f86, 0x6f7a, 0x6f78, 0x6f81, 0x6f80, + 0x6f6f, 0x6f5b, 0x6ff3, 0x6f6d, 0x6f82, 0x6f7c, 0x6f58, 0x6f8e, + 0x6f91, 0x6fc2, 0x6f66, 0x6fb3, 0x6fa3, 0x6fa1, 0x6fa4, 0x6fb9, + 0x6fc6, 0x6faa, 0x6fdf, 0x6fd5, 0x6fec, 0x6fd4, 0x6fd8, 0x6ff1, + 0x6fee, 0x6fdb, 0x7009, 0x700b, 0x6ffa, 0x7011, 0x7001, 0x700f, + 0x6ffe, 0x701b, 0x701a, 0x6f74, 0x701d, 0x7018, 0x701f, 0x7030, + 0x703e, 0x7032, 0x7051, 0x7063, 0x7099, 0x7092, 0x70af, 0x70f1, + 0x70ac, 0x70b8, 0x70b3, 0x70ae, 0x70df, 0x70cb, 0x70dd, 0x70d9, + 0x7109, 0x70fd, 0x711c, 0x7119, 0x7165, 0x7155, 0x7188, 0x7166, + 0x7162, 0x714c, 0x7156, 0x716c, 0x718f, 0x71fb, 0x7184, 0x7195, + 0x71a8, 0x71ac, 0x71d7, 0x71b9, 0x71be, 0x71d2, 0x71c9, 0x71d4, + 0x71ce, 0x71e0, 0x71ec, 0x71e7, 0x71f5, 0x71fc, + }, + { + 0x71f9, 0x71ff, 0x720d, 0x7210, 0x721b, 0x7228, 0x722d, 0x722c, + 0x7230, 0x7232, 0x723b, 0x723c, 0x723f, 0x7240, 0x7246, 0x724b, + 0x7258, 0x7274, 0x727e, 0x7282, 0x7281, 0x7287, 0x7292, 0x7296, + 0x72a2, 0x72a7, 0x72b9, 0x72b2, 0x72c3, 0x72c6, 0x72c4, 0x72ce, + 0x72d2, 0x72e2, 0x72e0, 0x72e1, 0x72f9, 0x72f7, 0x500f, 0x7317, + 0x730a, 0x731c, 0x7316, 0x731d, 0x7334, 0x732f, 0x7329, 0x7325, + 0x733e, 0x734e, 0x734f, 0x9ed8, 0x7357, 0x736a, 0x7368, 0x7370, + 0x7378, 0x7375, 0x737b, 0x737a, 0x73c8, 0x73b3, 0x73ce, 0x73bb, + 0x73c0, 0x73e5, 0x73ee, 0x73de, 0x74a2, 0x7405, 0x746f, 0x7425, + 0x73f8, 0x7432, 0x743a, 0x7455, 0x743f, 0x745f, 0x7459, 0x7441, + 0x745c, 0x7469, 0x7470, 0x7463, 0x746a, 0x7476, 0x747e, 0x748b, + 0x749e, 0x74a7, 0x74ca, 0x74cf, 0x74d4, 0x73f1, + }, + { + 0x74e0, 0x74e3, 0x74e7, 0x74e9, 0x74ee, 0x74f2, 0x74f0, 0x74f1, + 0x74f8, 0x74f7, 0x7504, 0x7503, 0x7505, 0x750c, 0x750e, 0x750d, + 0x7515, 0x7513, 0x751e, 0x7526, 0x752c, 0x753c, 0x7544, 0x754d, + 0x754a, 0x7549, 0x755b, 0x7546, 0x755a, 0x7569, 0x7564, 0x7567, + 0x756b, 0x756d, 0x7578, 0x7576, 0x7586, 0x7587, 0x7574, 0x758a, + 0x7589, 0x7582, 0x7594, 0x759a, 0x759d, 0x75a5, 0x75a3, 0x75c2, + 0x75b3, 0x75c3, 0x75b5, 0x75bd, 0x75b8, 0x75bc, 0x75b1, 0x75cd, + 0x75ca, 0x75d2, 0x75d9, 0x75e3, 0x75de, 0x75fe, 0x75ff, 0x75fc, + 0x7601, 0x75f0, 0x75fa, 0x75f2, 0x75f3, 0x760b, 0x760d, 0x7609, + 0x761f, 0x7627, 0x7620, 0x7621, 0x7622, 0x7624, 0x7634, 0x7630, + 0x763b, 0x7647, 0x7648, 0x7646, 0x765c, 0x7658, 0x7661, 0x7662, + 0x7668, 0x7669, 0x766a, 0x7667, 0x766c, 0x7670, + }, + { + 0x7672, 0x7676, 0x7678, 0x767c, 0x7680, 0x7683, 0x7688, 0x768b, + 0x768e, 0x7696, 0x7693, 0x7699, 0x769a, 0x76b0, 0x76b4, 0x76b8, + 0x76b9, 0x76ba, 0x76c2, 0x76cd, 0x76d6, 0x76d2, 0x76de, 0x76e1, + 0x76e5, 0x76e7, 0x76ea, 0x862f, 0x76fb, 0x7708, 0x7707, 0x7704, + 0x7729, 0x7724, 0x771e, 0x7725, 0x7726, 0x771b, 0x7737, 0x7738, + 0x7747, 0x775a, 0x7768, 0x776b, 0x775b, 0x7765, 0x777f, 0x777e, + 0x7779, 0x778e, 0x778b, 0x7791, 0x77a0, 0x779e, 0x77b0, 0x77b6, + 0x77b9, 0x77bf, 0x77bc, 0x77bd, 0x77bb, 0x77c7, 0x77cd, 0x77d7, + 0x77da, 0x77dc, 0x77e3, 0x77ee, 0x77fc, 0x780c, 0x7812, 0x7926, + 0x7820, 0x792a, 0x7845, 0x788e, 0x7874, 0x7886, 0x787c, 0x789a, + 0x788c, 0x78a3, 0x78b5, 0x78aa, 0x78af, 0x78d1, 0x78c6, 0x78cb, + 0x78d4, 0x78be, 0x78bc, 0x78c5, 0x78ca, 0x78ec, + }, + { + 0x78e7, 0x78da, 0x78fd, 0x78f4, 0x7907, 0x7912, 0x7911, 0x7919, + 0x792c, 0x792b, 0x7940, 0x7960, 0x7957, 0x795f, 0x795a, 0x7955, + 0x7953, 0x797a, 0x797f, 0x798a, 0x799d, 0x79a7, 0x9f4b, 0x79aa, + 0x79ae, 0x79b3, 0x79b9, 0x79ba, 0x79c9, 0x79d5, 0x79e7, 0x79ec, + 0x79e1, 0x79e3, 0x7a08, 0x7a0d, 0x7a18, 0x7a19, 0x7a20, 0x7a1f, + 0x7980, 0x7a31, 0x7a3b, 0x7a3e, 0x7a37, 0x7a43, 0x7a57, 0x7a49, + 0x7a61, 0x7a62, 0x7a69, 0x9f9d, 0x7a70, 0x7a79, 0x7a7d, 0x7a88, + 0x7a97, 0x7a95, 0x7a98, 0x7a96, 0x7aa9, 0x7ac8, 0x7ab0, 0x7ab6, + 0x7ac5, 0x7ac4, 0x7abf, 0x9083, 0x7ac7, 0x7aca, 0x7acd, 0x7acf, + 0x7ad5, 0x7ad3, 0x7ad9, 0x7ada, 0x7add, 0x7ae1, 0x7ae2, 0x7ae6, + 0x7aed, 0x7af0, 0x7b02, 0x7b0f, 0x7b0a, 0x7b06, 0x7b33, 0x7b18, + 0x7b19, 0x7b1e, 0x7b35, 0x7b28, 0x7b36, 0x7b50, + }, + { + 0x7b7a, 0x7b04, 0x7b4d, 0x7b0b, 0x7b4c, 0x7b45, 0x7b75, 0x7b65, + 0x7b74, 0x7b67, 0x7b70, 0x7b71, 0x7b6c, 0x7b6e, 0x7b9d, 0x7b98, + 0x7b9f, 0x7b8d, 0x7b9c, 0x7b9a, 0x7b8b, 0x7b92, 0x7b8f, 0x7b5d, + 0x7b99, 0x7bcb, 0x7bc1, 0x7bcc, 0x7bcf, 0x7bb4, 0x7bc6, 0x7bdd, + 0x7be9, 0x7c11, 0x7c14, 0x7be6, 0x7be5, 0x7c60, 0x7c00, 0x7c07, + 0x7c13, 0x7bf3, 0x7bf7, 0x7c17, 0x7c0d, 0x7bf6, 0x7c23, 0x7c27, + 0x7c2a, 0x7c1f, 0x7c37, 0x7c2b, 0x7c3d, 0x7c4c, 0x7c43, 0x7c54, + 0x7c4f, 0x7c40, 0x7c50, 0x7c58, 0x7c5f, 0x7c64, 0x7c56, 0x7c65, + 0x7c6c, 0x7c75, 0x7c83, 0x7c90, 0x7ca4, 0x7cad, 0x7ca2, 0x7cab, + 0x7ca1, 0x7ca8, 0x7cb3, 0x7cb2, 0x7cb1, 0x7cae, 0x7cb9, 0x7cbd, + 0x7cc0, 0x7cc5, 0x7cc2, 0x7cd8, 0x7cd2, 0x7cdc, 0x7ce2, 0x9b3b, + 0x7cef, 0x7cf2, 0x7cf4, 0x7cf6, 0x7cfa, 0x7d06, + }, + { + 0x7d02, 0x7d1c, 0x7d15, 0x7d0a, 0x7d45, 0x7d4b, 0x7d2e, 0x7d32, + 0x7d3f, 0x7d35, 0x7d46, 0x7d73, 0x7d56, 0x7d4e, 0x7d72, 0x7d68, + 0x7d6e, 0x7d4f, 0x7d63, 0x7d93, 0x7d89, 0x7d5b, 0x7d8f, 0x7d7d, + 0x7d9b, 0x7dba, 0x7dae, 0x7da3, 0x7db5, 0x7dc7, 0x7dbd, 0x7dab, + 0x7e3d, 0x7da2, 0x7daf, 0x7ddc, 0x7db8, 0x7d9f, 0x7db0, 0x7dd8, + 0x7ddd, 0x7de4, 0x7dde, 0x7dfb, 0x7df2, 0x7de1, 0x7e05, 0x7e0a, + 0x7e23, 0x7e21, 0x7e12, 0x7e31, 0x7e1f, 0x7e09, 0x7e0b, 0x7e22, + 0x7e46, 0x7e66, 0x7e3b, 0x7e35, 0x7e39, 0x7e43, 0x7e37, 0x7e32, + 0x7e3a, 0x7e67, 0x7e5d, 0x7e56, 0x7e5e, 0x7e59, 0x7e5a, 0x7e79, + 0x7e6a, 0x7e69, 0x7e7c, 0x7e7b, 0x7e83, 0x7dd5, 0x7e7d, 0x8fae, + 0x7e7f, 0x7e88, 0x7e89, 0x7e8c, 0x7e92, 0x7e90, 0x7e93, 0x7e94, + 0x7e96, 0x7e8e, 0x7e9b, 0x7e9c, 0x7f38, 0x7f3a, + }, + { + 0x7f45, 0x7f4c, 0x7f4d, 0x7f4e, 0x7f50, 0x7f51, 0x7f55, 0x7f54, + 0x7f58, 0x7f5f, 0x7f60, 0x7f68, 0x7f69, 0x7f67, 0x7f78, 0x7f82, + 0x7f86, 0x7f83, 0x7f88, 0x7f87, 0x7f8c, 0x7f94, 0x7f9e, 0x7f9d, + 0x7f9a, 0x7fa3, 0x7faf, 0x7fb2, 0x7fb9, 0x7fae, 0x7fb6, 0x7fb8, + 0x8b71, 0x7fc5, 0x7fc6, 0x7fca, 0x7fd5, 0x7fd4, 0x7fe1, 0x7fe6, + 0x7fe9, 0x7ff3, 0x7ff9, 0x98dc, 0x8006, 0x8004, 0x800b, 0x8012, + 0x8018, 0x8019, 0x801c, 0x8021, 0x8028, 0x803f, 0x803b, 0x804a, + 0x8046, 0x8052, 0x8058, 0x805a, 0x805f, 0x8062, 0x8068, 0x8073, + 0x8072, 0x8070, 0x8076, 0x8079, 0x807d, 0x807f, 0x8084, 0x8086, + 0x8085, 0x809b, 0x8093, 0x809a, 0x80ad, 0x5190, 0x80ac, 0x80db, + 0x80e5, 0x80d9, 0x80dd, 0x80c4, 0x80da, 0x80d6, 0x8109, 0x80ef, + 0x80f1, 0x811b, 0x8129, 0x8123, 0x812f, 0x814b, + }, + { + 0x968b, 0x8146, 0x813e, 0x8153, 0x8151, 0x80fc, 0x8171, 0x816e, + 0x8165, 0x8166, 0x8174, 0x8183, 0x8188, 0x818a, 0x8180, 0x8182, + 0x81a0, 0x8195, 0x81a4, 0x81a3, 0x815f, 0x8193, 0x81a9, 0x81b0, + 0x81b5, 0x81be, 0x81b8, 0x81bd, 0x81c0, 0x81c2, 0x81ba, 0x81c9, + 0x81cd, 0x81d1, 0x81d9, 0x81d8, 0x81c8, 0x81da, 0x81df, 0x81e0, + 0x81e7, 0x81fa, 0x81fb, 0x81fe, 0x8201, 0x8202, 0x8205, 0x8207, + 0x820a, 0x820d, 0x8210, 0x8216, 0x8229, 0x822b, 0x8238, 0x8233, + 0x8240, 0x8259, 0x8258, 0x825d, 0x825a, 0x825f, 0x8264, 0x8262, + 0x8268, 0x826a, 0x826b, 0x822e, 0x8271, 0x8277, 0x8278, 0x827e, + 0x828d, 0x8292, 0x82ab, 0x829f, 0x82bb, 0x82ac, 0x82e1, 0x82e3, + 0x82df, 0x82d2, 0x82f4, 0x82f3, 0x82fa, 0x8393, 0x8303, 0x82fb, + 0x82f9, 0x82de, 0x8306, 0x82dc, 0x8309, 0x82d9, + }, + { + 0x8335, 0x8334, 0x8316, 0x8332, 0x8331, 0x8340, 0x8339, 0x8350, + 0x8345, 0x832f, 0x832b, 0x8317, 0x8318, 0x8385, 0x839a, 0x83aa, + 0x839f, 0x83a2, 0x8396, 0x8323, 0x838e, 0x8387, 0x838a, 0x837c, + 0x83b5, 0x8373, 0x8375, 0x83a0, 0x8389, 0x83a8, 0x83f4, 0x8413, + 0x83eb, 0x83ce, 0x83fd, 0x8403, 0x83d8, 0x840b, 0x83c1, 0x83f7, + 0x8407, 0x83e0, 0x83f2, 0x840d, 0x8422, 0x8420, 0x83bd, 0x8438, + 0x8506, 0x83fb, 0x846d, 0x842a, 0x843c, 0x855a, 0x8484, 0x8477, + 0x846b, 0x84ad, 0x846e, 0x8482, 0x8469, 0x8446, 0x842c, 0x846f, + 0x8479, 0x8435, 0x84ca, 0x8462, 0x84b9, 0x84bf, 0x849f, 0x84d9, + 0x84cd, 0x84bb, 0x84da, 0x84d0, 0x84c1, 0x84c6, 0x84d6, 0x84a1, + 0x8521, 0x84ff, 0x84f4, 0x8517, 0x8518, 0x852c, 0x851f, 0x8515, + 0x8514, 0x84fc, 0x8540, 0x8563, 0x8558, 0x8548, + }, + { + 0x8541, 0x8602, 0x854b, 0x8555, 0x8580, 0x85a4, 0x8588, 0x8591, + 0x858a, 0x85a8, 0x856d, 0x8594, 0x859b, 0x85ea, 0x8587, 0x859c, + 0x8577, 0x857e, 0x8590, 0x85c9, 0x85ba, 0x85cf, 0x85b9, 0x85d0, + 0x85d5, 0x85dd, 0x85e5, 0x85dc, 0x85f9, 0x860a, 0x8613, 0x860b, + 0x85fe, 0x85fa, 0x8606, 0x8622, 0x861a, 0x8630, 0x863f, 0x864d, + 0x4e55, 0x8654, 0x865f, 0x8667, 0x8671, 0x8693, 0x86a3, 0x86a9, + 0x86aa, 0x868b, 0x868c, 0x86b6, 0x86af, 0x86c4, 0x86c6, 0x86b0, + 0x86c9, 0x8823, 0x86ab, 0x86d4, 0x86de, 0x86e9, 0x86ec, 0x86df, + 0x86db, 0x86ef, 0x8712, 0x8706, 0x8708, 0x8700, 0x8703, 0x86fb, + 0x8711, 0x8709, 0x870d, 0x86f9, 0x870a, 0x8734, 0x873f, 0x8737, + 0x873b, 0x8725, 0x8729, 0x871a, 0x8760, 0x875f, 0x8778, 0x874c, + 0x874e, 0x8774, 0x8757, 0x8768, 0x876e, 0x8759, + }, + { + 0x8753, 0x8763, 0x876a, 0x8805, 0x87a2, 0x879f, 0x8782, 0x87af, + 0x87cb, 0x87bd, 0x87c0, 0x87d0, 0x96d6, 0x87ab, 0x87c4, 0x87b3, + 0x87c7, 0x87c6, 0x87bb, 0x87ef, 0x87f2, 0x87e0, 0x880f, 0x880d, + 0x87fe, 0x87f6, 0x87f7, 0x880e, 0x87d2, 0x8811, 0x8816, 0x8815, + 0x8822, 0x8821, 0x8831, 0x8836, 0x8839, 0x8827, 0x883b, 0x8844, + 0x8842, 0x8852, 0x8859, 0x885e, 0x8862, 0x886b, 0x8881, 0x887e, + 0x889e, 0x8875, 0x887d, 0x88b5, 0x8872, 0x8882, 0x8897, 0x8892, + 0x88ae, 0x8899, 0x88a2, 0x888d, 0x88a4, 0x88b0, 0x88bf, 0x88b1, + 0x88c3, 0x88c4, 0x88d4, 0x88d8, 0x88d9, 0x88dd, 0x88f9, 0x8902, + 0x88fc, 0x88f4, 0x88e8, 0x88f2, 0x8904, 0x890c, 0x890a, 0x8913, + 0x8943, 0x891e, 0x8925, 0x892a, 0x892b, 0x8941, 0x8944, 0x893b, + 0x8936, 0x8938, 0x894c, 0x891d, 0x8960, 0x895e, + }, + { + 0x8966, 0x8964, 0x896d, 0x896a, 0x896f, 0x8974, 0x8977, 0x897e, + 0x8983, 0x8988, 0x898a, 0x8993, 0x8998, 0x89a1, 0x89a9, 0x89a6, + 0x89ac, 0x89af, 0x89b2, 0x89ba, 0x89bd, 0x89bf, 0x89c0, 0x89da, + 0x89dc, 0x89dd, 0x89e7, 0x89f4, 0x89f8, 0x8a03, 0x8a16, 0x8a10, + 0x8a0c, 0x8a1b, 0x8a1d, 0x8a25, 0x8a36, 0x8a41, 0x8a5b, 0x8a52, + 0x8a46, 0x8a48, 0x8a7c, 0x8a6d, 0x8a6c, 0x8a62, 0x8a85, 0x8a82, + 0x8a84, 0x8aa8, 0x8aa1, 0x8a91, 0x8aa5, 0x8aa6, 0x8a9a, 0x8aa3, + 0x8ac4, 0x8acd, 0x8ac2, 0x8ada, 0x8aeb, 0x8af3, 0x8ae7, 0x8ae4, + 0x8af1, 0x8b14, 0x8ae0, 0x8ae2, 0x8af7, 0x8ade, 0x8adb, 0x8b0c, + 0x8b07, 0x8b1a, 0x8ae1, 0x8b16, 0x8b10, 0x8b17, 0x8b20, 0x8b33, + 0x97ab, 0x8b26, 0x8b2b, 0x8b3e, 0x8b28, 0x8b41, 0x8b4c, 0x8b4f, + 0x8b4e, 0x8b49, 0x8b56, 0x8b5b, 0x8b5a, 0x8b6b, + }, + { + 0x8b5f, 0x8b6c, 0x8b6f, 0x8b74, 0x8b7d, 0x8b80, 0x8b8c, 0x8b8e, + 0x8b92, 0x8b93, 0x8b96, 0x8b99, 0x8b9a, 0x8c3a, 0x8c41, 0x8c3f, + 0x8c48, 0x8c4c, 0x8c4e, 0x8c50, 0x8c55, 0x8c62, 0x8c6c, 0x8c78, + 0x8c7a, 0x8c82, 0x8c89, 0x8c85, 0x8c8a, 0x8c8d, 0x8c8e, 0x8c94, + 0x8c7c, 0x8c98, 0x621d, 0x8cad, 0x8caa, 0x8cbd, 0x8cb2, 0x8cb3, + 0x8cae, 0x8cb6, 0x8cc8, 0x8cc1, 0x8ce4, 0x8ce3, 0x8cda, 0x8cfd, + 0x8cfa, 0x8cfb, 0x8d04, 0x8d05, 0x8d0a, 0x8d07, 0x8d0f, 0x8d0d, + 0x8d10, 0x9f4e, 0x8d13, 0x8ccd, 0x8d14, 0x8d16, 0x8d67, 0x8d6d, + 0x8d71, 0x8d73, 0x8d81, 0x8d99, 0x8dc2, 0x8dbe, 0x8dba, 0x8dcf, + 0x8dda, 0x8dd6, 0x8dcc, 0x8ddb, 0x8dcb, 0x8dea, 0x8deb, 0x8ddf, + 0x8de3, 0x8dfc, 0x8e08, 0x8e09, 0x8dff, 0x8e1d, 0x8e1e, 0x8e10, + 0x8e1f, 0x8e42, 0x8e35, 0x8e30, 0x8e34, 0x8e4a, + }, + { + 0x8e47, 0x8e49, 0x8e4c, 0x8e50, 0x8e48, 0x8e59, 0x8e64, 0x8e60, + 0x8e2a, 0x8e63, 0x8e55, 0x8e76, 0x8e72, 0x8e7c, 0x8e81, 0x8e87, + 0x8e85, 0x8e84, 0x8e8b, 0x8e8a, 0x8e93, 0x8e91, 0x8e94, 0x8e99, + 0x8eaa, 0x8ea1, 0x8eac, 0x8eb0, 0x8ec6, 0x8eb1, 0x8ebe, 0x8ec5, + 0x8ec8, 0x8ecb, 0x8edb, 0x8ee3, 0x8efc, 0x8efb, 0x8eeb, 0x8efe, + 0x8f0a, 0x8f05, 0x8f15, 0x8f12, 0x8f19, 0x8f13, 0x8f1c, 0x8f1f, + 0x8f1b, 0x8f0c, 0x8f26, 0x8f33, 0x8f3b, 0x8f39, 0x8f45, 0x8f42, + 0x8f3e, 0x8f4c, 0x8f49, 0x8f46, 0x8f4e, 0x8f57, 0x8f5c, 0x8f62, + 0x8f63, 0x8f64, 0x8f9c, 0x8f9f, 0x8fa3, 0x8fad, 0x8faf, 0x8fb7, + 0x8fda, 0x8fe5, 0x8fe2, 0x8fea, 0x8fef, 0x9087, 0x8ff4, 0x9005, + 0x8ff9, 0x8ffa, 0x9011, 0x9015, 0x9021, 0x900d, 0x901e, 0x9016, + 0x900b, 0x9027, 0x9036, 0x9035, 0x9039, 0x8ff8, + }, + { + 0x904f, 0x9050, 0x9051, 0x9052, 0x900e, 0x9049, 0x903e, 0x9056, + 0x9058, 0x905e, 0x9068, 0x906f, 0x9076, 0x96a8, 0x9072, 0x9082, + 0x907d, 0x9081, 0x9080, 0x908a, 0x9089, 0x908f, 0x90a8, 0x90af, + 0x90b1, 0x90b5, 0x90e2, 0x90e4, 0x6248, 0x90db, 0x9102, 0x9112, + 0x9119, 0x9132, 0x9130, 0x914a, 0x9156, 0x9158, 0x9163, 0x9165, + 0x9169, 0x9173, 0x9172, 0x918b, 0x9189, 0x9182, 0x91a2, 0x91ab, + 0x91af, 0x91aa, 0x91b5, 0x91b4, 0x91ba, 0x91c0, 0x91c1, 0x91c9, + 0x91cb, 0x91d0, 0x91d6, 0x91df, 0x91e1, 0x91db, 0x91fc, 0x91f5, + 0x91f6, 0x921e, 0x91ff, 0x9214, 0x922c, 0x9215, 0x9211, 0x925e, + 0x9257, 0x9245, 0x9249, 0x9264, 0x9248, 0x9295, 0x923f, 0x924b, + 0x9250, 0x929c, 0x9296, 0x9293, 0x929b, 0x925a, 0x92cf, 0x92b9, + 0x92b7, 0x92e9, 0x930f, 0x92fa, 0x9344, 0x932e, + }, + { + 0x9319, 0x9322, 0x931a, 0x9323, 0x933a, 0x9335, 0x933b, 0x935c, + 0x9360, 0x937c, 0x936e, 0x9356, 0x93b0, 0x93ac, 0x93ad, 0x9394, + 0x93b9, 0x93d6, 0x93d7, 0x93e8, 0x93e5, 0x93d8, 0x93c3, 0x93dd, + 0x93d0, 0x93c8, 0x93e4, 0x941a, 0x9414, 0x9413, 0x9403, 0x9407, + 0x9410, 0x9436, 0x942b, 0x9435, 0x9421, 0x943a, 0x9441, 0x9452, + 0x9444, 0x945b, 0x9460, 0x9462, 0x945e, 0x946a, 0x9229, 0x9470, + 0x9475, 0x9477, 0x947d, 0x945a, 0x947c, 0x947e, 0x9481, 0x947f, + 0x9582, 0x9587, 0x958a, 0x9594, 0x9596, 0x9598, 0x9599, 0x95a0, + 0x95a8, 0x95a7, 0x95ad, 0x95bc, 0x95bb, 0x95b9, 0x95be, 0x95ca, + 0x6ff6, 0x95c3, 0x95cd, 0x95cc, 0x95d5, 0x95d4, 0x95d6, 0x95dc, + 0x95e1, 0x95e5, 0x95e2, 0x9621, 0x9628, 0x962e, 0x962f, 0x9642, + 0x964c, 0x964f, 0x964b, 0x9677, 0x965c, 0x965e, + }, + { + 0x965d, 0x965f, 0x9666, 0x9672, 0x966c, 0x968d, 0x9698, 0x9695, + 0x9697, 0x96aa, 0x96a7, 0x96b1, 0x96b2, 0x96b0, 0x96b4, 0x96b6, + 0x96b8, 0x96b9, 0x96ce, 0x96cb, 0x96c9, 0x96cd, 0x894d, 0x96dc, + 0x970d, 0x96d5, 0x96f9, 0x9704, 0x9706, 0x9708, 0x9713, 0x970e, + 0x9711, 0x970f, 0x9716, 0x9719, 0x9724, 0x972a, 0x9730, 0x9739, + 0x973d, 0x973e, 0x9744, 0x9746, 0x9748, 0x9742, 0x9749, 0x975c, + 0x9760, 0x9764, 0x9766, 0x9768, 0x52d2, 0x976b, 0x9771, 0x9779, + 0x9785, 0x977c, 0x9781, 0x977a, 0x9786, 0x978b, 0x978f, 0x9790, + 0x979c, 0x97a8, 0x97a6, 0x97a3, 0x97b3, 0x97b4, 0x97c3, 0x97c6, + 0x97c8, 0x97cb, 0x97dc, 0x97ed, 0x9f4f, 0x97f2, 0x7adf, 0x97f6, + 0x97f5, 0x980f, 0x980c, 0x9838, 0x9824, 0x9821, 0x9837, 0x983d, + 0x9846, 0x984f, 0x984b, 0x986b, 0x986f, 0x9870, + }, + { + 0x9871, 0x9874, 0x9873, 0x98aa, 0x98af, 0x98b1, 0x98b6, 0x98c4, + 0x98c3, 0x98c6, 0x98e9, 0x98eb, 0x9903, 0x9909, 0x9912, 0x9914, + 0x9918, 0x9921, 0x991d, 0x991e, 0x9924, 0x9920, 0x992c, 0x992e, + 0x993d, 0x993e, 0x9942, 0x9949, 0x9945, 0x9950, 0x994b, 0x9951, + 0x9952, 0x994c, 0x9955, 0x9997, 0x9998, 0x99a5, 0x99ad, 0x99ae, + 0x99bc, 0x99df, 0x99db, 0x99dd, 0x99d8, 0x99d1, 0x99ed, 0x99ee, + 0x99f1, 0x99f2, 0x99fb, 0x99f8, 0x9a01, 0x9a0f, 0x9a05, 0x99e2, + 0x9a19, 0x9a2b, 0x9a37, 0x9a45, 0x9a42, 0x9a40, 0x9a43, 0x9a3e, + 0x9a55, 0x9a4d, 0x9a5b, 0x9a57, 0x9a5f, 0x9a62, 0x9a65, 0x9a64, + 0x9a69, 0x9a6b, 0x9a6a, 0x9aad, 0x9ab0, 0x9abc, 0x9ac0, 0x9acf, + 0x9ad1, 0x9ad3, 0x9ad4, 0x9ade, 0x9adf, 0x9ae2, 0x9ae3, 0x9ae6, + 0x9aef, 0x9aeb, 0x9aee, 0x9af4, 0x9af1, 0x9af7, + }, + { + 0x9afb, 0x9b06, 0x9b18, 0x9b1a, 0x9b1f, 0x9b22, 0x9b23, 0x9b25, + 0x9b27, 0x9b28, 0x9b29, 0x9b2a, 0x9b2e, 0x9b2f, 0x9b32, 0x9b44, + 0x9b43, 0x9b4f, 0x9b4d, 0x9b4e, 0x9b51, 0x9b58, 0x9b74, 0x9b93, + 0x9b83, 0x9b91, 0x9b96, 0x9b97, 0x9b9f, 0x9ba0, 0x9ba8, 0x9bb4, + 0x9bc0, 0x9bca, 0x9bb9, 0x9bc6, 0x9bcf, 0x9bd1, 0x9bd2, 0x9be3, + 0x9be2, 0x9be4, 0x9bd4, 0x9be1, 0x9c3a, 0x9bf2, 0x9bf1, 0x9bf0, + 0x9c15, 0x9c14, 0x9c09, 0x9c13, 0x9c0c, 0x9c06, 0x9c08, 0x9c12, + 0x9c0a, 0x9c04, 0x9c2e, 0x9c1b, 0x9c25, 0x9c24, 0x9c21, 0x9c30, + 0x9c47, 0x9c32, 0x9c46, 0x9c3e, 0x9c5a, 0x9c60, 0x9c67, 0x9c76, + 0x9c78, 0x9ce7, 0x9cec, 0x9cf0, 0x9d09, 0x9d08, 0x9ceb, 0x9d03, + 0x9d06, 0x9d2a, 0x9d26, 0x9daf, 0x9d23, 0x9d1f, 0x9d44, 0x9d15, + 0x9d12, 0x9d41, 0x9d3f, 0x9d3e, 0x9d46, 0x9d48, + }, + { + 0x9d5d, 0x9d5e, 0x9d64, 0x9d51, 0x9d50, 0x9d59, 0x9d72, 0x9d89, + 0x9d87, 0x9dab, 0x9d6f, 0x9d7a, 0x9d9a, 0x9da4, 0x9da9, 0x9db2, + 0x9dc4, 0x9dc1, 0x9dbb, 0x9db8, 0x9dba, 0x9dc6, 0x9dcf, 0x9dc2, + 0x9dd9, 0x9dd3, 0x9df8, 0x9de6, 0x9ded, 0x9def, 0x9dfd, 0x9e1a, + 0x9e1b, 0x9e1e, 0x9e75, 0x9e79, 0x9e7d, 0x9e81, 0x9e88, 0x9e8b, + 0x9e8c, 0x9e92, 0x9e95, 0x9e91, 0x9e9d, 0x9ea5, 0x9ea9, 0x9eb8, + 0x9eaa, 0x9ead, 0x9761, 0x9ecc, 0x9ece, 0x9ecf, 0x9ed0, 0x9ed4, + 0x9edc, 0x9ede, 0x9edd, 0x9ee0, 0x9ee5, 0x9ee8, 0x9eef, 0x9ef4, + 0x9ef6, 0x9ef7, 0x9ef9, 0x9efb, 0x9efc, 0x9efd, 0x9f07, 0x9f08, + 0x76b7, 0x9f15, 0x9f21, 0x9f2c, 0x9f3e, 0x9f4a, 0x9f52, 0x9f54, + 0x9f63, 0x9f5f, 0x9f60, 0x9f61, 0x9f66, 0x9f67, 0x9f6c, 0x9f6a, + 0x9f77, 0x9f72, 0x9f76, 0x9f95, 0x9f9c, 0x9fa0, + }, + { + 0x582f, 0x69c7, 0x9059, 0x7464, 0x51dc, 0x7199, + }, + { + 0x3402, 0x20158,0x4efd, 0x4eff, 0x4f9a, 0x4fc9, 0x509c, 0x511e, + 0x51bc, 0x351f, 0x5307, 0x5361, 0x536c, 0x8a79, 0x20bb7,0x544d, + 0x5496, 0x549c, 0x54a9, 0x550e, 0x554a, 0x5672, 0x56e4, 0x5733, + 0x5734, 0xfa10, 0x5880, 0x59e4, 0x5a23, 0x5a55, 0x5bec, 0xfa11, + 0x37e2, 0x5eac, 0x5f34, 0x5f45, 0x57b7, 0x6017, 0xfa6b, 0x6130, + 0x6624, 0x66c8, 0x66d9, 0x66fa, 0x66fb, 0x6852, 0x9fc4, 0x6911, + 0x693b, 0x6a45, 0x6a91, 0x6adb, 0x233cc,0x233fe,0x235c4,0x6bf1, + 0x6ce0, 0x6d2e, 0xfa45, 0x6dbf, 0x6dca, 0x6df8, 0xfa46, 0x6f5e, + 0x6ff9, 0x7064, 0xfa6c, 0x242ee,0x7147, 0x71c1, 0x7200, 0x739f, + 0x73a8, 0x73c9, 0x73d6, 0x741b, 0x7421, 0xfa4a, 0x7426, 0x742a, + 0x742c, 0x7439, 0x744b, 0x3eda, 0x7575, 0x7581, 0x7772, 0x4093, + 0x78c8, 0x78e0, 0x7947, 0x79ae, 0x9fc6, 0x4103, + }, + { + 0x9fc5, 0x79da, 0x7a1e, 0x7b7f, 0x7c31, 0x4246, 0x7d8b, 0x7fa1, + 0x8118, 0x813a, 0xfa6d, 0x82ae, 0x845b, 0x84dc, 0x84ec, 0x8559, + 0x85ce, 0x8755, 0x87ec, 0x880b, 0x88f5, 0x89d2, 0x8af6, 0x8dce, + 0x8fbb, 0x8ff6, 0x90dd, 0x9127, 0x912d, 0x91b2, 0x9233, 0x9288, + 0x9321, 0x9348, 0x9592, 0x96de, 0x9903, 0x9940, 0x9ad9, 0x9bd6, + 0x9dd7, 0x9eb4, 0x9eb5, + }, + { + }, + { + }, + { + }, + { + 0xe0c9, 0xe0ca, 0xe0cb, 0xe0cc, 0xe0cd, 0xe0ce, 0x0000, 0xe0d0, + 0xe0d1, 0xe0d2, 0xe0d3, 0x0000, 0x0000, 0x0000, 0x0000, 0xe0d8, + 0xe0d9, 0x0000, 0x0000, 0xe0dc, 0xe0dd, 0xe0de, 0xe0df, 0xe0e0, + 0xe0e1, 0xe0e2, 0xe0e3, 0xe0e4, 0xe0e5, 0xe0e6, 0xe0e7, 0xe0e8, + 0xe0e9, 0xe0ea, 0xe0eb, 0xe0ec, 0xe0ed, 0xe0ee, 0xe0ef, 0xe0f0, + 0x0000, 0x0000, 0x0000, 0x0000, 0x2491, 0x2492, 0x2493, 0xe0f8, + 0xe0f9, 0xe0fa, 0xe0fb, 0xe0fc, 0xe0fd, 0xe0fe, 0xe0ff, 0xe180, + 0xe181, 0xe182, 0xe183, 0xe184, 0xe185, 0xe186, 0xe187, 0xe188, + 0xe189, 0xe18a, 0xe18b, 0xe18c, 0xe18d, 0xe18e, 0xe18f, 0xe190, + 0xe191, 0xe192, 0xe193, 0xe194, 0xe195, 0xe196, 0xe197, 0xe198, + 0xe199, 0xe19a, 0x3299, 0xe19c, + }, + { + 0xe1a7, 0xe1a8, 0xe1a9, 0xe1aa, 0xe1ab, 0xe1ac, 0xe1ad, 0x3012, + 0x26e8, 0xe1b0, 0xe1b1, 0xe1b2, 0x534d, 0xe1b4, 0xe1b5, 0x26ec, + 0x2668, 0xe1b8, 0xe1b9, 0xe1ba, 0x2693, 0x2708, 0x26f0, 0xe1be, + 0xe1bf, 0xe1c0, 0xe1c1, 0xe1c2, 0xe1c3, 0x24b9, 0x24c8, 0xe1c6, + 0xe1c7, 0xe1c8, 0xe1c9, 0xe1ca, 0xe1cb, 0xe1cc, 0xe1cd, 0xe1ce, + 0xe1cf, 0xe1d0, 0x260e, 0xe1d2, 0xe1d3, 0xe1d4, 0xe1d5, 0xe1d6, + 0xe1d7, + }, + { + 0x27a1, 0x2b05, 0x2b06, 0x2b07, 0x2b2f, 0x2b2e, 0x5e74, 0x6708, + 0x65e5, 0x5186, 0x33a1, 0x33a5, 0x339d, 0x33a0, 0x33a4, 0xe28f, + 0x2488, 0x2489, 0x248a, 0x248b, 0x248c, 0x248d, 0x248e, 0x248f, + 0x2490, 0xe290, 0xe291, 0xe292, 0xe293, 0xe294, 0xe295, 0xe296, + 0xe297, 0xe298, 0xe299, 0xe29a, 0xe29b, 0xe29c, 0xe29d, 0xe29e, + 0xe29f, 0x3233, 0x3236, 0x3232, 0x3231, 0x3239, 0xe2a0, 0x25b6, + 0x25c0, 0x3016, 0x3017, 0xe2a1, 0x00b2, 0x00b3, 0xe2a4, 0xe2a5, + 0xe2a6, 0xe2a7, 0xe2a8, 0xe2a9, 0xe2aa, 0xe2ab, 0xe2ac, 0xe2ad, + 0xe2ae, 0xe2af, 0xe2b0, 0xe2b1, 0xe2b2, 0xe2b3, 0xe2b4, 0xe2b5, + 0xe2b6, 0xe2b7, 0xe2b8, 0xe2b9, 0xe2ba, 0xe2bb, 0xe2bc, 0xe2bd, + 0xe2be, 0xe2bf, 0xe2c0, 0xe2c1, 0xe2c2, 0x1f12c,0x1f12b,0xe2c3, + 0xe2c4, 0xe2c5, 0x213b, + }, + { + 0x322a, 0x322b, 0x322c, 0x322d, 0x322e, 0x322f, 0x3230, 0x3237, + 0x337e, 0x337d, 0x337c, 0x337b, 0x2116, 0x2121, 0x3036, 0xe2cc, + 0xe2cd, 0xe2ce, 0xe2cf, 0xe2d0, 0xe2d1, 0xe2d2, 0xe2d3, 0xe2d4, + 0xe2d5, 0xe2d6, 0xe2d7, 0xe2d8, 0xe2d9, 0xe2da, 0xe2db, 0xe2dc, + 0xe2dd, 0xe2de, 0xe2df, 0xe2e0, 0xe2e1, 0xe2e2, 0x2113, 0x338f, + 0x3390, 0x33ca, 0x339e, 0x33a2, 0x3371, 0x0000, 0x0000, 0x00bd, + 0xe2e5, 0x2153, 0x2154, 0x00bc, 0x00be, 0x2155, 0x2156, 0x2157, + 0x2158, 0x2159, 0x215a, 0xe2e6, 0x0000, 0xe2e7, 0xe2e8, 0x2600, + 0x2601, 0x2602, 0x26c4, 0x2616, 0x2617, 0x26c9, 0x26ca, 0x2666, + 0x2665, 0x2663, 0x2660, 0x26cb, 0x2a00, 0x203c, 0x2049, 0x26c5, + 0x2614, 0x26c6, 0x2603, 0x26c7, 0x26a1, 0x26c8, 0x0000, 0xe2f9, + 0xe2fa, 0x266c, 0x260e, + }, + { + 0x2160, 0x2161, 0x2162, 0x2163, 0x2164, 0x2165, 0x2166, 0x2167, + 0x2168, 0x2169, 0x216a, 0x216b, 0x2470, 0x2471, 0x2472, 0x2473, + 0x2474, 0x2475, 0x2476, 0x2477, 0x2478, 0x2479, 0x247a, 0x247b, + 0x247c, 0x247d, 0x247e, 0x247f, 0x3251, 0x3252, 0x3253, 0x3254, + 0x1f110,0x1f111,0x1f112,0x1f113,0x1f114,0x1f115,0x1f116,0x1f117, + 0x1f118,0x1f119,0x1f11a,0x1f11b,0x1f11c,0x1f11d,0x1f11e,0x1f11f, + 0x1f120,0x1f121,0x1f122,0x1f123,0x1f124,0x1f125,0x1f126,0x1f127, + 0x1f128,0x1f129,0x3255, 0x3256, 0x3257, 0x3258, 0x3259, 0x325a, + 0x2460, 0x2461, 0x2462, 0x2463, 0x2464, 0x2465, 0x2466, 0x2467, + 0x2468, 0x2469, 0x246a, 0x246b, 0x246c, 0x246d, 0x246e, 0x246f, + 0x2776, 0x2777, 0x2778, 0x2779, 0x277a, 0x277b, 0x277c, 0x277d, + 0x277e, 0x277f, 0x24eb, 0x24ec, 0x325b, + }, +}; + +const unsigned int decoder_private_conv_table[][94] = { + { + 0x26cc, 0x26cd, 0x26ce, 0x26cf, 0x26d0, 0x26d1, 0x0000, 0x26d2, + 0x26d5, 0x26d3, 0x26d4, 0x0000, 0x0000, 0x0000, 0x0000, 0x1f17f, + 0x1f18a, 0x0000, 0x0000, 0x26d6, 0x26d7, 0x26d8, 0x26d9, 0x26da, + 0x26db, 0x26dc, 0x26dd, 0x26de, 0x26df, 0x26e0, 0x26e1, 0x26e2, + 0x3248, 0x3249, 0x324a, 0x324b, 0x324c, 0x324d, 0x324e, 0x324f, + 0x0000, 0x0000, 0x0000, 0x0000, 0x2491, 0x2492, 0x2493, 0x1f14a, + 0x1f14c,0x1f13f,0x1f146,0x1f14b,0x1f210,0x1f211,0x1f212,0x1f213, + 0x1f142,0x1f214,0x1f215,0x1f216,0x1f14d,0x1f131,0x1f13d,0x2b1b, + 0x2b24, 0x1f217,0x1f218,0x1f219,0x1f21a,0x1f21b,0x26bf, 0x1f21c, + 0x1f21d,0x1f21e,0x1f21f,0x1f220,0x1f221,0x1f222,0x1f223,0x1f224, + 0x1f225,0x1f14e,0x3299, 0x1f200, + }, + { + 0x26e3, 0x26e4, 0x26e5, 0x26e6, 0x26e7, 0x2613, 0x328b, 0x3012, + 0x26e8, 0x3246, 0x3245, 0x26e9, 0x0fd6, 0x26ea, 0x26eb, 0x26ec, + 0x2668, 0x26ed, 0x26ee, 0x26ef, 0x2693, 0x2708, 0x26f0, 0x26f1, + 0x26f2, 0x26f3, 0x0000, 0x26f5, 0x1f157,0x24b9, 0x24c8, 0x26f6, + 0x1f15f,0x1f18b,0x1f18d,0x1f18c,0x1f179,0x26f7, 0x26f8, 0x26f9, + 0x26fa, 0x1f17b,0x260e, 0x26fb, 0x26fc, 0x26fd, 0x26fe, 0x1f17c, + 0x26ff, + }, + { + 0x27a1, 0x2b05, 0x2b06, 0x2b07, 0x2b2f, 0x2b2e, 0x5e74, 0x6708, + 0x65e5, 0x5186, 0x33a1, 0x33a5, 0x339d, 0x33a0, 0x33a4, 0x1f100, + 0x2488, 0x2489, 0x248a, 0x248b, 0x248c, 0x248d, 0x248e, 0x248f, + 0x2490, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x1f101, + 0x1f102,0x1f103,0x1f104,0x1f105,0x1f106,0x1f107,0x1f108,0x1f109, + 0x1f10a,0x3233, 0x3236, 0x3232, 0x3231, 0x3239, 0x3244, 0x25b6, + 0x25c0, 0x3016, 0x3017, 0x27d0, 0x00b2, 0x00b3, 0x1f12d,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, 0x1f12c,0x1f12b,0x3247, + 0x1f14f,0x1f229,0x213b, + }, + { + 0x322a, 0x322b, 0x322c, 0x322d, 0x322e, 0x322f, 0x3230, 0x3237, + 0x337e, 0x337d, 0x337c, 0x337b, 0x2116, 0x2121, 0x3036, 0x26be, + 0x1f246,0x1f240,0x1f241,0x1f243,0x1f247,0x1f244,0x1f248,0x1f242, + 0x1f245,0x1f12a,0x1f223,0x1f225,0x1f210,0x1f213,0x1f211,0x1f230, + 0x1f21f,0x1f212,0x1f219,0x1f224,0x1f22f,0x1f222,0x2113, 0x338f, + 0x3390, 0x33ca, 0x339e, 0x33a2, 0x3371, 0x0000, 0x0000, 0x00bd, + 0x2189, 0x2153, 0x2154, 0x00bc, 0x00be, 0x2155, 0x2156, 0x2157, + 0x2158, 0x2159, 0x215a, 0x2150, 0x0000, 0x2151, 0x2152, 0x2600, + 0x2601, 0x2602, 0x26c4, 0x2616, 0x2617, 0x26c9, 0x26ca, 0x2666, + 0x2665, 0x2663, 0x2660, 0x26cb, 0x2a00, 0x203c, 0x2049, 0x26c5, + 0x2614, 0x26c6, 0x2603, 0x26c7, 0x26a1, 0x26c8, 0x0000, 0x269e, + 0x269f, 0x266c, 0x260e, + }, + { + 0x2160, 0x2161, 0x2162, 0x2163, 0x2164, 0x2165, 0x2166, 0x2167, + 0x2168, 0x2169, 0x216a, 0x216b, 0x2470, 0x2471, 0x2472, 0x2473, + 0x2474, 0x2475, 0x2476, 0x2477, 0x2478, 0x2479, 0x247a, 0x247b, + 0x247c, 0x247d, 0x247e, 0x247f, 0x3251, 0x3252, 0x3253, 0x3254, + 0x1f110,0x1f111,0x1f112,0x1f113,0x1f114,0x1f115,0x1f116,0x1f117, + 0x1f118,0x1f119,0x1f11a,0x1f11b,0x1f11c,0x1f11d,0x1f11e,0x1f11f, + 0x1f120,0x1f121,0x1f122,0x1f123,0x1f124,0x1f125,0x1f126,0x1f127, + 0x1f128,0x1f129,0x3255, 0x3256, 0x3257, 0x3258, 0x3259, 0x325a, + 0x2460, 0x2461, 0x2462, 0x2463, 0x2464, 0x2465, 0x2466, 0x2467, + 0x2468, 0x2469, 0x246a, 0x246b, 0x246c, 0x246d, 0x246e, 0x246f, + 0x2776, 0x2777, 0x2778, 0x2779, 0x277a, 0x277b, 0x277c, 0x277d, + 0x277e, 0x277f, 0x24eb, 0x24ec, 0x325b, + }, +}; + +#endif diff --git a/src/aribb24/decoder.h b/src/aribb24/decoder.h new file mode 100644 index 0000000000000000000000000000000000000000..8d6794ef1545ad4e7b9ef5757a126a23230841e2 --- /dev/null +++ b/src/aribb24/decoder.h @@ -0,0 +1,216 @@ +/***************************************************************************** + * decorder.h : ARIB STD-B24 JIS 8bit character code decoder + ***************************************************************************** + * Copyright (C) 2014 Naohiro KORIYAMA + * + * Authors: Naohiro KORIYAMA <nkoriyama@gmail.com> + * + * This program is free software; you can redistribute it and/or modify it + * under the terms of the GNU Lesser General Public License as published by + * the Free Software Foundation; either version 2.1 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 Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public License + * along with this program; if not, write to the Free Software Foundation, + * Inc., 51 Franklin Street, Fifth Floor, Boston MA 02110-1301, USA. + *****************************************************************************/ + +#ifndef ARIBB24_DECODER_H +#define ARIBB24_DECODER_H 1 + +#include <stdbool.h> +#include <stddef.h> +#include <stdint.h> + +#if 0 +/***************************************************************************** + * ARIB STD-B24 VOLUME 1 Part 3 Chapter 9.3.1 Caption management data + *****************************************************************************/ +typedef struct +{ +} arib_caption_management_data_t; + +/***************************************************************************** + * ARIB STD-B24 VOLUME 1 Part 3 Chapter 9.3.2 Caption statement data + *****************************************************************************/ +typedef struct +{ +} arib_caption_statement_data_t; + +/***************************************************************************** + * ARIB STD-B24 VOLUME 1 Part 3 Chapter 9.2 Structure of data group + *****************************************************************************/ +typedef struct +{ + uint8_t i_data_group_id; + uint8_t i_data_group_version; + uint8_t i_data_group_link_number; + uint8_t i_last_data_group_link_number; + uint16_t i_data_group_size; + + arib_caption_management_data_t *caption_management_data; + arib_caption_statement_data_t *caption_statement_data; +} arib_data_group_t; + +#endif + +//#define ARIBSUB_GEN_DRCS_DATA +#ifdef ARIBSUB_GEN_DRCS_DATA +typedef struct drcs_geometric_data_s +{ + int8_t i_regionX; + int8_t i_regionY; + int16_t i_geometricData_length; + + int8_t *p_geometricData; +} drcs_geometric_data_t; + +typedef struct drcs_pattern_data_s +{ + int8_t i_depth; + int8_t i_width; + int8_t i_height; + + int8_t *p_patternData; +} drcs_pattern_data_t; + +typedef struct drcs_font_data_s +{ + int8_t i_fontId; + int8_t i_mode; + + drcs_pattern_data_t *p_drcs_pattern_data; + drcs_geometric_data_t *p_drcs_geometric_data; +} drcs_font_data_t; + +typedef struct drc_code_s +{ + int16_t i_CharacterCode; + int8_t i_NumberOfFont; + drcs_font_data_t *p_drcs_font_data; +} drcs_code_t; + +typedef struct drcs_data_s +{ + int8_t i_NumberOfCode; + + drcs_code_t *p_drcs_code; +} drcs_data_t; +#endif //ARIBSUB_GEN_DRCS_DATA + +typedef struct arib_buf_region_s +{ + char *p_start; + char *p_end; + + int i_foreground_color; + int i_background_color; + + int i_foreground_alpha; + int i_background_alpha; + + int i_planewidth; + int i_planeheight; + + int i_width; + int i_height; + + int i_fontwidth; + int i_fontheight; + + int i_verint; + int i_horint; + + int i_charleft; + int i_charbottom; + + int i_veradj; + int i_horadj; + + struct arib_buf_region_s *p_next; +} arib_buf_region_t; + + +/***************************************************************************** + * ARIB STD-B24 JIS 8bit character code decoder + *****************************************************************************/ +typedef struct arib_decoder_s +{ + const unsigned char *buf; + size_t count; + char *ubuf; + size_t ucount; + int (**handle_gl)(struct arib_decoder_s *, int); + int (**handle_gl_single)(struct arib_decoder_s *, int); + int (**handle_gr)(struct arib_decoder_s *, int); + int (*handle_g0)(struct arib_decoder_s *, int); + int (*handle_g1)(struct arib_decoder_s *, int); + int (*handle_g2)(struct arib_decoder_s *, int); + int (*handle_g3)(struct arib_decoder_s *, int); + int kanji_ku; + + int i_control_time; + + int i_color_map; + int i_foreground_color; + int i_foreground_color_prev; + int i_background_color; + int i_foreground_alpha; + int i_background_alpha; + + int i_planewidth; + int i_planeheight; + + int i_width; + int i_height; + int i_left; + int i_top; + + int i_fontwidth; + int i_fontwidth_cur; + int i_fontheight; + int i_fontheight_cur; + + int i_horint; + int i_horint_cur; + int i_verint; + int i_verint_cur; + + int i_charwidth; + int i_charheight; + + int i_right; + int i_bottom; + + int i_charleft; + int i_charbottom; + + int i_drcs_num; + unsigned int drcs_conv_table[188]; + + bool b_use_private_conv; + + bool b_replace_ellipsis; + + arib_buf_region_t *p_region; + bool b_need_next_region; +} arib_decoder_t; + +void arib_initialize_decoder( arib_decoder_t* decoder ); + +void arib_initialize_decoder_a_profile( arib_decoder_t* decoder ); + +void arib_initialize_decoder_c_profile( arib_decoder_t* decoder ); + +void arib_finalize_decoder( arib_decoder_t* decoder ); + +int arib_decode_buffer( arib_decoder_t* decoder, + const unsigned char *buf, size_t count, + char *ubuf, int ucount ); + +#endif diff --git a/src/aribb24/decoder_macro.h b/src/aribb24/decoder_macro.h new file mode 100644 index 0000000000000000000000000000000000000000..132e98f38b961b60ca692cb1518156a5d467e994 --- /dev/null +++ b/src/aribb24/decoder_macro.h @@ -0,0 +1,75 @@ +/***************************************************************************** + * decoder_macro.h : ARIB STD-B24 decoder + ***************************************************************************** + * Copyright (C) 2014 Naohiro KORIYAMA + * + * Authors: Naohiro KORIYAMA <nkoriyama@gmail.com> + * + * This program is free software; you can redistribute it and/or modify it + * under the terms of the GNU Lesser General Public License as published by + * the Free Software Foundation; either version 2.1 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 Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public License + * along with this program; if not, write to the Free Software Foundation, + * Inc., 51 Franklin Street, Fifth Floor, Boston MA 02110-1301, USA. + *****************************************************************************/ + +#ifndef ARIBB24_DECODER_MACRO_H +#define ARIBB24_DECODER_MACRO_H 1 + +const unsigned char decoder_default_macro_0[] = { + 0x1B,0x24,0x39,0x1B,0x29,0x4A,0x1B,0x2A,0x30,0x1B,0x2B,0x20,0x70,0x0F,0x1B,0x7D +}; +const unsigned char decoder_default_macro_1[] = { + 0x1B,0x24,0x39,0x1B,0x29,0x31,0x1B,0x2A,0x30,0x1B,0x2B,0x20,0x70,0x0F,0x1B,0x7D +}; +const unsigned char decoder_default_macro_2[] = { + 0x1B,0x24,0x39,0x1B,0x29,0x20,0x40,0x1B,0x2A,0x30,0x1B,0x2B,0x20,0x70,0x0F,0x1B,0x7D +}; +const unsigned char decoder_default_macro_3[] = { + 0x1B,0x28,0x32,0x1B,0x29,0x34,0x1B,0x2A,0x35,0x1B,0x2B,0x20,0x70,0x0F,0x1B,0x7D +}; +const unsigned char decoder_default_macro_4[] = { + 0x1B,0x28,0x32,0x1B,0x29,0x33,0x1B,0x2A,0x35,0x1B,0x2B,0x20,0x70,0x0F,0x1B,0x7D +}; +const unsigned char decoder_default_macro_5[] = { + 0x1B,0x28,0x32,0x1B,0x29,0x20,0x40,0x1B,0x2A,0x35,0x1B,0x2B,0x20,0x70,0x0F,0x1B,0x7D +}; +const unsigned char decoder_default_macro_6[] = { + 0x1B,0x28,0x20,0x41,0x1B,0x29,0x20,0x42,0x1B,0x2A,0x20,0x43,0x1B,0x2B,0x20,0x70,0x0F,0x1B,0x7D +}; +const unsigned char decoder_default_macro_7[] = { + 0x1B,0x28,0x20,0x44,0x1B,0x29,0x20,0x45,0x1B,0x2A,0x20,0x46,0x1B,0x2B,0x20,0x70,0x0F,0x1B,0x7D +}; +const unsigned char decoder_default_macro_8[] = { + 0x1B,0x28,0x20,0x47,0x1B,0x29,0x20,0x48,0x1B,0x2A,0x20,0x49,0x1B,0x2B,0x20,0x70,0x0F,0x1B,0x7D +}; +const unsigned char decoder_default_macro_9[] = { + 0x1B,0x28,0x20,0x4A,0x1B,0x29,0x20,0x4B,0x1B,0x2A,0x20,0x4C,0x1B,0x2B,0x20,0x70,0x0F,0x1B,0x7D +}; +const unsigned char decoder_default_macro_a[] = { + 0x1B,0x28,0x20,0x4D,0x1B,0x29,0x20,0x4E,0x1B,0x2A,0x20,0x4F,0x1B,0x2B,0x20,0x70,0x0F,0x1B,0x7D +}; +const unsigned char decoder_default_macro_b[] = { + 0x1B,0x24,0x39,0x1B,0x29,0x20,0x42,0x1B,0x2A,0x30,0x1B,0x2B,0x20,0x70,0x0F,0x1B,0x7D +}; +const unsigned char decoder_default_macro_c[] = { + 0x1B,0x24,0x39,0x1B,0x29,0x20,0x43,0x1B,0x2A,0x30,0x1B,0x2B,0x20,0x70,0x0F,0x1B,0x7D +}; +const unsigned char decoder_default_macro_d[] = { + 0x1B,0x24,0x39,0x1B,0x29,0x20,0x44,0x1B,0x2A,0x30,0x1B,0x2B,0x20,0x70,0x0F,0x1B,0x7D +}; +const unsigned char decoder_default_macro_e[] = { + 0x1B,0x28,0x31,0x1B,0x29,0x30,0x1B,0x2A,0x4A,0x1B,0x2B,0x20,0x70,0x0F,0x1B,0x7D +}; +const unsigned char decoder_default_macro_f[] = { + 0x1B,0x28,0x4A,0x1B,0x29,0x32,0x1B,0x2A,0x20,0x41,0x1B,0x2B,0x20,0x70,0x0F,0x1B,0x7D +}; + +#endif diff --git a/src/aribb24/md5.h b/src/aribb24/md5.h new file mode 100644 index 0000000000000000000000000000000000000000..11831e45958d8a13a4e2c7f87721c8182be6fea6 --- /dev/null +++ b/src/aribb24/md5.h @@ -0,0 +1,59 @@ +/***************************************************************************** + * vlc_md5.h: MD5 hash + ***************************************************************************** + * Copyright © 2004-2011 VLC authors and VideoLAN + * + * Authors: Rémi Denis-Courmont + * Rafaël Carré + * + * This program is free software; you can redistribute it and/or modify it + * under the terms of the GNU Lesser General Public License as published by + * the Free Software Foundation; either version 2.1 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 Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public License + * along with this program; if not, write to the Free Software Foundation, + * Inc., 51 Franklin Street, Fifth Floor, Boston MA 02110-1301, USA. + *****************************************************************************/ + +#ifndef VLC_MD5_H +# define VLC_MD5_H + +/** + * \file + * This file defines functions and structures to compute MD5 digests + */ + +struct md5_s +{ + uint32_t A, B, C, D; /* chaining variables */ + uint32_t nblocks; + uint8_t buf[64]; + int count; +}; + +void InitMD5( struct md5_s * ); +void AddMD5( struct md5_s *, const void *, size_t ); +void EndMD5( struct md5_s * ); + +/** + * Returns a char representation of the md5 hash, as shown by UNIX md5 or + * md5sum tools. + */ +static inline char * psz_md5_hash( struct md5_s *md5_s ) +{ + char *psz = malloc( 33 ); /* md5 string is 32 bytes + NULL character */ + if( likely(psz) ) + { + for( int i = 0; i < 16; i++ ) + sprintf( &psz[2*i], "%02"PRIx8, md5_s->buf[i] ); + } + return psz; +} + +#endif diff --git a/src/aribb24/parser.h b/src/aribb24/parser.h new file mode 100644 index 0000000000000000000000000000000000000000..ade5b4f4e0773900fe25ac9e4241ee91006ecf7c --- /dev/null +++ b/src/aribb24/parser.h @@ -0,0 +1,78 @@ +/***************************************************************************** + * parser.h : ARIB STD-B24 bitstream parser + ***************************************************************************** + * Copyright (C) 2014 Naohiro KORIYAMA + * + * Authors: Naohiro KORIYAMA <nkoriyama@gmail.com> + * + * This program is free software; you can redistribute it and/or modify it + * under the terms of the GNU Lesser General Public License as published by + * the Free Software Foundation; either version 2.1 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 Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public License + * along with this program; if not, write to the Free Software Foundation, + * Inc., 51 Franklin Street, Fifth Floor, Boston MA 02110-1301, USA. + *****************************************************************************/ + +#ifndef ARIBB24_PARSER_H +#define ARIBB24_PARSER_H 1 + +#include "aribb24/decoder.h" +#include "aribb24/bits.h" + +#define DEBUG_ARIBSUB 1 + +/**************************************************************************** + * Local structures + ****************************************************************************/ + +typedef struct drcs_conversion_s { + char hash[32+1]; + unsigned int code; + + struct drcs_conversion_s *p_next; +} drcs_conversion_t ; + +struct decoder_sys_t +{ + bs_t bs; + + /* Decoder internal data */ +#if 0 + arib_data_group_t data_group; +#endif + bool b_a_profile; + uint32_t i_data_unit_size; + int i_subtitle_data_size; + unsigned char *psz_subtitle_data; + + char *psz_fontname; + bool b_ignore_ruby; + bool b_use_coretext; + bool b_ignore_position_adjustment; + bool b_replace_ellipsis; + + arib_decoder_t arib_decoder; +#ifdef ARIBSUB_GEN_DRCS_DATA + drcs_data_t *p_drcs_data; +#endif //ARIBSUB_GEN_DRCS_DATA + + int i_drcs_num; + char drcs_hash_table[188][32 + 1]; + + char *p_arib_base_dir; + + drcs_conversion_t *p_drcs_conv; +}; + +void parse_arib_pes( struct decoder_sys_t * ); +void load_drcs_conversion_table( struct decoder_sys_t *p_sys ); + + +#endif diff --git a/src/decoder.c b/src/decoder.c new file mode 100644 index 0000000000000000000000000000000000000000..e88687700598488ea252b697e86999a46fc8299f --- /dev/null +++ b/src/decoder.c @@ -0,0 +1,1438 @@ +/***************************************************************************** + * decoder.c : ARIB STD-B24 JIS 8bit character code decoder + ***************************************************************************** + * Copyright (C) 2014 Naohiro KORIYAMA + * + * Authors: Naohiro KORIYAMA <nkoriyama@gmail.com> + * + * This program is free software; you can redistribute it and/or modify it + * under the terms of the GNU Lesser General Public License as published by + * the Free Software Foundation; either version 2.1 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 Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public License + * along with this program; if not, write to the Free Software Foundation, + * Inc., 51 Franklin Street, Fifth Floor, Boston MA 02110-1301, USA. + *****************************************************************************/ + +#ifdef HAVE_CONFIG_H +# include "config.h" +#endif + +#include <stdio.h> +#include <string.h> +#include <stdlib.h> +#include <stdint.h> + +#include "aribb24/decoder.h" +#include "aribb24/convtable.h" +#include "aribb24/decoder_macro.h" + +#define DEBUG_ARIBB24DEC 1 + +void decoder_adjust_position( arib_decoder_t *decoder ) +{ +#if 0 + if( decoder->i_charleft < decoder->i_left ) + { + decoder->i_charleft = decoder->i_left - decoder->i_charleft; + decoder->i_charbottom -= ( 1 + decoder->i_charleft / decoder->i_width ) * decoder->i_charheight; + decoder->i_charleft = decoder->i_right - ( decoder->i_charleft % decoder->i_width ); + decoder->i_charleft = decoder->i_left + ( decoder->i_charleft - decoder->i_left ) / decoder->i_charwidth * decoder->i_charwidth; + } + if( decoder->i_charleft >= decoder->i_right ) + { + decoder->i_charleft = decoder->i_charleft - decoder->i_right; + decoder->i_charbottom += ( 1 + decoder->i_charleft / decoder->i_width ) * decoder->i_charheight; + decoder->i_charleft = decoder->i_left + ( decoder->i_charleft % decoder->i_width ); + decoder->i_charleft = decoder->i_left + ( decoder->i_charleft - decoder->i_left ) / decoder->i_charwidth * decoder->i_charwidth; + } +#endif + + decoder->b_need_next_region = true; +} + +int u8_uctomb_aux( unsigned char *s, unsigned int uc, int n ) +{ + int count; + + if( uc < 0x80 ) + { + count = 1; + } + else if( uc < 0x800 ) + { + count = 2; + } + else if( uc < 0x10000 ) + { + count = 3; + } + else if( uc < 0x110000 ) + { + count = 4; + } + else + { + return -1; + } + + if( n < count ) + { + return -2; + } + + switch( count ) /* note: code falls through cases! */ + { + case 4: s[3] = 0x80 | (uc & 0x3f); uc = uc >> 6; uc |= 0x10000; + case 3: s[2] = 0x80 | (uc & 0x3f); uc = uc >> 6; uc |= 0x800; + case 2: s[1] = 0x80 | (uc & 0x3f); uc = uc >> 6; uc |= 0xc0; + case 1: s[0] = uc; + } + return count; +} + +int u8_uctomb( unsigned char *s, unsigned int uc, int n ) +{ + if( uc < 0x80 && n > 0 ) + { + s[0] = uc; + return 1; + } + else + { + return u8_uctomb_aux( s, uc, n ); + } +} + +arib_buf_region_t *prepare_new_region( arib_decoder_t *decoder, + char *p_start, + int i_veradj, + int i_horadj ) +{ + arib_buf_region_t *p_region = + (arib_buf_region_t*) calloc( 1, sizeof(arib_buf_region_t) ); + if( p_region == NULL ) + { + return NULL; + } + p_region->p_start = p_start; + p_region->i_foreground_color = decoder->i_foreground_color; + p_region->i_background_color = decoder->i_background_color; + + p_region->i_planewidth = decoder->i_planewidth; + p_region->i_planeheight = decoder->i_planeheight; + + p_region->i_width = decoder->i_width; + p_region->i_height = decoder->i_height; + + p_region->i_fontwidth = decoder->i_fontwidth_cur; + p_region->i_fontheight = decoder->i_fontheight_cur; + + p_region->i_verint = decoder->i_verint_cur; + p_region->i_horint = decoder->i_horint_cur; + + p_region->i_charleft = decoder->i_charleft; + p_region->i_charbottom = decoder->i_charbottom; + + p_region->i_veradj = i_veradj; + p_region->i_horadj = i_horadj; + + p_region->p_next = NULL; + + decoder->b_need_next_region = false; + + return p_region; +} + +int decoder_push( arib_decoder_t *decoder, unsigned int uc ) +{ + char *p_start = decoder->ubuf; + + if( decoder->b_replace_ellipsis && uc == 0x2026 ) + { + // U+2026: HORIZONTAL ELLIPSIS + // U+22EF: MIDLINE HORIZONTAL ELLIPSIS + uc = 0x22ef; + } + + if( decoder->i_foreground_color_prev != decoder->i_foreground_color ) + { + decoder->i_foreground_color_prev = decoder->i_foreground_color; + decoder->b_need_next_region = true; + } + + /* Check for new paragraph/region */ + if( decoder->i_charleft >= decoder->i_right ) + { + decoder->i_charleft = decoder->i_left; + decoder->i_charbottom += decoder->i_charheight; + decoder->b_need_next_region = true; + } + + /* Ignore making new region */ + bool b_skip_making_new_region = false; + if( decoder->b_need_next_region ) + { + switch( uc ) + { + //case 0x2026: /* HORIZONTAL ELLIPSIS */ + //case 0x22EF: /* MIDLINE HORIZONTAL ELLIPSIS */ + case 0x2192: /* RIGHTWARDS ARROW */ + case 0x3001: /* IDEOGRAPHIC COMMA */ + case 0x3002: /* IDEOGRAPHIC FULL STOP */ + case 0xFF0C: /* FULLWIDTH COMMA */ + case 0xFF0E: /* FULLWIDTH FULL STOP */ + decoder->b_need_next_region = false; + b_skip_making_new_region = true; + break; + default: + break; + } + } + + /* Adjust for somme characters */ + int i_veradj; + int i_horadj; + switch( uc ) + { + case 0x2026: /* HORIZONTAL ELLIPSIS */ + case 0x22EF: /* MIDLINE HORIZONTAL ELLIPSIS */ + case 0x2192: /* RIGHTWARDS ARROW */ + case 0x2212: /* MINUS SIGN */ + case 0xFF0D: /* FULLWIDTH MINUS SIGN */ + i_veradj = decoder->i_fontheight * 1 / 3; + i_horadj = 0; + break; + case 0x3000: /* IDEOGRAPHIC SPACE */ + i_veradj = decoder->i_fontheight * 2 / 3; + i_horadj = 0; + break; + case 0x3001: /* IDEOGRAPHIC COMMA */ + case 0x3002: /* IDEOGRAPHIC FULL STOP */ + i_veradj = decoder->i_fontheight * 1 / 2; + i_horadj = 0; + break; + case 0xFF1C: /* FULLWIDTH LESS-THAN SIGN */ + case 0xFF1E: /* FULLWIDTH GREATER-THAN SIGN */ + case 0x226A: /* MUCH LESS-THAN */ + case 0x226B: /* MUCH GREATER-THAN */ + //case 0x300A: /* LEFT DOUBLE ANGLE BRACKET */ + //case 0x300B: /* RIGHT DOUBLE ANGLE BRACKET */ + i_veradj = decoder->i_fontheight * 1 / 4; + i_horadj = 0; + break; + case 0x300C: /* LEFT CORNER BRACKET */ + case 0x300E: /* LEFT WHITE CORNER BRACKET */ + i_veradj = 0; + i_horadj = decoder->i_fontwidth * 1 / 6; + break; + case 0x300D: /* RIGHT CORNER BRACKET */ + case 0x300F: /* RIGHT WHITE CORNER BRACKET */ + i_veradj = decoder->i_fontheight * 1 / 6; + i_horadj = 0; + break; + case 0x3063: /* HIRAGANA LETTER SMALL TU */ + case 0x30C3: /* KATAKANA LETTER SMALL TU */ + i_veradj = decoder->i_fontheight * 1 / 3; + i_horadj = 0; + break; + case 0x3041: /* HIRAGANA LETTER SMALL A */ + case 0x30A1: /* KATAKANA LETTER SMALL A */ + case 0x3043: /* HIRAGANA LETTER SMALL I */ + case 0x30A3: /* KATAKANA LETTER SMALL I */ + case 0x3045: /* HIRAGANA LETTER SMALL U */ + case 0x30A5: /* KATAKANA LETTER SMALL U */ + case 0x3047: /* HIRAGANA LETTER SMALL E */ + case 0x30A7: /* KATAKANA LETTER SMALL E */ + case 0x3049: /* HIRAGANA LETTER SMALL O */ + case 0x30A9: /* KATAKANA LETTER SMALL O */ + case 0x3083: /* HIRAGANA LETTER SMALL YA */ + case 0x3085: /* HIRAGANA LETTER SMALL YU */ + case 0x3087: /* HIRAGANA LETTER SMALL YO */ + case 0x30E3: /* KATAKANA LETTER SMALL YA */ + case 0x30E5: /* KATAKANA LETTER SMALL YU */ + case 0x30E7: /* KATAKANA LETTER SMALL YO */ + i_veradj = decoder->i_fontheight * 1 / 6; + i_horadj = 0; + break; + case 0x301C: /* WAVE DASH */ + case 0x30FC: /* KATAKANA-HIRAGANA PROLONGED SOUND MARK */ + i_veradj = decoder->i_fontheight * 1 / 3; + i_horadj = 0; + break; + case 0x30FB: /* KATAKANA MIDDLE DOT */ + i_veradj = decoder->i_fontheight * 1 / 3; + i_horadj = decoder->i_fontwidth * 1 / 6; + break; + case 0xFF08: /* FULLWIDTH LEFT PARENTHESIS */ + case 0xFF09: /* FULLWIDTH RIGHT PARENTHESIS */ + i_veradj = 0; + i_horadj = decoder->i_fontwidth * 1 / 6; + break; + case 0xFF0C: /* FULLWIDTH COMMA */ + case 0xFF0E: /* FULLWIDTH FULL STOP */ + i_veradj = decoder->i_fontheight * 1 / 2; + i_horadj = 0; + break; + default: + i_veradj = 0; + i_horadj = 0; + break; + } + + int i_cnt = u8_uctomb( (unsigned char*)decoder->ubuf, uc, decoder->ucount ); + if( i_cnt <= 0 ) + { + return 0; + } + + decoder->ubuf += i_cnt; + decoder->ucount -= i_cnt; + + char *p_end = decoder->ubuf; + + decoder->i_charleft += decoder->i_charwidth; + + arib_buf_region_t *p_region = decoder->p_region; + if( p_region == NULL ) + { + p_region = decoder->p_region = + prepare_new_region( decoder, p_start, i_veradj, i_horadj ); + if( p_region == NULL ) + { + return 0; + } + } + + arib_buf_region_t *p_next; + while( (p_next = p_region->p_next) != NULL ) + { + p_region = p_next; + } + + if( decoder->b_need_next_region ) + { + p_region = p_region->p_next = + prepare_new_region( decoder, p_start, i_veradj, i_horadj ); + if( p_region == NULL ) + { + return 0; + } + } + else + { + if( p_region->i_veradj > i_veradj ) + { + p_region->i_veradj = i_veradj; + } + } + p_region->p_end = p_end; + + if( b_skip_making_new_region ) + { + decoder->b_need_next_region = true; + } + + return 1; +} + +int decoder_pull( arib_decoder_t *decoder, int *c ) +{ + if( decoder->count == 0 ) + { + return 0; + } + + *c = decoder->buf[0]; + + decoder->count--; + decoder->buf++; + return 1; +} + +int decoder_handle_drcs( arib_decoder_t *decoder, int c ) +{ + unsigned int uc; + + uc = 0; + if( c < decoder->i_drcs_num ) + { + uc = decoder->drcs_conv_table[c]; + } + if( uc == 0 ) + { + /* uc = 0x3000; */ /* WHITESPACE */ + /* uc = 0x25A1; */ /* WHITE SQUARE */ + uc = 0x3013; /* geta */ + } + + return decoder_push( decoder, uc ); +} + +int decoder_handle_alnum( arib_decoder_t *decoder, int c ) +{ + unsigned int uc; + uc = decoder_alnum_table[c]; + uc += 0xfee0; /* FULLWIDTH */; + return decoder_push( decoder, uc ); +} + +int decoder_handle_hiragana( arib_decoder_t *decoder, int c ) +{ + unsigned int uc; + uc = decoder_hiragana_table[c]; + return decoder_push( decoder, uc ); +} + +int decoder_handle_katakana( arib_decoder_t *decoder, int c ) +{ + unsigned int uc; + uc = decoder_katakana_table[c]; + return decoder_push( decoder, uc ); +} + +int decoder_handle_kanji( arib_decoder_t *decoder, int c ) +{ + int ku, ten; + unsigned int uc; + + ku = decoder->kanji_ku; + if( ku < 0 ) + { + decoder->kanji_ku = c; + return 1; + } + decoder->kanji_ku = -1; + + ten = c; + + uc = decoder_kanji_table[ku][ten]; + if (decoder->b_use_private_conv && ku >= 89) + { + uc = decoder_private_conv_table[ku -89][ten]; + } + if( uc == 0 ) + { + return 0; + } + + return decoder_push( decoder, uc ); +} + +int decoder_handle_gl( arib_decoder_t *decoder, int c ) +{ + int (*handle)(arib_decoder_t *, int); + + if( c == 0x20 || c == 0x7f ) + { + c = 0x3000; + return decoder_push( decoder, c ); + } + + if( decoder->handle_gl_single == NULL ) + { + handle = *decoder->handle_gl; + } + else + { + handle = *decoder->handle_gl_single; + } + decoder->handle_gl_single = NULL; + + + return handle( decoder, c - 0x21 ); +} + +int decoder_handle_gr( arib_decoder_t *decoder, int c ) +{ + int (*handle)(arib_decoder_t *, int); + + if( c == 0xa0 || c == 0xff ) + { + return 0; + } + + handle = *decoder->handle_gr; + + return handle( decoder, c - 0xa1 ); +} + +int decoder_handle_esc( arib_decoder_t *decoder ) +{ + int c; + int (**handle)(arib_decoder_t *, int); + + handle = &decoder->handle_g0; + while( decoder_pull( decoder, &c ) != 0 ) + { + switch( c ) + { + case 0x20: // DRCS + break; + case 0x24: + case 0x28: + break; + case 0x29: + handle = &decoder->handle_g1; + break; + case 0x2a: + handle = &decoder->handle_g2; + break; + case 0x2b: + handle = &decoder->handle_g3; + break; + case 0x30: + case 0x37: + *handle = decoder_handle_hiragana; + return 1; + case 0x31: + case 0x38: + *handle = decoder_handle_katakana; + return 1; + case 0x39: + case 0x3b: + case 0x42: + *handle = decoder_handle_kanji; + return 1; + case 0x36: + case 0x4a: + *handle = decoder_handle_alnum; + return 1; + case 0x40: + case 0x41: + //case 0x42: + case 0x43: + case 0x44: + case 0x45: + case 0x46: + case 0x47: + case 0x48: + case 0x49: + //case 0x4a: + case 0x4b: + case 0x4c: + case 0x4d: + case 0x4e: + case 0x4f: + *handle = decoder_handle_drcs; + return 1; + case 0x6e: //LS2 + decoder->handle_gl = &decoder->handle_g2; + return 1; + case 0x6f: //LS3 + decoder->handle_gl = &decoder->handle_g3; + return 1; + case 0x70: //macro + return 1; + case 0x7c: //LS3R + decoder->handle_gr = &decoder->handle_g3; + return 1; + case 0x7d: //LS2R + decoder->handle_gr = &decoder->handle_g2; + return 1; + case 0x7e: //LS1R + decoder->handle_gr = &decoder->handle_g1; + return 1; + default: + return 0; + } + } + return 0; +} + +int decoder_handle_papf( arib_decoder_t *decoder ) +{ + int c; + int i = 0; + int buf[1]; + while( decoder_pull( decoder, &c ) != 0 ) + { + buf[i] = c; + i++; + if( i >= 1 ) + { + break; + } + } + if( i >= 1 ) + { + decoder->i_charleft += decoder->i_charwidth * ( buf[0] & 0x3f ); + decoder_adjust_position( decoder ); + } + return 1; +} + +int decoder_handle_aps( arib_decoder_t *decoder ) +{ + int c; + int i = 0; + int buf[2]; + while( decoder_pull( decoder, &c ) != 0 ) + { + buf[i] = c; + i++; + if( i >= 2 ) + { + break; + } + } + if( i >= 2 ) + { + decoder->i_charbottom = decoder->i_top + decoder->i_charheight * ( 1 + ( buf[0] & 0x3f ) ) - 1; + decoder->i_charleft = decoder->i_left + decoder->i_charwidth * ( buf[1] & 0x3f ); + decoder_adjust_position( decoder ); + } + return 1; +} + +int decoder_handle_c0( arib_decoder_t *decoder, int c ) +{ + /* ARIB STD-B24 VOLUME 1 Part 2 Chapter 7 + * Table 7-14 Control function character set code table */ + switch( c ) + { + case 0x00: //NUL + case 0x07: //BEL + return 1; + case 0x08: //APB + decoder->i_charleft -= decoder->i_charwidth; + decoder_adjust_position( decoder ); + return 1; + case 0x09: //APF + decoder->i_charleft += decoder->i_charwidth; + decoder_adjust_position( decoder ); + return 1; + case 0x0a: //APD + decoder->i_charbottom += decoder->i_charheight; + decoder_adjust_position( decoder ); + return 1; + case 0x0b: //APU + decoder->i_charbottom -= decoder->i_charheight; + decoder_adjust_position( decoder ); + return 1; + case 0x0c: //CS + decoder->i_charleft = decoder->i_left; + decoder->i_charbottom = decoder->i_top + decoder->i_charheight - 1; + decoder_adjust_position( decoder ); + return 1; + case 0x0d: //APR + decoder->i_charleft = decoder->i_left; + decoder->i_charbottom += decoder->i_charheight; + decoder_adjust_position( decoder ); + return 1; + case 0x0e: //LS1 + decoder->handle_gl = &decoder->handle_g1; + return 1; + case 0x0f: //LS0 + decoder->handle_gl = &decoder->handle_g0; + return 1; + case 0x16: //PAPF + return decoder_handle_papf( decoder ); + return 1; + case 0x18: //CAN + return 1; + case 0x19: //SS2 + decoder->handle_gl_single = &decoder->handle_g2; + return 1; + case 0x1b: //ESC + return decoder_handle_esc( decoder ); + case 0x1c: //APS + return decoder_handle_aps( decoder ); + case 0x1d: //SS3 + decoder->handle_gl_single = &decoder->handle_g3; + return 1; + case 0x1e: //RS + case 0x1f: //US + return 1; + default: + return 0; + } +} + +int decoder_handle_szx( arib_decoder_t *decoder ) +{ + int c; + while( decoder_pull( decoder, &c ) != 0 ) + { + switch( c ) + { + case 0x60: + decoder->i_fontwidth_cur = decoder->i_fontwidth / 4; + decoder->i_fontheight_cur = decoder->i_fontheight / 6; + decoder->i_horint_cur = decoder->i_horint / 4; + decoder->i_verint_cur = decoder->i_verint / 6; + decoder->i_charwidth = decoder->i_fontwidth_cur + decoder->i_horint_cur; + decoder->i_charheight = decoder->i_fontheight_cur + decoder->i_verint_cur; + decoder->b_need_next_region = true; + return 1; + case 0x41: + decoder->i_fontwidth_cur = decoder->i_fontwidth; + decoder->i_fontheight_cur = decoder->i_fontheight * 2; + decoder->i_horint_cur = decoder->i_horint; + decoder->i_verint_cur = decoder->i_verint * 2; + decoder->i_charwidth = decoder->i_fontwidth_cur + decoder->i_horint_cur; + decoder->i_charheight = decoder->i_fontheight_cur + decoder->i_verint_cur; + decoder->b_need_next_region = true; + return 1; + case 0x44: + decoder->i_fontwidth_cur = decoder->i_fontwidth * 2; + decoder->i_fontheight_cur = decoder->i_fontheight; + decoder->i_horint_cur = decoder->i_horint * 2; + decoder->i_verint_cur = decoder->i_verint; + decoder->i_charwidth = decoder->i_fontwidth_cur + decoder->i_horint_cur; + decoder->i_charheight = decoder->i_fontheight_cur + decoder->i_verint_cur; + decoder->b_need_next_region = true; + return 1; + case 0x45: + decoder->i_fontwidth_cur = decoder->i_fontwidth * 2; + decoder->i_fontheight_cur = decoder->i_fontheight * 2; + decoder->i_horint_cur = decoder->i_horint * 2; + decoder->i_verint_cur = decoder->i_verint * 2; + decoder->i_charwidth = decoder->i_fontwidth_cur + decoder->i_horint_cur; + decoder->i_charheight = decoder->i_fontheight_cur + decoder->i_verint_cur; + decoder->b_need_next_region = true; + return 1; + case 0x6b: + case 0x64: + decoder->i_fontwidth_cur = decoder->i_fontwidth; + decoder->i_fontheight_cur = decoder->i_fontheight; + decoder->i_horint_cur = decoder->i_horint; + decoder->i_verint_cur = decoder->i_verint; + decoder->i_charwidth = decoder->i_fontwidth_cur + decoder->i_horint_cur; + decoder->i_charheight = decoder->i_fontheight_cur + decoder->i_verint_cur; + decoder->b_need_next_region = true; + return 1; + default: + return 0; + } + } + return 0; +} + +int decoder_handle_col( arib_decoder_t *decoder ) +{ + int c; + while( decoder_pull( decoder, &c ) != 0 ) + { + switch( c ) + { + case 0x20: + break; + case 0x48: + decoder->i_foreground_alpha = 0xff; // fully transparent + return 1; + default: + return 1; + } + } + return 0; +} + +int decoder_handle_flc( arib_decoder_t *decoder ) +{ + int c; + while( decoder_pull( decoder, &c ) != 0 ) + { + switch( c ) + { + case 0x40: + case 0x47: + case 0x4f: + return 1; + default: + return 0; + } + } + return 0; +} + +int decoder_handle_cdc( arib_decoder_t *decoder ) +{ + int c; + while( decoder_pull( decoder, &c ) != 0 ) + { + switch( c ) + { + case 0x20: + break; + default: + return 1; + } + } + return 0; +} + +int decoder_handle_pol( arib_decoder_t *decoder ) +{ + int c; + while( decoder_pull( decoder, &c ) != 0 ) + { + switch( c ) + { + case 0x40: + case 0x41: + case 0x42: + return 1; + default: + return 0; + } + } + return 0; +} + +int decoder_handle_wmm( arib_decoder_t *decoder ) +{ + int c; + while( decoder_pull( decoder, &c ) != 0 ) + { + switch( c ) + { + case 0x40: + case 0x44: + case 0x45: + return 1; + default: + return 0; + } + } + return 0; +} + +int decoder_handle_macro( arib_decoder_t *decoder ) +{ + int c; + while( decoder_pull( decoder, &c ) != 0 ) + { + switch( c ) + { + case 0x40: + case 0x41: + case 0x4f: + return 1; + default: + return 0; + } + } + return 0; +} + +int decoder_handle_hlc( arib_decoder_t *decoder ) +{ + int c; + while( decoder_pull( decoder, &c ) != 0 ) + { + switch( c ) + { + case 0x40: + case 0x41: + case 0x42: + case 0x43: + case 0x44: + case 0x45: + case 0x46: + case 0x47: + case 0x48: + case 0x49: + case 0x4a: + case 0x4b: + case 0x4c: + case 0x4d: + case 0x4e: + case 0x4f: + return 1; + default: + return 0; + } + } + return 0; +} + +int decoder_handle_rpc( arib_decoder_t *decoder ) +{ + int c; + while( decoder_pull( decoder, &c ) != 0 ) + { + switch( c ) + { + default: /* 0x40 - 0x7F */ + return 1; + } + } + return 0; +} + +int decoder_handle_csi( arib_decoder_t *decoder ) +{ + int idx = 0; + int buf[256]; + int c; + while( decoder_pull( decoder, &c ) != 0 ) + { + switch( c ) + { + case 0x20: + break; + case 0x30: + case 0x31: + case 0x32: + case 0x33: + case 0x34: + case 0x35: + case 0x36: + case 0x37: + case 0x38: + case 0x39: + case 0x3a: + case 0x3b: + case 0x3c: + case 0x3d: + case 0x3e: + case 0x3f: + buf[idx] = c - 0x30; + idx++; + break; + case 0x42: //GSM + case 0x53: //SWF + case 0x54: //CCC + case 0x56: //SDF + { + int i_sep = 0; + for( int i = 0; i < idx; i++ ) + { + if( buf[i] == 0x0b ) + { + i_sep = i; + break; + } + } + int i_param1 = 0; + for( int i = 0; i < i_sep; i++ ) + { + i_param1 = i_param1 * 10; + i_param1 = i_param1 + buf[i]; + } + int i_param2 = 0; + for( int i = i_sep + 1; i < idx; i++ ) + { + i_param2 = i_param2 * 10; + i_param2 = i_param2 + buf[i]; + } + decoder->i_width = i_param1; + decoder->i_height = i_param2; + decoder->i_right = decoder->i_left + decoder->i_width; + decoder->i_bottom = decoder->i_top + decoder->i_height; + } + return 1; + case 0x57: //SSM + case 0x58: //SHS + case 0x59: //SVS + case 0x5d: //GAA + case 0x5e: //SRC + return 1; + case 0x5f: //SDP + { + int i_sep = 0; + for( int i = 0; i < idx; i++ ) + { + if( buf[i] == 0x0b ) + { + i_sep = i; + break; + } + } + int i_param1 = 0; + for( int i = 0; i < i_sep; i++ ) + { + i_param1 = i_param1 * 10; + i_param1 = i_param1 + buf[i]; + } + int i_param2 = 0; + for( int i = i_sep + 1; i < idx; i++ ) + { + i_param2 = i_param2 * 10; + i_param2 = i_param2 + buf[i]; + } + decoder->i_left = i_param1; + decoder->i_top = i_param2; + decoder->i_right = decoder->i_left + decoder->i_width; + decoder->i_bottom = decoder->i_top + decoder->i_height; + } + return 1; + case 0x6e: //RCS + return 1; + case 0x61: //ACPS + { + int i_sep = 0; + for( int i = 0; i < idx; i++ ) + { + if( buf[i] == 0x0b ) + { + i_sep = i; + break; + } + } + int i_param1 = 0; + for( int i = 0; i < i_sep; i++ ) + { + i_param1 = i_param1 * 10; + i_param1 = i_param1 + buf[i]; + } + int i_param2 = 0; + for( int i = i_sep + 1; i < idx; i++ ) + { + i_param2 = i_param2 * 10; + i_param2 = i_param2 + buf[i]; + } + decoder->i_charleft = i_param1; + decoder->i_charbottom = i_param2; + } + decoder->b_need_next_region = true; + return 1; + case 0x62: //TCC + case 0x63: //ORN + case 0x64: //MDF + case 0x65: //CFS + case 0x66: //XCS + case 0x68: //PRA + case 0x69: //ACS + case 0x6a: //UED + case 0x6f: //SCS + return 1; + default: + return 0; + } + } + return 0; +} + +int decoder_handle_time( arib_decoder_t *decoder ) +{ + int c; + int i_mode = 0; + while( decoder_pull( decoder, &c ) != 0 ) + { + switch( c ) + { + case 0x20: + if( i_mode == 0 ) + { + i_mode = 1; + } + break; + case 0x28: + i_mode = 5; + break; + case 0x29: + i_mode = 6; + break; + case 0x30: + case 0x31: + case 0x32: + case 0x33: + case 0x34: + case 0x35: + case 0x36: + case 0x37: + case 0x38: + case 0x39: + case 0x3B: + break; + case 0x40: + case 0x41: + case 0x42: + case 0x43: + if( i_mode != 0 ) + return 1; + break; + default: + if( i_mode == 1 && c >= 0x40 && c <= 0x7F ) + decoder->i_control_time += c & 0x3f; + return 1; + return 0; + } + if( i_mode == 0 ) + return 0; + } + return 0; +} + +int decoder_handle_c1( arib_decoder_t *decoder, int c ) +{ + /* ARIB STD-B24 VOLUME 1 Part 2 Chapter 7 + * Table 7-14 Control function character set code table */ + switch( c ) + { + case 0x80: //BKF + decoder->i_foreground_color_prev = decoder->i_foreground_color; + decoder->i_foreground_color = 0x000000; + decoder->i_color_map |= 0x0000; + return 1; + case 0x81: //RDF + decoder->i_foreground_color_prev = decoder->i_foreground_color; + decoder->i_foreground_color = 0xFF0000; + decoder->i_color_map |= 0x0001; + return 1; + case 0x82: //GRF + decoder->i_foreground_color_prev = decoder->i_foreground_color; + decoder->i_foreground_color = 0x00FF00; + decoder->i_color_map |= 0x0002; + return 1; + case 0x83: //YLF + decoder->i_foreground_color_prev = decoder->i_foreground_color; + decoder->i_foreground_color = 0xFFFF00; + decoder->i_color_map |= 0x0003; + return 1; + case 0x84: //BLF + decoder->i_foreground_color_prev = decoder->i_foreground_color; + decoder->i_foreground_color = 0x0000FF; + decoder->i_color_map |= 0x0004; + return 1; + case 0x85: //MGF + decoder->i_foreground_color_prev = decoder->i_foreground_color; + decoder->i_foreground_color = 0xFF00FF; + decoder->i_color_map |= 0x0005; + return 1; + case 0x86: //CNF + decoder->i_foreground_color_prev = decoder->i_foreground_color; + decoder->i_foreground_color = 0x00FFFF; + decoder->i_color_map |= 0x0006; + return 1; + case 0x87: //WHF + decoder->i_foreground_color_prev = decoder->i_foreground_color; + decoder->i_foreground_color = 0xFFFFFF; + decoder->i_color_map |= 0x0007; + return 1; + case 0x88: //SSZ + decoder->i_fontwidth_cur = decoder->i_fontwidth / 2; + decoder->i_fontheight_cur = decoder->i_fontheight / 2; + decoder->i_horint_cur = decoder->i_horint / 2; + decoder->i_verint_cur = decoder->i_verint / 2; + decoder->i_charwidth = decoder->i_fontwidth_cur + decoder->i_horint_cur; + decoder->i_charheight = decoder->i_fontheight_cur + decoder->i_verint_cur; + decoder->b_need_next_region = true; + return 1; + case 0x89: //MSZ + decoder->i_fontwidth_cur = decoder->i_fontwidth / 2; + decoder->i_fontheight_cur = decoder->i_fontheight; + decoder->i_horint_cur = decoder->i_horint / 2; + decoder->i_verint_cur = decoder->i_verint; + decoder->i_charwidth = decoder->i_fontwidth_cur + decoder->i_horint_cur; + decoder->i_charheight = decoder->i_fontheight_cur + decoder->i_verint_cur; + decoder->b_need_next_region = true; + return 1; + case 0x8a: //NSZ + decoder->i_fontwidth_cur = decoder->i_fontwidth; + decoder->i_fontheight_cur = decoder->i_fontheight; + decoder->i_horint_cur = decoder->i_horint; + decoder->i_verint_cur = decoder->i_verint; + decoder->i_charwidth = decoder->i_fontwidth_cur + decoder->i_horint_cur; + decoder->i_charheight = decoder->i_fontheight_cur + decoder->i_verint_cur; + decoder->b_need_next_region = true; + return 1; + case 0x8b: //SZX + return decoder_handle_szx( decoder ); + case 0x90: //COL + return decoder_handle_col( decoder ); + case 0x91: //FLC + return decoder_handle_flc( decoder ); + case 0x92: //CDC + return decoder_handle_cdc( decoder ); + case 0x93: //POL + return decoder_handle_pol( decoder ); + case 0x94: //WMM + return decoder_handle_wmm( decoder ); + case 0x95: //MACRO + return decoder_handle_macro( decoder ); + case 0x97: //HLC + return decoder_handle_hlc( decoder ); + case 0x98: //RPC + return decoder_handle_rpc( decoder ); + case 0x99: //SPL + case 0x9a: //STL + return 1; + case 0x9b: //CSI + return decoder_handle_csi( decoder ); + case 0x9d: //TIME + return decoder_handle_time( decoder ); + default: + return 0; + } +} + +int arib_decode( arib_decoder_t *decoder ); +int decoder_handle_default_macro( arib_decoder_t *decoder, int c ) +{ + c=c+0x21; + if( c >= 0x60 && c <= 0x6f ) + { + const unsigned char* macro; + int size; + switch( c ) + { + case 0x60: + macro = decoder_default_macro_0; + size = sizeof(decoder_default_macro_0); + break; + case 0x61: + macro = decoder_default_macro_1; + size = sizeof(decoder_default_macro_1); + break; + case 0x62: + macro = decoder_default_macro_2; + size = sizeof(decoder_default_macro_2); + break; + case 0x63: + macro = decoder_default_macro_3; + size = sizeof(decoder_default_macro_3); + break; + case 0x64: + macro = decoder_default_macro_4; + size = sizeof(decoder_default_macro_4); + break; + case 0x65: + macro = decoder_default_macro_5; + size = sizeof(decoder_default_macro_5); + break; + case 0x66: + macro = decoder_default_macro_6; + size = sizeof(decoder_default_macro_6); + break; + case 0x67: + macro = decoder_default_macro_7; + size = sizeof(decoder_default_macro_7); + break; + case 0x68: + macro = decoder_default_macro_8; + size = sizeof(decoder_default_macro_8); + break; + case 0x69: + macro = decoder_default_macro_9; + size = sizeof(decoder_default_macro_9); + break; + case 0x6a: + macro = decoder_default_macro_a; + size = sizeof(decoder_default_macro_a); + break; + case 0x6b: + macro = decoder_default_macro_b; + size = sizeof(decoder_default_macro_b); + break; + case 0x6c: + macro = decoder_default_macro_c; + size = sizeof(decoder_default_macro_c); + break; + case 0x6d: + macro = decoder_default_macro_d; + size = sizeof(decoder_default_macro_d); + break; + case 0x6e: + macro = decoder_default_macro_e; + size = sizeof(decoder_default_macro_e); + break; + case 0x6f: + macro = decoder_default_macro_f; + size = sizeof(decoder_default_macro_f); + break; + } + { + const unsigned char* buf = decoder->buf; + size_t count = decoder->count; + decoder->buf = macro; + decoder->count = size; + arib_decode( decoder ); + decoder->buf = buf; + decoder->count = count; + } + return 1; + } + return 0; +} + +void dump( const unsigned char *start, const unsigned char *end ) +{ +#ifdef DEBUG_ARIBB24DEC + fprintf( stderr, "could not decode ARIB string:\n" ); + while( start < end ) + { + fprintf( stderr, "%02x ", *start++ ); + } + fprintf( stderr, "<- here\n" ); +#endif //DEBUG_ARIBB24DEC +} + +int arib_decode( arib_decoder_t *decoder ) +{ + int (*handle)(arib_decoder_t *, int); + int c; + /* ARIB STD-B24 VOLUME 1 Part 2 Chapter 7 Figure 7-1 Code Table */ + while( decoder_pull( decoder, &c ) != 0 ) + { + if( c < 0x20 ) + { + handle = decoder_handle_c0; + } + else if( c <= 0x7f ) + { + handle = decoder_handle_gl; + } + else if( c <= 0xa0 ) + { + handle = decoder_handle_c1; + } + else + { + handle = decoder_handle_gr; + } + if( handle( decoder, c ) == 0 ) + { + return 0; + } + } + return 1; +} + +void arib_initialize_decoder( arib_decoder_t* decoder ) +{ + decoder->buf = NULL; + decoder->count = 0; + decoder->ubuf = NULL; + decoder->ucount = 0; + decoder->handle_gl = &decoder->handle_g0; + decoder->handle_gl_single = NULL; + decoder->handle_gr = &decoder->handle_g2; + decoder->handle_g0 = decoder_handle_kanji; + decoder->handle_g1 = decoder_handle_alnum; + decoder->handle_g2 = decoder_handle_hiragana; + decoder->handle_g3 = decoder_handle_katakana; + decoder->kanji_ku = -1; + + decoder->i_control_time = 0; + + decoder->i_color_map = 0x0000; + decoder->i_foreground_color = 0xFFFFFF; + decoder->i_foreground_color_prev = 0xFFFFFF; + decoder->i_background_color = 0x000000; + decoder->i_foreground_alpha = 0x00; + decoder->i_background_alpha = 0x00; + + decoder->i_planewidth = 0; + decoder->i_planeheight = 0; + + decoder->i_width = 0; + decoder->i_height = 0; + decoder->i_left = 0; + decoder->i_top = 0; + + decoder->i_fontwidth = 0; + decoder->i_fontwidth_cur = 0; + decoder->i_fontheight = 0; + decoder->i_fontheight_cur = 0; + + decoder->i_horint = 0; + decoder->i_horint_cur = 0; + decoder->i_verint = 0; + decoder->i_verint_cur = 0; + + decoder->i_charwidth = 0; + decoder->i_charheight = 0; + + decoder->i_right = 0; + decoder->i_bottom = 0; + + decoder->i_charleft = 0; + decoder->i_charbottom = 0; + + decoder->i_drcs_num = 0; + memset( decoder->drcs_conv_table, 0, sizeof(decoder->drcs_conv_table) ); + + decoder->b_use_private_conv = true; + + decoder->b_replace_ellipsis = false; + + decoder->p_region = NULL; + decoder->b_need_next_region = true; +} + +void arib_initialize_decoder_size_related( arib_decoder_t* decoder, + int i_planewidth, int i_planeheight, int i_width, int i_height, int i_left, int i_top, + int i_fontwidth, int i_fontheight, int i_horint, int i_verint + ) +{ + decoder->i_planewidth = i_planewidth; + decoder->i_planeheight = i_planeheight; + + decoder->i_width = i_width; + decoder->i_height = i_height; + decoder->i_left = i_left; + decoder->i_top = i_top; + + decoder->i_fontwidth = decoder->i_fontwidth_cur = i_fontwidth; + decoder->i_fontheight = decoder->i_fontheight_cur = i_fontheight; + + decoder->i_horint = decoder->i_horint_cur = i_horint; + decoder->i_verint = decoder->i_verint_cur = i_verint; + + decoder->i_charwidth = decoder->i_fontwidth + decoder->i_horint; + decoder->i_charheight = decoder->i_fontheight + decoder->i_verint; + + decoder->i_right = decoder->i_left + decoder->i_width; + decoder->i_bottom = decoder->i_top + decoder->i_height; + + decoder->i_charleft = decoder->i_left; + decoder->i_charbottom = decoder->i_top + decoder->i_charheight - 1; +} + +void arib_initialize_decoder_a_profile( arib_decoder_t* decoder ) +{ + arib_initialize_decoder( decoder ); + + decoder->handle_g3 = decoder_handle_default_macro; + + arib_initialize_decoder_size_related( decoder, + 960, 540, 620, 480, 170, 30, + 36, 36, 4, 24); +} + +void arib_initialize_decoder_c_profile( arib_decoder_t* decoder ) +{ + arib_initialize_decoder( decoder ); + + decoder->handle_g0 = decoder_handle_drcs; + decoder->handle_g2 = decoder_handle_kanji; + + arib_initialize_decoder_size_related( decoder, + 320, 180, 300, 160, 0, 0, + 18, 18, 2, 12); +} + +void arib_finalize_decoder( arib_decoder_t* decoder ) +{ + arib_buf_region_t *p_region, *p_region_next; + for( p_region = decoder->p_region; p_region; p_region = p_region_next ) + { + p_region_next = p_region->p_next; + free( p_region ); + } +} + +int arib_decode_buffer( arib_decoder_t* decoder, + const unsigned char *buf, size_t count, + char *ubuf, int ucount ) +{ + decoder->buf = buf; + decoder->count = count; + decoder->ubuf = ubuf; + decoder->ucount = ucount; + + if( arib_decode( decoder ) == 0 ) + { + dump( buf, decoder->buf ); + } + return ucount - decoder->ucount; +} diff --git a/src/md5.c b/src/md5.c new file mode 100644 index 0000000000000000000000000000000000000000..edb0e04dd625955c35a0914ef615da5c99cd41ce --- /dev/null +++ b/src/md5.c @@ -0,0 +1,349 @@ +/***************************************************************************** + * md5.c: not so strong MD5 hashing + ***************************************************************************** + * Copyright (C) 1995,1996,1998,1999,2001,2002, + * 2003 Free Software Foundation, Inc. + * + * This program is free software; you can redistribute it and/or modify it + * under the terms of the GNU Lesser General Public License as published by + * the Free Software Foundation; either version 2.1 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 Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public License + * along with this program; if not, write to the Free Software Foundation, + * Inc., 51 Franklin Street, Fifth Floor, Boston MA 02110-1301, USA. + *****************************************************************************/ + +/* md5.c - MD5 Message-Digest Algorithm + * + * According to the definition of MD5 in RFC 1321 from April 1992. + * NOTE: This is *not* the same file as the one from glibc. + * Written by Ulrich Drepper <drepper@gnu.ai.mit.edu>, 1995. + * heavily modified for GnuPG by Werner Koch <wk@gnupg.org> + */ + +/* Test values: + * "" D4 1D 8C D9 8F 00 B2 04 E9 80 09 98 EC F8 42 7E + * "a" 0C C1 75 B9 C0 F1 B6 A8 31 C3 99 E2 69 77 26 61 + * "abc 90 01 50 98 3C D2 4F B0 D6 96 3F 7D 28 E1 7F 72 + * "message digest" F9 6B 69 7D 7C B7 93 8D 52 5A 2F 31 AA F1 61 D0 + */ + +#ifdef HAVE_CONFIG_H +# include "config.h" +#endif + +#include <stdio.h> +#include <stdlib.h> +#include <string.h> + +#include "md5.h" + +typedef uint32_t u32; +typedef uint8_t byte; +#define rol(x,n) ( ((x) << (n)) | ((x) >> (32-(n))) ) + +typedef struct md5_s MD5_CONTEXT; + + +static void +md5_init( void *context ) +{ + MD5_CONTEXT *ctx = context; + + ctx->A = 0x67452301; + ctx->B = 0xefcdab89; + ctx->C = 0x98badcfe; + ctx->D = 0x10325476; + + ctx->nblocks = 0; + ctx->count = 0; +} + + +/* These are the four functions used in the four steps of the MD5 algorithm + and defined in the RFC 1321. The first function is a little bit optimized + (as found in Colin Plumbs public domain implementation). */ +/* #define FF(b, c, d) ((b & c) | (~b & d)) */ +#define FF(b, c, d) (d ^ (b & (c ^ d))) +#define FG(b, c, d) FF (d, b, c) +#define FH(b, c, d) (b ^ c ^ d) +#define FI(b, c, d) (c ^ (b | ~d)) + + +/**************** + * transform n*64 bytes + */ +static void +transform ( MD5_CONTEXT *ctx, const unsigned char *data ) +{ + u32 correct_words[16]; + register u32 A = ctx->A; + register u32 B = ctx->B; + register u32 C = ctx->C; + register u32 D = ctx->D; + u32 *cwp = correct_words; + +#ifdef WORDS_BIGENDIAN + { + int i; + byte *p2, *p1; + for(i=0, p1=data, p2=(byte*)correct_words; i < 16; i++, p2 += 4 ) + { + p2[3] = *p1++; + p2[2] = *p1++; + p2[1] = *p1++; + p2[0] = *p1++; + } + } +#else + memcpy( correct_words, data, 64 ); +#endif + + +#define OP(a, b, c, d, s, T) \ + do \ + { \ + a += FF (b, c, d) + (*cwp++) + T; \ + a = rol(a, s); \ + a += b; \ + } \ + while (0) + + /* Before we start, one word about the strange constants. + They are defined in RFC 1321 as + + T[i] = (int) (4294967296.0 * fabs (sin (i))), i=1..64 + */ + + /* Round 1. */ + OP (A, B, C, D, 7, 0xd76aa478); + OP (D, A, B, C, 12, 0xe8c7b756); + OP (C, D, A, B, 17, 0x242070db); + OP (B, C, D, A, 22, 0xc1bdceee); + OP (A, B, C, D, 7, 0xf57c0faf); + OP (D, A, B, C, 12, 0x4787c62a); + OP (C, D, A, B, 17, 0xa8304613); + OP (B, C, D, A, 22, 0xfd469501); + OP (A, B, C, D, 7, 0x698098d8); + OP (D, A, B, C, 12, 0x8b44f7af); + OP (C, D, A, B, 17, 0xffff5bb1); + OP (B, C, D, A, 22, 0x895cd7be); + OP (A, B, C, D, 7, 0x6b901122); + OP (D, A, B, C, 12, 0xfd987193); + OP (C, D, A, B, 17, 0xa679438e); + OP (B, C, D, A, 22, 0x49b40821); + +#undef OP +#define OP(f, a, b, c, d, k, s, T) \ + do \ + { \ + a += f (b, c, d) + correct_words[k] + T; \ + a = rol(a, s); \ + a += b; \ + } \ + while (0) + + /* Round 2. */ + OP (FG, A, B, C, D, 1, 5, 0xf61e2562); + OP (FG, D, A, B, C, 6, 9, 0xc040b340); + OP (FG, C, D, A, B, 11, 14, 0x265e5a51); + OP (FG, B, C, D, A, 0, 20, 0xe9b6c7aa); + OP (FG, A, B, C, D, 5, 5, 0xd62f105d); + OP (FG, D, A, B, C, 10, 9, 0x02441453); + OP (FG, C, D, A, B, 15, 14, 0xd8a1e681); + OP (FG, B, C, D, A, 4, 20, 0xe7d3fbc8); + OP (FG, A, B, C, D, 9, 5, 0x21e1cde6); + OP (FG, D, A, B, C, 14, 9, 0xc33707d6); + OP (FG, C, D, A, B, 3, 14, 0xf4d50d87); + OP (FG, B, C, D, A, 8, 20, 0x455a14ed); + OP (FG, A, B, C, D, 13, 5, 0xa9e3e905); + OP (FG, D, A, B, C, 2, 9, 0xfcefa3f8); + OP (FG, C, D, A, B, 7, 14, 0x676f02d9); + OP (FG, B, C, D, A, 12, 20, 0x8d2a4c8a); + + /* Round 3. */ + OP (FH, A, B, C, D, 5, 4, 0xfffa3942); + OP (FH, D, A, B, C, 8, 11, 0x8771f681); + OP (FH, C, D, A, B, 11, 16, 0x6d9d6122); + OP (FH, B, C, D, A, 14, 23, 0xfde5380c); + OP (FH, A, B, C, D, 1, 4, 0xa4beea44); + OP (FH, D, A, B, C, 4, 11, 0x4bdecfa9); + OP (FH, C, D, A, B, 7, 16, 0xf6bb4b60); + OP (FH, B, C, D, A, 10, 23, 0xbebfbc70); + OP (FH, A, B, C, D, 13, 4, 0x289b7ec6); + OP (FH, D, A, B, C, 0, 11, 0xeaa127fa); + OP (FH, C, D, A, B, 3, 16, 0xd4ef3085); + OP (FH, B, C, D, A, 6, 23, 0x04881d05); + OP (FH, A, B, C, D, 9, 4, 0xd9d4d039); + OP (FH, D, A, B, C, 12, 11, 0xe6db99e5); + OP (FH, C, D, A, B, 15, 16, 0x1fa27cf8); + OP (FH, B, C, D, A, 2, 23, 0xc4ac5665); + + /* Round 4. */ + OP (FI, A, B, C, D, 0, 6, 0xf4292244); + OP (FI, D, A, B, C, 7, 10, 0x432aff97); + OP (FI, C, D, A, B, 14, 15, 0xab9423a7); + OP (FI, B, C, D, A, 5, 21, 0xfc93a039); + OP (FI, A, B, C, D, 12, 6, 0x655b59c3); + OP (FI, D, A, B, C, 3, 10, 0x8f0ccc92); + OP (FI, C, D, A, B, 10, 15, 0xffeff47d); + OP (FI, B, C, D, A, 1, 21, 0x85845dd1); + OP (FI, A, B, C, D, 8, 6, 0x6fa87e4f); + OP (FI, D, A, B, C, 15, 10, 0xfe2ce6e0); + OP (FI, C, D, A, B, 6, 15, 0xa3014314); + OP (FI, B, C, D, A, 13, 21, 0x4e0811a1); + OP (FI, A, B, C, D, 4, 6, 0xf7537e82); + OP (FI, D, A, B, C, 11, 10, 0xbd3af235); + OP (FI, C, D, A, B, 2, 15, 0x2ad7d2bb); + OP (FI, B, C, D, A, 9, 21, 0xeb86d391); + + /* Put checksum in context given as argument. */ + ctx->A += A; + ctx->B += B; + ctx->C += C; + ctx->D += D; +} + + + +/* The routine updates the message-digest context to + * account for the presence of each of the characters inBuf[0..inLen-1] + * in the message whose digest is being computed. + */ +static void +md5_write( void *context, const void *inbuf_arg , size_t inlen) +{ + const unsigned char *inbuf = inbuf_arg; + MD5_CONTEXT *hd = context; + + if( hd->count == 64 ) /* flush the buffer */ + { + transform( hd, hd->buf ); + hd->count = 0; + hd->nblocks++; + } + if( !inbuf ) + return; + + if( hd->count ) + { + for( ; inlen && hd->count < 64; inlen-- ) + hd->buf[hd->count++] = *inbuf++; + md5_write( hd, NULL, 0 ); + if( !inlen ) + return; + } + + while( inlen >= 64 ) + { + transform( hd, inbuf ); + hd->count = 0; + hd->nblocks++; + inlen -= 64; + inbuf += 64; + } + for( ; inlen && hd->count < 64; inlen-- ) + hd->buf[hd->count++] = *inbuf++; + +} + + + +/* The routine final terminates the message-digest computation and + * ends with the desired message digest in mdContext->digest[0...15]. + * The handle is prepared for a new MD5 cycle. + * Returns 16 bytes representing the digest. + */ + +static void +md5_final( void *context) +{ + MD5_CONTEXT *hd = context; + u32 t, msb, lsb; + byte *p; + + md5_write(hd, NULL, 0); /* flush */; + + t = hd->nblocks; + /* multiply by 64 to make a byte count */ + lsb = t << 6; + msb = t >> 26; + /* add the count */ + t = lsb; + if( (lsb += hd->count) < t ) + msb++; + /* multiply by 8 to make a bit count */ + t = lsb; + lsb <<= 3; + msb <<= 3; + msb |= t >> 29; + + if( hd->count < 56 ) /* enough room */ + { + hd->buf[hd->count++] = 0x80; /* pad */ + while( hd->count < 56 ) + hd->buf[hd->count++] = 0; /* pad */ + } + else /* need one extra block */ + { + hd->buf[hd->count++] = 0x80; /* pad character */ + while( hd->count < 64 ) + hd->buf[hd->count++] = 0; + md5_write(hd, NULL, 0); /* flush */; + memset(hd->buf, 0, 56 ); /* fill next block with zeroes */ + } + /* append the 64 bit count */ + hd->buf[56] = lsb ; + hd->buf[57] = lsb >> 8; + hd->buf[58] = lsb >> 16; + hd->buf[59] = lsb >> 24; + hd->buf[60] = msb ; + hd->buf[61] = msb >> 8; + hd->buf[62] = msb >> 16; + hd->buf[63] = msb >> 24; + transform( hd, hd->buf ); + + p = hd->buf; +#ifdef WORDS_BIGENDIAN +#define X(a) do { *p++ = hd->a ; *p++ = hd->a >> 8; \ + *p++ = hd->a >> 16; *p++ = hd->a >> 24; } while(0) +#else /* little endian */ +#define X(a) do { *(u32*)p = (*hd).a ; p += 4; } while(0) +#endif + X(A); + X(B); + X(C); + X(D); +#undef X + +} + +#if 0 +static byte * +md5_read( void *context ) +{ + MD5_CONTEXT *hd = (MD5_CONTEXT *) context; + return hd->buf; +} +#endif + +void InitMD5( struct md5_s *h ) +{ + md5_init( h ); +} + +void AddMD5( struct md5_s *restrict h, const void *data, size_t len ) +{ + md5_write( h, data, len ); +} + +void EndMD5( struct md5_s *h ) +{ + md5_final( h ); +} diff --git a/src/md5.h b/src/md5.h new file mode 100644 index 0000000000000000000000000000000000000000..a6fbb195e3f0e0c7e87bb02ace23dd8d79f21994 --- /dev/null +++ b/src/md5.h @@ -0,0 +1,69 @@ +/***************************************************************************** + * vlc_md5.h: MD5 hash + ***************************************************************************** + * Copyright © 2004-2011 VLC authors and VideoLAN + * + * Authors: Rémi Denis-Courmont + * Rafaël Carré + * + * This program is free software; you can redistribute it and/or modify it + * under the terms of the GNU Lesser General Public License as published by + * the Free Software Foundation; either version 2.1 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 Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public License + * along with this program; if not, write to the Free Software Foundation, + * Inc., 51 Franklin Street, Fifth Floor, Boston MA 02110-1301, USA. + *****************************************************************************/ + +#ifndef VLC_MD5_H +# define VLC_MD5_H + +#include <inttypes.h> + +#ifdef __GNUC__ +# define likely(p) __builtin_expect(!!(p), 1) +# define unlikely(p) __builtin_expect(!!(p), 0) +#else +# define likely(p) (!!(p)) +# define unlikely(p) (!!(p)) +#endif + +/** + * \file + * This file defines functions and structures to compute MD5 digests + */ + +struct md5_s +{ + uint32_t A, B, C, D; /* chaining variables */ + uint32_t nblocks; + uint8_t buf[64]; + int count; +}; + +void InitMD5( struct md5_s * ); +void AddMD5( struct md5_s *, const void *, size_t ); +void EndMD5( struct md5_s * ); + +/** + * Returns a char representation of the md5 hash, as shown by UNIX md5 or + * md5sum tools. + */ +static inline char * psz_md5_hash( struct md5_s *md5_s ) +{ + char *psz = malloc( 33 ); /* md5 string is 32 bytes + NULL character */ + if( likely(psz) ) + { + for( int i = 0; i < 16; i++ ) + sprintf( &psz[2*i], "%02"PRIx8, md5_s->buf[i] ); + } + return psz; +} + +#endif diff --git a/src/parser.c b/src/parser.c new file mode 100644 index 0000000000000000000000000000000000000000..9141739ea381825123e3ff0585efd3c67e0f9d74 --- /dev/null +++ b/src/parser.c @@ -0,0 +1,745 @@ +/***************************************************************************** + * aribsub.c : ARIB STD-B24 bitstream parser + ***************************************************************************** + * Copyright (C) 2014 Naohiro KORIYAMA + * + * Authors: Naohiro KORIYAMA <nkoriyama@gmail.com> + * + * This program is free software; you can redistribute it and/or modify it + * under the terms of the GNU Lesser General Public License as published by + * the Free Software Foundation; either version 2.1 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 Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public License + * along with this program; if not, write to the Free Software Foundation, + * Inc., 51 Franklin Street, Fifth Floor, Boston MA 02110-1301, USA. + *****************************************************************************/ + +#ifdef HAVE_CONFIG_H +# include "config.h" +#endif + +#define _GNU_SOURCE +#include <stdio.h> +#include <string.h> +#include <stdint.h> +#include <stdlib.h> +#include <math.h> +#include <ctype.h> +#include <sys/stat.h> + +#include "png.h" +#include "md5.h" +#include "aribb24/parser.h" + +#if defined( _WIN32 ) || defined( __SYMBIAN32__ ) || defined( __OS2__ ) +# define mkdir(a,b) mkdir(a) +#endif + +#if defined( _WIN32 ) || defined( __SYMBIAN32__ ) || defined( __OS2__ ) +# define DIR_SEP_CHAR '\\' +# define DIR_SEP "\\" +# define PATH_SEP_CHAR ';' +# define PATH_SEP ";" +#else +# define DIR_SEP_CHAR '/' +# define DIR_SEP "/" +# define PATH_SEP_CHAR ':' +# define PATH_SEP ":" +#endif + +char* get_arib_data_dir( struct decoder_sys_t *p_sys ) +{ + char *psz_arib_base_dir = p_sys->p_arib_base_dir; + if( psz_arib_base_dir == NULL ) + { + return NULL; + } + + char *psz_arib_data_dir; + if( asprintf( &psz_arib_data_dir, "%s"DIR_SEP"data", psz_arib_base_dir ) < 0 ) + { + psz_arib_data_dir = NULL; + } + + return psz_arib_data_dir; +} + +void create_arib_basedir( struct decoder_sys_t *p_sys ) +{ + char *psz_arib_base_dir = p_sys->p_arib_base_dir; + if( psz_arib_base_dir == NULL ) + { + return; + } + + struct stat st; + if( stat( psz_arib_base_dir, &st ) ) + { + if( mkdir( psz_arib_base_dir, 0777) != 0 ) + { + // ERROR + } + } +} + +void create_arib_datadir( struct decoder_sys_t *p_sys ) +{ + create_arib_basedir( p_sys ); + char *psz_arib_data_dir = get_arib_data_dir( p_sys ); + if( psz_arib_data_dir == NULL ) + { + return; + } + + struct stat st; + if( stat( psz_arib_data_dir, &st ) ) + { + if( mkdir( psz_arib_data_dir, 0777) == 0 ) + { + // ERROR + } + } + + free( psz_arib_data_dir ); +} + +void load_drcs_conversion_table( struct decoder_sys_t *p_sys ) +{ + create_arib_basedir( p_sys ); + char *psz_arib_base_dir = p_sys->p_arib_base_dir; + if( psz_arib_base_dir == NULL ) + { + return; + } + + char* psz_conv_file; + if( asprintf( &psz_conv_file, "%s"DIR_SEP"drcs_conv.ini", psz_arib_base_dir ) < 0 ) + { + psz_conv_file = NULL; + } + if( psz_conv_file == NULL ) + { + return; + } + + FILE *fp = fopen( psz_conv_file, "r" ); + free( psz_conv_file ); + if( fp == NULL ) + { + return; + } + + drcs_conversion_t *p_drcs_conv = NULL; + char buf[256] = { 0 }; + while( fgets( buf, 256, fp ) != 0 ) + { + if( buf[0] == ';' || buf[0] == '#' ) // comment + { + continue; + } + + char* p_ret = strchr( buf, '\n' ); + if( p_ret != NULL ) + { + *p_ret = '\0'; + } + + char *p_eq = strchr( buf, '=' ); + if( p_eq == NULL || p_eq - buf != 32 ) + { + continue; + } + char *psz_code = strstr( buf, "U+" ); + if( psz_code == NULL || strlen( psz_code ) < 2 || strlen( psz_code ) > 8 ) + { + continue; + } + + char hash[32 + 1]; + strncpy( hash, buf, 32 ); + hash[32] = '\0'; + unsigned long code = strtoul( psz_code + 2, NULL, 16 ); + if( code > 0x10ffff ) + { + continue; + } + + drcs_conversion_t *p_next = (drcs_conversion_t*) calloc( + 1, sizeof(drcs_conversion_t) ); + if( p_next == NULL ) + { + continue; + } + strncpy( p_next->hash, hash, 32 ); + p_next->hash[32] = '\0'; + p_next->code = code; + if( p_drcs_conv == NULL ) + { + p_sys->p_drcs_conv = p_next; + } + else + { + p_drcs_conv->p_next = p_next; + } + p_drcs_conv = p_next; + p_drcs_conv->p_next = NULL; + } + + fclose( fp ); +} + +FILE* open_image_file( struct decoder_sys_t* p_sys, const char *psz_hash ) +{ + FILE* fp = NULL; + create_arib_datadir( p_sys ); + + char *psz_arib_data_dir = get_arib_data_dir( p_sys ); + if( psz_arib_data_dir == NULL ) + { + return NULL; + } + + char* psz_image_file; + if( asprintf( &psz_image_file, "%s"DIR_SEP"%s.png", psz_arib_data_dir, psz_hash ) < 0 ) + { + psz_image_file = NULL; + } + free( psz_arib_data_dir ); + if( psz_image_file == NULL ) + { + return NULL; + } + + struct stat st; + if( stat( psz_image_file, &st ) ) + { + fp = fopen( psz_image_file, "wb" ); + if( fp == NULL ) + { + // ERROR + } + } + + free( psz_image_file ); + return fp; +} + +char* get_drcs_pattern_data_hash( + struct decoder_sys_t *p_sys, + int i_width, int i_height, + int i_depth, const int8_t* p_patternData ) +{ + int i_bits_per_pixel = ceil( sqrt( ( i_depth ) ) ); + struct md5_s md5; + InitMD5( &md5 ); + AddMD5( &md5, p_patternData, i_width * i_height * i_bits_per_pixel / 8 ); + EndMD5( &md5 ); + return psz_md5_hash( &md5 ); +} + +void save_drcs_pattern_data_image( + struct decoder_sys_t *p_sys, + const char* psz_hash, + int i_width, int i_height, + int i_depth, const int8_t* p_patternData ) +{ + FILE *fp = open_image_file( p_sys, psz_hash ); + if( fp == NULL ) + { + return; + } + + png_structp png_ptr = png_create_write_struct( + PNG_LIBPNG_VER_STRING, NULL, NULL, NULL ); + if( png_ptr == NULL ) + { + goto png_create_write_struct_failed; + } + png_infop info_ptr = png_create_info_struct( png_ptr ); + if( info_ptr == NULL ) + { + goto png_create_info_struct_failed; + } + + if( setjmp( png_jmpbuf( png_ptr ) ) ) + { + goto png_failure; + } + + png_set_IHDR( png_ptr, + info_ptr, + i_width, + i_height, + 1, + PNG_COLOR_TYPE_PALETTE, + PNG_INTERLACE_NONE, + PNG_COMPRESSION_TYPE_DEFAULT, + PNG_FILTER_TYPE_DEFAULT ); + + png_bytepp pp_image; + pp_image = png_malloc( png_ptr, i_height * sizeof(png_bytep) ); + for( int j = 0; j < i_height; j++ ) + { + pp_image[j] = png_malloc( png_ptr, i_width * sizeof(png_byte) ); + } + +#if defined( __ANDROID__ ) + int i_bits_per_pixel = ceil( log( i_depth ) / log( 2 ) ); +#else + int i_bits_per_pixel = ceil( log2( i_depth ) ); +#endif + + bs_t bs; + bs_init( &bs, p_patternData, i_width * i_height * i_bits_per_pixel / 8 ); + + for( int j = 0; j < i_height; j++ ) + { + for( int i = 0; i < i_width; i++ ) + { + uint8_t i_pxl = bs_read( &bs, i_bits_per_pixel ); + pp_image[j][i] = i_pxl ? 1 : 0; + } + } + + png_byte trans_values[1]; + trans_values[0] = (png_byte)0; + png_set_tRNS( png_ptr, info_ptr, trans_values, 1, NULL ); + + int colors[][3] = + { + {255, 255, 255}, /* background */ + { 0, 0, 0}, /* foreground */ + }; + png_color palette[2]; + for( int i = 0; i < 2; i++ ) + { + palette[i].red = colors[i][0]; + palette[i].green = colors[i][1]; + palette[i].blue = colors[i][2]; + } + png_set_PLTE( png_ptr, info_ptr, palette, 2 ); + + png_init_io( png_ptr, fp ); + png_write_info( png_ptr, info_ptr ); + png_set_packing( png_ptr ); + png_write_image( png_ptr, pp_image ); + png_write_end( png_ptr, info_ptr ); + + for( int j = 0; j < i_height; j++ ) + { + png_free( png_ptr, pp_image[j] ); + } + png_free( png_ptr, pp_image ); + +png_failure: +png_create_info_struct_failed: + png_destroy_write_struct( &png_ptr, &info_ptr ); +png_create_write_struct_failed: + fclose( fp ); +} + +void save_drcs_pattern( + struct decoder_sys_t *p_sys, + int i_width, int i_height, + int i_depth, const int8_t* p_patternData ) +{ + char* psz_hash = get_drcs_pattern_data_hash( p_sys, + i_width, i_height, i_depth, p_patternData ); + + strncpy( p_sys->drcs_hash_table[p_sys->i_drcs_num], psz_hash, 32 ); + p_sys->drcs_hash_table[p_sys->i_drcs_num][32] = '\0'; + + p_sys->i_drcs_num++; + + save_drcs_pattern_data_image( p_sys, psz_hash, + i_width, i_height, i_depth, p_patternData ); + + free( psz_hash ); +} + +void parse_data_unit_statement_body( struct decoder_sys_t *p_sys, + uint8_t i_data_unit_parameter, + uint32_t i_data_unit_size ) +{ + char* p_data_unit_data_byte = (char*) calloc( + i_data_unit_size + 1, sizeof(char) ); + if( p_data_unit_data_byte == NULL ) + { + return; + } + for( uint32_t i = 0; i < i_data_unit_size; i++ ) + { + p_data_unit_data_byte[i] = bs_read( &p_sys->bs, 8 ); + p_sys->i_data_unit_size += 1; + } + p_data_unit_data_byte[i_data_unit_size] = '\0'; + + memcpy( p_sys->psz_subtitle_data + p_sys->i_subtitle_data_size, + p_data_unit_data_byte, i_data_unit_size ); + p_sys->i_subtitle_data_size += i_data_unit_size; + + free( p_data_unit_data_byte ); +} + +void parse_data_unit_DRCS( struct decoder_sys_t *p_sys, + uint8_t i_data_unit_parameter, + uint32_t i_data_unit_size ) +{ +#ifdef ARIBSUB_GEN_DRCS_DATA + if( p_sys->p_drcs_data != NULL ) + { + for( int i = 0; i < p_sys->p_drcs_data->i_NumberOfCode; i++ ) + { + drcs_code_t* p_drcs_code = &p_sys->p_drcs_data->p_drcs_code[i]; + for( int j = 0; j < p_drcs_code->i_NumberOfFont ; j++ ) + { + drcs_font_data_t *p_drcs_font_data = &p_drcs_code->p_drcs_font_data[j]; + free( p_drcs_font_data->p_drcs_pattern_data ); + free( p_drcs_font_data->p_drcs_geometric_data ); + } + free( p_drcs_code->p_drcs_font_data ); + } + free( p_sys->p_drcs_data->p_drcs_code ); + free( p_sys->p_drcs_data ); + } + p_sys->p_drcs_data = (drcs_data_t*) calloc( 1, sizeof(drcs_data_t) ); + if( p_sys->p_drcs_data == NULL ) + { + return; + } +#endif //ARIBSUB_GEN_DRCS_DATA + + int8_t i_NumberOfCode = bs_read( &p_sys->bs, 8 ); + p_sys->i_data_unit_size += 1; + +#ifdef ARIBSUB_GEN_DRCS_DATA + p_sys->p_drcs_data->i_NumberOfCode = i_NumberOfCode; + p_sys->p_drcs_data->p_drcs_code = (drcs_code_t*) calloc( + i_NumberOfCode, sizeof(drcs_code_t) ); + if( p_sys->p_drcs_data->p_drcs_code == NULL ) + { + return; + } +#endif //ARIBSUB_GEN_DRCS_DATA + + for( int i = 0; i < i_NumberOfCode; i++ ) + { + uint16_t i_CharacterCode = bs_read( &p_sys->bs, 16 ); + p_sys->i_data_unit_size += 2; + uint8_t i_NumberOfFont = bs_read( &p_sys->bs, 8 ); + p_sys->i_data_unit_size += 1; + +#ifdef ARIBSUB_GEN_DRCS_DATA + drcs_code_t *p_drcs_code = &p_sys->p_drcs_data->p_drcs_code[i]; + p_drcs_code->i_CharacterCode = i_CharacterCode; + p_drcs_code->i_NumberOfFont = i_NumberOfFont; + p_drcs_code->p_drcs_font_data = (drcs_font_data_t*) calloc( + i_NumberOfFont, sizeof(drcs_font_data_t) ); + if( p_drcs_code->p_drcs_font_data == NULL ) + { + return; + } +#else +#endif //ARIBSUB_GEN_DRCS_DATA + + for( int j = 0; j < i_NumberOfFont; j++ ) + { + uint8_t i_fontId = bs_read( &p_sys->bs, 4 ); + uint8_t i_mode = bs_read( &p_sys->bs, 4 ); + p_sys->i_data_unit_size += 1; + +#ifdef ARIBSUB_GEN_DRCS_DATA + drcs_font_data_t* p_drcs_font_data = + &p_drcs_code->p_drcs_font_data[j]; + p_drcs_font_data->i_fontId = i_fontId; + p_drcs_font_data->i_mode = i_mode; + p_drcs_font_data->p_drcs_pattern_data = NULL; + p_drcs_font_data->p_drcs_geometric_data = NULL; +#else +#endif //ARIBSUB_GEN_DRCS_DATA + + if( i_mode == 0x00 || i_mode == 0x01 ) + { + uint8_t i_depth = bs_read( &p_sys->bs, 8 ); + p_sys->i_data_unit_size += 1; + uint8_t i_width = bs_read( &p_sys->bs, 8 ); + p_sys->i_data_unit_size += 1; + uint8_t i_height = bs_read( &p_sys->bs, 8 ); + p_sys->i_data_unit_size += 1; + + int i_bits_per_pixel = ceil( sqrt( ( i_depth + 2 ) ) ); + +#ifdef ARIBSUB_GEN_DRCS_DATA + drcs_pattern_data_t* p_drcs_pattern_data = + p_drcs_font_data->p_drcs_pattern_data = + (drcs_pattern_data_t*) calloc( + 1, sizeof(drcs_pattern_data_t) ); + if( p_drcs_pattern_data == NULL ) + { + return; + } + p_drcs_pattern_data->i_depth = i_depth; + p_drcs_pattern_data->i_width = i_width; + p_drcs_pattern_data->i_height = i_height; + p_drcs_pattern_data->p_patternData = (int8_t*) calloc( + i_width * i_height * i_bits_per_pixel / 8, + sizeof(int8_t) ); + if( p_drcs_pattern_data->p_patternData == NULL ) + { + return; + } +#else + int8_t *p_patternData = (int8_t*) calloc( + i_width * i_height * i_bits_per_pixel / 8, + sizeof(int8_t) ); + if( p_patternData == NULL ) + { + return; + } +#endif //ARIBSUB_GEN_DRCS_DATA + + for( int k = 0; k < i_width * i_height * i_bits_per_pixel / 8; k++ ) + { + uint8_t i_patternData = bs_read( &p_sys->bs, 8 ); + p_sys->i_data_unit_size += 1; +#ifdef ARIBSUB_GEN_DRCS_DATA + p_drcs_pattern_data->p_patternData[k] = i_patternData; +#else + p_patternData[k] = i_patternData; +#endif //ARIBSUB_GEN_DRCS_DATA + } + +#ifdef ARIBSUB_GEN_DRCS_DATA + save_drcs_pattern( p_sys, i_width, i_height, i_depth + 2, + p_drcs_pattern_data->p_patternData ); +#else + save_drcs_pattern( p_sys, i_width, i_height, i_depth + 2, + p_patternData ); + free( p_patternData ); +#endif //ARIBSUB_GEN_DRCS_DATA + } + else + { + uint8_t i_regionX = bs_read( &p_sys->bs, 8 ); + p_sys->i_data_unit_size += 1; + uint8_t i_regionY = bs_read( &p_sys->bs, 8 ); + p_sys->i_data_unit_size += 1; + uint16_t i_geometricData_length = bs_read( &p_sys->bs, 16 ); + p_sys->i_data_unit_size += 2; + +#ifdef ARIBSUB_GEN_DRCS_DATA + drcs_geometric_data_t* p_drcs_geometric_data = + p_drcs_font_data->p_drcs_geometric_data = + (drcs_geometric_data_t*) calloc( + 1, sizeof(drcs_geometric_data_t) ); + if( p_drcs_geometric_data == NULL ) + { + return; + } + p_drcs_geometric_data->i_regionX = i_regionX; + p_drcs_geometric_data->i_regionY = i_regionY; + p_drcs_geometric_data->i_geometricData_length = i_geometricData_length; + p_drcs_geometric_data->p_geometricData = (int8_t*) + calloc( i_geometricData_length, sizeof(int8_t) ); + if( p_drcs_geometric_data->p_geometricData == NULL ) + { + return; + } +#else +#endif //ARIBSUB_GEN_DRCS_DATA + + for( int k = 0; k < i_geometricData_length ; k++ ) + { + uint8_t i_geometricData = bs_read( &p_sys->bs, 8 ); + p_sys->i_data_unit_size += 1; + +#ifdef ARIBSUB_GEN_DRCS_DATA + p_drcs_geometric_data->p_geometricData[k] = i_geometricData; +#else +#endif //ARIBSUB_GEN_DRCS_DATA + } + } + } + } +} + +void parse_data_unit_others( struct decoder_sys_t *p_sys, + uint8_t i_data_unit_parameter, + uint32_t i_data_unit_size ) +{ + for( uint32_t i = 0; i < i_data_unit_size; i++ ) + { + bs_skip( &p_sys->bs, 8 ); + p_sys->i_data_unit_size += 1; + } +} + +/***************************************************************************** + * parse_data_unit + ***************************************************************************** + * ARIB STD-B24 VOLUME 1 Part 3 Chapter 9.4 Structure of data unit + *****************************************************************************/ +void parse_data_unit( struct decoder_sys_t *p_sys ) +{ + uint8_t i_unit_separator = bs_read( &p_sys->bs, 8 ); + p_sys->i_data_unit_size += 1; + if( i_unit_separator != 0x1F ) + { + return; + } + uint8_t i_data_unit_parameter = bs_read( &p_sys->bs, 8 ); + p_sys->i_data_unit_size += 1; + uint32_t i_data_unit_size = bs_read( &p_sys->bs, 24 ); + p_sys->i_data_unit_size += 3; + if( i_data_unit_parameter == 0x20 ) + { + parse_data_unit_statement_body( p_sys, + i_data_unit_parameter, + i_data_unit_size ); + } + else if( i_data_unit_parameter == 0x30 || + i_data_unit_parameter == 0x31 ) + { + parse_data_unit_DRCS( p_sys, + i_data_unit_parameter, + i_data_unit_size ); + } + else + { + parse_data_unit_others( p_sys, + i_data_unit_parameter, + i_data_unit_size ); + } +} + +/***************************************************************************** + * parse_caption_management_data + ***************************************************************************** + * ARIB STD-B24 VOLUME 1 Part 3 Chapter 9.3.1 Caption management data + *****************************************************************************/ +void parse_caption_management_data( struct decoder_sys_t *p_sys ) +{ + uint8_t i_TMD = bs_read( &p_sys->bs, 2 ); + bs_skip( &p_sys->bs, 6 ); /* Reserved */ + if( i_TMD == 0x02 /* 10 */ ) + { + uint64_t i_OTM = ((uint64_t)bs_read( &p_sys->bs, 32 ) << 4) & bs_read( &p_sys->bs, 4 ); + bs_skip( &p_sys->bs, 4 ); /* Reserved */ + } + uint8_t i_num_languages = bs_read( &p_sys->bs, 8 ); + for( int i = 0; i < i_num_languages; i++ ) + { + uint8_t i_language_tag = bs_read( &p_sys->bs, 3 ); + bs_skip( &p_sys->bs, 1 ); /* Reserved */ + uint8_t i_DMF = bs_read( &p_sys->bs, 4 ); + if( i_DMF == 0x0C /* 1100 */ || + i_DMF == 0x0D /* 1101 */ || + i_DMF == 0x0E /* 1110 */ ) + { + uint8_t i_DC = bs_read( &p_sys->bs, 8 ); + } + uint32_t i_ISO_639_language_code = bs_read( &p_sys->bs, 24 ); + uint8_t i_Format = bs_read( &p_sys->bs, 4 ); + uint8_t i_TCS = bs_read( &p_sys->bs, 2 ); + uint8_t i_rollup_mode = bs_read( &p_sys->bs, 2 ); + } + uint32_t i_data_unit_loop_length = bs_read( &p_sys->bs, 24 ); + free( p_sys->psz_subtitle_data ); + p_sys->i_data_unit_size = 0; + p_sys->i_subtitle_data_size = 0; + p_sys->psz_subtitle_data = NULL; + if( i_data_unit_loop_length > 0 ) + { + p_sys->psz_subtitle_data = (unsigned char*) calloc( + i_data_unit_loop_length + 1, sizeof(unsigned char) ); + } + while( p_sys->i_data_unit_size < i_data_unit_loop_length ) + { + parse_data_unit( p_sys ); + } +} + +/***************************************************************************** + * parse_caption_data + ***************************************************************************** + * ARIB STD-B24 VOLUME 1 Part 3 Chapter 9.3.2 Caption statement data + *****************************************************************************/ +void parse_caption_statement_data( struct decoder_sys_t *p_sys ) +{ + uint8_t i_TMD = bs_read( &p_sys->bs, 2 ); + bs_skip( &p_sys->bs, 6 ); /* Reserved */ + if( i_TMD == 0x01 /* 01 */ || i_TMD == 0x02 /* 10 */ ) + { + uint64_t i_STM = ((uint64_t) bs_read( &p_sys->bs, 32 ) << 4) & + bs_read( &p_sys->bs, 4 ); + bs_skip( &p_sys->bs, 4 ); /* Reserved */ + } + uint32_t i_data_unit_loop_length = bs_read( &p_sys->bs, 24 ); + free( p_sys->psz_subtitle_data ); + p_sys->i_subtitle_data_size = 0; + p_sys->psz_subtitle_data = NULL; + if( i_data_unit_loop_length > 0 ) + { + p_sys->psz_subtitle_data = (unsigned char*) calloc( + i_data_unit_loop_length + 1, sizeof(unsigned char) ); + } + while( p_sys->i_data_unit_size < i_data_unit_loop_length ) + { + parse_data_unit( p_sys ); + } +} + +/***************************************************************************** + * parse_data_group + ***************************************************************************** + * ARIB STD-B24 VOLUME 1 Part 3 Chapter 9.2 Structure of data group + *****************************************************************************/ +void parse_data_group( struct decoder_sys_t *p_sys ) +{ + uint8_t i_data_group_id = bs_read( &p_sys->bs, 6 ); + uint8_t i_data_group_version = bs_read( &p_sys->bs, 2 ); + uint8_t i_data_group_link_number = bs_read( &p_sys->bs, 8 ); + uint8_t i_last_data_group_link_number = bs_read( &p_sys->bs, 8 ); + uint16_t i_data_group_size = bs_read( &p_sys->bs, 16 ); + + if( i_data_group_id == 0x00 || i_data_group_id == 0x20 ) + { + parse_caption_management_data( p_sys ); + } + else + { + parse_caption_statement_data( p_sys ); + } +} + +/***************************************************************************** + * parse_arib_pes + ***************************************************************************** + * ARIB STD-B24 VOLUME3 Chapter 5 Independent PES transmission protocol + *****************************************************************************/ +void parse_arib_pes( struct decoder_sys_t *p_sys ) +{ + uint8_t i_data_group_id = bs_read( &p_sys->bs, 8 ); + if( i_data_group_id != 0x80 && i_data_group_id != 0x81 ) + { + return; + } + uint8_t i_private_stream_id = bs_read( &p_sys->bs, 8 ); + if( i_private_stream_id != 0xFF ) + { + return; + } + uint8_t i_reserved_future_use = bs_read( &p_sys->bs, 4 ); + uint8_t i_PES_data_packet_header_length= bs_read( &p_sys->bs, 4 ); + + /* skip PES_data_private_data_byte */ + bs_skip( &p_sys->bs, i_PES_data_packet_header_length ); + + parse_data_group( p_sys ); +}